# Changelogs ## List all changelogs `client.changelogs.list(ChangelogListParamsparams?, RequestOptionsoptions?): CursorPage` **get** `/v2/changelogs` Returns all changelogs for the authenticated organization. Changelogs are release notes and updates that keep users informed about new features, improvements, and bug fixes. Each changelog can have: - Multiple translations (locales) - Categories for organization - Featured images - Scheduled publishing ### Pagination This endpoint uses **cursor-based pagination**: - `limit` - Number of changelogs to return (1-100, default 10) - `cursor` - Opaque cursor from a previous response's `nextCursor` field **Example:** To paginate through results: 1. First request: `GET /v2/changelogs?limit=10` 1. If `nextCursor` is not null, use it for the next page 1. Next request: `GET /v2/changelogs?limit=10&cursor={nextCursor}` ### Response Format Returns a list object with: - `object` - Always "list" - `data` - Array of changelog objects - `nextCursor` - Cursor for the next page (null if no more results) ### Filtering Filter changelogs using query parameters: - `id` - Find a specific changelog by ID or slug - `q` - Search query for title/content - `categories` - Filter by category names - `locale` - Get changelogs in a specific locale (defaults to org default) - `state` - Filter by state: `live`, `draft`, or `all` - `startDate` - Include changelogs dated on or after this date - `endDate` - Include changelogs dated on or before this date ### Sorting Results are sorted by date (descending by default): - `sortBy` - Field to sort by (currently only `date`) - `sortOrder` - Sort direction: `asc` or `desc` (default: `desc`) ### Parameters - `params: ChangelogListParams` - `id?: string` Query param: Find changelog by its id (also accepts slug) - `categories?: string | Array` Query param: Filter changelogs by category names (single value or array) - `string` - `Array` - `cursor?: string` Query param: Cursor for pagination. Use nextCursor from previous response. - `endDate?: string | null` Query param: Include Changelogs dated on or before the specified end date - `limit?: number` Query param: Maximum number of changelogs to return - `locale?: "bn" | "bs" | "pt-BR" | 39 more` Query param: The locale of the changelogs. Defaults to the organization default locale. - `"bn"` - `"bs"` - `"pt-BR"` - `"bg"` - `"ca"` - `"hr"` - `"cs"` - `"da"` - `"nl"` - `"en"` - `"et"` - `"fi"` - `"fr"` - `"de"` - `"el"` - `"hi"` - `"hu"` - `"id"` - `"it"` - `"ja"` - `"ko"` - `"lv"` - `"lt"` - `"ms"` - `"mn"` - `"nb"` - `"pl"` - `"pt"` - `"ro"` - `"ru"` - `"sr"` - `"zh-CN"` - `"sk"` - `"sl"` - `"es"` - `"sw"` - `"sv"` - `"th"` - `"zh-TW"` - `"tr"` - `"uk"` - `"vi"` - `q?: string` Query param: Search for changelogs by title or content - `sortBy?: "date"` Query param: Field to sort by - `"date"` - `sortOrder?: "asc" | "desc"` Query param: Sort direction - `"asc"` - `"desc"` - `startDate?: string | null` Query param: Include Changelogs dated on or after the specified start date - `state?: "draft" | "live" | "all"` Query param: The state of the changelog. Use "all" to get both draft and live changelogs. - `"draft"` - `"live"` - `"all"` - `featurebaseVersion?: "2026-01-01.nova" | "2025-12-12.clover"` Header param: API version for this request. Defaults to your organization's configured API version if not specified. - `"2026-01-01.nova"` - `"2025-12-12.clover"` ### Returns - `Changelog` - `id: string` Unique identifier - `allowedSegmentIds: Array` Segment IDs that are allowed to view this changelog - `availableLocales: Array` Array of locale codes where the changelog has content - `categories: Array` Categories the changelog belongs to - `id: string` Category unique identifier - `name: string` Category name - `roles?: Array` Roles allowed to view this category - `commentCount: number` Number of comments - `content: string` Content in HTML format - `createdAt: string` ISO 8601 timestamp when created - `date: string` Publication date as ISO 8601 timestamp - `emailSentToSubscribers: boolean` Whether email notification was sent to subscribers - `featuredImage: string | null` Featured image URL - `isDraftDiffersFromLive: boolean` Whether the draft content differs from the published live content - `isPublished: boolean` Whether the changelog is published (has a live version) in this locale - `locale: "bn" | "bs" | "pt-BR" | 39 more` Locale of the changelog - `"bn"` - `"bs"` - `"pt-BR"` - `"bg"` - `"ca"` - `"hr"` - `"cs"` - `"da"` - `"nl"` - `"en"` - `"et"` - `"fi"` - `"fr"` - `"de"` - `"el"` - `"hi"` - `"hu"` - `"id"` - `"it"` - `"ja"` - `"ko"` - `"lv"` - `"lt"` - `"ms"` - `"mn"` - `"nb"` - `"pl"` - `"pt"` - `"ro"` - `"ru"` - `"sr"` - `"zh-CN"` - `"sk"` - `"sl"` - `"es"` - `"sw"` - `"sv"` - `"th"` - `"zh-TW"` - `"tr"` - `"uk"` - `"vi"` - `markdownContent: string | null` Content in markdown format - `notifications: Record` Notification settings for each locale - `scheduledDate: string | null` Scheduled publication date as ISO 8601 timestamp - `emailSent?: boolean` Whether the email notification has been sent - `hideFromBoardAndWidgets?: boolean` Whether the changelog is hidden from the board and widgets - `sendEmailNotification?: boolean` Whether email notification should be sent for this locale - `object: "changelog"` Object type identifier - `"changelog"` - `organization: string` Organization identifier - `publishedLocales: Array` Array of locale codes where the changelog is published - `slug: string` URL-friendly slug - `slugs: Record` URL-friendly slugs for each locale - `state: "live" | "draft"` State of the changelog - `"live"` - `"draft"` - `title: string` Changelog title - `updatedAt: string` ISO 8601 timestamp when updated - `url: string` Public URL to view the changelog ### Example ```typescript import Featurebase from 'featurebase-node'; const client = new Featurebase({ apiKey: process.env['FEATUREBASE_API_KEY'], // This is the default and can be omitted }); // Automatically fetches more pages as needed. for await (const changelog of client.changelogs.list()) { console.log(changelog.id); } ``` #### Response ```json { "data": [ { "id": "6457e3ff70afca5d8c27dccc", "allowedSegmentIds": [ "string" ], "availableLocales": [ "en", "de", "fr" ], "categories": [ { "id": "6438a1efda3640f8feb72121", "name": "New Features", "roles": [ "string" ] } ], "commentCount": 2, "content": "

