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).
| Field | Type | Required | Description |
|---|---|---|---|
| body | string | yes | The release notes, up to 8,000 characters of Markdown: headings, bold, italic, lists, links, inline and fenced code. HTML is shown as text. |
| title | string | no | A headline next to the version, up to 120 characters. |
| releasedAt | ISO 8601 | no | When 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
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
| Status | Type | Required | Description |
|---|---|---|---|
| 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.