API by router
Settings
GET
HTTPBearerheader
AuthorizationBearer <token>Successful Response
application/json- response
Full settings response - profile + API keys. "Surely you can't be serious." "I am serious... and don't call me Shirley."
api_keys*array<>profile*curl -X GET 'https://example.com/v1/settings'Example Response200
{ "api_keys": [ { "created_at": "2019-08-24T14:15:22Z", "id": "string", "is_active": true, "key_prefix": "string", "key_type": "string", "last_used_at": "2019-08-24T14:15:22Z", "name": "string", "revoked_at": "2019-08-24T14:15:22Z" } ], "profile": { "created_at": "2019-08-24T14:15:22Z", "customer_id": "string", "display_name": "string", "email": "string", "email_verified": true, "is_admin": true, "last_login": "2019-08-24T14:15:22Z", "oauth_providers": [], "tenant_id": "string" }}POST
HTTPBearerheader
AuthorizationBearer <token>application/json- body
Body for POST /v1/settings/api-keys.
Plan v1.8 amendments A5/A7/B1/B2: the caller picks ONE of three grant paths — explicit scopes, named preset, or break-glass.
scopes: array of<resource>:<verb>tags. Wildcards accepted (e.g.instances:*); expanded server-side at issuance time. Pure*/*:*literals refused — usebreak_glass=Trueinstead.preset: one ofread-only-analyst | operator | billing-only. Resolved server-side; the row stores the concrete array.break_glass=True: shortcut for thefullpreset. Requiresconfirmation_phrase == "BREAK GLASS"and is automatically capped at 24 hours TTL regardless ofexpires_at.
Exactly ONE of those three paths must be set per request.
break_glass?Break GlassDefault
falseconfirmation_phrase?string|nullexpires_at?|nullkey_type?Key TypeMatch
^(live|test)$Default
"live"name?NameLength
length <= 100Default
"Default"preset?|nullrate_limit_per_hour?integer|nullrate_limit_per_minute?integer|nullscopes?array<string>|nullSuccessful Response
application/json- response
Returned once on creation - plaintext key never shown again. "After this, there is no turning back." - Morpheus, The Matrix
created_at*Created AtFormat
date-timeexpires_at*|nullid*Idkey_prefix*Key Prefixkey_type*Key Typename*Nameplaintext_key*Plaintext Keyscopes*array<string>curl -X POST 'https://example.com/v1/settings/api-keys' \ -H 'Content-Type: application/json' \ -d '{}'Example Response
{ "created_at": "2019-08-24T14:15:22Z", "expires_at": "2019-08-24T14:15:22Z", "id": "string", "key_prefix": "string", "key_type": "string", "name": "string", "plaintext_key": "string", "scopes": [ "string" ]}DELETE
HTTPBearerheader
AuthorizationBearer <token>key_id*Key IdFormat
uuidSuccessful Response
curl -X DELETE 'https://example.com/v1/settings/api-keys/497f6eca-6276-4993-bfeb-53cbbbba6f08'Example Response
Empty
PUT
HTTPBearerheader
AuthorizationBearer <token>application/json- body
current_password*Current PasswordLength
1 <= length <= 128new_password*New PasswordLength
8 <= length <= 128Successful Response
curl -X PUT 'https://example.com/v1/settings/password' \ -H 'Content-Type: application/json' \ -d '{ "current_password": "string", "new_password": "stringst"}'Example Response
Empty
PUT
HTTPBearerheader
AuthorizationBearer <token>application/json- body
display_name?|nullSuccessful Response
application/json- response
created_at*Created AtFormat
date-timecustomer_id*Customer Iddisplay_name?string|nullemail*Emailemail_verified*Email Verifiedis_admin*Is Adminlast_login?|nulloauth_providers?array<string>Default
[]tenant_id*Tenant Idcurl -X PUT 'https://example.com/v1/settings/profile' \ -H 'Content-Type: application/json' \ -d '{}'Example Response
{ "created_at": "2019-08-24T14:15:22Z", "customer_id": "string", "display_name": "string", "email": "string", "email_verified": true, "is_admin": true, "last_login": "2019-08-24T14:15:22Z", "oauth_providers": [], "tenant_id": "string"}