
# Listar registros de aprovisionamiento del directorio

`GET /v1/directories/{directory_id}/provisioning-logs` · permiso `directories:read`

Lista el registro de aprovisionamiento de un directorio SCIM, de la más reciente a la más antigua. Cada solicitud SCIM autenticada que el proveedor de identidad envió es un registro: método, plantilla de ruta (el ID real nunca aparece en la ruta), tipo de recurso e ID, un resumen de operaciones sin valores, nombres de atributos ignorados, estado HTTP, `scim_type`, duración, el prefijo de la dirección del cliente (IPv4 /24, IPv6 /48), la clase de cliente y si la retención de desaprovisionamiento masivo detuvo la solicitud. Los cuerpos de solicitud y respuesta, los valores de los atributos, la dirección IP completa, el User-Agent y el valor del token nunca se almacenan ni se devuelven.

Los registros se conservan durante el período de retención de registros de su plan (Free 7 días, Startup 14, Business 30, Enterprise 90). El orden es siempre de la más reciente a la más antigua; no existe el parámetro `order`. Los registros de un directorio eliminado siguen siendo legibles con `GET /v1/logs?type=scim.request`.

## Solicitud

| Campo | Tipo | Obligatorio | Descripción |
|---|---|---|---|
| `directory_id` | path | sí | ID del directorio SCIM (`dir_…`). |
| `limit` | query | no | 1–100, por defecto 20. |
| `after` | query | no | El cursor de `list_metadata.after` (registros más antiguos). |
| `before` | query | no | El cursor de `list_metadata.before` (registros más recientes). |
| `from` | query | no | Límite inferior inclusivo (RFC 3339). |
| `to` | query | no | Límite superior exclusivo (RFC 3339). |

No hay cuerpo de solicitud.

## Respuesta

`200 OK` con una página de registros.

```json
{
  "data": [
    {
      "id": "evt_01j9xp4q6r8s0t2v4w6x8y0z2b",
      "occurred_at": "2026-10-20T12:00:00Z",
      "outcome": "success",
      "organization_id": "org_01j9xk1m3n5p7q9r1s3t5v7w9x",
      "token_id": "dst_01j9xn2p4q6r8s0t2v4w6x8y0z",
      "method": "PATCH",
      "path_template": "PATCH /Users/{id}",
      "resource_type": "User",
      "resource_id": "dsu_01j9xq5r7s9t1v3w5x7y9z1a3c",
      "operation_summary": ["replace:active"],
      "ignored_attributes": [],
      "status": 200,
      "scim_type": null,
      "duration_ms": 12,
      "client_ip_prefix": "203.0.113.0/24",
      "client_class": "okta",
      "held": false,
      "request_id": "0192f5e0-0000-7000-8000-000000000001",
      "trace_id": "4bf92f3577b34da6a3ce929d0e0e4736"
    }
  ],
  "list_metadata": {
    "before": null,
    "after": null
  }
}
```

## Errores

| HTTP | código | Cuándo |
|---|---|---|
| 400 | `invalid_cursor` | El cursor está mal formado o pertenece a otra solicitud. |
| 400 | `range_outside_retention` | `from` es anterior al período de retención de su plan. |
| 404 | `not_found` | El directorio no existe en este entorno. |
| 422 | `validation_failed` | `limit` está fuera de rango, `from` o `to` no están en formato RFC 3339, `to` no es posterior a `from`, o se indicó `order` (`unsupported`). |
| 401 | `unauthenticated` | La credencial falta, no es válida o ha sido revocada. |
| 403 | `insufficient_permissions` | La credencial no tiene el permiso requerido. |
| 429 | `rate_limited` | Se superó el límite de frecuencia; reintente después del período indicado en `Retry-After`. |
| 503 | `service_unavailable` | La sincronización de directorios o la búsqueda de registros no están disponibles temporalmente o no están configuradas en este despliegue; reintente después del período indicado en `Retry-After`. |

## Ejemplo

```bash
curl -i "https://api.eu.keenauth.com/v1/directories/dir_01j9xm2n4p6q8r0s2t4v6w8y0z/provisioning-logs?limit=20" \
  -H "Authorization: Bearer $KEENAUTH_SECRET_KEY"
```

```bash
keenauth directories provisioning-logs list dir_01j9xm2n4p6q8r0s2t4v6w8y0z --from 2026-10-01T00:00:00Z
```

## Datos personales

Este endpoint contiene datos personales: usuarios del directorio (SCIM). [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.
