Grizzly Key Management Platform 0.1.0
Grizzly Key Management Platform
Assets
GET /assets/{id}
Input parameters
| Parameter | In | Type | Default | Nullable | Description |
|---|---|---|---|---|---|
id |
path | string | No |
DELETE /assets/{id}
Input parameters
| Parameter | In | Type | Default | Nullable | Description |
|---|---|---|---|---|---|
id |
path | string | No |
PATCH /assets/{id}
Input parameters
| Parameter | In | Type | Default | Nullable | Description |
|---|---|---|---|---|---|
id |
path | string | No |
Request body
{
"data": {},
"parents": [
"string"
],
"parentMode": "string",
"context": {}
}
Schema of the request body
{
"type": "object",
"properties": {
"data": {
"type": "object",
"properties": {},
"required": [],
"additionalProperties": true,
"description": "Asset metadata to set"
},
"parents": {
"type": "array",
"items": {
"type": "string"
},
"description": "Parent ids to apply"
},
"parentMode": {
"type": "string",
"description": "How to apply parents: 'replace' (default) | 'add' | 'remove'"
},
"context": {
"type": "object",
"properties": {},
"required": [],
"additionalProperties": true,
"description": "Activity context"
}
}
}
GET /assets/{id}/family
Input parameters
| Parameter | In | Type | Default | Nullable | Description |
|---|---|---|---|---|---|
accountId |
query | string | No | Filter family members to those with activity from this account | |
id |
path | string | No | Asset ID | |
keyringId |
query | string | No | Filter family members to those with activity using this keyring | |
maxDepth |
query | integer | No | Maximum depth to traverse (default: 5, max: 10) |
Responses
{
"asset": {
"id": "string",
"createdAt": "string",
"data": {},
"parents": [
{
"assetId": "string",
"createdAt": "string"
}
],
"activities": [
{}
]
},
"ancestors": [
{
"id": "string",
"createdAt": "string",
"data": {},
"parentCount": 0,
"activityCount": 0,
"hierarchyLevel": 0,
"parents": [
{
"assetId": "string",
"createdAt": "string"
}
]
}
],
"descendants": [
{
"id": "string",
"createdAt": "string",
"data": {},
"parentCount": 0,
"activityCount": 0,
"hierarchyLevel": 0,
"parents": [
{
"assetId": "string",
"createdAt": "string"
}
]
}
],
"summary": {
"totalAncestors": 0,
"totalDescendants": 0,
"totalFamily": 0,
"maxAncestorDepth": 0,
"maxDescendantDepth": 0,
"hasCycles": true
}
}
Schema of the response body
{
"type": "object",
"properties": {
"asset": {
"type": "object",
"properties": {
"id": {
"type": "string",
"description": "Asset ID"
},
"createdAt": {
"type": "string",
"description": "Created timestamp"
},
"data": {
"type": "object",
"properties": {},
"required": [],
"additionalProperties": true,
"description": "Asset data"
},
"parents": {
"type": "array",
"items": {
"type": "object",
"properties": {
"assetId": {
"type": "string"
},
"createdAt": {
"type": "string"
}
}
}
},
"activities": {
"type": "array",
"items": {
"type": "object",
"properties": {}
}
}
}
},
"ancestors": {
"type": "array",
"items": {
"type": "object",
"properties": {
"id": {
"type": "string",
"description": "Asset ID"
},
"createdAt": {
"type": "string",
"description": "Created timestamp"
},
"data": {
"type": "object",
"properties": {},
"required": [],
"additionalProperties": true,
"description": "Asset data"
},
"parentCount": {
"type": "integer",
"description": "Number of parent assets"
},
"activityCount": {
"type": "integer",
"description": "Number of activities"
},
"hierarchyLevel": {
"type": "integer",
"description": "Depth level: -1=parent, -2=grandparent, etc."
},
"parents": {
"type": "array",
"items": {
"type": "object",
"properties": {
"assetId": {
"type": "string",
"description": "Parent asset ID"
},
"createdAt": {
"type": "string",
"description": "When relationship was created"
}
}
},
"description": "Parent relationships for graph edges"
}
}
}
},
"descendants": {
"type": "array",
"items": {
"type": "object",
"properties": {
"id": {
"type": "string",
"description": "Asset ID"
},
"createdAt": {
"type": "string",
"description": "Created timestamp"
},
"data": {
"type": "object",
"properties": {},
"required": [],
"additionalProperties": true,
"description": "Asset data"
},
"parentCount": {
"type": "integer",
"description": "Number of parent assets"
},
"activityCount": {
"type": "integer",
"description": "Number of activities"
},
"hierarchyLevel": {
"type": "integer",
"description": "Depth level: 1=child, 2=grandchild, etc."
},
"parents": {
"type": "array",
"items": {
"type": "object",
"properties": {
"assetId": {
"type": "string",
"description": "Parent asset ID"
},
"createdAt": {
"type": "string",
"description": "When relationship was created"
}
}
},
"description": "Parent relationships for graph edges"
}
}
}
},
"summary": {
"type": "object",
"properties": {
"totalAncestors": {
"type": "integer",
"description": "Total number of ancestors"
},
"totalDescendants": {
"type": "integer",
"description": "Total number of descendants"
},
"totalFamily": {
"type": "integer",
"description": "Total family size (including main asset)"
},
"maxAncestorDepth": {
"type": "integer",
"description": "Maximum depth of ancestor tree"
},
"maxDescendantDepth": {
"type": "integer",
"description": "Maximum depth of descendant tree"
},
"hasCycles": {
"type": "boolean",
"description": "True if circular references were detected"
}
},
"description": "Family tree metadata"
}
}
}
GET /assets/{id}/activities
Input parameters
| Parameter | In | Type | Default | Nullable | Description |
|---|---|---|---|---|---|
cursor |
query | string | No | Pagination cursor | |
id |
path | string | No | Asset ID | |
limit |
query | integer | No | Items per page |
Responses
{
"data": [
{
"id": "string",
"assetId": "string",
"action": "string",
"actionValid": true,
"createdAt": "string",
"context": {},
"data": {}
}
],
"pagination": {
"limit": 10.12,
"count": 10.12,
"hasMore": true,
"nextCursor": "string"
}
}
Schema of the response body
{
"type": "object",
"properties": {
"data": {
"type": "array",
"items": {
"type": "object",
"properties": {
"id": {
"type": "string"
},
"assetId": {
"type": "string"
},
"action": {
"type": "string"
},
"actionValid": {
"type": "boolean"
},
"createdAt": {
"type": "string"
},
"context": {
"type": "object",
"properties": {},
"required": [],
"additionalProperties": true
},
"data": {
"type": "object",
"properties": {},
"required": [],
"additionalProperties": true
}
}
}
},
"pagination": {
"type": "object",
"properties": {
"limit": {
"type": "number"
},
"count": {
"type": "number"
},
"hasMore": {
"type": "boolean"
},
"nextCursor": {
"type": "string"
}
},
"required": [
"limit",
"count",
"hasMore"
],
"additionalProperties": true
}
}
}
POST /assets/search
Input parameters
| Parameter | In | Type | Default | Nullable | Description |
|---|---|---|---|---|---|
cursor |
query | string | No | Pagination cursor | |
limit |
query | integer | No | Items per page |
Request body
{
"apikeyId": "string",
"accountId": "string",
"keyringId": "string",
"parents": [
"string"
],
"everParentedBy": "string",
"start": 0,
"end": 0,
"data": {}
}
Schema of the request body
{
"type": "object",
"properties": {
"apikeyId": {
"type": "string",
"description": "The API Key ID"
},
"accountId": {
"type": "string",
"description": "The Account ID ID"
},
"keyringId": {
"type": "string",
"description": "The KeyRing ID"
},
"parents": {
"type": "array",
"items": {
"type": "string"
},
"description": "CURRENT state: assets whose parent set right now contains any of these ids (reads asset_parents). See \"everParentedBy\" for the HISTORY equivalent — the two look like a cardinality convenience but read different tables."
},
"everParentedBy": {
"type": "string",
"description": "HISTORY, not state: assets that were EVER attached to or detached from this parent id, including edges that no longer exist (reads asset_activity.context.parentId). An asset removed from a parent's set appears here but not in \"parents\"."
},
"start": {
"type": "integer",
"description": "The start time"
},
"end": {
"type": "integer",
"description": "The end time"
},
"data": {
"type": "object",
"properties": {},
"required": [],
"additionalProperties": true
}
}
}
Responses
{
"data": [
{
"id": "string",
"createdAt": "string",
"data": {}
}
],
"pagination": {
"limit": 10.12,
"count": 10.12,
"hasMore": true,
"nextCursor": "string"
}
}
Schema of the response body
{
"type": "object",
"properties": {
"data": {
"type": "array",
"items": {
"type": "object",
"properties": {
"id": {
"type": "string",
"description": "Asset ID"
},
"createdAt": {
"type": "string",
"description": "Created Timestamp"
},
"data": {
"type": "object",
"properties": {},
"required": [],
"additionalProperties": true,
"description": "Data stored on the Asset"
}
}
}
},
"pagination": {
"type": "object",
"properties": {
"limit": {
"type": "number"
},
"count": {
"type": "number"
},
"hasMore": {
"type": "boolean"
},
"nextCursor": {
"type": "string"
}
},
"required": [
"limit",
"count",
"hasMore"
],
"additionalProperties": true
}
}
}
POST /dashboard/assets/search
Search assets
Description
Search for assets with filters and pagination
Input parameters
| Parameter | In | Type | Default | Nullable | Description |
|---|---|---|---|---|---|
cursor |
query | string | No | Pagination cursor | |
limit |
query | integer | No | Items per page |
Request body
{
"apikeyId": "string",
"accountId": "string",
"keyringId": "string",
"parents": [
"string"
],
"everParentedBy": "string",
"start": 0,
"end": 0,
"data": {}
}
Schema of the request body
{
"type": "object",
"properties": {
"apikeyId": {
"type": "string",
"description": "The API Key ID"
},
"accountId": {
"type": "string",
"description": "The Account ID ID"
},
"keyringId": {
"type": "string",
"description": "The KeyRing ID"
},
"parents": {
"type": "array",
"items": {
"type": "string"
},
"description": "CURRENT state: assets whose parent set right now contains any of these ids. See \"everParentedBy\" for the HISTORY equivalent — the two look like a cardinality convenience but read different tables."
},
"everParentedBy": {
"type": "string",
"description": "HISTORY, not state: assets that were EVER attached to or detached from this parent id, including edges that no longer exist. An asset removed from a parent's set appears here but not in \"parents\"."
},
"start": {
"type": "integer",
"description": "The start time"
},
"end": {
"type": "integer",
"description": "The end time"
},
"data": {
"type": "object",
"properties": {},
"required": [],
"additionalProperties": true
}
}
}
Responses
{
"data": [
{}
],
"pagination": {}
}
Schema of the response body
{
"type": "object",
"properties": {
"data": {
"type": "array",
"items": {
"type": "object",
"properties": {},
"additionalProperties": true
}
},
"pagination": {
"type": "object",
"properties": {},
"additionalProperties": true
}
},
"additionalProperties": true
}
GET /dashboard/assets/{id}
Get asset
Description
Returns an asset by ID with parents and activities
Input parameters
| Parameter | In | Type | Default | Nullable | Description |
|---|---|---|---|---|---|
id |
path | string | No |
Responses
{
"id": "string",
"createdAt": "string",
"data": {}
}
Schema of the response body
{
"type": "object",
"properties": {
"id": {
"type": "string"
},
"createdAt": {
"type": "string"
},
"data": {
"type": "object",
"properties": {},
"additionalProperties": true
}
},
"additionalProperties": true
}
GET /dashboard/assets/{id}/family
Get asset family
Description
Returns the complete family tree of an asset including ancestors and descendants
Input parameters
| Parameter | In | Type | Default | Nullable | Description |
|---|---|---|---|---|---|
accountId |
query | string | No | Filter family members to those with activity from this account | |
id |
path | string | No | ||
keyringId |
query | string | No | Filter family members to those with activity using this keyring | |
maxDepth |
query | number | No | Maximum depth to traverse (default: 5) |
Responses
{
"asset": {},
"ancestors": [
{}
],
"descendants": [
{}
]
}
Schema of the response body
{
"type": "object",
"properties": {
"asset": {
"type": "object",
"properties": {},
"additionalProperties": true
},
"ancestors": {
"type": "array",
"items": {
"type": "object",
"properties": {},
"additionalProperties": true
}
},
"descendants": {
"type": "array",
"items": {
"type": "object",
"properties": {},
"additionalProperties": true
}
}
},
"additionalProperties": true
}
GET /dashboard/assets/{id}/anchors
Get asset signing anchors
Description
Returns an asset's append-only signing provenance anchors
Input parameters
| Parameter | In | Type | Default | Nullable | Description |
|---|---|---|---|---|---|
cursor |
query | string | No | Pagination cursor | |
id |
path | string | No | ||
limit |
query | integer | No | Items per page |
Responses
{
"data": [
{}
],
"pagination": {}
}
Schema of the response body
{
"type": "object",
"properties": {
"data": {
"type": "array",
"items": {
"type": "object",
"properties": {},
"additionalProperties": true
}
},
"pagination": {
"type": "object",
"properties": {},
"additionalProperties": true
}
},
"additionalProperties": true
}
GET /dashboard/assets/{id}/activities
Get asset activities
Description
Returns an asset's activity trail (works for deleted assets — retained audit history)
Input parameters
| Parameter | In | Type | Default | Nullable | Description |
|---|---|---|---|---|---|
cursor |
query | string | No | Pagination cursor | |
id |
path | string | No | ||
limit |
query | integer | No | Items per page |
Responses
{
"data": [
{}
],
"pagination": {}
}
Schema of the response body
{
"type": "object",
"properties": {
"data": {
"type": "array",
"items": {
"type": "object",
"properties": {},
"additionalProperties": true
}
},
"pagination": {
"type": "object",
"properties": {},
"additionalProperties": true
}
},
"additionalProperties": true
}
KeyRings
GET /ks/hash/{hash}
Input parameters
| Parameter | In | Type | Default | Nullable | Description |
|---|---|---|---|---|---|
hash |
path | string | No |
Responses
{
"ringId": "string",
"keyId": "string"
}
Schema of the response body
{
"type": "object",
"properties": {
"ringId": {
"type": "string"
},
"keyId": {
"type": "string"
}
}
}
{
"message": "string"
}
Schema of the response body
{
"type": "object",
"properties": {
"message": {
"type": "string"
}
}
}
{
"message": "string"
}
Schema of the response body
{
"type": "object",
"properties": {
"message": {
"type": "string"
}
}
}
GET /ks/assets/{assetId}/anchors
Input parameters
| Parameter | In | Type | Default | Nullable | Description |
|---|---|---|---|---|---|
assetId |
path | string | No | ||
cursor |
query | string | No | Cursor for pagination | |
limit |
query | number | No | Maximum number of anchors to return (default: 100, max: 10000) |
Responses
{
"data": [
{
"id": "string",
"assetId": "string",
"ringId": "string",
"signedAssetHash": "string",
"signKeyId": "string",
"rootSignKeyId": "string",
"ts": 10.12,
"createdAt": 10.12
}
],
"pagination": {
"limit": 10.12,
"count": 10.12,
"hasMore": true,
"nextCursor": "string",
"totalCount": 10.12
}
}
Schema of the response body
{
"type": "object",
"properties": {
"data": {
"type": "array",
"items": {
"type": "object",
"properties": {
"id": {
"type": "string"
},
"assetId": {
"type": "string"
},
"ringId": {
"type": "string"
},
"signedAssetHash": {
"type": "string"
},
"signKeyId": {
"type": "string"
},
"rootSignKeyId": {
"type": "string"
},
"ts": {
"type": "number"
},
"createdAt": {
"type": "number"
}
}
}
},
"pagination": {
"type": "object",
"properties": {
"limit": {
"type": "number"
},
"count": {
"type": "number"
},
"hasMore": {
"type": "boolean"
},
"nextCursor": {
"type": "string"
},
"totalCount": {
"type": "number"
}
},
"required": [
"limit",
"count",
"hasMore"
],
"additionalProperties": true
}
}
}
GET /ks/header/{header}
Input parameters
| Parameter | In | Type | Default | Nullable | Description |
|---|---|---|---|---|---|
header |
path | string | No |
Responses
{
"valid": true,
"version": 0,
"hasSignedAsset": true,
"hash": "string"
}
Schema of the response body
{
"type": "object",
"properties": {
"valid": {
"type": "boolean"
},
"version": {
"type": "integer"
},
"hasSignedAsset": {
"type": "boolean"
},
"hash": {
"type": "string"
}
}
}
{
"message": "string"
}
Schema of the response body
{
"type": "object",
"properties": {
"message": {
"type": "string"
}
}
}
POST /ks/decrypt
Request body
{
"hash": "string",
"header": "string"
}
Schema of the request body
{
"type": "object",
"properties": {
"hash": {
"type": "string"
},
"header": {
"type": "string"
}
}
}
Responses
{
"ringId": "string",
"ringname": "string",
"key": {
"type": "aes256",
"id": "string",
"props": {},
"keyData": {
"encrypted": {
"key": {
"value": "string",
"encoding": null
}
},
"iv": "string"
}
},
"asset": {
"valid": true,
"id": "string",
"message": "string",
"data": {}
}
}
Schema of the response body
{
"type": "object",
"properties": {
"ringId": {
"type": "string",
"description": "The KeyRing ID"
},
"ringname": {
"type": "string",
"description": "The KeyRing name"
},
"key": {
"$ref": "#/components/schemas/ks.key"
},
"asset": {
"$ref": "#/components/schemas/ks.signedasset"
}
}
}
{
"message": "string"
}
Schema of the response body
{
"type": "object",
"properties": {
"message": {
"type": "string"
}
}
}
{
"ringId": "string",
"ringname": "string",
"key": {
"type": "aes256",
"id": "string",
"props": {},
"keyData": {
"encrypted": {
"key": {
"value": "string",
"encoding": null
}
},
"iv": "string"
}
},
"asset": {
"valid": true,
"id": "string",
"message": "string",
"data": {}
}
}
Schema of the response body
{
"type": "object",
"properties": {
"ringId": {
"type": "string",
"description": "The KeyRing ID"
},
"ringname": {
"type": "string",
"description": "The KeyRing name"
},
"key": {
"$ref": "#/components/schemas/ks.key"
},
"asset": {
"$ref": "#/components/schemas/ks.signedasset"
}
}
}
POST /ks/encrypt
Request body
{
"ringname": "string",
"asset": {
"parents": [
"string"
],
"assetId": "string",
"data": {}
}
}
Schema of the request body
{
"type": "object",
"properties": {
"ringname": {
"type": "string",
"description": "The Keyring name"
},
"asset": {
"type": "object",
"properties": {
"parents": {
"type": "array",
"items": {
"type": "string"
},
"description": "Optional. Assign Assets as Parents"
},
"assetId": {
"type": "string",
"description": "If provided, this is the Asset that will be updated. Pass this along for updating existing Assets."
},
"data": {
"type": "object",
"properties": {},
"required": [],
"additionalProperties": true
}
},
"required": [],
"additionalProperties": true,
"description": "The Asset data"
}
},
"required": [
"ringname"
]
}
Responses
{
"key": {
"type": "aes256",
"id": "string",
"props": {},
"keyData": {
"encrypted": {
"key": {
"value": "string",
"encoding": null
}
},
"iv": "string"
}
},
"ringId": "string",
"hash": "string",
"header": "string",
"asset": {}
}
Schema of the response body
{
"type": "object",
"properties": {
"key": {
"$ref": "#/components/schemas/ks.key",
"description": "The Key to use for encryption"
},
"ringId": {
"type": "string",
"description": "The KeyRing ID"
},
"hash": {
"type": "string",
"description": "The unique hash"
},
"header": {
"type": "string",
"description": "The full header"
},
"asset": {
"type": "object",
"properties": {},
"required": [],
"additionalProperties": true,
"description": "Asset information if one was created"
}
}
}
{
"message": "string"
}
Schema of the response body
{
"type": "object",
"properties": {
"message": {
"type": "string"
}
}
}
POST /ks/rotate
Request body
{
"ringname": "string",
"algo": "aes256"
}
Schema of the request body
{
"type": "object",
"properties": {
"ringname": {
"type": "string",
"description": "The Keyring name"
},
"algo": {
"type": "string",
"enum": [
"aes256"
],
"description": "The Algorithm to use"
}
},
"required": [
"ringname"
]
}
Responses
{
"key": {
"type": "aes256",
"id": "string",
"props": {},
"keyData": {
"encrypted": {
"key": {
"value": "string",
"encoding": null
}
},
"iv": "string"
}
}
}
Schema of the response body
{
"type": "object",
"properties": {
"key": {
"$ref": "#/components/schemas/ks.key"
}
}
}
{
"message": "string"
}
Schema of the response body
{
"type": "object",
"properties": {
"message": {
"type": "string"
}
}
}
{
"message": "string"
}
Schema of the response body
{
"type": "object",
"properties": {
"message": {
"type": "string"
}
}
}
{
"message": "string"
}
Schema of the response body
{
"type": "object",
"properties": {
"message": {
"type": "string"
}
}
}
POST /ks/keyrings
Request body
{
"name": "string",
"algo": "aes256",
"publicKey": "string",
"props": {},
"keyProps": {}
}
Schema of the request body
{
"type": "object",
"properties": {
"name": {
"type": "string",
"description": "The KeyRing name"
},
"algo": {
"type": "string",
"enum": [
"aes256"
],
"description": "The Algorithm"
},
"publicKey": {
"type": "string",
"description": "The Public Key"
},
"props": {
"type": "object",
"properties": {},
"required": [],
"additionalProperties": true
},
"keyProps": {
"type": "object",
"properties": {},
"required": [],
"additionalProperties": true
}
},
"required": [
"name"
]
}
Responses
{
"ring": {
"id": "string",
"name": "string",
"displayName": "string",
"activeKey": "string",
"activeAlgorithm": null,
"createdAt": "string",
"updatedAt": "string",
"props": {},
"publicKey": "string"
},
"key": {
"type": "aes256",
"id": "string",
"props": {},
"keyData": {
"encrypted": {
"key": {
"value": "string",
"encoding": null
}
},
"iv": "string"
}
},
"privateKey": "string"
}
Schema of the response body
{
"type": "object",
"properties": {
"ring": {
"$ref": "#/components/schemas/ks.keyring",
"description": "KeyRing details"
},
"key": {
"$ref": "#/components/schemas/ks.key",
"description": "The currently Active Key"
},
"privateKey": {
"type": "string",
"description": "A base64 encoded Private Key. This will only be returned if a Public Key was not provided"
}
}
}
{
"message": "string"
}
Schema of the response body
{
"type": "object",
"properties": {
"message": {
"type": "string"
}
}
}
{
"message": "string"
}
Schema of the response body
{
"type": "object",
"properties": {
"message": {
"type": "string"
}
}
}
GET /ks/keyrings
Input parameters
| Parameter | In | Type | Default | Nullable | Description |
|---|---|---|---|---|---|
cursor |
query | string | No | Cursor for pagination | |
limit |
query | number | No | Maximum number of keyrings to return (default: 100, max: 10000) | |
sortBy |
query | string | No | Column to sort by: name or createdAt (default: createdAt) | |
sortOrder |
query | string | No | Sort direction: asc or desc (default: asc) |
Responses
{
"data": [
{
"id": "string",
"name": "string",
"displayName": "string",
"activeKey": "string",
"activeAlgorithm": null,
"createdAt": "string",
"updatedAt": "string",
"props": {},
"publicKey": "string"
}
],
"pagination": {
"limit": 10.12,
"count": 10.12,
"hasMore": true,
"nextCursor": "string"
}
}
Schema of the response body
{
"type": "object",
"properties": {
"data": {
"type": "array",
"items": {
"$ref": "#/components/schemas/ks.keyring"
}
},
"pagination": {
"type": "object",
"properties": {
"limit": {
"type": "number"
},
"count": {
"type": "number"
},
"hasMore": {
"type": "boolean"
},
"nextCursor": {
"type": "string"
}
},
"required": [
"limit",
"count",
"hasMore"
],
"additionalProperties": true
}
}
}
GET /ks/keyrings/{ringname}
Input parameters
| Parameter | In | Type | Default | Nullable | Description |
|---|---|---|---|---|---|
id |
query | string | No | If set to 'true', the provided KeyRing name will be treated as the KeyRing ID | |
ringname |
path | string | No | The KeyRing name |
Responses
{
"ring": {
"id": "string",
"name": "string",
"displayName": "string",
"activeKey": "string",
"activeAlgorithm": null,
"createdAt": "string",
"updatedAt": "string",
"props": {},
"publicKey": "string"
}
}
Schema of the response body
{
"type": "object",
"properties": {
"ring": {
"$ref": "#/components/schemas/ks.keyring"
}
}
}
{
"message": "string"
}
Schema of the response body
{
"type": "object",
"properties": {
"message": {
"type": "string"
}
}
}
{
"message": "string"
}
Schema of the response body
{
"type": "object",
"properties": {
"message": {
"type": "string"
}
}
}
GET /ks/config
Input parameters
| Parameter | In | Type | Default | Nullable | Description |
|---|---|---|---|---|---|
ringname |
query | string | No | The KeyRing name |
Responses
{
"config": {
"props": {},
"key": {
"props": {}
},
"algos": {
"aes256": {
"maxEncryptCount": 0
}
},
"signing": {
"mode": null,
"required": true
}
}
}
Schema of the response body
{
"type": "object",
"properties": {
"config": {
"$ref": "#/components/schemas/ks.keyringconfig"
}
}
}
{
"message": "string"
}
Schema of the response body
{
"type": "object",
"properties": {
"message": {
"type": "string"
}
}
}
{
"message": "string"
}
Schema of the response body
{
"type": "object",
"properties": {
"message": {
"type": "string"
}
}
}
PUT /ks/config
Request body
{
"ringname": "string",
"config": {
"props": {},
"key": {
"props": {}
},
"algos": {
"aes256": {
"maxEncryptCount": 0
}
},
"signing": {
"mode": null,
"required": true
}
}
}
Schema of the request body
{
"type": "object",
"properties": {
"ringname": {
"type": "string",
"description": "The KeyRing name"
},
"config": {
"$ref": "#/components/schemas/ks.keyringconfig"
}
},
"required": [
"ringname",
"config"
]
}
Responses
{
"config": {
"props": {},
"key": {
"props": {}
},
"algos": {
"aes256": {
"maxEncryptCount": 0
}
},
"signing": {
"mode": null,
"required": true
}
}
}
Schema of the response body
{
"type": "object",
"properties": {
"config": {
"$ref": "#/components/schemas/ks.keyringconfig"
}
}
}
{
"message": "string"
}
Schema of the response body
{
"type": "object",
"properties": {
"message": {
"type": "string"
}
}
}
{
"message": "string"
}
Schema of the response body
{
"type": "object",
"properties": {
"message": {
"type": "string"
}
}
}
DELETE /ks/keyrings/{name}
Input parameters
| Parameter | In | Type | Default | Nullable | Description |
|---|---|---|---|---|---|
name |
path | string | No | The KeyRing name |
Responses
{
"name": "string",
"id": "string"
}
Schema of the response body
{
"type": "object",
"properties": {
"name": {
"type": "string"
},
"id": {
"type": "string"
}
}
}
{
"message": "string"
}
Schema of the response body
{
"type": "object",
"properties": {
"message": {
"type": "string"
}
}
}
GET /ks/keyrings/{ringname}/keys
Input parameters
| Parameter | In | Type | Default | Nullable | Description |
|---|---|---|---|---|---|
cursor |
query | string | No | Cursor for pagination | |
id |
query | string | No | If set to 'true' will treat the ringname as the KeyRing ID | |
limit |
query | number | No | Maximum number of keys to return (default: 100, max: 10000) | |
ringname |
path | string | No | The KeyRing name |
Responses
{
"data": [
{
"type": null,
"props": {},
"id": "string"
}
],
"pagination": {
"limit": 10.12,
"count": 10.12,
"hasMore": true,
"nextCursor": "string",
"totalCount": 10.12
}
}
Schema of the response body
{
"type": "object",
"properties": {
"data": {
"type": "array",
"items": {
"type": "object",
"properties": {
"type": {
"enum": [
"aes256"
]
},
"props": {
"type": "object",
"properties": {},
"required": [],
"additionalProperties": true
},
"id": {
"type": "string"
}
}
}
},
"pagination": {
"type": "object",
"properties": {
"limit": {
"type": "number"
},
"count": {
"type": "number"
},
"hasMore": {
"type": "boolean"
},
"nextCursor": {
"type": "string"
},
"totalCount": {
"type": "number"
}
},
"required": [
"limit",
"count",
"hasMore"
],
"additionalProperties": true
}
}
}
{
"message": "string"
}
Schema of the response body
{
"type": "object",
"properties": {
"message": {
"type": "string"
}
}
}
GET /ks/keyrings/{ringname}/keys/{keyId}
Input parameters
| Parameter | In | Type | Default | Nullable | Description |
|---|---|---|---|---|---|
id |
query | string | No | If set to 'true', the provided KeyRing name will be treated as the KeyRing ID | |
keyId |
path | string | No | The Key ID | |
ringname |
path | string | No | The KeyRing name |
Responses
{
"type": "aes256",
"id": "string",
"props": {},
"keyData": {
"encrypted": {
"key": {
"value": "string",
"encoding": null
}
},
"iv": "string"
}
}
Schema of the response body
{
"type": "object",
"properties": {
"type": {
"$ref": "#/components/schemas/ks.algorithm",
"description": "The Algorithm"
},
"id": {
"type": "string",
"description": "The Key ID"
},
"props": {
"type": "object",
"properties": {},
"required": [],
"additionalProperties": true,
"description": "Any unique data stored on the Key"
},
"keyData": {
"$ref": "#/components/schemas/ks.keydataencrypted",
"description": "The encrypted Key Data"
}
}
}
{
"message": "string"
}
Schema of the response body
{
"type": "object",
"properties": {
"message": {
"type": "string"
}
}
}
{
"message": "string"
}
Schema of the response body
{
"type": "object",
"properties": {
"message": {
"type": "string"
}
}
}
Endpoints
GET /auth/sso/{id}/login
Input parameters
| Parameter | In | Type | Default | Nullable | Description |
|---|---|---|---|---|---|
id |
path | string | No |
Responses
GET /auth/sso/{id}/callback
Input parameters
| Parameter | In | Type | Default | Nullable | Description |
|---|---|---|---|---|---|
id |
path | string | No |
Responses
POST /auth/sso/{id}/callback
Input parameters
| Parameter | In | Type | Default | Nullable | Description |
|---|---|---|---|---|---|
id |
path | string | No |
Responses
GET /auth/sso/{id}/metadata
Input parameters
| Parameter | In | Type | Default | Nullable | Description |
|---|---|---|---|---|---|
id |
path | string | No |
Responses
GET /dashboard/sso/{id}/login
Input parameters
| Parameter | In | Type | Default | Nullable | Description |
|---|---|---|---|---|---|
id |
path | string | No |
Responses
GET /dashboard/sso/{id}/metadata
Input parameters
| Parameter | In | Type | Default | Nullable | Description |
|---|---|---|---|---|---|
id |
path | string | No |
Responses
Users
POST /auth/validate
Request body
{
"apikey": "string",
"activity": {},
"requiredFlags": {},
"trustedServiceCtx": {
"user": {
"userId": "string",
"username": "string"
},
"options": {
"suppressActivity": true
}
},
"denialReason": "string"
}
Schema of the request body
{
"type": "object",
"properties": {
"apikey": {
"type": "string"
},
"activity": {
"type": "object",
"properties": {},
"required": [],
"additionalProperties": true
},
"requiredFlags": {
"type": "object",
"properties": {},
"required": [],
"additionalProperties": true
},
"trustedServiceCtx": {
"$ref": "#/components/schemas/auth.validate.trustedservicectx"
},
"denialReason": {
"type": "string"
}
},
"required": [
"apikey"
]
}
Responses
{
"valid": true
}
Schema of the response body
{
"type": "object",
"properties": {
"valid": {
"type": "boolean"
}
},
"additionalProperties": true
}
POST /auth/user/invite
Request body
{
"email": "string"
}
Schema of the request body
{
"type": "object",
"properties": {
"email": {
"type": "string"
}
},
"required": [
"email"
]
}
Responses
{
"loginUrl": "string"
}
Schema of the response body
{
"type": "object",
"properties": {
"loginUrl": {
"type": "string"
}
}
}
{
"message": "string"
}
Schema of the response body
{
"type": "object",
"properties": {
"message": {
"type": "string"
}
}
}
{
"message": "string"
}
Schema of the response body
{
"type": "object",
"properties": {
"message": {
"type": "string"
}
}
}
GET /auth/user/invite-validate
Input parameters
| Parameter | In | Type | Default | Nullable | Description |
|---|---|---|---|---|---|
token |
query | string | No |
Responses
{
"state": null,
"email": "string"
}
Schema of the response body
{
"type": "object",
"properties": {
"state": {
"enum": [
"success"
]
},
"email": {
"type": "string"
}
}
}
{
"state": null
}
Schema of the response body
{
"type": "object",
"properties": {
"state": {
"enum": [
"expired",
"invalid"
]
}
}
}
{
"message": "string"
}
Schema of the response body
{
"type": "object",
"properties": {
"message": {
"type": "string"
}
}
}
POST /auth/user/invite-complete
Request body
{
"token": "string",
"username": "string",
"firstName": "string",
"lastName": "string",
"password": "string"
}
Schema of the request body
{
"type": "object",
"properties": {
"token": {
"type": "string"
},
"username": {
"type": "string"
},
"firstName": {
"type": "string"
},
"lastName": {
"type": "string"
},
"password": {
"type": "string"
}
},
"required": [
"token",
"username",
"firstName",
"lastName",
"password"
]
}
Responses
{
"user": {
"id": "string",
"username": "string",
"firstName": "string",
"lastName": "string",
"displayName": "string",
"keys": [
"string"
],
"email": "string",
"props": {}
},
"accesstoken": "string"
}
Schema of the response body
{
"type": "object",
"properties": {
"user": {
"$ref": "#/components/schemas/auth.user"
},
"accesstoken": {
"type": "string"
}
}
}
{
"state": null,
"results": {
"isValid": true,
"details": {
"minLength": 10.12,
"newPasswordLength": 10.12,
"minUppercase": 10.12,
"newPasswordUppercase": 10.12,
"minLowercase": 10.12,
"newPasswordLowercase": 10.12,
"minSpecialChar": 10.12,
"newPasswordSpecialChar": 10.12,
"minNumber": 10.12,
"newPasswordNumber": 10.12
}
}
}
Schema of the response body
{
"type": "object",
"properties": {
"state": {
"enum": [
"malformed-password"
]
},
"results": {
"$ref": "#/components/schemas/auth.password.validation"
}
}
}
{
"state": null
}
Schema of the response body
{
"type": "object",
"properties": {
"state": {
"enum": [
"invalid",
"expired"
]
}
}
}
{
"message": "string"
}
Schema of the response body
{
"type": "object",
"properties": {
"message": {
"type": "string"
}
}
}
GET /auth/user/invites
Responses
{
"data": [
{
"id": "string",
"email": "string",
"createdAt": 10.12,
"expiresAt": 10.12,
"status": "string",
"attempts": 10.12
}
]
}
Schema of the response body
{
"type": "object",
"properties": {
"data": {
"type": "array",
"items": {
"type": "object",
"properties": {
"id": {
"type": "string"
},
"email": {
"type": "string"
},
"createdAt": {
"type": "number"
},
"expiresAt": {
"type": "number"
},
"status": {
"type": "string"
},
"attempts": {
"type": "number"
}
},
"additionalProperties": true
}
}
}
}
DELETE /auth/user/invites/{id}
Input parameters
| Parameter | In | Type | Default | Nullable | Description |
|---|---|---|---|---|---|
id |
path | string | No |
Responses
Schema of the response body
{
"type": "object",
"properties": {}
}
{
"message": "string"
}
Schema of the response body
{
"type": "object",
"properties": {
"message": {
"type": "string"
}
}
}
POST /auth/basic/login
Input parameters
| Parameter | In | Type | Default | Nullable | Description |
|---|---|---|---|---|---|
email |
query | string | No |
Request body
{
"username": "string",
"password": "string"
}
Schema of the request body
{
"type": "object",
"properties": {
"username": {
"type": "string"
},
"password": {
"type": "string"
}
},
"required": [
"username",
"password"
]
}
Responses
{
"user": {
"id": "string",
"username": "string",
"firstName": "string",
"lastName": "string",
"displayName": "string",
"keys": [
"string"
],
"email": "string",
"props": {}
},
"accesstoken": "string"
}
Schema of the response body
{
"type": "object",
"properties": {
"user": {
"$ref": "#/components/schemas/auth.user"
},
"accesstoken": {
"type": "string",
"description": "The Access Token sent with every request as a Bearer token."
}
}
}
{
"message": "string"
}
Schema of the response body
{
"type": "object",
"properties": {
"message": {
"type": "string"
}
}
}
GET /auth/basic/refresh
Responses
{
"user": {
"id": "string",
"username": "string",
"firstName": "string",
"lastName": "string",
"displayName": "string",
"keys": [
"string"
],
"email": "string",
"props": {}
},
"accessToken": "string"
}
Schema of the response body
{
"type": "object",
"properties": {
"user": {
"$ref": "#/components/schemas/auth.user"
},
"accessToken": {
"type": "string"
}
}
}
POST /auth/basic/logout
GET /auth/whoami
Responses
{
"user": {
"id": "string",
"username": "string",
"firstName": "string",
"lastName": "string",
"displayName": "string",
"keys": [
"string"
],
"email": "string",
"props": {}
}
}
Schema of the response body
{
"type": "object",
"properties": {
"user": {
"$ref": "#/components/schemas/auth.user"
}
}
}
{
"message": "string"
}
Schema of the response body
{
"type": "object",
"properties": {
"message": {
"type": "string"
}
}
}
POST /auth/basic/reset-password-start
Request body
{
"email": "string"
}
Schema of the request body
{
"type": "object",
"properties": {
"email": {
"type": "string"
}
},
"required": [
"email"
]
}
Responses
{
"message": "string"
}
Schema of the response body
{
"type": "object",
"properties": {
"message": {
"type": "string"
}
}
}
POST /auth/basic/reset-password-complete
Request body
{
"token": "string",
"password": "string"
}
Schema of the request body
{
"type": "object",
"properties": {
"token": {
"type": "string"
},
"password": {
"type": "string"
}
},
"required": [
"token",
"password"
]
}
Responses
Schema of the response body
{
"type": "object",
"properties": {}
}
{
"state": null,
"password": {}
}
Schema of the response body
{
"type": "object",
"properties": {
"state": {
"enum": [
"malformed-password"
]
},
"password": {
"type": "object",
"properties": {},
"additionalProperties": true
}
}
}
{
"message": "string"
}
Schema of the response body
{
"type": "object",
"properties": {
"message": {
"type": "string"
}
}
}
{
"message": "string"
}
Schema of the response body
{
"type": "object",
"properties": {
"message": {
"type": "string"
}
}
}
GET /auth/users/{username}
Input parameters
| Parameter | In | Type | Default | Nullable | Description |
|---|---|---|---|---|---|
email |
query | string | No | ||
username |
path | string | No | The username or email if email is set to true |
Responses
{
"id": "string",
"username": "string",
"firstName": "string",
"lastName": "string",
"displayName": "string",
"keys": [
"string"
],
"email": "string",
"props": {}
}
Schema of the response body
{
"type": "object",
"properties": {
"id": {
"type": "string",
"description": "The User ID"
},
"username": {
"type": "string",
"description": "The unique user name"
},
"firstName": {
"type": "string",
"description": "The User's first name"
},
"lastName": {
"type": "string",
"description": "The User's last name"
},
"displayName": {
"type": "string",
"description": "The User's display name"
},
"keys": {
"type": "array",
"items": {
"type": "string"
},
"description": "A list of all API Key IDs owned by the user"
},
"email": {
"type": "string",
"description": "The User's email"
},
"props": {
"type": "object",
"properties": {},
"required": [],
"additionalProperties": true,
"description": "Any unique props stored on the User"
}
}
}
Schema of the response body
{
"type": "object",
"properties": {}
}
PATCH /auth/users/{username}
Input parameters
| Parameter | In | Type | Default | Nullable | Description |
|---|---|---|---|---|---|
username |
path | string | No |
Request body
{
"email": "string",
"firstName": "string",
"lastName": "string",
"props": {}
}
Schema of the request body
{
"type": "object",
"properties": {
"email": {
"type": "string"
},
"firstName": {
"type": "string"
},
"lastName": {
"type": "string"
},
"props": {
"type": "object",
"properties": {},
"required": [],
"additionalProperties": true
}
}
}
Responses
{
"id": "string",
"username": "string",
"firstName": "string",
"lastName": "string",
"displayName": "string",
"keys": [
"string"
],
"email": "string",
"props": {}
}
Schema of the response body
{
"type": "object",
"properties": {
"id": {
"type": "string",
"description": "The User ID"
},
"username": {
"type": "string",
"description": "The unique user name"
},
"firstName": {
"type": "string",
"description": "The User's first name"
},
"lastName": {
"type": "string",
"description": "The User's last name"
},
"displayName": {
"type": "string",
"description": "The User's display name"
},
"keys": {
"type": "array",
"items": {
"type": "string"
},
"description": "A list of all API Key IDs owned by the user"
},
"email": {
"type": "string",
"description": "The User's email"
},
"props": {
"type": "object",
"properties": {},
"required": [],
"additionalProperties": true,
"description": "Any unique props stored on the User"
}
}
}
{
"message": "string"
}
Schema of the response body
{
"type": "object",
"properties": {
"message": {
"type": "string"
}
}
}
DELETE /auth/users/{username}
Input parameters
| Parameter | In | Type | Default | Nullable | Description |
|---|---|---|---|---|---|
id |
query | string | No | 'true' = treats username as a User ID, otherwise use the User name | |
username |
path | string | No |
Responses
{
"message": "string"
}
Schema of the response body
{
"type": "object",
"properties": {
"message": {
"type": "string"
}
}
}
{
"message": "string"
}
Schema of the response body
{
"type": "object",
"properties": {
"message": {
"type": "string"
}
}
}
GET /auth/users
Input parameters
| Parameter | In | Type | Default | Nullable | Description |
|---|---|---|---|---|---|
cursor |
query | string | No | Cursor for next page | |
limit |
query | integer | No | Page size (max 10000, default 100) |
Responses
{
"data": [
{
"id": "string",
"username": "string",
"firstName": "string",
"lastName": "string",
"displayName": "string",
"keys": [
"string"
],
"email": "string",
"props": {}
}
],
"pagination": {
"limit": 0,
"count": 0,
"hasMore": true,
"nextCursor": "string"
}
}
Schema of the response body
{
"type": "object",
"properties": {
"data": {
"type": "array",
"items": {
"$ref": "#/components/schemas/auth.user"
}
},
"pagination": {
"type": "object",
"properties": {
"limit": {
"type": "integer"
},
"count": {
"type": "integer"
},
"hasMore": {
"type": "boolean"
},
"nextCursor": {
"type": "string"
}
},
"required": [
"limit",
"count",
"hasMore"
]
}
}
}
POST /auth/users
Request body
{
"username": "string",
"email": "string",
"displayName": "string",
"firstName": "string",
"lastName": "string",
"props": {}
}
Schema of the request body
{
"type": "object",
"properties": {
"username": {
"type": "string"
},
"email": {
"type": "string"
},
"displayName": {
"type": "string"
},
"firstName": {
"type": "string"
},
"lastName": {
"type": "string"
},
"props": {
"type": "object",
"properties": {},
"required": [],
"additionalProperties": true
}
},
"required": [
"username",
"email",
"firstName",
"lastName"
]
}
Responses
{
"user": {
"id": "string",
"username": "string",
"firstName": "string",
"lastName": "string",
"displayName": "string",
"keys": [
"string"
],
"email": "string",
"props": {}
},
"password": "string"
}
Schema of the response body
{
"type": "object",
"properties": {
"user": {
"$ref": "#/components/schemas/auth.user"
},
"password": {
"type": "string"
}
}
}
{
"message": "string",
"errors": {}
}
Schema of the response body
{
"type": "object",
"properties": {
"message": {
"type": "string"
},
"errors": {
"type": "object",
"properties": {},
"required": [],
"additionalProperties": true
}
}
}
GET /dashboard/users
List users
Description
Returns a list of all users
Responses
{
"data": [
{}
],
"pagination": {}
}
Schema of the response body
{
"type": "object",
"properties": {
"data": {
"type": "array",
"items": {
"type": "object",
"properties": {},
"additionalProperties": true
}
},
"pagination": {
"type": "object",
"properties": {},
"additionalProperties": true
}
},
"additionalProperties": true
}
POST /dashboard/users
Create user
Description
Creates a new user
Request body
{
"username": "string",
"email": "string",
"firstName": "string",
"lastName": "string",
"displayName": "string",
"props": {}
}
Schema of the request body
{
"type": "object",
"properties": {
"username": {
"type": "string"
},
"email": {
"type": "string"
},
"firstName": {
"type": "string"
},
"lastName": {
"type": "string"
},
"displayName": {
"type": "string"
},
"props": {
"type": "object",
"properties": {},
"additionalProperties": true
}
}
}
Responses
{
"user": {
"id": "string",
"username": "string",
"email": "string",
"firstName": "string",
"lastName": "string",
"displayName": "string"
},
"password": "string"
}
Schema of the response body
{
"type": "object",
"properties": {
"user": {
"type": "object",
"properties": {
"id": {
"type": "string"
},
"username": {
"type": "string"
},
"email": {
"type": "string"
},
"firstName": {
"type": "string"
},
"lastName": {
"type": "string"
},
"displayName": {
"type": "string"
}
},
"additionalProperties": true
},
"password": {
"type": "string"
}
},
"additionalProperties": true
}
GET /dashboard/users/{id}
Get user
Description
Returns a user by ID
Input parameters
| Parameter | In | Type | Default | Nullable | Description |
|---|---|---|---|---|---|
id |
path | string | No |
Responses
{
"id": "string",
"username": "string",
"email": "string",
"firstName": "string",
"lastName": "string",
"displayName": "string",
"keys": [
"string"
],
"props": {}
}
Schema of the response body
{
"type": "object",
"properties": {
"id": {
"type": "string"
},
"username": {
"type": "string"
},
"email": {
"type": "string"
},
"firstName": {
"type": "string"
},
"lastName": {
"type": "string"
},
"displayName": {
"type": "string"
},
"keys": {
"type": "array",
"items": {
"type": "string"
}
},
"props": {
"type": "object",
"properties": {},
"additionalProperties": true
}
},
"additionalProperties": true
}
PATCH /dashboard/users/{id}
Update user
Description
Updates an existing user
Input parameters
| Parameter | In | Type | Default | Nullable | Description |
|---|---|---|---|---|---|
id |
path | string | No |
Request body
{
"firstName": "string",
"lastName": "string",
"email": "string"
}
Schema of the request body
{
"type": "object",
"properties": {
"firstName": {
"type": "string"
},
"lastName": {
"type": "string"
},
"email": {
"type": "string"
}
}
}
Responses
{
"success": true
}
Schema of the response body
{
"type": "object",
"properties": {
"success": {
"type": "boolean"
}
}
}
DELETE /dashboard/users/{id}
Delete user
Description
Deletes a user
Input parameters
| Parameter | In | Type | Default | Nullable | Description |
|---|---|---|---|---|---|
id |
path | string | No |
Responses
{
"success": true
}
Schema of the response body
{
"type": "object",
"properties": {
"success": {
"type": "boolean"
}
}
}
POST /dashboard/dev/change-password
Change password (dev)
Description
Development endpoint to change password
Request body
{
"userId": "string",
"newPassword": "string"
}
Schema of the request body
{
"type": "object",
"properties": {
"userId": {
"type": "string"
},
"newPassword": {
"type": "string"
}
}
}
Responses
{
"success": true
}
Schema of the response body
{
"type": "object",
"properties": {
"success": {
"type": "boolean"
}
}
}
POST /dashboard/user/invite
Invite user
Description
Sends an invitation email to a new user
Request body
{
"email": "string"
}
Schema of the request body
{
"type": "object",
"properties": {
"email": {
"type": "string"
}
}
}
Responses
Schema of the response body
{
"type": "object",
"properties": {}
}
{
"message": "string"
}
Schema of the response body
{
"type": "object",
"properties": {
"message": {
"type": "string"
}
}
}
{
"message": "string"
}
Schema of the response body
{
"type": "object",
"properties": {
"message": {
"type": "string"
}
}
}
GET /dashboard/user/invite-validate
Validate invite token
Description
Validates the invite token from the magic link
Input parameters
| Parameter | In | Type | Default | Nullable | Description |
|---|---|---|---|---|---|
token |
query | string | No |
Responses
{
"state": "string",
"email": "string"
}
Schema of the response body
{
"type": "object",
"properties": {
"state": {
"type": "string"
},
"email": {
"type": "string"
}
}
}
{
"state": "string"
}
Schema of the response body
{
"type": "object",
"properties": {
"state": {
"type": "string"
}
}
}
{
"message": "string"
}
Schema of the response body
{
"type": "object",
"properties": {
"message": {
"type": "string"
}
}
}
POST /dashboard/user/invite-complete
Complete invite
Description
Creates the user account after invitation
Request body
{
"token": "string",
"username": "string",
"firstName": "string",
"lastName": "string",
"password": "string"
}
Schema of the request body
{
"type": "object",
"properties": {
"token": {
"type": "string"
},
"username": {
"type": "string"
},
"firstName": {
"type": "string"
},
"lastName": {
"type": "string"
},
"password": {
"type": "string"
}
}
}
Responses
{
"user": {},
"accesstoken": "string"
}
Schema of the response body
{
"type": "object",
"properties": {
"user": {
"type": "object",
"properties": {},
"additionalProperties": true
},
"accesstoken": {
"type": "string"
}
}
}
{
"state": "string"
}
Schema of the response body
{
"type": "object",
"properties": {
"state": {
"type": "string"
}
}
}
{
"state": "string"
}
Schema of the response body
{
"type": "object",
"properties": {
"state": {
"type": "string"
}
}
}
{
"message": "string"
}
Schema of the response body
{
"type": "object",
"properties": {
"message": {
"type": "string"
}
}
}
GET /dashboard/user/invites
List user invites
Description
Returns all pending and expired invite tokens
Responses
{
"data": [
{
"id": "string",
"email": "string",
"createdAt": 10.12,
"expiresAt": 10.12,
"status": "string",
"attempts": 10.12
}
]
}
Schema of the response body
{
"type": "object",
"properties": {
"data": {
"type": "array",
"items": {
"type": "object",
"properties": {
"id": {
"type": "string"
},
"email": {
"type": "string"
},
"createdAt": {
"type": "number"
},
"expiresAt": {
"type": "number"
},
"status": {
"type": "string"
},
"attempts": {
"type": "number"
}
},
"additionalProperties": true
}
}
}
}
DELETE /dashboard/user/invites/{id}
Revoke user invite
Description
Revokes a pending or expired invite by its id
Input parameters
| Parameter | In | Type | Default | Nullable | Description |
|---|---|---|---|---|---|
id |
path | string | No |
Responses
Schema of the response body
{
"type": "object",
"properties": {}
}
{
"message": "string"
}
Schema of the response body
{
"type": "object",
"properties": {
"message": {
"type": "string"
}
}
}
POST /dashboard/basic/reset-password-start
Start password reset
Description
Initiates the password reset flow
Request body
{
"email": "string"
}
Schema of the request body
{
"type": "object",
"properties": {
"email": {
"type": "string"
}
}
}
Responses
{
"message": "string"
}
Schema of the response body
{
"type": "object",
"properties": {
"message": {
"type": "string"
}
}
}
POST /dashboard/basic/reset-password-complete
Complete password reset
Description
Finalises password reset using the token from email
Request body
{
"token": "string",
"password": "string"
}
Schema of the request body
{
"type": "object",
"properties": {
"token": {
"type": "string"
},
"password": {
"type": "string"
}
}
}
Responses
Schema of the response body
{
"type": "object",
"properties": {}
}
{
"state": "string"
}
Schema of the response body
{
"type": "object",
"properties": {
"state": {
"type": "string"
}
}
}
{
"message": "string"
}
Schema of the response body
{
"type": "object",
"properties": {
"message": {
"type": "string"
}
}
}
{
"message": "string"
}
Schema of the response body
{
"type": "object",
"properties": {
"message": {
"type": "string"
}
}
}
Service
POST /auth/service/handshake
Request body
{
"serviceName": "string",
"sKey": "string"
}
Schema of the request body
{
"type": "object",
"properties": {
"serviceName": {
"type": "string"
},
"sKey": {
"type": "string"
}
},
"required": [
"serviceName",
"sKey"
]
}
Responses
{
"apiKey": "string",
"keyid": "string",
"expiresAt": "string"
}
Schema of the response body
{
"type": "object",
"properties": {
"apiKey": {
"type": "string"
},
"keyid": {
"type": "string"
},
"expiresAt": {
"type": "string"
}
}
}
{
"message": "string"
}
Schema of the response body
{
"type": "object",
"properties": {
"message": {
"type": "string"
}
}
}
{
"message": "string"
}
Schema of the response body
{
"type": "object",
"properties": {
"message": {
"type": "string"
}
}
}
{
"message": "string"
}
Schema of the response body
{
"type": "object",
"properties": {
"message": {
"type": "string"
}
}
}
Accounts
POST /auth/accounts
Request body
{
"uid": "string",
"notes": "string",
"props": {}
}
Schema of the request body
{
"type": "object",
"properties": {
"uid": {
"type": "string"
},
"notes": {
"type": "string"
},
"props": {
"type": "object",
"properties": {},
"required": [],
"additionalProperties": true
}
},
"required": [
"uid"
]
}
Responses
{
"id": "string",
"uid": "string",
"notes": "string",
"status": "string",
"props": {},
"createdAt": "string",
"updatedAt": "string",
"apiKeyCount": 0
}
Schema of the response body
{
"type": "object",
"properties": {
"id": {
"type": "string"
},
"uid": {
"type": "string",
"description": "The Account UID"
},
"notes": {
"type": "string"
},
"status": {
"type": "string",
"description": "Account status: 'active' or 'deactivated'"
},
"props": {
"type": "object",
"properties": {},
"required": [],
"additionalProperties": true
},
"createdAt": {
"type": "string"
},
"updatedAt": {
"type": "string"
},
"apiKeyCount": {
"type": "integer",
"description": "Number of API keys for this account (only present when includeKeyCounts=true)",
"nullable": true
}
}
}
GET /auth/accounts
Input parameters
| Parameter | In | Type | Default | Nullable | Description |
|---|---|---|---|---|---|
cursor |
query | string | No | Cursor for next page | |
includeDeactivated |
query | boolean | No | When true, deactivated accounts are included | |
limit |
query | integer | No | Page size (max 10000, default 100) |
Responses
{
"data": [
{
"id": "string",
"uid": "string",
"notes": "string",
"status": "string",
"props": {},
"createdAt": "string",
"updatedAt": "string",
"apiKeyCount": 0
}
],
"pagination": {
"limit": 0,
"count": 0,
"hasMore": true,
"nextCursor": "string"
}
}
Schema of the response body
{
"type": "object",
"properties": {
"data": {
"type": "array",
"items": {
"$ref": "#/components/schemas/auth.account"
}
},
"pagination": {
"type": "object",
"properties": {
"limit": {
"type": "integer"
},
"count": {
"type": "integer"
},
"hasMore": {
"type": "boolean"
},
"nextCursor": {
"type": "string"
}
},
"required": [
"limit",
"count",
"hasMore"
]
}
}
}
GET /auth/accounts/{id}
Input parameters
| Parameter | In | Type | Default | Nullable | Description |
|---|---|---|---|---|---|
id |
path | string | No | ||
includeDeactivated |
query | boolean | No | When true, a deactivated account is returned instead of 404 | |
uid |
query | string | No | If set to 'true', treat the id as a uid |
Responses
{
"id": "string",
"uid": "string",
"notes": "string",
"status": "string",
"props": {},
"createdAt": "string",
"updatedAt": "string",
"apiKeyCount": 0
}
Schema of the response body
{
"type": "object",
"properties": {
"id": {
"type": "string"
},
"uid": {
"type": "string",
"description": "The Account UID"
},
"notes": {
"type": "string"
},
"status": {
"type": "string",
"description": "Account status: 'active' or 'deactivated'"
},
"props": {
"type": "object",
"properties": {},
"required": [],
"additionalProperties": true
},
"createdAt": {
"type": "string"
},
"updatedAt": {
"type": "string"
},
"apiKeyCount": {
"type": "integer",
"description": "Number of API keys for this account (only present when includeKeyCounts=true)",
"nullable": true
}
}
}
{
"message": "string"
}
Schema of the response body
{
"type": "object",
"properties": {
"message": {
"type": "string"
}
}
}
PATCH /auth/accounts/{id}
Input parameters
| Parameter | In | Type | Default | Nullable | Description |
|---|---|---|---|---|---|
id |
path | string | No |
Request body
{
"uid": "string",
"notes": "string",
"props": {},
"status": "string"
}
Schema of the request body
{
"type": "object",
"properties": {
"uid": {
"type": "string"
},
"notes": {
"type": "string"
},
"props": {
"type": "object",
"properties": {},
"required": [],
"additionalProperties": true
},
"status": {
"type": "string"
}
}
}
Responses
{
"id": "string",
"uid": "string",
"notes": "string",
"status": "string",
"props": {},
"createdAt": "string",
"updatedAt": "string",
"apiKeyCount": 0
}
Schema of the response body
{
"type": "object",
"properties": {
"id": {
"type": "string"
},
"uid": {
"type": "string",
"description": "The Account UID"
},
"notes": {
"type": "string"
},
"status": {
"type": "string",
"description": "Account status: 'active' or 'deactivated'"
},
"props": {
"type": "object",
"properties": {},
"required": [],
"additionalProperties": true
},
"createdAt": {
"type": "string"
},
"updatedAt": {
"type": "string"
},
"apiKeyCount": {
"type": "integer",
"description": "Number of API keys for this account (only present when includeKeyCounts=true)",
"nullable": true
}
}
}
{
"message": "string"
}
Schema of the response body
{
"type": "object",
"properties": {
"message": {
"type": "string"
}
}
}
{
"message": "string"
}
Schema of the response body
{
"type": "object",
"properties": {
"message": {
"type": "string"
}
}
}
DELETE /auth/accounts/{id}
Input parameters
| Parameter | In | Type | Default | Nullable | Description |
|---|---|---|---|---|---|
id |
path | string | No | ||
uid |
query | string | No | If set to "true", treat id as the uid |
Responses
{
"id": "string",
"uid": "string",
"notes": "string",
"status": "string",
"props": {},
"createdAt": "string",
"updatedAt": "string",
"apiKeyCount": 0
}
Schema of the response body
{
"type": "object",
"properties": {
"id": {
"type": "string"
},
"uid": {
"type": "string",
"description": "The Account UID"
},
"notes": {
"type": "string"
},
"status": {
"type": "string",
"description": "Account status: 'active' or 'deactivated'"
},
"props": {
"type": "object",
"properties": {},
"required": [],
"additionalProperties": true
},
"createdAt": {
"type": "string"
},
"updatedAt": {
"type": "string"
},
"apiKeyCount": {
"type": "integer",
"description": "Number of API keys for this account (only present when includeKeyCounts=true)",
"nullable": true
}
}
}
{
"message": "string"
}
Schema of the response body
{
"type": "object",
"properties": {
"message": {
"type": "string"
}
}
}
GET /auth/accounts/{accountId}/apikeys
Input parameters
| Parameter | In | Type | Default | Nullable | Description |
|---|---|---|---|---|---|
accountId |
path | string | No | ||
cursor |
query | string | No | Cursor for next page | |
limit |
query | integer | No | Page size (max 10000, default 100) | |
uid |
query | string | No | If set to "true", treat id as the uid |
Responses
{
"data": [
{
"keyid": "string",
"active": true,
"accountId": "string",
"references": {
"accountId": "string"
},
"flags": [
"string"
],
"maxUses": 0,
"countedActions": [
"string"
],
"autoDisableOnLimit": true,
"currentUses": 0,
"validFrom": "string",
"validUntil": "string",
"props": {},
"createdAt": "string",
"updatedAt": "string"
}
],
"pagination": {
"limit": 0,
"count": 0,
"hasMore": true,
"nextCursor": "string"
}
}
Schema of the response body
{
"type": "object",
"properties": {
"data": {
"type": "array",
"items": {
"$ref": "#/components/schemas/auth.safeapikey"
}
},
"pagination": {
"type": "object",
"properties": {
"limit": {
"type": "integer"
},
"count": {
"type": "integer"
},
"hasMore": {
"type": "boolean"
},
"nextCursor": {
"type": "string"
}
},
"required": [
"limit",
"count",
"hasMore"
]
}
}
}
GET /dashboard/accounts
List accounts
Description
Returns a list of all accounts
Input parameters
| Parameter | In | Type | Default | Nullable | Description |
|---|---|---|---|---|---|
cursor |
query | string | No | Pagination cursor | |
includeDeactivated |
query | boolean | No | When true, deactivated accounts are included | |
limit |
query | integer | No | Page size |
Responses
{
"data": [
{}
],
"pagination": {}
}
Schema of the response body
{
"type": "object",
"properties": {
"data": {
"type": "array",
"items": {
"type": "object",
"properties": {},
"additionalProperties": true
}
},
"pagination": {
"type": "object",
"properties": {},
"additionalProperties": true
}
},
"additionalProperties": true
}
POST /dashboard/accounts
Create account
Description
Creates a new account
Request body
{
"uid": "string",
"props": {}
}
Schema of the request body
{
"type": "object",
"properties": {
"uid": {
"type": "string"
},
"props": {
"type": "object",
"properties": {},
"additionalProperties": true
}
}
}
Responses
{
"id": "string",
"uid": "string"
}
Schema of the response body
{
"type": "object",
"properties": {
"id": {
"type": "string"
},
"uid": {
"type": "string"
}
}
}
GET /dashboard/accounts/{id}
Get account
Description
Returns an account by ID
Input parameters
| Parameter | In | Type | Default | Nullable | Description |
|---|---|---|---|---|---|
id |
path | string | No |
Responses
{
"id": "string",
"uid": "string",
"createdAt": "string",
"updatedAt": "string"
}
Schema of the response body
{
"type": "object",
"properties": {
"id": {
"type": "string"
},
"uid": {
"type": "string"
},
"createdAt": {
"type": "string"
},
"updatedAt": {
"type": "string"
}
},
"additionalProperties": true
}
PATCH /dashboard/accounts/{id}
Update account
Description
Updates an existing account
Input parameters
| Parameter | In | Type | Default | Nullable | Description |
|---|---|---|---|---|---|
id |
path | string | No |
Request body
{
"props": {}
}
Schema of the request body
{
"type": "object",
"properties": {
"props": {
"type": "object",
"properties": {},
"additionalProperties": true
}
}
}
Responses
{
"success": true
}
Schema of the response body
{
"type": "object",
"properties": {
"success": {
"type": "boolean"
}
}
}
DELETE /dashboard/accounts/{id}
Delete account
Description
Deletes an account
Input parameters
| Parameter | In | Type | Default | Nullable | Description |
|---|---|---|---|---|---|
id |
path | string | No |
Responses
{
"success": true
}
Schema of the response body
{
"type": "object",
"properties": {
"success": {
"type": "boolean"
}
}
}
POST /dashboard/search/accounts
Search accounts
Description
Search accounts by uid/notes text, keyring access, and more
Input parameters
| Parameter | In | Type | Default | Nullable | Description |
|---|---|---|---|---|---|
cursor |
query | string | No | Pagination cursor | |
limit |
query | integer | No | Page size |
Request body
{
"uid": "string",
"notes": "string",
"keyringName": "string",
"keyringId": "string",
"includeKeyCounts": true,
"includeDeactivated": true,
"sortBy": "string",
"sortOrder": "string"
}
Schema of the request body
{
"type": "object",
"properties": {
"uid": {
"type": "string",
"description": "Substring match against uid (case-insensitive)"
},
"notes": {
"type": "string",
"description": "Substring match against notes (case-insensitive)"
},
"keyringName": {
"type": "string",
"description": "Filter by keyring name"
},
"keyringId": {
"type": "string",
"description": "Filter by keyring ID"
},
"includeKeyCounts": {
"type": "boolean",
"description": "Include apiKeyCount in results"
},
"includeDeactivated": {
"type": "boolean",
"description": "When true, deactivated accounts are included"
},
"sortBy": {
"type": "string",
"description": "Column to sort by: uid, createdAt, or updatedAt (default: createdAt)"
},
"sortOrder": {
"type": "string",
"description": "Sort direction: asc or desc (default: asc)"
}
}
}
Responses
{
"data": [
{}
],
"pagination": {}
}
Schema of the response body
{
"type": "object",
"properties": {
"data": {
"type": "array",
"items": {
"type": "object",
"properties": {},
"additionalProperties": true
}
},
"pagination": {
"type": "object",
"properties": {},
"additionalProperties": true
}
},
"additionalProperties": true
}
GET /dashboard/accounts/{id}/apikeys
Get account API keys
Description
Returns all API keys for an account
Input parameters
| Parameter | In | Type | Default | Nullable | Description |
|---|---|---|---|---|---|
id |
path | string | No |
Responses
{
"data": [
{}
],
"pagination": {}
}
Schema of the response body
{
"type": "object",
"properties": {
"data": {
"type": "array",
"items": {
"type": "object",
"properties": {},
"additionalProperties": true
}
},
"pagination": {
"type": "object",
"properties": {},
"additionalProperties": true
}
},
"additionalProperties": true
}
API Keys
GET /auth/apikey
Input parameters
| Parameter | In | Type | Default | Nullable | Description |
|---|---|---|---|---|---|
cursor |
query | string | No | Cursor for next page | |
limit |
query | integer | No | Page size (max 10000, default 100) |
Responses
{
"data": [
{
"keyid": "string",
"active": true,
"accountId": "string",
"references": {
"accountId": "string"
},
"flags": [
"string"
],
"maxUses": 0,
"countedActions": [
"string"
],
"autoDisableOnLimit": true,
"currentUses": 0,
"validFrom": "string",
"validUntil": "string",
"props": {},
"createdAt": "string",
"updatedAt": "string"
}
],
"pagination": {
"limit": 0,
"count": 0,
"hasMore": true,
"nextCursor": "string"
}
}
Schema of the response body
{
"type": "object",
"properties": {
"data": {
"type": "array",
"items": {
"$ref": "#/components/schemas/auth.safeapikey"
}
},
"pagination": {
"type": "object",
"properties": {
"limit": {
"type": "integer"
},
"count": {
"type": "integer"
},
"hasMore": {
"type": "boolean"
},
"nextCursor": {
"type": "string"
}
},
"required": [
"limit",
"count",
"hasMore"
]
}
}
}
POST /auth/apikey
Input parameters
| Parameter | In | Type | Default | Nullable | Description |
|---|---|---|---|---|---|
uid |
query | string | No | If set to 'true', will treat the accountId field as the Account UID |
Request body
{
"accountId": "string",
"flags": [
"string"
],
"maxUses": 0,
"countedActions": [
"string"
],
"autoDisableOnLimit": true,
"validFrom": "string",
"validUntil": "string",
"props": {}
}
Schema of the request body
{
"type": "object",
"properties": {
"accountId": {
"type": "string"
},
"flags": {
"type": "array",
"items": {
"type": "string"
},
"description": "The entitlements granted to this API Key, as a list of names (e.g. `[\"keyring.finance.decrypt\"]`)."
},
"maxUses": {
"type": "integer",
"nullable": true,
"description": "The max number of uses; null for no limit"
},
"countedActions": {
"type": "array",
"items": {
"type": "string"
},
"nullable": true,
"description": "A string array of activity that count toward maxUses. Any other activities not listed here will not count toward the maxCount."
},
"autoDisableOnLimit": {
"type": "boolean",
"description": "If set, will disable the API Key when the limits are hit"
},
"validFrom": {
"type": "string",
"nullable": true,
"description": "ISO-8601 timestamp of the time when the API Key becomes valid; null for immediately"
},
"validUntil": {
"type": "string",
"nullable": true,
"description": "ISO-8601 timestamp that describes when the API Key will expire; null for never"
},
"props": {
"type": "object",
"properties": {},
"required": [],
"additionalProperties": true
}
},
"required": [
"accountId",
"flags"
]
}
Responses
{
"key": "string",
"keyid": "string",
"active": true,
"accountId": "string",
"references": {
"accountId": "string"
},
"flags": [
"string"
],
"maxUses": 0,
"countedActions": [
"string"
],
"autoDisableOnLimit": true,
"currentUses": 0,
"validFrom": "string",
"validUntil": "string",
"props": {},
"createdAt": "string",
"updatedAt": "string"
}
Schema of the response body
{
"type": "object",
"properties": {
"key": {
"type": "string"
},
"keyid": {
"type": "string"
},
"active": {
"type": "boolean"
},
"accountId": {
"type": "string"
},
"references": {
"$ref": "#/components/schemas/auth.apikeyref"
},
"flags": {
"type": "array",
"items": {
"type": "string"
},
"description": "The entitlements this API Key holds, as a list of granted names — ADR 021. Presence is the grant."
},
"maxUses": {
"type": "integer",
"nullable": true
},
"countedActions": {
"type": "array",
"items": {
"type": "string"
},
"nullable": true
},
"autoDisableOnLimit": {
"type": "boolean"
},
"currentUses": {
"type": "integer"
},
"validFrom": {
"type": "string",
"nullable": true
},
"validUntil": {
"type": "string",
"nullable": true
},
"props": {
"type": "object",
"properties": {},
"required": [],
"additionalProperties": true
},
"createdAt": {
"type": "string"
},
"updatedAt": {
"type": "string"
}
}
}
{
"message": "string"
}
Schema of the response body
{
"type": "object",
"properties": {
"message": {
"type": "string"
}
}
}
PUT /auth/apikey
Input parameters
| Parameter | In | Type | Default | Nullable | Description |
|---|---|---|---|---|---|
id |
query | string | No | If true, treat the apikey body property as an apikeyid |
Request body
{
"op": "delete",
"apikey": "string",
"active": true,
"accountId": "string",
"maxUses": 0,
"countedActions": [
"string"
],
"autoDisableOnLimit": true,
"validFrom": "string",
"validUntil": "string",
"flags": [
"string"
],
"props": {}
}
Schema of the request body
{
"type": "object",
"properties": {
"op": {
"type": "string",
"enum": [
"delete",
"merge",
"replace"
]
},
"apikey": {
"type": "string",
"description": "The API Key value (or apikeyid if querystring id=true)"
},
"active": {
"type": "boolean"
},
"accountId": {
"type": "string"
},
"maxUses": {
"type": "integer",
"nullable": true,
"description": "The max number of uses; null clears it"
},
"countedActions": {
"type": "array",
"items": {
"type": "string"
},
"nullable": true,
"description": "A string array of activity that count toward maxUses. Any other activities not listed here will not count toward the maxCount."
},
"autoDisableOnLimit": {
"type": "boolean",
"nullable": true,
"description": "If set, will disable the API Key when the limits are hit; null restores the default"
},
"validFrom": {
"type": "string",
"nullable": true,
"description": "ISO-8601 timestamp of the time when the API Key becomes valid; null for immediately"
},
"validUntil": {
"type": "string",
"nullable": true,
"description": "ISO-8601 timestamp that describes when the API Key will expire; null for never"
},
"flags": {
"type": "array",
"items": {
"type": "string"
},
"description": "Entitlement names. For `merge` these are added, for `replace` they become the whole set, for `delete` they are removed."
},
"props": {
"type": "object",
"properties": {},
"required": [],
"additionalProperties": true
}
},
"required": [
"op",
"apikey"
]
}
Responses
{
"key": "string",
"keyid": "string",
"op": null,
"active": true,
"accountId": "string",
"references": {
"accountId": "string"
},
"maxUses": 0,
"countedActions": [
"string"
],
"autoDisableOnLimit": true,
"validFrom": "string",
"validUntil": "string",
"flags": [
"string"
],
"props": {}
}
Schema of the response body
{
"type": "object",
"properties": {
"key": {
"type": "string",
"description": "If the key is provided, it will be returned"
},
"keyid": {
"type": "string"
},
"op": {
"enum": [
"delete",
"merge",
"replace"
],
"description": "The operationt o perform"
},
"active": {
"type": "boolean"
},
"accountId": {
"type": "string",
"description": "The Account associated with this API Key"
},
"references": {
"type": "object",
"properties": {
"accountId": {
"type": "string"
}
}
},
"maxUses": {
"type": "integer",
"nullable": true,
"description": "The max number of uses"
},
"countedActions": {
"type": "array",
"items": {
"type": "string"
},
"nullable": true,
"description": "A string array of activity that count toward maxUses"
},
"autoDisableOnLimit": {
"type": "boolean",
"description": "If set, will disable the API Key when the limits are hit"
},
"validFrom": {
"type": "string",
"nullable": true,
"description": "ISO-8601 timestamp of the time when the API Key becomes valid"
},
"validUntil": {
"type": "string",
"nullable": true,
"description": "ISO-8601 timestamp that describes when the API Key will expire"
},
"flags": {
"type": "array",
"items": {
"type": "string"
},
"description": "The entitlements this API Key holds, as a list of names"
},
"props": {
"type": "object",
"properties": {},
"required": [],
"additionalProperties": true
}
}
}
{
"message": "string"
}
Schema of the response body
{
"type": "object",
"properties": {
"message": {
"type": "string"
}
}
}
GET /auth/apikey/{apikeyid}
Input parameters
| Parameter | In | Type | Default | Nullable | Description |
|---|---|---|---|---|---|
apikeyid |
path | string | No | The API Key ID |
Responses
{
"keyid": "string",
"active": true,
"accountId": "string",
"references": {
"accountId": "string"
},
"flags": [
"string"
],
"maxUses": 0,
"countedActions": [
"string"
],
"autoDisableOnLimit": true,
"currentUses": 0,
"validFrom": "string",
"validUntil": "string",
"props": {},
"createdAt": "string",
"updatedAt": "string"
}
Schema of the response body
{
"type": "object",
"properties": {
"keyid": {
"type": "string"
},
"active": {
"type": "boolean"
},
"accountId": {
"type": "string"
},
"references": {
"$ref": "#/components/schemas/auth.apikeyref"
},
"flags": {
"type": "array",
"items": {
"type": "string"
},
"description": "The entitlements this API Key holds, as a list of granted names — ADR 021. Presence is the grant."
},
"maxUses": {
"type": "integer",
"nullable": true
},
"countedActions": {
"type": "array",
"items": {
"type": "string"
},
"nullable": true
},
"autoDisableOnLimit": {
"type": "boolean"
},
"currentUses": {
"type": "integer"
},
"validFrom": {
"type": "string",
"nullable": true
},
"validUntil": {
"type": "string",
"nullable": true
},
"props": {
"type": "object",
"properties": {},
"required": [],
"additionalProperties": true
},
"createdAt": {
"type": "string"
},
"updatedAt": {
"type": "string"
}
}
}
{
"message": "string"
}
Schema of the response body
{
"type": "object",
"properties": {
"message": {
"type": "string"
}
}
}
DELETE /auth/apikey/{apikey}
Input parameters
| Parameter | In | Type | Default | Nullable | Description |
|---|---|---|---|---|---|
apikey |
path | string | No | The API Key | |
id |
query | string | No | 'true' = treats apikey as an API Key ID, otherwise use the API Key |
Responses
{
"apikey": "string",
"id": true
}
Schema of the response body
{
"type": "object",
"properties": {
"apikey": {
"type": "string",
"description": "The deleted API Key"
},
"id": {
"type": "boolean",
"description": "If true, the apikey is the API Key ID"
}
},
"required": [
"apikey",
"id"
]
}
GET /auth/apikey/{apikeyid}/props
Input parameters
| Parameter | In | Type | Default | Nullable | Description |
|---|---|---|---|---|---|
apikeyid |
path | string | No | The API Key ID |
Responses
{
"keyid": "string",
"active": true,
"accountId": "string",
"references": {
"accountId": "string"
},
"flags": [
"string"
],
"maxUses": 0,
"countedActions": [
"string"
],
"autoDisableOnLimit": true,
"currentUses": 0,
"validFrom": "string",
"validUntil": "string",
"props": {},
"createdAt": "string",
"updatedAt": "string"
}
Schema of the response body
{
"type": "object",
"properties": {
"keyid": {
"type": "string"
},
"active": {
"type": "boolean"
},
"accountId": {
"type": "string"
},
"references": {
"$ref": "#/components/schemas/auth.apikeyref"
},
"flags": {
"type": "array",
"items": {
"type": "string"
},
"description": "The entitlements this API Key holds, as a list of granted names — ADR 021. Presence is the grant."
},
"maxUses": {
"type": "integer",
"nullable": true
},
"countedActions": {
"type": "array",
"items": {
"type": "string"
},
"nullable": true
},
"autoDisableOnLimit": {
"type": "boolean"
},
"currentUses": {
"type": "integer"
},
"validFrom": {
"type": "string",
"nullable": true
},
"validUntil": {
"type": "string",
"nullable": true
},
"props": {
"type": "object",
"properties": {},
"required": [],
"additionalProperties": true
},
"createdAt": {
"type": "string"
},
"updatedAt": {
"type": "string"
}
}
}
{
"message": "string"
}
Schema of the response body
{
"type": "object",
"properties": {
"message": {
"type": "string"
}
}
}
GET /dashboard/apikey
List API keys
Description
Returns a list of all API keys
Responses
{
"apikeys": [
{}
]
}
Schema of the response body
{
"type": "object",
"properties": {
"apikeys": {
"type": "array",
"items": {
"type": "object",
"properties": {},
"additionalProperties": true
}
}
},
"additionalProperties": true
}
POST /dashboard/apikey
Create API key
Description
Creates a new API key
Request body
{
"name": "string",
"accountId": "string",
"flags": [
"string"
],
"maxUses": 0,
"countedActions": [
"string"
],
"autoDisableOnLimit": true,
"validFrom": "string",
"validUntil": "string"
}
Schema of the request body
{
"type": "object",
"properties": {
"name": {
"type": "string"
},
"accountId": {
"type": "string"
},
"flags": {
"type": "array",
"items": {
"type": "string"
},
"description": "Entitlement names — ADR 021: presence is the grant"
},
"maxUses": {
"type": "integer",
"nullable": true,
"description": "The max number of uses"
},
"countedActions": {
"type": "array",
"items": {
"type": "string"
},
"nullable": true,
"description": "A string array of activity that count toward maxUses"
},
"autoDisableOnLimit": {
"type": "boolean",
"description": "If set, will disable the API Key when the limits are hit"
},
"validFrom": {
"type": "string",
"nullable": true,
"description": "ISO-8601 timestamp of the time when the API Key becomes valid"
},
"validUntil": {
"type": "string",
"nullable": true,
"description": "ISO-8601 timestamp that describes when the API Key will expire"
}
}
}
Responses
{
"key": "string",
"keyid": "string"
}
Schema of the response body
{
"type": "object",
"properties": {
"key": {
"type": "string"
},
"keyid": {
"type": "string"
}
},
"additionalProperties": true
}
PUT /dashboard/apikey
Update API key
Description
Updates an existing API key. Use querystring id=true to update by apikeyid instead of key value
Input parameters
| Parameter | In | Type | Default | Nullable | Description |
|---|---|---|---|---|---|
id |
query | string | No | If true, treat the apikey body property as an apikeyid |
Request body
{
"op": "delete",
"apikey": "string",
"flags": [
"string"
],
"active": true,
"maxUses": 0,
"countedActions": [
"string"
],
"autoDisableOnLimit": true,
"validFrom": "string",
"validUntil": "string"
}
Schema of the request body
{
"type": "object",
"properties": {
"op": {
"type": "string",
"enum": [
"delete",
"merge",
"replace"
],
"description": "The operation to perform"
},
"apikey": {
"type": "string",
"description": "The API Key value (or apikeyid if querystring id=true)"
},
"flags": {
"type": "array",
"items": {
"type": "string"
},
"description": "Entitlement names — ADR 021: presence is the grant"
},
"active": {
"type": "boolean"
},
"maxUses": {
"type": "integer",
"nullable": true,
"description": "The max number of uses; null clears it"
},
"countedActions": {
"type": "array",
"items": {
"type": "string"
},
"nullable": true,
"description": "A string array of activity that count toward maxUses"
},
"autoDisableOnLimit": {
"type": "boolean",
"nullable": true,
"description": "If set, will disable the API Key when the limits are hit; null restores the default"
},
"validFrom": {
"type": "string",
"nullable": true,
"description": "ISO-8601 timestamp of the time when the API Key becomes valid; null for immediately"
},
"validUntil": {
"type": "string",
"nullable": true,
"description": "ISO-8601 timestamp that describes when the API Key will expire; null for never"
}
}
}
Responses
{
"keyid": "string",
"op": null,
"active": true,
"maxUses": 0,
"currentUses": 0,
"countedActions": [
"string"
],
"autoDisableOnLimit": true,
"validFrom": "string",
"validUntil": "string",
"flags": [
"string"
],
"props": {}
}
Schema of the response body
{
"type": "object",
"properties": {
"keyid": {
"type": "string"
},
"op": {
"enum": [
"delete",
"merge",
"replace"
],
"description": "The operation performed"
},
"active": {
"type": "boolean"
},
"maxUses": {
"type": "integer",
"nullable": true,
"description": "The max number of uses"
},
"currentUses": {
"type": "integer",
"description": "The current number of uses"
},
"countedActions": {
"type": "array",
"items": {
"type": "string"
},
"nullable": true,
"description": "Activities that count toward maxUses"
},
"autoDisableOnLimit": {
"type": "boolean",
"description": "If set, will disable the API Key when the limits are hit"
},
"validFrom": {
"type": "string",
"nullable": true,
"description": "ISO-8601 timestamp when the API Key becomes valid"
},
"validUntil": {
"type": "string",
"nullable": true,
"description": "ISO-8601 timestamp when the API Key will expire"
},
"flags": {
"type": "array",
"items": {
"type": "string"
},
"description": "Entitlement names — ADR 021: presence is the grant"
},
"props": {
"type": "object",
"properties": {},
"additionalProperties": true
}
},
"additionalProperties": true
}
GET /dashboard/apikey/{id}
Get API key
Description
Returns an API key by ID
Input parameters
| Parameter | In | Type | Default | Nullable | Description |
|---|---|---|---|---|---|
id |
path | string | No |
Responses
{
"keyid": "string",
"active": true,
"maxUses": 0,
"currentUses": 0,
"countedActions": [
"string"
],
"autoDisableOnLimit": true,
"validFrom": "string",
"validUntil": "string",
"accountId": "string",
"references": {},
"flags": [
"string"
],
"props": {}
}
Schema of the response body
{
"type": "object",
"properties": {
"keyid": {
"type": "string"
},
"active": {
"type": "boolean"
},
"maxUses": {
"type": "integer",
"nullable": true,
"description": "The max number of uses"
},
"currentUses": {
"type": "integer",
"description": "The current number of uses"
},
"countedActions": {
"type": "array",
"items": {
"type": "string"
},
"nullable": true,
"description": "Activities that count toward maxUses"
},
"autoDisableOnLimit": {
"type": "boolean",
"description": "If set, will disable the API Key when the limits are hit"
},
"validFrom": {
"type": "string",
"nullable": true,
"description": "ISO-8601 timestamp when the API Key becomes valid"
},
"validUntil": {
"type": "string",
"nullable": true,
"description": "ISO-8601 timestamp when the API Key will expire"
},
"accountId": {
"type": "string"
},
"references": {
"type": "object",
"properties": {},
"additionalProperties": true
},
"flags": {
"type": "array",
"items": {
"type": "string"
},
"description": "Entitlement names — ADR 021: presence is the grant"
},
"props": {
"type": "object",
"properties": {},
"additionalProperties": true
}
},
"additionalProperties": true
}
DELETE /dashboard/apikey/{id}
Delete API key
Description
Deletes an API key
Input parameters
| Parameter | In | Type | Default | Nullable | Description |
|---|---|---|---|---|---|
id |
path | string | No |
Responses
{
"apikey": "string",
"id": true
}
Schema of the response body
{
"type": "object",
"properties": {
"apikey": {
"type": "string",
"description": "The apikeyid that was deleted"
},
"id": {
"type": "boolean",
"description": "Whether the identifier was read as an apikeyid — always true here"
}
},
"additionalProperties": true
}
POST /dashboard/search/keyring/{keyringname}/apikey
Search keyring API keys
Description
Finds API keys with access to a keyring
Input parameters
| Parameter | In | Type | Default | Nullable | Description |
|---|---|---|---|---|---|
cursor |
query | string | No | Cursor for pagination | |
id |
query | string | No | If set to 'true', will treat the keyringname as a KeyRing ID | |
keyringname |
path | string | No | ||
limit |
query | integer | No | Maximum number of API keys to return (default: 100, max: 10000) |
Request body
{
"accountId": "string",
"active": true
}
Schema of the request body
{
"type": "object",
"properties": {
"accountId": {
"type": "string",
"description": "Filter by Account ID"
},
"active": {
"type": "boolean",
"description": "Filter by active status (true/false)"
}
}
}
Responses
{
"data": [
{}
],
"pagination": {}
}
Schema of the response body
{
"type": "object",
"properties": {
"data": {
"type": "array",
"items": {
"type": "object",
"properties": {},
"additionalProperties": true
}
},
"pagination": {
"type": "object",
"properties": {},
"additionalProperties": true
}
},
"additionalProperties": true
}
SSO
GET /auth/sso/providers/reserve-id
Responses
{
"id": "string",
"callbackUrl": "string",
"metadataUrl": "string"
}
Schema of the response body
{
"type": "object",
"properties": {
"id": {
"type": "string"
},
"callbackUrl": {
"type": "string"
},
"metadataUrl": {
"type": "string"
}
}
}
POST /auth/sso/providers
Request body
{
"id": "string",
"name": "string",
"protocol": "oidc",
"idpType": "entra",
"enabled": true,
"config": {},
"spPrivateKey": "string",
"spCertificate": "string"
}
Schema of the request body
{
"type": "object",
"properties": {
"id": {
"type": "string"
},
"name": {
"type": "string"
},
"protocol": {
"type": "string",
"enum": [
"oidc",
"saml"
]
},
"idpType": {
"type": "string",
"enum": [
"entra",
"okta",
"google",
"aws-cognito",
"custom"
]
},
"enabled": {
"type": "boolean"
},
"config": {
"type": "object",
"properties": {},
"required": [],
"additionalProperties": true
},
"spPrivateKey": {
"type": "string"
},
"spCertificate": {
"type": "string"
}
},
"required": [
"name",
"protocol",
"idpType",
"config"
]
}
Responses
{
"id": "string",
"name": "string",
"protocol": "string",
"idpType": "string",
"enabled": true,
"config": {},
"spCertificate": "string",
"createdAt": "string",
"updatedAt": "string"
}
Schema of the response body
{
"type": "object",
"properties": {
"id": {
"type": "string"
},
"name": {
"type": "string"
},
"protocol": {
"type": "string"
},
"idpType": {
"type": "string"
},
"enabled": {
"type": "boolean"
},
"config": {
"type": "object",
"properties": {},
"required": [],
"additionalProperties": true
},
"spCertificate": {
"type": "string"
},
"createdAt": {
"type": "string"
},
"updatedAt": {
"type": "string"
}
}
}
GET /auth/sso/providers
Responses
{
"data": [
{
"id": "string",
"name": "string",
"protocol": "string",
"idpType": "string",
"enabled": true,
"config": {},
"spCertificate": "string",
"createdAt": "string",
"updatedAt": "string"
}
]
}
Schema of the response body
{
"type": "object",
"properties": {
"data": {
"type": "array",
"items": {
"type": "object",
"properties": {
"id": {
"type": "string"
},
"name": {
"type": "string"
},
"protocol": {
"type": "string"
},
"idpType": {
"type": "string"
},
"enabled": {
"type": "boolean"
},
"config": {
"type": "object",
"properties": {},
"required": [],
"additionalProperties": true
},
"spCertificate": {
"type": "string"
},
"createdAt": {
"type": "string"
},
"updatedAt": {
"type": "string"
}
},
"additionalProperties": true
}
}
}
}
GET /auth/sso/providers/enabled
Responses
{
"data": [
{
"id": "string",
"name": "string",
"protocol": "string",
"idpType": "string",
"config": {},
"spCertificate": "string",
"createdAt": "string",
"updatedAt": "string"
}
]
}
Schema of the response body
{
"type": "object",
"properties": {
"data": {
"type": "array",
"items": {
"type": "object",
"properties": {
"id": {
"type": "string"
},
"name": {
"type": "string"
},
"protocol": {
"type": "string"
},
"idpType": {
"type": "string"
},
"config": {
"type": "object",
"properties": {},
"required": [],
"additionalProperties": true
},
"spCertificate": {
"type": "string"
},
"createdAt": {
"type": "string"
},
"updatedAt": {
"type": "string"
}
},
"additionalProperties": true
}
}
}
}
GET /auth/sso/providers/{id}
Input parameters
| Parameter | In | Type | Default | Nullable | Description |
|---|---|---|---|---|---|
id |
path | string | No |
Responses
{
"id": "string",
"name": "string",
"protocol": "string",
"idpType": "string",
"enabled": true,
"config": {},
"spCertificate": "string",
"createdAt": "string",
"updatedAt": "string"
}
Schema of the response body
{
"type": "object",
"properties": {
"id": {
"type": "string"
},
"name": {
"type": "string"
},
"protocol": {
"type": "string"
},
"idpType": {
"type": "string"
},
"enabled": {
"type": "boolean"
},
"config": {
"type": "object",
"properties": {},
"required": [],
"additionalProperties": true
},
"spCertificate": {
"type": "string"
},
"createdAt": {
"type": "string"
},
"updatedAt": {
"type": "string"
}
}
}
{
"message": "string"
}
Schema of the response body
{
"type": "object",
"properties": {
"message": {
"type": "string"
}
}
}
PATCH /auth/sso/providers/{id}
Input parameters
| Parameter | In | Type | Default | Nullable | Description |
|---|---|---|---|---|---|
id |
path | string | No |
Request body
{
"name": "string",
"enabled": true,
"config": {},
"spPrivateKey": "string",
"spCertificate": "string"
}
Schema of the request body
{
"type": "object",
"properties": {
"name": {
"type": "string"
},
"enabled": {
"type": "boolean"
},
"config": {
"type": "object",
"properties": {},
"required": [],
"additionalProperties": true
},
"spPrivateKey": {
"type": "string"
},
"spCertificate": {
"type": "string"
}
}
}
Responses
{
"id": "string",
"name": "string",
"protocol": "string",
"idpType": "string",
"enabled": true,
"config": {},
"spCertificate": "string",
"createdAt": "string",
"updatedAt": "string"
}
Schema of the response body
{
"type": "object",
"properties": {
"id": {
"type": "string"
},
"name": {
"type": "string"
},
"protocol": {
"type": "string"
},
"idpType": {
"type": "string"
},
"enabled": {
"type": "boolean"
},
"config": {
"type": "object",
"properties": {},
"required": [],
"additionalProperties": true
},
"spCertificate": {
"type": "string"
},
"createdAt": {
"type": "string"
},
"updatedAt": {
"type": "string"
}
}
}
{
"message": "string"
}
Schema of the response body
{
"type": "object",
"properties": {
"message": {
"type": "string"
}
}
}
DELETE /auth/sso/providers/{id}
Input parameters
| Parameter | In | Type | Default | Nullable | Description |
|---|---|---|---|---|---|
id |
path | string | No |
Responses
Schema of the response body
{
"type": "object",
"properties": {}
}
{
"message": "string"
}
Schema of the response body
{
"type": "object",
"properties": {
"message": {
"type": "string"
}
}
}
POST /auth/sso/providers/parse-metadata
Request body
{
"xml": "string"
}
Schema of the request body
{
"type": "object",
"properties": {
"xml": {
"type": "string"
}
},
"required": [
"xml"
]
}
Responses
{
"config": {
"entityId": "string",
"idpSsoUrl": "string",
"idpCertificate": "string"
},
"prefilled": {
"idpSsoUrl": "string",
"idpCertificate": "string",
"spEntityId": "string"
}
}
Schema of the response body
{
"type": "object",
"properties": {
"config": {
"type": "object",
"properties": {
"entityId": {
"type": "string",
"nullable": true
},
"idpSsoUrl": {
"type": "string",
"nullable": true
},
"idpCertificate": {
"type": "string",
"nullable": true
}
},
"additionalProperties": true
},
"prefilled": {
"type": "object",
"properties": {
"idpSsoUrl": {
"type": "string",
"nullable": true
},
"idpCertificate": {
"type": "string",
"nullable": true
},
"spEntityId": {
"type": "string",
"nullable": true
}
},
"additionalProperties": true
}
}
}
{
"message": "string"
}
Schema of the response body
{
"type": "object",
"properties": {
"message": {
"type": "string"
}
}
}
GET /dashboard/sso/providers/reserve-id
Reserve SSO provider ID
Description
Returns a pre-generated provider ID and derived callback/metadata URLs
Responses
{
"id": "string",
"callbackUrl": "string",
"metadataUrl": "string"
}
Schema of the response body
{
"type": "object",
"properties": {
"id": {
"type": "string"
},
"callbackUrl": {
"type": "string"
},
"metadataUrl": {
"type": "string"
}
}
}
GET /dashboard/sso/providers/enabled
List enabled SSO providers
Description
Returns all enabled SSO providers — used by the login page
Responses
{
"data": [
{}
]
}
Schema of the response body
{
"type": "object",
"properties": {
"data": {
"type": "array",
"items": {
"type": "object",
"properties": {},
"additionalProperties": true
}
}
}
}
GET /dashboard/sso/providers
List SSO providers
Description
Returns all configured SSO providers
Responses
{
"data": [
{}
]
}
Schema of the response body
{
"type": "object",
"properties": {
"data": {
"type": "array",
"items": {
"type": "object",
"properties": {},
"additionalProperties": true
}
}
}
}
POST /dashboard/sso/providers
Create SSO provider
Description
Creates a new SSO provider configuration
Request body
{
"name": "string",
"protocol": "oidc",
"idpType": "entra",
"enabled": true,
"config": {},
"spPrivateKey": "string",
"spCertificate": "string"
}
Schema of the request body
{
"type": "object",
"properties": {
"name": {
"type": "string"
},
"protocol": {
"type": "string",
"enum": [
"oidc",
"saml"
]
},
"idpType": {
"type": "string",
"enum": [
"entra",
"okta",
"google",
"aws-cognito",
"custom"
]
},
"enabled": {
"type": "boolean"
},
"config": {
"type": "object",
"properties": {},
"additionalProperties": true
},
"spPrivateKey": {
"type": "string"
},
"spCertificate": {
"type": "string"
}
}
}
Responses
{
"id": "string"
}
Schema of the response body
{
"type": "object",
"properties": {
"id": {
"type": "string"
}
},
"additionalProperties": true
}
GET /dashboard/sso/providers/{id}
Get SSO provider
Description
Returns a single SSO provider by ID
Input parameters
| Parameter | In | Type | Default | Nullable | Description |
|---|---|---|---|---|---|
id |
path | string | No |
Responses
{
"id": "string"
}
Schema of the response body
{
"type": "object",
"properties": {
"id": {
"type": "string"
}
},
"additionalProperties": true
}
{
"message": "string"
}
Schema of the response body
{
"type": "object",
"properties": {
"message": {
"type": "string"
}
}
}
PATCH /dashboard/sso/providers/{id}
Update SSO provider
Description
Updates an existing SSO provider configuration
Input parameters
| Parameter | In | Type | Default | Nullable | Description |
|---|---|---|---|---|---|
id |
path | string | No |
Request body
{
"name": "string",
"enabled": true,
"config": {},
"spPrivateKey": "string",
"spCertificate": "string"
}
Schema of the request body
{
"type": "object",
"properties": {
"name": {
"type": "string"
},
"enabled": {
"type": "boolean"
},
"config": {
"type": "object",
"properties": {},
"additionalProperties": true
},
"spPrivateKey": {
"type": "string"
},
"spCertificate": {
"type": "string"
}
}
}
Responses
{
"id": "string"
}
Schema of the response body
{
"type": "object",
"properties": {
"id": {
"type": "string"
}
},
"additionalProperties": true
}
{
"message": "string"
}
Schema of the response body
{
"type": "object",
"properties": {
"message": {
"type": "string"
}
}
}
DELETE /dashboard/sso/providers/{id}
Delete SSO provider
Description
Deletes an SSO provider configuration
Input parameters
| Parameter | In | Type | Default | Nullable | Description |
|---|---|---|---|---|---|
id |
path | string | No |
Responses
Schema of the response body
{
"type": "object",
"properties": {}
}
{
"message": "string"
}
Schema of the response body
{
"type": "object",
"properties": {
"message": {
"type": "string"
}
}
}
POST /dashboard/sso/providers/parse-metadata
Parse IdP SAML metadata
Description
Extracts config fields from a raw IdP SAML metadata XML document
Request body
{
"xml": "string"
}
Schema of the request body
{
"type": "object",
"properties": {
"xml": {
"type": "string"
}
}
}
Responses
{
"config": {},
"prefilled": {}
}
Schema of the response body
{
"type": "object",
"properties": {
"config": {
"type": "object",
"properties": {},
"additionalProperties": true
},
"prefilled": {
"type": "object",
"properties": {},
"additionalProperties": true
}
}
}
{
"message": "string"
}
Schema of the response body
{
"type": "object",
"properties": {
"message": {
"type": "string"
}
}
}
Search
POST /auth/search/keyring/{keyringname}/apikey
Input parameters
| Parameter | In | Type | Default | Nullable | Description |
|---|---|---|---|---|---|
cursor |
query | string | No | Cursor for pagination | |
id |
query | string | No | If set to 'true', will treat the keyringname as a KeyRing ID | |
keyringname |
path | string | No | The KeyRing name | |
limit |
query | integer | No | Maximum number of API keys to return (default: 100, max: 10000) |
Request body
{
"accountId": "string",
"active": true
}
Schema of the request body
{
"type": "object",
"properties": {
"accountId": {
"type": "string",
"description": "Filter by Account ID"
},
"active": {
"type": "boolean",
"description": "Filter by active status (true/false)"
}
}
}
Responses
{
"data": [
{
"keyid": "string",
"active": true,
"accountId": "string",
"references": {
"accountId": "string"
},
"flags": [
"string"
],
"maxUses": 0,
"countedActions": [
"string"
],
"autoDisableOnLimit": true,
"currentUses": 0,
"validFrom": "string",
"validUntil": "string",
"props": {},
"createdAt": "string",
"updatedAt": "string"
}
],
"pagination": {
"limit": 10.12,
"count": 10.12,
"hasMore": true,
"nextCursor": "string"
}
}
Schema of the response body
{
"type": "object",
"properties": {
"data": {
"type": "array",
"items": {
"$ref": "#/components/schemas/auth.safeapikey"
}
},
"pagination": {
"type": "object",
"properties": {
"limit": {
"type": "number"
},
"count": {
"type": "number"
},
"hasMore": {
"type": "boolean"
},
"nextCursor": {
"type": "string"
}
},
"required": [
"limit",
"count",
"hasMore"
],
"additionalProperties": true
}
}
}
POST /auth/search/activity
Input parameters
| Parameter | In | Type | Default | Nullable | Description |
|---|---|---|---|---|---|
cursor |
query | string | No | Cursor for next page (from previous response) | |
limit |
query | integer | No | Page size (max 10000, default 100) |
Request body
{
"accountUid": "string",
"accountId": "string",
"action": "string",
"ring": "string",
"start": 0,
"end": 0,
"keyid": "string",
"valid": true,
"props": {}
}
Schema of the request body
{
"type": "object",
"properties": {
"accountUid": {
"type": "string",
"description": "The Account UID"
},
"accountId": {
"type": "string",
"description": "The Account ID"
},
"action": {
"type": "string",
"description": "The Activity Action"
},
"ring": {
"type": "string",
"description": "The Key Ring name"
},
"start": {
"type": "integer",
"description": "Start timestamp (epoch UTC)"
},
"end": {
"type": "integer",
"description": "End timestamp (epoch UTC)"
},
"keyid": {
"type": "string"
},
"valid": {
"type": "boolean",
"description": "Whether or not the Activity was granted or denied"
},
"props": {
"type": "object",
"properties": {},
"description": "Search for activities based on any props that are set"
}
}
}
Responses
{
"data": [
{
"id": "string",
"keyid": "string",
"createdAt": 0,
"props": {}
}
],
"pagination": {
"limit": 0,
"count": 0,
"hasMore": true,
"nextCursor": "string"
}
}
Schema of the response body
{
"type": "object",
"properties": {
"data": {
"type": "array",
"items": {
"$ref": "#/components/schemas/auth.activity"
}
},
"pagination": {
"type": "object",
"properties": {
"limit": {
"type": "integer"
},
"count": {
"type": "integer"
},
"hasMore": {
"type": "boolean"
},
"nextCursor": {
"type": "string"
}
},
"required": [
"limit",
"count",
"hasMore"
]
}
}
}
POST /auth/search/accounts
Input parameters
| Parameter | In | Type | Default | Nullable | Description |
|---|---|---|---|---|---|
cursor |
query | string | No | Cursor for next page | |
limit |
query | integer | No | Page size (max 10000, default 100) |
Request body
{
"uid": "string",
"notes": "string",
"keyringName": "string",
"keyringId": "string",
"includeKeyCounts": true,
"includeDeactivated": true,
"status": "string",
"sortBy": "string",
"sortOrder": "string"
}
Schema of the request body
{
"type": "object",
"properties": {
"uid": {
"type": "string",
"description": "Substring match against uid (case-insensitive)"
},
"notes": {
"type": "string",
"description": "Substring match against notes (case-insensitive)"
},
"keyringName": {
"type": "string",
"description": "Filter to accounts with API keys that have access to this keyring (by name)"
},
"keyringId": {
"type": "string",
"description": "Filter to accounts with API keys that have access to this keyring (by ID)"
},
"includeKeyCounts": {
"type": "boolean",
"description": "Include apiKeyCount in each result"
},
"includeDeactivated": {
"type": "boolean",
"description": "When true, deactivated accounts are included in results"
},
"status": {
"type": "string",
"description": "Restrict results to accounts with this status (active|deactivated)"
},
"sortBy": {
"type": "string",
"description": "Column to sort by: uid, createdAt, or updatedAt (default: createdAt)"
},
"sortOrder": {
"type": "string",
"description": "Sort direction: asc or desc (default: asc)"
}
}
}
Responses
{
"data": [
{
"id": "string",
"uid": "string",
"notes": "string",
"status": "string",
"props": {},
"createdAt": "string",
"updatedAt": "string",
"apiKeyCount": 0
}
],
"pagination": {
"limit": 0,
"count": 0,
"hasMore": true,
"nextCursor": "string",
"totalCount": 0
}
}
Schema of the response body
{
"type": "object",
"properties": {
"data": {
"type": "array",
"items": {
"$ref": "#/components/schemas/auth.account"
}
},
"pagination": {
"type": "object",
"properties": {
"limit": {
"type": "integer"
},
"count": {
"type": "integer"
},
"hasMore": {
"type": "boolean"
},
"nextCursor": {
"type": "string"
},
"totalCount": {
"type": "integer"
}
},
"required": [
"limit",
"count",
"hasMore"
]
}
}
}
Activity
GET /auth/activity/{id}
Input parameters
| Parameter | In | Type | Default | Nullable | Description |
|---|---|---|---|---|---|
id |
path | string | No | The Activity ID |
Responses
{
"id": "string",
"keyid": "string",
"createdAt": 0,
"props": {}
}
Schema of the response body
{
"type": "object",
"properties": {
"id": {
"type": "string"
},
"keyid": {
"type": "string"
},
"createdAt": {
"type": "integer",
"description": "Epoch UTC time"
},
"props": {
"type": "object",
"properties": {},
"required": [],
"additionalProperties": true
}
}
}
POST /dashboard/search/activity
Search activity
Description
Searches activity logs
Request body
{
"filter": {},
"pagination": {}
}
Schema of the request body
{
"type": "object",
"properties": {
"filter": {
"type": "object",
"properties": {},
"additionalProperties": true
},
"pagination": {
"type": "object",
"properties": {},
"additionalProperties": true
}
}
}
Responses
{
"data": [
{}
],
"pagination": {}
}
Schema of the response body
{
"type": "object",
"properties": {
"data": {
"type": "array",
"items": {
"type": "object",
"properties": {},
"additionalProperties": true
}
},
"pagination": {
"type": "object",
"properties": {},
"additionalProperties": true
}
},
"additionalProperties": true
}
GET /dashboard/activity/{id}
Get activity
Description
Returns an activity by ID
Input parameters
| Parameter | In | Type | Default | Nullable | Description |
|---|---|---|---|---|---|
id |
path | string | No |
Responses
{
"id": "string",
"keyid": "string",
"createdAt": "string"
}
Schema of the response body
{
"type": "object",
"properties": {
"id": {
"type": "string"
},
"keyid": {
"type": "string"
},
"createdAt": {
"type": "string"
}
},
"additionalProperties": true
}
Asym Service
POST /asym/keyrings
Request body
{
"name": "string",
"algo": "aes256",
"props": {},
"keyProps": {},
"signing": {}
}
Schema of the request body
{
"type": "object",
"properties": {
"name": {
"type": "string"
},
"algo": {
"type": "string",
"enum": [
"aes256"
]
},
"props": {
"type": "object",
"properties": {},
"required": [],
"additionalProperties": true
},
"keyProps": {
"type": "object",
"properties": {},
"required": [],
"additionalProperties": true
},
"signing": {
"type": "object",
"properties": {},
"required": [],
"additionalProperties": true
}
},
"required": [
"name"
]
}
Responses
{
"ring": {
"id": "string",
"name": "string",
"displayName": "string",
"activeKey": "string",
"activeAlgorithm": null,
"publicKey": "string",
"createdAt": "string",
"updatedAt": "string"
},
"key": {
"type": null,
"id": "string",
"props": {},
"keyData": {
"key": "string"
}
},
"privateKey": "string"
}
Schema of the response body
{
"type": "object",
"properties": {
"ring": {
"$ref": "#/components/schemas/asym.keyring"
},
"key": {
"$ref": "#/components/schemas/asym.key"
},
"privateKey": {
"type": "string",
"description": "Base64 encoded Private Key that has been generated"
}
}
}
GET /asym/keyrings/{ringname}/keys/{keyId}
Input parameters
| Parameter | In | Type | Default | Nullable | Description |
|---|---|---|---|---|---|
id |
query | string | No | If set to 'true', the ringname will be treated as the KeyRing ID | |
keyId |
path | string | No | The Key ID | |
ringname |
path | string | No | The KeyRIng name |
Responses
{
"type": null,
"id": "string",
"props": {},
"keyData": {
"key": "string"
}
}
Schema of the response body
{
"type": "object",
"properties": {
"type": {
"enum": [
"AES256"
],
"description": "The Algorithm this Key is used for"
},
"id": {
"type": "string",
"description": "The Key ID"
},
"props": {
"type": "object",
"properties": {},
"required": [],
"additionalProperties": true,
"description": "Any custom properties on this Key"
},
"keyData": {
"$ref": "#/components/schemas/asym.keydata",
"description": "The Actual Key Data"
}
}
}
{
"message": "string"
}
Schema of the response body
{
"type": "object",
"properties": {
"message": {
"type": "string"
}
}
}
{
"message": "string"
}
Schema of the response body
{
"type": "object",
"properties": {
"message": {
"type": "string"
}
}
}
POST /asym/rotate
Request body
{
"ringname": "string",
"algo": "aes256"
}
Schema of the request body
{
"type": "object",
"properties": {
"ringname": {
"type": "string",
"description": "The KeyRing name"
},
"algo": {
"type": "string",
"enum": [
"aes256"
]
}
},
"required": [
"ringname"
]
}
Responses
{
"key": {
"type": null,
"id": "string",
"props": {},
"keyData": {
"key": "string"
}
}
}
Schema of the response body
{
"type": "object",
"properties": {
"key": {
"$ref": "#/components/schemas/asym.key"
}
}
}
{
"message": "string"
}
Schema of the response body
{
"type": "object",
"properties": {
"message": {
"type": "string"
}
}
}
POST /asym/keyrings/{ring}/certify
Input parameters
| Parameter | In | Type | Default | Nullable | Description |
|---|---|---|---|---|---|
ring |
path | string | No | The KeyRing id |
Request body
{
"alg": "string",
"intermediate": [
{
"alg": "string",
"publicKey": "string"
}
],
"requestedTtlSeconds": 10.12
}
Schema of the request body
{
"type": "object",
"properties": {
"alg": {
"type": "string",
"description": "The signature suite label, e.g. 'hybrid:ed25519+ml-dsa-65'"
},
"intermediate": {
"type": "array",
"items": {
"type": "object",
"properties": {
"alg": {
"type": "string"
},
"publicKey": {
"type": "string"
}
},
"required": [
"alg",
"publicKey"
]
},
"description": "The intermediate signing key public components"
},
"requestedTtlSeconds": {
"type": "number",
"description": "Requested intermediate lifetime in seconds (clamped to <= 24h)"
}
},
"required": [
"alg",
"intermediate"
]
}
Responses
{
"cert": {}
}
Schema of the response body
{
"type": "object",
"properties": {
"cert": {
"type": "object",
"properties": {},
"additionalProperties": true
}
}
}
GET /asym/keyrings/{ring}/signing-keyset
Input parameters
| Parameter | In | Type | Default | Nullable | Description |
|---|---|---|---|---|---|
ring |
path | string | No | The KeyRing id |
Responses
{
"ring": "string",
"suite": "string",
"keysets": [
{}
]
}
Schema of the response body
{
"type": "object",
"properties": {
"ring": {
"type": "string"
},
"suite": {
"type": "string"
},
"keysets": {
"type": "array",
"items": {
"type": "object",
"properties": {},
"additionalProperties": true
}
}
}
}
{
"message": "string"
}
Schema of the response body
{
"type": "object",
"properties": {
"message": {
"type": "string"
}
}
}
GET /asym/keyrings/{ring}/certs/{iskId}
Input parameters
| Parameter | In | Type | Default | Nullable | Description |
|---|---|---|---|---|---|
iskId |
path | string | No | The intermediate signing key id | |
ring |
path | string | No | The KeyRing id |
Responses
{
"cert": {}
}
Schema of the response body
{
"type": "object",
"properties": {
"cert": {
"type": "object",
"properties": {},
"additionalProperties": true
}
}
}
{
"message": "string"
}
Schema of the response body
{
"type": "object",
"properties": {
"message": {
"type": "string"
}
}
}
GET /asym/keyrings/{ring}/config
Input parameters
| Parameter | In | Type | Default | Nullable | Description |
|---|---|---|---|---|---|
ring |
path | string | No | The KeyRing id |
Responses
{
"ring": "string",
"config": {},
"paused": true,
"effectiveBy": 10.12,
"immediateVia": "string"
}
Schema of the response body
{
"type": "object",
"properties": {
"ring": {
"type": "string"
},
"config": {
"type": "object",
"properties": {},
"additionalProperties": true
},
"paused": {
"type": "boolean"
},
"effectiveBy": {
"type": "number",
"description": "Epoch ms when the pause fully takes effect (latest outstanding cert expiry); absent if no outstanding certs"
},
"immediateVia": {
"type": "string",
"description": "The immediate lever to stop signing now, e.g. 'revoke'"
}
}
}
PUT /asym/keyrings/{ring}/config
Input parameters
| Parameter | In | Type | Default | Nullable | Description |
|---|---|---|---|---|---|
ring |
path | string | No | The KeyRing id |
Request body
{
"config": {}
}
Schema of the request body
{
"type": "object",
"properties": {
"config": {
"type": "object",
"properties": {},
"required": [],
"additionalProperties": true,
"description": "The policy patch, e.g. { certifyEnabled, certTTLSeconds }"
}
},
"required": [
"config"
]
}
Responses
{
"ring": "string",
"config": {},
"paused": true,
"effectiveBy": 10.12,
"immediateVia": "string"
}
Schema of the response body
{
"type": "object",
"properties": {
"ring": {
"type": "string"
},
"config": {
"type": "object",
"properties": {},
"additionalProperties": true
},
"paused": {
"type": "boolean"
},
"effectiveBy": {
"type": "number",
"description": "Epoch ms when the pause fully takes effect (latest outstanding cert expiry); absent if no outstanding certs"
},
"immediateVia": {
"type": "string",
"description": "The immediate lever to stop signing now, e.g. 'revoke'"
}
}
}
{
"message": "string"
}
Schema of the response body
{
"type": "object",
"properties": {
"message": {
"type": "string"
}
}
}
POST /asym/keyrings/{ring}/rotate-signing-root
Input parameters
| Parameter | In | Type | Default | Nullable | Description |
|---|---|---|---|---|---|
ring |
path | string | No | The KeyRing id |
Request body
{
"suite": "string"
}
Schema of the request body
{
"type": "object",
"properties": {
"suite": {
"type": "string",
"description": "Optional suite label for the new root; defaults to the server default suite"
}
}
}
Responses
{
"signing": {}
}
Schema of the response body
{
"type": "object",
"properties": {
"signing": {
"type": "object",
"properties": {},
"additionalProperties": true
}
}
}
{
"message": "string"
}
Schema of the response body
{
"type": "object",
"properties": {
"message": {
"type": "string"
}
}
}
POST /asym/keyrings/{ring}/revoke-signing
Input parameters
| Parameter | In | Type | Default | Nullable | Description |
|---|---|---|---|---|---|
ring |
path | string | No | The KeyRing id |
Responses
{
"ring": "string",
"revoked": 10.12,
"certifyEnabled": true
}
Schema of the response body
{
"type": "object",
"properties": {
"ring": {
"type": "string"
},
"revoked": {
"type": "number"
},
"certifyEnabled": {
"type": "boolean"
}
}
}
GET /asym/keyrings/{ring}/audit
Input parameters
| Parameter | In | Type | Default | Nullable | Description |
|---|---|---|---|---|---|
cursor |
query | string | No | Cursor for pagination | |
limit |
query | number | No | Maximum number of entries to return (default: 100, max: 10000) | |
ring |
path | string | No | The KeyRing id |
Responses
{
"data": [
{
"id": "string",
"ringId": "string",
"action": "string",
"actionValid": true,
"context": {},
"data": {},
"createdAt": 10.12
}
],
"pagination": {
"limit": 10.12,
"count": 10.12,
"hasMore": true,
"nextCursor": "string",
"totalCount": 10.12
}
}
Schema of the response body
{
"type": "object",
"properties": {
"data": {
"type": "array",
"items": {
"type": "object",
"properties": {
"id": {
"type": "string"
},
"ringId": {
"type": "string"
},
"action": {
"type": "string"
},
"actionValid": {
"type": "boolean"
},
"context": {
"type": "object",
"properties": {},
"additionalProperties": true
},
"data": {
"type": "object",
"properties": {},
"additionalProperties": true
},
"createdAt": {
"type": "number"
}
}
}
},
"pagination": {
"type": "object",
"properties": {
"limit": {
"type": "number"
},
"count": {
"type": "number"
},
"hasMore": {
"type": "boolean"
},
"nextCursor": {
"type": "string"
},
"totalCount": {
"type": "number"
}
},
"required": [
"limit",
"count",
"hasMore"
],
"additionalProperties": true
}
}
}
POST /asym/keyrings/configs
Request body
{
"rings": [
"string"
]
}
Schema of the request body
{
"type": "object",
"properties": {
"rings": {
"type": "array",
"items": {
"type": "string"
},
"description": "The KeyRing ids to resolve policies for"
}
},
"required": [
"rings"
]
}
Responses
{
"configs": [
{
"ring": "string",
"config": {}
}
]
}
Schema of the response body
{
"type": "object",
"properties": {
"configs": {
"type": "array",
"items": {
"type": "object",
"properties": {
"ring": {
"type": "string"
},
"config": {
"type": "object",
"properties": {},
"additionalProperties": true
}
}
}
}
}
}
Health
GET /dashboard/healthz
Health check
Description
Returns the health status of the dashboard-api
Responses
{
"status": "string",
"service": "string"
}
Schema of the response body
{
"type": "object",
"properties": {
"status": {
"type": "string"
},
"service": {
"type": "string"
}
}
}
Keyrings
GET /dashboard/keyrings
List keyrings
Description
Returns a list of all keyrings
Input parameters
| Parameter | In | Type | Default | Nullable | Description |
|---|---|---|---|---|---|
cursor |
query | string | No | Pagination cursor | |
limit |
query | integer | No | Page size | |
sortBy |
query | string | No | Column to sort by: name or createdAt (default: createdAt) | |
sortOrder |
query | string | No | Sort direction: asc or desc (default: asc) |
Responses
{
"keyrings": [
{}
]
}
Schema of the response body
{
"type": "object",
"properties": {
"keyrings": {
"type": "array",
"items": {
"type": "object",
"properties": {},
"additionalProperties": true
}
}
},
"additionalProperties": true
}
POST /dashboard/keyrings
Create keyring
Description
Creates a new keyring
Request body
{
"name": "string",
"publicKey": "string",
"props": {},
"keyProps": {}
}
Schema of the request body
{
"type": "object",
"properties": {
"name": {
"type": "string"
},
"publicKey": {
"type": "string"
},
"props": {
"type": "object",
"properties": {},
"additionalProperties": true
},
"keyProps": {
"type": "object",
"properties": {},
"additionalProperties": true
}
}
}
Responses
{
"ring": {},
"key": {},
"privateKey": "string"
}
Schema of the response body
{
"type": "object",
"properties": {
"ring": {
"type": "object",
"properties": {},
"additionalProperties": true
},
"key": {
"type": "object",
"properties": {},
"additionalProperties": true
},
"privateKey": {
"type": "string"
}
},
"additionalProperties": true
}
GET /dashboard/keyrings/{id}
Get keyring
Description
Returns a keyring by ID
Input parameters
| Parameter | In | Type | Default | Nullable | Description |
|---|---|---|---|---|---|
id |
path | string | No |
Responses
{
"ring": {}
}
Schema of the response body
{
"type": "object",
"properties": {
"ring": {
"type": "object",
"properties": {},
"additionalProperties": true
}
},
"additionalProperties": true
}
DELETE /dashboard/keyrings/{id}
Delete keyring
Description
Deletes a keyring
Input parameters
| Parameter | In | Type | Default | Nullable | Description |
|---|---|---|---|---|---|
id |
path | string | No |
Responses
{
"success": true
}
Schema of the response body
{
"type": "object",
"properties": {
"success": {
"type": "boolean"
}
}
}
GET /dashboard/keyrings/{id}/keys
Get keyring keys
Description
Returns all keys in a keyring
Input parameters
| Parameter | In | Type | Default | Nullable | Description |
|---|---|---|---|---|---|
cursor |
query | string | No | ||
id |
query | string | No | If set to 'true' will treat the id as the KeyRing ID | |
id |
path | string | No | ||
limit |
query | number | No |
Responses
{
"data": [
{}
],
"pagination": {}
}
Schema of the response body
{
"type": "object",
"properties": {
"data": {
"type": "array",
"items": {
"type": "object",
"properties": {},
"additionalProperties": true
}
},
"pagination": {
"type": "object",
"properties": {},
"additionalProperties": true
}
},
"additionalProperties": true
}
POST /dashboard/rotate
Rotate keys
Description
Rotates keys in a keyring
Request body
{
"ringname": "string",
"algo": "string"
}
Schema of the request body
{
"type": "object",
"properties": {
"ringname": {
"type": "string"
},
"algo": {
"type": "string"
}
}
}
Responses
{
"key": {}
}
Schema of the response body
{
"type": "object",
"properties": {
"key": {
"type": "object",
"properties": {},
"additionalProperties": true
}
},
"additionalProperties": true
}
POST /dashboard/asym/keyrings
Create asymmetric keyring
Description
Creates a new asymmetric keyring
Request body
{
"name": "string",
"algo": "string",
"props": {},
"keyProps": {},
"signing": {}
}
Schema of the request body
{
"type": "object",
"properties": {
"name": {
"type": "string"
},
"algo": {
"type": "string"
},
"props": {
"type": "object",
"properties": {},
"additionalProperties": true
},
"keyProps": {
"type": "object",
"properties": {},
"additionalProperties": true
},
"signing": {
"type": "object",
"properties": {},
"additionalProperties": true
}
}
}
Responses
{
"ring": {},
"key": {},
"privateKey": "string"
}
Schema of the response body
{
"type": "object",
"properties": {
"ring": {
"type": "object",
"properties": {},
"additionalProperties": true
},
"key": {
"type": "object",
"properties": {},
"additionalProperties": true
},
"privateKey": {
"type": "string"
}
},
"additionalProperties": true
}
GET /dashboard/keyrings/config
Get keyring config
Description
Returns configuration for a keyring
Input parameters
| Parameter | In | Type | Default | Nullable | Description |
|---|---|---|---|---|---|
ringname |
query | string | No | The KeyRing name |
Responses
{
"config": {}
}
Schema of the response body
{
"type": "object",
"properties": {
"config": {
"type": "object",
"properties": {},
"additionalProperties": true
}
},
"additionalProperties": true
}
PUT /dashboard/keyrings/config
Update keyring config
Description
Updates a keyring's key-server config (signing enforcement, etc.)
Request body
{
"ringname": "string",
"config": {}
}
Schema of the request body
{
"type": "object",
"properties": {
"ringname": {
"type": "string"
},
"config": {
"type": "object",
"properties": {},
"additionalProperties": true
}
}
}
Responses
{
"config": {}
}
Schema of the response body
{
"type": "object",
"properties": {
"config": {
"type": "object",
"properties": {},
"additionalProperties": true
}
},
"additionalProperties": true
}
{
"message": "string"
}
Schema of the response body
{
"type": "object",
"properties": {
"message": {
"type": "string"
}
}
}
GET /dashboard/keyrings/{id}/signing-policy
Get signing policy
Description
Returns a keyring's signing policy (certifyEnabled / certTTLSeconds)
Input parameters
| Parameter | In | Type | Default | Nullable | Description |
|---|---|---|---|---|---|
id |
path | string | No |
Responses
{
"ring": "string",
"config": {}
}
Schema of the response body
{
"type": "object",
"properties": {
"ring": {
"type": "string"
},
"config": {
"type": "object",
"properties": {},
"additionalProperties": true
}
},
"additionalProperties": true
}
PUT /dashboard/keyrings/{id}/signing-policy
Update signing policy
Description
Updates a keyring's signing policy (certifyEnabled / certTTLSeconds); shallow-merged server-side
Input parameters
| Parameter | In | Type | Default | Nullable | Description |
|---|---|---|---|---|---|
id |
path | string | No |
Request body
{
"config": {}
}
Schema of the request body
{
"type": "object",
"properties": {
"config": {
"type": "object",
"properties": {},
"additionalProperties": true
}
}
}
Responses
{
"ring": "string",
"config": {}
}
Schema of the response body
{
"type": "object",
"properties": {
"ring": {
"type": "string"
},
"config": {
"type": "object",
"properties": {},
"additionalProperties": true
}
},
"additionalProperties": true
}
{
"message": "string"
}
Schema of the response body
{
"type": "object",
"properties": {
"message": {
"type": "string"
}
}
}
POST /dashboard/keyrings/signing-policies
Batch get signing policies
Description
Resolves signing policies (certifyEnabled / certTTLSeconds) for a set of keyring ids in one call
Request body
{
"rings": [
"string"
]
}
Schema of the request body
{
"type": "object",
"properties": {
"rings": {
"type": "array",
"items": {
"type": "string"
}
}
}
}
Responses
{
"configs": [
{}
]
}
Schema of the response body
{
"type": "object",
"properties": {
"configs": {
"type": "array",
"items": {
"type": "object",
"properties": {},
"additionalProperties": true
}
}
},
"additionalProperties": true
}
GET /dashboard/keyrings/{ringId}/signing-audit
Get signing audit log
Description
Returns a keyring's control-plane signing audit events (certify, config changes, rotations, revocations), newest first
Input parameters
| Parameter | In | Type | Default | Nullable | Description |
|---|---|---|---|---|---|
cursor |
query | string | No | Pagination cursor | |
limit |
query | integer | No | Page size (default: 100, max: 10000) | |
ringId |
path | string | No |
Responses
{
"data": [
{}
],
"pagination": {}
}
Schema of the response body
{
"type": "object",
"properties": {
"data": {
"type": "array",
"items": {
"type": "object",
"properties": {},
"additionalProperties": true
}
},
"pagination": {
"type": "object",
"properties": {},
"additionalProperties": true
}
},
"additionalProperties": true
}
Analytics
GET /dashboard/analytics/summary
Get analytics summary
Description
Returns aggregated KPI summary stats
Input parameters
| Parameter | In | Type | Default | Nullable | Description |
|---|---|---|---|---|---|
accountId |
query | string | No | ||
timeRange |
query | string | No |
Responses
{
"timeRange": "string",
"startTime": "string",
"endTime": "string",
"totalActivities": 0,
"cryptoOperations": 0,
"successfulOperations": 0,
"failedOperations": 0,
"encryptOperations": 0,
"decryptOperations": 0,
"rotateOperations": 0,
"aksOperations": 0,
"uniqueAccounts": 0,
"uniqueKeyrings": 0,
"uniqueApiKeys": 0,
"successRate": 10.12,
"lastUpdated": "string"
}
Schema of the response body
{
"type": "object",
"properties": {
"timeRange": {
"type": "string"
},
"startTime": {
"type": "string"
},
"endTime": {
"type": "string"
},
"totalActivities": {
"type": "integer"
},
"cryptoOperations": {
"type": "integer"
},
"successfulOperations": {
"type": "integer"
},
"failedOperations": {
"type": "integer"
},
"encryptOperations": {
"type": "integer"
},
"decryptOperations": {
"type": "integer"
},
"rotateOperations": {
"type": "integer"
},
"aksOperations": {
"type": "integer"
},
"uniqueAccounts": {
"type": "integer"
},
"uniqueKeyrings": {
"type": "integer"
},
"uniqueApiKeys": {
"type": "integer"
},
"successRate": {
"type": "number"
},
"lastUpdated": {
"type": "string"
}
}
}
GET /dashboard/analytics/hourly
Get hourly distribution
Description
Returns 24-hour activity distribution
Input parameters
| Parameter | In | Type | Default | Nullable | Description |
|---|---|---|---|---|---|
accountId |
query | string | No | ||
timeRange |
query | string | No |
Responses
{
"timeRange": "string",
"data": [
{
"hour": "string",
"total": 0,
"successful": 0,
"failed": 0
}
]
}
Schema of the response body
{
"type": "object",
"properties": {
"timeRange": {
"type": "string"
},
"data": {
"type": "array",
"items": {
"type": "object",
"properties": {
"hour": {
"type": "string"
},
"total": {
"type": "integer"
},
"successful": {
"type": "integer"
},
"failed": {
"type": "integer"
}
}
}
}
}
}
GET /dashboard/analytics/accounts
Get top accounts
Description
Returns top accounts by activity volume
Input parameters
| Parameter | In | Type | Default | Nullable | Description |
|---|---|---|---|---|---|
limit |
query | integer | No | ||
timeRange |
query | string | No |
Responses
{
"timeRange": "string",
"data": [
{
"accountId": "string",
"accountName": "string",
"operations": 0,
"encryptions": 0,
"decryptions": 0,
"rotations": 0,
"successRate": 10.12,
"trend": "string"
}
]
}
Schema of the response body
{
"type": "object",
"properties": {
"timeRange": {
"type": "string"
},
"data": {
"type": "array",
"items": {
"type": "object",
"properties": {
"accountId": {
"type": "string"
},
"accountName": {
"type": "string",
"nullable": true
},
"operations": {
"type": "integer"
},
"encryptions": {
"type": "integer"
},
"decryptions": {
"type": "integer"
},
"rotations": {
"type": "integer"
},
"successRate": {
"type": "number"
},
"trend": {
"type": "string"
}
}
}
}
}
}
GET /dashboard/analytics/actions
Get action distribution
Description
Returns distribution of action types
Input parameters
| Parameter | In | Type | Default | Nullable | Description |
|---|---|---|---|---|---|
accountId |
query | string | No | ||
limit |
query | integer | No | ||
timeRange |
query | string | No |
Responses
{
"timeRange": "string",
"data": [
{
"action": "string",
"count": 0,
"percentage": 10.12
}
]
}
Schema of the response body
{
"type": "object",
"properties": {
"timeRange": {
"type": "string"
},
"data": {
"type": "array",
"items": {
"type": "object",
"properties": {
"action": {
"type": "string"
},
"count": {
"type": "integer"
},
"percentage": {
"type": "number"
}
}
}
}
}
}
GET /dashboard/analytics/timeline
Get timeline data
Description
Returns time-series activity data
Input parameters
| Parameter | In | Type | Default | Nullable | Description |
|---|---|---|---|---|---|
accountId |
query | string | No | ||
granularity |
query | string | No | ||
timeRange |
query | string | No |
Responses
{
"timeRange": "string",
"granularity": "string",
"data": [
{
"timestamp": "string",
"total": 0,
"successful": 0,
"failed": 0,
"encryptions": 0,
"decryptions": 0,
"rotations": 0
}
]
}
Schema of the response body
{
"type": "object",
"properties": {
"timeRange": {
"type": "string"
},
"granularity": {
"type": "string"
},
"data": {
"type": "array",
"items": {
"type": "object",
"properties": {
"timestamp": {
"type": "string"
},
"total": {
"type": "integer"
},
"successful": {
"type": "integer"
},
"failed": {
"type": "integer"
},
"encryptions": {
"type": "integer"
},
"decryptions": {
"type": "integer"
},
"rotations": {
"type": "integer"
}
}
}
}
}
}
GET /dashboard/analytics/assets
Get asset stats
Description
Returns aggregated asset statistics
Responses
{
"totalAssets": 0,
"recentAssets": 0,
"activeAssets": 0,
"unConnectedAssets": 0,
"connectedAssets": 0,
"avgParentsPerAsset": 10.12,
"maxParentsPerAsset": 0,
"lastUpdated": "string"
}
Schema of the response body
{
"type": "object",
"properties": {
"totalAssets": {
"type": "integer"
},
"recentAssets": {
"type": "integer"
},
"activeAssets": {
"type": "integer"
},
"unConnectedAssets": {
"type": "integer"
},
"connectedAssets": {
"type": "integer"
},
"avgParentsPerAsset": {
"type": "number"
},
"maxParentsPerAsset": {
"type": "integer"
},
"lastUpdated": {
"type": "string"
}
}
}
GET /dashboard/analytics/assets/trend
Get asset creation trend
Description
Returns daily asset creation counts
Input parameters
| Parameter | In | Type | Default | Nullable | Description |
|---|---|---|---|---|---|
timeRange |
query | string | No |
Responses
{
"timeRange": "string",
"data": [
{
"date": "string",
"count": 0,
"label": "string"
}
]
}
Schema of the response body
{
"type": "object",
"properties": {
"timeRange": {
"type": "string"
},
"data": {
"type": "array",
"items": {
"type": "object",
"properties": {
"date": {
"type": "string"
},
"count": {
"type": "integer"
},
"label": {
"type": "string"
}
}
}
}
}
}
GET /dashboard/analytics/assets/activity
Get asset activity trend
Description
Returns daily asset activity counts from asset_activity table
Input parameters
| Parameter | In | Type | Default | Nullable | Description |
|---|---|---|---|---|---|
timeRange |
query | string | No |
Responses
{
"timeRange": "string",
"data": [
{
"date": "string",
"count": 0,
"label": "string"
}
]
}
Schema of the response body
{
"type": "object",
"properties": {
"timeRange": {
"type": "string"
},
"data": {
"type": "array",
"items": {
"type": "object",
"properties": {
"date": {
"type": "string"
},
"count": {
"type": "integer"
},
"label": {
"type": "string"
}
}
}
}
}
}
GET /dashboard/analytics/keyrings/{name}/timeline
Get keyring activity timeline
Description
Returns time-series activity data for a specific keyring
Input parameters
| Parameter | In | Type | Default | Nullable | Description |
|---|---|---|---|---|---|
granularity |
query | string | No | ||
name |
path | string | No | ||
timeRange |
query | string | No |
Responses
{
"timeRange": "string",
"granularity": "string",
"data": [
{
"timestamp": "string",
"total": 0,
"successful": 0,
"failed": 0,
"encryptions": 0,
"decryptions": 0,
"rotations": 0
}
]
}
Schema of the response body
{
"type": "object",
"properties": {
"timeRange": {
"type": "string"
},
"granularity": {
"type": "string"
},
"data": {
"type": "array",
"items": {
"type": "object",
"properties": {
"timestamp": {
"type": "string"
},
"total": {
"type": "integer"
},
"successful": {
"type": "integer"
},
"failed": {
"type": "integer"
},
"encryptions": {
"type": "integer"
},
"decryptions": {
"type": "integer"
},
"rotations": {
"type": "integer"
}
}
}
}
}
}
Stats
GET /dashboard/stats/counts
Get system counts
Description
Returns total entity counts across the platform, independent of filters
Responses
{
"keyrings": 0,
"accounts": 0,
"users": 0,
"assets": 0,
"activities": 0,
"apiKeys": 0,
"updatedAt": "string"
}
Schema of the response body
{
"type": "object",
"properties": {
"keyrings": {
"type": "integer"
},
"accounts": {
"type": "integer"
},
"users": {
"type": "integer"
},
"assets": {
"type": "integer"
},
"activities": {
"type": "integer"
},
"apiKeys": {
"type": "integer"
},
"updatedAt": {
"type": "string"
}
}
}
Integrations
GET /dashboard/integrations
List integrations
Description
Returns integrations joined with delivery state, paginated
Responses
{
"data": [
{}
],
"pagination": {}
}
Schema of the response body
{
"type": "object",
"properties": {
"data": {
"type": "array",
"items": {
"type": "object",
"properties": {},
"additionalProperties": true
}
},
"pagination": {
"type": "object",
"properties": {},
"additionalProperties": true
}
}
}
POST /dashboard/integrations
Create integration
Description
Creates an activity-export integration. Webhook integrations return their signing secret exactly once. A provider the catalogue reports as not deliverable is refused with 400 and the reason.
Request body
{
"name": "string",
"type": "webhook",
"provider": "string",
"config": {},
"filters": {},
"headers": {},
"oauth": {},
"credential": {}
}
Schema of the request body
{
"type": "object",
"properties": {
"name": {
"type": "string"
},
"type": {
"type": "string",
"enum": [
"webhook",
"otlp"
]
},
"provider": {
"type": "string"
},
"config": {
"type": "object",
"properties": {},
"additionalProperties": true
},
"filters": {
"type": "object",
"properties": {},
"additionalProperties": true
},
"headers": {
"type": "object",
"properties": {},
"additionalProperties": true
},
"oauth": {
"type": "object",
"properties": {},
"additionalProperties": true
},
"credential": {
"type": "object",
"properties": {},
"additionalProperties": true,
"description": "The operator credential as { kind, config }"
}
},
"required": [
"name",
"type",
"config"
]
}
Responses
{
"id": "string"
}
Schema of the response body
{
"type": "object",
"properties": {
"id": {
"type": "string"
}
},
"additionalProperties": true
}
GET /dashboard/integrations/providers
List providers
Description
Returns the destination catalogue used to build the create form. deliverable: true entries can be configured; deliverable: false entries name a destination measured as unable to receive our exports and carry reason, remedy and measuredAgainst, so the form can refuse one before the operator supplies a URL.
Responses
{
"providers": [
{
"id": "string",
"label": "string",
"deliverable": true,
"transports": [
"string"
],
"credential": "string",
"operatorSuppliesUrl": true,
"reason": "string",
"remedy": "string",
"measuredAgainst": "string",
"docsPath": "string",
"fields": [
{
"name": "string",
"label": "string",
"kind": "string",
"required": true,
"options": [
"string"
],
"help": "string"
}
]
}
],
"vendors": [
{
"id": "string",
"label": "string",
"provider": "string",
"transport": "string",
"reach": "string",
"confidence": "string",
"measuredAgainst": "string",
"urlHint": "string",
"authHeader": "string",
"note": "string",
"docsPath": "string"
}
]
}
Schema of the response body
{
"type": "object",
"properties": {
"providers": {
"type": "array",
"items": {
"type": "object",
"properties": {
"id": {
"type": "string"
},
"label": {
"type": "string"
},
"deliverable": {
"type": "boolean"
},
"transports": {
"type": "array",
"items": {
"type": "string"
}
},
"credential": {
"type": "string"
},
"operatorSuppliesUrl": {
"type": "boolean"
},
"reason": {
"type": "string"
},
"remedy": {
"type": "string"
},
"measuredAgainst": {
"type": "string"
},
"docsPath": {
"type": "string"
},
"fields": {
"type": "array",
"items": {
"type": "object",
"properties": {
"name": {
"type": "string"
},
"label": {
"type": "string"
},
"kind": {
"type": "string"
},
"required": {
"type": "boolean"
},
"options": {
"type": "array",
"items": {
"type": "string"
}
},
"help": {
"type": "string"
}
},
"additionalProperties": true
}
}
},
"additionalProperties": true
}
},
"vendors": {
"type": "array",
"items": {
"type": "object",
"properties": {
"id": {
"type": "string"
},
"label": {
"type": "string"
},
"provider": {
"type": "string"
},
"transport": {
"type": "string"
},
"reach": {
"type": "string"
},
"confidence": {
"type": "string"
},
"measuredAgainst": {
"type": "string"
},
"urlHint": {
"type": "string"
},
"authHeader": {
"type": "string"
},
"note": {
"type": "string"
},
"docsPath": {
"type": "string"
}
},
"additionalProperties": true
}
}
},
"additionalProperties": true
}
GET /dashboard/integrations/{id}
Get integration
Description
Returns a single integration by ID
Input parameters
| Parameter | In | Type | Default | Nullable | Description |
|---|---|---|---|---|---|
id |
path | string | No |
Responses
{
"id": "string"
}
Schema of the response body
{
"type": "object",
"properties": {
"id": {
"type": "string"
}
},
"additionalProperties": true
}
{
"message": "string"
}
Schema of the response body
{
"type": "object",
"properties": {
"message": {
"type": "string"
}
}
}
PATCH /dashboard/integrations/{id}
Update integration
Description
Updates an integration, and rotates OTLP auth headers; enabled:true resumes a paused export. RE-POINTING: the destination moves when provider changes, when the ORIGIN of config.url changes FOR A PROVIDER WHOSE OPERATOR SUPPLIES THE URL, or when a config field the provider derives its endpoint from changes (New Relic's region) — and a re-point must supply headers in the same request ({} clears them), because stored auth headers are not carried to a new destination. The config must be valid for the new provider; the cursor and signing secrets are preserved.
Input parameters
| Parameter | In | Type | Default | Nullable | Description |
|---|---|---|---|---|---|
id |
path | string | No |
Request body
{
"name": "string",
"enabled": true,
"config": {},
"filters": {},
"headers": {},
"provider": "string",
"credential": {}
}
Schema of the request body
{
"type": "object",
"properties": {
"name": {
"type": "string"
},
"enabled": {
"type": "boolean"
},
"config": {
"type": "object",
"properties": {},
"additionalProperties": true
},
"filters": {
"type": "object",
"properties": {},
"additionalProperties": true
},
"headers": {
"type": "object",
"properties": {},
"additionalProperties": true
},
"provider": {
"type": "string"
},
"credential": {
"type": "object",
"properties": {},
"additionalProperties": true,
"nullable": true,
"description": "The operator credential as { kind, config }, or null to clear it"
}
}
}
Responses
{
"id": "string"
}
Schema of the response body
{
"type": "object",
"properties": {
"id": {
"type": "string"
}
},
"additionalProperties": true
}
{
"message": "string"
}
Schema of the response body
{
"type": "object",
"properties": {
"message": {
"type": "string"
}
}
}
DELETE /dashboard/integrations/{id}
Delete integration
Description
Deletes an integration and its delivery state
Input parameters
| Parameter | In | Type | Default | Nullable | Description |
|---|---|---|---|---|---|
id |
path | string | No |
Responses
Schema of the response body
{
"type": "object",
"properties": {}
}
{
"message": "string"
}
Schema of the response body
{
"type": "object",
"properties": {
"message": {
"type": "string"
}
}
}
GET /dashboard/integrations/{id}/secrets
List signing secrets
Description
Returns secret metadata (keyId, createdAt) — never material
Input parameters
| Parameter | In | Type | Default | Nullable | Description |
|---|---|---|---|---|---|
id |
path | string | No |
Responses
{
"integrationId": "string"
}
Schema of the response body
{
"type": "object",
"properties": {
"integrationId": {
"type": "string"
}
},
"additionalProperties": true
}
{
"message": "string"
}
Schema of the response body
{
"type": "object",
"properties": {
"message": {
"type": "string"
}
}
}
POST /dashboard/integrations/{id}/secrets
Add signing secret
Description
Adds a signing secret and returns it exactly once (zero-downtime rotation)
Input parameters
| Parameter | In | Type | Default | Nullable | Description |
|---|---|---|---|---|---|
id |
path | string | No |
Responses
{
"integrationId": "string"
}
Schema of the response body
{
"type": "object",
"properties": {
"integrationId": {
"type": "string"
}
},
"additionalProperties": true
}
{
"message": "string"
}
Schema of the response body
{
"type": "object",
"properties": {
"message": {
"type": "string"
}
}
}
POST /dashboard/integrations/{id}/replay
Replay from timestamp
Description
Rewinds the export cursor — recovery, backfill, or moving past an undeliverable event
Input parameters
| Parameter | In | Type | Default | Nullable | Description |
|---|---|---|---|---|---|
id |
path | string | No |
Request body
{
"from": 10.12
}
Schema of the request body
{
"type": "object",
"properties": {
"from": {
"type": "number"
}
},
"required": [
"from"
]
}
Responses
Schema of the response body
{
"type": "object",
"properties": {}
}
{
"message": "string"
}
Schema of the response body
{
"type": "object",
"properties": {
"message": {
"type": "string"
}
}
}
DELETE /dashboard/integrations/{id}/secrets/{keyId}
Retire signing secret
Description
Retires a signing secret; refuses to remove the last one
Input parameters
| Parameter | In | Type | Default | Nullable | Description |
|---|---|---|---|---|---|
id |
path | string | No | ||
keyId |
path | string | No |
Responses
Schema of the response body
{
"type": "object",
"properties": {}
}
{
"message": "string"
}
Schema of the response body
{
"type": "object",
"properties": {
"message": {
"type": "string"
}
}
}
GET /dashboard/integrations/{id}/headers
List auth headers
Description
Returns header NAMES only. Values are credentials and never leave the integration service, exactly as with signing secrets — this is what lets the form show what is configured without being able to read it.
Input parameters
| Parameter | In | Type | Default | Nullable | Description |
|---|---|---|---|---|---|
id |
path | string | No |
Responses
{
"names": [
"string"
]
}
Schema of the response body
{
"type": "object",
"properties": {
"names": {
"type": "array",
"items": {
"type": "string"
}
}
},
"additionalProperties": true
}
{
"message": "string"
}
Schema of the response body
{
"type": "object",
"properties": {
"message": {
"type": "string"
}
}
}
PUT /dashboard/integrations/{id}/headers/{name}
Set auth header
Description
Sets ONE header, leaving the others untouched. Use PATCH /integrations/:id with a headers object to replace the whole set instead.
Input parameters
| Parameter | In | Type | Default | Nullable | Description |
|---|---|---|---|---|---|
id |
path | string | No | ||
name |
path | string | No |
Request body
{
"value": "string"
}
Schema of the request body
{
"type": "object",
"properties": {
"value": {
"type": "string"
}
},
"required": [
"value"
]
}
Responses
{
"ok": true
}
Schema of the response body
{
"type": "object",
"properties": {
"ok": {
"type": "boolean"
}
},
"additionalProperties": true
}
{
"message": "string"
}
Schema of the response body
{
"type": "object",
"properties": {
"message": {
"type": "string"
}
}
}
DELETE /dashboard/integrations/{id}/headers/{name}
Remove auth header
Description
Removes ONE header. removed: false means it was not set, which is distinct from a 404 meaning the integration is not there.
Input parameters
| Parameter | In | Type | Default | Nullable | Description |
|---|---|---|---|---|---|
id |
path | string | No | ||
name |
path | string | No |
Responses
{
"removed": true
}
Schema of the response body
{
"type": "object",
"properties": {
"removed": {
"type": "boolean"
}
},
"additionalProperties": true
}
{
"message": "string"
}
Schema of the response body
{
"type": "object",
"properties": {
"message": {
"type": "string"
}
}
}
GET /dashboard/integrations/{id}/oauth
Read OAuth client
Description
Returns the OAuth2 client WITHOUT its secret. secretSet says whether one is stored; the secret never leaves the integration service, exactly as with header values and signing secrets. Answers { configured: false } when there is no client.
Input parameters
| Parameter | In | Type | Default | Nullable | Description |
|---|---|---|---|---|---|
id |
path | string | No |
Responses
{
"tokenUrl": "string",
"clientId": "string",
"scope": "string",
"secretSet": true,
"configured": true
}
Schema of the response body
{
"type": "object",
"properties": {
"tokenUrl": {
"type": "string"
},
"clientId": {
"type": "string"
},
"scope": {
"type": "string"
},
"secretSet": {
"type": "boolean"
},
"configured": {
"type": "boolean"
}
},
"additionalProperties": true
}
{
"message": "string"
}
Schema of the response body
{
"type": "object",
"properties": {
"message": {
"type": "string"
}
}
}
PUT /dashboard/integrations/{id}/oauth
Replace OAuth client
Description
Replaces the OAuth2 client whole — there is no per-field merge, because a clientId from one tenant beside a clientSecret from another is a broken credential rather than a partial one. Any cached access token is discarded with it, so a rotated secret cannot keep presenting a token minted from the old client.
Input parameters
| Parameter | In | Type | Default | Nullable | Description |
|---|---|---|---|---|---|
id |
path | string | No |
Request body
{
"oauth": {}
}
Schema of the request body
{
"type": "object",
"properties": {
"oauth": {
"type": "object",
"properties": {},
"additionalProperties": true
}
},
"required": [
"oauth"
]
}
Responses
{
"ok": true
}
Schema of the response body
{
"type": "object",
"properties": {
"ok": {
"type": "boolean"
}
},
"additionalProperties": true
}
{
"message": "string"
}
Schema of the response body
{
"type": "object",
"properties": {
"message": {
"type": "string"
}
}
}
POST /dashboard/integrations/{id}/test
Test integration
Description
Fires one synthetic event through the real channel without touching state
Input parameters
| Parameter | In | Type | Default | Nullable | Description |
|---|---|---|---|---|---|
id |
path | string | No |
Responses
{
"ok": true
}
Schema of the response body
{
"type": "object",
"properties": {
"ok": {
"type": "boolean"
}
},
"additionalProperties": true
}
GET /integrations/providers
List providers
Description
Returns the destination catalogue. Every entry carries deliverable: true entries describe a destination that can be configured (its transports, operator-supplied fields and documentation anchor); false entries name a destination we have measured as unable to receive our exports, and carry reason, remedy and the exact measuredAgainst product the finding rests on. Both are returned by design — the second list is what lets a create form refuse a known-bad destination before the operator supplies a URL. Static; safe to cache client-side for the life of a page.
Responses
{
"providers": [
{
"id": "string",
"label": "string",
"deliverable": true,
"transports": [
"string"
],
"credential": "string",
"operatorSuppliesUrl": true,
"reason": "string",
"remedy": "string",
"measuredAgainst": "string",
"docsPath": "string",
"fields": [
{
"name": "string",
"label": "string",
"kind": "string",
"required": true,
"options": [
"string"
],
"help": "string"
}
]
}
],
"vendors": [
{
"id": "string",
"label": "string",
"provider": "string",
"transport": "string",
"reach": "string",
"confidence": "string",
"measuredAgainst": "string",
"urlHint": "string",
"authHeader": "string",
"note": "string",
"docsPath": "string"
}
]
}
Schema of the response body
{
"type": "object",
"properties": {
"providers": {
"type": "array",
"items": {
"type": "object",
"properties": {
"id": {
"type": "string"
},
"label": {
"type": "string"
},
"deliverable": {
"type": "boolean"
},
"transports": {
"type": "array",
"items": {
"type": "string"
}
},
"credential": {
"type": "string"
},
"operatorSuppliesUrl": {
"type": "boolean"
},
"reason": {
"type": "string"
},
"remedy": {
"type": "string"
},
"measuredAgainst": {
"type": "string"
},
"docsPath": {
"type": "string"
},
"fields": {
"type": "array",
"items": {
"type": "object",
"properties": {
"name": {
"type": "string"
},
"label": {
"type": "string"
},
"kind": {
"type": "string"
},
"required": {
"type": "boolean"
},
"options": {
"type": "array",
"items": {
"type": "string"
}
},
"help": {
"type": "string"
}
},
"additionalProperties": true
}
}
},
"additionalProperties": true
}
},
"vendors": {
"type": "array",
"items": {
"type": "object",
"properties": {
"id": {
"type": "string"
},
"label": {
"type": "string"
},
"provider": {
"type": "string"
},
"transport": {
"type": "string"
},
"reach": {
"type": "string"
},
"confidence": {
"type": "string"
},
"measuredAgainst": {
"type": "string"
},
"urlHint": {
"type": "string"
},
"authHeader": {
"type": "string"
},
"note": {
"type": "string"
},
"docsPath": {
"type": "string"
}
},
"additionalProperties": true
}
}
},
"additionalProperties": true
}
POST /integrations
Create integration
Description
Creates an activity-export integration (webhook or OTLP). Webhook integrations return their first signing secret exactly once, in this response.
Request body
{
"name": "string",
"type": "webhook",
"provider": "string",
"config": {},
"filters": {},
"headers": {},
"oauth": {},
"credential": {}
}
Schema of the request body
{
"type": "object",
"properties": {
"name": {
"type": "string"
},
"type": {
"type": "string",
"enum": [
"webhook",
"otlp"
]
},
"provider": {
"type": "string"
},
"config": {
"type": "object",
"properties": {},
"additionalProperties": true
},
"filters": {
"type": "object",
"properties": {},
"additionalProperties": true
},
"headers": {
"type": "object",
"properties": {},
"additionalProperties": true
},
"oauth": {
"type": "object",
"properties": {},
"additionalProperties": true
},
"credential": {
"type": "object",
"properties": {},
"additionalProperties": true,
"description": "The operator credential as { kind, config }"
}
},
"required": [
"name",
"type",
"config"
]
}
GET /integrations
List integrations
Description
Returns integrations joined with delivery state, paginated
Input parameters
| Parameter | In | Type | Default | Nullable | Description |
|---|---|---|---|---|---|
name |
query | string | No | Filters to integrations with this name, ignoring case. May match more than one. |
GET /integrations/{id}
Get integration
Description
Returns a single integration by ID (never includes secrets)
Input parameters
| Parameter | In | Type | Default | Nullable | Description |
|---|---|---|---|---|---|
id |
path | string | No |
PATCH /integrations/{id}
Update integration
Description
Updates name/enabled/config/filters/provider, and rotates auth headers (either transport). Setting enabled:true clears a pause and resumes delivery from the preserved cursor. RE-POINTING: the destination moves when provider changes, when the ORIGIN of config.url changes for a provider whose operator supplies the URL, or when a config field the provider derives its endpoint from changes (New Relic's region). Any of those refuses the patch unless headers is supplied in the same request ({} clears them), because stored auth headers are not carried to a destination the operator has not just named; the same applies to a stored AWS SigV4 credential and credential. A cached OAuth token is discarded on a re-point rather than refused. The config must be valid for the NEW provider, which must be deliverable and must support the integration's existing transport type. The export cursor and any signing secrets are preserved.
Input parameters
| Parameter | In | Type | Default | Nullable | Description |
|---|---|---|---|---|---|
id |
path | string | No |
Request body
{
"name": "string",
"enabled": true,
"config": {},
"filters": {},
"headers": {},
"credential": {},
"provider": "string"
}
Schema of the request body
{
"type": "object",
"properties": {
"name": {
"type": "string"
},
"enabled": {
"type": "boolean"
},
"config": {
"type": "object",
"properties": {},
"additionalProperties": true
},
"filters": {
"type": "object",
"properties": {},
"additionalProperties": true
},
"headers": {
"type": "object",
"properties": {},
"additionalProperties": true
},
"credential": {
"type": "object",
"properties": {},
"additionalProperties": true,
"nullable": true,
"description": "The operator credential as { kind, config }, or null to clear it"
},
"provider": {
"type": "string"
}
}
}
DELETE /integrations/{id}
Delete integration
Description
Deletes an integration and its delivery state
Input parameters
| Parameter | In | Type | Default | Nullable | Description |
|---|---|---|---|---|---|
id |
path | string | No |
POST /integrations/{id}/secrets
Add signing secret
Description
Adds a signing secret and returns it exactly once. Deliveries immediately carry signatures from every non-expired secret — the zero-downtime half of rotation.
Input parameters
| Parameter | In | Type | Default | Nullable | Description |
|---|---|---|---|---|---|
id |
path | string | No |
GET /integrations/{id}/secrets
List signing secrets
Description
Returns secret METADATA only (keyId, createdAt, expiresAt) — never material
Input parameters
| Parameter | In | Type | Default | Nullable | Description |
|---|---|---|---|---|---|
id |
path | string | No |
POST /integrations/{id}/replay
Replay from timestamp
Description
Rewinds the export cursor to a timestamp. The operator escape hatch: recovery after a consumer-side outage, historical backfill, and the only sanctioned way past an undeliverable event. Recorded as an activity so the gap is itself auditable.
Input parameters
| Parameter | In | Type | Default | Nullable | Description |
|---|---|---|---|---|---|
id |
path | string | No |
Request body
{
"from": 10.12
}
Schema of the request body
{
"type": "object",
"properties": {
"from": {
"type": "number"
}
},
"required": [
"from"
]
}
DELETE /integrations/{id}/secrets/{keyId}
Retire signing secret
Description
Retires a signing secret once the consumer has migrated. Refuses to remove the last one.
Input parameters
| Parameter | In | Type | Default | Nullable | Description |
|---|---|---|---|---|---|
id |
path | string | No | ||
keyId |
path | string | No |
GET /integrations/{id}/headers
List auth headers
Description
Returns header NAMES only — values are credentials and never leave the store, exactly as with signing secrets. This is what lets a UI show what is configured without being able to read it.
Input parameters
| Parameter | In | Type | Default | Nullable | Description |
|---|---|---|---|---|---|
id |
path | string | No |
Responses
{
"names": [
"string"
]
}
Schema of the response body
{
"type": "object",
"properties": {
"names": {
"type": "array",
"items": {
"type": "string"
}
}
},
"additionalProperties": true
}
PUT /integrations/{id}/headers/{name}
Set auth header
Description
Sets ONE header, leaving the others untouched — the merge. Use PATCH /:id with a headers object to replace the whole set instead.
Input parameters
| Parameter | In | Type | Default | Nullable | Description |
|---|---|---|---|---|---|
id |
path | string | No | ||
name |
path | string | No |
Request body
{
"value": "string"
}
Schema of the request body
{
"type": "object",
"properties": {
"value": {
"type": "string"
}
},
"required": [
"value"
]
}
Responses
{
"ok": true
}
Schema of the response body
{
"type": "object",
"properties": {
"ok": {
"type": "boolean"
}
},
"additionalProperties": true
}
DELETE /integrations/{id}/headers/{name}
Remove auth header
Description
Removes ONE header. removed: false means it was not set — distinct from a 404, which means the integration is not there. Deletion needs its own route because under merge, omitting a header means "leave it alone".
Input parameters
| Parameter | In | Type | Default | Nullable | Description |
|---|---|---|---|---|---|
id |
path | string | No | ||
name |
path | string | No |
Responses
{
"removed": true
}
Schema of the response body
{
"type": "object",
"properties": {
"removed": {
"type": "boolean"
}
},
"additionalProperties": true
}
GET /integrations/{id}/oauth
Read OAuth client
Description
Returns the OAuth2 client WITHOUT its secret. secretSet says whether one is stored; the secret itself is never returned by any read. Answers { configured: false } when the integration has no OAuth client.
Input parameters
| Parameter | In | Type | Default | Nullable | Description |
|---|---|---|---|---|---|
id |
path | string | No |
Responses
{
"tokenUrl": "string",
"clientId": "string",
"scope": "string",
"secretSet": true,
"configured": true
}
Schema of the response body
{
"type": "object",
"properties": {
"tokenUrl": {
"type": "string"
},
"clientId": {
"type": "string"
},
"scope": {
"type": "string"
},
"secretSet": {
"type": "boolean"
},
"configured": {
"type": "boolean"
}
},
"additionalProperties": true
}
PUT /integrations/{id}/oauth
Replace OAuth client
Description
Replaces the OAuth2 client WHOLE — unlike headers there is no per-field merge, because a clientId from one tenant beside a clientSecret from another is a broken credential rather than a partial one. Any cached access token is discarded with it, so a rotated secret cannot keep presenting a token minted from the old client. There is no delete: an OAuth integration with no client cannot deliver.
Input parameters
| Parameter | In | Type | Default | Nullable | Description |
|---|---|---|---|---|---|
id |
path | string | No |
Request body
{
"oauth": {}
}
Schema of the request body
{
"type": "object",
"properties": {
"oauth": {
"type": "object",
"properties": {},
"additionalProperties": true
}
},
"required": [
"oauth"
]
}
Responses
{
"ok": true
}
Schema of the response body
{
"type": "object",
"properties": {
"ok": {
"type": "boolean"
}
},
"additionalProperties": true
}
PUT /integrations/{id}/credential
Set credential
Description
Writes the operator credential for whichever kind this integration's provider declares — one route for every kind, so a new credential kind needs no new endpoint. Replaced WHOLE, never merged: half of one credential beside half of another is broken rather than partial. Any cached access token is discarded with it, so a rotated secret cannot keep presenting a token minted from the old material. "kind" must match what the provider declares; it is a 400 naming both otherwise, because a credential the provider never resolves is material nothing will ever read. There is no delete — an integration whose provider declares a credential cannot deliver without one.
Input parameters
| Parameter | In | Type | Default | Nullable | Description |
|---|---|---|---|---|---|
id |
path | string | No |
Request body
{
"kind": "string",
"credential": {}
}
Schema of the request body
{
"type": "object",
"properties": {
"kind": {
"type": "string"
},
"credential": {
"type": "object",
"properties": {},
"additionalProperties": true
}
},
"required": [
"kind",
"credential"
]
}
Responses
{
"ok": true
}
Schema of the response body
{
"type": "object",
"properties": {
"ok": {
"type": "boolean"
}
},
"additionalProperties": true
}
POST /integrations/{id}/test
Test integration
Description
Fires one synthetic event through the real channel without touching cursor or state. Errors are reduced to a fixed class — blocked / unreachable / timeout / http_error / config_error / oversize — and carry a hint: one actionable sentence derived only from that class, the status, and your own stored configuration.
Input parameters
| Parameter | In | Type | Default | Nullable | Description |
|---|---|---|---|---|---|
id |
path | string | No |
Schemas
asym.key
| Name | Type | Description |
|---|---|---|
id |
string | The Key ID |
keyData |
asym.keydata | The Actual Key Data |
props |
Any custom properties on this Key | |
type |
The Algorithm this Key is used for |
asym.keydata
| Name | Type | Description |
|---|---|---|
key |
string | Base64 encoded Key cryptographic data |
asym.keyring
| Name | Type | Description |
|---|---|---|
activeAlgorithm |
The active algorithm on the KeyRing | |
activeKey |
string | The Key ID that is currently active |
createdAt |
string | Creation timestamp |
displayName |
string | The KeyRing display name |
id |
string | The KeyRing ID |
name |
string | The KeyRing name |
publicKey |
string | The KeyRing's Public Key. It is base64 endcoded. |
updatedAt |
string | Updated timestamp |
auth.account
| Name | Type | Description |
|---|---|---|
apiKeyCount |
integer | null | Number of API keys for this account (only present when includeKeyCounts=true) |
createdAt |
string | |
id |
string | |
notes |
string | |
props |
||
status |
string | Account status: 'active' or 'deactivated' |
uid |
string | The Account UID |
updatedAt |
string |
auth.activity
| Name | Type | Description |
|---|---|---|
createdAt |
integer | Epoch UTC time |
id |
string | |
keyid |
string | |
props |
auth.activity.create
| Name | Type | Description |
|---|---|---|
action |
string | |
apikeyId |
string | |
createdAt |
integer | |
props |
||
reasons |
Array<string> | Why the action was refused, one entry per independent cause. Ignored unless validAction is false |
ringname |
string | |
validAction |
boolean |
auth.apikey
| Name | Type | Description |
|---|---|---|
accountId |
string | |
active |
boolean | |
autoDisableOnLimit |
boolean | |
countedActions |
Array<string> | |
createdAt |
string | |
currentUses |
integer | |
flags |
Array<string> | The entitlements this API Key holds, as a list of granted names — ADR 021. Presence is the grant. |
key |
string | |
keyid |
string | |
maxUses |
integer | null | |
props |
||
references |
auth.apikeyref | |
updatedAt |
string | |
validFrom |
string | null | |
validUntil |
string | null |
auth.apikeyref
| Name | Type | Description |
|---|---|---|
accountId |
string |
auth.pagination
| Name | Type | Description |
|---|---|---|
count |
integer | |
hasMore |
boolean | |
limit |
integer | |
nextCursor |
string |
auth.password.validation
| Name | Type | Description |
|---|---|---|
details |
Properties: minLength, newPasswordLength, minUppercase, newPasswordUppercase, minLowercase, newPasswordLowercase, minSpecialChar, newPasswordSpecialChar, minNumber, newPasswordNumber |
|
isValid |
boolean |
auth.safeapikey
| Name | Type | Description |
|---|---|---|
accountId |
string | |
active |
boolean | |
autoDisableOnLimit |
boolean | |
countedActions |
Array<string> | |
createdAt |
string | |
currentUses |
integer | |
flags |
Array<string> | The entitlements this API Key holds, as a list of granted names — ADR 021. Presence is the grant. |
keyid |
string | |
maxUses |
integer | null | |
props |
||
references |
auth.apikeyref | |
updatedAt |
string | |
validFrom |
string | null | |
validUntil |
string | null |
auth.user
| Name | Type | Description |
|---|---|---|
displayName |
string | The User's display name |
email |
string | The User's email |
firstName |
string | The User's first name |
id |
string | The User ID |
keys |
Array<string> | A list of all API Key IDs owned by the user |
lastName |
string | The User's last name |
props |
Any unique props stored on the User | |
username |
string | The unique user name |
auth.validate.trustedservice
| Name | Type | Description |
|---|---|---|
ctx |
auth.validate.trustedservicectx | |
service |
string | The Service Name |
auth.validate.trustedservicectx
| Name | Type | Description |
|---|---|---|
options |
Properties: suppressActivity |
|
user |
Properties: userId, username |
ks.algorithm
Type: string
ks.key
| Name | Type | Description |
|---|---|---|
id |
string | The Key ID |
keyData |
ks.keydataencrypted | The encrypted Key Data |
props |
Any unique data stored on the Key | |
type |
ks.algorithm | The Algorithm |
ks.keydata
| Name | Type | Description |
|---|---|---|
key |
string |
ks.keydataencrypted
| Name | Type | Description |
|---|---|---|
encrypted |
Properties: key |
|
iv |
string |
ks.keyring
| Name | Type | Description |
|---|---|---|
activeAlgorithm |
The Active Algorithm | |
activeKey |
string | The Active Key ID |
createdAt |
string | The created at timestamp |
displayName |
string | Upper and lowercase preserved name |
id |
string | The Keyring ID |
name |
string | The KeyRing name |
props |
Additional properties on the KeyRing | |
publicKey |
string | Base64 encoded Public Key |
updatedAt |
string | The updated at timestamp |
ks.keyringconfig
| Name | Type | Description |
|---|---|---|
algos |
Properties: aes256 |
|
key |
Properties: props |
|
props |
||
signing |
Properties: mode, required |
ks.signedasset
| Name | Type | Description |
|---|---|---|
data |
||
id |
string | |
message |
string | |
valid |
boolean |
Security schemes
| Name | Type | Scheme | Description |
|---|---|---|---|
| BearerAuth | http | bearer |
More documentation
Grizzly Platform Documentation