The header
Every request carries one header:About your key
A key looks likeprv_ac2c1565a967b98e_XmK2.... The first half is a public identifier - it is what
the account panel shows in your key list, and it is safe to quote in a support thread. The second
half is the secret, and it is shown exactly once, at issuance. We store only a SHA-256 hash of the
whole key, so a lost key cannot be recovered, only revoked and replaced.
Send the key server-side only. Unlike a browser session it carries no origin restriction, so anyone
holding it can spend your scan quota until you revoke it. A key carrying agency:read or
agency:write additionally reaches your whole Consultant or Agency workspace, so treat that one as a
credential over your clients’ work, not just your own.
Validity rules
- Scopes: keys carry scopes. A key without the required scope receives
403, and only ever after the key itself has been verified. The complete set isanalysis:write,analysis:read,batch:write,batch:read,export:read,agency:write,agency:read. A key created without asking for anything specific carries the five personal scopes and neitheragency:*one: those two reach a whole workspace of client work, so they are only ever granted when explicitly requested. Ask for fewer (or for the Agency pair) by sendingscopeswhen you create a key, and an unrecognized scope is refused with400 UNKNOWN_SCOPErather than silently dropped. The twoagency:*scopes gate the Agency routes only, and they reach the whole workspace rather than the calling account - see Agency reach before granting them. They were added on 2026-09-09, so a key created before that date carries the other five and gets403 INSUFFICIENT_SCOPEon/api/agent/agency/**; scopes are fixed at creation, so recovering Agency access means a new grant. Neither route to one is unconditional: reconnecting the client works on any plan, free included, but only if that client rebuilds its scope request from our discovery document rather than replaying a cached one, so check the consent screen lists the Agency permissions before approving - reconnecting revokes the current key either way. Creating a new key by hand cannot silently fail, but it needs either a paid personal plan or membership of a Consultant or Agency workspace with an active subscription. - Revocation: revoking a key from the account panel takes effect on the next request.
- Failed auth always returns a stable
{ "error", "code" }JSON envelope - see Errors. - Repeated failures from one IP are rate limited; successful calls are limited per account instead, shared across every key you hold - see Quotas and billing.
The API playground in these docs makes real calls. Paste your key into the authentication field
and “Send” works exactly like curl - including spending quota on a
deep scan.