Boards (post categories) organize feedback into distinct containers with their own settings.
- Update contact email preferences by ID
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
Retrieves the email preference state for a customer contact by their Featurebase ID.
Important: This endpoint only supports customer contacts. Leads do not have a customer email preference surface in the public API.
id- The Featurebase contact ID (24-character ObjectId)
Returns a contact email preferences object with:
object- Always "contact_email_preferences"contactId- Featurebase contact IDuserId- External user ID, if availableemail- Contact email address, if availablepreferences- Current email preference state
Each preference includes:
status- The stored preference state for that categoryeffectiveStatus- The final state after applying the globalallpreference override
{
"object": "contact_email_preferences",
"contactId": "676f0f6765bdaa7d7d760f88",
"userId": "usr_12345",
"email": "john@example.com",
"preferences": {
"all": {
"status": "unsubscribed",
"effectiveStatus": "unsubscribed"
},
"postUpdates": {
"status": "subscribed",
"effectiveStatus": "unsubscribed"
},
"postComments": {
"status": "subscribed",
"effectiveStatus": "unsubscribed"
},
"commentReplies": {
"status": "subscribed",
"effectiveStatus": "unsubscribed"
},
"changelog": {
"status": "subscribed",
"effectiveStatus": "unsubscribed"
}
}
}- Mock serverhttps://docs.featurebase.app/_mock/rest-api/v2/contacts/{id}/email-preferences
- Productionhttps://do.featurebase.app/v2/contacts/{id}/email-preferences
- 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/email-preferences \
-H 'Authorization: Bearer <YOUR_TOKEN_HERE>' \
-H 'Featurebase-Version: 2026-01-01.nova'Success
Object type identifier
Email preference state for this contact, including both stored status and final effective status.
Global email preference state for all email notifications.
Stored preference status for this category
Global email preference state for all email notifications.
Stored preference status for this category
Global email preference state for all email notifications.
Stored preference status for this category
Preference state for replies to the contact’s comments.
Stored preference status for this category
Global email preference state for all email notifications.
Stored preference status for this category
{ "object": "contact_email_preferences", "contactId": "676f0f6765bdaa7d7d760f88", "userId": "usr_12345", "email": "john@example.com", "preferences": { "all": { … }, "postUpdates": { … }, "postComments": { … }, "commentReplies": { … }, "changelog": { … } } }
Request
Updates one or more email preferences for a customer contact by their Featurebase ID.
Important: This endpoint only supports customer contacts. Leads do not have a customer email preference surface in the public API.
id- The Featurebase contact ID (24-character ObjectId)
preferences- A partial map of preference keys to their desired stored status. Only the preferences included in the request are updated; any preferences omitted are left unchanged. At least one preference must be provided.
all- Master delivery gate. Whenunsubscribed, the contact will not receive any emails regardless of the per-category values. Per-category values are still persisted, so flippingallback tosubscribedrestores the contact's previous granular preferences.postUpdates- Status changes and updates on posts the contact interacts with.postComments- New comments on posts the contact follows.commentReplies- Replies to the contact's own comments.changelog- New changelog releases.
subscribed- The contact will receive this email category (subject to theallgate).unsubscribed- The contact will not receive this email category.
You can send all together with any per-category keys in the same request. The full map is applied atomically as the contact's new stored state — there is no implicit reset of the other keys. This makes the endpoint safe for preference-center UIs that POST the entire form state on submit.
The computed per-category result (after applying the all gate) is surfaced as effectiveStatus in the response, while status reflects the value actually stored for that key.
{
"preferences": {
"postUpdates": "unsubscribed",
"changelog": "subscribed"
}
}{
"preferences": {
"all": "subscribed",
"postUpdates": "subscribed",
"postComments": "unsubscribed",
"commentReplies": "unsubscribed",
"changelog": "unsubscribed"
}
}{
"object": "contact_email_preferences",
"contactId": "676f0f6765bdaa7d7d760f88",
"userId": "usr_12345",
"email": "john@example.com",
"preferences": {
"all": {
"status": "subscribed",
"effectiveStatus": "subscribed"
},
"postUpdates": {
"status": "subscribed",
"effectiveStatus": "subscribed"
},
"postComments": {
"status": "unsubscribed",
"effectiveStatus": "unsubscribed"
},
"commentReplies": {
"status": "unsubscribed",
"effectiveStatus": "unsubscribed"
},
"changelog": {
"status": "unsubscribed",
"effectiveStatus": "unsubscribed"
}
}
}Master delivery gate. When unsubscribed, the contact receives no emails regardless of the per-category values. Per-category values are preserved.
Stored status for post status changes and updates on posts the contact follows.
Stored status for new comments on posts the contact follows.
Stored status for replies to the contact’s own comments.
- Mock serverhttps://docs.featurebase.app/_mock/rest-api/v2/contacts/{id}/email-preferences
- Productionhttps://do.featurebase.app/v2/contacts/{id}/email-preferences
- curl
- JavaScript
- Node.js
- Python
- Java
- C#
- PHP
- Go
- Ruby
- R
- Payload
curl -i -X PATCH \
https://docs.featurebase.app/_mock/rest-api/v2/contacts/507f1f77bcf86cd799439011/email-preferences \
-H 'Authorization: Bearer <YOUR_TOKEN_HERE>' \
-H 'Content-Type: application/json' \
-H 'Featurebase-Version: 2026-01-01.nova' \
-d '{
"preferences": {
"all": "unsubscribed",
"postUpdates": "unsubscribed",
"postComments": "unsubscribed",
"commentReplies": "unsubscribed",
"changelog": "unsubscribed"
}
}'Success
Object type identifier
Email preference state for this contact, including both stored status and final effective status.
Global email preference state for all email notifications.
Stored preference status for this category
Global email preference state for all email notifications.
Stored preference status for this category
Global email preference state for all email notifications.
Stored preference status for this category
Preference state for replies to the contact’s comments.
Stored preference status for this category
Global email preference state for all email notifications.
Stored preference status for this category
{ "object": "contact_email_preferences", "contactId": "676f0f6765bdaa7d7d760f88", "userId": "usr_12345", "email": "john@example.com", "preferences": { "all": { … }, "postUpdates": { … }, "postComments": { … }, "commentReplies": { … }, "changelog": { … } } }
Request
Retrieves the email preference state for a customer contact by their external user ID.
This endpoint only supports customer contacts and mirrors the existing by-user-id lookup pattern used across the contact API.
userId- The external user ID from your system
{
"object": "contact_email_preferences",
"contactId": "676f0f6765bdaa7d7d760f88",
"userId": "usr_12345",
"email": "john@example.com",
"preferences": {
"all": {
"status": "unsubscribed",
"effectiveStatus": "unsubscribed"
},
"postUpdates": {
"status": "subscribed",
"effectiveStatus": "unsubscribed"
},
"postComments": {
"status": "subscribed",
"effectiveStatus": "unsubscribed"
},
"commentReplies": {
"status": "subscribed",
"effectiveStatus": "unsubscribed"
},
"changelog": {
"status": "subscribed",
"effectiveStatus": "unsubscribed"
}
}
}- Mock serverhttps://docs.featurebase.app/_mock/rest-api/v2/contacts/by-user-id/{userId}/email-preferences
- Productionhttps://do.featurebase.app/v2/contacts/by-user-id/{userId}/email-preferences
- 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/by-user-id/usr_12345/email-preferences \
-H 'Authorization: Bearer <YOUR_TOKEN_HERE>' \
-H 'Featurebase-Version: 2026-01-01.nova'Success
Object type identifier
Email preference state for this contact, including both stored status and final effective status.
Global email preference state for all email notifications.
Stored preference status for this category
Global email preference state for all email notifications.
Stored preference status for this category
Global email preference state for all email notifications.
Stored preference status for this category
Preference state for replies to the contact’s comments.
Stored preference status for this category
Global email preference state for all email notifications.
Stored preference status for this category
{ "object": "contact_email_preferences", "contactId": "676f0f6765bdaa7d7d760f88", "userId": "usr_12345", "email": "john@example.com", "preferences": { "all": { … }, "postUpdates": { … }, "postComments": { … }, "commentReplies": { … }, "changelog": { … } } }
Comments
Threaded discussions on posts and changelogs. Comments support voting, moderation, and privacy controls.