
# Listar las sesiones de un usuario

`GET /v1/users/{user_id}/sessions` · permiso `sessions:read`

Lista las sesiones del usuario en una sola página, primero las vistas más recientemente, con un máximo de 1,000. La lista no tiene `limit`, `after`, `before` ni `order`, y `list_metadata` siempre tiene valor `null`. Por defecto solo se devuelven las sesiones activas; con `include_inactive=true` también se devuelven las sesiones expiradas y revocadas (que aún estén dentro del período de retención). La dirección IP completa se muestra y cada consulta se registra en el registro de auditoría de administración. Las cookies, los tokens y las huellas digitales del dispositivo nunca se devuelven.

## Ámbito de organización

Indique `org_id` para construir una vista de diagnóstico de miembros para un administrador de la organización. La clave también necesita entonces el permiso `organizations:read`; sin él, la solicitud falla con `403 insufficient_permissions` antes de leer nada. 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 las sesiones abiertas bajo la política de esa organización (sesiones cuyo `org_id` es esa organización); las sesiones del usuario en el contexto de otra organización, o fuera de cualquier organización, nunca se devuelven. `ip_address` y `user_agent` son `null` en esta vista. Sin `org_id`, la respuesta no cambia.

## Solicitud

| Parámetro | En | Obligatorio | Descripción |
|---|---|---|---|
| `user_id` | ruta | sí | ID del usuario, con el prefijo `usr_`. |
| `include_inactive` | consulta | no | `true` para devolver también las sesiones expiradas y revocadas. Por defecto es `false`. |
| `org_id` | consulta | no | ID de la organización, con el prefijo `org_`. Limita la vista a esa organización; consulte [Ámbito de organización](#ámbito-de-organización). Requiere `organizations:read`. |

## Respuesta

`200 OK`. Los campos vacíos son `null`.

```json
{
  "data": [
    {
      "id": "ses_0a1b2c3d4e5f6g7h8j9k0m1n2p",
      "user_id": "usr_0a1b2c3d4e5f6g7h8j9k0m1n2p",
      "status": "active",
      "login_host": "login.example.com",
      "auth_time": "2026-02-01T08:00:00Z",
      "acr": "mfa",
      "amr": ["pwd", "otp"],
      "created_at": "2026-02-01T08:00:00Z",
      "last_seen_at": "2026-02-01T09:15:00Z",
      "idle_expires_at": "2026-02-08T09:15:00Z",
      "absolute_expires_at": "2026-03-03T08:00:00Z",
      "org_id": null,
      "ip_address": "203.0.113.10",
      "user_agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 14_0)",
      "revoked_at": null,
      "revoke_reason": null
    }
  ],
  "list_metadata": {
    "before": null,
    "after": null
  }
}
```

`status`: `active`, `expired`, `revoked` · `acr`: `1fa`, `mfa`, `phr` · `org_id`: la organización de la sesión, si la tiene.

## Errores

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

| HTTP | `code` | Cuándo |
|---|---|---|
| 422 | `validation_failed` | `include_inactive` no es `true` ni `false`. |
| 404 | `not_found` | El usuario no existe en este entorno (o el ID está mal formado), o se indica `org_id` y el usuario no es miembro de esa organización. |
| 401 | `unauthenticated` | La clave de API falta, no es válida o fue revocada. |
| 403 | `insufficient_permissions` | La clave no tiene el permiso `sessions:read`, o se indica `org_id` y la clave no tiene `organizations: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/users/usr_0a1b2c3d4e5f6g7h8j9k0m1n2p/sessions?include_inactive=true" \
  -H "Authorization: Bearer $KEENAUTH_SECRET_KEY"
```

CLI: `keenauth users sessions list usr_0a1b2c3d4e5f6g7h8j9k0m1n2p --include-inactive`

## Datos personales

Este endpoint contiene datos personales: sesiones. [Datos personales en las API de KeenAuth](/docs/policies/personal-data) 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.
