MethodPathSummaryAuth
GET/v1/analytics/blocked-ip-countCount distinct client IPs blocked by the global firewall or CC auto-bansAPI keySession
GET/v1/analytics/blocked-ip-trendRead the hourly distinct client IPs blocked by the global firewallAPI keySession
GET/v1/analytics/connections/dead-lettersList durable analytics connections dead-letter receiptsSession
GET/v1/analytics/connections/dead-letters/{dead_letter_id}Read one durable analytics connections dead-letter receiptSession
GET/v1/analytics/connections/retentionRead finalized connections retention facts for the authenticated tenantSession
GET/v1/analytics/hourly-trendRead the authenticated tenant hourly trendAPI keySession
GET/v1/analytics/l4-realtime—Session
GET/v1/analytics/logs/accessList access logs for the authenticated tenantAPI keySession
GET/v1/analytics/logs/access/exportsList durable access-log exports owned by the calling tenant accountSession
POST/v1/analytics/logs/access/exportsCreate a snapshot-bound access-log export for the current tenantSession
GET/v1/analytics/logs/access/exports/{export_id}—Session
GET/v1/analytics/logs/access/exports/{export_id}/download—Session
POST/v1/analytics/logs/access/exports/{export_id}/download-grants—Session
GET/v1/analytics/logs/block-eventsList security block events for the authenticated tenantAPI keySession
GET/v1/analytics/logs/blocks/currentList current ACL blocks for the authenticated tenantAPI keySession
GET/v1/analytics/logs/blocks/current-countCount current ACL blocks by site for the authenticated tenantAPI keySession
POST/v1/analytics/logs/blocks/current/{block_id}/unlockUnlock one current ACL block for the authenticated tenantAPI keySession
GET/v1/analytics/logs/blocks/historyList audited unlock history for the authenticated tenantAPI keySession
GET/v1/analytics/logs/cc-coordinationList cross-node CC coordination states of the authenticated tenant, optionally narrowed to one siteAPI keySession
POST/v1/analytics/logs/cc-coordination/{state_id}/releaseRelease one exact cross-node CC state for the authenticated tenantAPI keySession
GET/v1/analytics/logs/{kind}/geo-evidence/{event_id}Reconcile one authenticated tenant log fact against a verified GeoIP catalogAPI keySession
GET/v1/analytics/market-securityList relayed market supply attack log lines of the session tenantSession
GET/v1/analytics/site-monitoringRead site monitoring for the authenticated tenantSession
GET/v1/analytics/site-quality-diagnosticsRead tenant quality diagnostics from finalized access factsSession
GET/v1/analytics/site-realtimeRead finalized realtime facts for the authenticated tenantAPI keySession
GET/v1/analytics/summaryRead the authenticated tenant analytics summaryAPI keySession
GET/v1/analytics/top/{dimension}Page through the authenticated tenant rankingAPI keySession

Contract file:api/control-analytics.openapi.yaml api/openapi/v1/control.yaml api/control-l4-realtime.openapi.yaml api/control-analytics-logs.openapi.yaml api/control-analytics-geo.openapi.yaml api/control-market-security.openapi.yaml api/control-analytics-realtime.openapi.yaml api/control-quality-diagnostics.openapi.yaml

Operation details

GET /v1/analytics/blocked-ip-count

Count distinct client IPs blocked by the global firewall or CC auto-bans

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

All of:sites.read

Description (from the contract)

Requires a tenant-scoped identity with sites.read. 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

getTenantAnalyticsBlockedIPCount Parameters
NameInTypeRequiredDescription
fromquerystring(date-time)YesRFC3339 instant. After UTC normalization it must be exactly hour aligned and earlier than to.
toquerystring(date-time)YesExclusive RFC3339 instant. After UTC normalization it must be exactly hour aligned. The window may not exceed 31 days.
site_idquerystring(uuid)No—
node_idquerystring(uuid)No—

Responses

getTenantAnalyticsBlockedIPCount Responses
StatusDescription
200Distinct 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

400analytics_invalid_request
401analytics_authentication_required
403analytics_permission_denied or analytics_scope_forbidden
408analytics_request_cancelled
502analytics_storage_rejected, analytics_storage_invalid_response, or analytics_response_too_large
503analytics_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.
504analytics_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

GET /v1/analytics/blocked-ip-trend

Read the hourly distinct client IPs blocked by the global firewall

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

All of:sites.read

Description (from the contract)

