MethodPathSummaryAuth
POST/v1/tenant-scopes/{scope_id}/l4-line-switchesCreate an idempotent line-group switchSession
GET/v1/tenant-scopes/{scope_id}/l4-line-switches/currentRead the latest durable switch for operator recoverySession
GET/v1/tenant-scopes/{scope_id}/l4-line-switches/{switch_id}Read durable switch stateSession
POST/v1/tenant-scopes/{scope_id}/l4-line-switches/{switch_id}/reconcileAdvance one idempotent state-machine step from durable factsSession
GET/v1/tenant-scopes/{scope_id}/sites/{site_id}/telemetry-capture-policy—Session
PUT/v1/tenant-scopes/{scope_id}/sites/{site_id}/telemetry-capture-policy—Session
GET/v1/tenant-scopes/{tenant_scope_id}/challenge-policiesList active challenge policies in one tenant scopeSession
POST/v1/tenant-scopes/{tenant_scope_id}/challenge-policiesCreate a challenge policy for a tenant-owned site and hostSession
GET/v1/tenant-scopes/{tenant_scope_id}/challenge-policies/{policy_id}Read one challenge policySession
PATCH/v1/tenant-scopes/{tenant_scope_id}/challenge-policies/{policy_id}Append a new challenge policy configuration revisionSession
DELETE/v1/tenant-scopes/{tenant_scope_id}/challenge-policies/{policy_id}Soft-delete a challenge policy by appending a tombstone revisionSession
POST/v1/tenant-scopes/{tenant_scope_id}/challenge-policies/{policy_id}/disableDisable a challenge policy with revision CASSession
POST/v1/tenant-scopes/{tenant_scope_id}/challenge-policies/{policy_id}/enableEnable a challenge policy with revision CASSession
POST/v1/tenant-scopes/{tenant_scope_id}/challenge-policies/{policy_id}/publicationsPublish one exact enabled challenge policy revision to Edge nodesSession
GET/v1/tenant-scopes/{tenant_scope_id}/challenge-policies/{policy_id}/publications/{rollout_id}Read the bounded rollout state for an exact policy artifactSession
POST/v1/tenant-scopes/{tenant_scope_id}/challenge-policies/{policy_id}/publications/{rollout_id}/promotePromote an exact healthy challenge rollout into Edge configurationSession
POST/v1/tenant-scopes/{tenant_scope_id}/error-page-publications发布租户作用域的错误页配置Session
GET/v1/tenant-scopes/{tenant_scope_id}/error-page-publications/{publication_id}读取一个不可变错误页发布结果Session
GET/v1/tenant-scopes/{tenant_scope_id}/http-policiesList non-deleted HTTP policies in one tenant scopeSession
POST/v1/tenant-scopes/{tenant_scope_id}/http-policiesCreate revision one for a tenant-owned siteSession
GET/v1/tenant-scopes/{tenant_scope_id}/http-policies/publication-previewRead a deterministic unsigned Edge v1 source snapshotSession
GET/v1/tenant-scopes/{tenant_scope_id}/http-policies/{policy_id}Read one HTTP policySession
PATCH/v1/tenant-scopes/{tenant_scope_id}/http-policies/{policy_id}Append a configuration revisionSession
DELETE/v1/tenant-scopes/{tenant_scope_id}/http-policies/{policy_id}Soft-delete a policy by appending a tombstone revisionSession
POST/v1/tenant-scopes/{tenant_scope_id}/http-policies/{policy_id}/disableDisable a policy with revision CASSession
POST/v1/tenant-scopes/{tenant_scope_id}/http-policies/{policy_id}/enableEnable a policy with revision CASSession
GET/v1/tenant-scopes/{tenant_scope_id}/origin-auth/credentialsList redacted credential heads in one tenantSession
POST/v1/tenant-scopes/{tenant_scope_id}/origin-auth/credentialsEncrypt and append credential revision 1Session
GET/v1/tenant-scopes/{tenant_scope_id}/origin-auth/credentials/{credential_id}Read one redacted credential headSession
DELETE/v1/tenant-scopes/{tenant_scope_id}/origin-auth/credentials/{credential_id}Append a credential tombstone revisionSession
POST/v1/tenant-scopes/{tenant_scope_id}/origin-auth/credentials/{credential_id}/disableAppend a disabled credential revisionSession
POST/v1/tenant-scopes/{tenant_scope_id}/origin-auth/credentials/{credential_id}/replaceEncrypt replacement material with the active envelope keySession
POST/v1/tenant-scopes/{tenant_scope_id}/origin-auth/credentials/{credential_id}/verifyInvoke the injected verifier and append a verified revisionSession
POST/v1/tenant-scopes/{tenant_scope_id}/origin-auth/edge-publications发布租户作用域的源站鉴权配置Session
GET/v1/tenant-scopes/{tenant_scope_id}/origin-auth/edge-publications/{publication_id}读取一个不可变源站鉴权发布结果Session
GET/v1/tenant-scopes/{tenant_scope_id}/origin-auth/publicationsRead the latest deterministic secret-free snapshotSession
POST/v1/tenant-scopes/{tenant_scope_id}/origin-auth/publicationsAppend the next tenant publication snapshotSession
GET/v1/tenant-scopes/{tenant_scope_id}/origin-auth/rulesList current rule revisionsSession
POST/v1/tenant-scopes/{tenant_scope_id}/origin-auth/rulesCreate a tenant, site, and source-bound ruleSession
GET/v1/tenant-scopes/{tenant_scope_id}/origin-auth/rules/{rule_id}Read one current rule revisionSession
PATCH/v1/tenant-scopes/{tenant_scope_id}/origin-auth/rules/{rule_id}Append a rule configuration revisionSession
DELETE/v1/tenant-scopes/{tenant_scope_id}/origin-auth/rules/{rule_id}Append a rule tombstone revisionSession
POST/v1/tenant-scopes/{tenant_scope_id}/origin-auth/rules/{rule_id}/disableDisable a rule by revision CASSession
POST/v1/tenant-scopes/{tenant_scope_id}/origin-auth/rules/{rule_id}/enableEnable a rule after verified credential gates passSession
POST/v1/tenant-scopes/{tenant_scope_id}/origin-auth/rules/{rule_id}/rotateSchedule current and previous credential cutoverSession
GET/v1/tenant-scopes/{tenant_scope_id}/plugin-installationsList tenant plugin installation authorization stateSession
GET/v1/tenant-scopes/{tenant_scope_id}/plugin-installations/{authorization_id}Read one tenant plugin installation authorizationSession
POST/v1/tenant-scopes/{tenant_scope_id}/plugin-installations/{authorization_id}/confirmConfirm declared and sensitive plugin scopes before installationSession
POST/v1/tenant-scopes/{tenant_scope_id}/plugin-installations/{authorization_id}/disableProtectively disable an installed plugin without consulting LicenseSession
POST/v1/tenant-scopes/{tenant_scope_id}/plugin-installations/{authorization_id}/uninstallRevoke local plugin identity and record protective uninstallSession
POST/v1/tenant-scopes/{tenant_scope_id}/plugin-installations/{authorization_id}/upgradeApprove a compatible plugin upgrade and any newly declared scopesSession
GET/v1/tenant-scopes/{tenant_scope_id}/plugin-webhook-subscriptionsList webhook subscriptionsSession
POST/v1/tenant-scopes/{tenant_scope_id}/plugin-webhook-subscriptionsCreate a webhook subscription and one-time secretSession
GET/v1/tenant-scopes/{tenant_scope_id}/plugin-webhook-subscriptions/{subscription_id}Get a webhook subscriptionSession
GET/v1/tenant-scopes/{tenant_scope_id}/plugin-webhook-subscriptions/{subscription_id}/deliveriesList subscription deliveriesSession
GET/v1/tenant-scopes/{tenant_scope_id}/plugin-webhook-subscriptions/{subscription_id}/deliveries/{delivery_id}Get a delivery statusSession
POST/v1/tenant-scopes/{tenant_scope_id}/plugin-webhook-subscriptions/{subscription_id}/deliveries/{delivery_id}/replaysReplay a delivered or dead-lettered deliverySession
POST/v1/tenant-scopes/{tenant_scope_id}/plugin-webhook-subscriptions/{subscription_id}/delivery-replaysReplay the terminal deliveries of a time rangeSession
POST/v1/tenant-scopes/{tenant_scope_id}/plugin-webhook-subscriptions/{subscription_id}/revokeRevoke a webhook subscription and fence new deliveriesSession
POST/v1/tenant-scopes/{tenant_scope_id}/plugin-webhook-subscriptions/{subscription_id}/secret-rotationsGenerate a pending secret rotationSession
POST/v1/tenant-scopes/{tenant_scope_id}/plugin-webhook-subscriptions/{subscription_id}/secret-rotations/{rotation_id}/activateActivate a pending secret rotationSession
POST/v1/tenant-scopes/{tenant_scope_id}/plugin-webhook-subscriptions/{subscription_id}/test-deliveriesQueue a signed CloudEvents test deliverySession
GET/v1/tenant-scopes/{tenant_scope_id}/theme—Session
PUT/v1/tenant-scopes/{tenant_scope_id}/theme—Session

Contract file:api/control-l4-line-switch.openapi.yaml api/control-site-capture.openapi.yaml api/control-challenge-policies.openapi.yaml api/control-error-page-publications.openapi.yaml api/control-http-policies.openapi.yaml api/control-origin-auth.openapi.yaml api/control-origin-auth-publications.openapi.yaml api/control-plugin-installations.openapi.yaml api/control-plugin-webhooks.openapi.yaml api/control-themes.openapi.yaml

Operation details

POST /v1/tenant-scopes/{scope_id}/l4-line-switches

Create an idempotent line-group switch

operationId
createL4LineSwitch
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

The contract has no separate permission annotation; see the description below and the 403 response.

Parameters

createL4LineSwitch Parameters
NameInTypeRequiredDescription
scope_idpathstring(uuid)Yes—
X-Request-IDheaderstring(uuid)Yes—
X-Correlation-IDheaderstring(uuid)No—
Idempotency-KeyheaderstringYes—
TraceparentheaderstringYes—

Request body

application/json · Required:Yes

createL4LineSwitch Request body
NameTypeRequiredDescription
expected_source_revisioninteger(int64)Yes—
fromSnapshotYes—
toSnapshotYes—
healthHealthPolicyYes—
drainDrainPolicyYes—
max_attemptsintegerYes—
deadlinestring(date-time)Yes—

Responses

createL4LineSwitch Responses
StatusDescription
201Switch created or replayed

Fields:id: string(uuid) configuration_scope_id: string(uuid) expected_source_revision: integer(int64) from: Snapshot to: Snapshot prepare_node_count: integer retiring_node_count: integer state: string: preparing / health_gate / draining_old / compensating_old / completed / rolled_back / needs_attention state_revision: integer(int64) prepare_publication: Publication compensation_publication: Publication drain_command_count: integer error_code?: string dns_gate?: DNSGate deadline: string(date-time) created_at: string(date-time) updated_at: string(date-time) replayed?: boolean

400Stable error code; clients map it through locale resources.
401Stable error code; clients map it through locale resources.
403Stable error code; clients map it through locale resources.
409Stable error code; clients map it through locale resources.
503Stable error code; clients map it through locale resources.

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/tenant-scopes/{scope_id}/l4-line-switches/current

Read the latest durable switch for operator recovery

operationId
getCurrentL4LineSwitch
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

The contract has no separate permission annotation; see the description below and the 403 response.

Parameters

getCurrentL4LineSwitch Parameters
NameInTypeRequiredDescription
scope_idpathstring(uuid)Yes—
X-Request-IDheaderstring(uuid)Yes—

Responses

getCurrentL4LineSwitch Responses
StatusDescription
200Latest durable switch state

Fields:id: string(uuid) configuration_scope_id: string(uuid) expected_source_revision: integer(int64) from: Snapshot to: Snapshot prepare_node_count: integer retiring_node_count: integer state: string: preparing / health_gate / draining_old / compensating_old / completed / rolled_back / needs_attention state_revision: integer(int64) prepare_publication: Publication compensation_publication: Publication drain_command_count: integer error_code?: string dns_gate?: DNSGate deadline: string(date-time) created_at: string(date-time) updated_at: string(date-time) replayed?: boolean

401Stable error code; clients map it through locale resources.
403Stable error code; clients map it through locale resources.
404Stable error code; clients map it through locale resources.
503Stable error code; clients map it through locale resources.

What to do on failure

  • 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

GET /v1/tenant-scopes/{scope_id}/l4-line-switches/{switch_id}

Read durable switch state

operationId
getL4LineSwitch
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

The contract has no separate permission annotation; see the description below and the 403 response.

Parameters

getL4LineSwitch Parameters
NameInTypeRequiredDescription
scope_idpathstring(uuid)Yes—
switch_idpathstring(uuid)Yes—
X-Request-IDheaderstring(uuid)Yes—

Responses

getL4LineSwitch Responses
StatusDescription
200Current state

Fields:id: string(uuid) configuration_scope_id: string(uuid) expected_source_revision: integer(int64) from: Snapshot to: Snapshot prepare_node_count: integer retiring_node_count: integer state: string: preparing / health_gate / draining_old / compensating_old / completed / rolled_back / needs_attention state_revision: integer(int64) prepare_publication: Publication compensation_publication: Publication drain_command_count: integer error_code?: string dns_gate?: DNSGate deadline: string(date-time) created_at: string(date-time) updated_at: string(date-time) replayed?: boolean

401Stable error code; clients map it through locale resources.
403Stable error code; clients map it through locale resources.
404Stable error code; clients map it through locale resources.
503Stable error code; clients map it through locale resources.

What to do on failure

  • 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/tenant-scopes/{scope_id}/l4-line-switches/{switch_id}/reconcile

Advance one idempotent state-machine step from durable facts

operationId
reconcileL4LineSwitch
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

The contract has no separate permission annotation; see the description below and the 403 response.

Description (from the contract)

The request has no body and cannot nominate a desired state. Production workers call the same service method.

Parameters

reconcileL4LineSwitch Parameters
NameInTypeRequiredDescription
scope_idpathstring(uuid)Yes—
switch_idpathstring(uuid)Yes—
X-Request-IDheaderstring(uuid)Yes—

Responses

reconcileL4LineSwitch Responses
StatusDescription
200Current state after reconciliation

Fields:id: string(uuid) configuration_scope_id: string(uuid) expected_source_revision: integer(int64) from: Snapshot to: Snapshot prepare_node_count: integer retiring_node_count: integer state: string: preparing / health_gate / draining_old / compensating_old / completed / rolled_back / needs_attention state_revision: integer(int64) prepare_publication: Publication compensation_publication: Publication drain_command_count: integer error_code?: string dns_gate?: DNSGate deadline: string(date-time) created_at: string(date-time) updated_at: string(date-time) replayed?: boolean

400Stable error code; clients map it through locale resources.
401Stable error code; clients map it through locale resources.
403Stable error code; clients map it through locale resources.
404Stable error code; clients map it through locale resources.
409Stable error code; clients map it through locale resources.
503Stable error code; clients map it through locale resources.

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/tenant-scopes/{scope_id}/sites/{site_id}/telemetry-capture-policy

operationId
getSiteCapturePolicy
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:site_capture.read

Description (from the contract)

A readable site that never saved a policy answers 200 with state=unconfigured, revision 0 and the default (capture off) document; create it with expected_revision 0. 404 means the site is missing, deleted or not visible to the caller.

Parameters

getSiteCapturePolicy Parameters
NameInTypeRequiredDescription
scope_idpathstring(uuid)Yes—
site_idpathstring(uuid)Yes—

