Operation details
Count distinct client IPs blocked by the global firewall or CC auto-bans
- operationId
getPlatformAnalyticsBlockedIPCount- Auth
- Session: the Bearer session of a signed-in control plane user, used by the customer in their own control plane; a plugin must never ask for it.
- Required permissions
All of:sites.read
Description (from the contract)
Requires a platform-scoped identity with sites.read or platform.admin. Counts distinct client_ip values from global_firewall block events and CC temporary_ban events in the left-closed, right-open window and is bounded by one ingestion snapshot. It is not the current ACL cardinality.
Parameters
getPlatformAnalyticsBlockedIPCount Parameters| Name | In | Type | Required | Description |
|---|
from | query | string(date-time) | Yes | RFC3339 instant. After UTC normalization it must be exactly hour aligned and earlier than to. |
|---|
to | query | string(date-time) | Yes | Exclusive RFC3339 instant. After UTC normalization it must be exactly hour aligned. The window may not exceed 31 days. |
|---|
tenant_id | query | string(uuid) | No | Platform route only. Omit for all tenants. |
|---|
site_id | query | string(uuid) | No | — |
|---|
node_id | query | string(uuid) | No | — |
|---|
Responses
getPlatformAnalyticsBlockedIPCount Responses| Status | Description |
|---|
200 | Distinct client IPs blocked by global firewall events or auto-banned by CC rules in the normalized UTC window. Fields:blocked_ip_count: integer(uint64) meta: QueryMetadata |
|---|
400 | analytics_invalid_request |
|---|
401 | analytics_authentication_required |
|---|
403 | analytics_permission_denied or analytics_scope_forbidden |
|---|
408 | analytics_request_cancelled |
|---|
502 | analytics_storage_rejected, analytics_storage_invalid_response, or analytics_response_too_large |
|---|
503 | analytics_storage_unavailable or analytics_realtime_evidence_unavailable; no zero-value data is substituted. site-realtime with query_version=3 returns partial coverage instead of analytics_realtime_evidence_unavailable for unsettled hours; dependency failures remain 503. |
|---|
504 | analytics_query_timeout |
|---|
What to do on failure
400 Fix the parameters or body per the field list; do not retry unchanged.401 Check the credential format and whether it expired or was rotated.403 Check the key scopes, the owner’s current permissions and the tenant scope; never switch to a more privileged account.503 A dependency is unavailable: retry later with the original Idempotency-Key.
↑ Back to list
Read the hourly distinct client IPs blocked by the global firewall
- operationId
getPlatformAnalyticsBlockedIPTrend- Auth
- Session: the Bearer session of a signed-in control plane user, used by the customer in their own control plane; a plugin must never ask for it.
- Required permissions
All of:sites.read
Description (from the contract)
Requires a platform-scoped identity with sites.read or platform.admin. Each returned UTC bucket contains the distinct client_ip count from global_firewall block events, bounded by one ingestion snapshot.
Parameters
getPlatformAnalyticsBlockedIPTrend Parameters| Name | In | Type | Required | Description |
|---|
from | query | string(date-time) | Yes | RFC3339 instant. After UTC normalization it must be exactly hour aligned and earlier than to. |
|---|
to | query | string(date-time) | Yes | Exclusive RFC3339 instant. After UTC normalization it must be exactly hour aligned. The window may not exceed 31 days. |
|---|
tenant_id | query | string(uuid) | No | Platform route only. Omit for all tenants. |
|---|
site_id | query | string(uuid) | No | — |
|---|
node_id | query | string(uuid) | No | — |
|---|
Responses
getPlatformAnalyticsBlockedIPTrend Responses| Status | Description |
|---|
200 | Hourly distinct client IPs blocked by global firewall events. Fields:data: array<BlockedIPTrendPoint> meta: QueryMetadata |
|---|
400 | analytics_invalid_request |
|---|
401 | analytics_authentication_required |
|---|
403 | analytics_permission_denied or analytics_scope_forbidden |
|---|
408 | analytics_request_cancelled |
|---|
502 | analytics_storage_rejected, analytics_storage_invalid_response, or analytics_response_too_large |
|---|
503 | analytics_storage_unavailable or analytics_realtime_evidence_unavailable; no zero-value data is substituted. site-realtime with query_version=3 returns partial coverage instead of analytics_realtime_evidence_unavailable for unsettled hours; dependency failures remain 503. |
|---|
504 | analytics_query_timeout |
|---|
What to do on failure
400 Fix the parameters or body per the field list; do not retry unchanged.401 Check the credential format and whether it expired or was rotated.403 Check the key scopes, the owner’s current permissions and the tenant scope; never switch to a more privileged account.503 A dependency is unavailable: retry later with the original Idempotency-Key.
↑ Back to list
List durable analytics connections dead-letter receipts
- operationId
listPlatformAnalyticsConnectionsDeadLetters- Auth
- Session: the Bearer session of a signed-in control plane user, used by the customer in their own control plane; a plugin must never ask for it.
- Required permissions
All of:sites.read platform.admin
Description (from the contract)
Requires a revocable platform Bearer session with sites.read and platform.admin. An optional tenant_id narrows the digest-only durable receipt projection to one tenant. Raw payloads are never returned.
Parameters
listPlatformAnalyticsConnectionsDeadLetters Parameters| Name | In | Type | Required | Description |
|---|
tenant_id | query | string(uuid) | No | Optional platform scope narrowing to one canonical tenant UUID. |
|---|
limit | query | integer | No | — |
|---|
after_sequence | query | integer(uint64) | No | Exclusive decimal JetStream dead-letter stream sequence cursor. |
|---|
Responses
listPlatformAnalyticsConnectionsDeadLetters Responses| Status | Description |
|---|
200 | Digest-only durable DLQ receipts ordered by dead-letter stream sequence. Fields:items: array<ConnectionsDeadLetterItem> next_after_sequence?: integer(uint64) |
|---|
400 | connections_dead_letter_invalid_request |
|---|
401 | connections_dead_letter_authentication_required |
|---|
403 | connections_dead_letter_permission_denied |
|---|
404 | connections_dead_letter_not_found |
|---|
408 | connections_dead_letter_request_timeout |
|---|
502 | connections_dead_letter_invalid_response or connections_dead_letter_response_too_large |
|---|
503 | connections_dead_letter_unavailable; no zero-value receipt is substituted. |
|---|
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
Read one durable analytics connections dead-letter receipt
- operationId
getPlatformAnalyticsConnectionsDeadLetter- Auth
- Session: the Bearer session of a signed-in control plane user, used by the customer in their own control plane; a plugin must never ask for it.
- Required permissions
All of:sites.read platform.admin
Description (from the contract)
Requires a revocable platform Bearer session with sites.read and platform.admin. The response is a digest-only durable receipt and never includes raw payload or secret fields.
Parameters
getPlatformAnalyticsConnectionsDeadLetter Parameters| Name | In | Type | Required | Description |
|---|
dead_letter_id | path | string | Yes | — |
|---|
Responses
getPlatformAnalyticsConnectionsDeadLetter Responses| Status | Description |
|---|
200 | One digest-only durable DLQ receipt. Fields:item: ConnectionsDeadLetterItem |
|---|
400 | connections_dead_letter_invalid_request |
|---|
401 | connections_dead_letter_authentication_required |
|---|
403 | connections_dead_letter_permission_denied |
|---|
404 | connections_dead_letter_not_found |
|---|
408 | connections_dead_letter_request_timeout |
|---|
502 | connections_dead_letter_invalid_response or connections_dead_letter_response_too_large |
|---|
503 | connections_dead_letter_unavailable; no zero-value receipt is substituted. |
|---|
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
Read finalized connections retention facts for a tenant subscription
- operationId
getPlatformAnalyticsConnectionsRetention- Auth
- Session: the Bearer session of a signed-in control plane user, used by the customer in their own control plane; a plugin must never ask for it.
- Required permissions
All of:sites.read platform.admin
Description (from the contract)
Requires a revocable platform Bearer session with sites.read and platform.admin. Tenant and subscription scope are mandatory and every returned fact is finalized, evidence-bound, and ordered by UTC period.
Parameters
getPlatformAnalyticsConnectionsRetention Parameters| Name | In | Type | Required | Description |
|---|
tenant_id | query | string(uuid) | Yes | Exact tenant scope for the platform retention route. |
|---|
subscription_id | query | string(uuid) | Yes | Package subscription authority captured at event time. |
|---|
from | query | string(date-time) | Yes | Inclusive canonical UTC RFC3339 instant. |
|---|
to | query | string(date-time) | Yes | Exclusive canonical UTC RFC3339 instant; the window may not exceed 31 days. |
|---|
limit | query | integer | No | — |
|---|
Responses
getPlatformAnalyticsConnectionsRetention Responses| Status | Description |
|---|
200 | Finalized connections facts in ascending period order. Fields:items: array<ConnectionsRetentionItem> |
|---|
400 | retention_invalid_request |
|---|
401 | retention_authentication_required |
|---|
403 | retention_permission_denied |
|---|
408 | retention_request_timeout |
|---|
502 | retention_invalid_response or retention_response_too_large |
|---|
503 | retention_unavailable; no zero-value fact is substituted. |
|---|
What to do on failure
400 Fix the parameters or body per the field list; do not retry unchanged.401 Check the credential format and whether it expired or was rotated.403 Check the key scopes, the owner’s current permissions and the tenant scope; never switch to a more privileged account.503 A dependency is unavailable: retry later with the original Idempotency-Key.
↑ Back to list
Read a platform or explicitly selected tenant hourly trend
- operationId
getPlatformAnalyticsHourlyTrend- Auth
- Session: the Bearer session of a signed-in control plane user, used by the customer in their own control plane; a plugin must never ask for it.
- Required permissions
All of:sites.read
Description (from the contract)
Requires a platform-scoped identity with sites.read or platform.admin. Buckets are UTC hours and only buckets containing events are returned.
Parameters
getPlatformAnalyticsHourlyTrend Parameters| Name | In | Type | Required | Description |
|---|
from | query | string(date-time) | Yes | RFC3339 instant. After UTC normalization it must be hour aligned and earlier than to. |
|---|
to | query | string(date-time) | Yes | Exclusive RFC3339 instant. It must be hour aligned after UTC normalization; the window is at most 31 days. |
|---|
tenant_id | query | string(uuid) | No | Platform route only. Omit for all tenants; tenant routes reject this parameter. |
|---|
site_id | query | string(uuid) | No | — |
|---|
node_id | query | string(uuid) | No | — |
|---|
Responses
getPlatformAnalyticsHourlyTrend Responses| Status | Description |
|---|
200 | UTC hourly metrics ordered by hour ascending; hours with no events are omitted. Fields:data: array<AnalyticsTrendPoint> meta: AnalyticsQueryMetadata |
|---|
400 | analytics_invalid_request |
|---|
401 | analytics_authentication_required |
|---|
403 | analytics_permission_denied or analytics_scope_forbidden |
|---|
408 | analytics_request_cancelled |
|---|
500 | analytics_internal_error |
|---|
502 | analytics_storage_rejected, analytics_storage_invalid_response, or analytics_response_too_large |
|---|
503 | analytics_storage_unavailable; no zero-value data is substituted. |
|---|
504 | analytics_query_timeout |
|---|
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.500 Outcome unknown: read back by ID or list first, then decide whether to retry with the original Idempotency-Key.503 A dependency is unavailable: retry later with the original Idempotency-Key.
↑ Back to list
GET /v1/admin/analytics/l4-realtime
- operationId
getAdminL4Realtime- 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
getAdminL4Realtime Parameters| Name | In | Type | Required | Description |
|---|
tenant_id | query | string(uuid) | No | 可选租户范围;省略时平台管理员查询全部租户 |
|---|
range | query | string: 1h / 6h / 12h / 24h / custom | Yes | — |
|---|
timezone | query | string | Yes | — |
|---|
from | query | string(date-time) | No | — |
|---|
to | query | string(date-time) | No | — |
|---|
site_id | query | string(uuid) | No | — |
|---|
stream_id | query | string(uuid) | No | — |
|---|
node_id | query | string(uuid) | No | — |
|---|
protocol | query | string: tcp / udp | No | — |
|---|
listen_port | query | integer | No | — |
|---|
limit | query | integer | No | — |
|---|
cursor | query | string | No | — |
|---|
Responses
getAdminL4Realtime Responses| Status | Description |
|---|
200 | L4 session aggregates Fields:version: string meta: object totals: object rows: array<object> next_cursor?: string |
|---|
400 | Request validation failed; clients map the stable code through locale resources. |
|---|
401 | Authentication is required or the session is invalid. |
|---|
403 | The authenticated principal cannot access this scope or operation. |
|---|
500 | The response could not be encoded safely. |
|---|
503 | The analytics dependency is unavailable; retry with the same query. |
|---|
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.500 Outcome unknown: read back by ID or list first, then decide whether to retry with the original Idempotency-Key.503 A dependency is unavailable: retry later with the original Idempotency-Key.
↑ Back to list
List access logs for one explicitly selected tenant
- operationId
listPlatformAccessLogs- Auth
- Session: the Bearer session of a signed-in control plane user, used by the customer in their own control plane; a plugin must never ask for it.
- Required permissions
All of:sites.read
Description (from the contract)
Requires a platform-scoped identity. tenant_id is mandatory; this API never performs an all-tenant log query. URI output contains only an origin-form path and omits query and fragment content.
Parameters
listPlatformAccessLogs Parameters| Name | In | Type | Required | Description |
|---|
tenant_id | query | string(uuid) | No | Platform route only; omit for all tenants or provide one tenant UUID to narrow the read. |
|---|
from | query | string(date-time) | Yes | Inclusive RFC3339 instant with at most millisecond precision. It is normalized to UTC and must be earlier than to. |
|---|
to | query | string(date-time) | Yes | Exclusive RFC3339 instant with at most millisecond precision. The window may not exceed 31 days. |
|---|
site_id | query | string(uuid) | No | — |
|---|
host | query | string | No | Access logs and block events: one host or up to 64 distinct space-separated hosts. |
|---|
node_id | query | string(uuid) | No | — |
|---|
client_ip | query | string(ip) | No | Exact IPv4 or IPv6 address without a zone identifier. |
|---|
uri_path | query | string | No | Exact origin-form path after query and fragment removal. |
|---|
uri_path_match | query | string: exact / prefix | No | How uri_path matches; prefix uses a startsWith match on the origin-form path. Requires uri_path. |
|---|
status_code | query | integer | No | — |
|---|
method | query | string | No | Exact HTTP method; access-log routes only. |
|---|
protocol | query | string | No | Exact stored protocol; access-log routes only. |
|---|
cache_status | query | string | No | Exact stored cache status; access-log routes only. |
|---|
upstream_result | query | string | No | — |
|---|
content_type | query | string | No | — |
|---|
user_agent | query | string | No | — |
|---|
request_bytes_min | query | integer(uint64) | No | — |
|---|
request_bytes_max | query | integer(uint64) | No | — |
|---|
response_bytes_min | query | integer(uint64) | No | — |
|---|
response_bytes_max | query | integer(uint64) | No | — |
|---|
country_code | query | string | No | Exact stored country or region code. |
|---|
carrier | query | string | No | Exact stored carrier value. |
|---|
ja4 | query | string | No | Exact stored JA4 fingerprint. Rows without a source JA4 do not match. |
|---|
origin_connect_us_min | query | integer(uint64) | No | — |
|---|
origin_connect_us_max | query | integer(uint64) | No | — |
|---|
origin_first_byte_us_min | query | integer(uint64) | No | — |
|---|
origin_first_byte_us_max | query | integer(uint64) | No | — |
|---|
origin_total_us_min | query | integer(uint64) | No | — |
|---|
origin_total_us_max | query | integer(uint64) | No | — |
|---|
limit | query | integer | No | Page size. When more rows exist at the fixed snapshot, the response includes an opaque next_cursor. |
|---|
cursor | query | string | No | Opaque keyset cursor returned by the preceding page. It is bound to the tenant, route kind, complete filter, descending direction, snapshot, and last (occurred_at,event_id) key. Malformed, overlong, or mismatched cursors are rejected and never re-scoped. |
|---|
Responses
listPlatformAccessLogs Responses| Status | Description |
|---|
200 | Snapshot-bounded access-log page. Fields:data: array<AccessLog> meta: QueryMetadata |
|---|
400 | Invalid GET body, time range, filter, limit, cursor, or required platform tenant scope. GET bodies are never read. |
|---|
401 | Authentication is required. |
|---|
403 | Permission or identity scope is forbidden. |
|---|
404 | Analytics log route was not found. |
|---|
422 | Returns analytics_logs_capability_unsupported for malformed cursor shapes rejected before storage or physically observable equal-version replacement ambiguity. |
|---|
503 | Storage transport, rejection, invalid response, or response limit failure. |
|---|
504 | Query deadline or caller cancellation was observed. |
|---|
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
List durable access-log exports owned by the calling account for the target tenant
- operationId
listPlatformAccessLogExports- Auth
- Session: the Bearer session of a signed-in control plane user, used by the customer in their own control plane; a plugin must never ask for it.
- Required permissions
All of:sites.read
Description (from the contract)
Without query filters, lists up to 50 exports owned by the calling account (user + access scope), regardless of the login session that created them. With from/to (and the same filters as the access-log list, without limit/cursor), returns at most one export: the latest generation for that account and normalized query scope, so the log view can recover it after re-login.
Parameters
listPlatformAccessLogExports Parameters| Name | In | Type | Required | Description |
|---|
tenant_id | query | string(uuid) | Yes | Platform route only; all-tenant log queries are forbidden. |
|---|
from | query | string(date-time) | No | Export scope lookup; when present, to is required and the filters follow the access-log list. |
|---|
to | query | string(date-time) | No | Export scope lookup; exclusive end of the window. |
|---|
site_id | query | string(uuid) | No | — |
|---|
host | query | string | No | Access logs and block events: one host or up to 64 distinct space-separated hosts. |
|---|
node_id | query | string(uuid) | No | — |
|---|
client_ip | query | string(ip) | No | Exact IPv4 or IPv6 address without a zone identifier. |
|---|
uri_path | query | string | No | Exact origin-form path after query and fragment removal. |
|---|
uri_path_match | query | string: exact / prefix | No | How uri_path matches; prefix uses a startsWith match on the origin-form path. Requires uri_path. |
|---|
status_code | query | integer | No | — |
|---|
method | query | string | No | Exact HTTP method; access-log routes only. |
|---|
protocol | query | string | No | Exact stored protocol; access-log routes only. |
|---|
cache_status | query | string | No | Exact stored cache status; access-log routes only. |
|---|
upstream_result | query | string | No | — |
|---|
content_type | query | string | No | — |
|---|
user_agent | query | string | No | — |
|---|
request_bytes_min | query | integer(uint64) | No | — |
|---|
request_bytes_max | query | integer(uint64) | No | — |
|---|
response_bytes_min | query | integer(uint64) | No | — |
|---|
response_bytes_max | query | integer(uint64) | No | — |
|---|
country_code | query | string | No | Exact stored country or region code. |
|---|
carrier | query | string | No | Exact stored carrier value. |
|---|
ja4 | query | string | No | Exact stored JA4 fingerprint. Rows without a source JA4 do not match. |
|---|
origin_connect_us_min | query | integer(uint64) | No | — |
|---|
origin_connect_us_max | query | integer(uint64) | No | — |
|---|
origin_first_byte_us_min | query | integer(uint64) | No | — |
|---|
origin_first_byte_us_max | query | integer(uint64) | No | — |
|---|
origin_total_us_min | query | integer(uint64) | No | — |
|---|
origin_total_us_max | query | integer(uint64) | No | — |
|---|
Responses
listPlatformAccessLogExports Responses| Status | Description |
|---|
200 | At most 50 exports for the exact actor, session, scope and tenant. Fields:data: array<AccessExport> |
|---|
400 | Invalid GET body, time range, filter, limit, cursor, or required platform tenant scope. GET bodies are never read. |
|---|
401 | Authentication is required. |
|---|
403 | Permission or identity scope is forbidden. |
|---|
503 | Storage transport, rejection, invalid response, or response limit failure. |
|---|
504 | Query deadline or caller cancellation was observed. |
|---|
What to do on failure
400 Fix the parameters or body per the field list; do not retry unchanged.401 Check the credential format and whether it expired or was rotated.403 Check the key scopes, the owner’s current permissions and the tenant scope; never switch to a more privileged account.503 A dependency is unavailable: retry later with the original Idempotency-Key.
↑ Back to list
Create a snapshot-bound access-log export for one target tenant
- operationId
createPlatformAccessLogExport- Auth
- Session: the Bearer session of a signed-in control plane user, used by the customer in their own control plane; a plugin must never ask for it.
- Required permissions
All of:sites.read
Description (from the contract)
Idempotent per account (user + access scope) and normalized query scope, independent of the login session. The same Idempotency-Key replays its export (409 if the key was used for another scope). For the same scope, a pending, running or unexpired completed export is reused (Idempotency-Replayed: true); a failed export with attempts left is retried in place under the same export id; otherwise a new generation is created.
Parameters
createPlatformAccessLogExport Parameters| Name | In | Type | Required | Description |
|---|
tenant_id | query | string(uuid) | Yes | Platform route only; all-tenant log queries are forbidden. |
|---|
Idempotency-Key | header | string | Yes | — |
|---|
Request body
application/json · Required:Yes
createPlatformAccessLogExport Request body| Name | Type | Required | Description |
|---|
filter | AccessExportFilter | Yes | — |
|---|
Responses
createPlatformAccessLogExport Responses| Status | Description |
|---|
202 | Durable export request accepted; an identical idempotency replay returns the same job. Fields:id: string(uuid) status: string: pending / running / completed / failed reason: string snapshot_at: string(date-time) | null(date-time) row_count: integer | null byte_count: integer | null sha256?: string created_at: string(date-time) expires_at: string(date-time) | null(date-time) downloadable: boolean filter: AccessExportFilter | null |
|---|
400 | Invalid GET body, time range, filter, limit, cursor, or required platform tenant scope. GET bodies are never read. |
|---|
401 | Authentication is required. |
|---|
403 | Permission or identity scope is forbidden. |
|---|
409 | Idempotency key is already bound to another normalized export request. |
|---|
503 | Storage transport, rejection, invalid response, or response limit failure. |
|---|
504 | Query deadline or caller cancellation was observed. |
|---|
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
- operationId
getPlatformAccessLogExport- Auth
- Session: the Bearer session of a signed-in control plane user, used by the customer in their own control plane; a plugin must never ask for it.
- Required permissions
All of:sites.read
Parameters
getPlatformAccessLogExport Parameters| Name | In | Type | Required | Description |
|---|
tenant_id | query | string(uuid) | Yes | Platform route only; all-tenant log queries are forbidden. |
|---|
export_id | path | string(uuid) | Yes | — |
|---|
Responses
getPlatformAccessLogExport Responses| Status | Description |
|---|
200 | Session-bound durable export status. Fields:id: string(uuid) status: string: pending / running / completed / failed reason: string snapshot_at: string(date-time) | null(date-time) row_count: integer | null byte_count: integer | null sha256?: string created_at: string(date-time) expires_at: string(date-time) | null(date-time) downloadable: boolean filter: AccessExportFilter | null |
|---|
400 | Invalid GET body, time range, filter, limit, cursor, or required platform tenant scope. GET bodies are never read. |
|---|
401 | Authentication is required. |
|---|
403 | Permission or identity scope is forbidden. |
|---|
404 | Analytics log route was not found. |
|---|
503 | Storage transport, rejection, invalid response, or response limit failure. |
|---|
504 | Query deadline or caller cancellation was observed. |
|---|
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
- operationId
downloadPlatformAccessLogExport- Auth
- Session: the Bearer session of a signed-in control plane user, used by the customer in their own control plane; a plugin must never ask for it.
- Required permissions
All of:sites.read
Parameters
downloadPlatformAccessLogExport Parameters| Name | In | Type | Required | Description |
|---|
tenant_id | query | string(uuid) | Yes | Platform route only; all-tenant log queries are forbidden. |
|---|
export_id | path | string(uuid) | Yes | — |
|---|
X-Analytics-Download-Token | header | string | Yes | Short-lived one-time token. The server stores only its SHA-256 digest. |
|---|
Responses
downloadPlatformAccessLogExport Responses| Status | Description |
|---|
200 | RFC4180 UTF-8 CSV consumed atomically by the one-time grant. |
|---|
400 | Invalid GET body, time range, filter, limit, cursor, or required platform tenant scope. GET bodies are never read. |
|---|
401 | Authentication is required. |
|---|
403 | Permission or identity scope is forbidden. |
|---|
410 | Grant is malformed, expired, consumed, or belongs to another session or scope. |
|---|
503 | Storage transport, rejection, invalid response, or response limit failure. |
|---|
504 | Query deadline or caller cancellation was observed. |
|---|
What to do on failure
400 Fix the parameters or body per the field list; do not retry unchanged.401 Check the credential format and whether it expired or was rotated.403 Check the key scopes, the owner’s current permissions and the tenant scope; never switch to a more privileged account.503 A dependency is unavailable: retry later with the original Idempotency-Key.
↑ Back to list
- operationId
grantPlatformAccessLogExportDownload- Auth
- Session: the Bearer session of a signed-in control plane user, used by the customer in their own control plane; a plugin must never ask for it.
- Required permissions
All of:sites.read
Description (from the contract)
Returns a short-lived one-time token bound to the current platform session, target tenant and export. Any session of the owning account may request a grant; a token from another session is rejected. Only its SHA-256 digest is stored.
Parameters
grantPlatformAccessLogExportDownload Parameters| Name | In | Type | Required | Description |
|---|
tenant_id | query | string(uuid) | Yes | Platform route only; all-tenant log queries are forbidden. |
|---|
export_id | path | string(uuid) | Yes | — |
|---|
Responses
grantPlatformAccessLogExportDownload Responses| Status | Description |
|---|
201 | One-time grant. Only the SHA-256 token digest is persisted. Fields:export_id: string(uuid) token: string expires_at: string(date-time) |
|---|
400 | Invalid GET body, time range, filter, limit, cursor, or required platform tenant scope. GET bodies are never read. |
|---|
401 | Authentication is required. |
|---|
403 | Permission or identity scope is forbidden. |
|---|
404 | Analytics log route was not found. |
|---|
503 | Storage transport, rejection, invalid response, or response limit failure. |
|---|
504 | Query deadline or caller cancellation was observed. |
|---|
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
List security block events for one explicitly selected tenant
- operationId
listPlatformBlockEvents- Auth
- Session: the Bearer session of a signed-in control plane user, used by the customer in their own control plane; a plugin must never ask for it.
- Required permissions
All of:sites.read
Description (from the contract)
Requires a platform-scoped identity and an explicit tenant_id. Returns the current security-event projection with the same snapshot-bounded opaque cursor contract as access logs. This is raw event retrieval, not an immutable block-state transition history.
Parameters
listPlatformBlockEvents Parameters| Name | In | Type | Required | Description |
|---|
tenant_id | query | string(uuid) | No | Platform route only; omit for all tenants or provide one tenant UUID to narrow the read. |
|---|
from | query | string(date-time) | Yes | Inclusive RFC3339 instant with at most millisecond precision. It is normalized to UTC and must be earlier than to. |
|---|
to | query | string(date-time) | Yes | Exclusive RFC3339 instant with at most millisecond precision. The window may not exceed 31 days. |
|---|
site_id | query | string(uuid) | No | — |
|---|
node_id | query | string(uuid) | No | — |
|---|
client_ip | query | string(ip) | No | Exact IPv4 or IPv6 address without a zone identifier. |
|---|
uri_path | query | string | No | Exact origin-form path after query and fragment removal. |
|---|
uri_path_match | query | string: exact / prefix | No | How uri_path matches; prefix uses a startsWith match on the origin-form path. Requires uri_path. |
|---|
status_code | query | const 0 | integer | No | Exact stored status; 0 means no HTTP status was recorded. |
|---|
action | query | string: block / challenge / log / temporary_ban | No | Block events only: narrow to block, challenge, log (observed) or temporary_ban (auto block); default all four, the hits the WAF overview counts. A CC challenge page / 429 is one event per site, client IP, rule, action and minute with its request count. |
|---|
event_type | query | string | No | Block events only: narrow to one event type (waf, cc, acl, ...). |
|---|
host | query | string | No | Access logs and block events: one host or up to 64 distinct space-separated hosts. |
|---|
country_code | query | string | No | Exact stored country or region code. |
|---|
carrier | query | string | No | Exact stored carrier value. |
|---|
ja4 | query | string | No | Exact stored JA4 fingerprint. Rows without a source JA4 do not match. |
|---|
origin_connect_us_min | query | integer(uint64) | No | — |
|---|
origin_connect_us_max | query | integer(uint64) | No | — |
|---|
origin_first_byte_us_min | query | integer(uint64) | No | — |
|---|
origin_first_byte_us_max | query | integer(uint64) | No | — |
|---|
origin_total_us_min | query | integer(uint64) | No | — |
|---|
origin_total_us_max | query | integer(uint64) | No | — |
|---|
limit | query | integer | No | Page size. When more rows exist at the fixed snapshot, the response includes an opaque next_cursor. |
|---|
cursor | query | string | No | Opaque keyset cursor returned by the preceding page. It is bound to the tenant, route kind, complete filter, descending direction, snapshot, and last (occurred_at,event_id) key. Malformed, overlong, or mismatched cursors are rejected and never re-scoped. |
|---|
Responses
listPlatformBlockEvents Responses| Status | Description |
|---|
200 | Snapshot-bounded security block-event page. Fields:data: array<BlockEvent> meta: QueryMetadata |
|---|
400 | Invalid GET body, time range, filter, limit, cursor, or required platform tenant scope. GET bodies are never read. |
|---|
401 | Authentication is required. |
|---|
403 | Permission or identity scope is forbidden. |
|---|
404 | Analytics log route was not found. |
|---|
422 | Returns analytics_logs_capability_unsupported for malformed cursor shapes rejected before storage or physically observable equal-version replacement ambiguity. |
|---|
503 | Storage transport, rejection, invalid response, or response limit failure. |
|---|
504 | Query deadline or caller cancellation was observed. |
|---|
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
List current ACL blocks across the customer control plane
- operationId
listPlatformCurrentBlocks- Auth
- Session: the Bearer session of a signed-in control plane user, used by the customer in their own control plane; a plugin must never ask for it.
- Required permissions
All of:sites.read
Description (from the contract)
Returns only CIDRs present in the active site ACL policy. A newer unpublished policy revision or open activation makes the item non-unlockable. tenant_id optionally narrows the platform-wide read; every row carries its tenant_id so write actions stay explicitly scoped.
Parameters
listPlatformCurrentBlocks Parameters| Name | In | Type | Required | Description |
|---|
tenant_id | query | string(uuid) | No | Platform route only; omit for all tenants or provide one tenant UUID to narrow the read. |
|---|
site_id | query | string(uuid) | No | — |
|---|
limit | query | integer | No | Maximum current or historical block facts returned. |
|---|
offset | query | integer | No | Number of matching current or historical block facts to skip. |
|---|
Responses
listPlatformCurrentBlocks Responses| Status | Description |
|---|
200 | Current active ACL block facts. Fields:data: array<CurrentBlock> total_count: integer(uint64) snapshot_at: string(date-time) |
|---|
400 | Invalid GET body, time range, filter, limit, cursor, or required platform tenant scope. GET bodies are never read. |
|---|
401 | Authentication is required. |
|---|
403 | Permission or identity scope is forbidden. |
|---|
404 | Analytics log route was not found. |
|---|
503 | Storage transport, rejection, invalid response, or response limit failure. |
|---|
504 | Query deadline or caller cancellation was observed. |
|---|
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
Count current ACL blocks by site across the customer control plane
- operationId
countPlatformCurrentBlocksBySite- Auth
- Session: the Bearer session of a signed-in control plane user, used by the customer in their own control plane; a plugin must never ask for it.
- Required permissions
All of:sites.read
Parameters
countPlatformCurrentBlocksBySite Parameters| Name | In | Type | Required | Description |
|---|
tenant_id | query | string(uuid) | No | Platform route only; omit for all tenants or provide one tenant UUID to narrow the read. |
|---|
Responses
countPlatformCurrentBlocksBySite Responses| Status | Description |
|---|
200 | Current active ACL block totals grouped by site. Fields:data: array<SiteBlacklistCount> total_count: integer(uint64) snapshot_at: string(date-time) |
|---|
400 | Invalid GET body, time range, filter, limit, cursor, or required platform tenant scope. GET bodies are never read. |
|---|
401 | Authentication is required. |
|---|
403 | Permission or identity scope is forbidden. |
|---|
503 | Storage transport, rejection, invalid response, or response limit failure. |
|---|
504 | Query deadline or caller cancellation was observed. |
|---|
What to do on failure
400 Fix the parameters or body per the field list; do not retry unchanged.401 Check the credential format and whether it expired or was rotated.403 Check the key scopes, the owner’s current permissions and the tenant scope; never switch to a more privileged account.503 A dependency is unavailable: retry later with the original Idempotency-Key.
↑ Back to list
Unlock one current ACL block for an explicitly selected tenant
- operationId
unlockPlatformCurrentBlock- 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:security_policies.manage
Description (from the contract)
Removes exactly one CIDR from a new ACL policy revision, then starts a version-fenced edge activation. A stale active revision, open activation, missing target CIDR, or missing target-node snapshot fails closed with 409. Reusing the same key and body returns the same durable result; a conflicting body is rejected.
Parameters
unlockPlatformCurrentBlock Parameters| Name | In | Type | Required | Description |
|---|
block_id | path | string(uuid) | Yes | Stable identity derived from site, active ACL policy and canonical CIDR. |
|---|
tenant_id | query | string(uuid) | Yes | Platform route only; all-tenant log queries are forbidden. |
|---|
Idempotency-Key | header | string | Yes | — |
|---|
Request body
application/json · Required:Yes
unlockPlatformCurrentBlock Request body| Name | Type | Required | Description |
|---|
reason_code | string | Yes | — |
|---|
Responses
unlockPlatformCurrentBlock Responses| Status | Description |
|---|
202 | The successor policy and activation were durably accepted. Fields:block_id: string(uuid) candidate_id: string(uuid) progress: string: claimed / canary / expanding / healthy / failed / cancelled / expired / promoted reason_code: string: recovery_claimed / recovery_replayed replayed: boolean |
|---|
400 | Invalid GET body, time range, filter, limit, cursor, or required platform tenant scope. GET bodies are never read. |
|---|
401 | Authentication is required. |
|---|
403 | Permission or identity scope is forbidden. |
|---|
404 | The scoped active block no longer exists. |
|---|
409 | Returns analytics_block_unlock_conflict when the policy, active edge revision, open activation or target-node snapshot changed. |
|---|
503 | Storage transport, rejection, invalid response, or response limit failure. |
|---|
504 | Query deadline or caller cancellation was observed. |
|---|
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/admin/analytics/logs/blocks/history
List audited unlock history across the customer control plane
- operationId
listPlatformBlockHistory- Auth
- Session: the Bearer session of a signed-in control plane user, used by the customer in their own control plane; a plugin must never ask for it.
- Required permissions
All of:sites.read
Description (from the contract)
Returns append-only cidr_unlock activation audit facts and their latest durable edge rollout progress. tenant_id optionally narrows the platform-wide read.
Parameters
listPlatformBlockHistory Parameters| Name | In | Type | Required | Description |
|---|
tenant_id | query | string(uuid) | No | Platform route only; omit for all tenants or provide one tenant UUID to narrow the read. |
|---|
site_id | query | string(uuid) | No | — |
|---|
limit | query | integer | No | Maximum current or historical block facts returned. |
|---|
offset | query | integer | No | Number of matching current or historical block facts to skip. |
|---|
Responses
listPlatformBlockHistory Responses| Status | Description |
|---|
200 | Append-only CIDR unlock history with durable edge progress. Fields:data: array<BlockHistory> total_count: integer(uint64) snapshot_at: string(date-time) |
|---|
400 | Invalid GET body, time range, filter, limit, cursor, or required platform tenant scope. GET bodies are never read. |
|---|
401 | Authentication is required. |
|---|
403 | Permission or identity scope is forbidden. |
|---|
404 | Analytics log route was not found. |
|---|
503 | Storage transport, rejection, invalid response, or response limit failure. |
|---|
504 | Query deadline or caller cancellation was observed. |
|---|
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
List cross-node CC coordination states of every tenant, optionally narrowed to one tenant or site
- operationId
listPlatformCCCoordinationStates- Auth
- Session: the Bearer session of a signed-in control plane user, used by the customer in their own control plane; a plugin must never ask for it.
- Required permissions
All of:sites.read
Parameters
listPlatformCCCoordinationStates Parameters| Name | In | Type | Required | Description |
|---|
tenant_id | query | string(uuid) | No | Platform route only; omit for all tenants or provide one tenant UUID to narrow the read. |
|---|
site_id | query | string(uuid) | No | — |
|---|
limit | query | integer | No | Maximum current or historical block facts returned. |
|---|
Responses
listPlatformCCCoordinationStates Responses| Status | Description |
|---|
200 | Durable tenant/site-scoped cross-node CC state. Fields:items: array<CCCoordinationState> |
|---|
400 | Invalid GET body, time range, filter, limit, cursor, or required platform tenant scope. GET bodies are never read. |
|---|
401 | Authentication is required. |
|---|
403 | Permission or identity scope is forbidden. |
|---|
503 | Storage transport, rejection, invalid response, or response limit failure. |
|---|
504 | Query deadline or caller cancellation was observed. |
|---|
What to do on failure
400 Fix the parameters or body per the field list; do not retry unchanged.401 Check the credential format and whether it expired or was rotated.403 Check the key scopes, the owner’s current permissions and the tenant scope; never switch to a more privileged account.503 A dependency is unavailable: retry later with the original Idempotency-Key.
↑ Back to list
Release one exact cross-node CC state after a false-positive decision
- operationId
releasePlatformCCCoordinationState- 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:security_policies.manage
Parameters
releasePlatformCCCoordinationState Parameters| Name | In | Type | Required | Description |
|---|
state_id | path | string(uuid) | Yes | — |
|---|
tenant_id | query | string(uuid) | Yes | Platform route only; all-tenant log queries are forbidden. |
|---|
site_id | query | string(uuid) | Yes | — |
|---|
Idempotency-Key | header | string | Yes | — |
|---|
X-Request-ID | header | string | Yes | — |
|---|
Request body
application/json · Required:Yes
releasePlatformCCCoordinationState Request body| Name | Type | Required | Description |
|---|
reason_code | string | Yes | — |
|---|
expected_generation | integer(int64) | Yes | — |
|---|
Responses
releasePlatformCCCoordinationState Responses| Status | Description |
|---|
202 | The exact generation was accepted for audited release. Fields:state: CCCoordinationState replayed: boolean |
|---|
400 | Invalid GET body, time range, filter, limit, cursor, or required platform tenant scope. GET bodies are never read. |
|---|
401 | Authentication is required. |
|---|
403 | Permission or identity scope is forbidden. |
|---|
409 | Returns analytics_block_unlock_conflict when the policy, active edge revision, open activation or target-node snapshot changed. |
|---|
503 | Storage transport, rejection, invalid response, or response limit failure. |
|---|
504 | Query deadline or caller cancellation was observed. |
|---|
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
Reconcile one tenant log fact against a verified GeoIP catalog
- operationId
getPlatformAnalyticsGeoEvidence- Auth
- Session: the Bearer session of a signed-in control plane user, used by the customer in their own control plane; a plugin must never ask for it.
- Required permissions
All of:sites.read
Parameters
getPlatformAnalyticsGeoEvidence Parameters| Name | In | Type | Required | Description |
|---|
kind | path | string: access / block | Yes | — |
|---|
event_id | path | string | Yes | — |
|---|
from | query | string(date-time) | Yes | — |
|---|
to | query | string(date-time) | Yes | — |
|---|
tenant_id | query | string(uuid) | Yes | — |
|---|
site_id | query | string(uuid) | Yes | — |
|---|
node_id | query | string(uuid) | Yes | — |
|---|
client_ip | query | string(ip) | Yes | — |
|---|
database_version | query | string | No | — |
|---|
Responses
getPlatformAnalyticsGeoEvidence Responses| Status | Description |
|---|
200 | Verified bounded geo evidence. Fields:data: Evidence |
|---|
400 | Invalid request. |
|---|
401 | Stable error envelope. |
|---|
403 | Stable error envelope. |
|---|
404 | Stable error envelope. |
|---|
408 | Stable error envelope. |
|---|
409 | Stable error envelope. |
|---|
502 | Stable error envelope. |
|---|
503 | Stable error envelope. |
|---|
504 | Stable 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/admin/analytics/market-security
List relayed market supply attack log lines of any tenant
- operationId
listAdminMarketSecurityLogs- 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:platform.admin
Parameters
listAdminMarketSecurityLogs Parameters| Name | In | Type | Required | Description |
|---|
tenant_id | query | string(uuid) | Yes | — |
|---|
from | query | string(date-time) | Yes | RFC 3339; at most 31 days before to. |
|---|
to | query | string(date-time) | Yes | — |
|---|
site_id | query | string(uuid) | No | — |
|---|
client_ip | query | string | No | — |
|---|
host | query | string | No | — |
|---|
cursor | query | string | No | meta.next_cursor of the previous page. |
|---|
limit | query | integer | No | — |
|---|
Responses
listAdminMarketSecurityLogs Responses| Status | Description |
|---|
200 | Newest first. Fields:data: array<Log> meta: object |
|---|
400 | Error. |
|---|
401 | Error. |
|---|
403 | Error. |
|---|
405 | Error. |
|---|
503 | Error. |
|---|
What to do on failure
400 Fix the parameters or body per the field list; do not retry unchanged.401 Check the credential format and whether it expired or was rotated.403 Check the key scopes, the owner’s current permissions and the tenant scope; never switch to a more privileged account.503 A dependency is unavailable: retry later with the original Idempotency-Key.
↑ Back to list
Read one tenant's site monitoring as a platform administrator
- operationId
getPlatformSiteMonitoring- 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:platform.admin
Description (from the contract)
Requires a platform session with platform.admin and exactly one canonical tenant_id. Omitting, duplicating, or changing tenant scope through identity headers is rejected before any source is queried.
Parameters
getPlatformSiteMonitoring Parameters| Name | In | Type | Required | Description |
|---|
tenant_id | query | string(uuid) | Yes | — |
|---|
range | query | string: 1h / 6h / 12h / custom | Yes | Fixed presets use no from/to values. custom requires both from and to and is limited to 31 days; longer ranges are rejected. |
|---|
from | query | string(date-time) | No | Inclusive UTC boundary, required only for range=custom. |
|---|
to | query | string(date-time) | No | Exclusive UTC boundary, required only for range=custom. |
|---|
timezone | query | string | Yes | — |
|---|
site_id | query | string(uuid) | No | — |
|---|
node_id | query | string(uuid) | No | — |
|---|
domain | query | string | No | — |
|---|
listen_port | query | integer | No | — |
|---|
rank_by | query | string: host / site / node / status_code | No | — |
|---|
limit | query | integer | No | — |
|---|
cursor | query | string | No | Opaque snapshot- and filter-bound cursor. |
|---|
X-Request-ID | header | string | No | — |
|---|
Responses
getPlatformSiteMonitoring Responses| Status | Description |
|---|
200 | Finalized monitoring aggregate. Fields:version: string meta: SiteMonitoringMeta basic: AvailableBasic | DegradedSection quality: AvailableQuality | DegradedSection origin: AvailableOrigin | DegradedSection rank: AvailableRank | DegradedSection |
|---|
400 | Stable non-leaking error envelope. |
|---|
401 | Stable non-leaking error envelope. |
|---|
403 | Stable non-leaking error envelope. |
|---|
405 | Stable non-leaking error envelope. |
|---|
408 | Stable non-leaking error envelope. |
|---|
502 | Stable non-leaking error envelope. |
|---|
503 | Stable non-leaking error envelope. |
|---|
504 | Stable non-leaking 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.503 A dependency is unavailable: retry later with the original Idempotency-Key.
↑ Back to list
Read one tenant's quality diagnostics from the platform scope
- operationId
getPlatformQualityDiagnostics- 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:platform.admin
Parameters
getPlatformQualityDiagnostics Parameters| Name | In | Type | Required | Description |
|---|
tenant_id | query | string(uuid) | Yes | — |
|---|
from | query | string(date-time) | Yes | Inclusive UTC millisecond boundary. |
|---|
to | query | string(date-time) | Yes | Exclusive UTC millisecond boundary, at most 31 days after from. |
|---|
site_id | query | string(uuid) | No | — |
|---|
node_id | query | string(uuid) | No | — |
|---|
category | query | string: upstream_5xx / edge_530 / no_host / config_mismatch | No | — |
|---|
limit | query | integer | No | — |
|---|
cursor | query | string | No | — |
|---|
Responses
getPlatformQualityDiagnostics Responses| Status | Description |
|---|
200 | Finalized, latest-state diagnostics at one exact snapshot. Fields:items: array<QualityDiagnostic> next_cursor: string | null snapshot: FinalizedSnapshot effective_tenant_id?: string(uuid) |
|---|
400 | Stable error response with no raw dependency text. |
|---|
401 | Stable error response with no raw dependency text. |
|---|
403 | Stable error response with no raw dependency text. |
|---|
405 | Stable error response with no raw dependency text. |
|---|
408 | Stable error response with no raw dependency text. |
|---|
409 | Stable error response with no raw dependency text. |
|---|
502 | Stable error response with no raw dependency text. |
|---|
503 | Stable error response with no raw dependency text. |
|---|
504 | Stable error response with no raw dependency text. |
|---|
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
Read platform-wide or one tenant's finalized site realtime facts
- operationId
getPlatformSiteRealtime- Auth
- Session: the Bearer session of a signed-in control plane user, used by the customer in their own control plane; a plugin must never ask for it.
- Required permissions
All of:sites.read
Description (from the contract)
Requires a platform identity with sites.read or platform.admin. Omitting tenant_id queries all tenants; providing it narrows the query to one tenant. With query_version=2 the exact minute-aligned [from,to) interval is projected without rounding. Without query_version, legacy hour alignment and the original response keys are preserved. Its enclosing complete UTC hours must first have independent PostgreSQL source coverage; their expected counts are reconciled with a single ClickHouse access scan shared by all exact-range projections.
Parameters
getPlatformSiteRealtime Parameters| Name | In | Type | Required | Description |
|---|
from | query | string(date-time) | Yes | Inclusive RFC3339 instant, exactly minute aligned after UTC normalization with query_version=2, otherwise hour aligned; never silently rounded. |
|---|
to | query | string(date-time) | Yes | Exclusive RFC3339 instant, exactly minute aligned after UTC normalization with query_version=2, otherwise hour aligned; later than from and no more than 31 days apart. |
|---|
tenant_id | query | string(uuid) | No | Platform route only. Omit for all tenants or provide one exact tenant scope. |
|---|
query_version | query | integer: 2 / 3 / 4 | No | Explicit opt-in to minute queries and extended series/evidence. 3 adds coverage fields and returns settled hours when other enclosing hours are not finalized yet (coverage_complete=false, missing_windows lists the excluded hour starts) instead of 503. 4 is the realtime monitor: it reads every fact ingested so far, the unsettled current hour included, with no settlement reconciliation (coverage_complete=true, expected_events=0, finalized_through and source_watermark at the Unix epoch); it is a display read and never feeds billing. Omit for the legacy hour-aligned response; other values, empty or repeated values are rejected. |
|---|
site_id | query | string(uuid) | No | — |
|---|
host | query | string | No | One or more canonical lowercase hosts without trailing dots, separated by single spaces. |
|---|
listen_port | query | integer | No | Exact production listen port. Omit to include legacy port-zero facts. |
|---|
Responses
getPlatformSiteRealtime Responses| Status | Description |
|---|
200 | Finalized atomic site realtime facts and source reconciliation evidence. |
|---|
400 | analytics_invalid_request |
|---|
401 | analytics_authentication_required |
|---|
403 | analytics_permission_denied or analytics_scope_forbidden |
|---|
408 | analytics_request_cancelled |
|---|
502 | analytics_storage_rejected, analytics_storage_invalid_response, or analytics_response_too_large |
|---|
503 | analytics_storage_unavailable or analytics_realtime_evidence_unavailable; no zero-value data is substituted. site-realtime with query_version=3 returns partial coverage instead of analytics_realtime_evidence_unavailable for unsettled hours; dependency failures remain 503. |
|---|
504 | analytics_query_timeout |
|---|
What to do on failure
400 Fix the parameters or body per the field list; do not retry unchanged.401 Check the credential format and whether it expired or was rotated.403 Check the key scopes, the owner’s current permissions and the tenant scope; never switch to a more privileged account.503 A dependency is unavailable: retry later with the original Idempotency-Key.
↑ Back to list
Read a platform or explicitly selected tenant analytics summary
- operationId
getPlatformAnalyticsSummary- Auth
- Session: the Bearer session of a signed-in control plane user, used by the customer in their own control plane; a plugin must never ask for it.
- Required permissions
All of:sites.read
Description (from the contract)
Requires a platform-scoped identity with sites.read or platform.admin. Omitting tenant_id queries all tenants; providing tenant_id narrows the query to that tenant. The time window is left-closed and right-open.
Parameters
getPlatformAnalyticsSummary Parameters| Name | In | Type | Required | Description |
|---|
from | query | string(date-time) | Yes | RFC3339 instant. After UTC normalization it must be hour aligned and earlier than to. |
|---|
to | query | string(date-time) | Yes | Exclusive RFC3339 instant. It must be hour aligned after UTC normalization; the window is at most 31 days. |
|---|
tenant_id | query | string(uuid) | No | Platform route only. Omit for all tenants; tenant routes reject this parameter. |
|---|
site_id | query | string(uuid) | No | — |
|---|
node_id | query | string(uuid) | No | — |
|---|
Responses
getPlatformAnalyticsSummary Responses| Status | Description |
|---|
200 | Aggregated metrics for the normalized UTC window. Fields:data: AnalyticsSummaryMetrics meta: AnalyticsQueryMetadata |
|---|
400 | analytics_invalid_request |
|---|
401 | analytics_authentication_required |
|---|
403 | analytics_permission_denied or analytics_scope_forbidden |
|---|
408 | analytics_request_cancelled |
|---|
500 | analytics_internal_error |
|---|
502 | analytics_storage_rejected, analytics_storage_invalid_response, or analytics_response_too_large |
|---|
503 | analytics_storage_unavailable; no zero-value data is substituted. |
|---|
504 | analytics_query_timeout |
|---|
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.500 Outcome unknown: read back by ID or list first, then decide whether to retry with the original Idempotency-Key.503 A dependency is unavailable: retry later with the original Idempotency-Key.
↑ Back to list
Page through a platform or explicitly selected tenant ranking
- operationId
getPlatformAnalyticsTop- Auth
- Session: the Bearer session of a signed-in control plane user, used by the customer in their own control plane; a plugin must never ask for it.
- Required permissions
All of:sites.read
Description (from the contract)
Requires a platform-scoped identity with sites.read or platform.admin. The cursor is bound to scope, filters, dimension, and one ingestion snapshot. The ja4 dimension is reserved but unsupported in v1.
Parameters
getPlatformAnalyticsTop Parameters| Name | In | Type | Required | Description |
|---|
dimension | path | string: url / ip / domain / region / carrier / ja4 / referer / province / browser / os | Yes | region is the ISO country code, province the GB/T 2260 province code (both from the control plane's IP library at ingest), browser and os the node's User-Agent families. Empty values are returned as __unknown__. ip, domain, region, carrier, province, browser and os rank from the hourly history facts; url, ja4 and referer from the access log (see page.source and page.retained_from). |
|---|
from | query | string(date-time) | Yes | RFC3339 instant. After UTC normalization it must be hour aligned and earlier than to. |
|---|
to | query | string(date-time) | Yes | Exclusive RFC3339 instant. It must be hour aligned after UTC normalization; the window is at most 31 days. |
|---|
tenant_id | query | string(uuid) | No | Platform route only. Omit for all tenants; tenant routes reject this parameter. |
|---|
site_id | query | string(uuid) | No | — |
|---|
node_id | query | string(uuid) | No | — |
|---|
limit | query | integer | No | — |
|---|
cursor | query | string | No | Opaque cursor bound to the authenticated scope, filters, dimension, and snapshot. |
|---|
Responses
getPlatformAnalyticsTop Responses| Status | Description |
|---|
200 | Deterministically ordered ranking page from one ingestion snapshot. Fields:data: array<AnalyticsRankItem> dimension: string: url / ip / domain / region / carrier / ja4 / referer / province / browser / os page: AnalyticsRankPage meta: AnalyticsQueryMetadata |
|---|
400 | analytics_invalid_request |
|---|
401 | analytics_authentication_required |
|---|
403 | analytics_permission_denied or analytics_scope_forbidden |
|---|
408 | analytics_request_cancelled |
|---|
422 | analytics_dimension_unsupported |
|---|
500 | analytics_internal_error |
|---|
502 | analytics_storage_rejected, analytics_storage_invalid_response, or analytics_response_too_large |
|---|
503 | analytics_storage_unavailable; no zero-value data is substituted. |
|---|
504 | analytics_query_timeout |
|---|
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.500 Outcome unknown: read back by ID or list first, then decide whether to retry with the original Idempotency-Key.503 A dependency is unavailable: retry later with the original Idempotency-Key.
↑ Back to list