Listar eventos de auditoría
GET /v1/audit-events · permiso audit-events:read
Lista los registros de auditoría del entorno con paginación por cursor, del más reciente al más antiguo. El flujo admin contiene los cambios realizados mediante la API de gestión, el panel de control y la plataforma; el flujo application contiene los eventos que escribió su aplicación. Cada registro forma parte de una cadena de hash por entorno y flujo, por lo que el historial puede verificarse de forma independiente con una exportación (POST /v1/audit-exports).
El entorno siempre se obtiene de la clave de API; no existe un parámetro de entorno.
Solicitud
| Parámetro | En | Obligatorio | Descripción |
|---|---|---|---|
limit |
query | no | Tamaño de página, de 1 a 100. Por defecto, 20. |
after |
query | no | Cursor opaco de list_metadata.after (registros más antiguos). Excluyente con before. |
before |
query | no | Cursor opaco de list_metadata.before (registros más recientes). Excluyente con after. |
stream |
query | no | admin (por defecto) o application. |
from |
query | no | Hora RFC 3339; registros en esa hora o posteriores. Por defecto, la más tardía entre el inicio del periodo de retención y to menos 92 días. |
to |
query | no | Hora RFC 3339; registros anteriores a ella. Por defecto, el momento actual. El intervalo entre from y to es de 92 días como máximo. |
action |
query | no | Prefijo de acción, como user. o connection.updated. |
category |
query | no | authentication, session, token, administration, provisioning, federation, authorization, data_access, security, key_management, configuration o application. |
actor_type |
query | no | Tipo de actor, como api_key, dashboard_user, m2m_client, agent o system. |
actor_id |
query | no | Id exacto del actor tal como se registró (key_…, usr_…, system:<service>). |
target_type |
query | no | Tipo de objetivo, como user, organization o audit_export. |
target_id |
query | no | Id exacto del objetivo. Con target_type, ambos deben coincidir con el mismo objetivo. |
org_id |
query | no | Registros sobre una organización (org_…). |
outcome |
query | no | success, failure, denied o error. |
request_id |
query | no | Idp-Request-Id de una petición (UUID). |
correlation_id |
query | no | Idp-Correlation-Id de un flujo de trabajo (UUID). |
agent_only |
query | no | true devuelve solo las acciones de agentes: actor_type agent o un act_chain no vacío. |
client |
query | no | Tipo de cliente que realizó la llamada: mcp (el servidor MCP de gestión, metadata.client = mcp/<version>) o cli (la CLI de KeenAuth, cli/<version>). El cliente declara este valor por sí mismo; no es una prueba de quién actuó, para eso está el actor del registro. Solo para listados: una exportación no tiene filtro client. |
Los registros siempre se ordenan por occurred_at (y luego por id), del más reciente al más antiguo; no existe un parámetro order (se acepta order=desc, cualquier otro valor falla con validation_failed). Un cursor solo es válido con los filtros y el entorno para los que se emitió. No se devuelve un recuento total.
Una búsqueda que tarde más de 10 segundos se detiene con 422 search_too_broad: restrinja los filtros o el intervalo de tiempo, o use una exportación para intervalos grandes.
Respuesta
200 OK. data contiene los registros de la página; list_metadata.after apunta a registros más antiguos y list_metadata.before a registros más recientes (null cuando no hay ninguno). Los campos vacíos son null.
ip y user_agent solo aparecen cuando la clave tiene el permiso audit-events:read_ip, y solo se rellenan para registros de menos de 13 meses. Sin ese permiso, los campos se omiten por completo (no se devuelve ningún valor enmascarado). ip_prefix, ip_country, ip_asn y user_agent_family siempre se devuelven. prev_hash, org_prev_hash y record_hash son valores SHA-256 en base64url sin relleno.
{
"data": [
{
"id": "evt_01j9xk3m7q8r2s4t6v8w0y2z4a",
"stream": "admin",
"seq": 4182,
"schema_version": 1,
"action": "user.blocked",
"category": "administration",
"outcome": "success",
"reason_code": null,
"occurred_at": "2026-10-01T08:15:42.120Z",
"received_at": "2026-10-01T08:15:42.131Z",
"recorded_at": "2026-10-01T08:15:42.140Z",
"clock_anomaly": false,
"actor_type": "api_key",
"actor_id": "key_01j9xk3m7q8r2s4t6v8w0y2z4d",
"act_chain": null,
"session_id": null,
"auth_context": null,
"elevation_ref": null,
"org_id": null,
"targets": [
{"type": "user", "id": "usr_0a1b2c3d4e5f6g7h8j9k0m1n2p", "org_id": null, "name": null}
],
"application_id": null,
"ip_prefix": "203.0.113.0/24",
"ip_country": "DE",
"ip_asn": 64500,
"user_agent_family": "keenauth-go",
"request_id": "0192a6c1-7d3e-7a10-9b2c-3d4e5f607182",
"correlation_id": null,
"trace_id": "4bf92f3577b34da6a3ce929d0e0e4736",
"producer_service": "directory",
"policy_ref": "perm:users:write",
"changes": {"status": {"old": "active", "new": "blocked"}},
"metadata": null,
"prev_hash": "n4bQgYhMfWWaL-qgxVrQFaO_TxsrC4Is0V1sFbDwCgg",
"org_prev_hash": null,
"record_hash": "LCa0a2j_xo_5m0U8HTBBNBNCLXBkg7-g-YpeiGJm564"
}
],
"list_metadata": {
"before": null,
"after": "<opaque cursor>"
}
}
Errores
Cada error es un cuerpo application/problem+json con un code estable.
| HTTP | code |
Cuándo |
|---|---|---|
| 400 | invalid_cursor |
El cursor tiene un formato incorrecto o no se emitió para esta petición. |
| 400 | invalid_filter |
El servicio de auditoría rechazó un filtro, por ejemplo un intervalo de más de 92 días. |
| 400 | range_outside_retention |
from o to están fuera del periodo de retención de auditoría de su plan. |
| 422 | validation_failed |
Un parámetro de consulta no es válido (limit fuera de rango, marca de tiempo incorrecta, to no posterior a from, stream, category u outcome desconocidos, id con formato incorrecto, parámetro repetido, order distinto de desc). |
| 422 | search_too_broad |
La búsqueda tardó más de 10 segundos; restrínjala. |
| 401 | unauthenticated |
Falta la clave de API, no es válida o ha sido revocada. |
| 403 | insufficient_permissions |
La clave no tiene audit-events:read. |
| 429 | rate_limited |
Se ha superado el límite de peticiones; respete Retry-After. |
| 503 | service_unavailable |
Una dependencia no está disponible temporalmente; reintente más tarde. |
Ejemplo
curl "https://api.eu.keenauth.com/v1/audit-events?action=user.&from=2026-10-01T00:00:00Z" \
-H "Authorization: Bearer $KEENAUTH_SECRET_KEY"
keenauth audit-events list --action user. --from 2026-10-01T00:00:00Z
Datos personales
Este endpoint contiene datos personales: eventos de auditoría. Datos personales en las API de KeenAuth describe qué se almacena, cuánto tiempo se conserva y cómo se elimina. No envíe categorías especiales de datos personales (salud, datos biométricos, religión, opiniones políticas, orientación sexual) en ningún campo.