Get a project release changelog
Read the changelog of a project release. Each release has exactly one changelog, a rich-text document for release notes that is separate from the release description.
A release created through the API starts without a changelog. The first read creates an empty one, with description_html set to <p></p> and description_json set to {}, and returns it. Every later read returns the same record.
This read runs no role check in the project, so it works even if you can't view the release.
Path parameters
slug:requiredstringThe workspace slug. It appears in your Plane URLs. In https://app.plane.so/my-team/projects/, the slug is my-team.
project_id:requiredstringThe project the release belongs to. Accepts the project UUID or its bare identifier, for example ENG.
pk:requiredstring (uuid)The id of the release whose changelog you want.
Scopes
releases:read
Errors
| Status | Code | Cause |
|---|---|---|
401 | unauthorized | Missing or invalid credentials. |
402 | payment_required | Project releases aren't enabled on your plan. |
403 | forbidden | Your token scope doesn't allow this. |
404 | not_found | No release with this id in this project, or no such workspace or project. |
406 | not_acceptable | The Accept header asks for a representation the API can't produce. |
429 | rate_limited | Throttled. Honor the Retry-After header before retrying. |
curl -X GET \
"https://api.plane.so/api/v2/workspaces/my-team/projects/4af68566-94a4-4eb3-94aa-50dc9427067b/releases/3e8a1f52-7c4b-4d9e-a6f1-0b2c5d8e9f14/changelog/" \
-H "X-Api-Key: $PLANE_API_KEY"import requests
response = requests.get(
"https://api.plane.so/api/v2/workspaces/my-team/projects/4af68566-94a4-4eb3-94aa-50dc9427067b/releases/3e8a1f52-7c4b-4d9e-a6f1-0b2c5d8e9f14/changelog/",
headers={"X-Api-Key": "your-api-key"},
)
print(response.json())const response = await fetch(
"https://api.plane.so/api/v2/workspaces/my-team/projects/4af68566-94a4-4eb3-94aa-50dc9427067b/releases/3e8a1f52-7c4b-4d9e-a6f1-0b2c5d8e9f14/changelog/",
{
headers: {
"X-Api-Key": "your-api-key",
},
},
);
const data = await response.json();{
"id": "8b5d3f20-9c6e-4a17-b2d8-4e0f1a7c6b95",
"release_id": "3e8a1f52-7c4b-4d9e-a6f1-0b2c5d8e9f14",
"changelog_id": "e1a7c4b9-2d5f-4e83-9a06-7b3c8d1f5e42",
"description_html": "<h2>Mobile 4.2.0</h2><ul><li>Offline mode for lists and boards</li><li>New onboarding flow</li></ul>",
"description_json": {
"type": "doc",
"content": [
{
"type": "heading",
"attrs": { "level": 2 },
"content": [{ "type": "text", "text": "Mobile 4.2.0" }]
},
{
"type": "bulletList",
"content": [
{
"type": "listItem",
"content": [
{
"type": "paragraph",
"content": [{ "type": "text", "text": "Offline mode for lists and boards" }]
}
]
},
{
"type": "listItem",
"content": [
{
"type": "paragraph",
"content": [{ "type": "text", "text": "New onboarding flow" }]
}
]
}
]
}
]
}
}{
"id": "8b5d3f20-9c6e-4a17-b2d8-4e0f1a7c6b95",
"release_id": "3e8a1f52-7c4b-4d9e-a6f1-0b2c5d8e9f14",
"changelog_id": "e1a7c4b9-2d5f-4e83-9a06-7b3c8d1f5e42",
"description_html": "<p></p>",
"description_json": {}
}
