List releases
Releases group shipped work and carry a changelog. List the releases you can see. Results are scoped to the path and to what your token is allowed to read.
Only workspace releases come back, each with project_id set to null. List the releases that belong to a project with List project releases, one project at a time. Rows leave out description_html unless you name it in ?fields= or pass all.
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.
Query parameters
count:optionalbooleanSet to false to skip the COUNT(*) query behind total_count. The response then leaves out total_count.
is_latest:optionalbooleanFilter by is_latest.
is_prerelease:optionalbooleanFilter by is_prerelease.
lead_id:optionalstring (uuid)Filter by lead_id.
name:optionalstringFilter by name.
offset:optionalintegerNumber of rows to skip from the start of the result set.
order_by:optionalstringField to sort the list by. Prefix it with - for descending order, for example -created_at. Orders on computed fields sort by their logical order and use the default offset pagination.
paginate:optionalstringSet to cursor to switch to the keyset cursor envelope, which skips the COUNT query and is better for paging deep into a list. Leave it out to get the default offset envelope with total_count.
One of cursor.
per_page:optionalintegerPage size (max 200).
release_date:optionalstring (date)Filter by release_date.
search:optionalstringA search term.
status:optionalstringunreleased- Unreleasedreleased- Releasedcancelled- Cancelled
One of cancelled, released, unreleased.
status__in:optionalarray of stringMultiple values may be separated by commas.
unreleased- Unreleasedreleased- Releasedcancelled- Cancelled
tag_id:optionalstring (uuid)Filter by tag_id.
target_date:optionalstring (date)Filter by target_date.
Response shaping
fields:optionalstringComma-separated list of fields to return. Fields you don't request are left out of each row instead of coming back as null. id is always included. Pass all to get every requestable field.
An unknown field name returns 400 with the list of valid names, so a typo is caught instead of being silently ignored. See Sparse fields.
Requestable here: created_at, created_by_id, description_html, description_id, external_id, external_source, id, is_latest, is_prerelease, label_ids, lead_id, name, project_id, release_date, status, tag_id, target_date, updated_at, updated_by_id.
expand:optionalstringComma-separated relations to embed: lead, tag.
Expanded objects get their own key: ?expand=state keeps state_id and adds a state object next to it. ?fields= and ?expand= work independently. Naming a relation in ?fields= returns 400, and field filtering never removes an expanded object. See Expanding relations.
Scopes
releases:read
Errors
| Status | Code | Cause |
|---|---|---|
401 | unauthorized | Missing or invalid credentials. |
402 | payment_required | The feature this endpoint belongs to isn't enabled on your plan or is switched off. |
403 | forbidden | Your role or token scope doesn't allow this. |
404 | not_found | No such resource, or it's outside your tenant. |
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/releases/" \
-H "X-Api-Key: $PLANE_API_KEY"import requests
response = requests.get(
"https://api.plane.so/api/v2/workspaces/my-team/releases/",
headers={"X-Api-Key": "your-api-key"},
)
print(response.json())const response = await fetch("https://api.plane.so/api/v2/workspaces/my-team/releases/", {
method: "GET",
headers: {
"X-Api-Key": "your-api-key",
},
});
const data = await response.json();{
"data": [
{
"id": "b7e42a19-3c5d-4f80-9a26-8d1c0f4e7b53",
"name": "Example name",
"project_id": null,
"description_id": "f960d3c2-8524-4a41-b8eb-055ce4be2a7f",
"status": "unreleased",
"target_date": "2026-01-20",
"release_date": "2026-01-20",
"lead_id": "f960d3c2-8524-4a41-b8eb-055ce4be2a7f",
"tag_id": "f960d3c2-8524-4a41-b8eb-055ce4be2a7f",
"is_latest": false,
"is_prerelease": false,
"external_id": null,
"external_source": null,
"label_ids": ["16c61a3a-512a-48ac-b0be-b6b46fe6f430"],
"created_at": "2026-01-14T09:22:41.478363Z",
"updated_at": "2026-01-14T09:22:41.478363Z",
"created_by_id": "16c61a3a-512a-48ac-b0be-b6b46fe6f430",
"updated_by_id": null
}
],
"next": null,
"previous": null,
"total_count": 1,
"pagination": {
"style": "offset"
}
}
