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| Name | In | Type | Required | Description |
|---|
scope_id | path | string(uuid) | Yes | — |
|---|
X-Request-ID | header | string(uuid) | Yes | — |
|---|
X-Correlation-ID | header | string(uuid) | No | — |
|---|
Idempotency-Key | header | string | Yes | — |
|---|
Traceparent | header | string | Yes | — |
|---|
Request body
application/json · Required:Yes
createL4LineSwitch Request body| Name | Type | Required | Description |
|---|
expected_source_revision | integer(int64) | Yes | — |
|---|
from | Snapshot | Yes | — |
|---|
to | Snapshot | Yes | — |
|---|
health | HealthPolicy | Yes | — |
|---|
drain | DrainPolicy | Yes | — |
|---|
max_attempts | integer | Yes | — |
|---|
deadline | string(date-time) | Yes | — |
|---|
Responses
createL4LineSwitch Responses| Status | Description |
|---|
201 | Switch 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 |
|---|
400 | Stable error code; clients map it through locale resources. |
|---|
401 | Stable error code; clients map it through locale resources. |
|---|
403 | Stable error code; clients map it through locale resources. |
|---|
409 | Stable error code; clients map it through locale resources. |
|---|
503 | Stable 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| Name | In | Type | Required | Description |
|---|
scope_id | path | string(uuid) | Yes | — |
|---|
X-Request-ID | header | string(uuid) | Yes | — |
|---|
Responses
getCurrentL4LineSwitch Responses| Status | Description |
|---|
200 | Latest 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 |
|---|
401 | Stable error code; clients map it through locale resources. |
|---|
403 | Stable error code; clients map it through locale resources. |
|---|
404 | Stable error code; clients map it through locale resources. |
|---|
503 | Stable 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| Name | In | Type | Required | Description |
|---|
scope_id | path | string(uuid) | Yes | — |
|---|
switch_id | path | string(uuid) | Yes | — |
|---|
X-Request-ID | header | string(uuid) | Yes | — |
|---|
Responses
getL4LineSwitch Responses| Status | Description |
|---|
200 | Current 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 |
|---|
401 | Stable error code; clients map it through locale resources. |
|---|
403 | Stable error code; clients map it through locale resources. |
|---|
404 | Stable error code; clients map it through locale resources. |
|---|
503 | Stable 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| Name | In | Type | Required | Description |
|---|
scope_id | path | string(uuid) | Yes | — |
|---|
switch_id | path | string(uuid) | Yes | — |
|---|
X-Request-ID | header | string(uuid) | Yes | — |
|---|
Responses
reconcileL4LineSwitch Responses| Status | Description |
|---|
200 | Current 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 |
|---|
400 | Stable error code; clients map it through locale resources. |
|---|
401 | Stable error code; clients map it through locale resources. |
|---|
403 | Stable error code; clients map it through locale resources. |
|---|
404 | Stable error code; clients map it through locale resources. |
|---|
409 | Stable error code; clients map it through locale resources. |
|---|
503 | Stable 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| Name | In | Type | Required | Description |
|---|
scope_id | path | string(uuid) | Yes | — |
|---|
site_id | path | string(uuid) | Yes | — |
|---|
Responses
getSiteCapturePolicy Responses| Status | Description |
|---|
200 | Current authoritative policy, or the explicit unconfigured default. |
|---|
401 | Stable localized-by-client error response. |
|---|
403 | Stable localized-by-client error response. |
|---|
404 | Stable localized-by-client error response. |
|---|
503 | Stable 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| Name | In | Type | Required | Description |
|---|
scope_id | path | string(uuid) | Yes | — |
|---|
site_id | path | string(uuid) | Yes | — |
|---|
Idempotency-Key | header | string | Yes | — |
|---|
X-Request-ID | header | string | Yes | — |
|---|
X-Trace-ID | header | string | Yes | — |
|---|
Request body
application/json · Required:Yes
updateSiteCapturePolicy Request body| Name | Type | Required | Description |
|---|
expected_revision | integer | Yes | — |
|---|
document | PolicyDocument | Yes | — |
|---|
Responses
updateSiteCapturePolicy Responses| Status | Description |
|---|
200 | Policy CAS committed or idempotently replayed. Fields:policy: Policy replayed: boolean |
|---|
400 | Stable localized-by-client error response. |
|---|
401 | Stable localized-by-client error response. |
|---|
403 | Stable localized-by-client error response. |
|---|
404 | Stable localized-by-client error response. |
|---|
409 | Stable localized-by-client error response. |
|---|
412 | Stable localized-by-client error response. |
|---|
503 | Stable 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| Name | In | Type | Required | Description |
|---|
tenant_scope_id | path | string(uuid) | Yes | Explicit target tenant access-scope UUID. |
|---|
X-Request-ID | header | string | Yes | Stable request correlation ID; 1 to 128 safe ASCII characters. |
|---|
X-Trace-ID | header | string | Yes | Stable trace correlation ID; 1 to 128 safe ASCII characters. |
|---|
limit | query | integer | No | — |
|---|
cursor | query | string | No | Opaque 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_id | query | string(uuid) | No | — |
|---|
host | query | string | No | — |
|---|
enabled | query | boolean | No | — |
|---|
Responses
listChallengePolicies Responses| Status | Description |
|---|
200 | Stable 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 |
|---|
400 | Stable error envelope without SQL, internal errors, key references, or provider details. |
|---|
401 | Stable error envelope without SQL, internal errors, key references, or provider details. |
|---|
403 | Stable error envelope without SQL, internal errors, key references, or provider details. |
|---|
404 | Stable error envelope without SQL, internal errors, key references, or provider details. |
|---|
405 | Stable error envelope without SQL, internal errors, key references, or provider details. |
|---|
422 | Stable error envelope without SQL, internal errors, key references, or provider details. |
|---|
503 | Stable 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| Name | In | Type | Required | Description |
|---|
tenant_scope_id | path | string(uuid) | Yes | Explicit target tenant access-scope UUID. |
|---|
X-Request-ID | header | string | Yes | Stable request correlation ID; 1 to 128 safe ASCII characters. |
|---|
X-Trace-ID | header | string | Yes | Stable trace correlation ID; 1 to 128 safe ASCII characters. |
|---|
Idempotency-Key | header | string | Yes | Operation-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| Name | Type | Required | Description |
|---|
site_id | string(uuid) | Yes | — |
|---|
host | string | Yes | Lowercase ASCII hostname without scheme, port, path, wildcard, or trailing dot. |
|---|
enabled | boolean | Yes | — |
|---|
config | ChallengeConfig | Yes | challenge_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| Status | Description |
|---|
201 | Created 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) |
|---|
400 | Stable error envelope without SQL, internal errors, key references, or provider details. |
|---|
401 | Stable error envelope without SQL, internal errors, key references, or provider details. |
|---|
403 | Stable error envelope without SQL, internal errors, key references, or provider details. |
|---|
404 | Stable error envelope without SQL, internal errors, key references, or provider details. |
|---|
405 | Stable error envelope without SQL, internal errors, key references, or provider details. |
|---|
409 | Stable error envelope without SQL, internal errors, key references, or provider details. |
|---|
422 | Stable error envelope without SQL, internal errors, key references, or provider details. |
|---|
503 | Stable 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| Name | In | Type | Required | Description |
|---|
tenant_scope_id | path | string(uuid) | Yes | Explicit target tenant access-scope UUID. |
|---|
policy_id | path | string(uuid) | Yes | — |
|---|
X-Request-ID | header | string | Yes | Stable request correlation ID; 1 to 128 safe ASCII characters. |
|---|
X-Trace-ID | header | string | Yes | Stable trace correlation ID; 1 to 128 safe ASCII characters. |
|---|
Responses
getChallengePolicy Responses| Status | Description |
|---|
200 | Challenge 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) |
|---|
400 | Stable error envelope without SQL, internal errors, key references, or provider details. |
|---|
401 | Stable error envelope without SQL, internal errors, key references, or provider details. |
|---|
403 | Stable error envelope without SQL, internal errors, key references, or provider details. |
|---|
404 | Stable error envelope without SQL, internal errors, key references, or provider details. |
|---|
405 | Stable error envelope without SQL, internal errors, key references, or provider details. |
|---|
503 | Stable 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| Name | In | Type | Required | Description |
|---|
tenant_scope_id | path | string(uuid) | Yes | Explicit target tenant access-scope UUID. |
|---|
policy_id | path | string(uuid) | Yes | — |
|---|
X-Request-ID | header | string | Yes | Stable request correlation ID; 1 to 128 safe ASCII characters. |
|---|
X-Trace-ID | header | string | Yes | Stable trace correlation ID; 1 to 128 safe ASCII characters. |
|---|
Idempotency-Key | header | string | Yes | Operation-scoped durable key. Retry an unknown result only with the same key and unchanged business payload. |
|---|
If-Match | header | string | Yes | Current positive revision encoded as a quoted decimal ETag, for example "3". |
|---|
Request body
application/json · Required:Yes
updateChallengePolicy Request body| Name | Type | Required | Description |
|---|
config | ChallengeConfig | Yes | challenge_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| Status | Description |
|---|
200 | Updated 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) |
|---|
400 | Stable error envelope without SQL, internal errors, key references, or provider details. |
|---|
401 | Stable error envelope without SQL, internal errors, key references, or provider details. |
|---|
403 | Stable error envelope without SQL, internal errors, key references, or provider details. |
|---|
404 | Stable error envelope without SQL, internal errors, key references, or provider details. |
|---|
405 | Stable error envelope without SQL, internal errors, key references, or provider details. |
|---|
409 | Stable error envelope without SQL, internal errors, key references, or provider details. |
|---|
412 | Stable error envelope without SQL, internal errors, key references, or provider details. |
|---|
422 | Stable error envelope without SQL, internal errors, key references, or provider details. |
|---|
503 | Stable 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| Name | In | Type | Required | Description |
|---|
tenant_scope_id | path | string(uuid) | Yes | Explicit target tenant access-scope UUID. |
|---|
policy_id | path | string(uuid) | Yes | — |
|---|
X-Request-ID | header | string | Yes | Stable request correlation ID; 1 to 128 safe ASCII characters. |
|---|
X-Trace-ID | header | string | Yes | Stable trace correlation ID; 1 to 128 safe ASCII characters. |
|---|
Idempotency-Key | header | string | Yes | Operation-scoped durable key. Retry an unknown result only with the same key and unchanged business payload. |
|---|
If-Match | header | string | Yes | Current positive revision encoded as a quoted decimal ETag, for example "3". |
|---|
Responses
deleteChallengePolicy Responses| Status | Description |
|---|
200 | Updated 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) |
|---|
400 | Stable error envelope without SQL, internal errors, key references, or provider details. |
|---|
401 | Stable error envelope without SQL, internal errors, key references, or provider details. |
|---|
403 | Stable error envelope without SQL, internal errors, key references, or provider details. |
|---|
404 | Stable error envelope without SQL, internal errors, key references, or provider details. |
|---|
405 | Stable error envelope without SQL, internal errors, key references, or provider details. |
|---|
409 | Stable error envelope without SQL, internal errors, key references, or provider details. |
|---|
412 | Stable error envelope without SQL, internal errors, key references, or provider details. |
|---|
503 | Stable 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| Name | In | Type | Required | Description |
|---|
tenant_scope_id | path | string(uuid) | Yes | Explicit target tenant access-scope UUID. |
|---|
policy_id | path | string(uuid) | Yes | — |
|---|
X-Request-ID | header | string | Yes | Stable request correlation ID; 1 to 128 safe ASCII characters. |
|---|
X-Trace-ID | header | string | Yes | Stable trace correlation ID; 1 to 128 safe ASCII characters. |
|---|
Idempotency-Key | header | string | Yes | Operation-scoped durable key. Retry an unknown result only with the same key and unchanged business payload. |
|---|
If-Match | header | string | Yes | Current positive revision encoded as a quoted decimal ETag, for example "3". |
|---|
Request body
application/json · Required:No
Responses
disableChallengePolicy Responses| Status | Description |
|---|
200 | Updated 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) |
|---|
400 | Stable error envelope without SQL, internal errors, key references, or provider details. |
|---|
401 | Stable error envelope without SQL, internal errors, key references, or provider details. |
|---|
403 | Stable error envelope without SQL, internal errors, key references, or provider details. |
|---|
404 | Stable error envelope without SQL, internal errors, key references, or provider details. |
|---|
405 | Stable error envelope without SQL, internal errors, key references, or provider details. |
|---|
409 | Stable error envelope without SQL, internal errors, key references, or provider details. |
|---|
412 | Stable error envelope without SQL, internal errors, key references, or provider details. |
|---|
503 | Stable 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| Name | In | Type | Required | Description |
|---|
tenant_scope_id | path | string(uuid) | Yes | Explicit target tenant access-scope UUID. |
|---|
policy_id | path | string(uuid) | Yes | — |
|---|
X-Request-ID | header | string | Yes | Stable request correlation ID; 1 to 128 safe ASCII characters. |
|---|
X-Trace-ID | header | string | Yes | Stable trace correlation ID; 1 to 128 safe ASCII characters. |
|---|
Idempotency-Key | header | string | Yes | Operation-scoped durable key. Retry an unknown result only with the same key and unchanged business payload. |
|---|
If-Match | header | string | Yes | Current positive revision encoded as a quoted decimal ETag, for example "3". |
|---|
Request body
application/json · Required:No
Responses
enableChallengePolicy Responses| Status | Description |
|---|
200 | Updated 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) |
|---|
400 | Stable error envelope without SQL, internal errors, key references, or provider details. |
|---|
401 | Stable error envelope without SQL, internal errors, key references, or provider details. |
|---|
403 | Stable error envelope without SQL, internal errors, key references, or provider details. |
|---|
404 | Stable error envelope without SQL, internal errors, key references, or provider details. |
|---|
405 | Stable error envelope without SQL, internal errors, key references, or provider details. |
|---|
409 | Stable error envelope without SQL, internal errors, key references, or provider details. |
|---|
412 | Stable error envelope without SQL, internal errors, key references, or provider details. |
|---|
503 | Stable 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| Name | In | Type | Required | Description |
|---|
tenant_scope_id | path | string(uuid) | Yes | Explicit target tenant access-scope UUID. |
|---|
policy_id | path | string(uuid) | Yes | — |
|---|
X-Request-ID | header | string | Yes | Stable request correlation ID; 1 to 128 safe ASCII characters. |
|---|
X-Trace-ID | header | string | Yes | Stable trace correlation ID; 1 to 128 safe ASCII characters. |
|---|
Idempotency-Key | header | string | Yes | Operation-scoped durable key. Retry an unknown result only with the same key and unchanged business payload. |
|---|
If-Match | header | string | Yes | Current positive revision encoded as a quoted decimal ETag, for example "3". |
|---|
Request body
application/json · Required:No
Responses
publishChallengePolicy Responses| Status | Description |
|---|
202 | Signed 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 |
|---|
400 | Stable error envelope without SQL, internal errors, key references, or provider details. |
|---|
401 | Stable error envelope without SQL, internal errors, key references, or provider details. |
|---|
403 | Stable error envelope without SQL, internal errors, key references, or provider details. |
|---|
404 | Stable error envelope without SQL, internal errors, key references, or provider details. |
|---|
405 | Stable error envelope without SQL, internal errors, key references, or provider details. |
|---|
409 | Stable error envelope without SQL, internal errors, key references, or provider details. |
|---|
412 | Stable error envelope without SQL, internal errors, key references, or provider details. |
|---|
422 | Stable error envelope without SQL, internal errors, key references, or provider details. |
|---|
503 | Stable 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| Name | In | Type | Required | Description |
|---|
tenant_scope_id | path | string(uuid) | Yes | Explicit target tenant access-scope UUID. |
|---|
policy_id | path | string(uuid) | Yes | — |
|---|
rollout_id | path | string(uuid) | Yes | — |
|---|
X-Request-ID | header | string | Yes | Stable request correlation ID; 1 to 128 safe ASCII characters. |
|---|
X-Trace-ID | header | string | Yes | Stable trace correlation ID; 1 to 128 safe ASCII characters. |
|---|
Responses
getChallengePolicyPublication Responses| Status | Description |
|---|
200 | Exact 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 |
|---|
400 | Stable error envelope without SQL, internal errors, key references, or provider details. |
|---|
401 | Stable error envelope without SQL, internal errors, key references, or provider details. |
|---|
403 | Stable error envelope without SQL, internal errors, key references, or provider details. |
|---|
404 | Stable error envelope without SQL, internal errors, key references, or provider details. |
|---|
405 | Stable error envelope without SQL, internal errors, key references, or provider details. |
|---|
503 | Stable 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
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| Name | In | Type | Required | Description |
|---|
tenant_scope_id | path | string(uuid) | Yes | Explicit target tenant access-scope UUID. |
|---|
policy_id | path | string(uuid) | Yes | — |
|---|
rollout_id | path | string(uuid) | Yes | — |
|---|
X-Request-ID | header | string | Yes | Stable request correlation ID; 1 to 128 safe ASCII characters. |
|---|
X-Trace-ID | header | string | Yes | Stable trace correlation ID; 1 to 128 safe ASCII characters. |
|---|
Idempotency-Key | header | string | Yes | Operation-scoped durable key. Retry an unknown result only with the same key and unchanged business payload. |
|---|
If-Match | header | string | Yes | Current positive revision encoded as a quoted decimal ETag, for example "3". |
|---|
Request body
application/json · Required:No
Responses
promoteChallengePolicyPublication Responses| Status | Description |
|---|
200 | Exact 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 |
|---|
400 | Stable error envelope without SQL, internal errors, key references, or provider details. |
|---|
401 | Stable error envelope without SQL, internal errors, key references, or provider details. |
|---|
403 | Stable error envelope without SQL, internal errors, key references, or provider details. |
|---|
404 | Stable error envelope without SQL, internal errors, key references, or provider details. |
|---|
405 | Stable error envelope without SQL, internal errors, key references, or provider details. |
|---|
409 | Stable error envelope without SQL, internal errors, key references, or provider details. |
|---|
412 | Stable error envelope without SQL, internal errors, key references, or provider details. |
|---|
503 | Stable 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| Name | In | Type | Required | Description |
|---|
tenant_scope_id | path | string(uuid) | Yes | — |
|---|
If-Match | header | string | Yes | 当前源配置 revision 的强 ETag,例如 "7"。 |
|---|
Idempotency-Key | header | string | Yes | — |
|---|
X-Request-ID | header | string(uuid) | Yes | — |
|---|
X-Correlation-ID | header | string(uuid) | No | — |
|---|
Traceparent | header | string | Yes | — |
|---|
X-Task-ID | header | string | No | — |
|---|
Request body
application/json · Required:Yes
publishErrorPageConfiguration Request body| Name | Type | Required | Description |
|---|
target | NodeTarget | SnapshotTarget | Yes | — |
|---|
health_check | HealthCheck | Yes | — |
|---|
max_attempts | integer(int32) | Yes | — |
|---|
deadline | string(date-time) | Yes | — |
|---|
Responses
publishErrorPageConfiguration Responses| Status | Description |
|---|
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 | 幂等或目标快照冲突 |
|---|
412 | If-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| Name | In | Type | Required | Description |
|---|
tenant_scope_id | path | string(uuid) | Yes | — |
|---|
publication_id | path | string(uuid) | Yes | — |
|---|
X-Request-ID | header | string(uuid) | No | — |
|---|
Responses
getErrorPagePublication Responses| Status | Description |
|---|
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| Name | In | Type | Required | Description |
|---|
tenant_scope_id | path | string(uuid) | Yes | Explicit target tenant access-scope UUID. |
|---|
X-Request-ID | header | string | Yes | Stable request correlation ID. |
|---|
X-Trace-ID | header | string | Yes | Stable trace correlation ID. |
|---|
limit | query | integer | No | — |
|---|
cursor | query | string | No | Opaque URL-safe keyset cursor returned by the preceding page. |
|---|
site_id | query | string(uuid) | No | — |
|---|
enabled | query | boolean | No | — |
|---|
Responses
listHTTPPolicies Responses| Status | Description |
|---|
200 | Stable page of non-deleted policies. Fields:items: array<HTTPPolicy> next_cursor?: string |
|---|
400 | Stable 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. |
|---|
401 | Stable 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. |
|---|
403 | Stable 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. |
|---|
404 | Stable 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. |
|---|
405 | Stable 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. |
|---|
503 | Stable 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| Name | In | Type | Required | Description |
|---|
tenant_scope_id | path | string(uuid) | Yes | Explicit target tenant access-scope UUID. |
|---|
X-Request-ID | header | string | Yes | Stable request correlation ID. |
|---|
X-Trace-ID | header | string | Yes | Stable trace correlation ID. |
|---|
Idempotency-Key | header | string | Yes | Operation-scoped durable key. Retry an unknown result with this key and the unchanged business payload. |
|---|
Request body
application/json · Required:Yes
createHTTPPolicy Request body| Name | Type | Required | Description |
|---|
site_id | string(uuid) | Yes | — |
|---|
enabled | boolean | Yes | — |
|---|
config | HTTPPolicyConfig | Yes | — |
|---|
Responses
createHTTPPolicy Responses| Status | Description |
|---|
201 | Created 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) |
|---|
400 | Stable 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. |
|---|
401 | Stable 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. |
|---|
403 | Stable 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. |
|---|
404 | Stable 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. |
|---|
405 | Stable 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. |
|---|
409 | Stable 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. |
|---|
422 | Stable 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. |
|---|
503 | Stable 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| Name | In | Type | Required | Description |
|---|
tenant_scope_id | path | string(uuid) | Yes | Explicit target tenant access-scope UUID. |
|---|
X-Request-ID | header | string | Yes | Stable request correlation ID. |
|---|
X-Trace-ID | header | string | Yes | Stable trace correlation ID. |
|---|
Responses
previewHTTPPolicyPublication Responses| Status | Description |
|---|
200 | Deterministic unsigned Edge v1 source preview. Fields:state: string sha256: string snapshot: EdgeSnapshot |
|---|
400 | Stable 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. |
|---|
401 | Stable 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. |
|---|
403 | Stable 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. |
|---|
404 | Stable 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. |
|---|
405 | Stable 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. |
|---|
409 | Stable 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. |
|---|
503 | Stable 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| Name | In | Type | Required | Description |
|---|
tenant_scope_id | path | string(uuid) | Yes | Explicit target tenant access-scope UUID. |
|---|
policy_id | path | string(uuid) | Yes | — |
|---|
X-Request-ID | header | string | Yes | Stable request correlation ID. |
|---|
X-Trace-ID | header | string | Yes | Stable trace correlation ID. |
|---|
Responses
getHTTPPolicy Responses| Status | Description |
|---|
200 | HTTP 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) |
|---|
400 | Stable 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. |
|---|
401 | Stable 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. |
|---|
403 | Stable 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. |
|---|
404 | Stable 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. |
|---|
405 | Stable 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. |
|---|
503 | Stable 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| Name | In | Type | Required | Description |
|---|
tenant_scope_id | path | string(uuid) | Yes | Explicit target tenant access-scope UUID. |
|---|
policy_id | path | string(uuid) | Yes | — |
|---|
X-Request-ID | header | string | Yes | Stable request correlation ID. |
|---|
X-Trace-ID | header | string | Yes | Stable trace correlation ID. |
|---|
Idempotency-Key | header | string | Yes | Operation-scoped durable key. Retry an unknown result with this key and the unchanged business payload. |
|---|
If-Match | header | string | Yes | Current positive revision as a quoted decimal ETag, for example "3". |
|---|
Request body
application/json · Required:Yes
updateHTTPPolicy Request body| Name | Type | Required | Description |
|---|
config | HTTPPolicyConfig | Yes | — |
|---|
Responses
updateHTTPPolicy Responses| Status | Description |
|---|
200 | Updated 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) |
|---|
400 | Stable 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. |
|---|
401 | Stable 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. |
|---|
403 | Stable 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. |
|---|
404 | Stable 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. |
|---|
405 | Stable 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. |
|---|
409 | Stable 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. |
|---|
412 | Stable 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. |
|---|
422 | Stable 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. |
|---|
503 | Stable 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| Name | In | Type | Required | Description |
|---|
tenant_scope_id | path | string(uuid) | Yes | Explicit target tenant access-scope UUID. |
|---|
policy_id | path | string(uuid) | Yes | — |
|---|
X-Request-ID | header | string | Yes | Stable request correlation ID. |
|---|
X-Trace-ID | header | string | Yes | Stable trace correlation ID. |
|---|
Idempotency-Key | header | string | Yes | Operation-scoped durable key. Retry an unknown result with this key and the unchanged business payload. |
|---|
If-Match | header | string | Yes | Current positive revision as a quoted decimal ETag, for example "3". |
|---|
Responses
deleteHTTPPolicy Responses| Status | Description |
|---|
200 | Updated 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) |
|---|
400 | Stable 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. |
|---|
401 | Stable 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. |
|---|
403 | Stable 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. |
|---|
404 | Stable 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. |
|---|
405 | Stable 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. |
|---|
409 | Stable 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. |
|---|
412 | Stable 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. |
|---|
503 | Stable 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| Name | In | Type | Required | Description |
|---|
tenant_scope_id | path | string(uuid) | Yes | Explicit target tenant access-scope UUID. |
|---|
policy_id | path | string(uuid) | Yes | — |
|---|
X-Request-ID | header | string | Yes | Stable request correlation ID. |
|---|
X-Trace-ID | header | string | Yes | Stable trace correlation ID. |
|---|
Idempotency-Key | header | string | Yes | Operation-scoped durable key. Retry an unknown result with this key and the unchanged business payload. |
|---|
If-Match | header | string | Yes | Current positive revision as a quoted decimal ETag, for example "3". |
|---|
Request body
application/json · Required:Yes
Responses
disableHTTPPolicy Responses| Status | Description |
|---|
200 | Updated 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) |
|---|
400 | Stable 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. |
|---|
401 | Stable 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. |
|---|
403 | Stable 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. |
|---|
404 | Stable 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. |
|---|
405 | Stable 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. |
|---|
409 | Stable 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. |
|---|
412 | Stable 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. |
|---|
503 | Stable 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| Name | In | Type | Required | Description |
|---|
tenant_scope_id | path | string(uuid) | Yes | Explicit target tenant access-scope UUID. |
|---|
policy_id | path | string(uuid) | Yes | — |
|---|
X-Request-ID | header | string | Yes | Stable request correlation ID. |
|---|
X-Trace-ID | header | string | Yes | Stable trace correlation ID. |
|---|
Idempotency-Key | header | string | Yes | Operation-scoped durable key. Retry an unknown result with this key and the unchanged business payload. |
|---|
If-Match | header | string | Yes | Current positive revision as a quoted decimal ETag, for example "3". |
|---|
Request body
application/json · Required:Yes
Responses
enableHTTPPolicy Responses| Status | Description |
|---|
200 | Updated 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) |
|---|
400 | Stable 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. |
|---|
401 | Stable 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. |
|---|
403 | Stable 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. |
|---|
404 | Stable 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. |
|---|
405 | Stable 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. |
|---|
409 | Stable 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. |
|---|
412 | Stable 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. |
|---|
503 | Stable 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| Name | In | Type | Required | Description |
|---|
tenant_scope_id | path | string(uuid) | Yes | — |
|---|
X-Request-ID | header | string | No | — |
|---|
X-Trace-ID | header | string | No | — |
|---|
provider | query | string: s3 / oss / cos | No | — |
|---|
status | query | string: pending / verified / disabled / deleted | No | — |
|---|
limit | query | integer | No | — |
|---|
cursor | query | string | No | Opaque stable keyset cursor, at most 512 bytes. |
|---|
Responses
listOriginAuthCredentials Responses| Status | Description |
|---|
200 | Stable credential page. Fields:items: array<Credential> next_cursor?: string |
|---|
400 | Unknown field, malformed UUID/body/header/query, invalid cursor, or exceeded bound. |
|---|
401 | Authentication is missing or invalid. |
|---|
403 | Permission or entitlement denied. |
|---|
404 | Unknown or out-of-tenant resource; both use the same response shape. |
|---|
405 | Request method is not allowed for this route. |
|---|
503 | Storage, 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| Name | In | Type | Required | Description |
|---|
tenant_scope_id | path | string(uuid) | Yes | — |
|---|
X-Request-ID | header | string | No | — |
|---|
X-Trace-ID | header | string | No | — |
|---|
Idempotency-Key | header | string | Yes | — |
|---|
Request body
application/json · Required:Yes
createOriginAuthCredential Request body| Name | Type | Required | Description |
|---|
provider | string: s3 / oss / cos | Yes | — |
|---|
name | string | Yes | — |
|---|
secret | CredentialSecret | Yes | — |
|---|
Responses
createOriginAuthCredential Responses| Status | Description |
|---|
201 | Pending 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) |
|---|
400 | Unknown field, malformed UUID/body/header/query, invalid cursor, or exceeded bound. |
|---|
401 | Authentication is missing or invalid. |
|---|
403 | Permission or entitlement denied. |
|---|
404 | Unknown or out-of-tenant resource; both use the same response shape. |
|---|
405 | Request method is not allowed for this route. |
|---|
409 | State, uniqueness, active-reference, or idempotency conflict. |
|---|
422 | Provider binding, endpoint, path, credential state, or verification rejected. |
|---|
503 | Storage, 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| Name | In | Type | Required | Description |
|---|
tenant_scope_id | path | string(uuid) | Yes | — |
|---|
credential_id | path | string(uuid) | Yes | — |
|---|
X-Request-ID | header | string | No | — |
|---|
X-Trace-ID | header | string | No | — |
|---|
Responses
getOriginAuthCredential Responses| Status | Description |
|---|
200 | Redacted 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) |
|---|
400 | Unknown field, malformed UUID/body/header/query, invalid cursor, or exceeded bound. |
|---|
401 | Authentication is missing or invalid. |
|---|
403 | Permission or entitlement denied. |
|---|
404 | Unknown or out-of-tenant resource; both use the same response shape. |
|---|
405 | Request method is not allowed for this route. |
|---|
503 | Storage, 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| Name | In | Type | Required | Description |
|---|
tenant_scope_id | path | string(uuid) | Yes | — |
|---|
credential_id | path | string(uuid) | Yes | — |
|---|
X-Request-ID | header | string | No | — |
|---|
X-Trace-ID | header | string | No | — |
|---|
Idempotency-Key | header | string | Yes | — |
|---|
If-Match | header | string | Yes | Quoted positive decimal current resource revision. |
|---|
Request body
application/json · Required:Yes
Responses
deleteOriginAuthCredential Responses| Status | Description |
|---|
200 | Credential 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) |
|---|
400 | Unknown field, malformed UUID/body/header/query, invalid cursor, or exceeded bound. |
|---|
401 | Authentication is missing or invalid. |
|---|
403 | Permission or entitlement denied. |
|---|
404 | Unknown or out-of-tenant resource; both use the same response shape. |
|---|
405 | Request method is not allowed for this route. |
|---|
409 | State, uniqueness, active-reference, or idempotency conflict. |
|---|
412 | If-Match does not equal the current revision. |
|---|
422 | Provider binding, endpoint, path, credential state, or verification rejected. |
|---|
503 | Storage, 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| Name | In | Type | Required | Description |
|---|
tenant_scope_id | path | string(uuid) | Yes | — |
|---|
credential_id | path | string(uuid) | Yes | — |
|---|
X-Request-ID | header | string | No | — |
|---|
X-Trace-ID | header | string | No | — |
|---|
Idempotency-Key | header | string | Yes | — |
|---|
If-Match | header | string | Yes | Quoted positive decimal current resource revision. |
|---|
Request body
application/json · Required:Yes
Responses
disableOriginAuthCredential Responses| Status | Description |
|---|
200 | Credential 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) |
|---|
400 | Unknown field, malformed UUID/body/header/query, invalid cursor, or exceeded bound. |
|---|
401 | Authentication is missing or invalid. |
|---|
403 | Permission or entitlement denied. |
|---|
404 | Unknown or out-of-tenant resource; both use the same response shape. |
|---|
405 | Request method is not allowed for this route. |
|---|
409 | State, uniqueness, active-reference, or idempotency conflict. |
|---|
412 | If-Match does not equal the current revision. |
|---|
503 | Storage, 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| Name | In | Type | Required | Description |
|---|
tenant_scope_id | path | string(uuid) | Yes | — |
|---|
credential_id | path | string(uuid) | Yes | — |
|---|
X-Request-ID | header | string | No | — |
|---|
X-Trace-ID | header | string | No | — |
|---|
Idempotency-Key | header | string | Yes | — |
|---|
If-Match | header | string | Yes | Quoted positive decimal current resource revision. |
|---|
Request body
application/json · Required:Yes
replaceOriginAuthCredential Request body| Name | Type | Required | Description |
|---|
secret | CredentialSecret | Yes | — |
|---|
Responses
replaceOriginAuthCredential Responses| Status | Description |
|---|
200 | Credential 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) |
|---|
400 | Unknown field, malformed UUID/body/header/query, invalid cursor, or exceeded bound. |
|---|
401 | Authentication is missing or invalid. |
|---|
403 | Permission or entitlement denied. |
|---|
404 | Unknown or out-of-tenant resource; both use the same response shape. |
|---|
405 | Request method is not allowed for this route. |
|---|
409 | State, uniqueness, active-reference, or idempotency conflict. |
|---|
412 | If-Match does not equal the current revision. |
|---|
422 | Provider binding, endpoint, path, credential state, or verification rejected. |
|---|
503 | Storage, 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| Name | In | Type | Required | Description |
|---|
tenant_scope_id | path | string(uuid) | Yes | — |
|---|
credential_id | path | string(uuid) | Yes | — |
|---|
X-Request-ID | header | string | No | — |
|---|
X-Trace-ID | header | string | No | — |
|---|
Idempotency-Key | header | string | Yes | — |
|---|
If-Match | header | string | Yes | Quoted positive decimal current resource revision. |
|---|
Request body
application/json · Required:Yes
Responses
verifyOriginAuthCredential Responses| Status | Description |
|---|
200 | Credential 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) |
|---|
400 | Unknown field, malformed UUID/body/header/query, invalid cursor, or exceeded bound. |
|---|
401 | Authentication is missing or invalid. |
|---|
403 | Permission or entitlement denied. |
|---|
404 | Unknown or out-of-tenant resource; both use the same response shape. |
|---|
405 | Request method is not allowed for this route. |
|---|
409 | State, uniqueness, active-reference, or idempotency conflict. |
|---|
412 | If-Match does not equal the current revision. |
|---|
422 | Provider binding, endpoint, path, credential state, or verification rejected. |
|---|
503 | Storage, 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| Name | In | Type | Required | Description |
|---|
tenant_scope_id | path | string(uuid) | Yes | — |
|---|
If-Match | header | string | Yes | 当前源配置 revision 的强 ETag,例如 "7"。 |
|---|
Idempotency-Key | header | string | Yes | — |
|---|
X-Request-ID | header | string(uuid) | Yes | — |
|---|
X-Correlation-ID | header | string(uuid) | No | — |
|---|
Traceparent | header | string | Yes | — |
|---|
X-Task-ID | header | string | No | — |
|---|
Request body
application/json · Required:Yes
publishOriginAuthEdgeConfiguration Request body| Name | Type | Required | Description |
|---|
node_ids | array<string(uuid)> | Yes | — |
|---|
health_check | HealthCheck | Yes | — |
|---|
deadline | string(date-time) | Yes | — |
|---|
Responses
publishOriginAuthEdgeConfiguration Responses| Status | Description |
|---|
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 | 幂等键已绑定不同请求 |
|---|
412 | If-Match 不等于最新源配置 revision |
|---|
422 | 目标节点、接收密钥或源配置当前不可发布 |
|---|
502 | 持久化事实未通过严格身份校验 |
|---|
503 | origin_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| Name | In | Type | Required | Description |
|---|
tenant_scope_id | path | string(uuid) | Yes | — |
|---|
publication_id | path | string(uuid) | Yes | — |
|---|
X-Request-ID | header | string(uuid) | No | — |
|---|
Responses
getOriginAuthEdgePublication Responses| Status | Description |
|---|
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| Name | In | Type | Required | Description |
|---|
tenant_scope_id | path | string(uuid) | Yes | — |
|---|
X-Request-ID | header | string | No | — |
|---|
X-Trace-ID | header | string | No | — |
|---|
Responses
getLatestOriginAuthPublication Responses| Status | Description |
|---|
200 | Latest 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) |
|---|
400 | Unknown field, malformed UUID/body/header/query, invalid cursor, or exceeded bound. |
|---|
401 | Authentication is missing or invalid. |
|---|
403 | Permission or entitlement denied. |
|---|
404 | Unknown or out-of-tenant resource; both use the same response shape. |
|---|
405 | Request method is not allowed for this route. |
|---|
503 | Storage, 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| Name | In | Type | Required | Description |
|---|
tenant_scope_id | path | string(uuid) | Yes | — |
|---|
X-Request-ID | header | string | No | — |
|---|
X-Trace-ID | header | string | No | — |
|---|
Idempotency-Key | header | string | Yes | — |
|---|
If-Match | header | string | Yes | Quoted decimal current publication revision; first write uses "0". |
|---|
Request body
application/json · Required:Yes
Responses
createOriginAuthPublication Responses| Status | Description |
|---|
201 | Publication 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) |
|---|
400 | Unknown field, malformed UUID/body/header/query, invalid cursor, or exceeded bound. |
|---|
401 | Authentication is missing or invalid. |
|---|
403 | Permission or entitlement denied. |
|---|
404 | Unknown or out-of-tenant resource; both use the same response shape. |
|---|
405 | Request method is not allowed for this route. |
|---|
409 | State, uniqueness, active-reference, or idempotency conflict. |
|---|
412 | If-Match does not equal the current revision. |
|---|
422 | Provider binding, endpoint, path, credential state, or verification rejected. |
|---|
503 | Storage, 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| Name | In | Type | Required | Description |
|---|
tenant_scope_id | path | string(uuid) | Yes | — |
|---|
X-Request-ID | header | string | No | — |
|---|
X-Trace-ID | header | string | No | — |
|---|
site_id | query | string(uuid) | No | — |
|---|
enabled | query | boolean | No | — |
|---|
limit | query | integer | No | — |
|---|
cursor | query | string | No | Opaque stable keyset cursor, at most 512 bytes. |
|---|
Responses
listOriginAuthRules Responses| Status | Description |
|---|
200 | Stable rule page. Fields:items: array<Rule> next_cursor?: string |
|---|
400 | Unknown field, malformed UUID/body/header/query, invalid cursor, or exceeded bound. |
|---|
401 | Authentication is missing or invalid. |
|---|
403 | Permission or entitlement denied. |
|---|
404 | Unknown or out-of-tenant resource; both use the same response shape. |
|---|
405 | Request method is not allowed for this route. |
|---|
503 | Storage, 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| Name | In | Type | Required | Description |
|---|
tenant_scope_id | path | string(uuid) | Yes | — |
|---|
X-Request-ID | header | string | No | — |
|---|
X-Trace-ID | header | string | No | — |
|---|
Idempotency-Key | header | string | Yes | — |
|---|
Request body
application/json · Required:Yes
createOriginAuthRule Request body| Name | Type | Required | Description |
|---|
site_id | string(uuid) | Yes | — |
|---|
source_position | integer | Yes | — |
|---|
config | RuleConfig | Yes | — |
|---|
enabled | boolean | Yes | — |
|---|
Responses
createOriginAuthRule Responses| Status | Description |
|---|
201 | Rule 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) |
|---|
400 | Unknown field, malformed UUID/body/header/query, invalid cursor, or exceeded bound. |
|---|
401 | Authentication is missing or invalid. |
|---|
403 | Permission or entitlement denied. |
|---|
404 | Unknown or out-of-tenant resource; both use the same response shape. |
|---|
405 | Request method is not allowed for this route. |
|---|
409 | State, uniqueness, active-reference, or idempotency conflict. |
|---|
422 | Provider binding, endpoint, path, credential state, or verification rejected. |
|---|
503 | Storage, 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| Name | In | Type | Required | Description |
|---|
tenant_scope_id | path | string(uuid) | Yes | — |
|---|
rule_id | path | string(uuid) | Yes | — |
|---|
X-Request-ID | header | string | No | — |
|---|
X-Trace-ID | header | string | No | — |
|---|
Responses
getOriginAuthRule Responses| Status | Description |
|---|
200 | Current 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) |
|---|
400 | Unknown field, malformed UUID/body/header/query, invalid cursor, or exceeded bound. |
|---|
401 | Authentication is missing or invalid. |
|---|
403 | Permission or entitlement denied. |
|---|
404 | Unknown or out-of-tenant resource; both use the same response shape. |
|---|
405 | Request method is not allowed for this route. |
|---|
503 | Storage, 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| Name | In | Type | Required | Description |
|---|
tenant_scope_id | path | string(uuid) | Yes | — |
|---|
rule_id | path | string(uuid) | Yes | — |
|---|
X-Request-ID | header | string | No | — |
|---|
X-Trace-ID | header | string | No | — |
|---|
Idempotency-Key | header | string | Yes | — |
|---|
If-Match | header | string | Yes | Quoted positive decimal current resource revision. |
|---|
Request body
application/json · Required:Yes
updateOriginAuthRule Request body| Name | Type | Required | Description |
|---|
config | RuleConfig | Yes | — |
|---|
Responses
updateOriginAuthRule Responses| Status | Description |
|---|
200 | Rule 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) |
|---|
400 | Unknown field, malformed UUID/body/header/query, invalid cursor, or exceeded bound. |
|---|
401 | Authentication is missing or invalid. |
|---|
403 | Permission or entitlement denied. |
|---|
404 | Unknown or out-of-tenant resource; both use the same response shape. |
|---|
405 | Request method is not allowed for this route. |
|---|
409 | State, uniqueness, active-reference, or idempotency conflict. |
|---|
412 | If-Match does not equal the current revision. |
|---|
422 | Provider binding, endpoint, path, credential state, or verification rejected. |
|---|
503 | Storage, 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| Name | In | Type | Required | Description |
|---|
tenant_scope_id | path | string(uuid) | Yes | — |
|---|
rule_id | path | string(uuid) | Yes | — |
|---|
X-Request-ID | header | string | No | — |
|---|
X-Trace-ID | header | string | No | — |
|---|
Idempotency-Key | header | string | Yes | — |
|---|
If-Match | header | string | Yes | Quoted positive decimal current resource revision. |
|---|
Request body
application/json · Required:Yes
Responses
deleteOriginAuthRule Responses| Status | Description |
|---|
200 | Rule 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) |
|---|
400 | Unknown field, malformed UUID/body/header/query, invalid cursor, or exceeded bound. |
|---|
401 | Authentication is missing or invalid. |
|---|
403 | Permission or entitlement denied. |
|---|
404 | Unknown or out-of-tenant resource; both use the same response shape. |
|---|
405 | Request method is not allowed for this route. |
|---|
409 | State, uniqueness, active-reference, or idempotency conflict. |
|---|
412 | If-Match does not equal the current revision. |
|---|
503 | Storage, 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| Name | In | Type | Required | Description |
|---|
tenant_scope_id | path | string(uuid) | Yes | — |
|---|
rule_id | path | string(uuid) | Yes | — |
|---|
X-Request-ID | header | string | No | — |
|---|
X-Trace-ID | header | string | No | — |
|---|
Idempotency-Key | header | string | Yes | — |
|---|
If-Match | header | string | Yes | Quoted positive decimal current resource revision. |
|---|
Request body
application/json · Required:Yes
Responses
disableOriginAuthRule Responses| Status | Description |
|---|
200 | Rule 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) |
|---|
400 | Unknown field, malformed UUID/body/header/query, invalid cursor, or exceeded bound. |
|---|
401 | Authentication is missing or invalid. |
|---|
403 | Permission or entitlement denied. |
|---|
404 | Unknown or out-of-tenant resource; both use the same response shape. |
|---|
405 | Request method is not allowed for this route. |
|---|
409 | State, uniqueness, active-reference, or idempotency conflict. |
|---|
412 | If-Match does not equal the current revision. |
|---|
503 | Storage, 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| Name | In | Type | Required | Description |
|---|
tenant_scope_id | path | string(uuid) | Yes | — |
|---|
rule_id | path | string(uuid) | Yes | — |
|---|
X-Request-ID | header | string | No | — |
|---|
X-Trace-ID | header | string | No | — |
|---|
Idempotency-Key | header | string | Yes | — |
|---|
If-Match | header | string | Yes | Quoted positive decimal current resource revision. |
|---|
Request body
application/json · Required:Yes
Responses
enableOriginAuthRule Responses| Status | Description |
|---|
200 | Rule 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) |
|---|
400 | Unknown field, malformed UUID/body/header/query, invalid cursor, or exceeded bound. |
|---|
401 | Authentication is missing or invalid. |
|---|
403 | Permission or entitlement denied. |
|---|
404 | Unknown or out-of-tenant resource; both use the same response shape. |
|---|
405 | Request method is not allowed for this route. |
|---|
409 | State, uniqueness, active-reference, or idempotency conflict. |
|---|
412 | If-Match does not equal the current revision. |
|---|
422 | Provider binding, endpoint, path, credential state, or verification rejected. |
|---|
503 | Storage, 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| Name | In | Type | Required | Description |
|---|
tenant_scope_id | path | string(uuid) | Yes | — |
|---|
rule_id | path | string(uuid) | Yes | — |
|---|
X-Request-ID | header | string | No | — |
|---|
X-Trace-ID | header | string | No | — |
|---|
Idempotency-Key | header | string | Yes | — |
|---|
If-Match | header | string | Yes | Quoted positive decimal current resource revision. |
|---|
Request body
application/json · Required:Yes
rotateOriginAuthRuleCredential Request body| Name | Type | Required | Description |
|---|
current_credential | CredentialReference | Yes | — |
|---|
activate_current_at | string(date-time) | Yes | — |
|---|
Responses
rotateOriginAuthRuleCredential Responses| Status | Description |
|---|
200 | Rule 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) |
|---|
400 | Unknown field, malformed UUID/body/header/query, invalid cursor, or exceeded bound. |
|---|
401 | Authentication is missing or invalid. |
|---|
403 | Permission or entitlement denied. |
|---|
404 | Unknown or out-of-tenant resource; both use the same response shape. |
|---|
405 | Request method is not allowed for this route. |
|---|
409 | State, uniqueness, active-reference, or idempotency conflict. |
|---|
412 | If-Match does not equal the current revision. |
|---|
422 | Provider binding, endpoint, path, credential state, or verification rejected. |
|---|
503 | Storage, 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| Name | In | Type | Required | Description |
|---|
tenant_scope_id | path | string(uuid) | Yes | — |
|---|
X-Request-ID | header | string | Yes | — |
|---|
limit | query | integer | No | — |
|---|
cursor | query | string | No | — |
|---|
status | query | string: pending_confirmation / authorized / installing / enabled / disabled / upgrade_failed_lkg_preserved / uninstalled | No | — |
|---|
plugin_id | query | string | No | — |
|---|
Responses
listPluginInstallations Responses| Status | Description |
|---|
200 | Stable keyset page Fields:items: array<PluginInstallation> next_cursor?: string |
|---|
400 | Stable localized-client error envelope |
|---|
401 | Stable localized-client error envelope |
|---|
403 | Stable localized-client error envelope |
|---|
502 | Stable 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| Name | In | Type | Required | Description |
|---|
tenant_scope_id | path | string(uuid) | Yes | — |
|---|
authorization_id | path | string(uuid) | Yes | — |
|---|
X-Request-ID | header | string | Yes | — |
|---|
Responses
getPluginInstallation Responses| Status | Description |
|---|
200 | Plugin 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 |
|---|
401 | Stable localized-client error envelope |
|---|
403 | Stable localized-client error envelope |
|---|
404 | Stable localized-client error envelope |
|---|
502 | Stable 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| Name | In | Type | Required | Description |
|---|
tenant_scope_id | path | string(uuid) | Yes | — |
|---|
authorization_id | path | string(uuid) | Yes | — |
|---|
If-Match | header | string | Yes | — |
|---|
Idempotency-Key | header | string | Yes | — |
|---|
X-Request-ID | header | string | Yes | — |
|---|
Request body
application/json · Required:Yes
confirmPluginInstallation Request body| Name | Type | Required | Description |
|---|
verification_id | string(uuid) | Yes | — |
|---|
approved_scopes | array<string> | Yes | — |
|---|
sensitive_permissions_confirmed | boolean | Yes | — |
|---|
new_permissions_confirmed | boolean | Yes | — |
|---|
Responses
confirmPluginInstallation Responses| Status | Description |
|---|
200 | Durable mutation snapshot; replay returns the original snapshot Fields:installation: PluginInstallation |
|---|
400 | Stable localized-client error envelope |
|---|
401 | Stable localized-client error envelope |
|---|
403 | Stable localized-client error envelope |
|---|
404 | Stable localized-client error envelope |
|---|
409 | Stable localized-client error envelope |
|---|
422 | Stable localized-client error envelope |
|---|
502 | Stable localized-client error envelope |
|---|
503 | Stable 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| Name | In | Type | Required | Description |
|---|
tenant_scope_id | path | string(uuid) | Yes | — |
|---|
authorization_id | path | string(uuid) | Yes | — |
|---|
If-Match | header | string | Yes | — |
|---|
Idempotency-Key | header | string | Yes | — |
|---|
X-Request-ID | header | string | Yes | — |
|---|
Request body
application/json · Required:Yes
disablePluginInstallation Request body| Name | Type | Required | Description |
|---|
reason | string | Yes | — |
|---|
Responses
disablePluginInstallation Responses| Status | Description |
|---|
200 | Durable mutation snapshot; replay returns the original snapshot Fields:installation: PluginInstallation |
|---|
400 | Stable localized-client error envelope |
|---|
401 | Stable localized-client error envelope |
|---|
403 | Stable localized-client error envelope |
|---|
404 | Stable localized-client error envelope |
|---|
409 | Stable localized-client error envelope |
|---|
502 | Stable localized-client error envelope |
|---|
503 | Stable 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| Name | In | Type | Required | Description |
|---|
tenant_scope_id | path | string(uuid) | Yes | — |
|---|
authorization_id | path | string(uuid) | Yes | — |
|---|
If-Match | header | string | Yes | — |
|---|
Idempotency-Key | header | string | Yes | — |
|---|
X-Request-ID | header | string | Yes | — |
|---|
Request body
application/json · Required:Yes
uninstallPluginInstallation Request body| Name | Type | Required | Description |
|---|
reason | string | Yes | — |
|---|
Responses
uninstallPluginInstallation Responses| Status | Description |
|---|
200 | Durable mutation snapshot; replay returns the original snapshot Fields:installation: PluginInstallation |
|---|
400 | Stable localized-client error envelope |
|---|
401 | Stable localized-client error envelope |
|---|
403 | Stable localized-client error envelope |
|---|
404 | Stable localized-client error envelope |
|---|
409 | Stable localized-client error envelope |
|---|
502 | Stable localized-client error envelope |
|---|
503 | Stable 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| Name | In | Type | Required | Description |
|---|
tenant_scope_id | path | string(uuid) | Yes | — |
|---|
authorization_id | path | string(uuid) | Yes | — |
|---|
If-Match | header | string | Yes | — |
|---|
Idempotency-Key | header | string | Yes | — |
|---|
X-Request-ID | header | string | Yes | — |
|---|
Request body
application/json · Required:Yes
upgradePluginInstallation Request body| Name | Type | Required | Description |
|---|
verification_id | string(uuid) | Yes | — |
|---|
approved_scopes | array<string> | Yes | — |
|---|
sensitive_permissions_confirmed | boolean | Yes | — |
|---|
new_permissions_confirmed | boolean | Yes | — |
|---|
Responses
upgradePluginInstallation Responses| Status | Description |
|---|
200 | Durable mutation snapshot; replay returns the original snapshot Fields:installation: PluginInstallation |
|---|
400 | Stable localized-client error envelope |
|---|
401 | Stable localized-client error envelope |
|---|
403 | Stable localized-client error envelope |
|---|
404 | Stable localized-client error envelope |
|---|
409 | Stable localized-client error envelope |
|---|
422 | Stable localized-client error envelope |
|---|
502 | Stable localized-client error envelope |
|---|
503 | Stable 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| Name | In | Type | Required | Description |
|---|
tenant_scope_id | path | string(uuid) | Yes | — |
|---|
cursor | query | string | No | — |
|---|
limit | query | integer | No | — |
|---|
Responses
listPluginWebhookSubscriptions Responses| Status | Description |
|---|
200 | Subscription page Fields:items: array<Subscription> next_cursor?: string |
|---|
400 | Validation failed |
|---|
401 | Authentication required |
|---|
403 | Permission or tenant scope denied |
|---|
404 | Resource not found |
|---|
503 | Store, 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| Name | In | Type | Required | Description |
|---|
tenant_scope_id | path | string(uuid) | Yes | — |
|---|
Idempotency-Key | header | string | Yes | — |
|---|
Request body
application/json · Required:Yes
createPluginWebhookSubscription Request body| Name | Type | Required | Description |
|---|
name | string | Yes | — |
|---|
target_url | string(uri) | Yes | HTTPS 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_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> | Yes | — |
|---|
installation_authorization_id | object | No | Optional enabled tenant installation authorization. Required when subscribing to non-test domain events; test-only subscriptions must omit it. |
|---|
site_ids | array<string(uuid)> | No | Optional 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| Status | Description |
|---|
201 | Created subscription with one-time secret Fields:subscription: Subscription secret: string |
|---|
400 | Validation failed |
|---|
401 | Authentication required |
|---|
403 | Permission or tenant scope denied |
|---|
409 | State or idempotency conflict |
|---|
422 | Target or entitlement rejected |
|---|
429 | Rate limited |
|---|
503 | Store, 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| Name | In | Type | Required | Description |
|---|
tenant_scope_id | path | string(uuid) | Yes | — |
|---|
subscription_id | path | string(uuid) | Yes | — |
|---|
Responses
getPluginWebhookSubscription Responses| Status | Description |
|---|
200 | Subscription 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) |
|---|
401 | Authentication required |
|---|
403 | Permission or tenant scope denied |
|---|
404 | Resource not found |
|---|
503 | Store, 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| Name | In | Type | Required | Description |
|---|
tenant_scope_id | path | string(uuid) | Yes | — |
|---|
subscription_id | path | string(uuid) | Yes | — |
|---|
cursor | query | string | No | — |
|---|
limit | query | integer | No | — |
|---|
Responses
listPluginWebhookDeliveries Responses| Status | Description |
|---|
200 | Delivery page Fields:items: array<Delivery> next_cursor?: string |
|---|
400 | Validation failed |
|---|
401 | Authentication required |
|---|
403 | Permission or tenant scope denied |
|---|
404 | Resource not found |
|---|
503 | Store, 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| Name | In | Type | Required | Description |
|---|
tenant_scope_id | path | string(uuid) | Yes | — |
|---|
subscription_id | path | string(uuid) | Yes | — |
|---|
delivery_id | path | string(uuid) | Yes | — |
|---|
Responses
getPluginWebhookDelivery Responses| Status | Description |
|---|
200 | Delivery 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) |
|---|
401 | Authentication required |
|---|
403 | Permission or tenant scope denied |
|---|
404 | Resource not found |
|---|
503 | Store, 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| Name | In | Type | Required | Description |
|---|
tenant_scope_id | path | string(uuid) | Yes | — |
|---|
subscription_id | path | string(uuid) | Yes | — |
|---|
delivery_id | path | string(uuid) | Yes | — |
|---|
Idempotency-Key | header | string | Yes | — |
|---|
Request body
application/json · Required:Yes
Responses
replayPluginWebhookDelivery Responses| Status | Description |
|---|
202 | Accepted delivery Fields:delivery: Delivery |
|---|
400 | Validation failed |
|---|
401 | Authentication required |
|---|
403 | Permission or tenant scope denied |
|---|
404 | Resource not found |
|---|
409 | State or idempotency conflict |
|---|
422 | Target or entitlement rejected |
|---|
429 | Rate limited |
|---|
503 | Store, 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| Name | In | Type | Required | Description |
|---|
tenant_scope_id | path | string(uuid) | Yes | — |
|---|
subscription_id | path | string(uuid) | Yes | — |
|---|
Idempotency-Key | header | string | Yes | — |
|---|
Request body
application/json · Required:Yes
replayPluginWebhookDeliveryRange Request body| Name | Type | Required | Description |
|---|
from | string(date-time) | Yes | Original delivery created at or after this time. |
|---|
to | string(date-time) | Yes | Original delivery created before this time; at most 31 days after from. |
|---|
statuses | array<string: delivered / dead_lettered> | No | Defaults to both terminal states; [dead_lettered] re-sends only failed deliveries. |
|---|
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> | No | — |
|---|
limit | integer | Yes | — |
|---|
Responses
replayPluginWebhookDeliveryRange Responses| Status | Description |
|---|
202 | Replay batch outcome. Fields:items: array<object> remaining: boolean |
|---|
400 | Validation failed |
|---|
401 | Authentication required |
|---|
403 | Permission or tenant scope denied |
|---|
404 | Resource not found |
|---|
409 | State or idempotency conflict |
|---|
503 | Store, 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| Name | In | Type | Required | Description |
|---|
tenant_scope_id | path | string(uuid) | Yes | — |
|---|
subscription_id | path | string(uuid) | Yes | — |
|---|
Idempotency-Key | header | string | Yes | — |
|---|
If-Match | header | string | Yes | — |
|---|
Request body
application/json · Required:Yes
Responses
revokePluginWebhookSubscription Responses| Status | Description |
|---|
200 | Updated subscription Fields:subscription: Subscription |
|---|
400 | Validation failed |
|---|
401 | Authentication required |
|---|
403 | Permission or tenant scope denied |
|---|
404 | Resource not found |
|---|
409 | State or idempotency conflict |
|---|
412 | Revision mismatch |
|---|
428 | If-Match is required |
|---|
503 | Store, 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| Name | In | Type | Required | Description |
|---|
tenant_scope_id | path | string(uuid) | Yes | — |
|---|
subscription_id | path | string(uuid) | Yes | — |
|---|
Idempotency-Key | header | string | Yes | — |
|---|
If-Match | header | string | Yes | — |
|---|
Request body
application/json · Required:Yes
Responses
rotatePluginWebhookSecret Responses| Status | Description |
|---|
201 | Pending 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 |
|---|
400 | Validation failed |
|---|
401 | Authentication required |
|---|
403 | Permission or tenant scope denied |
|---|
404 | Resource not found |
|---|
409 | State or idempotency conflict |
|---|
412 | Revision mismatch |
|---|
422 | Target or entitlement rejected |
|---|
428 | If-Match is required |
|---|
429 | Rate limited |
|---|
503 | Store, 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| Name | In | Type | Required | Description |
|---|
tenant_scope_id | path | string(uuid) | Yes | — |
|---|
subscription_id | path | string(uuid) | Yes | — |
|---|
rotation_id | path | string(uuid) | Yes | — |
|---|
Idempotency-Key | header | string | Yes | — |
|---|
If-Match | header | string | Yes | — |
|---|
Request body
application/json · Required:Yes
Responses
activatePluginWebhookSecret Responses| Status | Description |
|---|
200 | Updated subscription Fields:subscription: Subscription |
|---|
400 | Validation failed |
|---|
401 | Authentication required |
|---|
403 | Permission or tenant scope denied |
|---|
404 | Resource not found |
|---|
409 | State or idempotency conflict |
|---|
412 | Revision mismatch |
|---|
428 | If-Match is required |
|---|
503 | Store, 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| Name | In | Type | Required | Description |
|---|
tenant_scope_id | path | string(uuid) | Yes | — |
|---|
subscription_id | path | string(uuid) | Yes | — |
|---|
Idempotency-Key | header | string | Yes | — |
|---|
Request body
application/json · Required:Yes
Responses
createPluginWebhookTestDelivery Responses| Status | Description |
|---|
202 | Accepted delivery Fields:delivery: Delivery |
|---|
400 | Validation failed |
|---|
401 | Authentication required |
|---|
403 | Permission or tenant scope denied |
|---|
404 | Resource not found |
|---|
409 | State or idempotency conflict |
|---|
422 | Target or entitlement rejected |
|---|
429 | Rate limited |
|---|
503 | Store, 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| Name | In | Type | Required | Description |
|---|
tenant_scope_id | path | string(uuid) | Yes | — |
|---|
Responses
getTenantTheme Responses| Status | Description |
|---|
200 | 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> |
|---|
403 | Not 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| Name | In | Type | Required | Description |
|---|
tenant_scope_id | path | string(uuid) | Yes | — |
|---|
If-Match | header | string | Yes | "<revision>" from ETag |
|---|
Request body
application/json · Required:Yes
selectTenantTheme Request body| Name | Type | Required | Description |
|---|
package_sha256 | string | Yes | — |
|---|
Responses
selectTenantTheme Responses| Status | Description |
|---|
200 | New 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> |
|---|
403 | theme_permission_denied, theme_tenant_selection_denied or entitlement_feature_denied |
|---|
404 | Package not downloaded |
|---|
412 | theme_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