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 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: 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. |
{
"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
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 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.