Skip to content

Get a project release ​

GET/api/v2/workspaces/{slug}/projects/{project_id}/releases/{pk}/

Retrieve one project release by id. Unlike list rows, the response includes description_html.

The release must belong to the project in the path. A workspace release id, or the id of a release in another project, returns 404.

Path Parameters ​

slug:requiredstring

The workspace slug. It appears in your Plane URLs. In https://app.plane.so/my-team/projects/, the slug is my-team.

project_id:requiredstring

The project the release belongs to. Accepts the project UUID or its bare identifier, for example ENG.

pk:requiredstring (uuid)

The id of the release to retrieve.

Response shaping ​

fields:optionalstring

Comma-separated list of fields to return. Unrequested keys are omitted from the response, not returned as null, so absent means "not requested" and null means "actually null". id always comes back whether or not you name it.

Pass all for every requestable field. An unknown name is a 400 that lists the valid set and suggests the closest match, so a typo can't silently cost you the saving.

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.

See Sparse fields.

expand:optionalstring

Comma-separated relations to embed alongside the ids: lead (the lead user) and tag (the release tag).

Expansion is separate-key. ?expand=lead keeps lead_id and adds a lead object next to it, so an id is never replaced by an object. An unknown value is a 400. See Expanding relations.

Scopes ​

releases:read

Errors ​

StatusCodeCause
401unauthorizedMissing or invalid credentials.
402payment_requiredProject releases aren't enabled on your plan.
403forbiddenThe release exists, but your role in the project can't view it, or your token scope doesn't allow this.
404not_foundNo release with this id in this project, or no such workspace or project.
406not_acceptableThe Accept header asks for a representation the API can't produce.
429rate_limitedThrottled. Honor the Retry-After header before retrying.

404 comes before 403

The API resolves the id against the project first, so an unknown id is always a 404. A 403 means the release exists and you can't view it. The release's comments and links behave differently and answer 404 in that case.

Get a project release
bash
curl -X GET \
  "https://api.plane.so/api/v2/workspaces/my-team/projects/4af68566-94a4-4eb3-94aa-50dc9427067b/releases/3e8a1f52-7c4b-4d9e-a6f1-0b2c5d8e9f14/?expand=tag" \
  -H "X-Api-Key: $PLANE_API_KEY"
Response200
json
{
  "id": "3e8a1f52-7c4b-4d9e-a6f1-0b2c5d8e9f14",
  "name": "Mobile 4.2.0",
  "project_id": "4af68566-94a4-4eb3-94aa-50dc9427067b",
  "description_id": "5d2b7e91-4a3c-4f68-9e0d-1c7a8b2f6e35",
  "description_html": "<p>Offline mode and the new onboarding flow.</p>",
  "status": "unreleased",
  "target_date": "2026-02-27",
  "release_date": null,
  "lead_id": "16c61a3a-512a-48ac-b0be-b6b46fe6f430",
  "tag_id": "a41c9e07-2f5d-4b83-8c6e-9d1f0a3b7c52",
  "is_latest": false,
  "is_prerelease": false,
  "external_id": null,
  "external_source": null,
  "label_ids": ["7f3a2c19-8e4d-4b61-a5c7-2d9e0f1b8a46"],
  "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": "16c61a3a-512a-48ac-b0be-b6b46fe6f430",
  "tag": {
    "id": "a41c9e07-2f5d-4b83-8c6e-9d1f0a3b7c52",
    "version": "4.2.0",
    "git_tag": "v4.2.0",
    "commit_hash": null
  }
}
Response404
json
{
  "type": "not_found",
  "code": "not_found",
  "detail": "The requested resource was not found."
}