Responses

getSiteCapturePolicy Responses
StatusDescription
200Current authoritative policy, or the explicit unconfigured default.
401Stable localized-by-client error response.
403Stable localized-by-client error response.
404Stable localized-by-client error response.
503Stable localized-by-client error response.

What to do on failure

  • 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

PUT /v1/tenant-scopes/{scope_id}/sites/{site_id}/telemetry-capture-policy

operationId
updateSiteCapturePolicy
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:site_capture.manage

Parameters

updateSiteCapturePolicy Parameters
NameInTypeRequiredDescription
scope_idpathstring(uuid)Yes—
site_idpathstring(uuid)Yes—
Idempotency-KeyheaderstringYes—
X-Request-IDheaderstringYes—
X-Trace-IDheaderstringYes—

Request body

application/json · Required:Yes

updateSiteCapturePolicy Request body
NameTypeRequiredDescription
expected_revisionintegerYes—
documentPolicyDocumentYes—

Responses

updateSiteCapturePolicy Responses
StatusDescription
200Policy CAS committed or idempotently replayed.

Fields:policy: Policy replayed: boolean

400Stable localized-by-client error response.
401Stable localized-by-client error response.
403Stable localized-by-client error response.
404Stable localized-by-client error response.
409Stable localized-by-client error response.
412Stable localized-by-client error response.
503Stable localized-by-client error response.

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.
  • 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/tenant-scopes/{tenant_scope_id}/challenge-policies

List active challenge policies in one tenant scope

operationId
listChallengePolicies
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:challenge_policies.read

Description (from the contract)

Requires challenge_policies.read. Results use stable keyset ordering; the versioned HMAC-SHA256 cursor is opaque and must be replayed unchanged with the same authenticated actor, target scope, filters, limit, and sort. Invalid cursors return 400 before storage is read. Pages may contain fewer than the requested limit to stay within the default 256 KiB response byte budget; next_cursor resumes after the last emitted item. Soft-deleted policies are excluded. A tenant principal targeting another tenant receives the same 404 shape as an unknown scope.

Parameters

listChallengePolicies Parameters
NameInTypeRequiredDescription
tenant_scope_idpathstring(uuid)YesExplicit target tenant access-scope UUID.
X-Request-IDheaderstringYesStable request correlation ID; 1 to 128 safe ASCII characters.
X-Trace-IDheaderstringYesStable trace correlation ID; 1 to 128 safe ASCII characters.
limitqueryintegerNo—
cursorquerystringNoOpaque URL-safe versioned HMAC-SHA256 envelope returned by the preceding page. It binds key ID, API audience, authenticated actor user/scope/kind, target scope, site/host/enabled filters, limit, fixed sort, and keyset position. Replay it byte-for-byte; wrong key, audience, version, key ID, scope, filter, limit, sort, semantic re-encoding, or an overlong value returns 400 before storage is read.
site_idquerystring(uuid)No—
hostquerystringNo—
enabledquerybooleanNo—

Responses

listChallengePolicies Responses
StatusDescription
200Stable byte-budgeted page of non-deleted challenge policies. A non-empty next_cursor resumes after the final item emitted in this response.

Fields:items: array<ChallengePolicy> next_cursor?: string

400Stable error envelope without SQL, internal errors, key references, or provider details.
401Stable error envelope without SQL, internal errors, key references, or provider details.
403Stable error envelope without SQL, internal errors, key references, or provider details.
404Stable error envelope without SQL, internal errors, key references, or provider details.
405Stable error envelope without SQL, internal errors, key references, or provider details.
422Stable error envelope without SQL, internal errors, key references, or provider details.
503Stable error envelope without SQL, internal errors, key references, or provider details.

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/tenant-scopes/{tenant_scope_id}/challenge-policies

Create a challenge policy for a tenant-owned site and host

operationId
createChallengePolicy
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:challenge_policies.manage

Description (from the contract)

Requires challenge_policies.manage and a currently valid, non-grace sites.manage entitlement. The site must belong to the target tenant and the host must equal the site domain or be covered by its wildcard. The request creates immutable revision 1 and a transactional audit event. A completed same-actor, same-scope, same-operation, same-key/same-payload retry returns the frozen stored result before mutable site or entitlement state is rechecked; a new request still performs all current checks. A key reused with another payload returns 409.

Parameters

createChallengePolicy Parameters
NameInTypeRequiredDescription
tenant_scope_idpathstring(uuid)YesExplicit target tenant access-scope UUID.
X-Request-IDheaderstringYesStable request correlation ID; 1 to 128 safe ASCII characters.
X-Trace-IDheaderstringYesStable trace correlation ID; 1 to 128 safe ASCII characters.
Idempotency-KeyheaderstringYesOperation-scoped durable key. Retry an unknown result only with the same key and unchanged business payload.

Request body

application/json · Required:Yes

createChallengePolicy Request body
NameTypeRequiredDescription
site_idstring(uuid)Yes—
hoststringYesLowercase ASCII hostname without scheme, port, path, wildcard, or trailing dot.
enabledbooleanYes—
configChallengeConfigYeschallenge_ttl_seconds must be greater than min_delay_seconds plus clock_skew_seconds. external is a fail-closed reference-only mode; provider connectivity is outside this contract.

Responses

createChallengePolicy Responses
StatusDescription
201Created policy or the stored result of an identical retry.

Fields:id: string(uuid) tenant_scope_id: string(uuid) site_id: string(uuid) host: string priority: integer mode: string: delay / click / slider / captcha / external min_delay_seconds: integer challenge_ttl_seconds: integer pass_ttl_seconds: integer clock_skew_seconds: integer attempts_per_nonce: integer failure_window_seconds: integer max_failures_per_window: integer ip_binding: string: none / exact bind_user_agent: boolean bypass_routes: array<BypassRoute> key_reference_configured: boolean external_provider_configured: boolean enabled: boolean deleted: boolean revision: integer(int64) created_at: string(date-time) updated_at: string(date-time)

400Stable error envelope without SQL, internal errors, key references, or provider details.
401Stable error envelope without SQL, internal errors, key references, or provider details.
403Stable error envelope without SQL, internal errors, key references, or provider details.
404Stable error envelope without SQL, internal errors, key references, or provider details.
405Stable error envelope without SQL, internal errors, key references, or provider details.
409Stable error envelope without SQL, internal errors, key references, or provider details.
422Stable error envelope without SQL, internal errors, key references, or provider details.
503Stable error envelope without SQL, internal errors, key references, or provider details.

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/tenant-scopes/{tenant_scope_id}/challenge-policies/{policy_id}

Read one challenge policy

operationId
getChallengePolicy
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:challenge_policies.read

Description (from the contract)

Requires challenge_policies.read. Soft-deleted, unknown, and out-of-tenant policy IDs all return the same 404 response.

Parameters

getChallengePolicy Parameters
NameInTypeRequiredDescription
tenant_scope_idpathstring(uuid)YesExplicit target tenant access-scope UUID.
policy_idpathstring(uuid)Yes—
X-Request-IDheaderstringYesStable request correlation ID; 1 to 128 safe ASCII characters.
X-Trace-IDheaderstringYesStable trace correlation ID; 1 to 128 safe ASCII characters.

Responses

getChallengePolicy Responses
StatusDescription
200Challenge policy.

Fields:id: string(uuid) tenant_scope_id: string(uuid) site_id: string(uuid) host: string priority: integer mode: string: delay / click / slider / captcha / external min_delay_seconds: integer challenge_ttl_seconds: integer pass_ttl_seconds: integer clock_skew_seconds: integer attempts_per_nonce: integer failure_window_seconds: integer max_failures_per_window: integer ip_binding: string: none / exact bind_user_agent: boolean bypass_routes: array<BypassRoute> key_reference_configured: boolean external_provider_configured: boolean enabled: boolean deleted: boolean revision: integer(int64) created_at: string(date-time) updated_at: string(date-time)

400Stable error envelope without SQL, internal errors, key references, or provider details.
401Stable error envelope without SQL, internal errors, key references, or provider details.
403Stable error envelope without SQL, internal errors, key references, or provider details.
404Stable error envelope without SQL, internal errors, key references, or provider details.
405Stable error envelope without SQL, internal errors, key references, or provider details.
503Stable error envelope without SQL, internal errors, key references, or provider details.

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

PATCH /v1/tenant-scopes/{tenant_scope_id}/challenge-policies/{policy_id}

Append a new challenge policy configuration revision

operationId
updateChallengePolicy
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:challenge_policies.manage

Description (from the contract)

Requires challenge_policies.manage and a currently valid, non-grace sites.manage entitlement. If-Match is compared with the current revision under a row lock. Site and host identity cannot be changed.

Parameters

updateChallengePolicy Parameters
NameInTypeRequiredDescription
tenant_scope_idpathstring(uuid)YesExplicit target tenant access-scope UUID.
policy_idpathstring(uuid)Yes—
X-Request-IDheaderstringYesStable request correlation ID; 1 to 128 safe ASCII characters.
X-Trace-IDheaderstringYesStable trace correlation ID; 1 to 128 safe ASCII characters.
Idempotency-KeyheaderstringYesOperation-scoped durable key. Retry an unknown result only with the same key and unchanged business payload.
If-MatchheaderstringYesCurrent positive revision encoded as a quoted decimal ETag, for example "3".

Request body

application/json · Required:Yes

updateChallengePolicy Request body
NameTypeRequiredDescription
configChallengeConfigYeschallenge_ttl_seconds must be greater than min_delay_seconds plus clock_skew_seconds. external is a fail-closed reference-only mode; provider connectivity is outside this contract.

Responses

updateChallengePolicy Responses
StatusDescription
200Updated policy or the stored result of an identical retry.

Fields:id: string(uuid) tenant_scope_id: string(uuid) site_id: string(uuid) host: string priority: integer mode: string: delay / click / slider / captcha / external min_delay_seconds: integer challenge_ttl_seconds: integer pass_ttl_seconds: integer clock_skew_seconds: integer attempts_per_nonce: integer failure_window_seconds: integer max_failures_per_window: integer ip_binding: string: none / exact bind_user_agent: boolean bypass_routes: array<BypassRoute> key_reference_configured: boolean external_provider_configured: boolean enabled: boolean deleted: boolean revision: integer(int64) created_at: string(date-time) updated_at: string(date-time)

400Stable error envelope without SQL, internal errors, key references, or provider details.
401Stable error envelope without SQL, internal errors, key references, or provider details.
403Stable error envelope without SQL, internal errors, key references, or provider details.
404Stable error envelope without SQL, internal errors, key references, or provider details.
405Stable error envelope without SQL, internal errors, key references, or provider details.
409Stable error envelope without SQL, internal errors, key references, or provider details.
412Stable error envelope without SQL, internal errors, key references, or provider details.
422Stable error envelope without SQL, internal errors, key references, or provider details.
503Stable error envelope without SQL, internal errors, key references, or provider details.

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

DELETE /v1/tenant-scopes/{tenant_scope_id}/challenge-policies/{policy_id}

Soft-delete a challenge policy by appending a tombstone revision

operationId
deleteChallengePolicy
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:challenge_policies.manage

Description (from the contract)

Requires challenge_policies.manage. The request body must be empty. Historical revisions remain immutable so future publication references cannot be destroyed. Delete is intentionally allowed during entitlement grace because it reduces active configuration.

Parameters

deleteChallengePolicy Parameters
NameInTypeRequiredDescription
tenant_scope_idpathstring(uuid)YesExplicit target tenant access-scope UUID.
policy_idpathstring(uuid)Yes—
X-Request-IDheaderstringYesStable request correlation ID; 1 to 128 safe ASCII characters.
X-Trace-IDheaderstringYesStable trace correlation ID; 1 to 128 safe ASCII characters.
Idempotency-KeyheaderstringYesOperation-scoped durable key. Retry an unknown result only with the same key and unchanged business payload.
If-MatchheaderstringYesCurrent positive revision encoded as a quoted decimal ETag, for example "3".

Responses

deleteChallengePolicy Responses
StatusDescription
200Updated policy or the stored result of an identical retry.

Fields:id: string(uuid) tenant_scope_id: string(uuid) site_id: string(uuid) host: string priority: integer mode: string: delay / click / slider / captcha / external min_delay_seconds: integer challenge_ttl_seconds: integer pass_ttl_seconds: integer clock_skew_seconds: integer attempts_per_nonce: integer failure_window_seconds: integer max_failures_per_window: integer ip_binding: string: none / exact bind_user_agent: boolean bypass_routes: array<BypassRoute> key_reference_configured: boolean external_provider_configured: boolean enabled: boolean deleted: boolean revision: integer(int64) created_at: string(date-time) updated_at: string(date-time)

400Stable error envelope without SQL, internal errors, key references, or provider details.
401Stable error envelope without SQL, internal errors, key references, or provider details.
403Stable error envelope without SQL, internal errors, key references, or provider details.
404Stable error envelope without SQL, internal errors, key references, or provider details.
405Stable error envelope without SQL, internal errors, key references, or provider details.
409Stable error envelope without SQL, internal errors, key references, or provider details.
412Stable error envelope without SQL, internal errors, key references, or provider details.
503Stable error envelope without SQL, internal errors, key references, or provider details.

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

POST /v1/tenant-scopes/{tenant_scope_id}/challenge-policies/{policy_id}/disable

Disable a challenge policy with revision CAS

operationId
disableChallengePolicy
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:challenge_policies.manage

Description (from the contract)

Requires challenge_policies.manage. The body must be absent or exactly an empty JSON object. Disabling is allowed during entitlement grace because it reduces active configuration. Disabling an already disabled policy returns 409.

Parameters

disableChallengePolicy Parameters
NameInTypeRequiredDescription
tenant_scope_idpathstring(uuid)YesExplicit target tenant access-scope UUID.
policy_idpathstring(uuid)Yes—
X-Request-IDheaderstringYesStable request correlation ID; 1 to 128 safe ASCII characters.
X-Trace-IDheaderstringYesStable trace correlation ID; 1 to 128 safe ASCII characters.
Idempotency-KeyheaderstringYesOperation-scoped durable key. Retry an unknown result only with the same key and unchanged business payload.
If-MatchheaderstringYesCurrent positive revision encoded as a quoted decimal ETag, for example "3".

Request body

application/json · Required:No

Responses

disableChallengePolicy Responses
StatusDescription
200Updated policy or the stored result of an identical retry.

Fields:id: string(uuid) tenant_scope_id: string(uuid) site_id: string(uuid) host: string priority: integer mode: string: delay / click / slider / captcha / external min_delay_seconds: integer challenge_ttl_seconds: integer pass_ttl_seconds: integer clock_skew_seconds: integer attempts_per_nonce: integer failure_window_seconds: integer max_failures_per_window: integer ip_binding: string: none / exact bind_user_agent: boolean bypass_routes: array<BypassRoute> key_reference_configured: boolean external_provider_configured: boolean enabled: boolean deleted: boolean revision: integer(int64) created_at: string(date-time) updated_at: string(date-time)

400Stable error envelope without SQL, internal errors, key references, or provider details.
401Stable error envelope without SQL, internal errors, key references, or provider details.
403Stable error envelope without SQL, internal errors, key references, or provider details.
404Stable error envelope without SQL, internal errors, key references, or provider details.
405Stable error envelope without SQL, internal errors, key references, or provider details.
409Stable error envelope without SQL, internal errors, key references, or provider details.
412Stable error envelope without SQL, internal errors, key references, or provider details.
503Stable error envelope without SQL, internal errors, key references, or provider details.

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

POST /v1/tenant-scopes/{tenant_scope_id}/challenge-policies/{policy_id}/enable

