API reference

/v1/site-publications

9 operations · 8 support API keys

← All groups · First call? Read the tutorial: auth, permissions, requests and responses, common failures

MethodPathSummaryAuth
GET/v1/site-publicationsList publications in the authenticated tenant scopeAPI keySession
POST/v1/site-publicationsPublish the authenticated tenant scopeSession
GET/v1/site-publications/security-activationsGet the authoritative security binding and latest activation candidateAPI keySession
POST/v1/site-publications/security-activationsStage a security policy candidate and start its canary rolloutAPI keySession
GET/v1/site-publications/security-activations/rebind-statusCount bound sites still behind their WAF/CC library and those the package does not entitleAPI keySession
GET/v1/site-publications/security-activations/{candidate_id}Get a security policy activation candidateAPI keySession
POST/v1/site-publications/security-activations/{candidate_id}/reconcileReconcile canary, expansion, recovery, and promotionAPI keySession
POST/v1/site-publications/security-activations/{candidate_id}/rollbackClone an old policy into a new monotonic version and stage itAPI keySession
GET/v1/site-publications/{publication_id}Get one publication in the authenticated tenant scopeAPI keySession

Contract file:api/control-site-publications.openapi.yaml

Operation details

GET /v1/site-publications

List publications in the authenticated tenant scope

operationId
listTenantSitePublications
Auth
  • API key: header Authorization: CdncaKey <key_id>.<secret>. Effective permissions are the key scopes intersected with the owner’s current permissions.
  • Session: the Bearer session of a signed-in control plane user, used by the customer in their own control plane; a plugin must never ask for it.
Required permissions

All of:sites.read

Description (from the contract)

Requires a tenant-scoped principal with sites.read. scope_id is not accepted. Signatures, hashes, target snapshot metadata, and platform scope identifiers are omitted from tenant responses.

Parameters

listTenantSitePublications Parameters
NameInTypeRequiredDescription
limitqueryintegerNo—
cursorquerystringNoVersioned base64url HMAC-SHA256 envelope returned by the immediately preceding page. It is bound to audience, resolved tenant scope, resource kind, and the rollout ID for deployment pages. It cannot be reused across those boundaries or modified.

Responses

listTenantSitePublications Responses
StatusDescription
200Stable tenant publication page with target metadata redacted.

Fields:items: array<TenantPublication> current_source_revision: integer(int64) next_cursor?: string pending_modules?: array<PendingModule> automatic_failure?: AutomaticPublicationFailure

400Invalid UUID, RFC3339 value, enum, cursor, header, query, or JSON body.
401Authentication is missing or invalid.
403Wrong audience, missing permission, or tenant scope override.
503Storage, signing, cancellation, response validation, or another internal dependency is unavailable.

What to do on failure

  • 400 Fix the parameters or body per the field list; do not retry unchanged.
  • 401 Check the credential format and whether it expired or was rotated.
  • 403 Check the key scopes, the owner’s current permissions and the tenant scope; never switch to a more privileged account.
  • 503 A dependency is unavailable: retry later with the original Idempotency-Key.

↑ Back to list

POST /v1/site-publications

Publish the authenticated tenant scope

operationId
publishTenantSiteConfiguration
Auth
  • Session: the Bearer session of a signed-in control plane user, used by the customer in their own control plane; a plugin must never ask for it.
Required permissions

All of:sites.manage

Description (from the contract)

Requires a tenant session with sites.manage. configuration_scope_id must exactly equal the authenticated scope; authorization and scope binding complete before any publication mutation.

Parameters

publishTenantSiteConfiguration Parameters
NameInTypeRequiredDescription
Idempotency-KeyheaderstringYesStable for the frozen business payload. Request, correlation, trace, and task identifiers may change on an identical retry.
X-Request-IDheaderstring(uuid)Yes—
TraceparentheaderstringYes—
X-Correlation-IDheaderstring(uuid)NoDefaults to X-Request-ID when omitted.
X-Task-IDheaderstringNo—

Request body

application/json · Required:Yes

publishTenantSiteConfiguration Request body
NameTypeRequiredDescription
configuration_scope_idstring(uuid)Yes—
expected_source_revisioninteger(int64)Yes—
targetExplicitNodeTarget | LineGroupSnapshotTargetYes—
health_checkHealthCheckYes—
rolloutRolloutPolicyInputNoProgressive policy for a target frozen at publication time. Nodes are ordered by UUID bytes, then assigned to the canary and fixed-size cohorts. Commands outside the released cohort remain held. The failure threshold is an absolute failed-node count within the current cohort; reaching it pauses the rollout.
max_attemptsintegerYes—
deadlinestring(date-time)YesFuture RFC3339 deployment deadline.

