Docs/API y webhooks/Registro de auditoría

Registro de auditoría

Cada mutación en tu organización —tanto acciones desde la UI de administración como llamadas a la API pública— se registra en un único flujo de auditoría. Usa estos endpoints para enviar ese flujo a un SIEM, construir informes internos de cumplimiento o investigar un cambio concreto. Scope requerido en la API key: audit-log:read.

Endpoints

MétodoRutaScopePropósito
GET/api/public/v1/audit-logaudit-log:readLista paginada de eventos de auditoría con filtros opcionales.
GET/api/public/v1/audit-log/actionsaudit-log:readNombres de acción distintos registrados alguna vez para tu organización. Útil para construir un desplegable de filtro.

Qué se registra

Las llamadas a la API pública se auditan automáticamente. La entrada lleva actorRole = "api_key" y actorEmail = "apikey:<apiKeyId>", donde <apiKeyId> es el UUID completo de la API key que hizo la llamada (no el prefijo scs_live_… del token). Las acciones desde la UI de administración usan el email de la persona y su rol org_admin. Los dos flujos se entremezclan en el mismo registro, de modo que una sola exportación cubre todo el historial de cambios.

Listar eventos de auditoría

Devuelve los eventos del más nuevo al más antiguo. Todos los filtros son opcionales y pueden combinarse.

GET /api/public/v1/audit-log
  ?action=sarif.ingested
  &actorEmail=apikey:7d8a3e0b-4f12-4cd6-b9e1-21f6cf5d4a73
  &from=2026-05-01T00:00:00Z
  &to=2026-05-29T23:59:59Z
  &page=1
  &pageSize=50
Authorization: Bearer scs_live_…

Parámetros de consulta

ParámetroTipoPor defectoNotas
actionstringCoincidencia exacta del nombre de acción. Toma los valores válidos desde /audit-log/actions.
actorEmailstringCoincidencia exacta del email del actor. Para entradas de API key usa la forma apikey:<api-key-uuid>.
fromISO 8601Límite inferior inclusivo sobre createdAt (UTC).
toISO 8601Límite superior inclusivo sobre createdAt (UTC).
pageinteger1Índice de página en base 1.
pageSizeinteger50Limitado a 200. Los valores fuera de 1–200 se ajustan a 50.

Respuesta

{
  "items": [
    {
      "id": "0e7a3b4c-9d2f-4e1a-b6c8-2c4f8d5a1e90",
      "createdAt": "2026-05-29T13:42:11.318Z",
      "actorEmail": "apikey:7d8a3e0b-4f12-4cd6-b9e1-21f6cf5d4a73",
      "actorRole": "api_key",
      "action": "assignment.created",
      "targetType": "assignment",
      "targetId": "b1d8c2a0-7e34-4f9a-9d51-8e2c91a4f607",
      "targetLabel": "jane.smith@acme.com / SQL Injection",
      "metadata": "{\"topicId\":\"sql-injection\",\"deadlineDays\":14}",
      "ipAddress": "203.0.113.42"
    },
    {
      "id": "ba98c9d4-5f60-4b21-9c0e-3f72e1b58a44",
      "createdAt": "2026-05-29T13:41:08.902Z",
      "actorEmail": "amelia.ng@acme.com",
      "actorRole": "org_admin",
      "action": "user.invited",
      "targetType": "user",
      "targetId": "c4f1d22a-83b7-4d2c-9a01-7e6b5d1f9c33",
      "targetLabel": "jane.smith@acme.com",
      "metadata": null,
      "ipAddress": "203.0.113.7"
    }
  ],
  "total": 2841,
  "page": 1,
  "pageSize": 50
}
  • metadata es una cadena JSON (no un objeto). Parseála en el cliente; su forma varía por acción.
  • total refleja el recuento total filtrado, no solo el de la página actual: divídelo por pageSize para deducir el número de páginas.
  • El User-Agent y otros headers de la solicitud se guardan en el lado del servidor para análisis forense, pero no se devuelven en esta respuesta.

Ejemplo

curl -sS \
  -H "Authorization: Bearer $SCH_API_KEY" \
  "https://api.limeplate.com/api/public/v1/audit-log?from=2026-05-01T00:00:00Z&pageSize=200"

Listar acciones distintas

Devuelve todos los nombres de acción registrados alguna vez para tu organización, ordenados alfabéticamente. La lista está acotada a la organización: un tenant nuevo devuelve un array vacío hasta que empiezan a fluir los eventos.

GET /api/public/v1/audit-log/actions
Authorization: Bearer scs_live_…

Respuesta

[
  "apikey.created",
  "apikey.revoked",
  "assignment.completed",
  "assignment.created",
  "course.published",
  "sarif.ingested",
  "user.invited",
  "user.role_changed",
  "webhook.created"
]

Ejemplo

curl -sS \
  -H "Authorization: Bearer $SCH_API_KEY" \
  https://api.limeplate.com/api/public/v1/audit-log/actions

Enviar a un SIEM

El patrón habitual es hacer polling sobre /audit-log en un cron, pasando from igual al último createdAt ingerido y recorriendo páginas hasta items.length < pageSize. Como los resultados están ordenados del más nuevo al más antiguo, un recolector incremental debería invertir la página antes de emitir los eventos para que el orden aguas abajo sea cronológico. No hay webhook de streaming de auditoría en v1: combina el polling de auditoría con los webhooks de dominio específicos documentados en Webhooks cuando además necesites reacción de baja latencia a eventos concretos.