List account lockouts
GET /v1/attack-protection/lockouts · permission attack-protection:read
Lists the environment's open account lockouts, oldest first. Brute force protection locks one sign-in path of a user (for example password or totp) after too many failures; the user's other paths stay open. A lockout that has expired is not listed, because it no longer blocks the path. The list pages forward only and returns no total count. The response holds no IP address and no failure counter key.
Request
| Parameter | In | Required | Description |
|---|---|---|---|
limit |
query | no | Items per page, 1-100 (default 20). |
after |
query | no | Cursor from list_metadata.after of the previous page. |
before and order=desc are not supported and return 422.
Response
200 OK.
{
"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}
}
| Field | Description |
|---|---|
id |
Lockout id, prefixed lck_. The user.unlocked event carries the same id. |
user_id |
The locked user. |
path |
The locked sign-in path: password, totp, sms_2fa, email_2fa, otp or recovery_code. |
locked_at, expires_at |
When the lockout started and when it lifts by itself. |
failure_count |
Failed attempts in the window that caused the lockout. |
Errors
Every error is an application/problem+json body with a stable code.
| HTTP | code |
When |
|---|---|---|
| 400 | invalid_cursor |
The cursor is malformed or belongs to another list. |
| 422 | validation_failed |
limit is out of range, or before or a descending order was sent. |
| 401 | unauthenticated |
The API key is missing, invalid or revoked. |
| 403 | insufficient_permissions |
The key lacks the attack-protection:read permission. |
| 429 | rate_limited |
The rate limit was exceeded; honor Retry-After. |
| 503 | service_unavailable |
A dependency is temporarily unavailable; retry later. |
Example
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