Requires a tenant-scoped identity with sites.read. Each returned UTC bucket contains the distinct client_ip count from global_firewall block events, bounded by one ingestion snapshot.

Parameters

getTenantAnalyticsBlockedIPTrend Parameters
NameInTypeRequiredDescription
fromquerystring(date-time)YesRFC3339 instant. After UTC normalization it must be exactly hour aligned and earlier than to.
toquerystring(date-time)YesExclusive RFC3339 instant. After UTC normalization it must be exactly hour aligned. The window may not exceed 31 days.
site_idquerystring(uuid)No—
node_idquerystring(uuid)No—

Responses

getTenantAnalyticsBlockedIPTrend Responses
StatusDescription
200Hourly distinct client IPs blocked by global firewall events.

Fields:data: array<BlockedIPTrendPoint> meta: QueryMetadata

400analytics_invalid_request
401analytics_authentication_required
403analytics_permission_denied or analytics_scope_forbidden
408analytics_request_cancelled
502analytics_storage_rejected, analytics_storage_invalid_response, or analytics_response_too_large
503analytics_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.
504analytics_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

GET /v1/analytics/connections/dead-letters

List durable analytics connections dead-letter receipts

operationId
listTenantAnalyticsConnectionsDeadLetters
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 revocable tenant Bearer session with sites.read. Tenant scope is derived exclusively from that session; the response is a digest-only durable receipt projection with no raw payload.

Parameters

listTenantAnalyticsConnectionsDeadLetters Parameters
NameInTypeRequiredDescription
limitqueryintegerNo—
after_sequencequeryinteger(uint64)NoExclusive decimal JetStream dead-letter stream sequence cursor.

Responses

listTenantAnalyticsConnectionsDeadLetters Responses
StatusDescription
200Digest-only durable DLQ receipts ordered by dead-letter stream sequence.

Fields:items: array<ConnectionsDeadLetterItem> next_after_sequence?: integer(uint64)

400connections_dead_letter_invalid_request
401connections_dead_letter_authentication_required
403connections_dead_letter_permission_denied
404connections_dead_letter_not_found
408connections_dead_letter_request_timeout
502connections_dead_letter_invalid_response or connections_dead_letter_response_too_large
503connections_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

GET /v1/analytics/connections/dead-letters/{dead_letter_id}

Read one durable analytics connections dead-letter receipt

operationId
getTenantAnalyticsConnectionsDeadLetter
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 revocable tenant Bearer session with sites.read. The tenant scope is derived exclusively from the session and raw payload is never returned.

Parameters

getTenantAnalyticsConnectionsDeadLetter Parameters
NameInTypeRequiredDescription
dead_letter_idpathstringYes—

Responses

getTenantAnalyticsConnectionsDeadLetter Responses
StatusDescription
200One digest-only durable DLQ receipt.

Fields:item: ConnectionsDeadLetterItem

400connections_dead_letter_invalid_request
401connections_dead_letter_authentication_required
403connections_dead_letter_permission_denied
404connections_dead_letter_not_found
408connections_dead_letter_request_timeout
502connections_dead_letter_invalid_response or connections_dead_letter_response_too_large
503connections_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

GET /v1/analytics/connections/retention

Read finalized connections retention facts for the authenticated tenant

operationId
getTenantAnalyticsConnectionsRetention
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 revocable tenant Bearer session with sites.read. Tenant scope is derived exclusively from that session; tenant_id is rejected.

Parameters

getTenantAnalyticsConnectionsRetention Parameters
NameInTypeRequiredDescription
subscription_idquerystring(uuid)YesPackage subscription authority captured at event time.
fromquerystring(date-time)YesInclusive canonical UTC RFC3339 instant.
toquerystring(date-time)YesExclusive canonical UTC RFC3339 instant; the window may not exceed 31 days.
limitqueryintegerNo—

Responses

getTenantAnalyticsConnectionsRetention Responses
StatusDescription
200Finalized connections facts in ascending period order.

Fields:items: array<ConnectionsRetentionItem>

400retention_invalid_request
401retention_authentication_required
403retention_permission_denied
408retention_request_timeout
502retention_invalid_response or retention_response_too_large
503retention_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

GET /v1/analytics/hourly-trend

Read the authenticated tenant hourly trend

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

All of:sites.read

Description (from the contract)

Requires a tenant-scoped identity with sites.read. Buckets are UTC hours and only buckets containing events are returned.

Parameters

