Listar los registros de un usuario
GET /v1/users/{user_id}/logs · permiso logs:read
Lista los registros de un usuario con paginación por cursor, del más reciente al más antiguo. Son los datos que alimentan la vista de actividad del usuario en el panel. Sigue las mismas reglas que Listar registros, pero solo acepta los filtros from, to, type y org_id; los demás filtros se ignoran.
Ámbito de organización
Envíe org_id para construir una vista de diagnóstico de un miembro destinada a un administrador de la organización. La clave también necesita el permiso organizations:read. Si el usuario no es miembro de esa organización (no tiene una membresía invited, active o suspended), la solicitud falla con 404 not_found, la misma respuesta que para un usuario desconocido. Si el usuario es miembro, solo se devuelven los registros ocurridos en el contexto de esa organización, es decir, aquellos cuyo org_id es esa organización. Los inicios de sesión del usuario fuera de la organización, o en el contexto de otra organización, nunca se devuelven. Sin org_id, la vista abarca todos los registros del usuario en el entorno.
Solicitud
| Parámetro | En | Obligatorio | Descripción |
|---|---|---|---|
user_id |
ruta | sí | Id del usuario, con prefijo usr_. |
limit |
consulta | no | Tamaño de página, de 1 a 100. Por defecto 20. |
after |
consulta | no | Cursor opaco de list_metadata.after (registros más antiguos). Excluyente con before. |
before |
consulta | no | Cursor opaco de list_metadata.before (registros más recientes). Excluyente con after. |
from |
consulta | no | Hora RFC 3339; registros en esa hora o posteriores. Debe estar dentro de la ventana de retención. |
to |
consulta | no | Hora RFC 3339; registros anteriores a esa hora. Debe ser posterior a from. |
type |
consulta | no | Prefijo de tipo de registro, como authentication. o session.created. Repita el parámetro para hasta 20 valores; se devuelve un registro que coincida con cualquiera de ellos. |
org_id |
consulta | no | Id de la organización, con prefijo org_. Limita la vista a los registros de esa organización; consulte Ámbito de organización. Requiere organizations:read. |
Los registros siempre se ordenan por occurred_at, del más reciente al más antiguo; no existe un parámetro order (order=desc se acepta, cualquier otro valor falla con validation_failed). Un cursor solo es válido con los filtros para los que se emitió.
Respuesta
200 OK. data contiene los registros de la página; list_metadata.after apunta a los registros más antiguos y list_metadata.before a los más recientes (null cuando no hay ninguno). No se devuelve un recuento total. Los campos vacíos son null.
ip, ip_asn, user_agent y user_agent_family solo están presentes cuando la clave tiene el permiso audit-events:read_ip, y identifier_hint solo cuando tiene users:read_pii. Sin el permiso, el campo se omite por completo (no se devuelve un valor enmascarado). ip_country siempre se devuelve.
{
"data": [
{
"id": "evt_01j9xk3m7q8r2s4t6v8w0y2z4a",
"occurred_at": "2026-10-01T08:15:42.120Z",
"type": "authentication.password.failed",
"outcome": "failure",
"reason_code": "invalid_credentials",
"user_id": "usr_0a1b2c3d4e5f6g7h8j9k0m1n2p",
"org_id": null,
"application_id": "app_01j9xk3m7q8r2s4t6v8w0y2z4b",
"connection_id": "conn_01j9xk3m7q8r2s4t6v8w0y2z4c",
"directory_id": null,
"session_id": null,
"identifier_hint": "a***@e***.com",
"ip": "203.0.113.7",
"ip_country": "DE",
"ip_asn": 64500,
"user_agent": "Mozilla/5.0 (X11; Linux x86_64)",
"user_agent_family": "Firefox",
"risk": null,
"auth_context": null,
"act_chain": null,
"details": {"attempt": 3},
"request_id": "0192a6c1-7d3e-7a10-9b2c-3d4e5f607182",
"correlation_id": null,
"trace_id": "4bf92f3577b34da6a3ce929d0e0e4736"
}
],
"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 está mal formado o no se emitió para esta solicitud. |
| 400 | invalid_filter |
El servicio de registros rechazó un filtro o el cursor. |
| 400 | range_outside_retention |
from es anterior a la ventana de retención de su plan. |
| 422 | validation_failed |
Un parámetro de consulta no es válido (limit fuera de rango, fecha y hora incorrecta, to no posterior a from, más de 20 valores de type, org_id mal formado, parámetro repetido). |
| 401 | unauthenticated |
La clave de API falta, no es válida o fue revocada. |
| 403 | insufficient_permissions |
La clave no tiene el permiso logs:read, o org_id está definido y la clave no tiene organizations:read. required_permissions enumera lo que necesita la solicitud. |
| 404 | not_found |
El id del usuario está mal formado, o org_id está definido y el usuario no es miembro de esa organización. |
| 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
curl "https://api.eu.keenauth.com/v1/users/usr_0a1b2c3d4e5f6g7h8j9k0m1n2p/logs?limit=50" \
-H "Authorization: Bearer $KEENAUTH_SECRET_KEY"
Solo los registros de una organización:
keenauth users logs list usr_0a1b2c3d4e5f6g7h8j9k0m1n2p --org-id org_01j9xk3m7q8r2s4t6v8w0y2z4d --type authentication.
Datos personales
Este endpoint contiene datos personales: los registros del entorno. 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.