Simular el aprovisionamiento SCIM
POST /v1/directories/{directory_id}:simulate · permiso directories:write · solo para desarrollo y staging
Ejecuta un escenario del simulador SCIM contra el endpoint SCIM real del directorio. Solo durante la ejecución, KeenAuth genera un token SCIM real, lo usa y luego lo revoca. Las comprobaciones del token, los límites de tasa, el disyuntor de desaprovisionamiento masivo y el registro de aprovisionamiento se ejecutan exactamente igual que con su proveedor de identidad. Los usuarios son un conjunto fijo y ficticio: 25 personas en example.test en 5 grupos. No contienen datos personales reales.
El simulador es una herramienta de desarrollo y modifica el directorio. Los usuarios y grupos que escribe permanecen en el directorio como cualquier otro registro aprovisionado. Use un directorio creado para pruebas.
| Escenario | Qué hace |
|---|---|
seed |
Crea los 25 usuarios y los 5 grupos con sus membresías. En un directorio que ya los contiene, el primer usuario recibe un SCIM 409 y la ejecución queda como failed. |
bulk_deactivate |
Envía active=false para el 60 % de los usuarios (15 de 25). El disyuntor solo se activa cuando mass_deprovision_guard.absolute_min del directorio es 15 o menos. Con el valor predeterminado de 25, no se activa. |
group_churn |
Mueve un usuario de un grupo a otro. |
attribute_update |
Cambia el nombre para mostrar y el apellido de todos los usuarios. |
conflict_email |
Crea un usuario con un userName existente y espera un SCIM 409 uniqueness. |
Cuando el directorio está vacío, todos los escenarios excepto seed ejecutan seed primero.
El token de simulación nunca aparece en la lista y no cuenta para los 2 tokens válidos. Usarlo no inicia la rotación del token de su proveedor de identidad. Solo puede haber una ejecución en curso por directorio. La ejecución queda auditada como directory.simulation_started y directory.simulation_finished.
Solicitud
| Campo | Tipo | Obligatorio | Descripción |
|---|---|---|---|
directory_id |
path | sí | ID del directorio SCIM (dir_…). |
scenario |
body, string | sí | seed, bulk_deactivate, group_churn, attribute_update o conflict_email. |
Idempotency-Key |
header | no | Reproduce la primera respuesta de una solicitud reintentada; el escenario no se vuelve a ejecutar. |
{"scenario": "bulk_deactivate"}
Respuesta
200 OK con el resultado de la ejecución. Una respuesta de error SCIM no hace fallar la solicitud. Hace que la ejecución quede como failed, completa failure y deja los recuentos en lo que tuvo éxito antes del error. El resultado solo contiene recuentos y estados: ningún usuario, ningún ID SCIM ni ningún token.
{
"directory_id": "dir_01j9xm2n4p6q8r0s2t4v6w8y0z",
"scenario": "bulk_deactivate",
"status": "completed",
"users_created": 0,
"groups_created": 0,
"users_updated": 0,
"groups_updated": 0,
"users_deactivated": 15,
"conflicts": 0,
"circuit_breaker_tripped": true,
"deprovision_hold": {"id": "0191e9b2-6f3a-7c4d-8e5f-0a1b2c3d4e5f", "pending_count": 6},
"failure": null,
"started_at": "2026-10-28T09:31:00.123456Z",
"completed_at": "2026-10-28T09:31:01.654321Z"
}
| Campo | Descripción |
|---|---|
status |
completed, o failed cuando el endpoint respondió con un error SCIM, la ejecución tardó demasiado o una respuesta no fue la que esperaba el escenario. |
users_updated |
PATCH de usuarios distintos de desactivaciones. |
users_deactivated |
PATCH con active=false aceptados por el endpoint, incluidos los retenidos. |
conflicts |
Respuestas 409 uniqueness esperadas (conflict_email). |
circuit_breaker_tripped |
Se abrió una retención por desaprovisionamiento masivo durante la ejecución. |
deprovision_hold |
La retención abierta del directorio tras la ejecución, o null. Apruébela o recházela con los endpoints de deprovision-holds. |
failure |
null cuando completed. En otro caso, reason (scim_error, timeout o unexpected_response), y para scim_error también scim_status (estado HTTP) y scim_type (scimType de SCIM, o null). |
Errores
| HTTP | código | Cuándo |
|---|---|---|
| 400 | unknown_field |
El cuerpo contiene un campo distinto de scenario. |
| 403 | test_feature_not_in_production |
El entorno es un entorno de producción. |
| 404 | not_found |
El directorio no existe en este entorno. |
| 409 | conflict |
Hay otra ejecución de este directorio en curso, o el directorio está desactivado o en proceso de eliminación. |
| 422 | validation_failed |
Falta scenario o es desconocido (/scenario). |
| 422 | idempotency_key_reuse |
La Idempotency-Key se usó para una solicitud diferente. |
| 401 | unauthenticated |
La credencial falta, no es válida o fue revocada. |
| 403 | insufficient_permissions |
La credencial no tiene el permiso requerido. |
| 429 | rate_limited |
Se superó el límite de tasa; reintente después del período Retry-After. |
| 503 | service_unavailable |
La sincronización del directorio o el simulador no están disponibles temporalmente o no están configurados en este despliegue; reintente después del período Retry-After. |
Ejemplo
curl -X POST "https://api.eu.keenauth.com/v1/directories/dir_01j9xm2n4p6q8r0s2t4v6w8y0z:simulate" \
-H "Authorization: Bearer $KEENAUTH_SECRET_KEY" \
-H "Content-Type: application/json" \
-d '{"scenario": "seed"}'
keenauth directories simulate dir_01j9xm2n4p6q8r0s2t4v6w8y0z --scenario bulk_deactivate