Authentication
One header, two kinds of credential, and why the capital letter matters.
Every request carries the same header:
Authorization: Bearer <token>
The capital letter matters
The prefix is matched exactly as Bearer (capital B, one space). bearer
abc or BEARER abc are rejected as if you had sent nothing at all:
{ "error": { "code": "unauthorized", "message": "Missing or malformed Authorization header." } }
It is the number one cause of a 401 on a credential that is perfectly valid.
Two token families
The prefix tells you what you are holding:
| Prefix | What it is | Acts as |
|---|---|---|
eel_sk_ |
A workspace API key | The workspace. There is no person behind it |
eel_at_ |
A connected app's access token | The person who authorized it |
eel_rt_ |
A connected app's refresh token | Nothing on its own. It only buys another eel_at_ |
The response shape never changes between them. What changes is which rows come back: a key sees what the workspace sees, a token sees what its person sees. That is covered in What each credential sees.
When it fails, and with what
| Situation | Code | Status |
|---|---|---|
| No header, or a malformed one | unauthorized |
401 |
| A token that does not exist, was revoked, or expired | unauthorized |
401 |
| A valid token missing the scope | forbidden |
403 |
| Too many requests | rate_limited |
429 |
A 403 on this API almost always means one thing: the credential lacks a scope, and the message names it.
What you will not see is a 403 for a record that exists but is not yours to read. That answers 404, indistinguishably from an invented id. See Shared rules.
Revocation takes up to a minute
A credential that has already been verified stays good for 60 seconds. Revoking a key, or letting one expire, can take that minute to take effect.
If you need access cut with certainty, revoke the credential and count that minute before treating the cut as done.