The dashboard lists your keys in Settings → Developers → API keys, leaving out the key made when you connect an AI app (named MCP Connection). Create key, or New key on a live key’s row, makes another key; the old one keeps working until you revoke it. On a test key the button is Replace, and it does replace the key. Each key has its own Revoke. A key made for an AI app isn’t in this list: revoke the app under Connected apps on the same page. Switch everything to the new key, then revoke the old one.
Over the API, POST /v1/api-keys adds a key and the keys you already have keep working until you delete them. The dashboard shows a key you added this way too, as the newest key or as an older one: list your keys to see them all.
The account’s live keys, newest first, without their secrets. Revoked keys and the test key aren’t listed. With X-Sub-Account-Id it lists the sub-account’s keys.
Makes a new live key. Your other keys keep working until you delete them. The full key is in this response only: store it now. Needs the account owner’s or an admin’s key. With X-Sub-Account-Id the key belongs to that sub-account and can only ever act as it, so give each sub-account its own key this way.
Every live and test key of your main account and each of its sub-accounts, without their secrets. Needs the account owner’s key or an admin’s key on the main account. To make or delete a sub-account’s key, call Create or Delete with X-Sub-Account-Id.
Returns a list of API key objects in data, each with three more fields:
sub_account_idinteger
The account the key belongs to.
sub_account_namestring | null
That account’s name.
mainboolean
true for a key of the main account.
kind is live, test or mcp here.
Errors
HTTP
Code
When
403
sub_account_scope_forbidden, organization_only
The key’s user isn’t the owner or an admin of the main account, or can’t see sub-accounts.
422
too_many_sub_accounts, too_many_api_keys
Too many sub-accounts or keys for one list. Call List API keys with X-Sub-Account-Id for each sub-account instead.
The requests made with your keys that got an error back (any 4xx or 5xx but 401), newest first, for the last 90 days. The same error on the same path is listed once a minute, so a retry loop shows as one row a minute, not one per request. Revoked keys’ requests are included. Phone numbers, emails and tokens are taken out of the error text, and the text is cut at 300 characters. Requests refused before we read your key (429 RATE_LIMITED, 503 ADMISSION_SHED, 413, INVALID_JSON) are not listed here; read the status and Retry-After on the response.
Parameters
qstring · query
Text to look for in the method, path, status, error code, error or request id. Up to 100 characters.
key_idinteger · query
Only this key’s requests. A key that isn’t yours gives an empty list.
beforeinteger · query
For the next page: the last id you got.
limitinteger · queryDefault 50Max 200
Page size.
Returns
data[]object[]
id, created_at, method, path, status, error_code, error, response (the error sentence and code you got, as success, error, error_code and code; other fields of the original body are not kept), request_id, key (id, name, prefix, last4, revoked), account_id and account_name.