readyDocs Open the appOpen the app

API keys

Create and revoke the keys that sign your requests. How to send a key with a request: Authentication. Test keys aren’t managed here: see Test keys.

#Rotating a key

  • 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 API key object

idinteger
The key’s id. Use it to delete the key.
namestring
Your label for the key.
key_prefixstring
The key’s first characters.
last4string
The key’s last four characters. Not in the create response.
kindstring
mcp for a key made when you connected an AI app, otherwise live. Not in the create response.
created_atstring
When the key was made, ISO 8601.
last_used_atstring | null
When the key was last used. null until it’s used, and it can be up to 60 minutes behind.
keystring
The full key, starting rsms_. Only in the create response; it can’t be shown again.

#List API keys

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.

Returns a list of API key objects in data.

#Create an API key

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.

Parameters

namestringDefault API Key
A label to tell your keys apart.

Returns an API key object in data, with the full key.

Errors
HTTPCodeWhen
400invalid_requestname isn’t text, or is longer than 100 characters.
500no codeThe key wasn’t made. Nothing to clean up; retry.
503no codeThe key may have been made but couldn’t be confirmed. List your keys before you retry.

#Delete an API key

Turns a key off. It stops working on the next request. Needs the account owner’s or an admin’s key.

Parameters

idinteger · pathRequired
The key’s id from List API keys. With X-Sub-Account-Id, one of the sub-account’s keys.

Returns { "success": true }.

Errors
HTTPCodeWhen
400invalid_requestid isn’t a whole number.
404api_key_not_foundNo live key with that id on this account, or it was already deleted.
503api_key_revoke_failedCouldn’t confirm the key is off. List your keys, then retry.

#List keys across sub-accounts

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
HTTPCodeWhen
403sub_account_scope_forbidden, organization_onlyThe key’s user isn’t the owner or an admin of the main account, or can’t see sub-accounts.
422too_many_sub_accounts, too_many_api_keysToo many sub-accounts or keys for one list. Call List API keys with X-Sub-Account-Id for each sub-account instead.
503api_keys_unavailableThe keys couldn’t be read. Retry.

#List failed requests

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.
has_moreboolean
Whether there is another page.
Errors
HTTPCodeWhen
400invalid_requestkey_id, before or limit isn’t a whole number above 0.
503api_failures_unavailableThe list couldn’t be read. Retry.