Responses

publishTenantSiteConfiguration Responses
StatusDescription
201Created tenant publication, or the stored result of an identical retry.

Fields:id: string(uuid) source_revision: integer(int64) config_version_id: string(uuid) rollout_id: string(uuid) target: TenantPublicationTarget node_count: integer created_at: string(date-time)

400Invalid UUID, RFC3339 value, enum, cursor, header, query, or JSON body.
401Authentication is missing or invalid.
403Wrong audience, missing permission, or tenant scope override.
409Idempotency, target snapshot, rollout state, active deployment, or retry conflict.
412The source or rollout expected revision is stale.
422Entitlement or target/resource readiness prevents publication.
503Storage, signing, cancellation, response validation, or another internal dependency is unavailable.

What to do on failure

  • 400 Fix the parameters or body per the field list; do not retry unchanged.
  • 401 Check the credential format and whether it expired or was rotated.
  • 403 Check the key scopes, the owner’s current permissions and the tenant scope; never switch to a more privileged account.
  • 409 Read the current state first; a retry of the same operation keeps the original Idempotency-Key and body.
  • 412 The revision changed: read the latest ETag, decide again, then send the new If-Match.
  • 503 A dependency is unavailable: retry later with the original Idempotency-Key.

↑ Back to list

GET /v1/site-publications/security-activations

Get the authoritative security binding and latest activation candidate

operationId
getSecurityPolicyActivationStatus
Auth
  • API key: header Authorization: CdncaKey <key_id>.<secret>. Effective permissions are the key scopes intersected with the owner’s current permissions.
  • Session: the Bearer session of a signed-in control plane user, used by the customer in their own control plane; a plugin must never ask for it.
Required permissions

All of:security_policies.read

Description (from the contract)

Requires security_policies.read in the authenticated tenant scope, or a platform session holding security_policies.read or platform.admin, which reads the site's own tenant scope (the site edit page of the platform console). When no binding exists, binding, latest_candidate, and operation are null; clients use binding and active-policy CAS values 0/0 for first publish.

Parameters

getSecurityPolicyActivationStatus Parameters
NameInTypeRequiredDescription
site_idquerystring(uuid)Yes—
policy_kindquerystring: cc / acl / wafYes—

Responses

getSecurityPolicyActivationStatus Responses
StatusDescription
200Authoritative binding and latest candidate from one permission-checked transaction.

Fields:binding: SecurityActivationBinding | null latest_candidate: SecurityActivationCandidate | null operation: string: activation / rollback / null | null: activation / rollback / null failure_reasons?: array<object> latest_detach?: boolean rollback?: object

400Invalid UUID, RFC3339 value, enum, cursor, header, query, or JSON body.
401Authentication is missing or invalid.
403Wrong audience, missing permission, or tenant scope override.
503Storage, signing, cancellation, response validation, or another internal dependency is unavailable.

What to do on failure

  • 400 Fix the parameters or body per the field list; do not retry unchanged.
  • 401 Check the credential format and whether it expired or was rotated.
  • 403 Check the key scopes, the owner’s current permissions and the tenant scope; never switch to a more privileged account.
  • 503 A dependency is unavailable: retry later with the original Idempotency-Key.

↑ Back to list

POST /v1/site-publications/security-activations

Stage a security policy candidate and start its canary rollout

operationId
createSecurityPolicyActivation
Auth
  • API key: header Authorization: CdncaKey <key_id>.<secret>. Effective permissions are the key scopes intersected with the owner’s current permissions.
  • Session: the Bearer session of a signed-in control plane user, used by the customer in their own control plane; a plugin must never ask for it.
Required permissions

All of:security_policies.manage

Description (from the contract)

Requires security_policies.manage in the authenticated tenant scope. A platform session holding security_policies.manage or platform.admin starts it in the site's tenant scope without switching identity; the candidate and the audit event record the platform actor, the audit event's scope is the site's tenant scope. The candidate pins one source revision, config version, signed artifact digest, and target snapshot. The active policy and source revision do not advance until every pinned target reports healthy.

Parameters

