Keys and Credentials
The three kinds of credential in play -- issued keys, your own provider credentials, and DevZero-provisioned managed keys -- and which one pays.
Keys and Credentials
There are two separate questions, and conflating them is the usual source of confusion:
- Who is calling? Answered by the credential on the inbound request -- an
issued
sk-dz-key, a DevZero access token, or your own provider credential. - Whose credential pays the provider? Answered by custody, resolved inside the control plane per request.
A request's payer is deliberately not derivable from its issued key, which is why the gateway stamps the arm that won onto every telemetry row.
Issued keys
The customer-facing credential for headless, CI and SDK traffic that carries no resolvable OAuth identity.
| Property | Detail |
|---|---|
| Format | sk-dz- plus 43 base62 characters. |
| Visibility | The plaintext token appears exactly once, on the response that issues it. Only its hash is stored. |
| Kind | runtime (the default, for inference) or management. Immutable after issue. |
| Scopes | A property of the key, set at issue time: keys:read, keys:write, usage:read, models:read. A key issued with no scopes holds all four. |
| Owner | A user, or empty for a service key. |
| Expiry | Optional. Unset means never. |
| Lifecycle | disabled is reversible; revoked is not. |
| Custody | managed, byok, or empty meaning auto. |
One credential type covers inference and management. What separates a management key from a runtime key is its kind and its scopes, not a different token format.
Your own provider credentials
The Provider keys screen holds your own provider credentials: the ones your traffic forwards with, and the read-only accounts your invoices are reconciled against. It has two sections -- Forwarding credentials and Reconciliation accounts -- because those are different jobs.
A credential row never contains plaintext or ciphertext. What you see is metadata plus a last-four mask, a status, when it was last tested and the error if it failed.
| Status | Meaning |
|---|---|
UNTESTED | Stored, never verified. |
OK | Verified live against the provider's own key-status read. |
INVALID | The provider rejected it. |
ERROR | The test could not complete. |
A team may hold several named credentials for one provider, with exactly one marked default.
BYOK: two tiers, and they are different axes
The Provider keys screen renders both tiers. A route that used to be called "BYOK" now redirects there.
Managed custody
DevZero can provision and hold the upstream key for a team. Enrolling a team mints one key on the upstream, stores its material in DevZero's encrypted credential store, and keeps a backstop spend limit pushed upstream.
| Property | Detail |
|---|---|
| Who enrolls | A team admin (a DevZero global admin also passes). Enrollment spends DevZero's upstream account. |
| Scope | Per team and per upstream. A team may hold a different credential per upstream. |
| Key material | Never appears on any response. |
| Rotation | Mints a fresh upstream key, overwrites the stored material, then deletes the old one. Your issued keys are untouched -- rotation is invisible to your callers. |
| Backstop | The upstream credit limit is a safety net (your budget plus a configured headroom). DevZero's own governance gate stays the primary enforcement. |
Managed custody is not available on every upstream, and that is a legitimate configuration rather than an error. It exists exactly where DevZero can provision a key on that upstream's own management API. An upstream without one is BYOK-only, refused by name at enrollment and at credential fetch, and the product can tell you so before you make a request rather than failing one.
Which credential paid: the custody ladder
On a keyed request the gateway does not hold the secret. It asks the control plane at forward time, and the control plane resolves:
- The key's explicit custody binding, if it has one. An explicit
byokormanagedbinding that cannot resolve is denied -- never moved onto the other party's credential. - Otherwise auto: your own credential where the team holds one for the decided upstream, the DevZero-provisioned one otherwise.
- As a last resort, the installation credential configured on the deployment itself. Where no credential is bound at all, unresolved custody fails closed rather than spending DevZero's account.
The arm that won is stamped on the telemetry row as byok, managed,
installation, or empty when nothing was forwarded. That column is the boundary
the managed-usage ledger uses to exclude customer-funded spend, and the ledger's
table refuses a BYOK row outright rather than filtering one out.
Every DevZero-funded credential on the keyed path is gated on a true allow -- a verified, non-shadow, non-stale authorization. A keyed request without one is forwarded with no credential at all and rejected by the upstream. So shadow mode, a control-plane outage replaying a stale allow, and a fail-open all cost $0 rather than billing DevZero's account.
Stored-response state operations are the one deliberate exception: they carry no model, run no router and are never gated, so no verdict exists to require, and they keep the connector credential -- without it, retrieving or deleting a stored response could not reach it.
DevZero access tokens
Besides an issued key, the gateway accepts a DevZero access token carrying
the inference scope, verified against DevZero's published signing keys. It
takes the same keyed connector route with team custody.
Arming this is deliberately environment-only and fixed at boot, both or neither: the issuer and the gateway's own audience identifier. A gateway that learned its issuer from a configuration sync would spend the window before the first tick forwarding DevZero tokens upstream as if they were provider keys.
Which shape a bearer token is, is decided on its issuer and never on "is it a
JWT". A foreign issuer keeps the passthrough untouched; a token naming DevZero's
issuer that fails any check is answered 401 with one generic body for every
cause, and is never forwarded onward. A verified token's carrier is stripped
regardless of the verdict -- it is a bearer for DevZero's own authorization
server, so leaking it to a model provider would be worse than leaking a provider
key.
Identity linking
The gateway observes vendor-side identities. The People screen's linking tab resolves them onto real people, so attribution names humans rather than opaque ids.
| State | Meaning |
|---|---|
DETECTED | Seen in traffic, not yet resolved to a person. |
AUTO_LINKED | Linked automatically on a high-confidence match. |
LINKED | Linked, explicitly. |
Suggestions carry the reason they were made: an exact email match, a domain match, or a name overlap. Linking can be done one at a time or in bulk, and can be undone.
SDKs
Calling the gateway from code -- the first-party TypeScript provider, and how every other language points its existing vendor SDK at the same endpoint.
Product Surfaces
The exact routes an issued key reaches, the wire shapes they speak, the model vocabulary they accept, and the fields they refuse.