
# Obtenir les diagnostics d'un membre

`GET /v1/organizations/{org_id}/memberships/{membership_id}/diagnostics` · autorisations `organizations:read` et `users:read`

Répond à la question « pourquoi ce membre ne peut-il pas se connecter ? » pour un administrateur d'organisation en une seule réponse : l'appartenance, une synthèse des politiques de l'organisation, une invitation en attente, une synthèse des authentificateurs du membre, l'état de connexion dans le contexte de l'organisation, les groupes d'annuaire du membre et son accès aux applications. Elle est en lecture seule : rien ne change, et les actions d'écriture passent par leurs propres points de terminaison. L'activité de connexion se lit avec [Lister les journaux d'un utilisateur](/docs/api/management/users/list-logs) et `org_id`.

Seules les données qui appartiennent à l'organisation sont renvoyées. Les libellés, AAGUID, adresses IP, agents utilisateur, adresses e-mail, plages CIDR et enregistrements issus du contexte d'une autre organisation ne figurent jamais dans la réponse.

## Requête

| Champ | Type | Requis | Description |
|---|---|---|---|
| `org_id` | chemin | oui | Identifiant de l'organisation (`org_…`). |
| `membership_id` | chemin | oui | Identifiant de l'appartenance (`mem_…`). |

Aucun corps de requête.

## Réponse

`200 OK` avec les champs suivants :

| Champ | Description |
|---|---|
| `membership` | L'appartenance telle que la renvoie [Obtenir une appartenance](get.md) : statut, source, rôles et motif de suspension. |
| `policy` | Les politiques définies sur l'organisation : `authentication_methods` (clés d'accès et mots de passe autorisés, nombre de connexions autorisées), `mfa` (qui doit utiliser l'authentification multifacteur et les facteurs autorisés), `phishing_resistant`, `sso_enforcement` (mode, et `bypass` lorsque le membre figure sur la liste de secours d'urgence) et `ip_allowlist` (présent, et à qui il s'applique). `null` signifie que l'organisation hérite de la valeur de l'environnement pour cette politique. |
| `invitation` | Uniquement pour une appartenance `invited` : l'invitation en attente envoyée à l'adresse e-mail principale de l'utilisateur, avec son envoi et son statut de remise. `null` sinon. L'adresse e-mail n'est pas renvoyée. |
| `authenticators` | `classes` : les types des authentificateurs actifs du membre. `mfa_enrolled` : `true` lorsqu'un authentificateur actif a le rôle `second_factor` ou `both`. |
| `sign_in` | `locked` et `locked_until` (un verrou bloque la connexion du compte dans tous les contextes), ainsi que la dernière connexion dans le contexte de cette organisation (`last_sign_in_at`, `last_sign_in_amr`). Les compteurs d'échecs ne sont pas affichés, car ils n'appartiennent à aucune organisation. |
| `groups` | Les groupes du membre dans les annuaires de l'organisation (`data` : `id` `dsg_…` et `directory_id` `dir_…` ; 100 au maximum, `truncated` s'il y en a davantage). Seules les appartenances d'un utilisateur d'annuaire lié à cet utilisateur et actif sont comptées. Les noms des groupes ne sont pas renvoyés ; lisez-les avec `GET /v1/directories/{directory_id}/groups/{directory_group_id}`. |
| `applications` | L'accès aux applications de cette organisation. Les applications dont `org_access_mode` est `all_organizations` sont ouvertes à tous les membres et seulement comptées (`open_count`). Pour les autres applications (`data`, par nom, 100 au maximum, `truncated` s'il y en a davantage) : `application_id`, `name`, `access_mode`, `allowed`, et `reason` lorsque l'accès est refusé (`application_not_enabled` : l'application n'est pas activée pour l'organisation ; `application_not_assigned` : ni l'appartenance ni l'un de ses groupes d'annuaire n'est assigné). La décision suit la même règle que la vérification lors de la connexion. |

```json
{
  "membership": {
    "id": "mem_01j9xn5p9s0t4v6w8x0y2z4a6c",
    "organization_id": "org_01j9xk3m7q8r2s4t6v8w0y2z4a",
    "user_id": "usr_01j9xh2k6p7q1r3s5t7v9w1x3y",
    "status": "suspended",
    "source": "scim",
    "reason": "scim_deprovisioned",
    "roles": [],
    "expires_at": null,
    "created_at": "2026-10-12T09:31:00.123456Z",
    "activated_at": "2026-10-12T09:31:00.123456Z",
    "suspended_at": "2026-10-20T07:00:00Z",
    "removed_at": null,
    "updated_at": "2026-10-20T07:00:00Z",
    "version": 3
  },
  "policy": {
    "authentication_methods": null,
    "mfa": { "required_for": "all", "allowed_factors": ["totp", "webauthn"] },
    "phishing_resistant": null,
    "sso_enforcement": { "mode": "org_context", "bypass": false },
    "ip_allowlist": null
  },
  "invitation": null,
  "authenticators": { "mfa_enrolled": false, "classes": ["webauthn"] },
  "sign_in": {
    "locked": false,
    "locked_until": null,
    "last_sign_in_at": "2026-10-19T08:15:42Z",
    "last_sign_in_amr": ["fed"]
  },
  "groups": {
    "data": [{ "id": "dsg_01j9xp4r8s2t4v6w8x0y2z4a6b", "directory_id": "dir_01j9xm1n5p7q9r1s3t5v7w9x1y" }],
    "truncated": false
  },
  "applications": {
    "open_count": 2,
    "data": [
      {
        "application_id": "app_01j9xq6s0t2v4w6x8y0z2a4b6c",
        "name": "Finance portal",
        "access_mode": "assigned_only",
        "allowed": false,
        "reason": "application_not_assigned"
      }
    ],
    "truncated": false
  }
}
```

## Erreurs

| HTTP | code | Quand |
|---|---|---|
| 404 | `not_found` | L'appartenance n'existe pas dans cette organisation, ou elle est `removed`. |
| 401 | `unauthenticated` | L'identifiant est absent, invalide ou révoqué. |
| 403 | `insufficient_permissions` | L'identifiant ne dispose pas de `organizations:read` ou de `users:read`. |
| 429 | `rate_limited` | La limite de débit a été dépassée ; réessayer après la période `Retry-After`. |
| 503 | `service_unavailable` | Une dépendance est temporairement indisponible ; réessayer après la période `Retry-After`. |

## Exemple

```bash
curl -i "https://api.eu.keenauth.com/v1/organizations/org_01j9xk3m7q8r2s4t6v8w0y2z4a/memberships/mem_01j9xn5p9s0t4v6w8x0y2z4a6c/diagnostics" \
  -H "Authorization: Bearer $KEENAUTH_SECRET_KEY"
```

## Données personnelles

Ce point de terminaison traite des données personnelles : appartenances à des organisations, invitations et identifiants. [Données personnelles dans les API KeenAuth](/docs/policies/personal-data) décrit ce qui est stocké, combien de temps ces données sont conservées et comment 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.
