
# Lister les consentements d'un utilisateur

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

Liste les consentements OAuth que l'utilisateur a accordés aux applications, du plus récent au plus ancien. Seuls les consentements actifs sont renvoyés : un consentement révoqué, ou remplacé par un consentement plus récent pour la même application, n'est pas listé. La liste ne permet que la pagination vers l'avant et ne renvoie aucun nombre total. La réponse n'inclut pas le texte de l'écran de consentement vu par l'utilisateur.

## Requête

| Paramètre | Dans | Obligatoire | Description |
|---|---|---|---|
| `user_id` | path | oui | Identifiant de l'utilisateur, préfixé `usr_`. |
| `limit` | query | non | Éléments par page, de 1 à 100 (par défaut 20). |
| `after` | query | non | Curseur tiré de `list_metadata.after` de la page précédente du même utilisateur. |

`before` et `order=asc` ne sont pas pris en charge et renvoient `422`.

## Réponse

`200 OK`. Les champs vides valent `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}
}
```

| Champ | Description |
|---|---|
| `id` | Identifiant du consentement, préfixé `cns_`. |
| `application_id` | L'application à laquelle le consentement a été accordé. |
| `api_id` | L'API à laquelle le consentement est lié, le cas échéant. |
| `org_id` | Le contexte de l'organisation dans lequel le consentement a été accordé, le cas échéant. |
| `scopes` | Les scopes accordés, triés et uniques. |
| `authorization_details_types` | Types de demandes d'autorisation riches accordés ; vide si aucun. |
| `consent_screen_version`, `locale` | La version et la langue de l'écran de consentement accepté par l'utilisateur. |
| `prompt_reason` | Raison pour laquelle le consentement a été demandé : `first`, `scope_expansion`, `prompt_consent` ou `skip_consent` (application first-party sans écran de consentement). |

## Erreurs

Chaque erreur est un corps `application/problem+json` avec un `code` stable.

| HTTP | `code` | Quand |
|---|---|---|
| 400 | `invalid_cursor` | Le curseur est mal formé ou appartient à une autre liste. |
| 422 | `validation_failed` | `limit` est hors plage, ou `before` ou un `order` ascendant a été envoyé. |
| 404 | `not_found` | L'utilisateur n'existe pas dans cet environnement (ou l'identifiant est mal formé). |
| 401 | `unauthenticated` | La clé d'API est absente, invalide ou révoquée. |
| 403 | `insufficient_permissions` | La clé ne dispose pas de l'autorisation `users:read`. |
| 429 | `rate_limited` | La limite de débit a été dépassée ; respectez `Retry-After`. |
| 503 | `service_unavailable` | Une dépendance est temporairement indisponible ; réessayez plus tard. |

## Exemple

```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`

## Données personnelles

Cet endpoint traite des données personnelles : des enregistrements de consentement. [Données personnelles dans les API KeenAuth](/docs/policies/personal-data) décrit ce qui est stocké, la durée de conservation et la manière dont elles sont supprimées. N'envoyez aucune catégorie particulière de données personnelles (santé, données biométriques, religion, opinions politiques, orientation sexuelle) dans aucun champ.
