
# Lister les conflits de sujet d'une connexion

`GET /v1/connections/{connection_id}/subject-conflicts` · permission `users:read`

Liste les conflits de sujet SSO d'une connexion d'entreprise (SAML ou OIDC), du plus récent au plus ancien.

Un conflit de sujet est enregistré lorsque le fournisseur d'identité envoie un **nouveau sujet** avec l'adresse e-mail vérifiée d'un utilisateur déjà lié à la même connexion sous un autre sujet. Cela se produit, par exemple, lorsque la boîte e-mail d'un ancien employé est attribuée à un nouvel employé. KeenAuth ne lie pas automatiquement le nouveau sujet : la connexion est refusée avec `sso_subject_conflict` et un enregistrement est ouvert afin qu'un administrateur le [résolve](resolve-subject-conflict.md).

- Tant qu'un enregistrement est ouvert, les nouvelles connexions avec le même sujet mettent à jour cet enregistrement au lieu d'en ouvrir un nouveau.
- Un enregistrement ouvert expire 30 jours après son ouverture.
- Les enregistrements ne contiennent jamais le sujet externe ni l'adresse e-mail.

L'autorisation est `users:read` car un enregistrement concerne un compte utilisateur ; sa résolution nécessite `users:write`.

## Requête

| Champ | Type | Obligatoire | Description |
|---|---|---|---|
| `connection_id` | path | oui | Identifiant de la connexion (`conn_…`). |
| `limit` | query | non | Taille de page, de 1 à 100 (par défaut 20). |
| `after` / `before` | query | non | Curseur issu de `list_metadata`. Un curseur ne fonctionne que pour la connexion qui l'a produit. |
| `order` | query | non | `desc` (par défaut) ou `asc`, selon la date de création. |

## Réponse

`200 OK` :

```json
{
  "data": [
    {
      "id": "sscf_01j9xr4a6b8c0d2e4f6g8h0j2k",
      "connection_id": "conn_01j9xp6q0r1s5t7v9w1x3y5z7b",
      "user_id": "usr_01j9xm2n4p6q8r0s2t4v6w8x0y",
      "status": "open",
      "resolution": null,
      "created_at": "2026-10-28T10:00:00Z",
      "last_seen_at": "2026-10-28T10:05:00Z",
      "expires_at": "2026-11-27T10:00:00Z",
      "closed_at": null
    }
  ],
  "list_metadata": { "before": null, "after": null }
}
```

| Champ | Description |
|---|---|
| `user_id` | L'utilisateur qui possède l'adresse e-mail vérifiée et qui est déjà lié à cette connexion sous un autre sujet. |
| `status` | `open` (en attente d'une décision), `resolved` ou `expired` (fermé 30 jours après son ouverture, sans décision). |
| `resolution` | `same_person` ou `different_person` ; renseigné uniquement lorsque `status` vaut `resolved`. |
| `last_seen_at` | La dernière tentative de connexion avec le nouveau sujet. |
| `closed_at` | Date à laquelle l'enregistrement a été résolu ou expiré ; `null` tant qu'il est ouvert. Un enregistrement expiré peut aussi afficher `null`. |

## Erreurs

| HTTP | code | Quand |
|---|---|---|
| 400 | `invalid_cursor` | Le curseur est mal formé ou appartient à une autre connexion ou à une autre requête. |
| 401 | `unauthenticated` | L'identifiant d'accès est absent, invalide ou révoqué. |
| 403 | `insufficient_permissions` | L'identifiant d'accès ne dispose pas de `users:read`. |
| 404 | `not_found` | La connexion n'existe pas dans cet environnement. |
| 422 | `validation_failed` | Un paramètre de requête est invalide (par exemple `limit` supérieur à 100). |
| 429 | `rate_limited` | La limite de débit a été dépassée ; réessayez après la période indiquée par `Retry-After`. |
| 503 | `service_unavailable` | Un service dont dépend l'API est temporairement indisponible ; réessayez après la période indiquée par `Retry-After`. |

## Exemple

```bash
curl "https://api.eu.keenauth.com/v1/connections/conn_01j9xp6q0r1s5t7v9w1x3y5z7b/subject-conflicts?limit=20" \
  -H "Authorization: Bearer $KEENAUTH_SECRET_KEY"
```

```bash
keenauth connections subject-conflicts list conn_01j9xp6q0r1s5t7v9w1x3y5z7b --limit 20
```