getTenantAnalyticsHourlyTrend Parameters
NameInTypeRequiredDescription
fromquerystring(date-time)YesRFC3339 instant. After UTC normalization it must be hour aligned and earlier than to.
toquerystring(date-time)YesExclusive RFC3339 instant. It must be hour aligned after UTC normalization; the window is at most 31 days.
site_idquerystring(uuid)No—
node_idquerystring(uuid)No—

Responses

getTenantAnalyticsHourlyTrend Responses
StatusDescription
200UTC hourly metrics ordered by hour ascending; hours with no events are omitted.

Fields:data: array<AnalyticsTrendPoint> meta: AnalyticsQueryMetadata

400analytics_invalid_request
401analytics_authentication_required
403analytics_permission_denied or analytics_scope_forbidden
408analytics_request_cancelled
500analytics_internal_error
502analytics_storage_rejected, analytics_storage_invalid_response, or analytics_response_too_large
503analytics_storage_unavailable; no zero-value data is substituted.
504analytics_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/analytics/l4-realtime

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

getTenantL4Realtime Parameters
NameInTypeRequiredDescription
rangequerystring: 1h / 6h / 12h / 24h / customYes—
timezonequerystringYes—
fromquerystring(date-time)No—
toquerystring(date-time)No—
site_idquerystring(uuid)No—
stream_idquerystring(uuid)No—
node_idquerystring(uuid)No—
protocolquerystring: tcp / udpNo—
listen_portqueryintegerNo—
limitqueryintegerNo—
cursorquerystringNo—

Responses

getTenantL4Realtime Responses
StatusDescription
200L4 session aggregates

Fields:version: string meta: object totals: object rows: array<object> next_cursor?: string

400Request validation failed; clients map the stable code through locale resources.
401Authentication is required or the session is invalid.
403The authenticated principal cannot access this scope or operation.
500The response could not be encoded safely.
503The 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

GET /v1/analytics/logs/access

List access logs for the authenticated tenant

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

All of:sites.read

Description (from the contract)

Scope comes only from the authenticated tenant identity. Supplying tenant_id, even with the same value, returns 403.

Parameters

listTenantAccessLogs Parameters
NameInTypeRequiredDescription
fromquerystring(date-time)YesInclusive RFC3339 instant with at most millisecond precision. It is normalized to UTC and must be earlier than to.
toquerystring(date-time)YesExclusive RFC3339 instant with at most millisecond precision. The window may not exceed 31 days.
site_idquerystring(uuid)No—
hostquerystringNoAccess logs and block events: one host or up to 64 distinct space-separated hosts.
node_idquerystring(uuid)No—
client_ipquerystring(ip)NoExact IPv4 or IPv6 address without a zone identifier.
uri_pathquerystringNoExact origin-form path after query and fragment removal.
uri_path_matchquerystring: exact / prefixNoHow uri_path matches; prefix uses a startsWith match on the origin-form path. Requires uri_path.
status_codequeryintegerNo—
methodquerystringNoExact HTTP method; access-log routes only.
protocolquerystringNoExact stored protocol; access-log routes only.
cache_statusquerystringNoExact stored cache status; access-log routes only.
upstream_resultquerystringNo—
content_typequerystringNo—
user_agentquerystringNo—
request_bytes_minqueryinteger(uint64)No—
request_bytes_maxqueryinteger(uint64)No—
response_bytes_minqueryinteger(uint64)No—
response_bytes_maxqueryinteger(uint64)No—
country_codequerystringNoExact stored country or region code.
carrierquerystringNoExact stored carrier value.
ja4querystringNoExact stored JA4 fingerprint. Rows without a source JA4 do not match.
origin_connect_us_minqueryinteger(uint64)No—
origin_connect_us_maxqueryinteger(uint64)No—
origin_first_byte_us_minqueryinteger(uint64)No—
origin_first_byte_us_maxqueryinteger(uint64)No—
origin_total_us_minqueryinteger(uint64)No—
origin_total_us_maxqueryinteger(uint64)No—
limitqueryintegerNoPage size. When more rows exist at the fixed snapshot, the response includes an opaque next_cursor.
cursorquerystringNoOpaque 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

listTenantAccessLogs Responses
StatusDescription
200Snapshot-bounded access-log page.

Fields:data: array<AccessLog> meta: QueryMetadata

400Invalid GET body, time range, filter, limit, cursor, or required platform tenant scope. GET bodies are never read.
401Authentication is required.
403Permission or identity scope is forbidden.
404Analytics log route was not found.
422Returns analytics_logs_capability_unsupported for malformed cursor shapes rejected before storage or physically observable equal-version replacement ambiguity.
503Storage transport, rejection, invalid response, or response limit failure.
504Query 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

