Skip to content

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.

Download OpenAPI description
Languages
Servers
Mock server
https://docs.featurebase.app/_mock/rest-api
Production
https://do.featurebase.app

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.nova

Or 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 - Success
  • 4xx - 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

TypeDescription
authentication_errorAuthentication failed (401)
authorization_errorPermission denied (403)
invalid_request_errorInvalid request parameters or resource not found (400, 404, 410)
api_errorServer-side error (500)
rate_limit_errorToo many requests (429)

Boards

Boards (post categories) organize feedback into distinct containers with their own settings.

Operations

Posts

User-submitted feedback and feature requests. Posts belong to boards and can be upvoted, commented on, and tracked through statuses.

Operations

Post Statuses

Post statuses define the workflow stages for posts (e.g., In Review, Active, Completed).

Operations

Comments

Threaded discussions on posts and changelogs. Comments support voting, moderation, and privacy controls.

Operations

Custom Fields

Configurable input fields for posts in your Featurebase organization. Custom fields allow you to collect additional structured data when users create posts.

Operations

Changelogs

Release notes and updates published by the organization. Changelogs keep users informed about new features, improvements, and fixes.

Operations

Admins

Team members who manage your Featurebase organization. Admins have roles that define their permissions.

Operations

Teams

Teams are groups within your Featurebase organization. Use this endpoint to list and retrieve team information for conversation assignment and organization management.

Operations

Brands

Brands represent distinct brand identities within your organization. Each brand can have its own help center and email sending address. Use this endpoint to list and retrieve brand information.

Operations

Contacts

Contacts are the customers and leads in your Featurebase organization. Use this endpoint to list and retrieve contact information.

Operations

Get contact email preferences by ID

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.

Path Parameters

  • id - The Featurebase contact ID (24-character ObjectId)

Response Format

Returns a contact email preferences object with:

  • object - Always "contact_email_preferences"
  • contactId - Featurebase contact ID
  • userId - External user ID, if available
  • email - Contact email address, if available
  • preferences - Current email preference state

Preference Semantics

Each preference includes:

  • status - The stored preference state for that category
  • effectiveStatus - The final state after applying the global all preference override

Example Response

{
  "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"
    }
  }
}
Security
bearerAuth
Path
idstringrequired

Featurebase contact ID

Example: 507f1f77bcf86cd799439011
Headers
Featurebase-Versionstring(FeaturebaseVersion)

API version for this request. Defaults to your organization's configured API version if not specified.

Example: 2026-01-01.nova
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'

Responses

Success

Bodyapplication/json
objectstringrequired

Object type identifier

Value"contact_email_preferences"
Example: "contact_email_preferences"
contactIdstringrequired

Featurebase contact ID

Example: "676f0f6765bdaa7d7d760f88"
userIdstring or null

External user ID from your system, if available

Example: "usr_12345"
emailstring or null

Contact email address, if available

Example: "john@example.com"
preferencesobject(ContactEmailPreferences)required

Email preference state for this contact, including both stored status and final effective status.

preferences.​allobject(ContactEmailPreferenceState)required

Global email preference state for all email notifications.

preferences.​all.​statusstringrequired

Stored preference status for this category

Enum"subscribed""unsubscribed"
Example: "subscribed"
preferences.​all.​effectiveStatusstringrequired

Final effective status after applying global preference overrides

Enum"subscribed""unsubscribed"
Example: "unsubscribed"
preferences.​postUpdatesobjectrequired

Global email preference state for all email notifications.

Example: {"status":"subscribed","effectiveStatus":"unsubscribed"}
preferences.​postUpdates.​statusstringrequired

Stored preference status for this category

Enum"subscribed""unsubscribed"
Example: "subscribed"
preferences.​postUpdates.​effectiveStatusstringrequired

Final effective status after applying global preference overrides

Enum"subscribed""unsubscribed"
Example: "unsubscribed"
preferences.​postCommentsobjectrequired

Global email preference state for all email notifications.

Example: {"status":"subscribed","effectiveStatus":"subscribed"}
preferences.​postComments.​statusstringrequired

Stored preference status for this category

Enum"subscribed""unsubscribed"
Example: "subscribed"
preferences.​postComments.​effectiveStatusstringrequired

Final effective status after applying global preference overrides

Enum"subscribed""unsubscribed"
Example: "subscribed"
preferences.​commentRepliesobjectrequired

Preference state for replies to the contact’s comments.

Example: {"status":"subscribed","effectiveStatus":"subscribed"}
preferences.​commentReplies.​statusstringrequired

Stored preference status for this category

Enum"subscribed""unsubscribed"
Example: "subscribed"
preferences.​commentReplies.​effectiveStatusstringrequired

Final effective status after applying global preference overrides

Enum"subscribed""unsubscribed"
Example: "subscribed"
preferences.​changelogobjectrequired

Global email preference state for all email notifications.

Example: {"status":"subscribed","effectiveStatus":"subscribed"}
preferences.​changelog.​statusstringrequired

Stored preference status for this category

