
# Obtener los diagnósticos de un miembro

`GET /v1/organizations/{org_id}/memberships/{membership_id}/diagnostics` · permisos `organizations:read` y `users:read`

Responde a la pregunta «¿por qué este miembro no puede iniciar sesión?» para un administrador de la organización en una sola respuesta: la membresía, un resumen de las políticas de la organización, una invitación pendiente, un resumen de los autenticadores del miembro, el estado de inicio de sesión en el contexto de la organización, los grupos de directorio del miembro y su acceso a las aplicaciones. Es de solo lectura: no cambia nada, y las acciones de escritura van a sus propios endpoints. La actividad de inicio de sesión se lee con [Listar los registros de un usuario](/docs/api/management/users/list-logs) y `org_id`.

Solo se devuelven datos que pertenecen a la organización. Las etiquetas, los AAGUID, las direcciones IP, los user agents, las direcciones de correo electrónico, los rangos CIDR y los registros del contexto de otra organización nunca forman parte de la respuesta.

## Solicitud

| Campo | Tipo | Obligatorio | Descripción |
|---|---|---|---|
| `org_id` | path | sí | ID de la organización (`org_…`). |
| `membership_id` | path | sí | ID de la membresía (`mem_…`). |

Sin cuerpo de la solicitud.

## Respuesta

`200 OK` con estos campos:

| Campo | Descripción |
|---|---|
| `membership` | La membresía tal como la devuelve [Obtener una membresía](get.md): estado, origen, roles y motivo de la suspensión. |
| `policy` | Las políticas definidas en la organización: `authentication_methods` (clave de acceso y contraseña permitidas, número de conexiones permitidas), `mfa` (quién debe usar la MFA y los factores permitidos), `phishing_resistant`, `sso_enforcement` (modo, y `bypass` cuando el miembro está en la lista de acceso de emergencia) y `ip_allowlist` (presente, y a quién se aplica). `null` indica que la organización hereda el valor del entorno para esa política. |
| `invitation` | Solo para una membresía `invited`: la invitación pendiente a la dirección de correo electrónico principal del usuario, con su entrega y su estado de entrega. `null` en caso contrario. La dirección de correo electrónico no se devuelve. |
| `authenticators` | `classes`: los tipos de los autenticadores activos del miembro. `mfa_enrolled`: `true` cuando un autenticador activo tiene el rol `second_factor` o `both`. |
| `sign_in` | `locked` y `locked_until` (un bloqueo detiene el inicio de sesión de la cuenta en todos los contextos), y el último inicio de sesión en el contexto de esta organización (`last_sign_in_at`, `last_sign_in_amr`). Los contadores de fallos no se muestran, porque no pertenecen a ninguna organización. |
| `groups` | Los grupos del miembro en los directorios de la organización (`data`: `id` `dsg_…` y `directory_id` `dir_…`; como máximo 100, `truncated` cuando hay más). Solo cuentan las membresías de un usuario de directorio vinculado a este usuario y activo. Los nombres de grupo no se devuelven; léalos con `GET /v1/directories/{directory_id}/groups/{directory_group_id}`. |
| `applications` | Acceso a las aplicaciones de esta organización. Las aplicaciones cuyo `org_access_mode` es `all_organizations` están abiertas a todos los miembros y solo se cuentan (`open_count`). Para las demás aplicaciones (`data`, por nombre, como máximo 100, `truncated` cuando hay más): `application_id`, `name`, `access_mode`, `allowed`, y `reason` cuando el acceso se rechaza (`application_not_enabled`: la aplicación no está habilitada para la organización; `application_not_assigned`: ni la membresía ni uno de sus grupos de directorio está asignado). La decisión sigue la misma regla que la comprobación al iniciar sesión. |

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

## Errores

| HTTP | Código | Cuándo |
|---|---|---|
| 404 | `not_found` | La membresía no existe en esta organización, o está `removed`. |
| 401 | `unauthenticated` | La credencial falta, no es válida o ha sido revocada. |
| 403 | `insufficient_permissions` | La credencial carece de `organizations:read` o `users:read`. |
| 429 | `rate_limited` | Se superó el límite de solicitudes; reintente después del período `Retry-After`. |
| 503 | `service_unavailable` | Una dependencia no está disponible temporalmente; reintente después del período `Retry-After`. |

## Ejemplo

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

## Datos personales

Este endpoint contiene datos personales: membresías e invitaciones de organizaciones, y credenciales. [Datos personales en las API de KeenAuth](/docs/policies/personal-data) describe qué se almacena, cuánto tiempo se conserva y cómo se elimina. No envíe categorías especiales de datos personales (salud, datos biométricos, religión, opiniones políticas, orientación sexual) en ningún campo.
