
# Listar las claves de firma

`GET /v1/signing-keys` · permiso `signing-keys:read`

Devuelve las claves de firma de tokens publicadas actualmente en el JWKS del entorno: `next` (publicada, aún no firma), `active` (firma los tokens nuevos) y `retired` (dejó de firmar; sigue publicada 7 días para que los tokens que firmó sigan verificándose). El orden es `next`, `active` y luego `retired` (de la más reciente a la más antigua). No se devuelven las claves que salieron del JWKS ni las revocadas por una rotación de emergencia. La respuesta solo contiene información pública: `kid` es la huella JWK SHA-256 de RFC 7638 (base64url) y ninguna respuesta contiene material de clave privada, que nunca sale del servicio de firma.

## Solicitud

Esta operación no recibe campos de ruta, consulta ni cuerpo. El entorno proviene de la credencial.

## Respuesta

`200 OK` con `data` (claves) y `list_metadata`. La lista es tan pequeña como el JWKS y no se pagina; ambos cursores son siempre `null`. `activated_at` es `null` en la clave `next`; `retired_at` y `removal_at` (cuándo sale la clave del JWKS) solo tienen valor en las claves `retired`.

```json
{
  "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
  }
}
```

## Errores

| HTTP | código | Cuándo |
|---|---|---|
| 401 | `unauthenticated` | La credencial falta, es inválida o ha sido revocada. |
| 403 | `insufficient_permissions` | La credencial carece del permiso requerido. |
| 429 | `rate_limited` | Se superó el límite de velocidad; reintente después del período `Retry-After`. |
| 501 | `not_implemented` | La operación aún no está disponible en este despliegue; reintentar no cambia el resultado. |
| 503 | `service_unavailable` | Una dependencia no está disponible temporalmente; reintente después del período `Retry-After`. |

## Ejemplo

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