Bot Changelog

Every release your bot ships can appear on its Discordium page, on a Changelog tab, without anyone opening the dashboard. Publishing needs a token with the changelog:write scope and a plan that includes the changelog: Verified, Enterprise, or the Changelog Pro add-on.

Publish a release

PUT/bots/:id/changelog/:version

:id is your bot's Discord ID and must be the bot the token was made for. :version is the release: letters, digits, . _ + -, starting with a letter or digit, at most 32 characters (2.4.0, v3.0.0-beta.1, 2026.10.11).

FieldTypeRequiredDescription
bodystringyesThe release notes, up to 8,000 characters of Markdown: headings, bold, italic, lists, links, inline and fenced code. HTML is shown as text.
titlestringnoA headline next to the version, up to 120 characters.
releasedAtISO 8601noWhen the release went out. Defaults to now on the first PUT; a later PUT keeps the stored date unless it sends one. Not in the future.

Answers 200. created says whether the version is new:

{
  "created": true,
  "entry": {
    "id": "42",
    "version": "2.4.0",
    "title": "Music queue rewrite",
    "body": "### Added\n- `/queue shuffle`",
    "publishedAt": "2026-10-11T12:00:00.000Z",
    "editedAt": null
  }
}

Sending a version again replaces it

A PUT is the whole entry. Sending a version that already has an entry replaces its title and body, so a retried deploy or an edited GitHub release never creates a duplicate. A title left out clears the stored title.

Delete a release

DELETE/bots/:id/changelog/:version

Same scope. Answers { "deleted": true }, or false when that version had no entry, so it is safe to call twice. Deleting works without a plan.

Example: every GitHub release, automatically

Add your token as a repository secret named DISCORDIUM_API_TOKEN, replace YOUR_BOT_ID, and commit this workflow. Publishing or editing a release on GitHub then updates your Discordium changelog.

# .github/workflows/discordium-changelog.yml
name: Discordium changelog
on:
  release:
    types: [published, edited]

jobs:
  publish:
    runs-on: ubuntu-latest
    steps:
      - name: Send the release to Discordium
        env:
          DISCORDIUM_API_TOKEN: ${{ secrets.DISCORDIUM_API_TOKEN }}
          VERSION: ${{ github.event.release.tag_name }}
          TITLE: ${{ github.event.release.name }}
          BODY: ${{ github.event.release.body }}
          RELEASED_AT: ${{ github.event.release.published_at }}
        run: |
          jq -n --arg title "$TITLE" --arg body "$BODY" --arg at "$RELEASED_AT" --arg v "$VERSION" '{
            title: $title[:120],
            body: ((if $body == "" then "Release " + $v else $body end)[:8000]),
            releasedAt: $at
          }' | curl --fail-with-body -X PUT \
            "https://api.discordium.org/api/v1/bots/YOUR_BOT_ID/changelog/$VERSION" \
            -H "Authorization: Bearer $DISCORDIUM_API_TOKEN" \
            -H "Content-Type: application/json" \
            --data @-

Example: from a deploy script

// In your deploy script, after the new version is live. Node 18+.
import { readFile } from "node:fs/promises";

const { version } = JSON.parse(await readFile("package.json", "utf8"));
const notes = await readFile(`release-notes/${version}.md`, "utf8");

const res = await fetch(`https://api.discordium.org/api/v1/bots/YOUR_BOT_ID/changelog/${version}`, {
    method: "PUT",
    headers: {
        Authorization: `Bearer ${process.env.DISCORDIUM_API_TOKEN}`,
        "Content-Type": "application/json",
    },
    body: JSON.stringify({ body: notes }),
});
if (!res.ok) console.error("Discordium changelog:", res.status, await res.text());

Limits

At most 30 writes an hour per bot, PUT and DELETE together. That is room for a backfill of a few dozen releases; a faster client gets 429 with a Retry-After.

Errors

StatusTypeRequiredDescription
400--Invalid version, empty body, a field over its limit, or a release date in the future.
401--Missing or invalid token, or the token lacks changelog:write.
403--The token belongs to another bot (FORBIDDEN), or the plan does not include the changelog (PREMIUM_REQUIRED).
404--No bot with this ID.
409--Discordium staff removed this entry; it cannot be replaced or deleted.
429--Over the hourly limit. The response says when to retry.

See also the API Reference.