Enable a challenge policy with revision CAS

operationId
enableChallengePolicy
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:challenge_policies.manage

Description (from the contract)

Requires challenge_policies.manage and a currently valid, non-grace sites.manage entitlement. The body must be absent or exactly an empty JSON object. Enabling an already enabled policy returns 409.

Parameters

enableChallengePolicy Parameters
NameInTypeRequiredDescription
tenant_scope_idpathstring(uuid)YesExplicit target tenant access-scope UUID.
policy_idpathstring(uuid)Yes—
X-Request-IDheaderstringYesStable request correlation ID; 1 to 128 safe ASCII characters.
X-Trace-IDheaderstringYesStable trace correlation ID; 1 to 128 safe ASCII characters.
Idempotency-KeyheaderstringYesOperation-scoped durable key. Retry an unknown result only with the same key and unchanged business payload.
If-MatchheaderstringYesCurrent positive revision encoded as a quoted decimal ETag, for example "3".

Request body

application/json · Required:No

Responses

enableChallengePolicy Responses
StatusDescription
200Updated policy or the stored result of an identical retry.

Fields:id: string(uuid) tenant_scope_id: string(uuid) site_id: string(uuid) host: string priority: integer mode: string: delay / click / slider / captcha / external min_delay_seconds: integer challenge_ttl_seconds: integer pass_ttl_seconds: integer clock_skew_seconds: integer attempts_per_nonce: integer failure_window_seconds: integer max_failures_per_window: integer ip_binding: string: none / exact bind_user_agent: boolean bypass_routes: array<BypassRoute> key_reference_configured: boolean external_provider_configured: boolean enabled: boolean deleted: boolean revision: integer(int64) created_at: string(date-time) updated_at: string(date-time)

400Stable error envelope without SQL, internal errors, key references, or provider details.
401Stable error envelope without SQL, internal errors, key references, or provider details.
403Stable error envelope without SQL, internal errors, key references, or provider details.
404Stable error envelope without SQL, internal errors, key references, or provider details.
405Stable error envelope without SQL, internal errors, key references, or provider details.
409Stable error envelope without SQL, internal errors, key references, or provider details.
412Stable error envelope without SQL, internal errors, key references, or provider details.
503Stable error envelope without SQL, internal errors, key references, or provider details.

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

POST /v1/tenant-scopes/{tenant_scope_id}/challenge-policies/{policy_id}/publications

Publish one exact enabled challenge policy revision to Edge nodes

operationId
publishChallengePolicy
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:challenge_policies.manage

Description (from the contract)

Requires challenge_policies.manage. The current policy revision is re-authorized and locked before resolving its opaque key reference. The immutable artifact is signed and HPKE-encrypted separately for each eligible node. Missing key material or an unconfigured external adapter fails closed and does not change the active Edge configuration.

Parameters

publishChallengePolicy Parameters
NameInTypeRequiredDescription
tenant_scope_idpathstring(uuid)YesExplicit target tenant access-scope UUID.
policy_idpathstring(uuid)Yes—
X-Request-IDheaderstringYesStable request correlation ID; 1 to 128 safe ASCII characters.
X-Trace-IDheaderstringYesStable trace correlation ID; 1 to 128 safe ASCII characters.
Idempotency-KeyheaderstringYesOperation-scoped durable key. Retry an unknown result only with the same key and unchanged business payload.
If-MatchheaderstringYesCurrent positive revision encoded as a quoted decimal ETag, for example "3".

Request body

application/json · Required:No

Responses

publishChallengePolicy Responses
StatusDescription
202Signed per-node challenge artifact rollout was durably accepted.

Fields:policy_id: string(uuid) policy_revision: integer(int64) rollout_id: string(uuid) config_version_id: string(uuid) state: string: queued / running / healthy / failed / active reason: string: - / waiting_for_nodes / node_apply_failed / external_adapter_missing / configuration_publish_failed total: integer pending: integer running: integer healthy: integer failed: integer cancelled: integer superseded: integer config_publication?: object

400Stable error envelope without SQL, internal errors, key references, or provider details.
401Stable error envelope without SQL, internal errors, key references, or provider details.
403Stable error envelope without SQL, internal errors, key references, or provider details.
404Stable error envelope without SQL, internal errors, key references, or provider details.
405Stable error envelope without SQL, internal errors, key references, or provider details.
409Stable error envelope without SQL, internal errors, key references, or provider details.
412Stable error envelope without SQL, internal errors, key references, or provider details.
422Stable error envelope without SQL, internal errors, key references, or provider details.
503Stable error envelope without SQL, internal errors, key references, or provider details.

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.
  • 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/tenant-scopes/{tenant_scope_id}/challenge-policies/{policy_id}/publications/{rollout_id}

Read the bounded rollout state for an exact policy artifact

operationId
getChallengePolicyPublication
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:challenge_policies.read

Description (from the contract)

Requires challenge_policies.read. The rollout must belong to the target tenant, policy, and revision; another same-tenant rollout is not relabeled through this path. This read has no publication or promotion side effects.

Parameters

getChallengePolicyPublication Parameters
NameInTypeRequiredDescription
tenant_scope_idpathstring(uuid)YesExplicit target tenant access-scope UUID.
policy_idpathstring(uuid)Yes—
rollout_idpathstring(uuid)Yes—
X-Request-IDheaderstringYesStable request correlation ID; 1 to 128 safe ASCII characters.
X-Trace-IDheaderstringYesStable trace correlation ID; 1 to 128 safe ASCII characters.

Responses

getChallengePolicyPublication Responses
StatusDescription
200Exact challenge rollout state, optionally including its promoted Edge publication.

Fields:policy_id: string(uuid) policy_revision: integer(int64) rollout_id: string(uuid) config_version_id: string(uuid) state: string: queued / running / healthy / failed / active reason: string: - / waiting_for_nodes / node_apply_failed / external_adapter_missing / configuration_publish_failed total: integer pending: integer running: integer healthy: integer failed: integer cancelled: integer superseded: integer config_publication?: object

400Stable error envelope without SQL, internal errors, key references, or provider details.
401Stable error envelope without SQL, internal errors, key references, or provider details.
403Stable error envelope without SQL, internal errors, key references, or provider details.
404Stable error envelope without SQL, internal errors, key references, or provider details.
405Stable error envelope without SQL, internal errors, key references, or provider details.
503Stable error envelope without SQL, internal errors, key references, or provider details.

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/tenant-scopes/{tenant_scope_id}/challenge-policies/{policy_id}/publications/{rollout_id}/promote

Promote an exact healthy challenge rollout into Edge configuration

operationId
promoteChallengePolicyPublication
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:challenge_policies.manage

Description (from the contract)

Requires challenge_policies.manage. Promotion is revision-CAS and idempotent. Only a fully healthy rollout whose immutable artifact binds the same tenant, policy, and revision can advance the signed Edge configuration. Partial, failed, stale, forged, or cross-policy rollouts preserve the current configuration and LKG.

Parameters

promoteChallengePolicyPublication Parameters
NameInTypeRequiredDescription
tenant_scope_idpathstring(uuid)YesExplicit target tenant access-scope UUID.
policy_idpathstring(uuid)Yes—
rollout_idpathstring(uuid)Yes—
X-Request-IDheaderstringYesStable request correlation ID; 1 to 128 safe ASCII characters.
X-Trace-IDheaderstringYesStable trace correlation ID; 1 to 128 safe ASCII characters.
Idempotency-KeyheaderstringYesOperation-scoped durable key. Retry an unknown result only with the same key and unchanged business payload.
If-MatchheaderstringYesCurrent positive revision encoded as a quoted decimal ETag, for example "3".

Request body

application/json · Required:No

Responses

promoteChallengePolicyPublication Responses
StatusDescription
200Exact challenge rollout state, optionally including its promoted Edge publication.

Fields:policy_id: string(uuid) policy_revision: integer(int64) rollout_id: string(uuid) config_version_id: string(uuid) state: string: queued / running / healthy / failed / active reason: string: - / waiting_for_nodes / node_apply_failed / external_adapter_missing / configuration_publish_failed total: integer pending: integer running: integer healthy: integer failed: integer cancelled: integer superseded: integer config_publication?: object

400Stable error envelope without SQL, internal errors, key references, or provider details.
401Stable error envelope without SQL, internal errors, key references, or provider details.
403Stable error envelope without SQL, internal errors, key references, or provider details.
404Stable error envelope without SQL, internal errors, key references, or provider details.
405Stable error envelope without SQL, internal errors, key references, or provider details.
409Stable error envelope without SQL, internal errors, key references, or provider details.
412Stable error envelope without SQL, internal errors, key references, or provider details.
503Stable error envelope without SQL, internal errors, key references, or provider details.

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

POST /v1/tenant-scopes/{tenant_scope_id}/error-page-publications

发布租户作用域的错误页配置

operationId
publishErrorPageConfiguration
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:edge_publications.manage

Description (from the contract)

Requires a platform session with edge_publications.manage. If-Match is the exact current source revision. Target nodes or an immutable line-group snapshot, health policy, deadline, actor, and idempotency metadata are committed through the existing production publisher. An outcome_unknown response may be retried only with the unchanged body, If-Match, path, and Idempotency-Key.

Parameters

publishErrorPageConfiguration Parameters
NameInTypeRequiredDescription
tenant_scope_idpathstring(uuid)Yes—
If-MatchheaderstringYes当前源配置 revision 的强 ETag,例如 "7"。
Idempotency-KeyheaderstringYes—
X-Request-IDheaderstring(uuid)Yes—
X-Correlation-IDheaderstring(uuid)No—
TraceparentheaderstringYes—
X-Task-IDheaderstringNo—

Request body

application/json · Required:Yes

publishErrorPageConfiguration Request body
NameTypeRequiredDescription
targetNodeTarget | SnapshotTargetYes—
health_checkHealthCheckYes—
max_attemptsinteger(int32)Yes—
deadlinestring(date-time)Yes—

Responses

publishErrorPageConfiguration Responses
StatusDescription
201创建成功,或返回完全相同请求的持久化结果

Fields:tenant_id: string(uuid) tenant_scope_id: string(uuid) publication_id: string(uuid) source_revision: integer(int64) error_page_publication_revision: integer(int64) config_version_id: string(uuid) rollout_id: string(uuid) artifact_sha256: string target: PublicationTarget node_count: integer created_at: string(date-time) replayed?: boolean

400请求或强前置条件格式无效
401会话无效或已撤销
403当前实时 RBAC 或作用域绑定拒绝访问
405方法不受支持
409幂等或目标快照冲突
412If-Match 与当前源 revision 不一致
422节点状态或 entitlement 不允许发布
502生产发布器或持久化 readback 身份不一致
503写入结果未知。客户端只可使用响应 retry 中的 method、path、 if_match、idempotency_key 和 body_sha256 原样重试。

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/tenant-scopes/{tenant_scope_id}/error-page-publications/{publication_id}

读取一个不可变错误页发布结果

operationId
getErrorPagePublication
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:edge_publications.read

Description (from the contract)

Requires edge_publications.read. The session and RBAC grant are checked again in the read transaction. The selected publication must belong to tenant_scope_id and its ordinal-one configuration artifact must use the signed error-page snapshot media type. Cross-scope resources are never returned.

Parameters

getErrorPagePublication Parameters
NameInTypeRequiredDescription
tenant_scope_idpathstring(uuid)Yes—
publication_idpathstring(uuid)Yes—
X-Request-IDheaderstring(uuid)No—

Responses

getErrorPagePublication Responses
StatusDescription
200不可变发布结果

Fields:tenant_id: string(uuid) tenant_scope_id: string(uuid) publication_id: string(uuid) source_revision: integer(int64) error_page_publication_revision: integer(int64) config_version_id: string(uuid) rollout_id: string(uuid) artifact_sha256: string target: PublicationTarget node_count: integer created_at: string(date-time) replayed?: boolean

400请求或强前置条件格式无效
401会话无效或已撤销
403当前实时 RBAC 或作用域绑定拒绝访问
404该作用域中不存在指定的错误页发布
405方法不受支持
502生产发布器或持久化 readback 身份不一致
503依赖暂不可用;GET 可安全重试

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

GET /v1/tenant-scopes/{tenant_scope_id}/http-policies

List non-deleted HTTP policies in one tenant scope

operationId
listHTTPPolicies
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:http_policies.read

Description (from the contract)

Requires http_policies.read. Results use stable keyset ordering. The server may emit fewer items than limit so the complete ListResult JSON envelope, including next_cursor and the trailing response newline, stays within the 2 MiB byte budget. A single maximum schema-legal policy is always returned. When more rows remain, the opaque next_cursor is anchored to the last item emitted. Pagination resumes strictly after it without gaps or duplicates. Tenant principals see only sites they own. Platform principals must provide this explicit tenant scope and pass the live database permission check.

Parameters

listHTTPPolicies Parameters
NameInTypeRequiredDescription
tenant_scope_idpathstring(uuid)YesExplicit target tenant access-scope UUID.
X-Request-IDheaderstringYesStable request correlation ID.
X-Trace-IDheaderstringYesStable trace correlation ID.
limitqueryintegerNo—
cursorquerystringNoOpaque URL-safe keyset cursor returned by the preceding page.
site_idquerystring(uuid)No—
enabledquerybooleanNo—

Responses

listHTTPPolicies Responses
StatusDescription
200Stable page of non-deleted policies.

Fields:items: array<HTTPPolicy> next_cursor?: string

400Stable error envelope. Dependency failures, including PostgreSQL serialization, deadlock, lock-not-available, and unknown failures, use HTTP 503 with service_unavailable and never expose SQLSTATE, SQL, internal errors, hidden policy facts, entitlement payloads, or signing and delivery state.
401Stable error envelope. Dependency failures, including PostgreSQL serialization, deadlock, lock-not-available, and unknown failures, use HTTP 503 with service_unavailable and never expose SQLSTATE, SQL, internal errors, hidden policy facts, entitlement payloads, or signing and delivery state.
403Stable error envelope. Dependency failures, including PostgreSQL serialization, deadlock, lock-not-available, and unknown failures, use HTTP 503 with service_unavailable and never expose SQLSTATE, SQL, internal errors, hidden policy facts, entitlement payloads, or signing and delivery state.
404Stable error envelope. Dependency failures, including PostgreSQL serialization, deadlock, lock-not-available, and unknown failures, use HTTP 503 with service_unavailable and never expose SQLSTATE, SQL, internal errors, hidden policy facts, entitlement payloads, or signing and delivery state.
405Stable error envelope. Dependency failures, including PostgreSQL serialization, deadlock, lock-not-available, and unknown failures, use HTTP 503 with service_unavailable and never expose SQLSTATE, SQL, internal errors, hidden policy facts, entitlement payloads, or signing and delivery state.
503Stable error envelope. Dependency failures, including PostgreSQL serialization, deadlock, lock-not-available, and unknown failures, use HTTP 503 with service_unavailable and never expose SQLSTATE, SQL, internal errors, hidden policy facts, entitlement payloads, or signing and delivery state.

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/tenant-scopes/{tenant_scope_id}/http-policies

Create revision one for a tenant-owned site

operationId
createHTTPPolicy
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:http_policies.manage

Description (from the contract)

Requires http_policies.manage and a currently valid, non-grace sites.manage entitlement. Same-key same-payload retries return the stored result; a key reused with another payload returns 409. JSON is limited to 1 MiB and duplicate keys, unknown fields, and trailing values are rejected. A platform principal whose role holds http_policies.manage (or platform.admin) writes any site of this tenant scope, as do the update, enable, disable, and delete operations; the revision records the platform actor and the audit event's scope is this tenant scope.

