
# Listar los consentimientos de un usuario

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

Lista los consentimientos OAuth que el usuario ha otorgado a las aplicaciones, del más reciente al más antiguo. Solo se devuelven los consentimientos activos: un consentimiento revocado, o reemplazado por un consentimiento más reciente de la misma aplicación, no aparece en la lista. La lista solo pagina hacia adelante y no devuelve un recuento total. La respuesta no incluye el texto de la pantalla de consentimiento que vio el usuario.

## Solicitud

| Parámetro | En | Obligatorio | Descripción |
|---|---|---|---|
| `user_id` | path | sí | ID del usuario, con el prefijo `usr_`. |
| `limit` | query | no | Elementos por página, de 1 a 100 (predeterminado 20). |
| `after` | query | no | Cursor de `list_metadata.after` de la página anterior del mismo usuario. |

`before` y `order=asc` no se admiten y devuelven `422`.

## Respuesta

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

```json
{
  "data": [
    {
      "id": "cns_01jb2k8m5c3f6t9w2y4b7d0g3k",
      "user_id": "usr_0a1b2c3d4e5f6g7h8j9k0m1n2p",
      "application_id": "app_0a1b2c3d4e5f6g7h8j9k0m1n2p",
      "api_id": "api_0a1b2c3d4e5f6g7h8j9k0m1n2p",
      "org_id": null,
      "scopes": ["openid", "profile", "orders:read"],
      "authorization_details_types": [],
      "granted_at": "2026-10-20T09:00:00Z",
      "consent_screen_version": "3",
      "locale": "en",
      "prompt_reason": "scope_expansion"
    }
  ],
  "list_metadata": {"before": null, "after": null}
}
```

| Campo | Descripción |
|---|---|
| `id` | ID del consentimiento, con el prefijo `cns_`. |
| `application_id` | La aplicación a la que se otorgó el consentimiento. |
| `api_id` | La API a la que está vinculado el consentimiento, si la hay. |
| `org_id` | El contexto de la organización en el que se otorgó el consentimiento, si lo hay. |
| `scopes` | Los ámbitos concedidos, ordenados y sin repetición. |
| `authorization_details_types` | Tipos de solicitud de autorización enriquecida concedidos; vacío si no hay ninguno. |
| `consent_screen_version`, `locale` | La versión y el idioma de la pantalla de consentimiento que aceptó el usuario. |
| `prompt_reason` | Motivo por el que se solicitó el consentimiento: `first`, `scope_expansion`, `prompt_consent` o `skip_consent` (aplicación de primera parte sin pantalla de consentimiento). |

## 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 pertenece a otra lista. |
| 422 | `validation_failed` | `limit` está fuera de rango, o se envió `before` o un `order` ascendente. |
| 404 | `not_found` | El usuario no existe en este entorno (o el ID está mal formado). |
| 401 | `unauthenticated` | La clave de API falta, no es válida o fue revocada. |
| 403 | `insufficient_permissions` | La clave no tiene el permiso `users:read`. |
| 429 | `rate_limited` | Se superó el límite de frecuencia; respete `Retry-After`. |
| 503 | `service_unavailable` | Una dependencia no está disponible temporalmente; vuelva a intentarlo más tarde. |

## Ejemplo

```bash
curl "https://api.eu.keenauth.com/v1/users/usr_0a1b2c3d4e5f6g7h8j9k0m1n2p/consents?limit=50" \
  -H "Authorization: Bearer $KEENAUTH_SECRET_KEY"
```

CLI: `keenauth users consents list usr_0a1b2c3d4e5f6g7h8j9k0m1n2p --limit 50`

## Datos personales

Este endpoint contiene datos personales: registros de consentimiento. [Datos personales en las API de KeenAuth](/docs/policies/personal-data) describe qué se almacena, durante 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.