createSecurityPolicyActivation Parameters
NameInTypeRequiredDescription
Idempotency-KeyheaderstringYesStable for the frozen business payload. Request, correlation, trace, and task identifiers may change on an identical retry.
X-Request-IDheaderstring(uuid)Yes—
TraceparentheaderstringYes—
X-Correlation-IDheaderstring(uuid)NoDefaults to X-Request-ID when omitted.
X-Task-IDheaderstringNo—

Request body

application/json · Required:Yes

createSecurityPolicyActivation Request body
NameTypeRequiredDescription
site_idstring(uuid)Yes—
policy_idstring(uuid)Yes—
policy_versioninteger(int64)Yes—
expected_binding_revisioninteger(int64)Yes—
expected_active_policy_versioninteger(int64)Yes—
target_node_idsarray<string(uuid)>NoOmitted or empty targets the active nodes of the site's own and its package's primary/backup line groups (no_target_nodes when there are none).
canary_sizeintegerNo0 or omitted is 1 when the targets are resolved from the site.
expires_atstring(date-time)YesAt most 15 minutes ahead (activation_expiry_too_late).
detachbooleanNoWithdraw the site's active library of this kind (policy_id/policy_version are the binding's active ones; the library may be deleted). policy_id differing from the binding's library rebinds the site to it; a deleted library cannot be bound (security_policy_deleted).

Responses

createSecurityPolicyActivation Responses
StatusDescription
201Candidate claimed and immutable canary rollout created.

Fields:candidate: SecurityActivationCandidate replayed?: boolean

400Invalid UUID, RFC3339 value, enum, cursor, header, query, or JSON body.
401Authentication is missing or invalid.
403Wrong audience, missing permission, or tenant scope override.
409Idempotency, target snapshot, rollout state, active deployment, or retry conflict.
422Entitlement or target/resource readiness prevents publication.
503Storage, signing, cancellation, response validation, or another internal dependency is unavailable.

What to do on failure

  • 400 Fix the parameters or body per the field list; do not retry unchanged.
  • 401 Check the credential format and whether it expired or was rotated.
  • 403 Check the key scopes, the owner’s current permissions and the tenant scope; never switch to a more privileged account.
  • 409 Read the current state first; a retry of the same operation keeps the original Idempotency-Key and body.
  • 503 A dependency is unavailable: retry later with the original Idempotency-Key.

↑ Back to list

GET /v1/site-publications/security-activations/rebind-status

Count bound sites still behind their WAF/CC library and those the package does not entitle

operationId
getSecurityPolicyRebindStatus
Auth
  • API key: header Authorization: CdncaKey <key_id>.<secret>. Effective permissions are the key scopes intersected with the owner’s current permissions.
  • Session: the Bearer session of a signed-in control plane user, used by the customer in their own control plane; a plugin must never ask for it.
Required permissions

All of:security_policies.read

Description (from the contract)