Parameters

createHTTPPolicy Parameters
NameInTypeRequiredDescription
tenant_scope_idpathstring(uuid)YesExplicit target tenant access-scope UUID.
X-Request-IDheaderstringYesStable request correlation ID.
X-Trace-IDheaderstringYesStable trace correlation ID.
Idempotency-KeyheaderstringYesOperation-scoped durable key. Retry an unknown result with this key and the unchanged business payload.

Request body

application/json · Required:Yes

createHTTPPolicy Request body
NameTypeRequiredDescription
site_idstring(uuid)Yes—
enabledbooleanYes—
configHTTPPolicyConfigYes—

Responses

createHTTPPolicy Responses
StatusDescription
201Created policy or stored identical retry result.

Fields:max_upload_bytes: integer(int64) request_headers: array<HeaderAction> response_headers: array<HeaderAction> rewrites: array<RewriteRule> redirect_allowed_hosts: array<string> redirects: array<RedirectRule> cors: CORSPolicy | null referer_check: RefererCheckPolicy | null id: string(uuid) tenant_scope_id: string(uuid) site_id: string(uuid) site_owner_user_id: string(uuid) enabled: boolean deleted: boolean revision: integer(int64) publication_revision: integer(int64) created_at: string(date-time) updated_at: string(date-time)

400Stable error envelope. Dependency failures, including PostgreSQL serialization, deadlock, lock-not-available, and unknown failures, use HTTP 503 with service_unavailable and never expose SQLSTATE, SQL, internal errors, hidden policy facts, entitlement payloads, or signing and delivery state.
401Stable error envelope. Dependency failures, including PostgreSQL serialization, deadlock, lock-not-available, and unknown failures, use HTTP 503 with service_unavailable and never expose SQLSTATE, SQL, internal errors, hidden policy facts, entitlement payloads, or signing and delivery state.
403Stable error envelope. Dependency failures, including PostgreSQL serialization, deadlock, lock-not-available, and unknown failures, use HTTP 503 with service_unavailable and never expose SQLSTATE, SQL, internal errors, hidden policy facts, entitlement payloads, or signing and delivery state.
404Stable error envelope. Dependency failures, including PostgreSQL serialization, deadlock, lock-not-available, and unknown failures, use HTTP 503 with service_unavailable and never expose SQLSTATE, SQL, internal errors, hidden policy facts, entitlement payloads, or signing and delivery state.
405Stable error envelope. Dependency failures, including PostgreSQL serialization, deadlock, lock-not-available, and unknown failures, use HTTP 503 with service_unavailable and never expose SQLSTATE, SQL, internal errors, hidden policy facts, entitlement payloads, or signing and delivery state.
409Stable error envelope. Dependency failures, including PostgreSQL serialization, deadlock, lock-not-available, and unknown failures, use HTTP 503 with service_unavailable and never expose SQLSTATE, SQL, internal errors, hidden policy facts, entitlement payloads, or signing and delivery state.
422Stable error envelope. Dependency failures, including PostgreSQL serialization, deadlock, lock-not-available, and unknown failures, use HTTP 503 with service_unavailable and never expose SQLSTATE, SQL, internal errors, hidden policy facts, entitlement payloads, or signing and delivery state.
503Stable error envelope. Dependency failures, including PostgreSQL serialization, deadlock, lock-not-available, and unknown failures, use HTTP 503 with service_unavailable and never expose SQLSTATE, SQL, internal errors, hidden policy facts, entitlement payloads, or signing and delivery state.

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/tenant-scopes/{tenant_scope_id}/http-policies/publication-preview

Read a deterministic unsigned Edge v1 source snapshot

operationId
previewHTTPPolicyPublication
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:http_policies.read

Description (from the contract)

Requires http_policies.read. The result contains only enabled, non-deleted policies visible in the target tenant and is sorted by site_id. state is always preview. The SHA-256 covers canonical snapshot JSON with a trailing newline. It is not a signature or delivery receipt.

Parameters

previewHTTPPolicyPublication Parameters
NameInTypeRequiredDescription
tenant_scope_idpathstring(uuid)YesExplicit target tenant access-scope UUID.
X-Request-IDheaderstringYesStable request correlation ID.
X-Trace-IDheaderstringYesStable trace correlation ID.

Responses

previewHTTPPolicyPublication Responses
StatusDescription
200Deterministic unsigned Edge v1 source preview.

Fields:state: string sha256: string snapshot: EdgeSnapshot

400Stable error envelope. Dependency failures, including PostgreSQL serialization, deadlock, lock-not-available, and unknown failures, use HTTP 503 with service_unavailable and never expose SQLSTATE, SQL, internal errors, hidden policy facts, entitlement payloads, or signing and delivery state.
401Stable error envelope. Dependency failures, including PostgreSQL serialization, deadlock, lock-not-available, and unknown failures, use HTTP 503 with service_unavailable and never expose SQLSTATE, SQL, internal errors, hidden policy facts, entitlement payloads, or signing and delivery state.
403Stable error envelope. Dependency failures, including PostgreSQL serialization, deadlock, lock-not-available, and unknown failures, use HTTP 503 with service_unavailable and never expose SQLSTATE, SQL, internal errors, hidden policy facts, entitlement payloads, or signing and delivery state.
404Stable error envelope. Dependency failures, including PostgreSQL serialization, deadlock, lock-not-available, and unknown failures, use HTTP 503 with service_unavailable and never expose SQLSTATE, SQL, internal errors, hidden policy facts, entitlement payloads, or signing and delivery state.
405Stable error envelope. Dependency failures, including PostgreSQL serialization, deadlock, lock-not-available, and unknown failures, use HTTP 503 with service_unavailable and never expose SQLSTATE, SQL, internal errors, hidden policy facts, entitlement payloads, or signing and delivery state.
409Stable error envelope. Dependency failures, including PostgreSQL serialization, deadlock, lock-not-available, and unknown failures, use HTTP 503 with service_unavailable and never expose SQLSTATE, SQL, internal errors, hidden policy facts, entitlement payloads, or signing and delivery state.
503Stable error envelope. Dependency failures, including PostgreSQL serialization, deadlock, lock-not-available, and unknown failures, use HTTP 503 with service_unavailable and never expose SQLSTATE, SQL, internal errors, hidden policy facts, entitlement payloads, or signing and delivery state.

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/tenant-scopes/{tenant_scope_id}/http-policies/{policy_id}

Read one HTTP policy

operationId
getHTTPPolicy
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:http_policies.read

Description (from the contract)

Requires http_policies.read. Unknown, deleted, out-of-tenant, and tenant actor non-owned policy IDs share the same 404 response.

Parameters

getHTTPPolicy Parameters
NameInTypeRequiredDescription
tenant_scope_idpathstring(uuid)YesExplicit target tenant access-scope UUID.
policy_idpathstring(uuid)Yes—
X-Request-IDheaderstringYesStable request correlation ID.
X-Trace-IDheaderstringYesStable trace correlation ID.

Responses

getHTTPPolicy Responses
StatusDescription
200HTTP policy.

Fields:max_upload_bytes: integer(int64) request_headers: array<HeaderAction> response_headers: array<HeaderAction> rewrites: array<RewriteRule> redirect_allowed_hosts: array<string> redirects: array<RedirectRule> cors: CORSPolicy | null referer_check: RefererCheckPolicy | null id: string(uuid) tenant_scope_id: string(uuid) site_id: string(uuid) site_owner_user_id: string(uuid) enabled: boolean deleted: boolean revision: integer(int64) publication_revision: integer(int64) created_at: string(date-time) updated_at: string(date-time)

400Stable error envelope. Dependency failures, including PostgreSQL serialization, deadlock, lock-not-available, and unknown failures, use HTTP 503 with service_unavailable and never expose SQLSTATE, SQL, internal errors, hidden policy facts, entitlement payloads, or signing and delivery state.
401Stable error envelope. Dependency failures, including PostgreSQL serialization, deadlock, lock-not-available, and unknown failures, use HTTP 503 with service_unavailable and never expose SQLSTATE, SQL, internal errors, hidden policy facts, entitlement payloads, or signing and delivery state.
403Stable error envelope. Dependency failures, including PostgreSQL serialization, deadlock, lock-not-available, and unknown failures, use HTTP 503 with service_unavailable and never expose SQLSTATE, SQL, internal errors, hidden policy facts, entitlement payloads, or signing and delivery state.
404Stable error envelope. Dependency failures, including PostgreSQL serialization, deadlock, lock-not-available, and unknown failures, use HTTP 503 with service_unavailable and never expose SQLSTATE, SQL, internal errors, hidden policy facts, entitlement payloads, or signing and delivery state.
405Stable error envelope. Dependency failures, including PostgreSQL serialization, deadlock, lock-not-available, and unknown failures, use HTTP 503 with service_unavailable and never expose SQLSTATE, SQL, internal errors, hidden policy facts, entitlement payloads, or signing and delivery state.
503Stable error envelope. Dependency failures, including PostgreSQL serialization, deadlock, lock-not-available, and unknown failures, use HTTP 503 with service_unavailable and never expose SQLSTATE, SQL, internal errors, hidden policy facts, entitlement payloads, or signing and delivery state.

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

PATCH /v1/tenant-scopes/{tenant_scope_id}/http-policies/{policy_id}

Append a configuration revision

operationId
updateHTTPPolicy
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:http_policies.manage

Description (from the contract)

Requires http_policies.manage and a currently valid, non-grace sites.manage entitlement. If-Match is compared under a row lock. Site identity and enabled state cannot be changed by this operation.

Parameters

updateHTTPPolicy Parameters
NameInTypeRequiredDescription
tenant_scope_idpathstring(uuid)YesExplicit target tenant access-scope UUID.
policy_idpathstring(uuid)Yes—
X-Request-IDheaderstringYesStable request correlation ID.
X-Trace-IDheaderstringYesStable trace correlation ID.
Idempotency-KeyheaderstringYesOperation-scoped durable key. Retry an unknown result with this key and the unchanged business payload.
If-MatchheaderstringYesCurrent positive revision as a quoted decimal ETag, for example "3".

Request body

application/json · Required:Yes

updateHTTPPolicy Request body
NameTypeRequiredDescription
configHTTPPolicyConfigYes—

Responses

updateHTTPPolicy Responses
StatusDescription
200Updated policy or stored identical retry result.

Fields:max_upload_bytes: integer(int64) request_headers: array<HeaderAction> response_headers: array<HeaderAction> rewrites: array<RewriteRule> redirect_allowed_hosts: array<string> redirects: array<RedirectRule> cors: CORSPolicy | null referer_check: RefererCheckPolicy | null id: string(uuid) tenant_scope_id: string(uuid) site_id: string(uuid) site_owner_user_id: string(uuid) enabled: boolean deleted: boolean revision: integer(int64) publication_revision: integer(int64) created_at: string(date-time) updated_at: string(date-time)

400Stable error envelope. Dependency failures, including PostgreSQL serialization, deadlock, lock-not-available, and unknown failures, use HTTP 503 with service_unavailable and never expose SQLSTATE, SQL, internal errors, hidden policy facts, entitlement payloads, or signing and delivery state.
401Stable error envelope. Dependency failures, including PostgreSQL serialization, deadlock, lock-not-available, and unknown failures, use HTTP 503 with service_unavailable and never expose SQLSTATE, SQL, internal errors, hidden policy facts, entitlement payloads, or signing and delivery state.
403Stable error envelope. Dependency failures, including PostgreSQL serialization, deadlock, lock-not-available, and unknown failures, use HTTP 503 with service_unavailable and never expose SQLSTATE, SQL, internal errors, hidden policy facts, entitlement payloads, or signing and delivery state.
404Stable error envelope. Dependency failures, including PostgreSQL serialization, deadlock, lock-not-available, and unknown failures, use HTTP 503 with service_unavailable and never expose SQLSTATE, SQL, internal errors, hidden policy facts, entitlement payloads, or signing and delivery state.
405Stable error envelope. Dependency failures, including PostgreSQL serialization, deadlock, lock-not-available, and unknown failures, use HTTP 503 with service_unavailable and never expose SQLSTATE, SQL, internal errors, hidden policy facts, entitlement payloads, or signing and delivery state.
409Stable error envelope. Dependency failures, including PostgreSQL serialization, deadlock, lock-not-available, and unknown failures, use HTTP 503 with service_unavailable and never expose SQLSTATE, SQL, internal errors, hidden policy facts, entitlement payloads, or signing and delivery state.
412Stable error envelope. Dependency failures, including PostgreSQL serialization, deadlock, lock-not-available, and unknown failures, use HTTP 503 with service_unavailable and never expose SQLSTATE, SQL, internal errors, hidden policy facts, entitlement payloads, or signing and delivery state.
422Stable error envelope. Dependency failures, including PostgreSQL serialization, deadlock, lock-not-available, and unknown failures, use HTTP 503 with service_unavailable and never expose SQLSTATE, SQL, internal errors, hidden policy facts, entitlement payloads, or signing and delivery state.
503Stable error envelope. Dependency failures, including PostgreSQL serialization, deadlock, lock-not-available, and unknown failures, use HTTP 503 with service_unavailable and never expose SQLSTATE, SQL, internal errors, hidden policy facts, entitlement payloads, or signing and delivery state.

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

DELETE /v1/tenant-scopes/{tenant_scope_id}/http-policies/{policy_id}

Soft-delete a policy by appending a tombstone revision

operationId
deleteHTTPPolicy
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:http_policies.manage

Description (from the contract)

Requires http_policies.manage, Idempotency-Key, and revision CAS. The body must be empty. Delete remains available during entitlement grace and preserves all historical revisions.

Parameters

deleteHTTPPolicy Parameters
NameInTypeRequiredDescription
tenant_scope_idpathstring(uuid)YesExplicit target tenant access-scope UUID.
policy_idpathstring(uuid)Yes—
X-Request-IDheaderstringYesStable request correlation ID.
X-Trace-IDheaderstringYesStable trace correlation ID.
Idempotency-KeyheaderstringYesOperation-scoped durable key. Retry an unknown result with this key and the unchanged business payload.
If-MatchheaderstringYesCurrent positive revision as a quoted decimal ETag, for example "3".

Responses

deleteHTTPPolicy Responses
StatusDescription
200Updated policy or stored identical retry result.

Fields:max_upload_bytes: integer(int64) request_headers: array<HeaderAction> response_headers: array<HeaderAction> rewrites: array<RewriteRule> redirect_allowed_hosts: array<string> redirects: array<RedirectRule> cors: CORSPolicy | null referer_check: RefererCheckPolicy | null id: string(uuid) tenant_scope_id: string(uuid) site_id: string(uuid) site_owner_user_id: string(uuid) enabled: boolean deleted: boolean revision: integer(int64) publication_revision: integer(int64) created_at: string(date-time) updated_at: string(date-time)

