A valid request URL is required to generate request examples{
"keys": [
{
"kty": "EC",
"crv": "P-256",
"x": "f83OJ3D2xF1Bg8vub9tLe1gHMzV76e8Tus9uPHvRVEU",
"y": "x_FEzRu9m36HLN_tue659LNpXW6pCyStikYjKIWI5a0",
"kid": "6f1c…",
"alg": "ES256",
"use": "sig"
}
]
}{
"error": {
"code": "forbidden",
"message": "your role does not allow this action"
}
}{
"error": {
"code": "forbidden",
"message": "your role does not allow this action"
}
}Fetch an environment's public keys
The public half of the verification path: the JWKS document your backend checks session JWTs against.
Addressed by publishable key — the one identifier your backend already holds in config — rather than by an internal id you would have to look up. Public and unauthenticated by design: these are public keys. There is no Origin gate either, because the caller is a server and servers send no Origin.
The response carries Cache-Control: public, max-age=300, stale-while-revalidate=86400, stale-if-error=86400. That is deliberate, and the two stale directives answer two different failures: stale-while-revalidate lets a cache keep answering while a refetch is slow, and stale-if-error lets it keep answering when a refetch fails — which is the minute the whole arrangement exists for. A verifier must keep verifying through our bad day; the stale window is the signing key’s grace window, so a cache serving a document that old still verifies every token anybody could present.
Keys are minted on first read, so the document is never empty for a configured environment. When JWT minting is unavailable on the server, the answer is an empty key set rather than an error — the JWKS shape stays valid.
Rate limited to 120 requests per minute per IP; a backend may poll it.
A valid request URL is required to generate request examples{
"keys": [
{
"kty": "EC",
"crv": "P-256",
"x": "f83OJ3D2xF1Bg8vub9tLe1gHMzV76e8Tus9uPHvRVEU",
"y": "x_FEzRu9m36HLN_tue659LNpXW6pCyStikYjKIWI5a0",
"kid": "6f1c…",
"alg": "ES256",
"use": "sig"
}
]
}{
"error": {
"code": "forbidden",
"message": "your role does not allow this action"
}
}{
"error": {
"code": "forbidden",
"message": "your role does not allow this action"
}
}