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
Updates an existing post. Only provided fields will be modified.
title- Post title (minimum 2 characters)content- Post content in HTML formatboardId- Move post to a different boardstatusId- Update post statustags- Replace existing tags with new setcommentsEnabled- Enable/disable commentsinReview- Put post in/out of moderation queuecustomFields- Update custom field valueseta- Set estimated completion date (null to clear)createdAt- Update creation date (for backdating)assigneeId- Admin ID to assign this post to (null to unassign)visibility- Post-level visibility restriction: 'public' (no additional restrictions), 'authorOnly' (only author and admins), or 'companyOnly' (only users in author's company). Note: even 'public' posts are still subject to board-level and organization-level access controls.author- Change post attribution (id, userId, email, name, profilePicture)
sendStatusUpdateEmail- When changing status, optionally send email notification to voters (default: false)
Returns the updated post object with all fields populated.
Tag names to set (replaces existing)
Tag names to set (replaces existing)
Custom field values. Keys must be valid ObjectIds. Values can be: string, boolean, number, ISO date string, array of strings, ObjectId string, or null.
Admin ID to assign this post to (null to unassign)
Post visibility. 'public' = visible to all users, 'authorOnly' = only visible to the author and admins, 'companyOnly' = only visible to users in the same company as the author
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.
- Mock serverhttps://docs.featurebase.app/_mock/rest-api/v2/posts/{id}
- Productionhttps://do.featurebase.app/v2/posts/{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/posts/507f1f77bcf86cd799439011 \
-H 'Authorization: Bearer <YOUR_TOKEN_HERE>' \
-H 'Content-Type: application/json' \
-H 'Featurebase-Version: 2026-01-01.nova' \
-d '{
"title": "Updated: Add dark mode support",
"content": "<p>Updated content with more details.</p>",
"boardId": "507f1f77bcf86cd799439011",
"tags": [
"feature",
"ui"
],
"commentsEnabled": true,
"statusId": "507f1f77bcf86cd799439012",
"inReview": false,
"customFields": {
"507f1f77bcf86cd799439011": "high"
},
"eta": "2025-12-31T23:59:59.000Z",
"createdAt": "2025-01-15T10:30:00.000Z",
"sendStatusUpdateEmail": false,
"assigneeId": "507f1f77bcf86cd799439013",
"visibility": "public",
"author": {
"id": "507f1f77bcf86cd799439011",
"userId": "usr_12345",
"email": "john@example.com",
"name": "John Doe",
"profilePicture": "https://example.com/avatar.png"
},
"upvotes": 10
}'Success
Full URL to view the post
Post content in HTML format
Author profile picture URL
The workflow stage this status represents
Tags attached to this post
User IDs explicitly granted access to this post. Empty array means no user-level restrictions (post uses board/org visibility). Non-empty means only these users (plus admins) can see the post.
ID of the admin assigned to this post, null if unassigned
Estimated completion time as ISO 8601 timestamp, null if not set
Custom field values keyed by field ID
{ "object": "post", "id": "507f1f77bcf86cd799439011", "slug": "add-dark-mode-support", "postUrl": "https://feedback.example.com/p/add-dark-mode-support", "title": "Add dark mode support", "content": "<p>It would be great to have a dark mode option for the dashboard.</p>", "boardId": "507f1f77bcf86cd799439011", "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 }, "tags": [ { … } ], "features": { "commentsEnabled": true }, "upvotes": 42, "commentCount": 5, "inReview": false, "isPinned": false, "access": { "userIds": [], "companyExternalIds": [] }, "assigneeId": "507f1f77bcf86cd799439013", "eta": "2025-01-01T00:00:00.000Z", "customFields": { "cf_priority": "high", "cf_effort": 3 }, "createdAt": "2023-12-12T00:00:00.000Z", "updatedAt": "2023-12-13T00:00:00.000Z" }
Request
Permanently deletes a post. This action cannot be undone.
When you delete a post:
- The post itself is permanently removed
- All comments on the post are deleted
- Vote records are removed
- Any associated notifications are cleared
Returns a deletion confirmation object with:
id- The ID of the deleted postobject- Always "post"deleted- Always true
Requires member-level access or higher to delete posts.
- Mock serverhttps://docs.featurebase.app/_mock/rest-api/v2/posts/{id}
- Productionhttps://do.featurebase.app/v2/posts/{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/posts/507f1f77bcf86cd799439011 \
-H 'Authorization: Bearer <YOUR_TOKEN_HERE>' \
-H 'Featurebase-Version: 2026-01-01.nova'{ "id": "507f1f77bcf86cd799439011", "object": "post", "deleted": true }
Request
Returns all voters (upvoters) for a specific post.
Voters are users who have upvoted the post. Each voter is returned in the standard user format with:
- Basic info: id, name, email, profilePicture
- User type (admin, customer, guest, etc.)
- Companies the user belongs to
- Activity stats: commentsCreated, postsCreated, lastActivity
- Preferences: subscribedToChangelog, locale, verified
This endpoint uses cursor-based pagination:
limit- Number of voters to return (1-100, default 10)cursor- Opaque cursor from a previous response'snextCursorfield
Example: To paginate through results:
- First request:
GET /v2/posts/{id}/voters?limit=10 - If
nextCursoris not null, use it for the next page - Next request:
GET /v2/posts/{id}/voters?limit=10&cursor={nextCursor}
Returns a list object with:
object- Always "list"data- Array of user objectsnextCursor- Cursor for the next page (null if no more results)
Requires member-level access or higher.
- Mock serverhttps://docs.featurebase.app/_mock/rest-api/v2/posts/{id}/voters
- Productionhttps://do.featurebase.app/v2/posts/{id}/voters
- curl
- JavaScript
- Node.js
- Python
- Java
- C#
- PHP
- Go
- Ruby
- R
- Payload
curl -i -X GET \
'https://docs.featurebase.app/_mock/rest-api/v2/posts/507f1f77bcf86cd799439011/voters?limit=10&cursor=eyJpZCI6IjUwN2YxZjc3YmNmODZjZDc5OTQzOTAxMSJ9' \
-H 'Authorization: Bearer <YOUR_TOKEN_HERE>' \
-H 'Featurebase-Version: 2026-01-01.nova'Success
Array of users
Organization ID the user belongs to
Profile picture URL
Whether manually opted out from changelog
Type of user
Cursor for fetching the next page (cursor-based pagination)
{ "object": "list", "data": [], "nextCursor": "eyJpZCI6IjUwN2YxZjc3YmNmODZjZDc5OTQzOTAxMSJ9", "pagination": { "page": 1, "limit": 10, "total": 42, "totalPages": 5 } }
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.