GET /v1/analytics/logs/access/exports

List durable access-log exports owned by the calling tenant account

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

listTenantAccessLogExports Parameters
NameInTypeRequiredDescription
fromquerystring(date-time)NoExport scope lookup; when present, to is required and the filters follow the access-log list.
toquerystring(date-time)NoExport scope lookup; exclusive end of the window.
site_idquerystring(uuid)No—
hostquerystringNoAccess logs and block events: one host or up to 64 distinct space-separated hosts.
node_idquerystring(uuid)No—
client_ipquerystring(ip)NoExact IPv4 or IPv6 address without a zone identifier.
uri_pathquerystringNoExact origin-form path after query and fragment removal.
uri_path_matchquerystring: exact / prefixNoHow uri_path matches; prefix uses a startsWith match on the origin-form path. Requires uri_path.
status_codequeryintegerNo—
methodquerystringNoExact HTTP method; access-log routes only.
protocolquerystringNoExact stored protocol; access-log routes only.
cache_statusquerystringNoExact stored cache status; access-log routes only.
upstream_resultquerystringNo—
content_typequerystringNo—
user_agentquerystringNo—
request_bytes_minqueryinteger(uint64)No—
request_bytes_maxqueryinteger(uint64)No—
response_bytes_minqueryinteger(uint64)No—
response_bytes_maxqueryinteger(uint64)No—
country_codequerystringNoExact stored country or region code.
carrierquerystringNoExact stored carrier value.
ja4querystringNoExact stored JA4 fingerprint. Rows without a source JA4 do not match.
origin_connect_us_minqueryinteger(uint64)No—
origin_connect_us_maxqueryinteger(uint64)No—
origin_first_byte_us_minqueryinteger(uint64)No—
origin_first_byte_us_maxqueryinteger(uint64)No—
origin_total_us_minqueryinteger(uint64)No—
origin_total_us_maxqueryinteger(uint64)No—

Responses

listTenantAccessLogExports Responses
StatusDescription
200At most 50 exports for the exact actor, session, scope and tenant.

Fields:data: array<AccessExport>

400Invalid GET body, time range, filter, limit, cursor, or required platform tenant scope. GET bodies are never read.
401Authentication is required.
403Permission or identity scope is forbidden.
503Storage transport, rejection, invalid response, or response limit failure.
504Query 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

POST /v1/analytics/logs/access/exports

Create a snapshot-bound access-log export for the current tenant

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

createTenantAccessLogExport Parameters
NameInTypeRequiredDescription
Idempotency-KeyheaderstringYes—

Request body

application/json · Required:Yes

createTenantAccessLogExport Request body
NameTypeRequiredDescription
filterAccessExportFilterYes—

Responses

createTenantAccessLogExport Responses
StatusDescription
202Durable 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

400Invalid GET body, time range, filter, limit, cursor, or required platform tenant scope. GET bodies are never read.
401Authentication is required.
403Permission or identity scope is forbidden.
409Idempotency key is already bound to another normalized export request.
503Storage transport, rejection, invalid response, or response limit failure.
504Query 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

GET /v1/analytics/logs/access/exports/{export_id}

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

getTenantAccessLogExport Parameters
NameInTypeRequiredDescription
export_idpathstring(uuid)Yes—

Responses

getTenantAccessLogExport Responses
StatusDescription
200Session-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

400Invalid GET body, time range, filter, limit, cursor, or required platform tenant scope. GET bodies are never read.
401Authentication is required.
403Permission or identity scope is forbidden.
404Analytics log route was not found.
503Storage transport, rejection, invalid response, or response limit failure.
504Query 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

GET /v1/analytics/logs/access/exports/{export_id}/download

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

downloadTenantAccessLogExport Parameters
NameInTypeRequiredDescription
export_idpathstring(uuid)Yes—
X-Analytics-Download-TokenheaderstringYesShort-lived one-time token. The server stores only its SHA-256 digest.

Responses

downloadTenantAccessLogExport Responses
StatusDescription
200RFC4180 UTF-8 CSV consumed atomically by the one-time grant.
400Invalid GET body, time range, filter, limit, cursor, or required platform tenant scope. GET bodies are never read.
401Authentication is required.
403Permission or identity scope is forbidden.
410Grant is malformed, expired, consumed, or belongs to another session or scope.
503Storage transport, rejection, invalid response, or response limit failure.
504Query 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

