Register a signed deployment
const url = 'https://example.com/v1/deployments';const options = { method: 'POST', headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'}, body: '{"imageRef":"example","artifactVersion":"example","indexHash":"example","signerKeyId":"example","signerPublicKey":"example","signature":"example","publishedAt":"2026-04-15T12:00:00Z"}'};
try { const response = await fetch(url, options); const data = await response.json(); console.log(data);} catch (error) { console.error(error);}curl --request POST \ --url https://example.com/v1/deployments \ --header 'Authorization: Bearer <token>' \ --header 'Content-Type: application/json' \ --data '{ "imageRef": "example", "artifactVersion": "example", "indexHash": "example", "signerKeyId": "example", "signerPublicKey": "example", "signature": "example", "publishedAt": "2026-04-15T12:00:00Z" }'Atomic transaction: check the signing key against the tenant’s trust list (the signingKeyRegistry binding), verify the Ed25519 signature over the canonical envelope, read the image’s /app/index.json and verify it hashes to the signed indexHash and names the signed artifactVersion (ImageRegistryBinding), validate every tool / guardrail / agent / flow it declares (the image’s index is what registers; the request carries none), upsert into the corresponding registries, then record the deployment. All-or-nothing rollback on any failure. Idempotency: same imageDigest re-submitted returns 200 with the existing record (no new version bump). Idempotency-Key also applies at the HTTP layer.
Authorizations
Section titled “Authorizations”Parameters
Section titled “Parameters”Header Parameters
Section titled “Header Parameters”Caller-supplied idempotency key. Retries with the same key return the original response byte-identical (per docs/API-ROUTE-CONVENTIONS.md §3.1).
Request Bodyrequired
Section titled “Request Bodyrequired”object
Full digest-pinned OCI reference: <host>/<repo>@sha256:<hex>.
Issuer-generated YYYYMMDD.N — covered by the signature.
Sha256 of the image’s /app/index.json, byte for byte — covered by the signature. The server reads the file from the image, checks it hashes to this, and registers what it declares.
PEM-encoded Ed25519 public key (-----BEGIN PUBLIC KEY-----\n…). Parsed to raw bytes for verification.
Base64 of the Ed25519 signature over canonicalise({ imageDigest, artifactVersion, indexHash, tenantId, publishedAt }) with sorted keys, no whitespace, UTF-8.
Issuer-supplied ISO-8601 timestamp — covered by the signature.
Examplegenerated
{ "imageRef": "example", "artifactVersion": "example", "indexHash": "example", "signerKeyId": "example", "signerPublicKey": "example", "signature": "example", "publishedAt": "2026-04-15T12:00:00Z"}Responses
Section titled “Responses”Digest replay — same imageDigest already recorded; returns existing record.
object
Full digest-pinned OCI reference: <host>/<repo>@sha256:<hex>.
Idempotency key. Extracted from imageRef after the @.
Issuer-supplied YYYYMMDD.N — matches what was signed.
Sha256 of the canonicalised /app/index.json inside the image.
Base64 of the raw Ed25519 public key bytes (32 bytes → 44 chars).
Base64 of the raw Ed25519 signature (64 bytes → 88 chars).
Issuer-supplied timestamp inside the signed envelope.
Server-side ledger timestamp — when the register call succeeded.
object
object
object
Absent for guardrails, which have no version.
object
Absent for guardrails, which have no version.
object
Absent for guardrails, which have no version.
object
Absent for guardrails, which have no version.
Examplegenerated
{ "deploymentId": "example", "tenantId": "2489E9AD-2EE2-8E00-8EC9-32D5F69181C0", "imageRef": "example", "imageDigest": "example", "artifactVersion": "example", "indexHash": "example", "signerKeyId": "example", "signerPublicKey": "example", "signature": "example", "publishedAt": "2026-04-15T12:00:00Z", "activatedAt": "2026-04-15T12:00:00Z", "primitives": { "tools": 1, "guardrails": 1, "agents": 1, "flows": 1 }, "contents": { "tools": [ { "id": "example", "version": "example" } ], "guardrails": [ { "id": "example", "version": "example" } ], "agents": [ { "id": "example", "version": "example" } ], "flows": [ { "id": "example", "version": "example" } ] }}Deployment registered.
object
Full digest-pinned OCI reference: <host>/<repo>@sha256:<hex>.
Idempotency key. Extracted from imageRef after the @.
Issuer-supplied YYYYMMDD.N — matches what was signed.
Sha256 of the canonicalised /app/index.json inside the image.
Base64 of the raw Ed25519 public key bytes (32 bytes → 44 chars).
Base64 of the raw Ed25519 signature (64 bytes → 88 chars).
Issuer-supplied timestamp inside the signed envelope.
Server-side ledger timestamp — when the register call succeeded.
object
object
object
Absent for guardrails, which have no version.
object
Absent for guardrails, which have no version.
object
Absent for guardrails, which have no version.
object
Absent for guardrails, which have no version.
Examplegenerated
{ "deploymentId": "example", "tenantId": "2489E9AD-2EE2-8E00-8EC9-32D5F69181C0", "imageRef": "example", "imageDigest": "example", "artifactVersion": "example", "indexHash": "example", "signerKeyId": "example", "signerPublicKey": "example", "signature": "example", "publishedAt": "2026-04-15T12:00:00Z", "activatedAt": "2026-04-15T12:00:00Z", "primitives": { "tools": 1, "guardrails": 1, "agents": 1, "flows": 1 }, "contents": { "tools": [ { "id": "example", "version": "example" } ], "guardrails": [ { "id": "example", "version": "example" } ], "agents": [ { "id": "example", "version": "example" } ], "flows": [ { "id": "example", "version": "example" } ] }}Signature invalid, image unverifiable, or deployment-validation-failed with per-primitive details[].
object
object
Stable machine-readable discriminant. Values match domain error codes (see docs/API-ROUTE-CONVENTIONS.md §4.3).
Optional, kind-specific.
object
Server-assigned request id; also echoed via X-Request-Id header.
Examplegenerated
{ "error": { "code": "example", "message": "example", "details": {}, "requestId": "example" }}Missing / malformed / expired / revoked bearer token.
object
object
Stable machine-readable discriminant. Values match domain error codes (see docs/API-ROUTE-CONVENTIONS.md §4.3).
Optional, kind-specific.
object
Server-assigned request id; also echoed via X-Request-Id header.
Examplegenerated
{ "error": { "code": "example", "message": "example", "details": {}, "requestId": "example" }}Signer key not on the tenant’s trust list.
object
object
Stable machine-readable discriminant. Values match domain error codes (see docs/API-ROUTE-CONVENTIONS.md §4.3).
Optional, kind-specific.
object
Server-assigned request id; also echoed via X-Request-Id header.
Examplegenerated
{ "error": { "code": "example", "message": "example", "details": {}, "requestId": "example" }}Idempotency-Key was reused with a different body, or resource-state conflict.
object
object
Stable machine-readable discriminant. Values match domain error codes (see docs/API-ROUTE-CONVENTIONS.md §4.3).
Optional, kind-specific.
object
Server-assigned request id; also echoed via X-Request-Id header.
Examplegenerated
{ "error": { "code": "example", "message": "example", "details": {}, "requestId": "example" }}Server error (unmapped domain code or framework crash).
object
object
Stable machine-readable discriminant. Values match domain error codes (see docs/API-ROUTE-CONVENTIONS.md §4.3).
Optional, kind-specific.
object
Server-assigned request id; also echoed via X-Request-Id header.
Examplegenerated
{ "error": { "code": "example", "message": "example", "details": {}, "requestId": "example" }}