
# Listar los bloqueos de cuenta

`GET /v1/attack-protection/lockouts` · permiso `attack-protection:read`

Lista los bloqueos de cuenta abiertos del entorno, del más antiguo al más reciente. La protección contra fuerza bruta bloquea una vía de inicio de sesión de un usuario (por ejemplo `password` o `totp`) después de demasiados fallos; las demás vías del usuario siguen abiertas. Un bloqueo que ya expiró no aparece en la lista, porque ya no bloquea la vía. La lista pagina solo hacia adelante y no devuelve un total. La respuesta no contiene ninguna dirección IP ni ninguna clave del contador de fallos.

## Solicitud

| Parámetro | En | Obligatorio | Descripción |
|---|---|---|---|
| `limit` | query | no | Elementos por página, de 1 a 100 (predeterminado 20). |
| `after` | query | no | Cursor de `list_metadata.after` de la página anterior. |

`before` y `order=desc` no se admiten y devuelven `422`.

## Respuesta

`200 OK`.

```json
{
  "data": [
    {
      "id": "lck_01jaz8m5c3f6t9w2y4b7d0g3k6",
      "user_id": "usr_0a1b2c3d4e5f6g7h8j9k0m1n2p",
      "path": "password",
      "locked_at": "2026-10-20T09:00:00Z",
      "expires_at": "2026-10-20T09:15:00Z",
      "failure_count": 20
    }
  ],
  "list_metadata": {"before": null, "after": null}
}
```

| Campo | Descripción |
|---|---|
| `id` | Id del bloqueo, con el prefijo `lck_`. El evento `user.unlocked` incluye el mismo id. |
| `user_id` | El usuario bloqueado. |
| `path` | La vía de inicio de sesión bloqueada: `password`, `totp`, `sms_2fa`, `email_2fa`, `otp` o `recovery_code`. |
| `locked_at`, `expires_at` | Cuándo empezó el bloqueo y cuándo termina por sí solo. |
| `failure_count` | Intentos fallidos en la ventana que causó el bloqueo. |

## Errores

Cada error es un cuerpo `application/problem+json` con un `code` estable.

| HTTP | `code` | Cuándo |
|---|---|---|
| 400 | `invalid_cursor` | El cursor está mal formado o pertenece a otra lista. |
| 422 | `validation_failed` | `limit` está fuera de rango, o se envió `before` o un `order` descendente. |
| 401 | `unauthenticated` | Falta la clave de API, no es válida o está revocada. |
| 403 | `insufficient_permissions` | La clave no tiene el permiso `attack-protection:read`. |
| 429 | `rate_limited` | Se superó el límite de frecuencia; respete `Retry-After`. |
| 503 | `service_unavailable` | Una dependencia no está disponible temporalmente; reintente más tarde. |

## Ejemplo

```bash
curl https://api.eu.keenauth.com/v1/attack-protection/lockouts?limit=50 \
  -H "Authorization: Bearer $KEENAUTH_SECRET_KEY"
```

CLI: `keenauth attack-protection lockouts list --limit 50`
