Authentication

Bearer keys, the scopes they carry, and what no key can do.

Getting a key

Keys are created in the workspace, under Developers. The plaintext is shown once, at creation, and is not recoverable afterwards — store it before you close the dialog. Creating, rotating and revoking a key each write an audit row, readable through the audit endpoint below. A request with no key, or with a key TAVONEL did not issue, is refused with 401 and the code AUTH_REQUIRED: that is the first error most integrations see, and it means the credential rather than the request.

Sending the key

Send the key as a bearer token. Keys are workspace-scoped and carry an explicit scope set; a request outside its scopes is refused with 403 and API_SCOPE_REQUIRED rather than silently returning less.

Every request
curl -sS https://tavonel.com/api/v1/documents -H "Authorization: Bearer $TAVONEL_API_KEY"

The scopes a key can hold

ScopeGrants
documents:readList documents and read their processing state.
documents:intakeRequest upload capabilities and register document versions.
collections:readRead compile jobs, corpora and compiled packages.
collections:compileStart compiles, answer blockers, cancel a run.
collections:downloadDownload the signed knowledge package.
worlds:readRead the active World, its objects, relations and evidence.
ask:readGrounded answers and hybrid retrieval over the active World.
connections:readRead connection state and cursors.
connections:writeCreate and revoke connections.
connections:syncAdvance a connection cursor and collect what changed.

How often you may call

Every scoped request consumes one unit of a per-minute allowance held per key and per scope. The window is a clock minute rather than a rolling one, so an allowance that is spent is free again at the top of the next minute. The per-scope numbers are on the Billing and limits page, printed from the same values the authorizer enforces.

Note Over the allowance the answer is 429 with API_RATE_LIMITED. No Retry-After header is sent on that code today and no X-RateLimit-* headers are published — waiting for the next clock minute is sufficient by construction, and documenting a header we do not send would be worse than documenting the window. The separate hourly allowance on World activation, rollback and retrieval-index rebuild answers ACTIVATION_RATE_LIMITED and does carry Retry-After.

Rotating a key, and reading the audit trail

Rotation is atomic: a replacement key is created, the source key is revoked and an audit event is written, or none of the three happened. There is no window in which the old key is dead and no replacement exists. Both operations take a signed-in browser session — a developer API key cannot call them, which is the same boundary activation sits behind.

POST/developer/keys/{id}/rotate

Atomically creates a replacement key, revokes the source key and writes an audit event. Plaintext is returned once and is not recoverable afterwards. Either all three happened or none did — there is no state where the old key is revoked and no replacement exists.

# Browser session only. A developer API key is refused on this route.
curl -sS -X POST https://tavonel.com/api/v1/developer/keys/{id}/rotate \
  -H "Authorization: Bearer $TAVONEL_SESSION_JWT"
StatusResponse
201The one-time replacement credential. Store it now; it is not shown again.
400API_KEY_ID_INVALID — The key id was not a UUID. API_KEY_INPUT_INVALID — The rotation body did not validate. INVALID_JSON — The body was not parseable JSON.
401AUTH_REQUIRED — No credential was presented, or the bearer token is not a key TAVONEL issued. This is what an unauthenticated request to any scoped route returns.
402TRIAL_FEATURE_NOT_INCLUDED — The operation — key rotation among them — is not in the free evaluation.
404API_KEY_NOT_FOUND — No such key in this workspace.
413REQUEST_TOO_LARGE — The JSON body exceeded the route's bound.
503API_KEY_ROTATE_FAILED — The rotation could not be completed. API_KEY_CREATE_FAILED — The replacement key could not be written, so nothing was revoked either. DEVELOPER_AUDIT_WRITE_FAILED — An audit event could not be written, so the action it describes was refused. Every key create, rotate and revoke writes an audit row or does not happen.
GET/developer/audit

The tenant-scoped developer and connector audit trail, newest first, bounded by `limit`. Every key create, rotate and revoke writes a row here or does not happen.

# Browser session only. A developer API key is refused on this route.
curl -sS -X GET https://tavonel.com/api/v1/developer/audit \
  -H "Authorization: Bearer $TAVONEL_SESSION_JWT"
StatusResponse
200{ code: OK, events }, newest first.
400AUDIT_LIMIT_INVALID — The audit limit was outside its range.
401AUTH_REQUIRED — No credential was presented, or the bearer token is not a key TAVONEL issued. This is what an unauthenticated request to any scoped route returns.
503DEVELOPER_AUDIT_READ_FAILED — The audit trail could not be read. DEVELOPER_STORE_NOT_CONFIGURED — The developer store is not configured.

What no key can do

Note Activation, rollback and destructive workspace actions are human-session-only. There is no scope that grants them, which is why you will not find one in this table.

API version 2026-09-02.1 · reviewed 11 September 2026

Something here out of date or wrong? Report an issue with this page.