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
Returns a list of tickets in your organization using cursor-based pagination.
| Parameter | Type | Description |
|---|---|---|
limit | number | Number of tickets to return (1-100, default 10) |
cursor | string | Cursor from previous response for pagination |
ticketCategoryIds | string[] | Filter by ticket category IDs |
statusIds | string[] | Filter by status IDs |
q | string | Search query |
assigneeId | string | Filter by assignee ID |
categoryType | string | Filter by category type: "customer", "tracker", or "back-office" |
sortBy | string | Sort field: "date" (default), "recent", or "ticketNumber" |
sortOrder | string | Sort direction: "asc" or "desc" (default) |
Returns a list object with data (array of ticket objects) and nextCursor.
- Mock serverhttps://docs.featurebase.app/_mock/rest-api/v2/tickets
- Productionhttps://do.featurebase.app/v2/tickets
- curl
- JavaScript
- Node.js
- Python
- Java
- C#
- PHP
- Go
- Ruby
- R
- Payload
curl -i -X GET \
'https://docs.featurebase.app/_mock/rest-api/v2/tickets?limit=10&cursor=string&ticketCategoryIds=string&statusIds=string&q=string&assigneeId=string&categoryType=customer&sortBy=date&sortOrder=asc' \
-H 'Authorization: Bearer <YOUR_TOKEN_HERE>' \
-H 'Featurebase-Version: 2026-01-01.nova'Success
Array of tickets
Ticket content/description (HTML)
Ticket category type
Full URL to view the ticket
Contact who created the ticket
Author unique identifier
Author profile picture URL
Current ticket status
Object type identifier
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
URL to the ClickUp task
Full repository name (owner/repo)
URL to the GitHub issue
URL to the work item
Azure DevOps project ID
Azure DevOps project name
HubSpot object type
Deal amount (for DEAL type)
{ "object": "list", "data": [], "nextCursor": "eyJpZCI6IjUwN2YxZjc3YmNmODZjZDc5OTQzOTAxMSJ9" }
Request
Creates a new ticket.
| Field | Type | Description |
|---|---|---|
ticketCategoryId | string | Ticket category ID |
title | string | Ticket title (min 2 characters) |
author | object | Author/contact info (id, userId, email, name, profilePicture) |
| Field | Type | Description |
|---|---|---|
content | string | Ticket description (HTML) |
customFields | object | Custom field values |
companyId | string | Company to associate |
linkedConversationId | string | Conversation to link |
assigneeId | string | Admin to assign |
statusId | string | Initial status |
createdAt | string | ISO 8601 timestamp for backdating |
skipNotifications | boolean | Skip sending notifications (default false) |
File-type custom fields can be provided in two ways:
Method 1: Multipart upload — Send the request as multipart/form-data. Put the JSON body in a field named data, and attach files with field names like customFields.<fieldId>. For allowMultiple fields, send multiple files with the same field name.
Method 2: External URL — In the JSON body, set the file custom field value to { "url": "https://..." }. Optionally include "name" to set the filename (e.g. { "url": "https://...", "name": "report.pdf" }); if omitted, the filename is extracted from the download response. For allowMultiple fields, use an array: [{ "url": "..." }, ...]. The server downloads the file (max 10MB, HTTPS only) and stores it.
Both methods produce signed download URLs in the response.
Limits: Max 10 files per request, 400MB total upload size. Executable file types (.exe, .bat, .js, .sh, etc.) are blocked.
Response format: File custom field values in the response are JSON strings containing { "key": "...", "name": "...", "url": "https://signed-url..." }. For allowMultiple fields, an array of these objects. The url is a time-limited signed download URL (expires in 1 hour).
Returns the created ticket object with 201 Created status.
Author to attribute the post to. If not provided, uses the authenticated user. Supports multiple identification methods: id (Featurebase ID), userId (external SSO ID), or email.
External user ID from your system (matched via SSO)
- Mock serverhttps://docs.featurebase.app/_mock/rest-api/v2/tickets
- Productionhttps://do.featurebase.app/v2/tickets
- 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 \
-H 'Authorization: Bearer <YOUR_TOKEN_HERE>' \
-H 'Content-Type: application/json' \
-H 'Featurebase-Version: 2026-01-01.nova' \
-d '{
"ticketCategoryId": "507f1f77bcf86cd799439011",
"title": "Cannot login to dashboard",
"content": "<p>I get a 403 error when logging in.</p>",
"author": {
"id": "507f1f77bcf86cd799439011",
"userId": "usr_12345",
"email": "john@example.com",
"name": "John Doe",
"profilePicture": "https://example.com/avatar.png"
},
"customFields": {
"property1": null,
"property2": null
},
"companyId": "507f1f77bcf86cd799439015",
"linkedConversationId": "507f1f77bcf86cd799439012",
"assigneeId": "507f1f77bcf86cd799439013",
"createdAt": "2025-01-15T10:30:00.000Z",
"skipNotifications": false,
"statusId": "507f1f77bcf86cd799439016"
}'Created
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": [ … ] } }
- 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 GET \
'https://docs.featurebase.app/_mock/rest-api/v2/tickets/{id}' \
-H 'Authorization: Bearer <YOUR_TOKEN_HERE>' \
-H 'Featurebase-Version: 2026-01-01.nova'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.