POST /v1/analytics/logs/access/exports/{export_id}/download-grants

operationId
grantTenantAccessLogExportDownload
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 tenant session and export. Any session of the owning account may request a grant; a token from another session is rejected. API keys are rejected.

Parameters

grantTenantAccessLogExportDownload Parameters
NameInTypeRequiredDescription
export_idpathstring(uuid)Yes—

Responses

grantTenantAccessLogExportDownload Responses
StatusDescription
201One-time grant. Only the SHA-256 token digest is persisted.

Fields:export_id: string(uuid) token: string expires_at: string(date-time)

400Invalid GET body, time range, filter, limit, cursor, or required platform tenant scope. GET bodies are never read.
401Authentication is required.
403Permission or identity scope is forbidden.
404Analytics log route was not found.
503Storage transport, rejection, invalid response, or response limit failure.
504Query 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

GET /v1/analytics/logs/block-events

List security block events for the authenticated tenant

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

All of:sites.read

Description (from the contract)

Scope comes only from the authenticated tenant identity. Returns the current security-event projection with snapshot-bounded keyset pagination. This route does not claim immutable block-state history.

Parameters

listTenantBlockEvents Parameters
NameInTypeRequiredDescription
fromquerystring(date-time)YesInclusive RFC3339 instant with at most millisecond precision. It is normalized to UTC and must be earlier than to.
toquerystring(date-time)YesExclusive RFC3339 instant with at most millisecond precision. The window may not exceed 31 days.
site_idquerystring(uuid)No—
node_idquerystring(uuid)No—
client_ipquerystring(ip)NoExact IPv4 or IPv6 address without a zone identifier.
uri_pathquerystringNoExact origin-form path after query and fragment removal.
uri_path_matchquerystring: exact / prefixNoHow uri_path matches; prefix uses a startsWith match on the origin-form path. Requires uri_path.
status_codequeryconst 0 | integerNoExact stored status; 0 means no HTTP status was recorded.
actionquerystring: block / challenge / log / temporary_banNoBlock 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_typequerystringNoBlock events only: narrow to one event type (waf, cc, acl, ...).
hostquerystringNoAccess logs and block events: one host or up to 64 distinct space-separated hosts.
country_codequerystringNoExact stored country or region code.
carrierquerystringNoExact stored carrier value.
ja4querystringNoExact stored JA4 fingerprint. Rows without a source JA4 do not match.
origin_connect_us_minqueryinteger(uint64)No—
origin_connect_us_maxqueryinteger(uint64)No—
origin_first_byte_us_minqueryinteger(uint64)No—
origin_first_byte_us_maxqueryinteger(uint64)No—
origin_total_us_minqueryinteger(uint64)No—
origin_total_us_maxqueryinteger(uint64)No—
limitqueryintegerNoPage size. When more rows exist at the fixed snapshot, the response includes an opaque next_cursor.
cursorquerystringNoOpaque 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

listTenantBlockEvents Responses
StatusDescription
200Snapshot-bounded security block-event page.

Fields:data: array<BlockEvent> meta: QueryMetadata

400Invalid GET body, time range, filter, limit, cursor, or required platform tenant scope. GET bodies are never read.
401Authentication is required.
403Permission or identity scope is forbidden.
404Analytics log route was not found.
422Returns analytics_logs_capability_unsupported for malformed cursor shapes rejected before storage or physically observable equal-version replacement ambiguity.
503Storage transport, rejection, invalid response, or response limit failure.
504Query 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

GET /v1/analytics/logs/blocks/current

List current ACL blocks for the authenticated tenant

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

All of:sites.read

Description (from the contract)

Scope comes only from the authenticated tenant identity. Supplying a tenant_id is rejected rather than re-scoping the request.

Parameters

listTenantCurrentBlocks Parameters
NameInTypeRequiredDescription
site_idquerystring(uuid)No—
limitqueryintegerNoMaximum current or historical block facts returned.
offsetqueryintegerNoNumber of matching current or historical block facts to skip.

Responses

listTenantCurrentBlocks Responses
StatusDescription
200Current active ACL block facts.

Fields:data: array<CurrentBlock> total_count: integer(uint64) snapshot_at: string(date-time)

400Invalid GET body, time range, filter, limit, cursor, or required platform tenant scope. GET bodies are never read.
401Authentication is required.
403Permission or identity scope is forbidden.
404Analytics log route was not found.
503Storage transport, rejection, invalid response, or response limit failure.
504Query 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

