Operation details
GET /v1/sdk-shield/apps
List SDK apps with today's handshakes (tenants also get their quota)
- operationId
listSDKShieldApps- 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:streams.read
Responses
listSDKShieldApps Responses| Status | Description |
|---|
200 | Apps Fields:items: array<App> quota?: Quota |
|---|
401 | Error |
|---|
403 | Error |
|---|
422 | Error |
|---|
503 | Error |
|---|
What to do on failure
401 Check the credential format and whether it expired or was rotated.403 Check the key scopes, the owner’s current permissions and the tenant scope; never switch to a more privileged account.503 A dependency is unavailable: retry later with the original Idempotency-Key.
↑ Back to list
POST /v1/sdk-shield/apps
Create an app; the first AppSecret is returned once
- operationId
createSDKShieldApp- 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:streams.manage
Description (from the contract)
A tenant is bounded by limits.sdk_shield_apps (409 sdk_shield_app_limit); an administrator must name tenant_scope_id. Audited sdkshield.app.create.
Parameters
createSDKShieldApp Parameters| Name | In | Type | Required | Description |
|---|
Idempotency-Key | header | string | Yes | One key per write; resend it to retry a write whose result was not seen. The same key and request (24 hours, per user and operation) answers the resource it created and creates nothing: a Secret then has replayed true and no app_secret (the secret was only in the first answer). The same key with another request: 409 idempotency_conflict. Missing, malformed or repeated: 422 validation_failed (field Idempotency-Key). |
|---|
Request body
application/json · Required:Yes
createSDKShieldApp Request body| Name | Type | Required | Description |
|---|
name | string | Yes | — |
|---|
Responses
createSDKShieldApp Responses| Status | Description |
|---|
201 | Created Fields:app: App secret: Secret |
|---|
401 | Error |
|---|
403 | Error |
|---|
409 | Error |
|---|
422 | Error |
|---|
503 | Error |
|---|
What to do on failure
401 Check the credential format and whether it expired or was rotated.403 Check the key scopes, the owner’s current permissions and the tenant scope; never switch to a more privileged account.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/sdk-shield/apps/{id}
Read an app
- operationId
getSDKShieldApp- 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:streams.read
Parameters
getSDKShieldApp Parameters| Name | In | Type | Required | Description |
|---|
id | path | string(uuid) | Yes | The app's row id (App.id). |
|---|
Responses
getSDKShieldApp Responses| Status | Description |
|---|
200 | App Fields:id: string(uuid) app_id: string name: string tenant: Tenant status: string: active / disabled skew_seconds: integer fail_threshold: integer fail_window_seconds: integer ban_seconds: integer handshake_rate_per_second: integer forward_count: integer(int64) active_key_ids: array<integer> today?: Today revision: integer created_at: string(date-time) updated_at: string(date-time) |
|---|
401 | Error |
|---|
403 | Error |
|---|
404 | Error |
|---|
503 | Error |
|---|
What to do on failure
401 Check the credential format and whether it expired or was rotated.403 Check the key scopes, the owner’s current permissions and the tenant scope; never switch to a more privileged account.404 The resource does not exist or belongs to another tenant.503 A dependency is unavailable: retry later with the original Idempotency-Key.
↑ Back to list
PATCH /v1/sdk-shield/apps/{id}
Update name, status or protection parameters
- operationId
updateSDKShieldApp- 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:streams.manage
Description (from the contract)
status disabled makes every bound forward refuse new connections (app_disabled) after the next publication. expected_revision refuses a stale edit (409 revision_conflict). Audited sdkshield.app.update / disable / enable.
Parameters
updateSDKShieldApp Parameters| Name | In | Type | Required | Description |
|---|
id | path | string(uuid) | Yes | The app's row id (App.id). |
|---|
Request body
application/json · Required:Yes
updateSDKShieldApp Request body| Name | Type | Required | Description |
|---|
expected_revision | integer | No | — |
|---|
name | string | No | — |
|---|
status | string: active / disabled | No | — |
|---|
skew_seconds | integer | No | — |
|---|
fail_threshold | integer | No | — |
|---|
fail_window_seconds | integer | No | — |
|---|
ban_seconds | integer | No | 0 = disconnect only |
|---|
handshake_rate_per_second | integer | No | 0 = no cap |
|---|
Responses
updateSDKShieldApp Responses| Status | Description |
|---|
200 | Updated Fields:id: string(uuid) app_id: string name: string tenant: Tenant status: string: active / disabled skew_seconds: integer fail_threshold: integer fail_window_seconds: integer ban_seconds: integer handshake_rate_per_second: integer forward_count: integer(int64) active_key_ids: array<integer> today?: Today revision: integer created_at: string(date-time) updated_at: string(date-time) |
|---|
401 | Error |
|---|
403 | Error |
|---|
404 | Error |
|---|
409 | Error |
|---|
422 | Error |
|---|
503 | Error |
|---|
What to do on failure
401 Check the credential format and whether it expired or was rotated.403 Check the key scopes, the owner’s current permissions and the tenant scope; never switch to a more privileged account.404 The resource does not exist or belongs to another tenant.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
DELETE /v1/sdk-shield/apps/{id}
Delete an app without bound forwards (409 sdk_shield_app_in_use)
- operationId
deleteSDKShieldApp- 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:streams.manage
Description (from the contract)
Audited sdkshield.app.delete.
Parameters
deleteSDKShieldApp Parameters| Name | In | Type | Required | Description |
|---|
id | path | string(uuid) | Yes | The app's row id (App.id). |
|---|
Responses
deleteSDKShieldApp Responses| Status | Description |
|---|
204 | Deleted |
|---|
401 | Error |
|---|
403 | Error |
|---|
404 | Error |
|---|
409 | Error |
|---|
503 | Error |
|---|
What to do on failure
401 Check the credential format and whether it expired or was rotated.403 Check the key scopes, the owner’s current permissions and the tenant scope; never switch to a more privileged account.404 The resource does not exist or belongs to another tenant.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/sdk-shield/apps/{id}/blocks
Refusals per minute and node with source samples (at most one day)
- operationId
listSDKShieldAppBlocks- 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:streams.read
Parameters
listSDKShieldAppBlocks Parameters| Name | In | Type | Required | Description |
|---|
id | path | string(uuid) | Yes | The app's row id (App.id). |
|---|
from | query | string(date-time) | No | RFC 3339; default 24 hours before to |
|---|
to | query | string(date-time) | No | RFC 3339; default now |
|---|
node_id | query | string(uuid) | No | Only this node |
|---|
Responses
listSDKShieldAppBlocks Responses| Status | Description |
|---|
200 | Blocks, newest first Fields:items: array<BlockMinute> |
|---|
401 | Error |
|---|
403 | Error |
|---|
404 | Error |
|---|
422 | Error |
|---|
503 | Error |
|---|
What to do on failure
401 Check the credential format and whether it expired or was rotated.403 Check the key scopes, the owner’s current permissions and the tenant scope; never switch to a more privileged account.404 The resource does not exist or belongs to another tenant.503 A dependency is unavailable: retry later with the original Idempotency-Key.
↑ Back to list
GET /v1/sdk-shield/apps/{id}/delete-preview
What the delete confirmation shows
- operationId
previewSDKShieldAppDelete- 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:streams.read
Parameters
previewSDKShieldAppDelete Parameters| Name | In | Type | Required | Description |
|---|
id | path | string(uuid) | Yes | The app's row id (App.id). |
|---|
Responses
previewSDKShieldAppDelete Responses| Status | Description |
|---|
200 | Preview Fields:app: App forward_count: integer(int64) deletable: boolean |
|---|
401 | Error |
|---|
403 | Error |
|---|
404 | Error |
|---|
503 | Error |
|---|
What to do on failure
401 Check the credential format and whether it expired or was rotated.403 Check the key scopes, the owner’s current permissions and the tenant scope; never switch to a more privileged account.404 The resource does not exist or belongs to another tenant.503 A dependency is unavailable: retry later with the original Idempotency-Key.
↑ Back to list
GET /v1/sdk-shield/apps/{id}/forwards
List the scope's forwards with why each cannot be bound
- operationId
listSDKShieldAppForwards- 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:streams.read
Parameters
listSDKShieldAppForwards Parameters| Name | In | Type | Required | Description |
|---|
id | path | string(uuid) | Yes | The app's row id (App.id). |
|---|
Responses
listSDKShieldAppForwards Responses| Status | Description |
|---|
200 | Forwards Fields:items: array<Forward> |
|---|
401 | Error |
|---|
403 | Error |
|---|
404 | Error |
|---|
503 | Error |
|---|
What to do on failure
401 Check the credential format and whether it expired or was rotated.403 Check the key scopes, the owner’s current permissions and the tenant scope; never switch to a more privileged account.404 The resource does not exist or belongs to another tenant.503 A dependency is unavailable: retry later with the original Idempotency-Key.
↑ Back to list
PUT /v1/sdk-shield/apps/{id}/forwards
Replace the app's forwards (at most 16, of its scope)
- operationId
setSDKShieldAppForwards- 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:streams.manage
Description (from the contract)
Any incompatible forward refuses the whole change with 422 sdk_shield_forward_incompatible; error.details.forwards lists every one with its reasons (the codes of Forward.incompatible). Binding republishes the scope. Audited sdkshield.forwards.update.
Parameters
setSDKShieldAppForwards Parameters| Name | In | Type | Required | Description |
|---|
id | path | string(uuid) | Yes | The app's row id (App.id). |
|---|
Request body
application/json · Required:Yes
setSDKShieldAppForwards Request body| Name | Type | Required | Description |
|---|
forward_ids | array<string(uuid)> | Yes | — |
|---|
Responses
setSDKShieldAppForwards Responses| Status | Description |
|---|
200 | Bound forwards Fields:forward_ids: array<string(uuid)> |
|---|
401 | Error |
|---|
403 | Error |
|---|
404 | Error |
|---|
422 | Error |
|---|
503 | Error |
|---|
What to do on failure
401 Check the credential format and whether it expired or was rotated.403 Check the key scopes, the owner’s current permissions and the tenant scope; never switch to a more privileged account.404 The resource does not exist or belongs to another tenant.503 A dependency is unavailable: retry later with the original Idempotency-Key.
↑ Back to list
GET /v1/sdk-shield/apps/{id}/keys
List the app's keys with the handshakes each passed in the last 24 hours
- operationId
listSDKShieldAppKeys- 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:streams.read
Parameters
listSDKShieldAppKeys Parameters| Name | In | Type | Required | Description |
|---|
id | path | string(uuid) | Yes | The app's row id (App.id). |
|---|
Responses
listSDKShieldAppKeys Responses| Status | Description |
|---|
200 | Keys Fields:items: array<Key> |
|---|
401 | Error |
|---|
403 | Error |
|---|
404 | Error |
|---|
503 | Error |
|---|
What to do on failure
401 Check the credential format and whether it expired or was rotated.403 Check the key scopes, the owner’s current permissions and the tenant scope; never switch to a more privileged account.404 The resource does not exist or belongs to another tenant.503 A dependency is unavailable: retry later with the original Idempotency-Key.
↑ Back to list
POST /v1/sdk-shield/apps/{id}/keys
Add the next key (at most two active: 409 sdk_shield_key_limit); its AppSecret is returned once
- operationId
rotateSDKShieldAppKey- 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:streams.manage
Description (from the contract)
Audited sdkshield.key.create (key_id only).
Parameters
rotateSDKShieldAppKey Parameters| Name | In | Type | Required | Description |
|---|
Idempotency-Key | header | string | Yes | One key per write; resend it to retry a write whose result was not seen. The same key and request (24 hours, per user and operation) answers the resource it created and creates nothing: a Secret then has replayed true and no app_secret (the secret was only in the first answer). The same key with another request: 409 idempotency_conflict. Missing, malformed or repeated: 422 validation_failed (field Idempotency-Key). |
|---|
id | path | string(uuid) | Yes | The app's row id (App.id). |
|---|
Responses
rotateSDKShieldAppKey Responses| Status | Description |
|---|
201 | New key Fields:app_id: string key_id: integer app_secret?: string replayed: boolean |
|---|
401 | Error |
|---|
403 | Error |
|---|
404 | Error |
|---|
409 | Error |
|---|
422 | Error |
|---|
503 | Error |
|---|
What to do on failure
401 Check the credential format and whether it expired or was rotated.403 Check the key scopes, the owner’s current permissions and the tenant scope; never switch to a more privileged account.404 The resource does not exist or belongs to another tenant.409 Read the current state first; a retry of the same operation keeps the original Idempotency-Key and body.503 A dependency is unavailable: retry later with the original Idempotency-Key.
↑ Back to list
POST /v1/sdk-shield/apps/{id}/keys/{key_id}/revoke
Revoke a key; the last active one cannot be (409 sdk_shield_last_key)
- operationId
revokeSDKShieldAppKey- 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:streams.manage
Description (from the contract)
Nodes refuse it as unknown_key after the next publication; open connections stay. Audited sdkshield.key.revoke.
Parameters
revokeSDKShieldAppKey Parameters| Name | In | Type | Required | Description |
|---|
id | path | string(uuid) | Yes | The app's row id (App.id). |
|---|
key_id | path | integer | Yes | — |
|---|
Responses
revokeSDKShieldAppKey Responses| Status | Description |
|---|
204 | Revoked |
|---|
401 | Error |
|---|
403 | Error |
|---|
404 | Error |
|---|
409 | Error |
|---|
503 | Error |
|---|
What to do on failure
401 Check the credential format and whether it expired or was rotated.403 Check the key scopes, the owner’s current permissions and the tenant scope; never switch to a more privileged account.404 The resource does not exist or belongs to another tenant.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/sdk-shield/apps/{id}/node-list/preview
The node list that would be signed now, with node names and the public URL
- operationId
previewSDKShieldNodeList- 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:streams.read
Parameters
previewSDKShieldNodeList Parameters| Name | In | Type | Required | Description |
|---|
id | path | string(uuid) | Yes | The app's row id (App.id). |
|---|
Responses
previewSDKShieldNodeList Responses| Status | Description |
|---|
200 | Preview Fields:revision: integer issued_at: string(date-time) | null(date-time) expires_at: string(date-time) | null(date-time) refresh_after: integer skew_seconds: integer signing_key_id: string public_path: string public_url?: string nodes: array<PreviewNode> udp_idle_seconds: object truncated: boolean |
|---|
401 | Error |
|---|
403 | Error |
|---|
404 | Error |
|---|
503 | Error |
|---|
What to do on failure
401 Check the credential format and whether it expired or was rotated.403 Check the key scopes, the owner’s current permissions and the tenant scope; never switch to a more privileged account.404 The resource does not exist or belongs to another tenant.503 A dependency is unavailable: retry later with the original Idempotency-Key.
↑ Back to list
GET /v1/sdk-shield/apps/{id}/stats
Totals, refusal reasons, trend and top sources (at most 31 days)
- operationId
getSDKShieldAppStats- 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:streams.read
Parameters
getSDKShieldAppStats Parameters| Name | In | Type | Required | Description |
|---|
id | path | string(uuid) | Yes | The app's row id (App.id). |
|---|
from | query | string(date-time) | No | RFC 3339; default 24 hours before to |
|---|
to | query | string(date-time) | No | RFC 3339; default now |
|---|
node_id | query | string(uuid) | No | Only this node |
|---|
bucket | query | string: minute / hour | No | Trend bucket; default minute up to 6 hours, else hour |
|---|
Responses
getSDKShieldAppStats Responses| Status | Description |
|---|
200 | Statistics Fields:from: string(date-time) to: string(date-time) bucket: string: minute / hour totals: Totals reasons: array<ReasonCount> trend: array<TrendPoint> top: array<Source> |
|---|
401 | Error |
|---|
403 | Error |
|---|
404 | Error |
|---|
422 | Error |
|---|
503 | Error |
|---|
What to do on failure
401 Check the credential format and whether it expired or was rotated.403 Check the key scopes, the owner’s current permissions and the tenant scope; never switch to a more privileged account.404 The resource does not exist or belongs to another tenant.503 A dependency is unavailable: retry later with the original Idempotency-Key.
↑ Back to list
GET /v1/sdk-shield/module
Read the module state (answers without the module)
- operationId
getSDKShieldModule- 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:streams.read
Responses
getSDKShieldModule Responses| Status | Description |
|---|
200 | Module state Fields:licensed: boolean locally_disabled: boolean defaults: Protection signing_keys: array<SigningKey> quota?: Quota |
|---|
401 | Error |
|---|
403 | Error |
|---|
503 | Error |
|---|
What to do on failure
401 Check the credential format and whether it expired or was rotated.403 Check the key scopes, the owner’s current permissions and the tenant scope; never switch to a more privileged account.503 A dependency is unavailable: retry later with the original Idempotency-Key.
↑ Back to list
GET /v1/sdk-shield/sdk
List the SDK packages and the list signing public keys they embed
- operationId
getSDKShieldSDKManifest- 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:streams.read
Responses
getSDKShieldSDKManifest Responses| Status | Description |
|---|
200 | SDK manifest Fields:packages: array<SDKPackage> signing_keys: array<SigningKey> |
|---|
401 | Error |
|---|
403 | Error |
|---|
503 | Error |
|---|
What to do on failure
401 Check the credential format and whether it expired or was rotated.403 Check the key scopes, the owner’s current permissions and the tenant scope; never switch to a more privileged account.503 A dependency is unavailable: retry later with the original Idempotency-Key.
↑ Back to list
GET /v1/sdk-shield/sdk/files/{name}
Download one SDK archive shipped with this controller release
- operationId
downloadSDKShieldSDKFile- 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:streams.read
Parameters
downloadSDKShieldSDKFile Parameters| Name | In | Type | Required | Description |
|---|
name | path | string | Yes | Archive file name, the last segment of SDKPackage.url |
|---|
Responses
downloadSDKShieldSDKFile Responses| Status | Description |
|---|
200 | The archive (Content-Disposition attachment; X-Content-SHA256 is its digest, as in the manifest) |
|---|
401 | Error |
|---|
403 | Error |
|---|
404 | Error |
|---|
503 | Error |
|---|
What to do on failure
401 Check the credential format and whether it expired or was rotated.403 Check the key scopes, the owner’s current permissions and the tenant scope; never switch to a more privileged account.404 The resource does not exist or belongs to another tenant.503 A dependency is unavailable: retry later with the original Idempotency-Key.
↑ Back to list