Skip to main content
Spillway has two distinct kinds of API key, and they’re not interchangeable.

Provider key

Yours. The real sk-… from OpenAI, Anthropic, etc. Spillway stores it encrypted (AES-256-GCM) and uses it to call the provider on your behalf. Never returned to clients.

Virtual key

Spillway’s. An mk-live-… key you hand to whatever calls the gateway. Scoped to a team, model allow-list, and rate limits — never touches a real provider credential.

Provider keys

Add a provider key once per provider your org uses. All governed traffic to that provider routes through it.
apiKey is write-only — it’s encrypted on write and never echoed back by GET /api/provider-keys. A custom baseUrl isn’t accepted yet; custom upstreams go through the OpenAI-compatible adapter instead.

Virtual keys

A virtual key is what you actually distribute — to a service, a team, a script. It’s the credential the data plane (/v1/*) authenticates.
The plaintext key (mk-live-…) is returned once, at creation. Only its hash is stored — there’s no “reveal” later, only revoke-and-reissue.
A virtual key authenticates with Authorization: Bearer mk-live-… or x-api-key: mk-live-… — both are accepted, so either SDK convention works unmodified.

Where next

Budgets

Cap spend on a virtual key, team, org, or provider.

Teams & orgs

Organize keys under teams for attribution and chargeback.