Authentication
How applications identify themselves, what scopes exist, and how to rotate keys without interrupting operations.
How applications identify themselves, what scopes exist, and how to rotate keys without interrupting operations.
All Nexora AI APIs authenticate via an API key. It goes along with every call in the apikey header:
curl https://api.nexora.example/v1/agents \
-H "apikey: $NEXORA_API_KEY"
There's no token endpoint, no expiry, and no refresh. That keeps integration simple - but it requires treating the key like a password.
Every integration is its own application. Each application has one or more keys attached to it.
Create at least two applications: one for the sandbox, one for production. Keeping both under one application means you can't selectively lock one down if there's a leak.
The key is shown exactly once at creation. After that it can't be read again, only replaced. Keep it in a secret store - not in version control, not in a ticket, not in a config file baked into an image.
What a key is allowed to do is attached to it. Grant only what the given process needs: a nightly import doesn't need read access to chargebacks.
| Scope | Allows |
|---|---|
agents:read | Query agent deployments and artifacts |
agents:write | Create, update, retire deployments, upload artifacts |
catalog:read | Query catalog entries and their status, download the record |
catalog:write | Generate and publish catalog entries |
requests:read | Query access requests, capability profiles and their scores |
requests:write | Maintain access requests, score requests |
sessions:write | Create, reschedule, cancel evaluation sessions |
estimates:read | Query cost estimates and comparable deployments |
chargebacks:read | View settlements and internal invoices |
If a scope is missing, the API responds with 403:
{
"code": "scope_missing",
"message": "The API key is missing a required scope.",
"details": [
{ "field": "catalog:write", "reason": "not_granted" }
]
}
A rotation without downtime works by overlapping - that's why an application allows several active keys:
last_used_at per key.Rotate on a schedule every 90 days, and immediately if a key ever ends up in a log, a ticket, or a repository. A revoked key stops working within seconds.