Your changelog content in HTML format.

", "createdAt": "2023-12-12T00:00:00.000Z", "date": "2023-05-07T12:59:59.000Z", "emailSentToSubscribers": true, "featuredImage": "https://cdn.example.com/images/feature.png", "isDraftDiffersFromLive": false, "isPublished": true, "locale": "en", "markdownContent": "Your changelog content in markdown format.", "notifications": { "foo": { "scheduledDate": "2024-01-15T12:00:00.000Z", "emailSent": true, "hideFromBoardAndWidgets": false, "sendEmailNotification": true } }, "object": "changelog", "organization": "myorg", "publishedLocales": [ "en", "de" ], "slug": "your-awesome-changelog", "slugs": { "en": "your-awesome-changelog", "de": "dein-tolles-changelog" }, "state": "live", "title": "Your awesome changelog!", "updatedAt": "2023-12-13T00:00:00.000Z", "url": "https://myorg.featurebase.app/en/changelog/your-awesome-changelog" } ], "nextCursor": "eyJpZCI6IjUwN2YxZjc3YmNmODZjZDc5OTQzOTAxMSJ9", "object": "list", "pagination": { "limit": 10, "page": 1, "total": 42, "totalPages": 5 } } ``` ## Create a new changelog `client.changelogs.create(ChangelogCreateParamsparams, RequestOptionsoptions?): Changelog` **post** `/v2/changelogs` Creates a new changelog for the authenticated organization. ### Required Fields - `title` - The title of the changelog ### Content Provide content in one of two formats (at least one is required): - `htmlContent` - HTML content of the changelog - `markdownContent` - Markdown content of the changelog **Note:** For images in content, you can use: - External URLs in img src attributes (automatically uploaded to our storage) - Base64 encoded data URIs (data:image/...) which are processed and stored ### Optional Fields - `categories` - Array of category names (e.g., ["New", "Fixed", "Improved"]) - `featuredImage` - URL of the featured image (external URLs are uploaded to our storage) - `allowedSegmentIds` - Array of segment IDs that are allowed to view the changelog - `locale` - The locale of the changelog (defaults to organization default) - `date` - The date of the changelog - `state` - The state of the changelog: `draft` (default) or `live` ### Response Returns the created changelog object. ### Parameters - `params: ChangelogCreateParams` - `title: string` Body param: The title of the changelog - `allowedSegmentIds?: Array` Body param: An array of segment IDs that are allowed to view the changelog - `categories?: Array` Body param: An array of category names to which the changelog belongs - `date?: string | null` Body param: The date of the changelog - `featuredImage?: string` Body param: The URL of the featured image for the changelog. External URLs will be uploaded to our storage. - `htmlContent?: string` Body param: The HTML content of the changelog. Provide either htmlContent or markdownContent. For images, external URLs and base64 data URIs are automatically processed and stored. - `locale?: "bn" | "bs" | "pt-BR" | 39 more` Body param: The locale of the changelog, defaulting to the organization default locale - `"bn"` - `"bs"` - `"pt-BR"` - `"bg"` - `"ca"` - `"hr"` - `"cs"` - `"da"` - `"nl"` - `"en"` - `"et"` - `"fi"` - `"fr"` - `"de"` - `"el"` - `"hi"` - `"hu"` - `"id"` - `"it"` - `"ja"` - `"ko"` - `"lv"` - `"lt"` - `"ms"` - `"mn"` - `"nb"` - `"pl"` - `"pt"` - `"ro"` - `"ru"` - `"sr"` - `"zh-CN"` - `"sk"` - `"sl"` - `"es"` - `"sw"` - `"sv"` - `"th"` - `"zh-TW"` - `"tr"` - `"uk"` - `"vi"` - `markdownContent?: string` Body param: The markdown content of the changelog. Provide either htmlContent or markdownContent. For images, external URLs and base64 data URIs are automatically processed and stored. - `state?: "draft" | "live"` Body param: The state of the changelog (draft or live) - `"draft"` - `"live"` - `featurebaseVersion?: "2026-01-01.nova" | "2025-12-12.clover"` Header param: API version for this request. Defaults to your organization's configured API version if not specified. - `"2026-01-01.nova"` - `"2025-12-12.clover"` ### Returns - `Changelog` - `id: string` Unique identifier - `allowedSegmentIds: Array` Segment IDs that are allowed to view this changelog - `availableLocales: Array` Array of locale codes where the changelog has content - `categories: Array` Categories the changelog belongs to - `id: string` Category unique identifier - `name: string` Category name - `roles?: Array` Roles allowed to view this category - `commentCount: number` Number of comments - `content: string` Content in HTML format - `createdAt: string` ISO 8601 timestamp when created - `date: string` Publication date as ISO 8601 timestamp - `emailSentToSubscribers: boolean` Whether email notification was sent to subscribers - `featuredImage: string | null` Featured image URL - `isDraftDiffersFromLive: boolean` Whether the draft content differs from the published live content - `isPublished: boolean` Whether the changelog is published (has a live version) in this locale - `locale: "bn" | "bs" | "pt-BR" | 39 more` Locale of the changelog - `"bn"` - `"bs"` - `"pt-BR"` - `"bg"` - `"ca"` - `"hr"` - `"cs"` - `"da"` - `"nl"` - `"en"` - `"et"` - `"fi"` - `"fr"` - `"de"` - `"el"` - `"hi"` - `"hu"` - `"id"` - `"it"` - `"ja"` - `"ko"` - `"lv"` - `"lt"` - `"ms"` - `"mn"` - `"nb"` - `"pl"` - `"pt"` - `"ro"` - `"ru"` - `"sr"` - `"zh-CN"` - `"sk"` - `"sl"` - `"es"` - `"sw"` - `"sv"` - `"th"` - `"zh-TW"` - `"tr"` - `"uk"` - `"vi"` - `markdownContent: string | null` Content in markdown format - `notifications: Record` Notification settings for each locale - `scheduledDate: string | null` Scheduled publication date as ISO 8601 timestamp - `emailSent?: boolean` Whether the email notification has been sent - `hideFromBoardAndWidgets?: boolean` Whether the changelog is hidden from the board and widgets - `sendEmailNotification?: boolean` Whether email notification should be sent for this locale - `object: "changelog"` Object type identifier - `"changelog"` - `organization: string` Organization identifier - `publishedLocales: Array` Array of locale codes where the changelog is published - `slug: string` URL-friendly slug - `slugs: Record` URL-friendly slugs for each locale - `state: "live" | "draft"` State of the changelog - `"live"` - `"draft"` - `title: string` Changelog title - `updatedAt: string` ISO 8601 timestamp when updated - `url: string` Public URL to view the changelog ### Example ```typescript import Featurebase from 'featurebase-node'; const client = new Featurebase({ apiKey: process.env['FEATUREBASE_API_KEY'], // This is the default and can be omitted }); const changelog = await client.changelogs.create({ title: 'New Features Update' }); console.log(changelog.id); ``` #### Response ```json { "id": "6457e3ff70afca5d8c27dccc", "allowedSegmentIds": [ "string" ], "availableLocales": [ "en", "de", "fr" ], "categories": [ { "id": "6438a1efda3640f8feb72121", "name": "New Features", "roles": [ "string" ] } ], "commentCount": 2, "content": "

