Skip to content
Dashboard

Update a 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.

Batched translations (Orbit only)

In API version 2026-08-19.orbit, optional translations accepts multiple locale-keyed draft updates. Each entry accepts title, htmlContent or markdownContent (not both), and featuredImage. New translations require title and nonempty content; existing translations preserve omitted fields. Supplied top-level content must also be nonempty for nonempty batches. Every listed locale must be enabled for the organization’s changelogs, including existing translations and the primary-locale entry. Top-level localized fields target the organization default locale and override corresponding dictionary fields. HTML/Markdown are one content field: a top-level format replaces the entry’s content input. Categories, segments and date remain top-level. The complete batch and global changes are saved together only after validation and content processing succeed. The response is the current organization default draft with draft availableLocales, not a translations dictionary. If that draft is absent, return the first edited locale in alphabetical order; if all entries are no-ops, return the first listed draft in alphabetical order. The response locale identifies the selected draft. Publication remains separate. Omitted or empty dictionaries retain existing behavior. An empty existing-locale entry is a no-op; an empty new-locale entry fails completeness validation. Completed uploads are not rolled back on failure. Existing legacy update/publication overwrite races are unchanged. Changing the organization default does not require creating its draft when updating other explicitly listed locales. Top-level localized fields still target the current default, and require title and content if creating that draft. Disabled locales return 400 invalid_parameter, parameter locale: Locale "" is not enabled for this organization’s changelogs.

Errors

  • 400 - Invalid changelog ID format or invalid input
  • 404 - Changelog not found or doesn’t belong to your organization
Path ParametersExpand Collapse
id: string

Changelog unique identifier

Header ParametersExpand Collapse
"Featurebase-Version": optional "2026-08-19.orbit" or "2026-01-01.nova" or "2025-12-12.clover"
One of the following:
"2026-08-19.orbit"
"2026-01-01.nova"
"2025-12-12.clover"
Body ParametersJSONExpand Collapse
allowedSegmentIds: optional array of string

An array of segment IDs that are allowed to view the changelog

categories: optional array of string

An array of category names to which the changelog belongs

date: optional string

The date of the changelog

featuredImage: optional string

The URL of the featured image for the changelog. External URLs will be uploaded to our storage.

htmlContent: optional string

HTML content of the changelog. Provide either htmlContent or markdownContent. Supports Featurebase custom blocks (callouts, multi-code, accordions, columns, file/image/video, iframes) — see the Content Components guide. External image URLs and base64 data URIs are uploaded to our storage automatically.

markdownContent: optional string

Markdown content of the changelog (CommonMark + GFM). Provide either htmlContent or markdownContent. Markdown is converted to plain HTML — to use Featurebase custom blocks (callouts, multi-code, accordions, columns) send htmlContent instead. See the Content Components guide.

title: optional string

The title of the changelog

minLength1
maxLength512
translations: optional object { id, am, ar, 68 more }

Locale-keyed draft updates. Every listed locale must be enabled for the organization. New translations require title and nonempty htmlContent or markdownContent; existing translations preserve omitted fields. Do not combine content formats within an entry. For nonempty batches, supplied top-level content must also be nonempty. Top-level localized fields override the primary-locale entry (HTML/Markdown are one content field). An empty dictionary uses the existing flow; an empty existing-locale entry is a no-op. Nonempty batches are saved together and return the primary draft with draft availableLocales. On PATCH, if the current organization default draft is absent, return the first edited locale in alphabetical order; for an all-no-op batch, return the first listed draft in alphabetical order. The response locale identifies the selected draft. Publication is separate. Uploaded assets are not rolled back on failure.

