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
Returns a list of conversations in your organization using cursor-based pagination.
limit- Number of conversations to return (1-100, default 10)cursor- Cursor from previous response for pagination
Returns a list object with:
object- Always "list"data- Array of conversation objectsnextCursor- Cursor for the next page, or null if no more results
Each conversation includes:
id- Unique conversation identifier (short ID)title- Conversation titlestate- Current state ("open", "closed", or "snoozed")priority- Whether the conversation is marked as priorityadminAssigneeId- ID of assigned admin (if any)teamAssigneeId- ID of assigned team (if any)participants- Array of participantssource- Information about the first messagecreatedAt- Creation timestampupdatedAt- Last update timestamp
{
"object": "list",
"data": [
{
"object": "conversation",
"id": "12345",
"title": "Question about pricing",
"state": "open",
"priority": false,
"adminAssigneeId": null,
"participants": [
{ "type": "customer", "id": "676f0f6765bdaa7d7d760f88" }
],
...
}
],
"nextCursor": "eyJpZCI6IjEyMzQ1In0="
}This endpoint is only available in API version 2026-01-01.nova and newer.
- Mock serverhttps://docs.featurebase.app/_mock/rest-api/v2/conversations
- Productionhttps://do.featurebase.app/v2/conversations
- curl
- JavaScript
- Node.js
- Python
- Java
- C#
- PHP
- Go
- Ruby
- R
- Payload
curl -i -X GET \
'https://docs.featurebase.app/_mock/rest-api/v2/conversations?limit=10&cursor=eyJpZCI6IjEyMzQ1In0%3D' \
-H 'Authorization: Bearer <YOUR_TOKEN_HERE>' \
-H 'Featurebase-Version: 2026-01-01.nova'Success
Array of conversations
Current state of the conversation
ISO timestamp when priority was set
ID of the assigned admin
ID of the assigned team
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": "list", "data": [ { … } ], "nextCursor": "eyJpZCI6IjEyMzQ1In0=" }
Request
Creates a new conversation. Supports both contact-initiated (customer/lead) and admin-initiated (outreach) conversations.
For conversations started by a customer or lead:
| Field | Type | Required | Description |
|---|---|---|---|
from.type | string | Yes | Must be "contact" |
from.id | string | Yes | The Featurebase contact ID (24-character ObjectId) |
bodyMarkdown | string | Yes | The initial message content in markdown format. Images referenced by URL or as base64 data URIs will be automatically uploaded and stored. |
channel | string | No | The channel: "desktop" (default) or "email" |
createdAt | string | No | ISO timestamp for migrations |
{
"from": {
"type": "contact",
"id": "676f0f6765bdaa7d7d760f88"
},
"bodyMarkdown": "Hello, I have a question about your product.",
"channel": "desktop"
}For outreach conversations started by an admin:
| Field | Type | Required | Description |
|---|---|---|---|
from.type | string | Yes | Must be "admin" |
from.id | string | Yes | The Featurebase admin ID (24-character ObjectId) |
bodyMarkdown | string | Yes | The initial message content in markdown format. Images referenced by URL or as base64 data URIs will be automatically uploaded and stored. |
channel | string | No | The channel: "desktop" (default) or "email" |
recipients | object | Yes | Recipients for the outreach |
recipients.to | object | Yes | Primary recipients |
recipients.to.emails | string[] | No* | Email addresses |
recipients.to.ids | string[] | No* | Featurebase contact IDs |
recipients.cc | object | No | CC recipients (same structure as "to") |
recipients.bcc | object | No | BCC recipients (same structure as "to") |
subject | string | No** | Email subject line |
createdAt | string | No | ISO timestamp for migrations |
*At least one email or ID is required in recipients.to **Required when channel is "email"
{
"from": {
"type": "admin",
"id": "507f1f77bcf86cd799439011"
},
"bodyMarkdown": "Hi! Just following up on your inquiry.",
"channel": "desktop",
"recipients": {
"to": {
"ids": ["676f0f6765bdaa7d7d760f88"]
}
}
}{
"from": {
"type": "admin",
"id": "507f1f77bcf86cd799439011"
},
"bodyMarkdown": "Hi! Just following up on your inquiry.",
"channel": "email",
"subject": "Following up on your inquiry",
"recipients": {
"to": {
"emails": ["john@example.com"]
},
"cc": {
"emails": ["manager@example.com"]
}
}
}Returns the created conversation object with a 201 Created status.
{
"object": "conversation",
"id": "12345",
"state": "open",
"priority": false,
"adminAssigneeId": null,
"participants": [
{ "type": "customer", "id": "676f0f6765bdaa7d7d760f88" }
],
"source": {
"channel": "desktop",
"deliveredAs": "customer_initiated",
"bodyHtml": "<p>Hello, I have a question about your product.</p>",
"bodyMarkdown": "Hello, I have a question about your product.",
"author": { "type": "customer", "id": "676f0f6765bdaa7d7d760f88" }
},
"createdAt": "2025-01-15T10:30:00.000Z",
"updatedAt": "2025-01-15T10:30:00.000Z"
}This endpoint is only available in API version 2026-01-01.nova and newer.
The author initiating the conversation. Use type "contact" for customer/lead or "admin" for outreach.
The content of the initial message in markdown format. Images referenced by URL or as base64 data URIs will be automatically uploaded and stored.
The channel for the conversation. Defaults to "desktop" (SDK/widget).
Recipients for admin-initiated outreach. Required when from.type is "admin". Specify at least one recipient in the "to" field.
Subject line for the email. Required when channel is "email" and from.type is "admin".
- Mock serverhttps://docs.featurebase.app/_mock/rest-api/v2/conversations
- Productionhttps://do.featurebase.app/v2/conversations
- 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 \
-H 'Authorization: Bearer <YOUR_TOKEN_HERE>' \
-H 'Content-Type: application/json' \
-H 'Featurebase-Version: 2026-01-01.nova' \
-d '{
"from": {
"type": "contact",
"id": "676f0f6765bdaa7d7d760f88"
},
"bodyMarkdown": "Hello, I have a question about your product.\n\n",
"channel": "desktop",
"recipients": {
"to": {
"emails": [
"john@example.com"
],
"ids": [
"676f0f6765bdaa7d7d760f88"
]
},
"cc": {
"emails": [
"john@example.com"
],
"ids": [
"676f0f6765bdaa7d7d760f88"
]
},
"bcc": {
"emails": [
"john@example.com"
],
"ids": [
"676f0f6765bdaa7d7d760f88"
]
}
},
"subject": "Following up on your inquiry",
"createdAt": "2025-01-15T10:30:00.000Z"
}'Created
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
Retrieves a single conversation by its ID, including conversation parts (messages).
id- The conversation ID (short ID)
The maximum number of conversation parts that can be returned via the API is 500. If a conversation has more than 500 parts, only the 500 most recent conversation parts will be returned.
Returns a single conversation object with:
object- Always "conversation"id- Unique conversation identifier (short ID)title- Conversation titlestate- Current state ("open", "closed", or "snoozed")priority- Whether the conversation is marked as priorityadminAssigneeId- ID of assigned admin (if any)teamAssigneeId- ID of assigned team (if any)participants- Array of participantssource- Information about the first messageconversationParts- Array of conversation parts (messages, max 500)createdAt- Creation timestampupdatedAt- Last update timestamp
Each conversation part includes:
object- Always "conversation_part"id- Unique part identifierpartType- Type of part (e.g., "user_msg", "admin_msg", "bot_msg")body- Message body (HTML content)author- Author information with name, email, and profile picturechannel- Channel through which the message was sentcreatedAt- Creation timestampupdatedAt- Last update timestamp
{
"object": "conversation",
"id": "12345",
"title": "Question about pricing",
"state": "open",
"priority": false,
"adminAssigneeId": "507f1f77bcf86cd799439011",
"participants": [
{ "type": "customer", "id": "676f0f6765bdaa7d7d760f88" }
],
"conversationParts": [
{
"object": "conversation_part",
"id": "1",
"partType": "user_msg",
"bodyHtml": "<p>Hello, I have a question about your pricing plans.</p>",
"bodyMarkdown": "Hello, I have a question about your pricing plans.",
"author": {
"type": "customer",
"id": "676f0f6765bdaa7d7d760f88",
"name": "John Doe",
"email": "john@example.com"
},
"channel": "desktop",
"createdAt": "2025-01-15T10:30:00.000Z",
"updatedAt": "2025-01-15T10:30:00.000Z"
},
{
"object": "conversation_part",
"id": "2",
"partType": "admin_msg",
"bodyHtml": "<p>Hi John! I'd be happy to help you with pricing information.</p>",
"bodyMarkdown": "Hi John! I'd be happy to help you with pricing information.",
"author": {
"type": "admin",
"id": "507f1f77bcf86cd799439011",
"name": "Support Agent"
},
"channel": "desktop",
"createdAt": "2025-01-15T10:35:00.000Z",
"updatedAt": "2025-01-15T10:35:00.000Z"
}
],
"createdAt": "2025-01-15T10:30:00.000Z",
"updatedAt": "2025-01-15T10:35:00.000Z"
}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 GET \
https://docs.featurebase.app/_mock/rest-api/v2/conversations/12345 \
-H 'Authorization: Bearer <YOUR_TOKEN_HERE>' \
-H 'Featurebase-Version: 2026-01-01.nova'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": [ { … } ] }
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.