
# Lister les authentificateurs d'un utilisateur

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

Liste les authentificateurs (clés d'accès, TOTP, SMS, e-mail et facteurs push) d'un utilisateur sur une seule page, y compris ceux révoqués au cours des 90 derniers jours, triés par date de création. Le nombre d'authentificateurs par utilisateur est borné : la liste n'accepte donc ni `limit`, ni `after`, ni `before`, ni `order`, et `list_metadata` vaut toujours `null`. Seules les métadonnées sont renvoyées : jamais les clés publiques, les identifiants de credential, les secrets TOTP ni les codes de récupération.

## Périmètre de l'organisation

Transmettez `org_id` pour construire une vue de diagnostic d'un membre à l'intention d'un administrateur d'organisation. La clé doit alors aussi disposer de l'autorisation `organizations:read` ; sans elle, la requête échoue avec `403 insufficient_permissions` avant toute lecture. Si l'utilisateur n'est pas membre de cette organisation (aucune adhésion `invited`, `active` ou `suspended`), la requête échoue avec `404 not_found`, la même réponse que pour un utilisateur inconnu. Si l'utilisateur est membre, seuls la catégorie de chaque authentificateur et l'état d'inscription à l'authentification multifacteur sont affichés : seuls les authentificateurs actifs sont listés, `label`, `last_used_at`, `revoked_at`, `revoked_by` et `revoke_reason` valent `null`, et `synced` vaut `false`, car les détails de l'appareil de la personne en dehors de l'organisation ne la concernent pas. L'authentification multifacteur est active lorsqu'un authentificateur actif a le `role` `second_factor` ou `both`. Sans `org_id`, la réponse est inchangée.

## Requête

| Paramètre | Dans | Obligatoire | Description |
|---|---|---|---|
| `user_id` | chemin | oui | Identifiant de l'utilisateur, préfixé `usr_`. |
| `org_id` | requête | non | Identifiant de l'organisation, préfixé `org_`. Limite la vue à cette organisation ; voir [Périmètre de l'organisation](#périmètre-de-lorganisation). Requiert `organizations:read`. |

## Réponse

`200 OK`. `data` contient les authentificateurs triés par date de création ; `list_metadata` vaut toujours `null` car la liste n'est pas paginée. Les champs vides valent `null`.

Lorsque la clé ne dispose pas de l'autorisation `users:read_pii`, `label` est réduit aux initiales (`A. L.`).

```json
{
  "data": [
    {
      "id": "cred_0a1b2c3d4e5f6g7h8j9k0m1n2p",
      "type": "webauthn",
      "role": "both",
      "label": "Laptop",
      "status": "active",
      "synced": true,
      "created_at": "2026-01-15T09:30:00Z",
      "last_used_at": "2026-02-01T08:00:00Z",
      "revoked_at": null,
      "revoked_by": null,
      "revoke_reason": null
    }
  ],
  "list_metadata": {
    "before": null,
    "after": null
  }
}
```

`type` : `webauthn`, `totp`, `sms`, `email`, `push` · `role` : `first_factor`, `second_factor`, `both` · `status` : `pending`, `active`, `revoked`, `clone_suspected`

## Erreurs

Chaque erreur est un corps `application/problem+json` accompagné d'un `code` stable.

| HTTP | `code` | Quand |
|---|---|---|
| 404 | `not_found` | L'utilisateur n'existe pas dans cet environnement (ou l'identifiant est mal formé), ou `org_id` est fourni et l'utilisateur n'est pas membre de cette organisation. |
| 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`, ou `org_id` est fourni et la clé ne dispose pas de `organizations: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/authenticators \
  -H "Authorization: Bearer $KEENAUTH_SECRET_KEY"
```

## Données personnelles

Cet endpoint traite des données personnelles : des identifiants d'authentification. [Données personnelles dans les API KeenAuth](/docs/policies/personal-data) décrit les données stockées, leur durée de conservation et leur mode de suppression. N'envoyez pas de catégories particulières de données personnelles (santé, données biométriques, religion, opinions politiques, orientation sexuelle) dans aucun champ.