id: optional object { featuredImage, htmlContent, markdownContent, title }
featuredImage: optional string
htmlContent: optional string
markdownContent: optional string
title: optional string
minLength1
maxLength512
am: optional object { featuredImage, htmlContent, markdownContent, title }
featuredImage: optional string
htmlContent: optional string
markdownContent: optional string
title: optional string
minLength1
maxLength512
ar: optional object { featuredImage, htmlContent, markdownContent, title }
featuredImage: optional string
htmlContent: optional string
markdownContent: optional string
title: optional string
minLength1
maxLength512
az: optional object { featuredImage, htmlContent, markdownContent, title }
featuredImage: optional string
htmlContent: optional string
markdownContent: optional string
title: optional string
minLength1
maxLength512
bg: optional object { featuredImage, htmlContent, markdownContent, title }
featuredImage: optional string
htmlContent: optional string
markdownContent: optional string
title: optional string
minLength1
maxLength512
bn: optional object { featuredImage, htmlContent, markdownContent, title }
featuredImage: optional string
htmlContent: optional string
markdownContent: optional string
title: optional string
minLength1
maxLength512
bs: optional object { featuredImage, htmlContent, markdownContent, title }
featuredImage: optional string
htmlContent: optional string
markdownContent: optional string
title: optional string
minLength1
maxLength512
ca: optional object { featuredImage, htmlContent, markdownContent, title }
featuredImage: optional string
htmlContent: optional string
markdownContent: optional string
title: optional string
minLength1
maxLength512
cs: optional object { featuredImage, htmlContent, markdownContent, title }
featuredImage: optional string
htmlContent: optional string
markdownContent: optional string
title: optional string
minLength1
maxLength512
da: optional object { featuredImage, htmlContent, markdownContent, title }
featuredImage: optional string
htmlContent: optional string
markdownContent: optional string
title: optional string
minLength1
maxLength512
de: optional object { featuredImage, htmlContent, markdownContent, title }
featuredImage: optional string
htmlContent: optional string
markdownContent: optional string
title: optional string
minLength1
maxLength512
el: optional object { featuredImage, htmlContent, markdownContent, title }
featuredImage: optional string
htmlContent: optional string
markdownContent: optional string
title: optional string
minLength1
maxLength512
en: optional object { featuredImage, htmlContent, markdownContent, title }
featuredImage: optional string
htmlContent: optional string
markdownContent: optional string
title: optional string
minLength1
maxLength512
es: optional object { featuredImage, htmlContent, markdownContent, title }
featuredImage: optional string
htmlContent: optional string
markdownContent: optional string
title: optional string
minLength1
maxLength512
et: optional object { featuredImage, htmlContent, markdownContent, title }
featuredImage: optional string
htmlContent: optional string
markdownContent: optional string
title: optional string
minLength1
maxLength512
fa: optional object { featuredImage, htmlContent, markdownContent, title }
featuredImage: optional string
htmlContent: optional string
markdownContent: optional string
title: optional string
minLength1
maxLength512
fi: optional object { featuredImage, htmlContent, markdownContent, title }
featuredImage: optional string
htmlContent: optional string
markdownContent: optional string
title: optional string
minLength1
maxLength512
fr: optional object { featuredImage, htmlContent, markdownContent, title }
featuredImage: optional string
htmlContent: optional string
markdownContent: optional string
title: optional string
minLength1
maxLength512
gu: optional object { featuredImage, htmlContent, markdownContent, title }
featuredImage: optional string
htmlContent: optional string
markdownContent: optional string
title: optional string
minLength1
maxLength512
ha: optional object { featuredImage, htmlContent, markdownContent, title }
featuredImage: optional string
htmlContent: optional string
markdownContent: optional string
title: optional string
minLength1
maxLength512
he: optional object { featuredImage, htmlContent, markdownContent, title }
featuredImage: optional string
htmlContent: optional string
markdownContent: optional string
title: optional string
minLength1
maxLength512
hi: optional object { featuredImage, htmlContent, markdownContent, title }
featuredImage: optional string
htmlContent: optional string
markdownContent: optional string
title: optional string
minLength1
maxLength512
hr: optional object { featuredImage, htmlContent, markdownContent, title }
featuredImage: optional string
htmlContent: optional string
markdownContent: optional string
title: optional string
minLength1
maxLength512
ht: optional object { featuredImage, htmlContent, markdownContent, title }
featuredImage: optional string
htmlContent: optional string
markdownContent: optional string
title: optional string
minLength1
maxLength512
hu: optional object { featuredImage, htmlContent, markdownContent, title }
featuredImage: optional string
htmlContent: optional string
markdownContent: optional string
title: optional string
minLength1
maxLength512
ig: optional object { featuredImage, htmlContent, markdownContent, title }
featuredImage: optional string
htmlContent: optional string
markdownContent: optional string
title: optional string
minLength1
maxLength512
it: optional object { featuredImage, htmlContent, markdownContent, title }
featuredImage: optional string
htmlContent: optional string
markdownContent: optional string
title: optional string
minLength1
maxLength512
ja: optional object { featuredImage, htmlContent, markdownContent, title }
featuredImage: optional string
htmlContent: optional string
markdownContent: optional string
title: optional string
minLength1
maxLength512
jv: optional object { featuredImage, htmlContent, markdownContent, title }
featuredImage: optional string
htmlContent: optional string
markdownContent: optional string
title: optional string
minLength1
maxLength512
kk: optional object { featuredImage, htmlContent, markdownContent, title }
featuredImage: optional string
htmlContent: optional string
markdownContent: optional string
title: optional string
minLength1
maxLength512
km: optional object { featuredImage, htmlContent, markdownContent, title }
featuredImage: optional string
htmlContent: optional string
markdownContent: optional string
title: optional string
minLength1
maxLength512
kn: optional object { featuredImage, htmlContent, markdownContent, title }
featuredImage: optional string
htmlContent: optional string
markdownContent: optional string
title: optional string
minLength1
maxLength512
ko: optional object { featuredImage, htmlContent, markdownContent, title }
featuredImage: optional string
htmlContent: optional string
markdownContent: optional string
title: optional string
minLength1
maxLength512
lo: optional object { featuredImage, htmlContent, markdownContent, title }
featuredImage: optional string
htmlContent: optional string
markdownContent: optional string
title: optional string
minLength1
maxLength512
lt: optional object { featuredImage, htmlContent, markdownContent, title }
featuredImage: optional string
htmlContent: optional string
markdownContent: optional string
title: optional string
minLength1
maxLength512
lv: optional object { featuredImage, htmlContent, markdownContent, title }
featuredImage: optional string
htmlContent: optional string
markdownContent: optional string
title: optional string
minLength1
maxLength512
ml: optional object { featuredImage, htmlContent, markdownContent, title }
featuredImage: optional string
htmlContent: optional string
markdownContent: optional string
title: optional string
minLength1
maxLength512
mn: optional object { featuredImage, htmlContent, markdownContent, title }
featuredImage: optional string
htmlContent: optional string
markdownContent: optional string
title: optional string
minLength1
maxLength512
mr: optional object { featuredImage, htmlContent, markdownContent, title }
featuredImage: optional string
htmlContent: optional string
markdownContent: optional string
title: optional string
minLength1
maxLength512
ms: optional object { featuredImage, htmlContent, markdownContent, title }
featuredImage: optional string
htmlContent: optional string
markdownContent: optional string
title: optional string
minLength1
maxLength512
my: optional object { featuredImage, htmlContent, markdownContent, title }
featuredImage: optional string
htmlContent: optional string
markdownContent: optional string
title: optional string
minLength1
maxLength512
nb: optional object { featuredImage, htmlContent, markdownContent, title }
featuredImage: optional string
htmlContent: optional string
markdownContent: optional string
title: optional string
minLength1
maxLength512
ne: optional object { featuredImage, htmlContent, markdownContent, title }
featuredImage: optional string
htmlContent: optional string
markdownContent: optional string
title: optional string
minLength1
maxLength512
nl: optional object { featuredImage, htmlContent, markdownContent, title }
featuredImage: optional string
htmlContent: optional string
markdownContent: optional string
title: optional string
minLength1
maxLength512
pa: optional object { featuredImage, htmlContent, markdownContent, title }
featuredImage: optional string
htmlContent: optional string
markdownContent: optional string
title: optional string
minLength1
maxLength512
pl: optional object { featuredImage, htmlContent, markdownContent, title }
featuredImage: optional string
htmlContent: optional string
markdownContent: optional string
title: optional string
minLength1
maxLength512
ps: optional object { featuredImage, htmlContent, markdownContent, title }
featuredImage: optional string
htmlContent: optional string
markdownContent: optional string
title: optional string
minLength1
maxLength512
pt: optional object { featuredImage, htmlContent, markdownContent, title }
featuredImage: optional string
htmlContent: optional string
markdownContent: optional string
title: optional string
minLength1
maxLength512
"pt-BR": optional object { featuredImage, htmlContent, markdownContent, title }
featuredImage: optional string
htmlContent: optional string
markdownContent: optional string
title: optional string
minLength1
maxLength512
ro: optional object { featuredImage, htmlContent, markdownContent, title }
featuredImage: optional string
htmlContent: optional string
markdownContent: optional string
title: optional string
minLength1
maxLength512
ru: optional object { featuredImage, htmlContent, markdownContent, title }
featuredImage: optional string
htmlContent: optional string
markdownContent: optional string
title: optional string
minLength1
maxLength512
sd: optional object { featuredImage, htmlContent, markdownContent, title }
featuredImage: optional string
htmlContent: optional string
markdownContent: optional string
title: optional string
minLength1
maxLength512
si: optional object { featuredImage, htmlContent, markdownContent, title }
featuredImage: optional string
htmlContent: optional string
markdownContent: optional string
title: optional string
minLength1
maxLength512
sk: optional object { featuredImage, htmlContent, markdownContent, title }
featuredImage: optional string
htmlContent: optional string
markdownContent: optional string
title: optional string
minLength1
maxLength512
sl: optional object { featuredImage, htmlContent, markdownContent, title }
featuredImage: optional string
htmlContent: optional string
markdownContent: optional string
title: optional string
minLength1
maxLength512
so: optional object { featuredImage, htmlContent, markdownContent, title }
featuredImage: optional string
htmlContent: optional string
markdownContent: optional string
title: optional string
minLength1
maxLength512
sr: optional object { featuredImage, htmlContent, markdownContent, title }
featuredImage: optional string
htmlContent: optional string
markdownContent: optional string
title: optional string
minLength1
maxLength512
sv: optional object { featuredImage, htmlContent, markdownContent, title }
featuredImage: optional string
htmlContent: optional string
markdownContent: optional string
title: optional string
minLength1
maxLength512
sw: optional object { featuredImage, htmlContent, markdownContent, title }
featuredImage: optional string
htmlContent: optional string
markdownContent: optional string
title: optional string
minLength1
maxLength512
ta: optional object { featuredImage, htmlContent, markdownContent, title }
featuredImage: optional string
htmlContent: optional string
markdownContent: optional string
title: optional string
minLength1
maxLength512
te: optional object { featuredImage, htmlContent, markdownContent, title }
featuredImage: optional string
htmlContent: optional string
markdownContent: optional string
title: optional string
minLength1
maxLength512
th: optional object { featuredImage, htmlContent, markdownContent, title }
featuredImage: optional string
htmlContent: optional string
markdownContent: optional string
title: optional string
minLength1
maxLength512
tl: optional object { featuredImage, htmlContent, markdownContent, title }
featuredImage: optional string
htmlContent: optional string
markdownContent: optional string
title: optional string
minLength1
maxLength512
tr: optional object { featuredImage, htmlContent, markdownContent, title }
featuredImage: optional string
htmlContent: optional string
markdownContent: optional string
title: optional string
minLength1
maxLength512
uk: optional object { featuredImage, htmlContent, markdownContent, title }
featuredImage: optional string
htmlContent: optional string
markdownContent: optional string
title: optional string
minLength1
maxLength512
ur: optional object { featuredImage, htmlContent, markdownContent, title }
featuredImage: optional string
htmlContent: optional string
markdownContent: optional string
title: optional string
minLength1
maxLength512
uz: optional object { featuredImage, htmlContent, markdownContent, title }
featuredImage: optional string
htmlContent: optional string
markdownContent: optional string
title: optional string
minLength1
maxLength512
vi: optional object { featuredImage, htmlContent, markdownContent, title }
featuredImage: optional string
htmlContent: optional string
markdownContent: optional string
title: optional string
minLength1
maxLength512
yo: optional object { featuredImage, htmlContent, markdownContent, title }
featuredImage: optional string
htmlContent: optional string
markdownContent: optional string
title: optional string
minLength1
maxLength512
"zh-CN": optional object { featuredImage, htmlContent, markdownContent, title }
featuredImage: optional string
htmlContent: optional string
markdownContent: optional string
title: optional string
minLength1
maxLength512
"zh-TW": optional object { featuredImage, htmlContent, markdownContent, title }
featuredImage: optional string
htmlContent: optional string
markdownContent: optional string
title: optional string
minLength1
maxLength512
ReturnsExpand Collapse
Changelog object { id, allowedSegmentIds, availableLocales, 21 more }
id: string

