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 comments for your organization.
Comments are threaded discussions. Each comment can have:
- Author information
- Voting (upvotes/downvotes)
- Privacy settings (public/private)
- Moderation status
- Parent comment reference for threading
Optionally filter by:
postId- Get comments for a specific postchangelogId- Get comments for a specific changelog
If no filter is provided, returns all comments across the organization.
This endpoint uses cursor-based pagination:
limit- Number of comments to return (1-100, default 10)cursor- Opaque cursor from a previous response'snextCursorfield
Example: To paginate through results:
- First request:
GET /v2/comments?postId={id}&limit=10 - If
nextCursoris not null, use it for the next page - Next request:
GET /v2/comments?postId={id}&limit=10&cursor={nextCursor}
Returns a list object with:
object- Always "list"data- Array of comment objects (flat structure withparentCommentIdfor threading)nextCursor- Cursor for the next page (null if no more results)
Each comment includes:
id- Unique comment identifierpostId/changelogId- Reference to the parent contentparentCommentId- Reference to parent comment (null for root comments)content- Comment content in HTML formatauthor- Author information (id, name, profilePicture, type)upvotes/downvotes/score- Voting metricsisPrivate- Whether comment is only visible to adminsinReview- Whether comment is pending moderationcreated/updated- Unix timestamps
privacy- Filter by privacy: "public", "private", or "all"inReview- Filter by moderation status (true/false)
Use sortBy to sort results:
best- Sort by confidence score (default, like Reddit)top- Sort by net score (upvotes - downvotes)new- Sort by creation date, newest firstold- Sort by creation date, oldest first
- Mock serverhttps://docs.featurebase.app/_mock/rest-api/v2/comments
- Productionhttps://do.featurebase.app/v2/comments
- curl
- JavaScript
- Node.js
- Python
- Java
- C#
- PHP
- Go
- Ruby
- R
- Payload
curl -i -X GET \
'https://docs.featurebase.app/_mock/rest-api/v2/comments?postId=507f1f77bcf86cd799439011&changelogId=507f1f77bcf86cd799439012&privacy=public&inReview=false&limit=10&cursor=eyJpZCI6IjUwN2YxZjc3YmNmODZjZDc5OTQzOTAxMSJ9&sortBy=best' \
-H 'Authorization: Bearer <YOUR_TOKEN_HERE>' \
-H 'Featurebase-Version: 2026-01-01.nova'Success
Array of comments
Post ID this comment belongs to
Changelog ID this comment belongs to
Parent comment ID for replies, null for root comments
Comment content in HTML format
Author unique identifier
Author profile picture URL
ISO 8601 timestamp when created
Cursor for fetching the next page (cursor-based pagination)
{ "object": "list", "data": [], "nextCursor": "eyJpZCI6IjUwN2YxZjc3YmNmODZjZDc5OTQzOTAxMSJ9", "pagination": { "page": 1, "limit": 10, "total": 42, "totalPages": 5 } }
Request
Creates a new comment or reply to an existing comment.
You can create a comment for a post or changelog. Comments support:
- HTML content (images are automatically uploaded to our storage)
- Threading (replies via
parentCommentId) - Privacy controls (private comments visible only to admins)
- Author attribution (post on behalf of users)
content- Comment content in HTML formatpostIdORchangelogId- One is required to specify the target
parentCommentId- Create a reply to an existing commentisPrivate- Make comment visible only to admins (default: false)sendNotification- Notify voters about the comment (default: true)author- Post comment under a specific user (uses authenticated user if not provided)createdAt- Backdate creation (useful for imports)
The author field supports multiple identification methods:
id- Featurebase user ID (direct reference)userId- External user ID from your system (via SSO)email- Email address (finds existing or creates new user)name- Display name (used with email for new users)profilePicture- Profile picture URL
If no author is provided, the comment is posted under the authenticated user.
Content should be formatted as HTML. For images:
- External URLs in
img srcattributes are automatically pulled into our storage - Base64 encoded data URIs (
data:image/...) are also supported and processed
Returns the created comment object with all fields populated, including:
id- Unique comment identifierauthor- Author information- Voting stats and timestamps
400- Invalid input (missing required fields, invalid IDs)403- Commenting disabled or not authorized404- Post/changelog not found or parent comment not found
Comment content in HTML format
Changelog ID to comment on (accepts ObjectId or slug)
Whether the comment is private (only visible to admins)
Whether to notify voters of the submission about the comment
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.
Set the date when the comment was created. Useful for importing comments from other platforms.
Initial upvotes count. Useful for importing comments from other platforms. Score will be calculated as upvotes - downvotes.
- Mock serverhttps://docs.featurebase.app/_mock/rest-api/v2/comments
- Productionhttps://do.featurebase.app/v2/comments
- curl
- JavaScript
- Node.js
- Python
- Java
- C#
- PHP
- Go
- Ruby
- R
- Payload
curl -i -X POST \
https://docs.featurebase.app/_mock/rest-api/v2/comments \
-H 'Authorization: Bearer <YOUR_TOKEN_HERE>' \
-H 'Content-Type: application/json' \
-H 'Featurebase-Version: 2026-01-01.nova' \
-d '{
"content": "<p>This is a great idea!</p>",
"postId": "507f1f77bcf86cd799439011",
"changelogId": "507f1f77bcf86cd799439012",
"parentCommentId": "507f1f77bcf86cd799439013",
"isPrivate": false,
"sendNotification": true,
"author": {
"id": "507f1f77bcf86cd799439011",
"userId": "usr_12345",
"email": "john@example.com",
"name": "John Doe",
"profilePicture": "https://example.com/avatar.png"
},
"createdAt": "2025-01-15T10:30:00.000Z",
"upvotes": 5,
"downvotes": 0
}'{ "object": "comment", "id": "507f1f77bcf86cd799439011", "postId": "507f1f77bcf86cd799439012", "changelogId": "507f1f77bcf86cd799439013", "parentCommentId": "507f1f77bcf86cd799439014", "content": "<p>This is a great idea!</p>", "author": { "id": "507f1f77bcf86cd799439011", "name": "John Doe", "profilePicture": "https://cdn.example.com/avatars/john.png", "type": "customer" }, "upvotes": 5, "downvotes": 0, "score": 5, "isPrivate": false, "isDeleted": false, "isPinned": false, "inReview": false, "isSpam": false, "createdAt": "2023-12-12T00:00:00.000Z", "updatedAt": "2023-12-13T00:00:00.000Z" }
Request
Retrieves a single comment by its unique identifier.
Returns the full comment object including:
- Author information
- Voting stats (upvotes, downvotes, score)
- Privacy and moderation status
- Threading information (parentCommentId)
- Timestamps
Returns a comment object with all fields populated.
400- Invalid comment ID format404- Comment not found or doesn't belong to your organization
- Mock serverhttps://docs.featurebase.app/_mock/rest-api/v2/comments/{id}
- Productionhttps://do.featurebase.app/v2/comments/{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/comments/507f1f77bcf86cd799439011 \
-H 'Authorization: Bearer <YOUR_TOKEN_HERE>' \
-H 'Featurebase-Version: 2026-01-01.nova'{ "object": "comment", "id": "507f1f77bcf86cd799439011", "postId": "507f1f77bcf86cd799439012", "changelogId": "507f1f77bcf86cd799439013", "parentCommentId": "507f1f77bcf86cd799439014", "content": "<p>This is a great idea!</p>", "author": { "id": "507f1f77bcf86cd799439011", "name": "John Doe", "profilePicture": "https://cdn.example.com/avatars/john.png", "type": "customer" }, "upvotes": 5, "downvotes": 0, "score": 5, "isPrivate": false, "isDeleted": false, "isPinned": false, "inReview": false, "isSpam": false, "createdAt": "2023-12-12T00:00:00.000Z", "updatedAt": "2023-12-13T00:00:00.000Z" }
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.