GET /v1/analytics/logs/blocks/current-count

Count current ACL blocks by site for the authenticated tenant

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

All of:sites.read

Responses

countTenantCurrentBlocksBySite Responses
StatusDescription
200Current active ACL block totals grouped by site.

Fields:data: array<SiteBlacklistCount> total_count: integer(uint64) snapshot_at: string(date-time)

400Invalid GET body, time range, filter, limit, cursor, or required platform tenant scope. GET bodies are never read.
401Authentication is required.
403Permission or identity scope is forbidden.
503Storage transport, rejection, invalid response, or response limit failure.
504Query 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

POST /v1/analytics/logs/blocks/current/{block_id}/unlock

Unlock one current ACL block for the authenticated tenant

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

All of:security_policies.manage

Description (from the contract)

Uses only the authenticated tenant scope and the same policy revision, idempotency, activation and conflict contract as the platform route.

Parameters

unlockTenantCurrentBlock Parameters
NameInTypeRequiredDescription
block_idpathstring(uuid)YesStable identity derived from site, active ACL policy and canonical CIDR.
Idempotency-KeyheaderstringYes—

Request body

application/json · Required:Yes

unlockTenantCurrentBlock Request body
NameTypeRequiredDescription
reason_codestringYes—

Responses

unlockTenantCurrentBlock Responses
StatusDescription
202The 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

400Invalid GET body, time range, filter, limit, cursor, or required platform tenant scope. GET bodies are never read.
401Authentication is required.
403Permission or identity scope is forbidden.
404The scoped active block no longer exists.
409Returns analytics_block_unlock_conflict when the policy, active edge revision, open activation or target-node snapshot changed.
503Storage transport, rejection, invalid response, or response limit failure.
504Query 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/analytics/logs/blocks/history

List audited unlock history for the authenticated tenant

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

All of:sites.read

Description (from the contract)

Scope comes only from the authenticated tenant identity. Raw security events remain available from the separate block-events route.

Parameters

listTenantBlockHistory Parameters
NameInTypeRequiredDescription
site_idquerystring(uuid)No—
limitqueryintegerNoMaximum current or historical block facts returned.
offsetqueryintegerNoNumber of matching current or historical block facts to skip.

Responses

listTenantBlockHistory Responses
StatusDescription
200Append-only CIDR unlock history with durable edge progress.

Fields:data: array<BlockHistory> total_count: integer(uint64) snapshot_at: string(date-time)

400Invalid GET body, time range, filter, limit, cursor, or required platform tenant scope. GET bodies are never read.
401Authentication is required.
403Permission or identity scope is forbidden.
404Analytics log route was not found.
503Storage transport, rejection, invalid response, or response limit failure.
504Query 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

GET /v1/analytics/logs/cc-coordination

List cross-node CC coordination states of the authenticated tenant, optionally narrowed to one site

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

All of:sites.read

Parameters

listTenantCCCoordinationStates Parameters
NameInTypeRequiredDescription
site_idquerystring(uuid)No—
limitqueryintegerNoMaximum current or historical block facts returned.

Responses

listTenantCCCoordinationStates Responses
StatusDescription
200Durable tenant/site-scoped cross-node CC state.

Fields:items: array<CCCoordinationState>

400Invalid GET body, time range, filter, limit, cursor, or required platform tenant scope. GET bodies are never read.
401Authentication is required.
403Permission or identity scope is forbidden.
503Storage transport, rejection, invalid response, or response limit failure.
504Query 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

POST /v1/analytics/logs/cc-coordination/{state_id}/release

Release one exact cross-node CC state for the authenticated tenant

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

All of:security_policies.manage

Parameters

releaseTenantCCCoordinationState Parameters
NameInTypeRequiredDescription
state_idpathstring(uuid)Yes—
site_idquerystring(uuid)Yes—
Idempotency-KeyheaderstringYes—
X-Request-IDheaderstringYes—

Request body

application/json · Required:Yes

releaseTenantCCCoordinationState Request body
NameTypeRequiredDescription
reason_codestringYes—
expected_generationinteger(int64)Yes—

Responses

releaseTenantCCCoordinationState Responses
StatusDescription
202The exact generation was accepted for audited release.

Fields:state: CCCoordinationState replayed: boolean

