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 contacts (customers and leads) in your organization using cursor-based pagination.
limit- Number of contacts to return (1-100, default 10)cursor- Cursor from previous response for paginationcontactType- Filter by contact type: "customer" (default), "lead", or "all"
Returns a list object with:
object- Always "list"data- Array of contact objectsnextCursor- Cursor for the next page, or null if no more results
Each contact includes:
id- Unique contact identifieruserId- External user ID from SSO (if set)email- Contact email addressname- Contact display nameprofilePicture- Profile picture URLtype- Contact type ("customer" or "lead")companies- Array of companies the contact belongs tocustomFields- Custom field valuespostsCreated- Number of posts createdcommentsCreated- Number of comments createdlastActivity- Last activity timestamp
{
"object": "list",
"data": [
{
"object": "contact",
"id": "676f0f6765bdaa7d7d760f88",
"email": "john@example.com",
"name": "John Doe",
"type": "customer",
...
}
],
"nextCursor": "eyJpZCI6IjUwN2YxZjc3YmNmODZjZDc5OTQzOTAxMSJ9"
}This endpoint is only available in API version 2026-01-01.nova and newer.
- Mock serverhttps://docs.featurebase.app/_mock/rest-api/v2/contacts
- Productionhttps://do.featurebase.app/v2/contacts
- curl
- JavaScript
- Node.js
- Python
- Java
- C#
- PHP
- Go
- Ruby
- R
- Payload
curl -i -X GET \
'https://docs.featurebase.app/_mock/rest-api/v2/contacts?limit=10&cursor=eyJpZCI6IjUwN2YxZjc3YmNmODZjZDc5OTQzOTAxMSJ9&contactType=customer' \
-H 'Authorization: Bearer <YOUR_TOKEN_HERE>' \
-H 'Featurebase-Version: 2026-01-01.nova'{ "object": "list", "data": [], "nextCursor": "eyJpZCI6IjUwN2YxZjc3YmNmODZjZDc5OTQzOTAxMSJ9" }
Request
Creates a new contact or updates an existing one.
If a contact with the given email or userId already exists, it will be updated. Otherwise, a new contact will be created.
At least one of email or userId must be provided for identification.
| Field | Type | Required | Description |
|---|---|---|---|
email | string | One of email/userId | Contact email address |
userId | string | One of email/userId | External user ID from your system |
name | string | No | Contact display name |
profilePicture | string | No | Profile picture URL |
companies | array | No | Companies the contact belongs to |
customFields | object | No | Custom field values |
subscribedToChangelog | boolean | No | Whether subscribed to changelog |
locale | string | No | Contact locale/language |
phone | string | No | Contact phone number |
roles | array | No | Role IDs to assign |
userHash | string | No | HMAC hash for identity verification |
createdAt | string | No | When the contact was created (ISO 8601) |
Each company in the companies array can have:
id(required) - External company ID from your systemname(required) - Company namemonthlySpend- Monthly spend/revenuecustomFields- Custom field valuesindustry- Industrywebsite- Company website URLplan- Current plan/subscriptioncompanySize- Number of employeescreatedAt- When the company was created
Returns the created or updated contact object.
- 201 Created - A new contact was created
- 200 OK - An existing contact was updated
{
"email": "john@example.com",
"name": "John Doe",
"userId": "usr_12345",
"companies": [
{
"id": "company_123",
"name": "Acme Inc",
"monthlySpend": 500,
"plan": "enterprise"
}
],
"customFields": {
"plan": "pro",
"signupSource": "website"
},
"subscribedToChangelog": true
}{
"object": "contact",
"id": "676f0f6765bdaa7d7d760f88",
"email": "john@example.com",
"name": "John Doe",
"userId": "usr_12345",
"type": "customer",
"companies": [...],
"customFields": {...},
...
}This endpoint is only available in API version 2026-01-01.nova and newer.
Contact email address. Used for identification if userId is not provided.
External user ID from your system. Takes precedence over email for identification.
HMAC-SHA256 hash of userId or email for identity verification
When the contact was created in your system (ISO 8601)
Custom field values on the contact. Values can be string, number, boolean, null, or array of primitives.
- Mock serverhttps://docs.featurebase.app/_mock/rest-api/v2/contacts
- Productionhttps://do.featurebase.app/v2/contacts
- curl
- JavaScript
- Node.js
- Python
- Java
- C#
- PHP
- Go
- Ruby
- R
- Payload
curl -i -X POST \
https://docs.featurebase.app/_mock/rest-api/v2/contacts \
-H 'Authorization: Bearer <YOUR_TOKEN_HERE>' \
-H 'Content-Type: application/json' \
-H 'Featurebase-Version: 2026-01-01.nova' \
-d '{
"email": "john@example.com",
"name": "John Doe",
"userId": "usr_12345",
"userHash": "a1b2c3d4e5f6g7h8i9j0k1l2m3n4o5p6q7r8s9t0u1v2w3x4y5z6",
"profilePicture": "https://example.com/avatar.png",
"companies": [
{
"id": "company_123",
"name": "Acme Inc",
"createdAt": "2024-01-15T10:30:00Z",
"monthlySpend": 500,
"customFields": {
"plan": "enterprise",
"industry": "Technology",
"priority": "high"
},
"companyHash": "a1b2c3d4e5f6g7h8i9j0k1l2m3n4o5p6q7r8s9t0u1v2w3x4y5z6",
"companySize": 50,
"industry": "Technology",
"website": "https://acme.com",
"plan": "enterprise"
}
],
"createdAt": "2024-01-15T10:30:00Z",
"customFields": {
"plan": "pro",
"signupSource": "website",
"accountType": "premium"
},
"subscribedToChangelog": true,
"locale": "en",
"phone": "+1234567890",
"roles": [
"role_vip",
"role_beta"
]
}'{ "object": "contact", "id": "676f0f6765bdaa7d7d760f88", "userId": "676f0f673dbb299c8a4f3057", "organizationId": "5febde12dc56d60012d47db6", "companies": [], "email": "john@example.com", "name": "John Steezy", "profilePicture": "https://fb-usercontent.fra1.cdn.digitaloceanspaces.com/anon_23.png", "commentsCreated": 0, "postsCreated": 0, "lastActivity": "2025-01-03T21:42:30.181Z", "subscribedToChangelog": true, "manuallyOptedOutFromChangelog": false, "roles": [], "locale": "en", "verified": true, "type": "customer", "description": "", "customFields": { "property1": null, "property2": null } }
Request
Retrieves a single contact by their Featurebase ID.
Returns both customers and leads.
id- The Featurebase contact ID (24-character ObjectId)
Returns a single contact object with:
object- Always "contact"id- Unique contact identifieruserId- External user ID from SSO (if set)email- Contact email addressname- Contact display nameprofilePicture- Profile picture URLtype- Contact type ("customer" or "lead")companies- Array of companies the contact belongs tocustomFields- Custom field valuespostsCreated- Number of posts createdcommentsCreated- Number of comments createdlastActivity- Last activity timestamp
{
"object": "contact",
"id": "676f0f6765bdaa7d7d760f88",
"email": "john@example.com",
"name": "John Doe",
"type": "customer",
...
}This endpoint is only available in API version 2026-01-01.nova and newer.
- Mock serverhttps://docs.featurebase.app/_mock/rest-api/v2/contacts/{id}
- Productionhttps://do.featurebase.app/v2/contacts/{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/contacts/507f1f77bcf86cd799439011 \
-H 'Authorization: Bearer <YOUR_TOKEN_HERE>' \
-H 'Featurebase-Version: 2026-01-01.nova'{ "object": "contact", "id": "676f0f6765bdaa7d7d760f88", "userId": "676f0f673dbb299c8a4f3057", "organizationId": "5febde12dc56d60012d47db6", "companies": [], "email": "john@example.com", "name": "John Steezy", "profilePicture": "https://fb-usercontent.fra1.cdn.digitaloceanspaces.com/anon_23.png", "commentsCreated": 0, "postsCreated": 0, "lastActivity": "2025-01-03T21:42:30.181Z", "subscribedToChangelog": true, "manuallyOptedOutFromChangelog": false, "roles": [], "locale": "en", "verified": true, "type": "customer", "description": "", "customFields": { "property1": null, "property2": null } }
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.