Key format
Keys are 256-bit random strings. We store only a SHA-256 hash, so a key is shown exactly
once, at creation — if you lose it, revoke it and mint another. There is no “show again”.
Scopes
Grant the narrowest scope that does the job. Scopes are hierarchical:admin satisfies
write, which satisfies read.
If a key lacks the scope an endpoint needs, you get
403 INSUFFICIENT_SCOPE. The message
names the scope required and never the scopes granted — a stolen read key shouldn’t
double as a map of what else to try.
Expiry and rotation
A key can be created with an expiry of 30, 90 or 365 days, or none. An expired key behaves exactly like a revoked one —401 INVALID_TOKEN, no grace period.
To rotate without downtime:
1
Create the replacement
Same scopes, new key.
2
Deploy it
Roll it out everywhere the old key was used.
3
Confirm the old key is idle
The dashboard shows Last used per key, updated within a minute or so.
4
Revoke the old key
Effective on its next request.
When a key leaks
Revoke it in Settings → API keys. Revocation takes effect on the next request — there is no cache to wait out. What a leaked key can and cannot do:- It is bound to one organization. It cannot read another organization’s data, and cannot be widened.
- It carries only its own scopes. A
readkey cannot create or delete anything. - It cannot change billing, invite team members, alter branding, or read candidate workspace archives beyond the signed URLs the API already returns.
- It can read candidate names, emails and hiring reports within your organization —
treat a
readkey as personal data access, not merely metadata.