400Stable error envelope. Dependency failures, including PostgreSQL serialization, deadlock, lock-not-available, and unknown failures, use HTTP 503 with service_unavailable and never expose SQLSTATE, SQL, internal errors, hidden policy facts, entitlement payloads, or signing and delivery state.
401Stable error envelope. Dependency failures, including PostgreSQL serialization, deadlock, lock-not-available, and unknown failures, use HTTP 503 with service_unavailable and never expose SQLSTATE, SQL, internal errors, hidden policy facts, entitlement payloads, or signing and delivery state.
403Stable error envelope. Dependency failures, including PostgreSQL serialization, deadlock, lock-not-available, and unknown failures, use HTTP 503 with service_unavailable and never expose SQLSTATE, SQL, internal errors, hidden policy facts, entitlement payloads, or signing and delivery state.
404Stable error envelope. Dependency failures, including PostgreSQL serialization, deadlock, lock-not-available, and unknown failures, use HTTP 503 with service_unavailable and never expose SQLSTATE, SQL, internal errors, hidden policy facts, entitlement payloads, or signing and delivery state.
405Stable error envelope. Dependency failures, including PostgreSQL serialization, deadlock, lock-not-available, and unknown failures, use HTTP 503 with service_unavailable and never expose SQLSTATE, SQL, internal errors, hidden policy facts, entitlement payloads, or signing and delivery state.
409Stable error envelope. Dependency failures, including PostgreSQL serialization, deadlock, lock-not-available, and unknown failures, use HTTP 503 with service_unavailable and never expose SQLSTATE, SQL, internal errors, hidden policy facts, entitlement payloads, or signing and delivery state.
412Stable error envelope. Dependency failures, including PostgreSQL serialization, deadlock, lock-not-available, and unknown failures, use HTTP 503 with service_unavailable and never expose SQLSTATE, SQL, internal errors, hidden policy facts, entitlement payloads, or signing and delivery state.
503Stable error envelope. Dependency failures, including PostgreSQL serialization, deadlock, lock-not-available, and unknown failures, use HTTP 503 with service_unavailable and never expose SQLSTATE, SQL, internal errors, hidden policy facts, entitlement payloads, or signing and delivery state.

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

POST /v1/tenant-scopes/{tenant_scope_id}/http-policies/{policy_id}/disable

Disable a policy with revision CAS

operationId
disableHTTPPolicy
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:http_policies.manage

Description (from the contract)

Requires http_policies.manage. The body must be exactly an empty JSON object. Disable remains available during entitlement grace.

Parameters

disableHTTPPolicy Parameters
NameInTypeRequiredDescription
tenant_scope_idpathstring(uuid)YesExplicit target tenant access-scope UUID.
policy_idpathstring(uuid)Yes—
X-Request-IDheaderstringYesStable request correlation ID.
X-Trace-IDheaderstringYesStable trace correlation ID.
Idempotency-KeyheaderstringYesOperation-scoped durable key. Retry an unknown result with this key and the unchanged business payload.
If-MatchheaderstringYesCurrent positive revision as a quoted decimal ETag, for example "3".

Request body

application/json · Required:Yes

Responses

disableHTTPPolicy Responses
StatusDescription
200Updated policy or stored identical retry result.

Fields:max_upload_bytes: integer(int64) request_headers: array<HeaderAction> response_headers: array<HeaderAction> rewrites: array<RewriteRule> redirect_allowed_hosts: array<string> redirects: array<RedirectRule> cors: CORSPolicy | null referer_check: RefererCheckPolicy | null id: string(uuid) tenant_scope_id: string(uuid) site_id: string(uuid) site_owner_user_id: string(uuid) enabled: boolean deleted: boolean revision: integer(int64) publication_revision: integer(int64) created_at: string(date-time) updated_at: string(date-time)

400Stable error envelope. Dependency failures, including PostgreSQL serialization, deadlock, lock-not-available, and unknown failures, use HTTP 503 with service_unavailable and never expose SQLSTATE, SQL, internal errors, hidden policy facts, entitlement payloads, or signing and delivery state.
401Stable error envelope. Dependency failures, including PostgreSQL serialization, deadlock, lock-not-available, and unknown failures, use HTTP 503 with service_unavailable and never expose SQLSTATE, SQL, internal errors, hidden policy facts, entitlement payloads, or signing and delivery state.
403Stable error envelope. Dependency failures, including PostgreSQL serialization, deadlock, lock-not-available, and unknown failures, use HTTP 503 with service_unavailable and never expose SQLSTATE, SQL, internal errors, hidden policy facts, entitlement payloads, or signing and delivery state.
404Stable error envelope. Dependency failures, including PostgreSQL serialization, deadlock, lock-not-available, and unknown failures, use HTTP 503 with service_unavailable and never expose SQLSTATE, SQL, internal errors, hidden policy facts, entitlement payloads, or signing and delivery state.
405Stable error envelope. Dependency failures, including PostgreSQL serialization, deadlock, lock-not-available, and unknown failures, use HTTP 503 with service_unavailable and never expose SQLSTATE, SQL, internal errors, hidden policy facts, entitlement payloads, or signing and delivery state.
409Stable error envelope. Dependency failures, including PostgreSQL serialization, deadlock, lock-not-available, and unknown failures, use HTTP 503 with service_unavailable and never expose SQLSTATE, SQL, internal errors, hidden policy facts, entitlement payloads, or signing and delivery state.
412Stable error envelope. Dependency failures, including PostgreSQL serialization, deadlock, lock-not-available, and unknown failures, use HTTP 503 with service_unavailable and never expose SQLSTATE, SQL, internal errors, hidden policy facts, entitlement payloads, or signing and delivery state.
503Stable error envelope. Dependency failures, including PostgreSQL serialization, deadlock, lock-not-available, and unknown failures, use HTTP 503 with service_unavailable and never expose SQLSTATE, SQL, internal errors, hidden policy facts, entitlement payloads, or signing and delivery state.

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

POST /v1/tenant-scopes/{tenant_scope_id}/http-policies/{policy_id}/enable

Enable a policy with revision CAS

operationId
enableHTTPPolicy
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:http_policies.manage

Description (from the contract)

Requires http_policies.manage and a currently valid, non-grace sites.manage entitlement. The body must be exactly an empty JSON object.

Parameters

enableHTTPPolicy Parameters
NameInTypeRequiredDescription
tenant_scope_idpathstring(uuid)YesExplicit target tenant access-scope UUID.
policy_idpathstring(uuid)Yes—
X-Request-IDheaderstringYesStable request correlation ID.
X-Trace-IDheaderstringYesStable trace correlation ID.
Idempotency-KeyheaderstringYesOperation-scoped durable key. Retry an unknown result with this key and the unchanged business payload.
If-MatchheaderstringYesCurrent positive revision as a quoted decimal ETag, for example "3".

Request body

application/json · Required:Yes

Responses

enableHTTPPolicy Responses
StatusDescription
200Updated policy or stored identical retry result.

Fields:max_upload_bytes: integer(int64) request_headers: array<HeaderAction> response_headers: array<HeaderAction> rewrites: array<RewriteRule> redirect_allowed_hosts: array<string> redirects: array<RedirectRule> cors: CORSPolicy | null referer_check: RefererCheckPolicy | null id: string(uuid) tenant_scope_id: string(uuid) site_id: string(uuid) site_owner_user_id: string(uuid) enabled: boolean deleted: boolean revision: integer(int64) publication_revision: integer(int64) created_at: string(date-time) updated_at: string(date-time)

400Stable error envelope. Dependency failures, including PostgreSQL serialization, deadlock, lock-not-available, and unknown failures, use HTTP 503 with service_unavailable and never expose SQLSTATE, SQL, internal errors, hidden policy facts, entitlement payloads, or signing and delivery state.
401Stable error envelope. Dependency failures, including PostgreSQL serialization, deadlock, lock-not-available, and unknown failures, use HTTP 503 with service_unavailable and never expose SQLSTATE, SQL, internal errors, hidden policy facts, entitlement payloads, or signing and delivery state.
403Stable error envelope. Dependency failures, including PostgreSQL serialization, deadlock, lock-not-available, and unknown failures, use HTTP 503 with service_unavailable and never expose SQLSTATE, SQL, internal errors, hidden policy facts, entitlement payloads, or signing and delivery state.
404Stable error envelope. Dependency failures, including PostgreSQL serialization, deadlock, lock-not-available, and unknown failures, use HTTP 503 with service_unavailable and never expose SQLSTATE, SQL, internal errors, hidden policy facts, entitlement payloads, or signing and delivery state.
405Stable error envelope. Dependency failures, including PostgreSQL serialization, deadlock, lock-not-available, and unknown failures, use HTTP 503 with service_unavailable and never expose SQLSTATE, SQL, internal errors, hidden policy facts, entitlement payloads, or signing and delivery state.
409Stable error envelope. Dependency failures, including PostgreSQL serialization, deadlock, lock-not-available, and unknown failures, use HTTP 503 with service_unavailable and never expose SQLSTATE, SQL, internal errors, hidden policy facts, entitlement payloads, or signing and delivery state.
412Stable error envelope. Dependency failures, including PostgreSQL serialization, deadlock, lock-not-available, and unknown failures, use HTTP 503 with service_unavailable and never expose SQLSTATE, SQL, internal errors, hidden policy facts, entitlement payloads, or signing and delivery state.
503Stable error envelope. Dependency failures, including PostgreSQL serialization, deadlock, lock-not-available, and unknown failures, use HTTP 503 with service_unavailable and never expose SQLSTATE, SQL, internal errors, hidden policy facts, entitlement payloads, or signing and delivery state.

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.
  • 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/tenant-scopes/{tenant_scope_id}/origin-auth/credentials

List redacted credential heads in one tenant

operationId
listOriginAuthCredentials
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:origin_auth.read

Parameters

listOriginAuthCredentials Parameters
NameInTypeRequiredDescription
tenant_scope_idpathstring(uuid)Yes—
X-Request-IDheaderstringNo—
X-Trace-IDheaderstringNo—
providerquerystring: s3 / oss / cosNo—
statusquerystring: pending / verified / disabled / deletedNo—
limitqueryintegerNo—
cursorquerystringNoOpaque stable keyset cursor, at most 512 bytes.

Responses

listOriginAuthCredentials Responses
StatusDescription
200Stable credential page.

Fields:items: array<Credential> next_cursor?: string

400Unknown field, malformed UUID/body/header/query, invalid cursor, or exceeded bound.
401Authentication is missing or invalid.
403Permission or entitlement denied.
404Unknown or out-of-tenant resource; both use the same response shape.
405Request method is not allowed for this route.
503Storage, encryption key, entitlement, verifier, timeout, or cancellation 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/tenant-scopes/{tenant_scope_id}/origin-auth/credentials

Encrypt and append credential revision 1

operationId
createOriginAuthCredential
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:origin_auth.manage

Description (from the contract)

Requires origin_auth.manage and a valid sites.manage entitlement. The credential remains pending until an injected real verifier accepts it. Same-key same-payload retries replay the stored redacted response.

Parameters

createOriginAuthCredential Parameters
NameInTypeRequiredDescription
tenant_scope_idpathstring(uuid)Yes—
X-Request-IDheaderstringNo—
X-Trace-IDheaderstringNo—
Idempotency-KeyheaderstringYes—

Request body

application/json · Required:Yes

createOriginAuthCredential Request body
NameTypeRequiredDescription
providerstring: s3 / oss / cosYes—
namestringYes—
secretCredentialSecretYes—

Responses

createOriginAuthCredential Responses
StatusDescription
201Pending credential created.

Fields:id: string(uuid) tenant_scope_id: string(uuid) provider: string: s3 / oss / cos name: string status: string: pending / verified / disabled / deleted revision: integer revision_ref: string(uuid) not_before: string(date-time) expires_at: string(date-time) verified_at?: string(date-time) created_at: string(date-time) updated_at: string(date-time)

400Unknown field, malformed UUID/body/header/query, invalid cursor, or exceeded bound.
401Authentication is missing or invalid.
403Permission or entitlement denied.
404Unknown or out-of-tenant resource; both use the same response shape.
405Request method is not allowed for this route.
409State, uniqueness, active-reference, or idempotency conflict.
422Provider binding, endpoint, path, credential state, or verification rejected.
503Storage, encryption key, entitlement, verifier, timeout, or cancellation 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/tenant-scopes/{tenant_scope_id}/origin-auth/credentials/{credential_id}

Read one redacted credential head

operationId
getOriginAuthCredential
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:origin_auth.read

Parameters

getOriginAuthCredential Parameters
NameInTypeRequiredDescription
tenant_scope_idpathstring(uuid)Yes—
credential_idpathstring(uuid)Yes—
X-Request-IDheaderstringNo—
X-Trace-IDheaderstringNo—

Responses

getOriginAuthCredential Responses
StatusDescription
200Redacted credential head.

Fields:id: string(uuid) tenant_scope_id: string(uuid) provider: string: s3 / oss / cos name: string status: string: pending / verified / disabled / deleted revision: integer revision_ref: string(uuid) not_before: string(date-time) expires_at: string(date-time) verified_at?: string(date-time) created_at: string(date-time) updated_at: string(date-time)

400Unknown field, malformed UUID/body/header/query, invalid cursor, or exceeded bound.
401Authentication is missing or invalid.
403Permission or entitlement denied.
404Unknown or out-of-tenant resource; both use the same response shape.
405Request method is not allowed for this route.
503Storage, encryption key, entitlement, verifier, timeout, or cancellation 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

DELETE /v1/tenant-scopes/{tenant_scope_id}/origin-auth/credentials/{credential_id}

Append a credential tombstone revision

operationId
deleteOriginAuthCredential
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:origin_auth.manage

Description (from the contract)

The body must be exactly an empty JSON object. A credential referenced by a currently enabled rule cannot be deleted. Historical publication rows and prior encrypted revisions are not mutated.

Parameters

deleteOriginAuthCredential Parameters
NameInTypeRequiredDescription
tenant_scope_idpathstring(uuid)Yes—
credential_idpathstring(uuid)Yes—
X-Request-IDheaderstringNo—
X-Trace-IDheaderstringNo—
Idempotency-KeyheaderstringYes—
If-MatchheaderstringYesQuoted positive decimal current resource revision.

Request body

application/json · Required:Yes

Responses

deleteOriginAuthCredential Responses
StatusDescription
200Credential revision appended.

Fields:id: string(uuid) tenant_scope_id: string(uuid) provider: string: s3 / oss / cos name: string status: string: pending / verified / disabled / deleted revision: integer revision_ref: string(uuid) not_before: string(date-time) expires_at: string(date-time) verified_at?: string(date-time) created_at: string(date-time) updated_at: string(date-time)

400Unknown field, malformed UUID/body/header/query, invalid cursor, or exceeded bound.
401Authentication is missing or invalid.
403Permission or entitlement denied.
404Unknown or out-of-tenant resource; both use the same response shape.
405Request method is not allowed for this route.
409State, uniqueness, active-reference, or idempotency conflict.
412If-Match does not equal the current revision.
422Provider binding, endpoint, path, credential state, or verification rejected.
503Storage, encryption key, entitlement, verifier, timeout, or cancellation 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.
  • 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

POST /v1/tenant-scopes/{tenant_scope_id}/origin-auth/credentials/{credential_id}/disable

Append a disabled credential revision

operationId
disableOriginAuthCredential
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:origin_auth.manage

Description (from the contract)

The body must be exactly an empty JSON object. A credential referenced by an enabled rule must first be removed from or disabled in that rule.

Parameters

disableOriginAuthCredential Parameters
NameInTypeRequiredDescription
tenant_scope_idpathstring(uuid)Yes—
credential_idpathstring(uuid)Yes—
X-Request-IDheaderstringNo—
X-Trace-IDheaderstringNo—
Idempotency-KeyheaderstringYes—
If-MatchheaderstringYesQuoted positive decimal current resource revision.

Request body

application/json · Required:Yes

Responses

disableOriginAuthCredential Responses
StatusDescription
200Credential revision appended.

Fields:id: string(uuid) tenant_scope_id: string(uuid) provider: string: s3 / oss / cos name: string status: string: pending / verified / disabled / deleted revision: integer revision_ref: string(uuid) not_before: string(date-time) expires_at: string(date-time) verified_at?: string(date-time) created_at: string(date-time) updated_at: string(date-time)