Requires security_policies.read in the authenticated tenant scope; a platform session is refused (403), it has no tenant scope to count. A library saved without a site context is republished automatically to every bound site whose binding is behind it (the site's package primary/backup line-group nodes, canary first). pending_sites counts the scope's sites still behind for policy_kind; package_denied_sites counts those whose package does not include the feature (they are retried and publish once it is enabled).

Parameters

getSecurityPolicyRebindStatus Parameters
NameInTypeRequiredDescription
policy_kindquerystring: waf / ccYes—

Responses

getSecurityPolicyRebindStatus Responses
StatusDescription
200Counts of the authenticated scope only.

Fields:pending_sites: integer package_denied_sites: integer

400Invalid UUID, RFC3339 value, enum, cursor, header, query, or JSON body.
401Authentication is missing or invalid.
403Wrong audience, missing permission, or tenant scope override.
503Storage, signing, cancellation, response validation, or another internal dependency is unavailable.

What to do on failure

  • 400 Fix the parameters or body per the field list; do not retry unchanged.
  • 401 Check the credential format and whether it expired or was rotated.
  • 403 Check the key scopes, the owner’s current permissions and the tenant scope; never switch to a more privileged account.
  • 503 A dependency is unavailable: retry later with the original Idempotency-Key.

↑ Back to list

GET /v1/site-publications/security-activations/{candidate_id}

Get a security policy activation candidate

operationId
getSecurityPolicyActivation
Auth
  • API key: header Authorization: CdncaKey <key_id>.<secret>. Effective permissions are the key scopes intersected with the owner’s current permissions.
  • Session: the Bearer session of a signed-in control plane user, used by the customer in their own control plane; a plugin must never ask for it.
Required permissions

All of:security_policies.read

Parameters

getSecurityPolicyActivation Parameters
NameInTypeRequiredDescription
candidate_idpathstring(uuid)Yes—

Responses

getSecurityPolicyActivation Responses
StatusDescription
200Current persisted candidate identity and status.

Fields:id: string(uuid) tenant_scope_id: string(uuid) site_id: string(uuid) binding_id: string(uuid) binding_revision: integer(int64) last_bundle_id: string(uuid) last_claimed_policy_version: integer(int64) expected_active_policy_version: integer(int64) candidate_source_revision: integer(int64) candidate_config_version_id: string(uuid) candidate_artifact_sha256: array<integer> target_snapshot_sha256: array<integer> required_capabilities: array<SecurityActivationCapability> candidate_status: string: claimed / canary / expanding / healthy / failed / cancelled / expired / promoted canary_node_ids: array<string(uuid)> expand_node_ids: array<string(uuid)> expires_at: string(date-time) created_at: string(date-time) updated_at: string(date-time) recovered_at?: string(date-time)

400Invalid UUID, RFC3339 value, enum, cursor, header, query, or JSON body.
401Authentication is missing or invalid.
403Wrong audience, missing permission, or tenant scope override.
404Resource is absent in the authorized tenant scope. Cross-tenant IDs use the same response.
503Storage, signing, cancellation, response validation, or another internal dependency is unavailable.

What to do on failure

  • 400 Fix the parameters or body per the field list; do not retry unchanged.
  • 401 Check the credential format and whether it expired or was rotated.
  • 403 Check the key scopes, the owner’s current permissions and the tenant scope; never switch to a more privileged account.
  • 404 The resource does not exist or belongs to another tenant.
  • 503 A dependency is unavailable: retry later with the original Idempotency-Key.

↑ Back to list

POST /v1/site-publications/security-activations/{candidate_id}/reconcile

Reconcile canary, expansion, recovery, and promotion

operationId
reconcileSecurityPolicyActivation
Auth
  • API key: header Authorization: CdncaKey <key_id>.<secret>. Effective permissions are the key scopes intersected with the owner’s current permissions.
  • Session: the Bearer session of a signed-in control plane user, used by the customer in their own control plane; a plugin must never ask for it.
Required permissions

All of:security_policies.manage

Description (from the contract)

Reuses the candidate config and artifact digest for every phase. Promotion uses the complete expected active, binding, publication, config, artifact, source revision, and target snapshot CAS identity.

Parameters

reconcileSecurityPolicyActivation Parameters
NameInTypeRequiredDescription
candidate_idpathstring(uuid)Yes—
Idempotency-KeyheaderstringYesStable for the frozen business payload. Request, correlation, trace, and task identifiers may change on an identical retry.
X-Request-IDheaderstring(uuid)Yes—
TraceparentheaderstringYes—
X-Correlation-IDheaderstring(uuid)NoDefaults to X-Request-ID when omitted.
X-Task-IDheaderstringNo—

Request body

application/json · Required:Yes

reconcileSecurityPolicyActivation Request body
NameTypeRequiredDescription
promotion_casSecurityActivationPromotionCASYes—

Responses

reconcileSecurityPolicyActivation Responses
StatusDescription
200Reconciled candidate state or identical stored replay.

Fields:candidate: SecurityActivationCandidate action: string: / wait / expand / promote / recover / fail / cancel / expire replayed?: boolean

400Invalid UUID, RFC3339 value, enum, cursor, header, query, or JSON body.
401Authentication is missing or invalid.
403Wrong audience, missing permission, or tenant scope override.
404Resource is absent in the authorized tenant scope. Cross-tenant IDs use the same response.
409Idempotency, target snapshot, rollout state, active deployment, or retry conflict.
503Storage, signing, cancellation, response validation, or another internal dependency is unavailable.

What to do on failure

  • 400 Fix the parameters or body per the field list; do not retry unchanged.
  • 401 Check the credential format and whether it expired or was rotated.
  • 403 Check the key scopes, the owner’s current permissions and the tenant scope; never switch to a more privileged account.
  • 404 The resource does not exist or belongs to another tenant.
  • 409 Read the current state first; a retry of the same operation keeps the original Idempotency-Key and body.
  • 503 A dependency is unavailable: retry later with the original Idempotency-Key.

↑ Back to list

POST /v1/site-publications/security-activations/{candidate_id}/rollback

Clone an old policy into a new monotonic version and stage it

operationId
rollbackSecurityPolicyActivation
Auth
  • API key: header Authorization: CdncaKey <key_id>.<secret>. Effective permissions are the key scopes intersected with the owner’s current permissions.
  • Session: the Bearer session of a signed-in control plane user, used by the customer in their own control plane; a plugin must never ask for it.
Required permissions

All of:security_policies.manage

Parameters

rollbackSecurityPolicyActivation Parameters
NameInTypeRequiredDescription
candidate_idpathstring(uuid)Yes—
Idempotency-KeyheaderstringYesStable for the frozen business payload. Request, correlation, trace, and task identifiers may change on an identical retry.
X-Request-IDheaderstring(uuid)Yes—
TraceparentheaderstringYes—
X-Correlation-IDheaderstring(uuid)NoDefaults to X-Request-ID when omitted.
X-Task-IDheaderstringNo—

Request body

application/json · Required:Yes

rollbackSecurityPolicyActivation Request body
NameTypeRequiredDescription
source_policy_versioninteger(int64)Yes—
expected_binding_revisioninteger(int64)Yes—
expected_active_policy_versioninteger(int64)Yes—
target_node_idsarray<string(uuid)>NoOmitted or empty targets the candidate site's line-group nodes, as SecurityActivationCreateRequest.
canary_sizeintegerNo—
expires_atstring(date-time)YesAt most 15 minutes ahead (activation_expiry_too_late).

Responses

rollbackSecurityPolicyActivation Responses
StatusDescription
201New monotonic rollback candidate claimed.

Fields:candidate: SecurityActivationCandidate replayed?: boolean

400Invalid UUID, RFC3339 value, enum, cursor, header, query, or JSON body.
401Authentication is missing or invalid.
403Wrong audience, missing permission, or tenant scope override.
404Resource is absent in the authorized tenant scope. Cross-tenant IDs use the same response.
409Idempotency, target snapshot, rollout state, active deployment, or retry conflict.
503Storage, signing, cancellation, response validation, or another internal dependency is unavailable.

What to do on failure

  • 400 Fix the parameters or body per the field list; do not retry unchanged.
  • 401 Check the credential format and whether it expired or was rotated.
  • 403 Check the key scopes, the owner’s current permissions and the tenant scope; never switch to a more privileged account.
  • 404 The resource does not exist or belongs to another tenant.
  • 409 Read the current state first; a retry of the same operation keeps the original Idempotency-Key and body.
  • 503 A dependency is unavailable: retry later with the original Idempotency-Key.

↑ Back to list

GET /v1/site-publications/{publication_id}

Get one publication in the authenticated tenant scope

operationId
getTenantSitePublication
Auth
  • API key: header Authorization: CdncaKey <key_id>.<secret>. Effective permissions are the key scopes intersected with the owner’s current permissions.
  • Session: the Bearer session of a signed-in control plane user, used by the customer in their own control plane; a plugin must never ask for it.
Required permissions

All of:sites.read

Parameters

getTenantSitePublication Parameters
NameInTypeRequiredDescription
publication_idpathstring(uuid)Yes—

Responses

getTenantSitePublication Responses
StatusDescription
200Tenant publication detail with internal metadata redacted.

Fields:id: string(uuid) source_revision: integer(int64) config_version_id: string(uuid) rollout_id: string(uuid) target: TenantPublicationTarget node_count: integer created_at: string(date-time)

400Invalid UUID, RFC3339 value, enum, cursor, header, query, or JSON body.
401Authentication is missing or invalid.
403Wrong audience, missing permission, or tenant scope override.
404Resource is absent in the authorized tenant scope. Cross-tenant IDs use the same response.
503Storage, signing, cancellation, response validation, or another internal dependency is unavailable.

What to do on failure

  • 400 Fix the parameters or body per the field list; do not retry unchanged.
  • 401 Check the credential format and whether it expired or was rotated.
  • 403 Check the key scopes, the owner’s current permissions and the tenant scope; never switch to a more privileged account.
  • 404 The resource does not exist or belongs to another tenant.
  • 503 A dependency is unavailable: retry later with the original Idempotency-Key.

↑ Back to list