
# Revoke an API key

`POST /v1/api-keys/{key_id}:revoke` · permission `api-keys:write` · optional `Idempotency-Key`

Revokes a key immediately. Revocation cannot be undone; the key is rejected within 30 seconds at the latest. A rotated key whose overlap has not ended is revoked at once as well. A key created in the dashboard, and every key rotated from it, can be revoked only by itself or in the dashboard (`permission_escalation`).

## Request

| Parameter | In | Description |
|---|---|---|
| `key_id` | path | API key id (`key_…`). |

Body:

The body is optional; without it all defaults apply.

| Field | Type | Description |
|---|---|---|
| `reason` | string | Optional. `manual` (default) or `leaked`. |

## Response

`200 OK`. The key object with `revoked_at` and `revoke_reason` set.

```json
{
  "id": "key_0000000000000000000000001z",
  "name": "ci",
  "type": "restricted",
  "permissions": ["users:read"],
  "allowed_cidrs": [],
  "last4": "xxxx",
  "created_by": "key_…",
  "created_at": "2026-10-01T10:00:00Z",
  "expires_at": "2027-10-01T10:00:00Z",
  "last_used_at": null,
  "last_used_ip": null,
  "rotated_from": null,
  "revoked_at": "2026-10-02T10:00:00Z",
  "revoke_reason": "leaked"
}
```

## Errors

| HTTP | `code` | When |
|---|---|---|
| 401 | `unauthenticated` | The key is missing, invalid or revoked. |
| 403 | `insufficient_permissions` | The key lacks the required permission. |
| 403 | `permission_escalation` | The request would give a key more permissions, a wider network range or a later expiry than the calling key has, a `restricted` key tries to create, rotate or revoke beyond its own permissions, or another key tries to rotate or revoke a key created in the dashboard. |
| 404 | `not_found` | The key does not exist in this environment. |
| 409 | `conflict` | The key is already revoked. |
| 422 | `validation_failed` | The body is invalid: `reason` is not `manual` or `leaked`. |

## Example

```bash
curl -X POST "https://api.eu.keenauth.com/v1/api-keys/key_0000000000000000000000001z:revoke" \
  -H "Authorization: Bearer $KEENAUTH_SECRET_KEY" \
  -H "Content-Type: application/json" \
  -d '{"reason":"leaked"}'
```