Unique identifier

allowedSegmentIds: array of string

Segment IDs that are allowed to view this changelog

availableLocales: array of string

Array of locale codes where the changelog has content

categories: array of object { id, name, roles }

Categories the changelog belongs to

id: string

Category unique identifier

name: string

Category name

roles: optional array of string

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

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: "ar" or "am" or "fa" or 68 more

Locale of the changelog

One of the following:
"ar"
"am"
"fa"
"ht"
"lo"
"my"
"pa"
"ps"
"so"
"tl"
"ur"
"he"
"ta"
"te"
"mr"
"gu"
"kn"
"ml"
"ha"
"jv"
"yo"
"ig"
"uz"
"ne"
"sd"
"az"
"si"
"km"
"kk"
"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

Content in markdown format

notifications: map[object { scheduledDate, emailSent, hideFromBoardAndWidgets, sendEmailNotification } ]

Notification settings for each locale

scheduledDate: string

Scheduled publication date as ISO 8601 timestamp

emailSent: optional boolean

Whether the email notification has been sent

hideFromBoardAndWidgets: optional boolean

Whether the changelog is hidden from the board and widgets

sendEmailNotification: optional boolean

Whether email notification should be sent for this locale

object: "changelog"

Object type identifier

organization: string

Organization identifier

publishedLocales: array of string