Your changelog content in HTML format.

", "createdAt": "2023-12-12T00:00:00.000Z", "date": "2023-05-07T12:59:59.000Z", "emailSentToSubscribers": true, "featuredImage": "https://cdn.example.com/images/feature.png", "isDraftDiffersFromLive": false, "isPublished": true, "locale": "en", "markdownContent": "Your changelog content in markdown format.", "notifications": { "foo": { "scheduledDate": "2024-01-15T12:00:00.000Z", "emailSent": true, "hideFromBoardAndWidgets": false, "sendEmailNotification": true } }, "object": "changelog", "organization": "myorg", "publishedLocales": [ "en", "de" ], "slug": "your-awesome-changelog", "slugs": { "en": "your-awesome-changelog", "de": "dein-tolles-changelog" }, "state": "live", "title": "Your awesome changelog!", "updatedAt": "2023-12-13T00:00:00.000Z", "url": "https://myorg.featurebase.app/en/changelog/your-awesome-changelog" } ``` ## Get a changelog by ID `client.changelogs.retrieve(stringid, ChangelogRetrieveParamsparams?, RequestOptionsoptions?): Changelog` **get** `/v2/changelogs/{id}` Retrieves a single changelog by its unique identifier or slug. Returns the full changelog object including: - Title and content (in HTML and markdown formats) - Featured image - Publication date - Categories - Comment count - Email notification status ### Localization The changelog content is returned in the organization's default locale. If the changelog doesn't exist in the default locale, the first available locale is used. ### State Both published (`live`) and draft changelogs can be retrieved. The `state` field indicates the current publication status. ### Parameters - `id: string` Changelog unique identifier - `params: ChangelogRetrieveParams` - `featurebaseVersion?: "2026-01-01.nova" | "2025-12-12.clover"` API version for this request. Defaults to your organization's configured API version if not specified. - `"2026-01-01.nova"` - `"2025-12-12.clover"` ### Returns - `Changelog` - `id: string` Unique identifier - `allowedSegmentIds: Array` Segment IDs that are allowed to view this changelog - `availableLocales: Array` Array of locale codes where the changelog has content - `categories: Array` Categories the changelog belongs to - `id: string` Category unique identifier - `name: string` Category name - `roles?: Array` Roles allowed to view this category - `commentCount: number` Number of comments - `content: string` Content in HTML format - `createdAt: string` ISO 8601 timestamp when created - `date: string` Publication date as ISO 8601 timestamp - `emailSentToSubscribers: boolean` Whether email notification was sent to subscribers - `featuredImage: string | null` Featured image URL - `isDraftDiffersFromLive: boolean` Whether the draft content differs from the published live content - `isPublished: boolean` Whether the changelog is published (has a live version) in this locale - `locale: "bn" | "bs" | "pt-BR" | 39 more` Locale of the changelog - `"bn"` - `"bs"` - `"pt-BR"` - `"bg"` - `"ca"` - `"hr"` - `"cs"` - `"da"` - `"nl"` - `"en"` - `"et"` - `"fi"` - `"fr"` - `"de"` - `"el"` - `"hi"` - `"hu"` - `"id"` - `"it"` - `"ja"` - `"ko"` - `"lv"` - `"lt"` - `"ms"` - `"mn"` - `"nb"` - `"pl"` - `"pt"` - `"ro"` - `"ru"` - `"sr"` - `"zh-CN"` - `"sk"` - `"sl"` - `"es"` - `"sw"` - `"sv"` - `"th"` - `"zh-TW"` - `"tr"` - `"uk"` - `"vi"` - `markdownContent: string | null` Content in markdown format - `notifications: Record` Notification settings for each locale - `scheduledDate: string | null` Scheduled publication date as ISO 8601 timestamp - `emailSent?: boolean` Whether the email notification has been sent - `hideFromBoardAndWidgets?: boolean` Whether the changelog is hidden from the board and widgets - `sendEmailNotification?: boolean` Whether email notification should be sent for this locale - `object: "changelog"` Object type identifier - `"changelog"` - `organization: string` Organization identifier - `publishedLocales: Array` Array of locale codes where the changelog is published - `slug: string` URL-friendly slug - `slugs: Record` URL-friendly slugs for each locale - `state: "live" | "draft"` State of the changelog - `"live"` - `"draft"` - `title: string` Changelog title - `updatedAt: string` ISO 8601 timestamp when updated - `url: string` Public URL to view the changelog ### Example ```typescript import Featurebase from 'featurebase-node'; const client = new Featurebase({ apiKey: process.env['FEATUREBASE_API_KEY'], // This is the default and can be omitted }); const changelog = await client.changelogs.retrieve('507f1f77bcf86cd799439011'); console.log(changelog.id); ``` #### Response ```json { "id": "6457e3ff70afca5d8c27dccc", "allowedSegmentIds": [ "string" ], "availableLocales": [ "en", "de", "fr" ], "categories": [ { "id": "6438a1efda3640f8feb72121", "name": "New Features", "roles": [ "string" ] } ], "commentCount": 2, "content": "

