keys.verifyKey, rejects bad keys with the right status, and puts the result on res.locals.unkey for your handlers.
Create a root key with the permissions listed on this page under Root Keys in the dashboard sidebar. CLI commands can instead use a session from unkey login with the required permissions. See Permission reference for every permission.
Create a root key and a keyspace
Open Root Keys in the dashboard sidebar and create a root key with Keep the
api.*.create_api, api.*.create_key, and api.*.verify_key. Put it in your server’s UNKEY_ROOT_KEY environment variable. Never send it to a browser or mobile app.Then create a keyspace, which holds your keys. Use Keyspaces (APIs) in the dashboard, or apis.createApi:create a keyspace
data.apiId from the response. You need it to create keys. See Root keys for more on root keys.Create a key for a user
Create a key from your backend when a user signs up or asks for one. Every field is described in Creating keys.
externalId links the key to the user, so verification tells you who’s calling. meta comes back on every verification. You get data.key only once: show it to the user and store only data.keyId.Verify the key in a middleware
The middleware the key once per request and puts the result on
res.locals.unkey. Routes that need extra permissions pass a permissions query.Keep next() outside the try. Otherwise an error in a route handler is caught here and answered as a 503 authentication failure.src/unkey.ts
src/server.ts
Handle the outcome codes
keys.verifyKey returns HTTP 200 for every outcome. Check data.valid, then data.code for the reason, and return the matching status from your API:Remaining credits are in
data.credits, and each checked rate limit is in data.ratelimits with remaining and reset. The call only fails with an HTTP error (which the SDKs throw) when the call itself is wrong, such as a bad root key or a malformed body. See Verifying keys for every field.