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. Fields you don't request are left out of the response instead of coming back as null, so a missing key means you didn't ask for it and null means the value is null. id is always included, whether or not you name it.

Pass all to get every requestable field. An unknown field name returns 400 with the list of valid names and the closest match, so a typo is caught instead of being silently ignored.

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).

Expanded objects get their own 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 returns 400. See Expanding relations.

Scopes ​

releases:read

Errors ​

StatusCodeCause
400invalid_requestA ?fields= or ?expand= name failed validation.
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 always returns 404. A 403 means the release exists and you can't view it. The release's comments and links behave differently and return 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": null,
  "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."
}