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étodo | Ruta | Scope | Propósito |
|---|---|---|---|
GET | /api/public/v1/audit-log | audit-log:read | Lista paginada de eventos de auditoría con filtros opcionales. |
GET | /api/public/v1/audit-log/actions | audit-log:read | Nombres 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ámetro | Tipo | Por defecto | Notas |
|---|---|---|---|
action | string | — | Coincidencia exacta del nombre de acción. Toma los valores válidos desde /audit-log/actions. |
actorEmail | string | — | Coincidencia exacta del email del actor. Para entradas de API key usa la forma apikey:<api-key-uuid>. |
from | ISO 8601 | — | Límite inferior inclusivo sobre createdAt (UTC). |
to | ISO 8601 | — | Límite superior inclusivo sobre createdAt (UTC). |
page | integer | 1 | Índice de página en base 1. |
pageSize | integer | 50 | Limitado 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
}metadataes una cadena JSON (no un objeto). Parseála en el cliente; su forma varía por acción.totalrefleja el recuento total filtrado, no solo el de la página actual: divídelo porpageSizepara 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/actionsEnviar 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.