Docs

List releases

GET
/releases

Lists the project's releases, newest first.

Entries carry the digest, the metadata and revoked_at — the pinned set is omitted. Read one release with GET /releases/{release_id} to get its pointers.

content_hash looks a release up by its content, as the CLI does when a person types the digest a transcript printed. The project holds at most one release per digest, so the filtered list has one entry or none, and an unknown digest is an empty list rather than an error. Paths take the rel_ id only; the matched entry's id is what to use there.

Authorization

headerAuthorizationBearer <token>

Scope: release.read

Query Parameters

project_id*string

The unique identifier of the project

Match^[a-zA-Z0-9_-]+$
content_hash?ReleaseContentHash

Narrows the list to the release with this content digest, given in full with its sha256: prefix. A project holds at most one release per digest, so the result has one entry or none.

A digest no release of the project carries answers an empty list, not an error: the filter asks which release has this content, and "none" is a valid answer. Paths never take a digest; read the matched entry's id and use that.

Match^sha256:[0-9a-f]{64}$
Length71 <= length <= 71
limit?integer

Maximum number of items to return.

Range1 <= value <= 100
Default20
page_token?string

Token for fetching the next page of results. Obtain this value from next_page_token in the previous response. Omit to start from the beginning. Its format is opaque and may change between releases.

Response Body

The releases were retrieved successfully.

application/json
  1. response

The project's releases, newest first.

releases*array<>
next_page_token?|

Token to pass as page_token in the next request to fetch the following page. Absent when there are no more results.

Example Request
import { configureZitadel, getApi } from "@zitadel/api/config";// In the browser, through the SDK proxy: the session cookie authenticates the call.const client = getApi(configureZitadel({ projectId: "proj_01KWH1P4MYS7F0N9WD3P2E4YM5" }));const releases = await client.listReleases({ project_id: "proj_01KWH1P4MYS7F0N9WD3P2E4YM5" });
Example Response
{  "releases": [    {      "id": "rel_01KX3RG8A7F0N9WD3P2E4YM5C1",      "project_id": "proj_01KWH1P4MYS7F0N9WD3P2E4YM5",      "content_hash": "sha256:9f2c1a7b4e83d05f6c2b19ae7d430f821c6b5de90a4f73829f2c1a7b4e83d05f",      "metadata": {        "message": "add phone_number to human-user",        "git_sha": "4a5b6c7d8e9f0a1b2c3d4e5f60718293a4b5c6d7",        "git_dirty": false,        "created_at": "2026-07-14T09:11:00Z",        "created_by": "user_01KWH3B72K7M7F0N9WD3P2E4YM",        "created_by_type": "human"      },      "revoked_at": null    },    {      "id": "rel_01KX2ZJ4B8C7F0N9WD3P2E4YM5",      "project_id": "proj_01KWH1P4MYS7F0N9WD3P2E4YM5",      "content_hash": "sha256:0f1e2d3c4b5a69788796a5b4c3d2e1f0091827364554637281909a8b7c6d5e4f",      "metadata": {        "message": "initial import",        "git_sha": "0f1e2d3c4b5a69788796a5b4c3d2e1f009182736",        "git_dirty": false,        "created_at": "2026-07-13T08:00:00Z",        "created_by": "user_01KWH3B72K7M7F0N9WD3P2E4YM",        "created_by_type": "human"      },      "revoked_at": "2026-07-14T10:30:00Z"    }  ],  "next_page_token": "v1.dGhpcyBpcyBvcGFxdWU.SflKxwRJSMeKKF2QT4fw"}

Was this helpful?