Resources

Changelog

.md

Publish and consume product changelog entries.

Changelog entries are product updates authored in the dashboard or through the API. Reads default to published entries; writes let you manage the full lifecycle (draft, publish, archive, delete). There are two ways to show them publicly: the hosted changelog page in your help center, or your own page fed by this API.

Hosted changelog page

If your help center has the changelog turned on (Settings > Portal, Changelog module; off by default), TickOS serves a public changelog for you. Only published entries appear, newest first. When the option is off, these URLs return 404. While the help center itself is unpublished, the pages show a "coming soon" screen instead of the entries.

URLDescription
https://{slug}.tickos.dev/changelogChangelog list (also on your custom help center domain). Loads 20 entries at a time with infinite scroll.
https://{slug}.tickos.dev/changelog/{entrySlug}A single published entry.
https://{slug}.tickos.dev/api/portal/{slug}/changelog?offset=0Public JSON feed. No API key. Returns { entries, hasMore } with 20 entries per page; pass offset to load the next page.

Entries in the public JSON feed have id, title, slug, excerpt, content_html, category, version, tags, cover_image_url and published_at.

Consuming the API on your own site

Consumption model (Stripe-style)
The API key is secret and lives only on your backend (server-to-server). Your site calls your own backend (same-origin, no CORS), which proxies to TickOS with the secret key.

The entry object

All endpoints that return entries use the same fields. content_json is accepted on create and update but is never returned.

FieldTypeDescription
idstringEntry ID.
titlestringEntry title.
slugstringURL slug, unique within the account.
excerptstring | nullShort summary.
content_htmlstring | nullRendered HTML content.
categorystringfeature, improvement, fix or announcement.
versionstring | nulle.g. v1.4.0.
tagsstring[]Labels.
cover_image_urlstring | nullCover image URL.
statusstringdraft, published or archived.
published_atstring | nullISO 8601 timestamp of the first publication. null if never published.

List entriesGET/v1/changelog

Permission: read. Returns entries for the account, newest published_at first. By default only published entries (public feed). status and category are not validated here: an unknown value returns an empty list instead of an error.

Query paramTypeDefaultDescription
statusstringpublishedpublished, draft, archived or all.
categorystring--feature, improvement, fix, announcement.
limitnumber20Max 100.
offsetnumber0Offset pagination.
terminal
Bash
01curl -H "Authorization: Bearer sk_your_api_key" \
02 "https://api.tickos.dev/v1/changelog?status=published&limit=20"
UTF-8 · LF · Bashtickos.dev
200 OK
JSON
01{
02 "data": [
03 {
04 "id": "...",
05 "title": "New block editor",
06 "slug": "new-block-editor",
07 "excerpt": "Redesigned editor with inline images.",
08 "content_html": "<h1>Editor</h1><p>...</p>",
09 "category": "feature",
10 "version": "v1.4.0",
11 "tags": [],
12 "cover_image_url": null,
13 "status": "published",
14 "published_at": "2026-10-01T12:00:00.000Z"
15 }
16 ],
17 "pagination": { "limit": 20, "offset": 0, "total": 1 }
18}
UTF-8 · LF · JSONtickos.dev

Get one entryGET/v1/changelog/{slug}

Permission: read. Returns { data: entry } for a single published entry by slug. Responds 404 if it does not exist or is not published (drafts and archived entries are not returned here).

Create an entryPOST/v1/changelog

Permission: write. All fields are optional. If status is published, published_at is stamped automatically. Returns 201 with { data: entry }.

FieldTypeRequiredDescription
titlestringNoEntry title. Default: "Untitled".
slugstringNoGenerated from title if omitted. See slug rules below.
excerptstringNoShort summary.
content_htmlstringNoRendered HTML content.
content_jsonobjectNoStructured editor content. Stored but not returned by the API.
categorystringNofeature, improvement, fix, announcement. Default: feature.
versionstringNoe.g. v1.4.0.
tagsstring[]NoLabels. Ignored if not an array.
cover_image_urlstringNoCover image URL.
statusstringNodraft, published, archived. Default: draft.
  • Slug rules on create: the slug you send (or the title) is normalized to lowercase letters, numbers and hyphens (accents removed, max 80 characters). If it is already taken in the account, a suffix is added (-2, -3...). Create never fails with 409 because of the slug; read the final slug from the response.
  • Invalid category or status returns 400 with the allowed values.
terminal
Bash
01curl -X POST https://api.tickos.dev/v1/changelog \
02 -H 'Authorization: Bearer sk_your_api_key' \
03 -H 'Content-Type: application/json' \
04 -d '{
05 "title": "New block editor",
06 "excerpt": "Redesigned editor with inline images.",
07 "content_html": "<h1>Editor</h1><p>...</p>",
08 "category": "feature",
09 "version": "v1.4.0",
10 "status": "published"
11 }'
UTF-8 · LF · Bashtickos.dev

Update or change statusPATCH/v1/changelog/{slug}

Permission: write. Updates any of the create fields or changes the status (draft/published/archived) of an entry located by slug in any status. Send only the fields you want to change. Returns { data: entry }.

  • Publishing stamps published_at only if the entry was never published. Re-publishing an archived or unpublished entry keeps its original published_at.
  • A new slug is stored exactly as sent (it is not normalized). Returns 409 if another entry in the account already uses it.
  • Invalid category or status returns 400. Unknown entry returns 404.
terminal
Bash
01# Publish
02curl -X PATCH https://api.tickos.dev/v1/changelog/new-block-editor \
03 -H 'Authorization: Bearer sk_your_api_key' \
04 -H 'Content-Type: application/json' \
05 -d '{ "status": "published" }'
06 
07# Archive (hide from the public feed)
08curl -X PATCH https://api.tickos.dev/v1/changelog/new-block-editor \
09 -H 'Authorization: Bearer sk_your_api_key' \
10 -H 'Content-Type: application/json' \
11 -d '{ "status": "archived" }'
UTF-8 · LF · Bashtickos.dev
Archive vs delete
PATCH with status "archived" removes the entry from the public feed while keeping the content (reversible). DELETE removes it permanently.

Delete an entryDELETE/v1/changelog/{slug}

Permission: write. Permanently deletes an entry (any status) by slug within the account. Returns 404 if it does not exist.

terminal
Bash
01curl -X DELETE https://api.tickos.dev/v1/changelog/new-block-editor \
02 -H 'Authorization: Bearer sk_your_api_key'
UTF-8 · LF · Bashtickos.dev
200 OK
JSON
01{
02 "deleted": true,
03 "slug": "new-block-editor"
04}
UTF-8 · LF · JSONtickos.dev
Read vs write keys
Use a read-only key for the proxy that feeds your public changelog, and reserve write keys for automations that create, publish or delete entries. No changelog endpoint needs an admin key.