Your changelog content in HTML format.

", "createdAt": "2023-12-12T00:00:00.000Z", "date": "2023-05-07T12:59:59.000Z", "emailSentToSubscribers": true, "featuredImage": "https://cdn.example.com/images/feature.png", "isDraftDiffersFromLive": false, "isPublished": true, "locale": "en", "markdownContent": "Your changelog content in markdown format.", "notifications": { "foo": { "scheduledDate": "2024-01-15T12:00:00.000Z", "emailSent": true, "hideFromBoardAndWidgets": false, "sendEmailNotification": true } }, "object": "changelog", "organization": "myorg", "publishedLocales": [ "en", "de" ], "slug": "your-awesome-changelog", "slugs": { "en": "your-awesome-changelog", "de": "dein-tolles-changelog" }, "state": "live", "title": "Your awesome changelog!", "updatedAt": "2023-12-13T00:00:00.000Z", "url": "https://myorg.featurebase.app/en/changelog/your-awesome-changelog" } ``` ## Update a changelog `client.changelogs.update(stringid, ChangelogUpdateParamsparams, RequestOptionsoptions?): Changelog` **patch** `/v2/changelogs/{id}` Updates an existing changelog by its unique identifier. You can update: - **title** - The changelog title - **htmlContent** - HTML content (one of htmlContent or markdownContent) - **markdownContent** - Markdown content (one of htmlContent or markdownContent) - **categories** - Array of category names - **featuredImage** - Featured image URL - **allowedSegmentIds** - Segment IDs for access control - **date** - The date of the changelog ### Content Format Provide content in one of two formats: - `htmlContent` - HTML content of the changelog - `markdownContent` - Markdown content of the changelog **Note:** For images in content, you can use: - External URLs in img src attributes (automatically uploaded to our storage) - Base64 encoded data URIs (data:image/...) which are processed and stored ### Categories Provide category names as an array. The categories must already exist in your organization. **Example:** `["New", "Fixed", "Improved"]` ### Response Returns the updated changelog object with all fields populated. ### Errors - `400` - Invalid changelog ID format or invalid input - `404` - Changelog not found or doesn't belong to your organization ### Parameters - `id: string` Changelog unique identifier - `params: ChangelogUpdateParams` - `allowedSegmentIds?: Array` Body param: An array of segment IDs that are allowed to view the changelog - `categories?: Array` Body param: An array of category names to which the changelog belongs - `date?: string | null` Body param: The date of the changelog - `featuredImage?: string` Body param: The URL of the featured image for the changelog. External URLs will be uploaded to our storage. - `htmlContent?: string` Body param: The HTML content of the changelog. Provide either htmlContent or markdownContent. For images, external URLs and base64 data URIs are automatically processed and stored. - `markdownContent?: string` Body param: The markdown content of the changelog. Provide either htmlContent or markdownContent. For images, external URLs and base64 data URIs are automatically processed and stored. - `title?: string` Body param: The title of the changelog - `featurebaseVersion?: "2026-01-01.nova" | "2025-12-12.clover"` Header param: API version for this request. Defaults to your organization's configured API version if not specified. - `"2026-01-01.nova"` - `"2025-12-12.clover"` ### Returns - `Changelog` - `id: string` Unique identifier - `allowedSegmentIds: Array` Segment IDs that are allowed to view this changelog - `availableLocales: Array` Array of locale codes where the changelog has content - `categories: Array` Categories the changelog belongs to - `id: string` Category unique identifier - `name: string` Category name - `roles?: Array` Roles allowed to view this category - `commentCount: number` Number of comments - `content: string` Content in HTML format - `createdAt: string` ISO 8601 timestamp when created - `date: string` Publication date as ISO 8601 timestamp - `emailSentToSubscribers: boolean` Whether email notification was sent to subscribers - `featuredImage: string | null` Featured image URL - `isDraftDiffersFromLive: boolean` Whether the draft content differs from the published live content - `isPublished: boolean` Whether the changelog is published (has a live version) in this locale - `locale: "bn" | "bs" | "pt-BR" | 39 more` Locale of the changelog - `"bn"` - `"bs"` - `"pt-BR"` - `"bg"` - `"ca"` - `"hr"` - `"cs"` - `"da"` - `"nl"` - `"en"` - `"et"` - `"fi"` - `"fr"` - `"de"` - `"el"` - `"hi"` - `"hu"` - `"id"` - `"it"` - `"ja"` - `"ko"` - `"lv"` - `"lt"` - `"ms"` - `"mn"` - `"nb"` - `"pl"` - `"pt"` - `"ro"` - `"ru"` - `"sr"` - `"zh-CN"` - `"sk"` - `"sl"` - `"es"` - `"sw"` - `"sv"` - `"th"` - `"zh-TW"` - `"tr"` - `"uk"` - `"vi"` - `markdownContent: string | null` Content in markdown format - `notifications: Record` Notification settings for each locale - `scheduledDate: string | null` Scheduled publication date as ISO 8601 timestamp - `emailSent?: boolean` Whether the email notification has been sent - `hideFromBoardAndWidgets?: boolean` Whether the changelog is hidden from the board and widgets - `sendEmailNotification?: boolean` Whether email notification should be sent for this locale - `object: "changelog"` Object type identifier - `"changelog"` - `organization: string` Organization identifier - `publishedLocales: Array` Array of locale codes where the changelog is published - `slug: string` URL-friendly slug - `slugs: Record` URL-friendly slugs for each locale - `state: "live" | "draft"` State of the changelog - `"live"` - `"draft"` - `title: string` Changelog title - `updatedAt: string` ISO 8601 timestamp when updated - `url: string` Public URL to view the changelog ### Example ```typescript import Featurebase from 'featurebase-node'; const client = new Featurebase({ apiKey: process.env['FEATUREBASE_API_KEY'], // This is the default and can be omitted }); const changelog = await client.changelogs.update('507f1f77bcf86cd799439011'); console.log(changelog.id); ``` #### Response ```json { "id": "6457e3ff70afca5d8c27dccc", "allowedSegmentIds": [ "string" ], "availableLocales": [ "en", "de", "fr" ], "categories": [ { "id": "6438a1efda3640f8feb72121", "name": "New Features", "roles": [ "string" ] } ], "commentCount": 2, "content": "

