A secret exists once
A key is hashed with SHA-256 before storage and shown a single time. A copy of the database carries nothing worth stealing.
A scoped, versioned API for anything we later want to script.
Growth-OS can issue API keys with scopes, per-minute limits and versioned endpoints. One endpoint is published today, for projects, and nothing in our daily work depends on it. It is here so that connecting a script or another internal tool later is a configuration change rather than a project of its own.
Product example
This is the same visual component used by the authenticated app, rendered with deterministic sample data.
The real API key, quickstart, endpoint and delivery views, side by side.
Inert sample data · no network access
Preview ready
Highlights
A key is hashed with SHA-256 before storage and shown a single time. A copy of the database carries nothing worth stealing.
The key, its scope and its per-minute allowance are verified before a request reaches feature code.
Each endpoint registers its version, stability and retirement dates, so changing it is a decision rather than a surprise for whatever depends on it.
Without a shared foundation, every team rebuilds these edge cases, differently.
A hand-rolled key table usually stores the secret itself. One copied backup and every key is compromised at once. Storing only a hash means there is nothing there to leak.
An endpoint ships with no version, something starts depending on every field in the response, and now every change is a breaking change. Declared versions and retirement dates keep that conversation possible.
A script with a bug hammers the API and everything else slows down. Adding limits to a live API afterwards is painful, so keys carry a per-minute allowance from the 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 once. If it is 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 rather than remembered.
Requests pass three gates
The server verifies the key, checks its scope and reserves rate-limit quota. Only then does the handler touch data.
Keys retire rather than vanish
Revoking stamps a timestamp instead of deleting the row. The key stops working immediately and the history of what it did survives.
Engineering guarantees
The key shown in the preview is fake and authenticates nowhere. Real secrets are minted only inside authenticated admin commands, and test and live keys are separated by prefix so one can never be used in place of the other.
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.