List signing keys

GET /v1/signing-keys · permission signing-keys:read

Returns the token signing keys currently published in the environment's JWKS: next (published, not signing yet), active (signs new tokens) and retired (stopped signing, stays published for 7 days so tokens it signed still verify). The order is next, active, then retired (newest first). Keys that left the JWKS and keys revoked by an emergency rotation are not returned. The response holds public information only: kid is the RFC 7638 JWK SHA-256 thumbprint (base64url) and no response ever contains private key material, which never leaves the signing service.

Request

This operation takes no path, query or body fields. The environment comes from the credential.

Response

200 OK with data (keys) and list_metadata. The list is as small as the JWKS and is not paginated, so both cursors are always null. activated_at is null for the next key; retired_at and removal_at (when the key leaves the JWKS) are set only for retired keys.

{
  "data": [
    {
      "kid": "ypeBEsobvcr6wjGzmiPcTaeG7_gUfE5yuYB3ha_uSLs",
      "use": "token_signing",
      "algorithm": "RS256",
      "state": "next",
      "storage": "wrapped",
      "created_at": "2026-09-05T09:30:00.123456Z",
      "activated_at": null,
      "retired_at": null,
      "removal_at": null
    },
    {
      "kid": "PiPoFgA5WUoziU9lZOGxNIu9egCI1CxKy3PurtWcAJ0",
      "use": "token_signing",
      "algorithm": "RS256",
      "state": "active",
      "storage": "wrapped",
      "created_at": "2026-03-09T09:30:00.123456Z",
      "activated_at": "2026-09-05T09:30:00.123456Z",
      "retired_at": null,
      "removal_at": null
    },
    {
      "kid": "Ln0sA6lQeuJl7PW1NWiFpTOTogKdJBOUmXJloaJa78Y",
      "use": "token_signing",
      "algorithm": "RS256",
      "state": "retired",
      "storage": "wrapped",
      "created_at": "2025-09-10T09:30:00.123456Z",
      "activated_at": "2026-03-09T09:30:00.123456Z",
      "retired_at": "2026-09-05T09:30:00.123456Z",
      "removal_at": "2026-09-12T09:30:00.123456Z"
    }
  ],
  "list_metadata": {
    "before": null,
    "after": null
  }
}

Errors

HTTP code When
401 unauthenticated The credential is missing, invalid or revoked.
403 insufficient_permissions The credential lacks the required permission.
429 rate_limited The rate limit was exceeded; retry after the Retry-After period.
501 not_implemented The operation is not available in this deployment yet; retrying does not change the result.
503 service_unavailable A dependency is temporarily unavailable; retry after the Retry-After period.

Example

curl https://api.eu.keenauth.com/v1/signing-keys \
  -H "Authorization: Bearer $KEENAUTH_SECRET_KEY"