400Unknown field, malformed UUID/body/header/query, invalid cursor, or exceeded bound.
401Authentication is missing or invalid.
403Permission or entitlement denied.
404Unknown or out-of-tenant resource; both use the same response shape.
405Request method is not allowed for this route.
409State, uniqueness, active-reference, or idempotency conflict.
412If-Match does not equal the current revision.
503Storage, encryption key, entitlement, verifier, timeout, or cancellation 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.
  • 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

POST /v1/tenant-scopes/{tenant_scope_id}/origin-auth/credentials/{credential_id}/replace

Encrypt replacement material with the active envelope key

operationId
replaceOriginAuthCredential
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:origin_auth.manage

Parameters

replaceOriginAuthCredential Parameters
NameInTypeRequiredDescription
tenant_scope_idpathstring(uuid)Yes—
credential_idpathstring(uuid)Yes—
X-Request-IDheaderstringNo—
X-Trace-IDheaderstringNo—
Idempotency-KeyheaderstringYes—
If-MatchheaderstringYesQuoted positive decimal current resource revision.

Request body

application/json · Required:Yes

replaceOriginAuthCredential Request body
NameTypeRequiredDescription
secretCredentialSecretYes—

Responses

replaceOriginAuthCredential Responses
StatusDescription
200Credential revision appended.

Fields:id: string(uuid) tenant_scope_id: string(uuid) provider: string: s3 / oss / cos name: string status: string: pending / verified / disabled / deleted revision: integer revision_ref: string(uuid) not_before: string(date-time) expires_at: string(date-time) verified_at?: string(date-time) created_at: string(date-time) updated_at: string(date-time)

400Unknown field, malformed UUID/body/header/query, invalid cursor, or exceeded bound.
401Authentication is missing or invalid.
403Permission or entitlement denied.
404Unknown or out-of-tenant resource; both use the same response shape.
405Request method is not allowed for this route.
409State, uniqueness, active-reference, or idempotency conflict.
412If-Match does not equal the current revision.
422Provider binding, endpoint, path, credential state, or verification rejected.
503Storage, encryption key, entitlement, verifier, timeout, or cancellation 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.
  • 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

POST /v1/tenant-scopes/{tenant_scope_id}/origin-auth/credentials/{credential_id}/verify

Invoke the injected verifier and append a verified revision

operationId
verifyOriginAuthCredential
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:origin_auth.manage

Description (from the contract)

The body must be exactly an empty JSON object. If no real verifier is configured, the response is 503 and the credential remains pending. This endpoint never treats schema validation or a synthetic network probe as successful provider verification.

Parameters

verifyOriginAuthCredential Parameters
NameInTypeRequiredDescription
tenant_scope_idpathstring(uuid)Yes—
credential_idpathstring(uuid)Yes—
X-Request-IDheaderstringNo—
X-Trace-IDheaderstringNo—
Idempotency-KeyheaderstringYes—
If-MatchheaderstringYesQuoted positive decimal current resource revision.

Request body

application/json · Required:Yes

Responses

verifyOriginAuthCredential Responses
StatusDescription
200Credential revision appended.

Fields:id: string(uuid) tenant_scope_id: string(uuid) provider: string: s3 / oss / cos name: string status: string: pending / verified / disabled / deleted revision: integer revision_ref: string(uuid) not_before: string(date-time) expires_at: string(date-time) verified_at?: string(date-time) created_at: string(date-time) updated_at: string(date-time)

400Unknown field, malformed UUID/body/header/query, invalid cursor, or exceeded bound.
401Authentication is missing or invalid.
403Permission or entitlement denied.
404Unknown or out-of-tenant resource; both use the same response shape.
405Request method is not allowed for this route.
409State, uniqueness, active-reference, or idempotency conflict.
412If-Match does not equal the current revision.
422Provider binding, endpoint, path, credential state, or verification rejected.
503Storage, encryption key, entitlement, verifier, timeout, or cancellation 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.
  • 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

POST /v1/tenant-scopes/{tenant_scope_id}/origin-auth/edge-publications

发布租户作用域的源站鉴权配置

operationId
publishOriginAuthEdgeConfiguration
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:edge_publications.manage origin_auth.manage

Description (from the contract)

Requires a platform session with edge_publications.manage and origin_auth.manage. If-Match is the exact latest source revision. The server locks each target node and its active recipient key, produces one signed HPKE artifact per node, and commits the immutable config, rollout, deployment commands, and outbox records in one transaction. An outcome_unknown response may be retried only with the unchanged body, path, If-Match, Idempotency-Key, X-Request-ID, X-Correlation-ID, Traceparent, and X-Task-ID.

Parameters

publishOriginAuthEdgeConfiguration Parameters
NameInTypeRequiredDescription
tenant_scope_idpathstring(uuid)Yes—
If-MatchheaderstringYes当前源配置 revision 的强 ETag,例如 "7"。
Idempotency-KeyheaderstringYes—
X-Request-IDheaderstring(uuid)Yes—
X-Correlation-IDheaderstring(uuid)No—
TraceparentheaderstringYes—
X-Task-IDheaderstringNo—

Request body

application/json · Required:Yes

publishOriginAuthEdgeConfiguration Request body
NameTypeRequiredDescription
node_idsarray<string(uuid)>Yes—
health_checkHealthCheckYes—
deadlinestring(date-time)Yes—

Responses

publishOriginAuthEdgeConfiguration Responses
StatusDescription
201创建成功,或返回完全相同请求的持久化结果

Fields:tenant_id: string(uuid) tenant_scope_id: string(uuid) publication_id: string(uuid) source_publication_id: string(uuid) source_revision: integer(int64) config_version_id: string(uuid) rollout_id: string(uuid) config_snapshot_sha256: string artifact_manifest_sha256: string recipient_binding_sha256: string node_count: integer created_at: string(date-time) replayed?: boolean

400请求格式或参数无效
401会话无效或已撤销
403作用域或权限拒绝
404源配置或发布记录不存在
405方法不受支持
409幂等键已绑定不同请求
412If-Match 不等于最新源配置 revision
422目标节点、接收密钥或源配置当前不可发布
502持久化事实未通过严格身份校验
503origin_auth_edge_publication_outcome_unknown; only the exact request described by retry may be repeated.

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.
  • 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/tenant-scopes/{tenant_scope_id}/origin-auth/edge-publications/{publication_id}

读取一个不可变源站鉴权发布结果

operationId
getOriginAuthEdgePublication
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:edge_publications.read origin_auth.read

Description (from the contract)

Requires edge_publications.read and origin_auth.read. The session and both grants are checked again in the read transaction. The result is reconstructed only from the immutable rollout, config, source snapshot, per-node artifact, recipient-key, and deployment-command facts. Cross-scope or other secret-rollout subtypes are rejected.

Parameters

getOriginAuthEdgePublication Parameters
NameInTypeRequiredDescription
tenant_scope_idpathstring(uuid)Yes—
publication_idpathstring(uuid)Yes—
X-Request-IDheaderstring(uuid)No—

Responses

getOriginAuthEdgePublication Responses
StatusDescription
200不可变发布结果

Fields:tenant_id: string(uuid) tenant_scope_id: string(uuid) publication_id: string(uuid) source_publication_id: string(uuid) source_revision: integer(int64) config_version_id: string(uuid) rollout_id: string(uuid) config_snapshot_sha256: string artifact_manifest_sha256: string recipient_binding_sha256: string node_count: integer created_at: string(date-time) replayed?: boolean

400请求格式或参数无效
401会话无效或已撤销
403作用域或权限拒绝
404源配置或发布记录不存在
405方法不受支持
502持久化事实未通过严格身份校验
503服务暂不可用

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

GET /v1/tenant-scopes/{tenant_scope_id}/origin-auth/publications

Read the latest deterministic secret-free snapshot

operationId
getLatestOriginAuthPublication
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:origin_auth.read

Parameters

getLatestOriginAuthPublication Parameters
NameInTypeRequiredDescription
tenant_scope_idpathstring(uuid)Yes—
X-Request-IDheaderstringNo—
X-Trace-IDheaderstringNo—

Responses

getLatestOriginAuthPublication Responses
StatusDescription
200Latest publication.

Fields:id: string(uuid) tenant_scope_id: string(uuid) revision: integer snapshot_hash: string previous_hash?: string snapshot: PublicationSnapshot created_at: string(date-time)

400Unknown field, malformed UUID/body/header/query, invalid cursor, or exceeded bound.
401Authentication is missing or invalid.
403Permission or entitlement denied.
404Unknown or out-of-tenant resource; both use the same response shape.
405Request method is not allowed for this route.
503Storage, encryption key, entitlement, verifier, timeout, or cancellation 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/tenant-scopes/{tenant_scope_id}/origin-auth/publications

Append the next tenant publication snapshot

operationId
createOriginAuthPublication
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:origin_auth.manage

Description (from the contract)

If-Match is the current publication revision and may be "0" for the first snapshot. The body must be exactly an empty JSON object. The snapshot contains Edge-aligned public rule fields and opaque credential revision references only. It is not an Edge secret file or deployment.

Parameters

createOriginAuthPublication Parameters
NameInTypeRequiredDescription
tenant_scope_idpathstring(uuid)Yes—
X-Request-IDheaderstringNo—
X-Trace-IDheaderstringNo—
Idempotency-KeyheaderstringYes—
If-MatchheaderstringYesQuoted decimal current publication revision; first write uses "0".

Request body

application/json · Required:Yes

Responses

createOriginAuthPublication Responses
StatusDescription
201Publication appended.

Fields:id: string(uuid) tenant_scope_id: string(uuid) revision: integer snapshot_hash: string previous_hash?: string snapshot: PublicationSnapshot created_at: string(date-time)

400Unknown field, malformed UUID/body/header/query, invalid cursor, or exceeded bound.
401Authentication is missing or invalid.
403Permission or entitlement denied.
404Unknown or out-of-tenant resource; both use the same response shape.
405Request method is not allowed for this route.
409State, uniqueness, active-reference, or idempotency conflict.
412If-Match does not equal the current revision.
422Provider binding, endpoint, path, credential state, or verification rejected.
503Storage, encryption key, entitlement, verifier, timeout, or cancellation 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.
  • 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/tenant-scopes/{tenant_scope_id}/origin-auth/rules

List current rule revisions

operationId
listOriginAuthRules
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:origin_auth.read

Parameters

listOriginAuthRules Parameters
NameInTypeRequiredDescription
tenant_scope_idpathstring(uuid)Yes—
X-Request-IDheaderstringNo—
X-Trace-IDheaderstringNo—
site_idquerystring(uuid)No—
enabledquerybooleanNo—
limitqueryintegerNo—
cursorquerystringNoOpaque stable keyset cursor, at most 512 bytes.

Responses

listOriginAuthRules Responses
StatusDescription
200Stable rule page.

Fields:items: array<Rule> next_cursor?: string

400Unknown field, malformed UUID/body/header/query, invalid cursor, or exceeded bound.
401Authentication is missing or invalid.
403Permission or entitlement denied.
404Unknown or out-of-tenant resource; both use the same response shape.
405Request method is not allowed for this route.
503Storage, encryption key, entitlement, verifier, timeout, or cancellation 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/tenant-scopes/{tenant_scope_id}/origin-auth/rules

Create a tenant, site, and source-bound rule

operationId
createOriginAuthRule
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:origin_auth.manage

Description (from the contract)

The source must be an HTTPS port 443 source in the same tenant and its host must exactly equal the normalized endpoint host. An enabled rule can reference only a verified credential revision with matching provider and sufficient validity.

Parameters

createOriginAuthRule Parameters
NameInTypeRequiredDescription
tenant_scope_idpathstring(uuid)Yes—
X-Request-IDheaderstringNo—
X-Trace-IDheaderstringNo—
Idempotency-KeyheaderstringYes—

Request body

application/json · Required:Yes

createOriginAuthRule Request body
NameTypeRequiredDescription
site_idstring(uuid)Yes—
source_positionintegerYes—
configRuleConfigYes—
enabledbooleanYes—

Responses

createOriginAuthRule Responses
StatusDescription
201Rule created.

Fields:id: string(uuid) tenant_scope_id: string(uuid) site_id: string(uuid) source_position: integer provider: string: s3 / oss / cos algorithm: string: aws4-hmac-sha256 / oss4-hmac-sha256 / cos-hmac-sha1 endpoint: string(uri) bucket: string path_prefix: string region: string service: string signature_ttl_seconds: integer egress_policy_reference?: string current_credential: CredentialReference previous_credential?: CredentialReference activate_current_at?: string(date-time) enabled: boolean deleted: boolean revision: integer created_at: string(date-time) updated_at: string(date-time)

400Unknown field, malformed UUID/body/header/query, invalid cursor, or exceeded bound.
401Authentication is missing or invalid.
403Permission or entitlement denied.
404Unknown or out-of-tenant resource; both use the same response shape.
405Request method is not allowed for this route.
409State, uniqueness, active-reference, or idempotency conflict.
422Provider binding, endpoint, path, credential state, or verification rejected.
503Storage, encryption key, entitlement, verifier, timeout, or cancellation 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/tenant-scopes/{tenant_scope_id}/origin-auth/rules/{rule_id}

Read one current rule revision

operationId
getOriginAuthRule
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:origin_auth.read

Parameters

getOriginAuthRule Parameters
NameInTypeRequiredDescription
tenant_scope_idpathstring(uuid)Yes—
rule_idpathstring(uuid)Yes—
X-Request-IDheaderstringNo—
X-Trace-IDheaderstringNo—

Responses

getOriginAuthRule Responses
StatusDescription
200Current rule revision.

Fields:id: string(uuid) tenant_scope_id: string(uuid) site_id: string(uuid) source_position: integer provider: string: s3 / oss / cos algorithm: string: aws4-hmac-sha256 / oss4-hmac-sha256 / cos-hmac-sha1 endpoint: string(uri) bucket: string path_prefix: string region: string service: string signature_ttl_seconds: integer egress_policy_reference?: string current_credential: CredentialReference previous_credential?: CredentialReference activate_current_at?: string(date-time) enabled: boolean deleted: boolean revision: integer created_at: string(date-time) updated_at: string(date-time)

400Unknown field, malformed UUID/body/header/query, invalid cursor, or exceeded bound.
401Authentication is missing or invalid.
403Permission or entitlement denied.
404Unknown or out-of-tenant resource; both use the same response shape.
405Request method is not allowed for this route.
503Storage, encryption key, entitlement, verifier, timeout, or cancellation 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

PATCH /v1/tenant-scopes/{tenant_scope_id}/origin-auth/rules/{rule_id}

Append a rule configuration revision

operationId
updateOriginAuthRule
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:origin_auth.manage

Parameters

updateOriginAuthRule Parameters
NameInTypeRequiredDescription
tenant_scope_idpathstring(uuid)Yes—
rule_idpathstring(uuid)Yes—
X-Request-IDheaderstringNo—
X-Trace-IDheaderstringNo—
Idempotency-KeyheaderstringYes—
If-MatchheaderstringYesQuoted positive decimal current resource revision.

Request body

application/json · Required:Yes

updateOriginAuthRule Request body
NameTypeRequiredDescription
configRuleConfigYes—

Responses

updateOriginAuthRule Responses
StatusDescription
200Rule revision appended.

Fields:id: string(uuid) tenant_scope_id: string(uuid) site_id: string(uuid) source_position: integer provider: string: s3 / oss / cos algorithm: string: aws4-hmac-sha256 / oss4-hmac-sha256 / cos-hmac-sha1 endpoint: string(uri) bucket: string path_prefix: string region: string service: string signature_ttl_seconds: integer egress_policy_reference?: string current_credential: CredentialReference previous_credential?: CredentialReference activate_current_at?: string(date-time) enabled: boolean deleted: boolean revision: integer created_at: string(date-time) updated_at: string(date-time)

