Create Changelogs via API

Create changelogs programmatically and asynchronously import website branding using the ChangeCrab API.

All Articles

Create Changelogs via API

Create changelogs programmatically using the ChangeCrab API. You can also supply a website URL and have ChangeCrab asynchronously apply the same brand styling used by the dashboard importer.

Prerequisites

Endpoint

POST /api/changelogs

Request Body

{
  "name": "My Changelog",
  "team": 1,
  "subdomain": "mychangelog",
  "accent": "#E33597",
  "private": false,
  "styling_url": "https://example.com"
}

Required Fields

  • name - Changelog name (required)
  • team - Team ID (required)

Optional Fields

  • subdomain - Subdomain name
  • domain - Custom domain
  • accent - Accent color (hex)
  • private - Privacy setting (boolean)
  • styling_url - Public website URL whose branding should be imported asynchronously

Import Styling During Creation

When styling_url is present, the changelog is created immediately and the response includes a styling-import operation. ChangeCrab then fetches and analyses the website in the background. The import uses the same service as the dashboard and can update:

  • Hosted changelog, embed, sidebar, navigation, Subscribe controls, feedback, and roadmap CSS
  • Accent and email palette colors
  • Logo and favicon when suitable assets are available
  • Readable foreground colors using the same contrast safeguards as dashboard imports

The URL must use http:// or https:// and resolve to a public website. Private, local, and internal network targets are rejected. A URL without a scheme, such as example.com, is normalized to HTTPS.

Example: cURL

curl -X POST https://changecrab.com/api/changelogs \
  -H "X-API-Key: your-api-key" \
  -H "Content-Type: application/json" \
  -d '{
    "name": "My Changelog",
    "team": 1,
    "subdomain": "mychangelog",
    "styling_url": "https://example.com"
  }'

Example: JavaScript

fetch('https://changecrab.com/api/changelogs', {
  method: 'POST',
  headers: {
    'X-API-Key': 'your-api-key',
    'Content-Type': 'application/json'
  },
  body: JSON.stringify({
    name: 'My Changelog',
    team: 1,
    subdomain: 'mychangelog',
    styling_url: 'https://example.com'
  })
})
.then(response => response.json())
.then(data => console.log(data));

Response

{
  "success": true,
  "data": {
    "id": 123,
    "accessid": "abc123xyz",
    "name": "My Changelog",
    "subdomain": "mychangelog",
    "team": 1,
    "styling_import": {
      "id": "2dd50ff0-fd9f-4e18-aa51-39097c093179",
      "status": "queued",
      "changelog_id": "abc123xyz",
      "source_url": "https://example.com",
      "status_url": "https://changecrab.com/api/changelogs/abc123xyz/styling-imports/2dd50ff0-fd9f-4e18-aa51-39097c093179",
      "queued_at": "2026-08-24T10:00:00+00:00"
    }
  }
}

Import Styling for an Existing Changelog

Start the same asynchronous import later by sending the website URL to the changelog's styling-import endpoint:

curl -X POST https://changecrab.com/api/changelogs/abc123xyz/styling-imports \
  -H "X-API-Key: your-api-key" \
  -H "Content-Type: application/json" \
  -d '{"url":"https://example.com"}'

The endpoint returns 202 Accepted, a Retry-After: 2 header, and an operation object containing its ID and status_url.

Poll the Import Status

curl https://changecrab.com/api/changelogs/abc123xyz/styling-imports/2dd50ff0-fd9f-4e18-aa51-39097c093179 \
  -H "X-API-Key: your-api-key"

The operation status is one of:

  • queued - Waiting for a worker
  • processing - Fetching and analysing the website
  • succeeded - Styling was applied to the changelog
  • failed - The error field explains why the import could not be completed

Successful responses include a result object with the source, imported highlights, and applied_fields. Operation status is available for one hour and can only be polled by the same authenticated API user that started it.

Next Steps