Secrets stay secret
Keys are hashed before storage and shown exactly once. Even a leaked backup has nothing worth stealing.
Give your customers API keys without building the scary parts yourself.
Your customers get real API keys with scopes, limits, and versioned endpoints. Secrets are shown once and stored hashed, so a leaked database can't leak keys. Every request is checked before your code even runs.
Product example
This is the same visual component used by the authenticated app, rendered with deterministic sample data.
Explore the actual API key, quickstart, endpoint, and delivery components together.
Inert sample data · no network access
Preview ready
Highlights
Keys are hashed before storage and shown exactly once. Even a leaked backup has nothing worth stealing.
The key, its scope, and its rate limit are all verified before any customer data is touched.
Every endpoint declares its version and retirement dates up front, so you can evolve your API without surprise breakage.
Without a shared foundation, every team rebuilds these edge cases — differently.
Hand-rolled key tables tend to store secrets you can read back. One leaked backup, and every customer's key is compromised at once. Here only hashes are stored, so there is nothing to steal.
You ship an endpoint with no versions. Customers build on every response field. Now every change is a breaking change, and every release turns into a support fire.
A customer's runaway loop hammers your API, and everyone else's requests crawl. Bolting rate limits onto a live API is painful. These keys ship with per-minute limits from the very first request.
The mechanism end to end, as implemented in the repository.
An admin creates a key
The secret is generated on the server, hashed, and shown exactly once. If it's lost, you revoke and reissue. Reading it back is deliberately impossible.
Endpoints declare their contract
Each route registers its version, request and response shapes, and rate-limit key before it ships, so compatibility is written down instead of tribal knowledge.
Requests pass three gates
The server verifies the key, checks its scope, and reserves rate-limit quota. Only then does your handler touch any data.
Keys retire, they don't vanish
Revoking stamps a timestamp instead of deleting the row. The key stops working immediately, and the audit trail survives.
Engineering guarantees
The key shown in the demo is a fake and works nowhere. Real secrets are only created inside authenticated server commands, and this feature stays switched off behind a gate until it's certified for your setup.
The boundary above is code, not a claim. These files carry the contract:
src/features/developer-platform/server.tssrc/server/api-key-auth.tssrc/registries/api-lifecycle.tssrc/routes/api/v1/projects.tsThese capabilities share contracts and boundaries with this one.
The docs describe the same contracts this page demonstrates.