Create, update, and delete changelog posts using the ChangeCrab API.
Create, update, and delete changelog posts (entries) using the ChangeCrab API. Automate your changelog updates and integrate with CI/CD pipelines.
POST /api/changelogs/{id}/posts
{
"summary": "New Feature Release",
"markdown": "# New Feature\n\nDescription here",
"public": 1,
"draft": 0,
"team": 1,
"categories": [1, 2]
}
Markdown images are converted to editable image blocks. The image URL must be publicly reachable:

For a lossless Editor.js round trip, send editor_data instead of markdown. Do not send both fields in the same request.
{
"summary": "New Feature Release",
"editor_data": {
"blocks": [
{
"type": "image",
"data": {
"file": { "url": "https://cdn.example.com/dashboard.png" },
"caption": "Dashboard screenshot"
}
}
]
},
"public": 1,
"team": 1
}
POST /api/changelogs/{id}/images
Send a multipart/form-data request with an image file (JPEG, PNG, GIF, or WebP, up to 5 MB). Use the returned file.url in Markdown or an Editor.js image block.
PUT /api/changelogs/{id}/posts/{postId}
{
"summary": "Updated Title",
"markdown": "# Updated Content",
"public": 1
}
PUT retains its existing full-update contract. To change metadata without replacing post content, use PATCH and send only the fields that should change:
PATCH /api/changelogs/{id}/posts/{postId}
{
"summary": "Updated Title"
}
Request ?include=editor_data when listing or updating posts to include parsed Editor.js data in the response. Without this opt-in, the legacy response shape and markdown field remain unchanged.
DELETE /api/changelogs/{id}/posts/{postId}
GET /api/changelogs/{id}/posts
// Create post
fetch('https://changecrab.com/api/changelogs/{id}/posts', {
method: 'POST',
headers: {
'X-API-Key': 'your-api-key',
'Content-Type': 'application/json'
},
body: JSON.stringify({
summary: 'New Feature',
markdown: '# Feature\n\nDescription',
public: 1,
team: 1
})
});