Create a changelog entry
Publish a new changelog entry with optional type, labels, and scheduling.
Creates a new changelog entry. Use this to publish release notes, feature announcements, or bug fix summaries from automation (e.g. a CI step that fires after a deploy).
Endpoint
POST https://api.productbridge.io/api/external/v1/changelog/create
Arguments
Your organization's public API key. See Authentication.
The entry's title. 1–512 characters.
The entry body. Typically markdown or rich-text. May be omitted for title-only release notes.
Single-valued classification. One of "fixed", "new", or "improved". Maps to a colored badge in the public changelog.
UUIDs of labels to attach. All ids must belong to your organization, or the call returns 400.
Workflow state. Defaults to "draft". Pass "published" to make the entry visible immediately, or "scheduled" together with scheduled_for to queue it.
Convenience shortcut. When true, sets status_code = "published" regardless of what's in the status_code field.
ISO 8601 timestamp at which the entry should publish. Pair with status_code = "scheduled".
Whether to send an email notification to subscribed users when the entry publishes. Defaults to true.
URL of the hero image displayed atop the entry on the public changelog.
Whether the entry should appear on the public-facing changelog page. Defaults to true.
Not supported in v1. Canny's post_ids field (linking changelog entries to specific feedback or roadmap posts) is not yet wired through. The post→changelog link table is roadmap-only today; broader linking ships in a future phase.
Returns
A JSON object with the new entry's id.
{ "id": "11ab3ef8-b8cd-cd15-01ba-changelog0001" }
Example request
curl -X POST https://api.productbridge.io/api/external/v1/changelog/create \
-H 'Content-Type: application/json' \
-d '{
"api_key": "pb_YOUR_PUBLIC_API_KEY",
"title": "v1.2 release: dark mode + faster search",
"details": "We shipped two of the most-requested features...",
"type": "new",
"published": true,
"notify": true,
"author_id": "cc3c3ef8-b8cd-cd15-01ba-adminuser001"
}'
const res = await fetch(
"https://api.productbridge.io/api/external/v1/changelog/create",
{
method: "POST",
headers: { "Content-Type": "application/json" },
body: JSON.stringify({
api_key: process.env.PRODUCTBRIDGE_API_KEY,
title: "v1.2 release: dark mode + faster search",
details: "We shipped two of the most-requested features...",
type: "new",
published: true,
notify: true,
author_id: "cc3c3ef8-b8cd-cd15-01ba-adminuser001",
}),
}
);
if (!res.ok) throw new Error(`HTTP ${res.status}`);
const { id } = await res.json();
import os, httpx
resp = httpx.post(
"https://api.productbridge.io/api/external/v1/changelog/create",
json={
"api_key": os.environ["PRODUCTBRIDGE_API_KEY"],
"title": "v1.2 release: dark mode + faster search",
"details": "We shipped two of the most-requested features...",
"type": "new",
"published": True,
"notify": True,
"author_id": "cc3c3ef8-b8cd-cd15-01ba-adminuser001",
},
)
resp.raise_for_status()
new_id = resp.json()["id"]
Example response
{
"id": "11ab3ef8-b8cd-cd15-01ba-changelog0001"
}
Errors
| Status | Body | Cause |
|---|---|---|
401 | {"detail":{"error":"invalid api_key"}} | Missing / unknown / inactive api_key. |
400 | {"detail":{"error":"one or more label_ids do not belong to this organization"}} | At least one label_ids entry references a label that doesn't exist for your organization. |
422 | Validation error envelope | Missing title, invalid type value, malformed scheduled_for. |
See Errors for the full envelope shape.
Last updated 2 weeks ago
Built with Documentation.AI