Your changelog content in HTML format.

", "createdAt": "2023-12-12T00:00:00.000Z", "date": "2023-05-07T12:59:59.000Z", "emailSentToSubscribers": true, "featuredImage": "https://cdn.example.com/images/feature.png", "isDraftDiffersFromLive": false, "isPublished": true, "locale": "en", "markdownContent": "Your changelog content in markdown format.", "notifications": { "foo": { "scheduledDate": "2024-01-15T12:00:00.000Z", "emailSent": true, "hideFromBoardAndWidgets": false, "sendEmailNotification": true } }, "object": "changelog", "organization": "myorg", "publishedLocales": [ "en", "de" ], "slug": "your-awesome-changelog", "slugs": { "en": "your-awesome-changelog", "de": "dein-tolles-changelog" }, "state": "live", "title": "Your awesome changelog!", "updatedAt": "2023-12-13T00:00:00.000Z", "url": "https://myorg.featurebase.app/en/changelog/your-awesome-changelog" } ``` ## Delete a changelog `client.changelogs.delete(stringid, ChangelogDeleteParamsparams?, RequestOptionsoptions?): ChangelogDeleteResponse` **delete** `/v2/changelogs/{id}` Deletes a changelog by its unique identifier. ### Deletion Behavior The changelog and all associated comments are permanently deleted. This action cannot be undone. ### Permissions Only organization admins can delete changelogs. ### Response Returns a deletion confirmation: ```json { "id": "6457e3ff70afca5d8c27dccc", "object": "changelog", "deleted": true } ``` ### Errors - `400` - Invalid changelog ID format - `404` - Changelog not found or doesn't belong to your organization ### Parameters - `id: string` Changelog unique identifier - `params: ChangelogDeleteParams` - `featurebaseVersion?: "2026-01-01.nova" | "2025-12-12.clover"` API version for this request. Defaults to your organization's configured API version if not specified. - `"2026-01-01.nova"` - `"2025-12-12.clover"` ### Returns - `ChangelogDeleteResponse` - `id: string` Unique identifier of the deleted changelog - `deleted: true` Indicates the resource was deleted - `true` - `object: "changelog"` Object type identifier - `"changelog"` ### Example ```typescript import Featurebase from 'featurebase-node'; const client = new Featurebase({ apiKey: process.env['FEATUREBASE_API_KEY'], // This is the default and can be omitted }); const changelog = await client.changelogs.delete('507f1f77bcf86cd799439011'); console.log(changelog.id); ``` #### Response ```json { "id": "507f1f77bcf86cd799439011", "deleted": true, "object": "changelog" } ``` ## Publish a changelog `client.changelogs.publish(stringid, ChangelogPublishParamsparams, RequestOptionsoptions?): PublishUnpublishSuccess` **post** `/v2/changelogs/{id}/publish` Publishes a changelog and optionally sends an email notification to subscribers. ### Optional Fields - `sendEmail` - Whether to send an email notification to subscribers (default: false) - `locales` - Array of locales to publish. An empty array publishes to all available locales - `scheduledDate` - A future date/time when the changelog should be published ### Scheduling If `scheduledDate` is provided: - Must be a future date - The changelog will be scheduled for publishing at that time - Any existing scheduled publish for the same locales will be cancelled and replaced ### Email Notifications If `sendEmail` is true: - Email notifications are sent to all subscribers in the published locales - Emails are only sent once per locale (won't resend on republish) ### Response Returns a success confirmation: ```json { "success": true, "state": "published" } ``` Or for scheduled publishes: ```json { "success": true, "state": "scheduled" } ``` ### Errors - `400` - Invalid changelog ID or scheduled date is not in the future - `404` - Changelog not found or doesn't belong to your organization ### Parameters - `id: string` Changelog unique identifier - `params: ChangelogPublishParams` - `locales?: Array<"bn" | "bs" | "pt-BR" | 39 more>` Body param: An array of locales to publish the changelog to. An empty array publishes to all locales. - `"bn"` - `"bs"` - `"pt-BR"` - `"bg"` - `"ca"` - `"hr"` - `"cs"` - `"da"` - `"nl"` - `"en"` - `"et"` - `"fi"` - `"fr"` - `"de"` - `"el"` - `"hi"` - `"hu"` - `"id"` - `"it"` - `"ja"` - `"ko"` - `"lv"` - `"lt"` - `"ms"` - `"mn"` - `"nb"` - `"pl"` - `"pt"` - `"ro"` - `"ru"` - `"sr"` - `"zh-CN"` - `"sk"` - `"sl"` - `"es"` - `"sw"` - `"sv"` - `"th"` - `"zh-TW"` - `"tr"` - `"uk"` - `"vi"` - `scheduledDate?: string | null` Body param: The date when the changelog should be published. Must be a future date. Pass null or omit to publish immediately. - `sendEmail?: boolean | null` Body param: A flag indicating whether to send an email notification to subscribers. - `featurebaseVersion?: "2026-01-01.nova" | "2025-12-12.clover"` Header param: API version for this request. Defaults to your organization's configured API version if not specified. - `"2026-01-01.nova"` - `"2025-12-12.clover"` ### Returns - `PublishUnpublishSuccess` - `success: true` Indicates the operation was successful - `true` - `state?: "published" | "scheduled" | "unpublished"` The state of the changelog after the operation - `"published"` - `"scheduled"` - `"unpublished"` ### Example ```typescript import Featurebase from 'featurebase-node'; const client = new Featurebase({ apiKey: process.env['FEATUREBASE_API_KEY'], // This is the default and can be omitted }); const publishUnpublishSuccess = await client.changelogs.publish('507f1f77bcf86cd799439011'); console.log(publishUnpublishSuccess.success); ``` #### Response ```json { "success": true, "state": "published" } ``` ## Unpublish a changelog `client.changelogs.unpublish(stringid, ChangelogUnpublishParamsparams, RequestOptionsoptions?): PublishUnpublishSuccess` **post** `/v2/changelogs/{id}/unpublish` Unpublishes a changelog, removing it from public view. ### Optional Fields - `locales` - Array of locales to unpublish from. An empty array unpublishes from all locales ### Behavior - The changelog content is preserved (reverts to draft state) - Any scheduled publishes for the specified locales are cancelled - The changelog can be re-published later ### Response Returns a success confirmation: ```json { "success": true, "state": "unpublished" } ``` ### Errors - `400` - Invalid changelog ID format - `404` - Changelog not found or doesn't belong to your organization ### Parameters - `id: string` Changelog unique identifier - `params: ChangelogUnpublishParams` - `locales?: Array<"bn" | "bs" | "pt-BR" | 39 more>` Body param: An array of locales to unpublish the changelog from. An empty array unpublishes from all locales. - `"bn"` - `"bs"` - `"pt-BR"` - `"bg"` - `"ca"` - `"hr"` - `"cs"` - `"da"` - `"nl"` - `"en"` - `"et"` - `"fi"` - `"fr"` - `"de"` - `"el"` - `"hi"` - `"hu"` - `"id"` - `"it"` - `"ja"` - `"ko"` - `"lv"` - `"lt"` - `"ms"` - `"mn"` - `"nb"` - `"pl"` - `"pt"` - `"ro"` - `"ru"` - `"sr"` - `"zh-CN"` - `"sk"` - `"sl"` - `"es"` - `"sw"` - `"sv"` - `"th"` - `"zh-TW"` - `"tr"` - `"uk"` - `"vi"` - `featurebaseVersion?: "2026-01-01.nova" | "2025-12-12.clover"` Header param: API version for this request. Defaults to your organization's configured API version if not specified. - `"2026-01-01.nova"` - `"2025-12-12.clover"` ### Returns - `PublishUnpublishSuccess` - `success: true` Indicates the operation was successful - `true` - `state?: "published" | "scheduled" | "unpublished"` The state of the changelog after the operation - `"published"` - `"scheduled"` - `"unpublished"` ### Example ```typescript import Featurebase from 'featurebase-node'; const client = new Featurebase({ apiKey: process.env['FEATUREBASE_API_KEY'], // This is the default and can be omitted }); const publishUnpublishSuccess = await client.changelogs.unpublish('507f1f77bcf86cd799439011'); console.log(publishUnpublishSuccess.success); ``` #### Response ```json { "success": true, "state": "published" } ``` ## Domain Types ### Changelog - `Changelog` - `id: string` Unique identifier - `allowedSegmentIds: Array` Segment IDs that are allowed to view this changelog - `availableLocales: Array` Array of locale codes where the changelog has content - `categories: Array` Categories the changelog belongs to - `id: string` Category unique identifier - `name: string` Category name - `roles?: Array` Roles allowed to view this category - `commentCount: number` Number of comments - `content: string` Content in HTML format - `createdAt: string` ISO 8601 timestamp when created - `date: string` Publication date as ISO 8601 timestamp - `emailSentToSubscribers: boolean` Whether email notification was sent to subscribers - `featuredImage: string | null` Featured image URL - `isDraftDiffersFromLive: boolean` Whether the draft content differs from the published live content - `isPublished: boolean` Whether the changelog is published (has a live version) in this locale - `locale: "bn" | "bs" | "pt-BR" | 39 more` Locale of the changelog - `"bn"` - `"bs"` - `"pt-BR"` - `"bg"` - `"ca"` - `"hr"` - `"cs"` - `"da"` - `"nl"` - `"en"` - `"et"` - `"fi"` - `"fr"` - `"de"` - `"el"` - `"hi"` - `"hu"` - `"id"` - `"it"` - `"ja"` - `"ko"` - `"lv"` - `"lt"` - `"ms"` - `"mn"` - `"nb"` - `"pl"` - `"pt"` - `"ro"` - `"ru"` - `"sr"` - `"zh-CN"` - `"sk"` - `"sl"` - `"es"` - `"sw"` - `"sv"` - `"th"` - `"zh-TW"` - `"tr"` - `"uk"` - `"vi"` - `markdownContent: string | null` Content in markdown format - `notifications: Record` Notification settings for each locale - `scheduledDate: string | null` Scheduled publication date as ISO 8601 timestamp - `emailSent?: boolean` Whether the email notification has been sent - `hideFromBoardAndWidgets?: boolean` Whether the changelog is hidden from the board and widgets - `sendEmailNotification?: boolean` Whether email notification should be sent for this locale - `object: "changelog"` Object type identifier - `"changelog"` - `organization: string` Organization identifier - `publishedLocales: Array` Array of locale codes where the changelog is published - `slug: string` URL-friendly slug - `slugs: Record` URL-friendly slugs for each locale - `state: "live" | "draft"` State of the changelog - `"live"` - `"draft"` - `title: string` Changelog title - `updatedAt: string` ISO 8601 timestamp when updated - `url: string` Public URL to view the changelog ### Publish Unpublish Success - `PublishUnpublishSuccess` - `success: true` Indicates the operation was successful - `true` - `state?: "published" | "scheduled" | "unpublished"` The state of the changelog after the operation - `"published"` - `"scheduled"` - `"unpublished"` ### Changelog Delete Response - `ChangelogDeleteResponse` - `id: string` Unique identifier of the deleted changelog - `deleted: true` Indicates the resource was deleted - `true` - `object: "changelog"` Object type identifier - `"changelog"` # Subscribers ## Add changelog subscribers `client.changelogs.subscribers.add(SubscriberAddParamsparams, RequestOptionsoptions?): SubscriberAddResponse` **post** `/v2/changelogs/subscribers` Adds email addresses as changelog subscribers in bulk. Subscribers will receive email notifications when new changelogs are published (if email notifications are enabled during publishing). ### Request Body - `emails` - Array of email addresses to add (required, 1-1000 emails) - `locale` - Locale for the subscribers (optional, defaults to organization default) ### Email Validation - Invalid email addresses are automatically filtered out - Emails are normalized (trimmed, lowercased) - Duplicate emails are deduplicated ### Rate Limiting This endpoint is rate limited to prevent abuse. If you need to import more subscribers, please contact support. ### Response Returns a confirmation with the count of processed emails: ```json { "object": "changelog_subscribers_import", "count": 150 } ``` ### Errors - `400` - Invalid request (empty emails array, too many emails) - `429` - Rate limit exceeded ### Parameters - `params: SubscriberAddParams` - `emails: Array` Body param: Array of email addresses to add as changelog subscribers - `locale?: "bn" | "bs" | "pt-BR" | 39 more` Body param: The locale for the subscribers. Defaults to organization default locale. - `"bn"` - `"bs"` - `"pt-BR"` - `"bg"` - `"ca"` - `"hr"` - `"cs"` - `"da"` - `"nl"` - `"en"` - `"et"` - `"fi"` - `"fr"` - `"de"` - `"el"` - `"hi"` - `"hu"` - `"id"` - `"it"` - `"ja"` - `"ko"` - `"lv"` - `"lt"` - `"ms"` - `"mn"` - `"nb"` - `"pl"` - `"pt"` - `"ro"` - `"ru"` - `"sr"` - `"zh-CN"` - `"sk"` - `"sl"` - `"es"` - `"sw"` - `"sv"` - `"th"` - `"zh-TW"` - `"tr"` - `"uk"` - `"vi"` - `featurebaseVersion?: "2026-01-01.nova" | "2025-12-12.clover"` Header param: API version for this request. Defaults to your organization's configured API version if not specified. - `"2026-01-01.nova"` - `"2025-12-12.clover"` ### Returns - `SubscriberAddResponse` - `count: number` Number of email addresses processed - `object: "changelog_subscribers_import"` Object type identifier - `"changelog_subscribers_import"` ### Example ```typescript import Featurebase from 'featurebase-node'; const client = new Featurebase({ apiKey: process.env['FEATUREBASE_API_KEY'], // This is the default and can be omitted }); const response = await client.changelogs.subscribers.add({ emails: ['john@example.com', 'jane@example.com'], }); console.log(response.count); ``` #### Response ```json { "count": 150, "object": "changelog_subscribers_import" } ``` ## Remove changelog subscribers `client.changelogs.subscribers.remove(SubscriberRemoveParamsparams, RequestOptionsoptions?): SubscriberRemoveResponse` **delete** `/v2/changelogs/subscribers` Removes email addresses from changelog subscribers in bulk. Removed subscribers will no longer receive email notifications when new changelogs are published. ### Request Body - `emails` - Array of email addresses to remove (required, 1-1000 emails) ### Email Handling - Emails that don't exist as subscribers are silently ignored - Emails are normalized (trimmed, lowercased) before matching ### Response Returns a confirmation with the count of processed emails: ```json { "object": "changelog_subscribers_removal", "count": 150 } ``` ### Errors - `400` - Invalid request (empty emails array, too many emails) ### Parameters - `params: SubscriberRemoveParams` - `emails: Array` Body param: Array of email addresses to remove from changelog subscribers - `featurebaseVersion?: "2026-01-01.nova" | "2025-12-12.clover"` Header param: API version for this request. Defaults to your organization's configured API version if not specified. - `"2026-01-01.nova"` - `"2025-12-12.clover"` ### Returns - `SubscriberRemoveResponse` - `count: number` Number of email addresses processed - `object: "changelog_subscribers_removal"` Object type identifier - `"changelog_subscribers_removal"` ### Example ```typescript import Featurebase from 'featurebase-node'; const client = new Featurebase({ apiKey: process.env['FEATUREBASE_API_KEY'], // This is the default and can be omitted }); const subscriber = await client.changelogs.subscribers.remove({ emails: ['john@example.com', 'jane@example.com'], }); console.log(subscriber.count); ``` #### Response ```json { "count": 150, "object": "changelog_subscribers_removal" } ``` ## Domain Types ### Subscriber Add Response - `SubscriberAddResponse` - `count: number` Number of email addresses processed - `object: "changelog_subscribers_import"` Object type identifier - `"changelog_subscribers_import"` ### Subscriber Remove Response - `SubscriberRemoveResponse` - `count: number` Number of email addresses processed - `object: "changelog_subscribers_removal"` Object type identifier - `"changelog_subscribers_removal"`