Bearer tokens
All API requests require anAuthorization header:
Key format
inf_live_9f2c41ab7de05683c1a4bb90e7f35d2c86740aa19be3cd57f082e416b9d3ca75
The dashboard shows only the first 16 characters of a stored key (inf_live_ plus
seven), which is enough to tell two keys apart and not enough to use one.
Scope
Each key is scoped to one workspace. The key itself resolves to a workspaceId on every request — you don’t pass it in the URL or body.

Keys in the dashboard: what each one is allowed, and when it was last used
Quotas on a key
A key inherits quotas from (in cascade):- Platform defaults
- Your subscription plan
- Your member preset (the person who created the key)
- Key-specific preset (optional override)
Scope-limited keys
You can attach a preset to limit:allowedModels— e.g.['gpt-4o', 'claude-opus-4-6']maxRequestsPerMinute— e.g. 30 for a staging keymaxBudgetCredits(paired with abudgetPeriodof hourly/daily/weekly/monthly) — e.g. 2 000 credits/month for a CI runner
Revoking a key
API Keys → key row → Revoke. Takes effect immediately — the gateway checks key status on every request rather than from a cache. Requests made with the revoked key return:Rotating
Create the new key, update your app, then revoke the old one. We don’t support automatic rotation — keys are explicit to make audit trails clean.Key health
Each key row shows:- Last used — timestamp of the last successful request (the IP is recorded server-side but not surfaced in the dashboard)
- Status — active / expired / revoked
- Expires at — if you set an expiry at creation
- Quota preset — the attached preset, if any
Internal service tokens
Our control plane (apps/api) talks to the gateway with a special internal token prefixedinf_internal_. You cannot create or use these from client code — they’re server-to-server only.