(Connected machines authenticate with their own daemon tokens, minted in the connect flow and valid only on daemon routes.)
Treat bearer tokens as opaque: store and send the complete value without
parsing its prefix, version, or checksum.
Using an API key
Send either key as a bearer token. This example uses a personal key because/me is a user-only endpoint:
401 with code unauthorized. A valid token used on something your roles don’t permit returns 403 — or 404 if you can’t even see the resource. Details in Errors.
Creating personal keys
Tokens are minted where a human can approve them — creating one is deliberately not possible with another API key:- Dashboard — go to API Tokens in the sidebar and click New token. The full token is shown once.
- Device login — for CLIs and dev tools, below.
Org API keys for services
Services shouldn’t run as a person — when that person leaves or their access changes, the integration breaks. An org API key is its own principal: it holds an org role (admin or member) and per-project roles, granted exactly like a member’s.
Create one in the dashboard: open API Tokens, switch to the Organization tab, and under Organization API tokens click New token. Pick a name and org role; the omnara_org_v1_… token is shown once. Then grant the key project roles from its detail panel — a member-role key sees nothing until you do, same as a human member.
Key management stays human-gated: creating, renaming, changing roles, and revoking all require a dashboard session, so one API key can never mint or escalate another. Listing and reading key metadata work with regular API auth (List org API keys). Revocation is permanent and drops the key’s org and project roles (Revoke).
Device login for CLIs
The device flow gets a token onto a machine where pasting secrets is awkward. It’s three steps: request a code, have the user approve it in a browser, poll for the token. These routes live under/api/auth (not /api/v1) and the first two need no authentication.
1. Start the flow:
client_name identifies the requesting client on the approval screen, while token_name names the resulting personal access token. When provided, both use the 64-character resource-name policy. Omitting either field or sending an empty value uses Device or Device login, respectively.
verification_uri_complete (or show user_code and point them at verification_uri). They sign in and approve — or deny — on the dashboard’s Approve device login page.
3. Poll for the token every interval seconds with the private device_code:
202:
slow_down means you’re polling too fast — back off to the returned interval.) On approval, 200 delivers a normal API key:
400 with "access_denied" or "expired_token". The resulting token is a regular personal access token for the approving user, named after token_name — it appears in their token list like any other.
Managing tokens
The API Tokens page — or List personal access tokens — shows your tokens with creation and last-used times, metadata only: the secret is never shown again.last_used_at tells you which tokens are actually alive; prune the rest, and revoke immediately if a token leaks — revocation is permanent.