Enum"subscribed""unsubscribed"
Example: "subscribed"
preferences.​changelog.​effectiveStatusstringrequired

Final effective status after applying global preference overrides

Enum"subscribed""unsubscribed"
Example: "subscribed"
Response
application/json
{ "object": "contact_email_preferences", "contactId": "676f0f6765bdaa7d7d760f88", "userId": "usr_12345", "email": "john@example.com", "preferences": { "all": { … }, "postUpdates": { … }, "postComments": { … }, "commentReplies": { … }, "changelog": { … } } }

Update contact email preferences by ID

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.

Path Parameters

  • id - The Featurebase contact ID (24-character ObjectId)

Request Body

  • 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.

Supported Preference Keys

  • all - Master delivery gate. When unsubscribed, the contact will not receive any emails regardless of the per-category values. Per-category values are still persisted, so flipping all back to subscribed restores 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.

Per-key Values

  • subscribed - The contact will receive this email category (subject to the all gate).
  • unsubscribed - The contact will not receive this email category.

Combining all with per-category keys

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.

Example Request (partial update)

{
  "preferences": {
    "postUpdates": "unsubscribed",
    "changelog": "subscribed"
  }
}

Example Request (full preference-center submit)

{
  "preferences": {
    "all": "subscribed",
    "postUpdates": "subscribed",
    "postComments": "unsubscribed",
    "commentReplies": "unsubscribed",
    "changelog": "unsubscribed"
  }
}

Example Response

{
  "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"
    }
  }
}
Security
bearerAuth
Path
idstringrequired

Featurebase contact ID

Example: 507f1f77bcf86cd799439011
Headers
Featurebase-Versionstring(FeaturebaseVersion)

API version for this request. Defaults to your organization's configured API version if not specified.

Example: 2026-01-01.nova
Bodyapplication/json
preferencesobjectrequired
preferences.​allstring

Master delivery gate. When unsubscribed, the contact receives no emails regardless of the per-category values. Per-category values are preserved.

Enum"subscribed""unsubscribed"
Example: "unsubscribed"
preferences.​postUpdatesstring

Stored status for post status changes and updates on posts the contact follows.

Enum"subscribed""unsubscribed"
Example: "unsubscribed"
preferences.​postCommentsstring

Stored status for new comments on posts the contact follows.

Enum"subscribed""unsubscribed"
Example: "unsubscribed"
preferences.​commentRepliesstring

Stored status for replies to the contact’s own comments.

Enum"subscribed""unsubscribed"
Example: "unsubscribed"
preferences.​changelogstring

Stored status for new changelog release notifications.

Enum"subscribed""unsubscribed"
Example: "unsubscribed"
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"
    }
  }'

Responses

Success

Bodyapplication/json
objectstringrequired

Object type identifier

Value"contact_email_preferences"
Example: "contact_email_preferences"
contactIdstringrequired

Featurebase contact ID

Example: "676f0f6765bdaa7d7d760f88"
userIdstring or null

External user ID from your system, if available

Example: "usr_12345"
emailstring or null

Contact email address, if available

Example: "john@example.com"
preferencesobject(ContactEmailPreferences)required

Email preference state for this contact, including both stored status and final effective status.

preferences.​allobject(ContactEmailPreferenceState)required

Global email preference state for all email notifications.

preferences.​all.​statusstringrequired

Stored preference status for this category

Enum"subscribed""unsubscribed"
Example: "subscribed"
preferences.​all.​effectiveStatusstringrequired

Final effective status after applying global preference overrides

Enum"subscribed""unsubscribed"
Example: "unsubscribed"
preferences.​postUpdatesobjectrequired

Global email preference state for all email notifications.

Example: {"status":"subscribed","effectiveStatus":"unsubscribed"}
preferences.​postUpdates.​statusstringrequired

Stored preference status for this category

Enum"subscribed""unsubscribed"
Example: "subscribed"
preferences.​postUpdates.​effectiveStatusstringrequired

Final effective status after applying global preference overrides

Enum"subscribed""unsubscribed"
Example: "unsubscribed"
preferences.​postCommentsobjectrequired

Global email preference state for all email notifications.

Example: {"status":"subscribed","effectiveStatus":"subscribed"}
preferences.​postComments.​statusstringrequired

Stored preference status for this category

Enum"subscribed""unsubscribed"
Example: "subscribed"
preferences.​postComments.​effectiveStatusstringrequired

Final effective status after applying global preference overrides

Enum"subscribed""unsubscribed"
Example: "subscribed"
preferences.​commentRepliesobjectrequired

Preference state for replies to the contact’s comments.

Example: {"status":"subscribed","effectiveStatus":"subscribed"}
preferences.​commentReplies.​statusstringrequired

Stored preference status for this category

Enum"subscribed""unsubscribed"
Example: "subscribed"
preferences.​commentReplies.​effectiveStatusstringrequired

Final effective status after applying global preference overrides

Enum"subscribed""unsubscribed"
Example: "subscribed"
preferences.​changelogobjectrequired

Global email preference state for all email notifications.

