Get a deployment by id
Reads one deployment record.
The lookup is scoped to the project in project_id: a deployment id
belonging to another project answers not found exactly as an unknown id
does, so the endpoint cannot be used to probe for deployments in projects
the caller cannot read.
AuthorizationBearer <token>Scope: deployment.read
deployment_id*stringThe unique identifier of the deployment.
^dep_[a-zA-Z0-9_-]+$project_id*stringThe unique identifier of the project
^[a-zA-Z0-9_-]+$The deployment was retrieved successfully.
application/json- response
An immutable record of a release made live on a set of targets. Deploying and rolling back each append one, so the history is the audit trail.
All primary origins serve the project's newest primary deployment; one
added after it serves nothing until the next deployment to primary. A
preview URL serves the newest deployment to it while its preview is live.
Every field is fixed at creation except status, which is read as of now.
id*deployment-idThe opaque, immutable resource id, assigned at creation.
^dep_[a-zA-Z0-9_-]+$project_id*project-idThe project this deployment belongs to.
^[a-zA-Z0-9_-]+$release_id*release-idThe release this deployment made live. Always the release id, also
when the request named the release by content_hash.
^rel_[a-zA-Z0-9_-]+$kind*DeploymentKindprimary for the project's primary origins, preview for preview URLs.
"primary""preview"targets*array<>The resolved origins, sorted. For primary, the project's primary
origins at creation. The live view lists only the targets still served.
1 <= itemsstatus*DeploymentStatusWhether the deployment serves its release now.
live— at least one of its targets serves it now.inactive— none does: a later deployment replaced it, or its previews expired or were removed.
"live""inactive"deployed_at*stringWhen the deployment was created.
date-timemetadata*Why the release went live and who made it happen.
release?The release named by release_id, present only when the request asked
for it with expand: ["release"] — the same representation
GET /releases/{release_id} serves. Absent means it was not requested.
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 deployment = await client.getDeploymentById( "dep_01KX4SB9C8E1F0N9WD3P2E4YM5", { project_id: "proj_01KWH1P4MYS7F0N9WD3P2E4YM5" },);Every primary origin the deployment made the release live on,
also after a later primary deployment replaced it, as
status: inactive says.
{ "id": "dep_01KX5N7C9D2E7F0N9WD3P2E4YM6", "project_id": "proj_01KWH1P4MYS7F0N9WD3P2E4YM5", "release_id": "rel_01KX3RG8A7F0N9WD3P2E4YM5C1", "kind": "primary", "targets": [ { "origin": "https://app.acme.com" }, { "origin": "https://www.acme.com" } ], "status": "inactive", "deployed_at": "2026-10-02T14:52:00Z", "metadata": { "reason": "deploy", "message": "add phone_number to human-user", "rollback_to": null, "deployed_by": "user_01KWH3B72K7M7F0N9WD3P2E4YM", "deployed_by_type": "human" }}Was this helpful?