
# Recupera la diagnostica di un membro

`GET /v1/organizations/{org_id}/memberships/{membership_id}/diagnostics` · permessi `organizations:read` e `users:read`

Risponde alla domanda "perché questo membro non riesce ad accedere?" per un amministratore dell'organizzazione in un'unica risposta: l'appartenenza, un riepilogo delle policy dell'organizzazione, un invito in sospeso, un riepilogo degli autenticatori del membro, lo stato di accesso nel contesto dell'organizzazione, i gruppi di directory del membro e l'accesso del membro alle applicazioni. È di sola lettura: non cambia nulla, e le azioni di scrittura usano i rispettivi endpoint. L'attività di accesso si legge con [Elenca i log di un utente](/docs/api/management/users/list-logs) e `org_id`.

Vengono restituiti solo i dati che appartengono all'organizzazione. Etichette, AAGUID, indirizzi IP, agenti utente, indirizzi email, intervalli CIDR e record del contesto di un'altra organizzazione non fanno mai parte della risposta.

## Richiesta

| Campo | Tipo | Obbligatorio | Descrizione |
|---|---|---|---|
| `org_id` | path | sì | ID dell'organizzazione (`org_…`). |
| `membership_id` | path | sì | ID dell'appartenenza (`mem_…`). |

Nessun corpo della richiesta.

## Risposta

`200 OK` con questi campi:

| Campo | Descrizione |
|---|---|
| `membership` | L'appartenenza come la restituisce [Recupera un'appartenenza](get.md): stato, origine, ruoli e motivo della sospensione. |
| `policy` | Le policy definite sull'organizzazione: `authentication_methods` (passkey e password consentite, numero di connessioni consentite), `mfa` (chi deve usare la MFA e i fattori consentiti), `phishing_resistant`, `sso_enforcement` (modalità, e `bypass` quando il membro è nell'elenco break-glass) e `ip_allowlist` (presente, e a chi si applica). `null` indica che l'organizzazione eredita il valore dell'ambiente per quella policy. |
| `invitation` | Solo per un'appartenenza `invited`: l'invito in sospeso all'indirizzo email primario dell'utente, con la sua consegna e lo stato di consegna. `null` altrimenti. L'indirizzo email non viene restituito. |
| `authenticators` | `classes`: i tipi degli autenticatori attivi del membro. `mfa_enrolled`: `true` quando un autenticatore attivo ha il ruolo `second_factor` o `both`. |
| `sign_in` | `locked` e `locked_until` (un blocco interrompe l'accesso dell'account in ogni contesto), e l'ultimo accesso nel contesto di questa organizzazione (`last_sign_in_at`, `last_sign_in_amr`). I contatori dei fallimenti non vengono mostrati, perché non appartengono a nessuna organizzazione. |
| `groups` | I gruppi del membro nelle directory dell'organizzazione (`data`: `id` `dsg_…` e `directory_id` `dir_…`; al massimo 100, `truncated` quando sono di più). Contano solo le appartenenze di un utente di directory collegato a questo utente e attivo. I nomi dei gruppi non vengono restituiti; leggili con `GET /v1/directories/{directory_id}/groups/{directory_group_id}`. |
| `applications` | L'accesso alle applicazioni in questa organizzazione. Le applicazioni la cui `org_access_mode` è `all_organizations` sono aperte a ogni membro e vengono solo conteggiate (`open_count`). Per le altre applicazioni (`data`, per nome, al massimo 100, `truncated` quando sono di più): `application_id`, `name`, `access_mode`, `allowed`, e `reason` quando l'accesso è negato (`application_not_enabled`: l'applicazione non è abilitata per l'organizzazione; `application_not_assigned`: né l'appartenenza né uno dei suoi gruppi di directory è assegnato). La decisione segue la stessa regola del controllo in fase di accesso. |

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

## Errori

| HTTP | codice | Quando |
|---|---|---|
| 404 | `not_found` | L'appartenenza non esiste in questa organizzazione, oppure è `removed`. |
| 401 | `unauthenticated` | La credenziale manca, non è valida o è stata revocata. |
| 403 | `insufficient_permissions` | La credenziale non ha `organizations:read` o `users:read`. |
| 429 | `rate_limited` | È stato superato il limite di richieste; riprova dopo il periodo `Retry-After`. |
| 503 | `service_unavailable` | Una dipendenza non è temporaneamente disponibile; riprova dopo il periodo `Retry-After`. |

## Esempio

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

## Dati personali

Questo endpoint contiene dati personali: appartenenze e inviti all'organizzazione, e credenziali. [Dati personali nelle API di KeenAuth](/docs/policies/personal-data) descrive cosa viene memorizzato, per quanto tempo viene conservato e come viene cancellato. Non inviare categorie particolari di dati personali (salute, dati biometrici, religione, opinioni politiche, orientamento sessuale) in nessun campo.
