Create changelogs programmatically and asynchronously import website branding using the ChangeCrab 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.
POST /api/changelogs
{
"name": "My Changelog",
"team": 1,
"subdomain": "mychangelog",
"accent": "#E33597",
"private": false,
"styling_url": "https://example.com"
}
name - Changelog name (required)team - Team ID (required)subdomain - Subdomain namedomain - Custom domainaccent - Accent color (hex)private - Privacy setting (boolean)styling_url - Public website URL whose branding should be imported asynchronously
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:
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.
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"
}'
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));
{
"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"
}
}
}
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.
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 workerprocessing - Fetching and analysing the websitesucceeded - Styling was applied to the changelogfailed - 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.