Dokumente/API & Webhooks/Audit-Protokoll

Audit-Protokoll

Jede Mutation in Ihrer Organisation — Administrator-UI-Aktionen und Public-API-Aufrufe gleichermaßen — wird in einem einzigen Audit-Stream aufgezeichnet. Verwenden Sie diese Endpunkte, um diesen Stream in ein SIEM zu liefern, interne Compliance-Berichte zu erstellen oder eine spezifische Änderung zu untersuchen. Erforderlicher Geltungsbereich auf dem API-Schlüssel: audit-log:read.

Endpunkte

MethodePfadGeltungsbereichZweck
GET/api/public/v1/audit-logaudit-log:readPaginierte Liste von Audit-Ereignissen mit optionalen Filtern.
GET/api/public/v1/audit-log/actionsaudit-log:readDistinct-Aktionsnamen, die jemals für Ihre Organisation aufgezeichnet wurden. Nützlich zum Erstellen eines Filter-Dropdowns.

Was aufgezeichnet wird

Public-API-Aufrufe werden automatisch auditiert. Der Eintrag trägt actorRole = "api_key" und actorEmail = "apikey:<apiKeyId>", wobei <apiKeyId> die vollständige UUID des API-Schlüssels ist, der den Aufruf gemacht hat (nicht der scs_live_…-Token-Präfix). Administrator-UI-Aktionen verwenden die E-Mail des Menschen und seine org_admin-Rolle. Die zwei Streams sind im selben Log vermischt, sodass ein einzelner Export die gesamte Änderungshistorie abdeckt.

Audit-Ereignisse auflisten

Gibt Ereignisse neueste-zuerst zurück. Alle Filter sind optional und können kombiniert werden.

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_…

Abfrageparameter

ParameterTypStandardHinweise
actionstringExakter Aktionsname. Holen Sie gültige Werte aus /audit-log/actions.
actorEmailstringExakte Akteur-E-Mail. Für API-Schlüssel-Einträge verwenden Sie die Form apikey:<api-key-uuid>.
fromISO 8601Inklusive Untergrenze auf createdAt (UTC).
toISO 8601Inklusive Obergrenze auf createdAt (UTC).
pageinteger11-basierter Seitenindex.
pageSizeinteger50Begrenzt auf 200. Werte außerhalb von 1–200 fallen auf 50 zurück.

Antwort

{
  "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 ist ein JSON-String (kein Objekt). Parsen Sie ihn clientseitig; die Form variiert pro Aktion.
  • total spiegelt die vollständige gefilterte Anzahl wider, nicht nur die aktuelle Seite — teilen Sie durch pageSize, um die Seitenanzahl abzuleiten.
  • User-Agent und andere Anfrage-Header werden serverseitig für Forensik gespeichert, werden aber nicht in dieser Antwort zurückgegeben.

Beispiel

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"

Distinct-Aktionen auflisten

Gibt jeden Aktionsnamen zurück, der jemals für Ihre Organisation aufgezeichnet wurde, alphabetisch sortiert. Die Liste ist organisationsbezogen — ein frischer Mandant gibt ein leeres Array zurück, bis Ereignisse zu fließen beginnen.

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

Antwort

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

Beispiel

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

Versand an ein SIEM

Das typische Muster ist, /audit-log per Cron abzufragen, wobei from gleich dem letzten createdAt ist, den Sie aufgenommen haben, und durch die Seiten zu laufen, bis items.length < pageSize. Da die Ergebnisse neueste-zuerst geordnet sind, sollte ein inkrementeller Fetcher die Seite umkehren, bevor Ereignisse emittiert werden, um die Downstream-Reihenfolge chronologisch zu halten. Es gibt kein Streaming-Audit-Webhook in v1 — koppeln Sie Audit-Polling mit den gezielten Domain-Webhooks, die unter Webhooks dokumentiert sind, wenn Sie auch eine niedrige Latenzreaktion auf spezifische Ereignisse benötigen.