400Invalid GET body, time range, filter, limit, cursor, or required platform tenant scope. GET bodies are never read.
401Authentication is required.
403Permission or identity scope is forbidden.
409Returns analytics_block_unlock_conflict when the policy, active edge revision, open activation or target-node snapshot changed.
503Storage transport, rejection, invalid response, or response limit failure.
504Query 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

GET /v1/analytics/logs/{kind}/geo-evidence/{event_id}

Reconcile one authenticated tenant log fact against a verified GeoIP catalog

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

All of:sites.read

Description (from the contract)

tenant_id is forbidden; the tenant comes only from authenticated identity. The raw address is never returned.

Parameters

getTenantAnalyticsGeoEvidence Parameters
NameInTypeRequiredDescription
kindpathstring: access / blockYes—
event_idpathstringYes—
fromquerystring(date-time)Yes—
toquerystring(date-time)Yes—
site_idquerystring(uuid)Yes—
node_idquerystring(uuid)Yes—
client_ipquerystring(ip)Yes—
database_versionquerystringNo—

Responses

getTenantAnalyticsGeoEvidence Responses
StatusDescription
200Verified bounded geo evidence.

Fields:data: Evidence

400Invalid request.
401Stable error envelope.
403Stable error envelope.
404Stable error envelope.
408Stable error envelope.
409Stable error envelope.
502Stable error envelope.
503Stable error envelope.
504Stable 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/analytics/market-security

List relayed market supply attack log lines of the session tenant

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

listMarketSecurityLogs Parameters
NameInTypeRequiredDescription
fromquerystring(date-time)YesRFC 3339; at most 31 days before to.
toquerystring(date-time)Yes—
site_idquerystring(uuid)No—
client_ipquerystringNo—
hostquerystringNo—
cursorquerystringNometa.next_cursor of the previous page.
limitqueryintegerNo—

Responses

listMarketSecurityLogs Responses
StatusDescription
200Newest first.

Fields:data: array<Log> meta: object

400Error.
401Error.
403Error.
405Error.
503Error.

What to do on failure

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

↑ Back to list

GET /v1/analytics/site-monitoring

Read site monitoring for the authenticated tenant

operationId
getTenantSiteMonitoring
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 tenant session with sites.read. The tenant is derived only from the authenticated principal; tenant_id and self-asserted identity headers are rejected. Query parameters are single-valued and strict.

Parameters

getTenantSiteMonitoring Parameters
NameInTypeRequiredDescription
rangequerystring: 1h / 6h / 12h / customYesFixed presets use no from/to values. custom requires both from and to and is limited to 31 days; longer ranges are rejected.
fromquerystring(date-time)NoInclusive UTC boundary, required only for range=custom.
toquerystring(date-time)NoExclusive UTC boundary, required only for range=custom.
timezonequerystringYes—
site_idquerystring(uuid)No—
node_idquerystring(uuid)No—
domainquerystringNo—
listen_portqueryintegerNo—
rank_byquerystring: host / site / node / status_codeNo—
limitqueryintegerNo—
cursorquerystringNoOpaque snapshot- and filter-bound cursor.
X-Request-IDheaderstringNo—

Responses

getTenantSiteMonitoring Responses
StatusDescription
200Finalized monitoring aggregate.

Fields:version: string meta: SiteMonitoringMeta basic: AvailableBasic | DegradedSection quality: AvailableQuality | DegradedSection origin: AvailableOrigin | DegradedSection rank: AvailableRank | DegradedSection

400Stable non-leaking error envelope.
401Stable non-leaking error envelope.
403Stable non-leaking error envelope.
405Stable non-leaking error envelope.
408Stable non-leaking error envelope.
502Stable non-leaking error envelope.
503Stable non-leaking error envelope.
504Stable 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

GET /v1/analytics/site-quality-diagnostics

Read tenant quality diagnostics from finalized access facts

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

getTenantQualityDiagnostics Parameters
NameInTypeRequiredDescription
fromquerystring(date-time)YesInclusive UTC millisecond boundary.
toquerystring(date-time)YesExclusive UTC millisecond boundary, at most 31 days after from.
site_idquerystring(uuid)No—
node_idquerystring(uuid)No—
categoryquerystring: upstream_5xx / edge_530 / no_host / config_mismatchNo—
limitqueryintegerNo—
cursorquerystringNo—

Responses

getTenantQualityDiagnostics Responses
StatusDescription
200Finalized, latest-state diagnostics at one exact snapshot.

Fields:items: array<QualityDiagnostic> next_cursor: string | null snapshot: FinalizedSnapshot effective_tenant_id?: string(uuid)