Example: {"status":"subscribed","effectiveStatus":"subscribed"}
preferences.​changelog.​statusstringrequired

Stored preference status for this category

Enum"subscribed""unsubscribed"
Example: "subscribed"
preferences.​changelog.​effectiveStatusstringrequired

Final effective status after applying global preference overrides

Enum"subscribed""unsubscribed"
Example: "subscribed"
Response
application/json
{ "object": "contact_email_preferences", "contactId": "676f0f6765bdaa7d7d760f88", "userId": "usr_12345", "email": "john@example.com", "preferences": { "all": { … }, "postUpdates": { … }, "postComments": { … }, "commentReplies": { … }, "changelog": { … } } }

Get contact email preferences by external user ID

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.

Path Parameters

  • userId - The external user ID from your system

Example Response

{
  "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"
    }
  }
}
Security
bearerAuth
Path
userIdstring<= 255 charactersrequired

External user ID from your system

Example: usr_12345
Headers
Featurebase-Versionstring(FeaturebaseVersion)

API version for this request. Defaults to your organization's configured API version if not specified.

Example: 2026-01-01.nova
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'

Responses

Success

Bodyapplication/json
objectstringrequired

Object type identifier

Value"contact_email_preferences"
Example: "contact_email_preferences"
contactIdstringrequired

Featurebase contact ID

Example: "676f0f6765bdaa7d7d760f88"
userIdstring or null

External user ID from your system, if available

Example: "usr_12345"
emailstring or null

Contact email address, if available

Example: "john@example.com"
preferencesobject(ContactEmailPreferences)required

Email preference state for this contact, including both stored status and final effective status.

preferences.​allobject(ContactEmailPreferenceState)required

Global email preference state for all email notifications.

preferences.​all.​statusstringrequired

Stored preference status for this category

Enum"subscribed""unsubscribed"
Example: "subscribed"
preferences.​all.​effectiveStatusstringrequired

Final effective status after applying global preference overrides

Enum"subscribed""unsubscribed"
Example: "unsubscribed"
preferences.​postUpdatesobjectrequired

Global email preference state for all email notifications.

Example: {"status":"subscribed","effectiveStatus":"unsubscribed"}
preferences.​postUpdates.​statusstringrequired

Stored preference status for this category

Enum"subscribed""unsubscribed"
Example: "subscribed"
preferences.​postUpdates.​effectiveStatusstringrequired

Final effective status after applying global preference overrides

Enum"subscribed""unsubscribed"
Example: "unsubscribed"
preferences.​postCommentsobjectrequired

Global email preference state for all email notifications.

Example: {"status":"subscribed","effectiveStatus":"subscribed"}
preferences.​postComments.​statusstringrequired

Stored preference status for this category

Enum"subscribed""unsubscribed"
Example: "subscribed"
preferences.​postComments.​effectiveStatusstringrequired

Final effective status after applying global preference overrides

Enum"subscribed""unsubscribed"
Example: "subscribed"
preferences.​commentRepliesobjectrequired

Preference state for replies to the contact’s comments.

Example: {"status":"subscribed","effectiveStatus":"subscribed"}
preferences.​commentReplies.​statusstringrequired

Stored preference status for this category

Enum"subscribed""unsubscribed"
Example: "subscribed"
preferences.​commentReplies.​effectiveStatusstringrequired

Final effective status after applying global preference overrides

Enum"subscribed""unsubscribed"
Example: "subscribed"
preferences.​changelogobjectrequired

Global email preference state for all email notifications.

Example: {"status":"subscribed","effectiveStatus":"subscribed"}
preferences.​changelog.​statusstringrequired

Stored preference status for this category

Enum"subscribed""unsubscribed"
Example: "subscribed"
preferences.​changelog.​effectiveStatusstringrequired

Final effective status after applying global preference overrides

Enum"subscribed""unsubscribed"
Example: "subscribed"
Response
application/json
{ "object": "contact_email_preferences", "contactId": "676f0f6765bdaa7d7d760f88", "userId": "usr_12345", "email": "john@example.com", "preferences": { "all": { … }, "postUpdates": { … }, "postComments": { … }, "commentReplies": { … }, "changelog": { … } } }

Companies

Companies represent organizations or businesses that your users belong to. Use this endpoint to list and retrieve company information.

Operations

Surveys

Surveys allow you to collect targeted feedback from your users within your product. Surveys can be targeted to specific user segments or pages and can contain multiple questions with conditional logic.

Operations

Help Centers

Help centers allow organizations to create and manage knowledge bases with articles and collections. Currently, Featurebase supports one help center per organization.

Operations

Conversations

Conversations are messenger/inbox conversations in your Featurebase organization. Use this endpoint to list and retrieve conversation information.

Operations

Tickets

Tickets represent support requests in your Featurebase organization. Create, update, reply to, and manage tickets via these endpoints.

Operations

Webhooks

Webhooks allow you to receive real-time HTTP callbacks when events occur in your Featurebase organization. Configure webhook endpoints to subscribe to specific event types.

Operations