400Unknown field, malformed UUID/body/header/query, invalid cursor, or exceeded bound.
401Authentication is missing or invalid.
403Permission or entitlement denied.
404Unknown or out-of-tenant resource; both use the same response shape.
405Request method is not allowed for this route.
409State, uniqueness, active-reference, or idempotency conflict.
412If-Match does not equal the current revision.
422Provider binding, endpoint, path, credential state, or verification rejected.
503Storage, encryption key, entitlement, verifier, timeout, or cancellation 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.
  • 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

DELETE /v1/tenant-scopes/{tenant_scope_id}/origin-auth/rules/{rule_id}

Append a rule tombstone revision

operationId
deleteOriginAuthRule
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:origin_auth.manage

Parameters

deleteOriginAuthRule Parameters
NameInTypeRequiredDescription
tenant_scope_idpathstring(uuid)Yes—
rule_idpathstring(uuid)Yes—
X-Request-IDheaderstringNo—
X-Trace-IDheaderstringNo—
Idempotency-KeyheaderstringYes—
If-MatchheaderstringYesQuoted positive decimal current resource revision.

Request body

application/json · Required:Yes

Responses

deleteOriginAuthRule Responses
StatusDescription
200Rule revision appended.

Fields:id: string(uuid) tenant_scope_id: string(uuid) site_id: string(uuid) source_position: integer provider: string: s3 / oss / cos algorithm: string: aws4-hmac-sha256 / oss4-hmac-sha256 / cos-hmac-sha1 endpoint: string(uri) bucket: string path_prefix: string region: string service: string signature_ttl_seconds: integer egress_policy_reference?: string current_credential: CredentialReference previous_credential?: CredentialReference activate_current_at?: string(date-time) enabled: boolean deleted: boolean revision: integer created_at: string(date-time) updated_at: string(date-time)

400Unknown field, malformed UUID/body/header/query, invalid cursor, or exceeded bound.
401Authentication is missing or invalid.
403Permission or entitlement denied.
404Unknown or out-of-tenant resource; both use the same response shape.
405Request method is not allowed for this route.
409State, uniqueness, active-reference, or idempotency conflict.
412If-Match does not equal the current revision.
503Storage, encryption key, entitlement, verifier, timeout, or cancellation 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.
  • 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

POST /v1/tenant-scopes/{tenant_scope_id}/origin-auth/rules/{rule_id}/disable

Disable a rule by revision CAS

operationId
disableOriginAuthRule
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:origin_auth.manage

Parameters

disableOriginAuthRule Parameters
NameInTypeRequiredDescription
tenant_scope_idpathstring(uuid)Yes—
rule_idpathstring(uuid)Yes—
X-Request-IDheaderstringNo—
X-Trace-IDheaderstringNo—
Idempotency-KeyheaderstringYes—
If-MatchheaderstringYesQuoted positive decimal current resource revision.

Request body

application/json · Required:Yes

Responses

disableOriginAuthRule Responses
StatusDescription
200Rule revision appended.

Fields:id: string(uuid) tenant_scope_id: string(uuid) site_id: string(uuid) source_position: integer provider: string: s3 / oss / cos algorithm: string: aws4-hmac-sha256 / oss4-hmac-sha256 / cos-hmac-sha1 endpoint: string(uri) bucket: string path_prefix: string region: string service: string signature_ttl_seconds: integer egress_policy_reference?: string current_credential: CredentialReference previous_credential?: CredentialReference activate_current_at?: string(date-time) enabled: boolean deleted: boolean revision: integer created_at: string(date-time) updated_at: string(date-time)

400Unknown field, malformed UUID/body/header/query, invalid cursor, or exceeded bound.
401Authentication is missing or invalid.
403Permission or entitlement denied.
404Unknown or out-of-tenant resource; both use the same response shape.
405Request method is not allowed for this route.
409State, uniqueness, active-reference, or idempotency conflict.
412If-Match does not equal the current revision.
503Storage, encryption key, entitlement, verifier, timeout, or cancellation 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.
  • 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

POST /v1/tenant-scopes/{tenant_scope_id}/origin-auth/rules/{rule_id}/enable

Enable a rule after verified credential gates pass

operationId
enableOriginAuthRule
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:origin_auth.manage

Parameters

enableOriginAuthRule Parameters
NameInTypeRequiredDescription
tenant_scope_idpathstring(uuid)Yes—
rule_idpathstring(uuid)Yes—
X-Request-IDheaderstringNo—
X-Trace-IDheaderstringNo—
Idempotency-KeyheaderstringYes—
If-MatchheaderstringYesQuoted positive decimal current resource revision.

Request body

application/json · Required:Yes

Responses

enableOriginAuthRule Responses
StatusDescription
200Rule revision appended.

Fields:id: string(uuid) tenant_scope_id: string(uuid) site_id: string(uuid) source_position: integer provider: string: s3 / oss / cos algorithm: string: aws4-hmac-sha256 / oss4-hmac-sha256 / cos-hmac-sha1 endpoint: string(uri) bucket: string path_prefix: string region: string service: string signature_ttl_seconds: integer egress_policy_reference?: string current_credential: CredentialReference previous_credential?: CredentialReference activate_current_at?: string(date-time) enabled: boolean deleted: boolean revision: integer created_at: string(date-time) updated_at: string(date-time)

400Unknown field, malformed UUID/body/header/query, invalid cursor, or exceeded bound.
401Authentication is missing or invalid.
403Permission or entitlement denied.
404Unknown or out-of-tenant resource; both use the same response shape.
405Request method is not allowed for this route.
409State, uniqueness, active-reference, or idempotency conflict.
412If-Match does not equal the current revision.
422Provider binding, endpoint, path, credential state, or verification rejected.
503Storage, encryption key, entitlement, verifier, timeout, or cancellation 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.
  • 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

POST /v1/tenant-scopes/{tenant_scope_id}/origin-auth/rules/{rule_id}/rotate

Schedule current and previous credential cutover

operationId
rotateOriginAuthRuleCredential
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:origin_auth.manage

Description (from the contract)

The new current and prior current revisions must be distinct, verified, provider-matched, and valid through activation plus signature TTL. Activation must be in the future and no more than 30 days away.

Parameters

rotateOriginAuthRuleCredential Parameters
NameInTypeRequiredDescription
tenant_scope_idpathstring(uuid)Yes—
rule_idpathstring(uuid)Yes—
X-Request-IDheaderstringNo—
X-Trace-IDheaderstringNo—
Idempotency-KeyheaderstringYes—
If-MatchheaderstringYesQuoted positive decimal current resource revision.

Request body

application/json · Required:Yes

rotateOriginAuthRuleCredential Request body
NameTypeRequiredDescription
current_credentialCredentialReferenceYes—
activate_current_atstring(date-time)Yes—

Responses

rotateOriginAuthRuleCredential Responses
StatusDescription
200Rule revision appended.

Fields:id: string(uuid) tenant_scope_id: string(uuid) site_id: string(uuid) source_position: integer provider: string: s3 / oss / cos algorithm: string: aws4-hmac-sha256 / oss4-hmac-sha256 / cos-hmac-sha1 endpoint: string(uri) bucket: string path_prefix: string region: string service: string signature_ttl_seconds: integer egress_policy_reference?: string current_credential: CredentialReference previous_credential?: CredentialReference activate_current_at?: string(date-time) enabled: boolean deleted: boolean revision: integer created_at: string(date-time) updated_at: string(date-time)

400Unknown field, malformed UUID/body/header/query, invalid cursor, or exceeded bound.
401Authentication is missing or invalid.
403Permission or entitlement denied.
404Unknown or out-of-tenant resource; both use the same response shape.
405Request method is not allowed for this route.
409State, uniqueness, active-reference, or idempotency conflict.
412If-Match does not equal the current revision.
422Provider binding, endpoint, path, credential state, or verification rejected.
503Storage, encryption key, entitlement, verifier, timeout, or cancellation 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.
  • 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/tenant-scopes/{tenant_scope_id}/plugin-installations

List tenant plugin installation authorization state

operationId
listPluginInstallations
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

The contract has no separate permission annotation; see the description below and the 403 response.

Parameters

listPluginInstallations Parameters
NameInTypeRequiredDescription
tenant_scope_idpathstring(uuid)Yes—
X-Request-IDheaderstringYes—
limitqueryintegerNo—
cursorquerystringNo—
statusquerystring: pending_confirmation / authorized / installing / enabled / disabled / upgrade_failed_lkg_preserved / uninstalledNo—
plugin_idquerystringNo—

Responses

listPluginInstallations Responses
StatusDescription
200Stable keyset page

Fields:items: array<PluginInstallation> next_cursor?: string

400Stable localized-client error envelope
401Stable localized-client error envelope
403Stable localized-client error envelope
502Stable localized-client error envelope

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.

↑ Back to list

GET /v1/tenant-scopes/{tenant_scope_id}/plugin-installations/{authorization_id}

Read one tenant plugin installation authorization

operationId
getPluginInstallation
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

The contract has no separate permission annotation; see the description below and the 403 response.

Parameters

getPluginInstallation Parameters
NameInTypeRequiredDescription
tenant_scope_idpathstring(uuid)Yes—
authorization_idpathstring(uuid)Yes—
X-Request-IDheaderstringYes—

Responses

getPluginInstallation Responses
StatusDescription
200Plugin installation authorization state

Fields:schema: const cdnca.control.plugin-installation/v1 tenant_scope_id: string(uuid) authorization_id: string(uuid) installation_id: string(uuid) verification_id: string(uuid) plugin_id: string resource_scope: string: platform / tenant entrypoint_type: string: theme / rule_pack / external_https / ui_page version: string manifest_sha256: string configuration_schema_sha256: string manifest_scopes: array<string> approved_scopes: array<string> sensitive_scopes: array<string> new_scopes: array<string> status: string: pending_confirmation / authorized / installing / enabled / disabled / upgrade_failed_lkg_preserved / uninstalled revision: integer identity_generation: integer lkg_verification_id: string(uuid) | null lkg_version: string | null stable_reason_code: string | null updated_at: string(date-time) authorization_status?: string: pending_confirmation / authorized / enabled / disabled paused_by?: string: installation / operator / service paused_reason?: string available_upgrade?: PluginInstallationAvailableUpgrade

401Stable localized-client error envelope
403Stable localized-client error envelope
404Stable localized-client error envelope
502Stable localized-client error envelope

What to do on failure

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

↑ Back to list

POST /v1/tenant-scopes/{tenant_scope_id}/plugin-installations/{authorization_id}/confirm

Confirm declared and sensitive plugin scopes before installation

operationId
confirmPluginInstallation
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

The contract has no separate permission annotation; see the description below and the 403 response.

Parameters

confirmPluginInstallation Parameters
NameInTypeRequiredDescription
tenant_scope_idpathstring(uuid)Yes—
authorization_idpathstring(uuid)Yes—
If-MatchheaderstringYes—
Idempotency-KeyheaderstringYes—
X-Request-IDheaderstringYes—

Request body

application/json · Required:Yes

confirmPluginInstallation Request body
NameTypeRequiredDescription
verification_idstring(uuid)Yes—
approved_scopesarray<string>Yes—
sensitive_permissions_confirmedbooleanYes—
new_permissions_confirmedbooleanYes—

Responses

confirmPluginInstallation Responses
StatusDescription
200Durable mutation snapshot; replay returns the original snapshot

Fields:installation: PluginInstallation

400Stable localized-client error envelope
401Stable localized-client error envelope
403Stable localized-client error envelope
404Stable localized-client error envelope
409Stable localized-client error envelope
422Stable localized-client error envelope
502Stable localized-client error envelope
503Stable localized-client error envelope

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/tenant-scopes/{tenant_scope_id}/plugin-installations/{authorization_id}/disable

Protectively disable an installed plugin without consulting License

operationId
disablePluginInstallation
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

The contract has no separate permission annotation; see the description below and the 403 response.

Parameters

disablePluginInstallation Parameters
NameInTypeRequiredDescription
tenant_scope_idpathstring(uuid)Yes—
authorization_idpathstring(uuid)Yes—
If-MatchheaderstringYes—
Idempotency-KeyheaderstringYes—
X-Request-IDheaderstringYes—

Request body

application/json · Required:Yes

disablePluginInstallation Request body
NameTypeRequiredDescription
reasonstringYes—

Responses

disablePluginInstallation Responses
StatusDescription
200Durable mutation snapshot; replay returns the original snapshot

Fields:installation: PluginInstallation

400Stable localized-client error envelope
401Stable localized-client error envelope
403Stable localized-client error envelope
404Stable localized-client error envelope
409Stable localized-client error envelope
502Stable localized-client error envelope
503Stable localized-client error envelope

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/tenant-scopes/{tenant_scope_id}/plugin-installations/{authorization_id}/uninstall

Revoke local plugin identity and record protective uninstall

operationId
uninstallPluginInstallation
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

The contract has no separate permission annotation; see the description below and the 403 response.

Parameters

uninstallPluginInstallation Parameters
NameInTypeRequiredDescription
tenant_scope_idpathstring(uuid)Yes—
authorization_idpathstring(uuid)Yes—
If-MatchheaderstringYes—
Idempotency-KeyheaderstringYes—
X-Request-IDheaderstringYes—

Request body

application/json · Required:Yes

uninstallPluginInstallation Request body
NameTypeRequiredDescription
reasonstringYes—

Responses

uninstallPluginInstallation Responses
StatusDescription
200Durable mutation snapshot; replay returns the original snapshot

Fields:installation: PluginInstallation

400Stable localized-client error envelope
401Stable localized-client error envelope
403Stable localized-client error envelope
404Stable localized-client error envelope
409Stable localized-client error envelope
502Stable localized-client error envelope
503Stable localized-client error envelope

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/tenant-scopes/{tenant_scope_id}/plugin-installations/{authorization_id}/upgrade

Approve a compatible plugin upgrade and any newly declared scopes

operationId
upgradePluginInstallation
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

The contract has no separate permission annotation; see the description below and the 403 response.

Parameters

upgradePluginInstallation Parameters
NameInTypeRequiredDescription
tenant_scope_idpathstring(uuid)Yes—
authorization_idpathstring(uuid)Yes—
If-MatchheaderstringYes—
Idempotency-KeyheaderstringYes—
X-Request-IDheaderstringYes—

Request body

application/json · Required:Yes

upgradePluginInstallation Request body
NameTypeRequiredDescription
verification_idstring(uuid)Yes—
approved_scopesarray<string>Yes—
sensitive_permissions_confirmedbooleanYes—
new_permissions_confirmedbooleanYes—

Responses

upgradePluginInstallation Responses
StatusDescription
200Durable mutation snapshot; replay returns the original snapshot

Fields:installation: PluginInstallation

400Stable localized-client error envelope
401Stable localized-client error envelope
403Stable localized-client error envelope
404Stable localized-client error envelope
409Stable localized-client error envelope
422Stable localized-client error envelope
502Stable localized-client error envelope
503Stable localized-client error envelope

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/tenant-scopes/{tenant_scope_id}/plugin-webhook-subscriptions

List webhook subscriptions

operationId
listPluginWebhookSubscriptions
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:plugin_webhooks.read

Parameters

listPluginWebhookSubscriptions Parameters
NameInTypeRequiredDescription
tenant_scope_idpathstring(uuid)Yes—
cursorquerystringNo—
limitqueryintegerNo—

Responses

