Boards (post categories) organize feedback into distinct containers with their own settings.
Featurebase API (2026-01-01.nova)
Welcome to the Featurebase API. This API allows you to programmatically interact with your Featurebase organization.
This documentation reflects API version 2026-01-01.nova.
API Versioning
This API uses date-based versioning. Each version is identified by a release date and slug, e.g., 2026-01-01.nova.
Specifying a Version
Include the version in the request header:
Featurebase-Version: 2026-01-01.novaOr set a default version for your organization in the dashboard settings.
Version Compatibility
- Newer versions may add new fields to responses (always backwards-compatible)
- Breaking changes (removed/renamed fields, changed behavior) only occur in new versions
- Your integration will continue to work as long as you pin to a specific version
Authentication
All API requests require authentication via API key.
Include in headers:
Authorization: Bearer <api-key>Create and manage your API keys in the Featurebase dashboard.
Error Handling
The API uses conventional HTTP response codes to indicate success or failure:
2xx- Success4xx- Client errors (bad request, unauthorized, not found, etc.)5xx- Server errors (internal error)
Error Response Format
All errors follow a consistent format:
{
"error": {
"type": "invalid_request_error",
"code": "resource_not_found",
"message": "Post not found",
"param": "id",
"status": 404
}
}Error Types
| Type | Description |
|---|---|
authentication_error | Authentication failed (401) |
authorization_error | Permission denied (403) |
invalid_request_error | Invalid request parameters or resource not found (400, 404, 410) |
api_error | Server-side error (500) |
rate_limit_error | Too many requests (429) |
Request
Permanently deletes a conversation by its short ID.
id- The conversation short ID (numeric)
Returns a deletion confirmation object:
{
"id": "12345",
"object": "conversation",
"deleted": true
}This operation is irreversible. The conversation and all its messages will be permanently deleted.
This endpoint is only available in API version 2026-01-01.nova and newer.
- Mock serverhttps://docs.featurebase.app/_mock/rest-api/v2/conversations/{id}
- Productionhttps://do.featurebase.app/v2/conversations/{id}
- curl
- JavaScript
- Node.js
- Python
- Java
- C#
- PHP
- Go
- Ruby
- R
- Payload
curl -i -X DELETE \
https://docs.featurebase.app/_mock/rest-api/v2/conversations/12345 \
-H 'Authorization: Bearer <YOUR_TOKEN_HERE>' \
-H 'Featurebase-Version: 2026-01-01.nova'{ "id": "12345", "object": "conversation", "deleted": true }
Request
Updates a conversation's properties. Supports partial updates - only provided fields will be updated.
id- The conversation ID (short ID)
All fields are optional. Only provided fields will be updated.
| Field | Type | Description |
|---|---|---|
actingAdminId | string | Admin ID performing the action (for attribution). If not provided, uses bot service user. Must be a member of the organization. |
state | string | Conversation state: "open", "closed", or "snoozed" |
snoozedUntil | string | ISO datetime when to unsnooze (required when state is "snoozed") |
adminAssigneeId | string/null | Admin ID to assign, or null to unassign |
teamAssigneeId | string/null | Team ID to assign, or null to unassign |
title | string | Conversation title |
customAttributes | object | Custom attributes to set on the conversation |
markAsRead | object | Mark conversation as read for specific users |
| Field | Type | Description |
|---|---|---|
allAdmins | boolean | If true, marks all admins with existing readReceipts as read |
adminIds | string[] | Array of specific admin IDs to mark as read |
allContacts | boolean | If true, marks all contacts with existing readReceipts as read |
contactIds | string[] | Array of specific contact IDs to mark as read |
Note: Only users with existing read receipts will be updated. Use allAdmins/allContacts OR adminIds/contactIds - the "all" flags take precedence.
Returns the updated conversation object.
{
"actingAdminId": "507f1f77bcf86cd799439011",
"state": "closed"
}{
"state": "closed"
}{
"state": "snoozed",
"snoozedUntil": "2025-01-20T10:00:00.000Z"
}{
"adminAssigneeId": "507f1f77bcf86cd799439011"
}{
"title": "Billing Issue - Priority",
"customAttributes": {
"priority_level": "high",
"category": "billing"
}
}{
"markAsRead": {
"allAdmins": true
}
}{
"markAsRead": {
"allContacts": true
}
}{
"markAsRead": {
"adminIds": ["507f1f77bcf86cd799439011"],
"contactIds": ["676f0f6765bdaa7d7d760f88"]
}
}This endpoint is only available in API version 2026-01-01.nova and newer.
The admin ID performing this action. Changes will be attributed to this admin. If not provided, changes are attributed to the system bot user. The admin must be a member of the organization.
The state of the conversation. Use "snoozed" with snoozedUntil to snooze.
ISO datetime when the conversation should be unsnoozed. Required when state is "snoozed". Must be a future date.
The admin ID to assign the conversation to, or null to unassign.
The team ID to assign the conversation to, or null to unassign.
Custom attributes to set on the conversation. Uses the same validation as v1 API.
- Mock serverhttps://docs.featurebase.app/_mock/rest-api/v2/conversations/{id}
- Productionhttps://do.featurebase.app/v2/conversations/{id}
- curl
- JavaScript
- Node.js
- Python
- Java
- C#
- PHP
- Go
- Ruby
- R
- Payload
curl -i -X PATCH \
https://docs.featurebase.app/_mock/rest-api/v2/conversations/12345 \
-H 'Authorization: Bearer <YOUR_TOKEN_HERE>' \
-H 'Content-Type: application/json' \
-H 'Featurebase-Version: 2026-01-01.nova' \
-d '{
"actingAdminId": "507f1f77bcf86cd799439011",
"state": "open",
"snoozedUntil": "2025-01-20T10:00:00.000Z",
"adminAssigneeId": "507f1f77bcf86cd799439011",
"teamAssigneeId": "507f1f77bcf86cd799439012",
"title": "Question about pricing",
"customAttributes": {
"priority_level": "high",
"category": "billing"
},
"markAsRead": {
"allAdmins": true,
"adminIds": [
"507f1f77bcf86cd799439011"
],
"allContacts": true,
"contactIds": [
"676f0f6765bdaa7d7d760f88"
]
}
}'Success
ISO timestamp when priority was set
Participants in this conversation
State of AI agent handling for this conversation
ISO timestamp when bot state last changed
ISO timestamp of last activity
ISO timestamp when conversation started waiting
ISO timestamp until which conversation is snoozed
ISO timestamp when conversation was created
ISO timestamp when conversation was last updated
Read receipts indicating how far each participant has read in the conversation. Each receipt maps a user to their last-read conversation part. The tracked position reflects the system read state and may reference parts the user cannot directly view (e.g., a contact's read position may point to an internal admin note). Use these receipts to render read indicators and typing awareness, not to infer content access.
Array of conversation parts (messages). Only included when fetching a single conversation by ID.
{ "object": "conversation", "id": "12345", "title": "Question about pricing", "state": "open", "isBlocked": false, "priority": false, "prioritySetAt": "2025-01-15T10:30:00.000Z", "adminAssigneeId": "507f1f77bcf86cd799439011", "teamAssigneeId": "507f1f77bcf86cd799439012", "userPreferredLanguage": "en", "source": { "channel": "desktop", "deliveredAs": "customer_initiated", "subject": "Question about pricing", "bodyHtml": "<p>Hi, I have a question about your enterprise plan...</p>", "bodyMarkdown": "Hi, I have a question about your enterprise plan...", "author": { … }, "url": "https://example.com/pricing" }, "participants": [ { … } ], "botConversationState": "active", "botConversationStateLastUpdatedAt": "2025-01-15T10:30:00.000Z", "disableCustomerReply": false, "awaitingCustomerReply": true, "lastActivityAt": "2025-01-15T12:30:00.000Z", "waitingSince": "2025-01-15T10:30:00.000Z", "snoozedUntil": "2025-01-16T09:00:00.000Z", "createdAt": "2025-01-15T10:30:00.000Z", "updatedAt": "2025-01-15T12:30:00.000Z", "readReceipts": [ { … } ], "conversationParts": [ { … } ] }
Request
Adds a reply to an existing conversation. Supports both contact (customer/lead) and admin replies.
id- The conversation ID (short ID)
The request body varies based on who is sending the reply:
| Field | Type | Required | Description |
|---|---|---|---|
type | string | Yes | Must be "contact" |
userId | string | No* | External user ID from your system |
id | string | No* | Featurebase contact ID (24-character ObjectId) |
bodyMarkdown | string | Yes | The message content in markdown format. Images referenced by URL or as base64 data URIs will be automatically uploaded and stored. |
messageType | string | Yes | Must be "reply" |
*At least one of userId or id is required.
| Field | Type | Required | Description |
|---|---|---|---|
type | string | Yes | Must be "admin" |
id | string | Yes | Featurebase admin ID (24-character ObjectId) |
bodyMarkdown | string | Yes | The message content in markdown format. Images referenced by URL or as base64 data URIs will be automatically uploaded and stored. |
messageType | string | Yes | "reply" for customer-visible reply, "note" for internal note |
Returns the created conversation part object with a 201 Created status. The response includes both bodyHtml (with signed image URLs) and bodyMarkdown fields.
{
"type": "contact",
"userId": "user_123",
"bodyMarkdown": "Thank you for your help!",
"messageType": "reply"
}{
"type": "admin",
"id": "507f1f77bcf86cd799439011",
"bodyMarkdown": "I'm happy to help! Here's what you need to do...",
"messageType": "reply"
}{
"type": "admin",
"id": "507f1f77bcf86cd799439011",
"bodyMarkdown": "Customer seems frustrated, escalating to tier 2.",
"messageType": "note"
}{
"object": "conversation_part",
"id": "3",
"partType": "user_msg",
"bodyHtml": "<p>Thank you for your help!</p>",
"bodyMarkdown": "Thank you for your help!",
"author": {
"type": "customer",
"id": "676f0f6765bdaa7d7d760f88",
"name": "John Doe",
"email": "john@example.com"
},
"channel": "desktop",
"createdAt": "2025-01-15T10:40:00.000Z",
"updatedAt": "2025-01-15T10:40:00.000Z"
}This endpoint is only available in API version 2026-01-01.nova and newer.
The type of author. Use "contact" for customer/lead replies.
The content of the reply message in markdown format. Images referenced by URL or as base64 data URIs will be automatically uploaded and stored.
- Mock serverhttps://docs.featurebase.app/_mock/rest-api/v2/conversations/{id}/reply
- Productionhttps://do.featurebase.app/v2/conversations/{id}/reply
- curl
- JavaScript
- Node.js
- Python
- Java
- C#
- PHP
- Go
- Ruby
- R
- Payload
curl -i -X POST \
https://docs.featurebase.app/_mock/rest-api/v2/conversations/12345/reply \
-H 'Authorization: Bearer <YOUR_TOKEN_HERE>' \
-H 'Content-Type: application/json' \
-H 'Featurebase-Version: 2026-01-01.nova' \
-d '{
"type": "contact",
"userId": "user_123",
"id": "676f0f6765bdaa7d7d760f88",
"bodyMarkdown": "Thank you for your help!",
"messageType": "reply"
}'Created
ISO timestamp when the part was last updated
User message type
- user_msg
- admin_msg
- admin_note
- email_msg
- bot_msg
- quick_reply_opts
- quick_reply_resp
- attr_prompt
- attr_complete
- assign
- status
- priority
- part_add
Message body content as HTML with signed image URLs
Message body content as markdown
{ "object": "conversation_part", "id": "1", "createdAt": "2025-01-15T10:30:00.000Z", "updatedAt": "2025-01-15T10:30:00.000Z", "author": { "type": "customer", "id": "676f0f6765bdaa7d7d760f88", "name": "John Doe", "email": "john@example.com", "profilePicture": "https://cdn.example.com/avatars/user.png" }, "redacted": false, "partType": "user_msg", "bodyHtml": "<p>Hello, I have a question about your product.</p>", "bodyMarkdown": "Hello, I have a question about your product.", "channel": "desktop" }
CommentsCopy for LLM Copy page as Markdown for LLMs View as Markdown Open this page as Markdown Open in ChatGPT Get insights from ChatGPT Open in Claude Get insights from Claude Connect to Cursor Install MCP server on Cursor Connect to VS Code Install MCP server on VS Code
Threaded discussions on posts and changelogs. Comments support voting, moderation, and privacy controls.