400Stable error response with no raw dependency text.
401Stable error response with no raw dependency text.
403Stable error response with no raw dependency text.
405Stable error response with no raw dependency text.
408Stable error response with no raw dependency text.
409Stable error response with no raw dependency text.
502Stable error response with no raw dependency text.
503Stable error response with no raw dependency text.
504Stable 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

GET /v1/analytics/site-realtime

Read finalized realtime facts for the authenticated tenant

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

All of:sites.read

Description (from the contract)

Tenant scope is derived exclusively from the authenticated identity. tenant_id is rejected. With query_version=2 the exact minute-aligned [from,to) interval is not rounded; without it, legacy hour alignment and original response keys apply. Missing or unfinalized evidence for any enclosing full UTC hour fails closed; zero traffic is returned only with complete source coverage.

Parameters

getTenantSiteRealtime Parameters
NameInTypeRequiredDescription
fromquerystring(date-time)YesInclusive RFC3339 instant, exactly minute aligned after UTC normalization with query_version=2, otherwise hour aligned; never silently rounded.
toquerystring(date-time)YesExclusive 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.
query_versionqueryinteger: 2 / 3 / 4NoExplicit 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_idquerystring(uuid)No—
hostquerystringNoOne or more canonical lowercase hosts without trailing dots, separated by single spaces.
listen_portqueryintegerNoExact production listen port. Omit to include legacy port-zero facts.

Responses

getTenantSiteRealtime Responses
StatusDescription
200Finalized atomic site realtime facts and source reconciliation evidence.
400analytics_invalid_request
401analytics_authentication_required
403analytics_permission_denied or analytics_scope_forbidden
408analytics_request_cancelled
502analytics_storage_rejected, analytics_storage_invalid_response, or analytics_response_too_large
503analytics_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.
504analytics_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

GET /v1/analytics/summary

Read the authenticated tenant analytics summary

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

All of:sites.read

Description (from the contract)

Requires a tenant-scoped identity with sites.read. Scope comes only from the authenticated identity; tenant_id is not accepted, even when it names that same tenant.

Parameters

getTenantAnalyticsSummary Parameters
NameInTypeRequiredDescription
fromquerystring(date-time)YesRFC3339 instant. After UTC normalization it must be hour aligned and earlier than to.
toquerystring(date-time)YesExclusive RFC3339 instant. It must be hour aligned after UTC normalization; the window is at most 31 days.
site_idquerystring(uuid)No—
node_idquerystring(uuid)No—

Responses

getTenantAnalyticsSummary Responses
StatusDescription
200Aggregated metrics for the normalized UTC window.

Fields:data: AnalyticsSummaryMetrics meta: AnalyticsQueryMetadata

400analytics_invalid_request
401analytics_authentication_required
403analytics_permission_denied or analytics_scope_forbidden
408analytics_request_cancelled
500analytics_internal_error
502analytics_storage_rejected, analytics_storage_invalid_response, or analytics_response_too_large
503analytics_storage_unavailable; no zero-value data is substituted.
504analytics_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/analytics/top/{dimension}

Page through the authenticated tenant ranking

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

All of:sites.read

Description (from the contract)

Requires a tenant-scoped identity with sites.read. Scope comes only from the authenticated identity. The cursor is bound to scope, filters, dimension, and one ingestion snapshot. The ja4 dimension is reserved but unsupported in v1.

Parameters

getTenantAnalyticsTop Parameters
NameInTypeRequiredDescription
dimensionpathstring: url / ip / domain / region / carrier / ja4 / referer / province / browser / osYesregion 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).
fromquerystring(date-time)YesRFC3339 instant. After UTC normalization it must be hour aligned and earlier than to.
toquerystring(date-time)YesExclusive RFC3339 instant. It must be hour aligned after UTC normalization; the window is at most 31 days.
site_idquerystring(uuid)No—
node_idquerystring(uuid)No—
limitqueryintegerNo—
cursorquerystringNoOpaque cursor bound to the authenticated scope, filters, dimension, and snapshot.

Responses

getTenantAnalyticsTop Responses
StatusDescription
200Deterministically 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

400analytics_invalid_request
401analytics_authentication_required
403analytics_permission_denied or analytics_scope_forbidden
408analytics_request_cancelled
422analytics_dimension_unsupported
500analytics_internal_error
502analytics_storage_rejected, analytics_storage_invalid_response, or analytics_response_too_large
503analytics_storage_unavailable; no zero-value data is substituted.
504analytics_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