listPluginWebhookSubscriptions Responses
StatusDescription
200Subscription page

Fields:items: array<Subscription> next_cursor?: string

400Validation failed
401Authentication required
403Permission or tenant scope denied
404Resource not found
503Store, secret, or write result 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/tenant-scopes/{tenant_scope_id}/plugin-webhook-subscriptions

Create a webhook subscription and one-time secret

operationId
createPluginWebhookSubscription
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:plugin_webhooks.manage

Description (from the contract)

The secret is returned only through the encrypted receipt window and must never be persisted by the browser. Reusing the same idempotency key replays the same receipt until it expires.

Parameters

createPluginWebhookSubscription Parameters
NameInTypeRequiredDescription
tenant_scope_idpathstring(uuid)Yes—
Idempotency-KeyheaderstringYes—

Request body

application/json · Required:Yes

createPluginWebhookSubscription Request body
NameTypeRequiredDescription
namestringYes—
target_urlstring(uri)YesHTTPS target using an ASCII DNS hostname and either no explicit port or port 443. IP literals, IDNA xn-- labels, userinfo, query strings, fragments and other ports are forbidden. This pattern constrains request syntax only; server/runtime validation remains authoritative for public DNS resolution, address ranges, certificates, redirects and canonical paths.
event_typesarray<string: io.cdnca.certificate.v1.expiry_reached / io.cdnca.certificate.v1.status_changed / io.cdnca.deployment.v1.status_changed / io.cdnca.node.v1.status_changed / io.cdnca.security.v1.incident_detected / io.cdnca.site.v1.updated / io.cdnca.usage.v1.threshold_reached / io.cdnca.webhook.v1.test>Yes—
installation_authorization_idobjectNoOptional enabled tenant installation authorization. Required when subscribing to non-test domain events; test-only subscriptions must omit it.
site_idsarray<string(uuid)>NoOptional site filter. When present the subscription receives only site-bound events (site.updated, security.incident_detected) of these tenant sites and no tenant-level events; at least one site-bound event type is required. Omit for all events. Immutable.

Responses

createPluginWebhookSubscription Responses
StatusDescription
201Created subscription with one-time secret

Fields:subscription: Subscription secret: string

400Validation failed
401Authentication required
403Permission or tenant scope denied
409State or idempotency conflict
422Target or entitlement rejected
429Rate limited
503Store, secret, or write result 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.
  • 429 Rate limited: wait, then retry with lower concurrency.
  • 503 A dependency is unavailable: retry later with the original Idempotency-Key.

↑ Back to list

GET /v1/tenant-scopes/{tenant_scope_id}/plugin-webhook-subscriptions/{subscription_id}

Get a webhook subscription

operationId
getPluginWebhookSubscription
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:plugin_webhooks.read

Parameters

getPluginWebhookSubscription Parameters
NameInTypeRequiredDescription
tenant_scope_idpathstring(uuid)Yes—
subscription_idpathstring(uuid)Yes—

Responses

getPluginWebhookSubscription Responses
StatusDescription
200Subscription

Fields:id: string(uuid) tenant_scope_id: string(uuid) name: string target_url: string(uri) event_types: array<string: io.cdnca.certificate.v1.expiry_reached / io.cdnca.certificate.v1.status_changed / io.cdnca.deployment.v1.status_changed / io.cdnca.node.v1.status_changed / io.cdnca.security.v1.incident_detected / io.cdnca.site.v1.updated / io.cdnca.usage.v1.threshold_reached / io.cdnca.webhook.v1.test> status: string: active / revoked revision: integer active_secret_version_id: string(uuid) installation_authorization_id?: object installation_id?: object plugin_id?: string site_ids?: array<string(uuid)> created_at: string(date-time) updated_at: string(date-time)

401Authentication required
403Permission or tenant scope denied
404Resource not found
503Store, secret, or write result unavailable

What to do on failure

  • 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

GET /v1/tenant-scopes/{tenant_scope_id}/plugin-webhook-subscriptions/{subscription_id}/deliveries

List subscription deliveries

operationId
listPluginWebhookDeliveries
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:plugin_webhooks.read

Parameters

listPluginWebhookDeliveries Parameters
NameInTypeRequiredDescription
tenant_scope_idpathstring(uuid)Yes—
subscription_idpathstring(uuid)Yes—
cursorquerystringNo—
limitqueryintegerNo—

Responses

listPluginWebhookDeliveries Responses
StatusDescription
200Delivery page

Fields:items: array<Delivery> next_cursor?: string

400Validation failed
401Authentication required
403Permission or tenant scope denied
404Resource not found
503Store, secret, or write result 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

GET /v1/tenant-scopes/{tenant_scope_id}/plugin-webhook-subscriptions/{subscription_id}/deliveries/{delivery_id}

Get a delivery status

operationId
getPluginWebhookDelivery
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:plugin_webhooks.read

Parameters

getPluginWebhookDelivery Parameters
NameInTypeRequiredDescription
tenant_scope_idpathstring(uuid)Yes—
subscription_idpathstring(uuid)Yes—
delivery_idpathstring(uuid)Yes—

Responses

getPluginWebhookDelivery Responses
StatusDescription
200Delivery

Fields:id: string(uuid) subscription_id: string(uuid) event_id: string(uuid) replay_of?: string(uuid) status: string: pending / queued / claimed / retry_scheduled / delivered / dead_letter_pending / dead_lettered / revoked attempt_count: integer next_attempt_at?: string(date-time) created_at: string(date-time) completed_at?: string(date-time)

401Authentication required
403Permission or tenant scope denied
404Resource not found
503Store, secret, or write result unavailable

What to do on failure

  • 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/tenant-scopes/{tenant_scope_id}/plugin-webhook-subscriptions/{subscription_id}/deliveries/{delivery_id}/replays

Replay a delivered or dead-lettered delivery

operationId
replayPluginWebhookDelivery
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:plugin_webhooks.manage

Parameters

replayPluginWebhookDelivery Parameters
NameInTypeRequiredDescription
tenant_scope_idpathstring(uuid)Yes—
subscription_idpathstring(uuid)Yes—
delivery_idpathstring(uuid)Yes—
Idempotency-KeyheaderstringYes—

Request body

application/json · Required:Yes

Responses

replayPluginWebhookDelivery Responses
StatusDescription
202Accepted delivery

Fields:delivery: Delivery

400Validation failed
401Authentication required
403Permission or tenant scope denied
404Resource not found
409State or idempotency conflict
422Target or entitlement rejected
429Rate limited
503Store, secret, or write result 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.
  • 429 Rate limited: wait, then retry with lower concurrency.
  • 503 A dependency is unavailable: retry later with the original Idempotency-Key.

↑ Back to list

POST /v1/tenant-scopes/{tenant_scope_id}/plugin-webhook-subscriptions/{subscription_id}/delivery-replays

Replay the terminal deliveries of a time range

operationId
replayPluginWebhookDeliveryRange
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:plugin_webhooks.manage

Description (from the contract)

Re-sends every original (non-replay) delivery of this subscription created in [from, to) with a matching status and event type, up to limit. Each replay has the single-delivery guarantees: same event ID, new delivery ID, audit, rate limit, and the database re-checks that the bound installation still holds the event permission and the site filter still selects the event. A per-delivery idempotency key is derived from Idempotency-Key, so retrying the call never replays a delivery twice. Events from before the subscription existed are never sent.

Parameters

replayPluginWebhookDeliveryRange Parameters
NameInTypeRequiredDescription
tenant_scope_idpathstring(uuid)Yes—
subscription_idpathstring(uuid)Yes—
Idempotency-KeyheaderstringYes—

Request body

application/json · Required:Yes

replayPluginWebhookDeliveryRange Request body
NameTypeRequiredDescription
fromstring(date-time)YesOriginal delivery created at or after this time.
tostring(date-time)YesOriginal delivery created before this time; at most 31 days after from.
statusesarray<string: delivered / dead_lettered>NoDefaults to both terminal states; [dead_lettered] re-sends only failed deliveries.
event_typesarray<string: io.cdnca.certificate.v1.expiry_reached / io.cdnca.certificate.v1.status_changed / io.cdnca.deployment.v1.status_changed / io.cdnca.node.v1.status_changed / io.cdnca.security.v1.incident_detected / io.cdnca.site.v1.updated / io.cdnca.usage.v1.threshold_reached / io.cdnca.webhook.v1.test>No—
limitintegerYes—

Responses

replayPluginWebhookDeliveryRange Responses
StatusDescription
202Replay batch outcome.

Fields:items: array<object> remaining: boolean

400Validation failed
401Authentication required
403Permission or tenant scope denied
404Resource not found
409State or idempotency conflict
503Store, secret, or write result 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/tenant-scopes/{tenant_scope_id}/plugin-webhook-subscriptions/{subscription_id}/revoke

Revoke a webhook subscription and fence new deliveries

operationId
revokePluginWebhookSubscription
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:plugin_webhooks.manage

Parameters

revokePluginWebhookSubscription Parameters
NameInTypeRequiredDescription
tenant_scope_idpathstring(uuid)Yes—
subscription_idpathstring(uuid)Yes—
Idempotency-KeyheaderstringYes—
If-MatchheaderstringYes—

Request body

application/json · Required:Yes

Responses

revokePluginWebhookSubscription Responses
StatusDescription
200Updated subscription

Fields:subscription: Subscription

400Validation failed
401Authentication required
403Permission or tenant scope denied
404Resource not found
409State or idempotency conflict
412Revision mismatch
428If-Match is required
503Store, secret, or write result 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.
  • 412 The revision changed: read the latest ETag, decide again, then send the new If-Match.
  • 428 A precondition is missing: read the resource and send If-Match (or the required proof).
  • 503 A dependency is unavailable: retry later with the original Idempotency-Key.

↑ Back to list

POST /v1/tenant-scopes/{tenant_scope_id}/plugin-webhook-subscriptions/{subscription_id}/secret-rotations

Generate a pending secret rotation

operationId
rotatePluginWebhookSecret
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:plugin_webhooks.manage

Parameters

rotatePluginWebhookSecret Parameters
NameInTypeRequiredDescription
tenant_scope_idpathstring(uuid)Yes—
subscription_idpathstring(uuid)Yes—
Idempotency-KeyheaderstringYes—
If-MatchheaderstringYes—

Request body

application/json · Required:Yes

Responses

rotatePluginWebhookSecret Responses
StatusDescription
201Pending secret rotation and one-time secret

Fields:rotation_id: string(uuid) key_id: string(uuid) status: string expires_at: string(date-time) secret: string subscription_revision: integer

400Validation failed
401Authentication required
403Permission or tenant scope denied
404Resource not found
409State or idempotency conflict
412Revision mismatch
422Target or entitlement rejected
428If-Match is required
429Rate limited
503Store, secret, or write result 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.
  • 412 The revision changed: read the latest ETag, decide again, then send the new If-Match.
  • 428 A precondition is missing: read the resource and send If-Match (or the required proof).
  • 429 Rate limited: wait, then retry with lower concurrency.
  • 503 A dependency is unavailable: retry later with the original Idempotency-Key.

↑ Back to list

POST /v1/tenant-scopes/{tenant_scope_id}/plugin-webhook-subscriptions/{subscription_id}/secret-rotations/{rotation_id}/activate

Activate a pending secret rotation

operationId
activatePluginWebhookSecret
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:plugin_webhooks.manage

Parameters

activatePluginWebhookSecret Parameters
NameInTypeRequiredDescription
tenant_scope_idpathstring(uuid)Yes—
subscription_idpathstring(uuid)Yes—
rotation_idpathstring(uuid)Yes—
Idempotency-KeyheaderstringYes—
If-MatchheaderstringYes—

Request body

application/json · Required:Yes

Responses

activatePluginWebhookSecret Responses
StatusDescription
200Updated subscription

Fields:subscription: Subscription

400Validation failed
401Authentication required
403Permission or tenant scope denied
404Resource not found
409State or idempotency conflict
412Revision mismatch
428If-Match is required
503Store, secret, or write result 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.
  • 412 The revision changed: read the latest ETag, decide again, then send the new If-Match.
  • 428 A precondition is missing: read the resource and send If-Match (or the required proof).
  • 503 A dependency is unavailable: retry later with the original Idempotency-Key.

↑ Back to list

POST /v1/tenant-scopes/{tenant_scope_id}/plugin-webhook-subscriptions/{subscription_id}/test-deliveries

Queue a signed CloudEvents test delivery

operationId
createPluginWebhookTestDelivery
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:plugin_webhooks.manage

Parameters

createPluginWebhookTestDelivery Parameters
NameInTypeRequiredDescription
tenant_scope_idpathstring(uuid)Yes—
subscription_idpathstring(uuid)Yes—
Idempotency-KeyheaderstringYes—

Request body

application/json · Required:Yes

Responses

createPluginWebhookTestDelivery Responses
StatusDescription
202Accepted delivery

Fields:delivery: Delivery

400Validation failed
401Authentication required
403Permission or tenant scope denied
404Resource not found
409State or idempotency conflict
422Target or entitlement rejected
429Rate limited
503Store, secret, or write result 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.
  • 429 Rate limited: wait, then retry with lower concurrency.
  • 503 A dependency is unavailable: retry later with the original Idempotency-Key.

↑ Back to list

GET /v1/tenant-scopes/{tenant_scope_id}/theme

operationId
getTenantTheme
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

The contract has no separate permission annotation; see the description below and the 403 response.

Description (from the contract)

The caller's own tenant theme state (any tenant member) and the downloaded themes it may choose.

Parameters

getTenantTheme Parameters
NameInTypeRequiredDescription
tenant_scope_idpathstring(uuid)Yes—

Responses

getTenantTheme Responses
StatusDescription
200Tenant theme

Fields:schema: const cdnca.theme.tenant/v1 tenant_scope_id: string(uuid) selection_mode: any platform_allows: boolean selection_allowed: boolean selected_package_sha256?: string assigned_by?: any effective_package_sha256: string effective_theme_id: string follows_platform: boolean revision: integer domains: array<string> choices: array<object>

403Not a member of this tenant scope

What to do on failure

  • 403 Check the key scopes, the owner’s current permissions and the tenant scope; never switch to a more privileged account.

↑ Back to list

PUT /v1/tenant-scopes/{tenant_scope_id}/theme

operationId
selectTenantTheme
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

The contract has no separate permission annotation; see the description below and the 403 response.

Description (from the contract)

Choose the tenant theme (tenant_theme.manage). package_sha256 "" follows the platform theme. Allowed only while the tenant may choose (its selection_mode allow, or inherit while the platform allows) and the platform has not assigned the tenant a theme. Audited as theme.tenant.activate.

Parameters

selectTenantTheme Parameters
NameInTypeRequiredDescription
tenant_scope_idpathstring(uuid)Yes—
If-MatchheaderstringYes"<revision>" from ETag

Request body

application/json · Required:Yes

selectTenantTheme Request body
NameTypeRequiredDescription
package_sha256stringYes—

Responses

selectTenantTheme Responses
StatusDescription
200New tenant theme

Fields:schema: const cdnca.theme.tenant/v1 tenant_scope_id: string(uuid) selection_mode: any platform_allows: boolean selection_allowed: boolean selected_package_sha256?: string assigned_by?: any effective_package_sha256: string effective_theme_id: string follows_platform: boolean revision: integer domains: array<string> choices: array<object>

403theme_permission_denied, theme_tenant_selection_denied or entitlement_feature_denied
404Package not downloaded
412theme_revision_conflict

What to do on failure

  • 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.
  • 412 The revision changed: read the latest ETag, decide again, then send the new If-Match.

↑ Back to list