Array of locale codes where the changelog is published

slug: string

URL-friendly slug

slugs: map[string]

URL-friendly slugs for each locale

state: "live" or "draft"

State of the changelog

One of the following:
"live"
"draft"
title: string

Changelog title

updatedAt: string

ISO 8601 timestamp when updated

url: string

Public URL to view the changelog

Update a changelog

curl https://do.featurebase.app/v2/changelogs/$ID \
    -X PATCH \
    -H 'Content-Type: application/json' \
    -H "Authorization: Bearer $FEATUREBASE_API_KEY" \
    -d '{
          "allowedSegmentIds": [
            "507f1f77bcf86cd799439011"
          ],
          "categories": [
            "New",
            "Fixed",
            "Improved"
          ],
          "date": "2024-01-15",
          "featuredImage": "https://example.com/image.png",
          "htmlContent": "<p>Updated features to explore.</p>",
          "markdownContent": "Updated features to explore.",
          "title": "Updated Features Release",
          "translations": {
            "de": {
              "htmlContent": "<p>Neue Funktionen.</p>",
              "title": "Neuigkeiten"
            },
            "et": {
              "markdownContent": "Uued funktsioonid.",
              "title": "Uuendused"
            }
          }
        }'
{
  "id": "6457e3ff70afca5d8c27dccc",
  "allowedSegmentIds": [
    "string"
  ],
  "availableLocales": [
    "en",
    "de",
    "fr"
  ],
  "categories": [
    {
      "id": "6438a1efda3640f8feb72121",
      "name": "New Features",
      "roles": [
        "string"
      ]
    }
  ],
  "commentCount": 2,
  "content": "<p>Your changelog content in HTML format.</p>",
  "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"
}
Returns Examples
{
  "id": "6457e3ff70afca5d8c27dccc",
  "allowedSegmentIds": [
    "string"
  ],
  "availableLocales": [
    "en",
    "de",
    "fr"
  ],
  "categories": [
    {
      "id": "6438a1efda3640f8feb72121",
      "name": "New Features",
      "roles": [
        "string"
      ]
    }
  ],
  "commentCount": 2,
  "content": "<p>Your changelog content in HTML format.</p>",
  "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"
}