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.
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
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.
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
Updates a ticket's properties. Only provided fields will be updated.
id- The ticket number
All fields are optional.
| Field | Type | Description |
|---|---|---|
title | string | Update title |
content | string | Update description (HTML) |
statusId | string | Set status by ID |
open | boolean | Close (false) or reopen (true) the ticket |
assigneeId | string/null | Assign/unassign admin |
companyId | string/null | Update company association |
customFields | object | Update custom field values |
snoozedUntil | string/null | Snooze until ISO 8601 timestamp (null to unsnooze) |
skipNotifications | boolean | Skip notifications (default false) |
Set open: false to close the ticket. Closing a ticket will also unsnooze it. The status is not changed automatically — use statusId to change the status explicitly.
File-type custom fields support the same two upload methods as ticket creation: multipart upload (customFields.<fieldId> file parts with JSON in the data field) and external URLs ({ "url": "https://..." } with optional "name" in the custom field value). Same limits apply (10 files, 400MB total, executable types blocked).
Returns the updated ticket object.
- Mock serverhttps://docs.featurebase.app/_mock/rest-api/v2/tickets/{id}
- Productionhttps://do.featurebase.app/v2/tickets/{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/tickets/{id}' \
-H 'Authorization: Bearer <YOUR_TOKEN_HERE>' \
-H 'Content-Type: application/json' \
-H 'Featurebase-Version: 2026-01-01.nova' \
-d '{
"title": "Updated ticket title",
"content": "<p>Updated description.</p>",
"statusId": "507f1f77bcf86cd799439016",
"open": false,
"assigneeId": "507f1f77bcf86cd799439013",
"companyId": "507f1f77bcf86cd799439015",
"customFields": {
"property1": null,
"property2": null
},
"snoozedUntil": "2025-01-16T09:00:00.000Z",
"skipNotifications": false
}'Success
Ticket content/description (HTML)
Ticket category type
Full URL to view the ticket
Contact who created the ticket
Author profile picture URL
Current ticket status
The workflow stage this status represents
Custom field values keyed by field ID. File-type fields contain a JSON string of { key, name, url } with a signed download URL (1 hour expiry). For allowMultiple file fields, the value is a JSON string of an array of these objects.
Assigned team ID (from linked conversation)
ISO 8601 timestamp until snoozed (from linked conversation)
Linked conversations
Conversation message history. Only included when fetching a single ticket by ID.
Third-party integration links
Full repository name (owner/repo)
URL to the GitHub issue
URL to the work item
Azure DevOps project ID
HubSpot object type
{ "object": "ticket", "id": "507f1f77bcf86cd799439011", "ticketNumber": 42, "title": "Cannot login to dashboard", "content": "<p>I get a 403 error when logging in.</p>", "ticketCategoryId": "507f1f77bcf86cd799439011", "categoryType": "customer", "ticketUrl": "https://feedback.example.com/p/cannot-login", "author": { "id": "507f1f77bcf86cd799439011", "name": "John Doe", "email": "john@example.com", "profilePicture": "https://cdn.example.com/avatars/john.png", "type": "customer" }, "status": { "object": "post_status", "id": "507f1f77bcf86cd799439011", "name": "In Progress", "color": "Blue", "type": "active", "isDefault": false }, "customFields": { "priority": "high", "507f1f77bcf86cd799439099": "{\"key\":\"org/pending/file.pdf\",\"name\":\"document.pdf\",\"url\":\"https://...\"}" }, "companyId": "507f1f77bcf86cd799439015", "assigneeId": "507f1f77bcf86cd799439013", "teamAssigneeId": "507f1f77bcf86cd799439014", "open": true, "snoozedUntil": "2025-01-16T09:00:00.000Z", "linkedConversations": [ { … } ], "conversationParts": [ { … } ], "createdAt": "2025-01-15T10:30:00.000Z", "updatedAt": "2025-01-15T12:30:00.000Z", "integrations": { "linear": [ … ], "jira": [ … ], "clickup": [ … ], "github": [ … ], "devops": [ … ], "hubspot": [ … ] } }
Request
Permanently deletes a ticket by its ticket number.
id- The ticket number
Returns a deletion confirmation:
{
"id": "507f1f77bcf86cd799439011",
"object": "ticket",
"deleted": true
}- Customer-facing tickets: Deletes the ticket and its linked conversation.
- Back-office / tracker tickets: Deletes the ticket and unlinks it from the conversation (conversation is preserved).
This operation is irreversible.
- Mock serverhttps://docs.featurebase.app/_mock/rest-api/v2/tickets/{id}
- Productionhttps://do.featurebase.app/v2/tickets/{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/tickets/{id}' \
-H 'Authorization: Bearer <YOUR_TOKEN_HERE>' \
-H 'Featurebase-Version: 2026-01-01.nova'{ "id": "507f1f77bcf86cd799439011", "object": "ticket", "deleted": true }
Request
Adds a reply to a ticket's linked conversation. Supports both contact and admin replies.
id- The ticket number
| Field | Type | Required | Description |
|---|---|---|---|
type | string | Yes | Must be "contact" |
contactId | string | No* | Featurebase contact ID |
contactEmail | string | No* | Contact email |
body | string | Yes | Message content (HTML) |
messageType | string | No | Always "comment" for contacts |
attachmentUrls | string[] | No | Attachment URLs (max 10) |
skipNotifications | boolean | No | Skip notifications (default false) |
createdAt | string | No | ISO 8601 timestamp to backdate the reply |
*At least one of contactId or contactEmail is required.
| Field | Type | Required | Description |
|---|---|---|---|
type | string | Yes | Must be "admin" |
adminId | string | Yes | ID of the admin authoring the reply |
body | string | Yes | Message content (HTML) |
messageType | string | No | "comment" (default) or "note" for internal notes |
attachmentUrls | string[] | No | Attachment URLs (max 10) |
skipNotifications | boolean | No | Skip notifications (default false) |
createdAt | string | No | ISO 8601 timestamp to backdate the reply |
Returns a reply confirmation object.
- Mock serverhttps://docs.featurebase.app/_mock/rest-api/v2/tickets/{id}/reply
- Productionhttps://do.featurebase.app/v2/tickets/{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/tickets/{id}/reply' \
-H 'Authorization: Bearer <YOUR_TOKEN_HERE>' \
-H 'Content-Type: application/json' \
-H 'Featurebase-Version: 2026-01-01.nova' \
-d '{
"type": "admin",
"adminId": "507f1f77bcf86cd799439013",
"body": "<p>We are looking into this issue.</p>",
"messageType": "comment",
"attachmentUrls": [
"http://example.com"
],
"skipNotifications": false,
"createdAt": "2025-01-15T10:30:00.000Z"
}'Success
Ticket content/description (HTML)
Ticket category type
Full URL to view the ticket
Contact who created the ticket
Author profile picture URL
Current ticket status
The workflow stage this status represents
Custom field values keyed by field ID. File-type fields contain a JSON string of { key, name, url } with a signed download URL (1 hour expiry). For allowMultiple file fields, the value is a JSON string of an array of these objects.
Assigned team ID (from linked conversation)
ISO 8601 timestamp until snoozed (from linked conversation)
Linked conversations
Conversation message history. Only included when fetching a single ticket by ID.
Third-party integration links
Full repository name (owner/repo)
URL to the GitHub issue
URL to the work item
Azure DevOps project ID
HubSpot object type
{ "object": "ticket", "id": "507f1f77bcf86cd799439011", "ticketNumber": 42, "title": "Cannot login to dashboard", "content": "<p>I get a 403 error when logging in.</p>", "ticketCategoryId": "507f1f77bcf86cd799439011", "categoryType": "customer", "ticketUrl": "https://feedback.example.com/p/cannot-login", "author": { "id": "507f1f77bcf86cd799439011", "name": "John Doe", "email": "john@example.com", "profilePicture": "https://cdn.example.com/avatars/john.png", "type": "customer" }, "status": { "object": "post_status", "id": "507f1f77bcf86cd799439011", "name": "In Progress", "color": "Blue", "type": "active", "isDefault": false }, "customFields": { "priority": "high", "507f1f77bcf86cd799439099": "{\"key\":\"org/pending/file.pdf\",\"name\":\"document.pdf\",\"url\":\"https://...\"}" }, "companyId": "507f1f77bcf86cd799439015", "assigneeId": "507f1f77bcf86cd799439013", "teamAssigneeId": "507f1f77bcf86cd799439014", "open": true, "snoozedUntil": "2025-01-16T09:00:00.000Z", "linkedConversations": [ { … } ], "conversationParts": [ { … } ], "createdAt": "2025-01-15T10:30:00.000Z", "updatedAt": "2025-01-15T12:30:00.000Z", "integrations": { "linear": [ … ], "jira": [ … ], "clickup": [ … ], "github": [ … ], "devops": [ … ], "hubspot": [ … ] } }
Comments
Threaded discussions on posts and changelogs. Comments support voting, moderation, and privacy controls.