Audit-Log auflisten
Gibt das Audit-Log deiner Organisation zurück: wer wann was getan hat, filterbar nach Zeitraum, Bereich und Ergebnis.
GET /api/organization/audit
Gibt die protokollierten Aktionen deiner Organisation zurück, neueste zuerst. Ohne since umfasst die Liste die letzten 30 Tage. Einträge bleiben 12 Monate gespeichert; ältere innerhalb dieser Frist über since oder den Export.
Zugriff
Nur Organisations-Admins, per Sitzung oder organisationsweitem API-Token, dessen Aussteller Admin ist. Andere Rollen erhalten 403 forbidden. Agent-Tokens (verbundene Apps) werden für diesen Pfad abgewiesen. Die Organisation ergibt sich aus Sitzung oder Token; das Log einer anderen Organisation ist nicht lesbar.
Query-Parameter
| Parameter | Standard | Beschreibung |
|---|---|---|
since | 30 Tage vor jetzt | Unix-Zeit in Millisekunden, Untergrenze inklusiv. Ein früherer Wert liest weiter zurück. |
until | keiner | Unix-Zeit in Millisekunden, Obergrenze inklusiv: ein Eintrag genau zu until ist enthalten. |
limit | 100 | 1 bis 500. |
offset | 0 | 0 bis 50000. |
sortBy | ts | ts, actor, status, summary oder durationMs. |
sortOrder | desc | asc oder desc. |
q | keiner | Textfilter ohne Rücksicht auf Groß/Klein über Bereich, Zusammenfassung und E-Mail oder Nutzer-ID des Handelnden. |
area | keiner | Genauer Bereich, z. B. websites. |
success | keiner | true oder false. Einträge ohne Ergebnis fallen dann heraus. |
envelope | keiner | items antwortet { items, total, page, perPage }. |
total zählt die Einträge nach allen Filtern.
Beispiel (cURL)
BASE_URL="https://uptimeify.io"
TOKEN="<dein-api-token>"
curl -X GET "$BASE_URL/api/organization/audit?since=1759276800000&limit=50&envelope=items" \
-H "Authorization: Bearer $TOKEN" \
-H "Accept: application/json"Antwort (Response)
{
"items": [
{
"id": "4f1c2a9e-8b7d-4c3e-9f20-6a5b4c3d2e1f",
"ts": 1761126000000,
"organizationId": 1,
"area": "websites",
"summary": "Websites updated",
"actor": { "email": "admin@deine-agentur.de", "userId": "u_123" },
"success": true,
"durationMs": 42,
"type": "websites.update",
"method": "PATCH",
"route": "/api/websites/[id]",
"statusCode": 200,
"resourceType": "websites",
"resourceId": "17",
"changes": [{ "field": "name", "from": "Shop", "to": "Shop (live)" }]
}
],
"total": 1,
"page": 1,
"perPage": 50
}| Feld | Beschreibung |
|---|---|
ts | Unix-Zeit in Millisekunden. |
summary | Kurzbeschreibung auf Englisch. |
route | Routen-Vorlage, nie der rohe Pfad. |
actor | Wer gehandelt hat, oder null. |
ipAddress, userAgent | Nur bei Anfragen über eine verbundene App (MCP-Agent) erfasst. |
agent | Gesetzt, wenn eine verbundene App im Namen des Handelnden gehandelt hat. |
auth | { method, reason }, nur bei Anmelde-Ereignissen (type beginnt mit auth.). method: password, password_mfa oder sso bei einer Anmeldung; one, others oder all bei auth.sessions.revoked; sonst null. reason: Fehlercode einer fehlgeschlagenen Anmeldung (z. B. INVALID_EMAIL_OR_PASSWORD), sonst null. |
changes | Was zu was wurde, wo die Aktion es festhält. Geheime Werte werden nicht protokolliert (redacted: true). |
Listenform: Mit envelope=items kommt die Liste als { items, total, page, perPage } (perPage ist limit, page ist floor(offset / limit) + 1). Ohne den Parameter antwortet der Endpunkt noch in der bisherigen Form { "events": [...], "pagination": { "limit", "offset", "total" } }; sie ist veraltet, ab dem 18.01.2027 ist { items, ... } der Standard.
Anmelde-Ereignisse
Neben Anfragen protokolliert das Log diese type-Werte: auth.login.succeeded, auth.login.failed (nur bei bekanntem Konto; actor ist null), auth.logout, auth.password_reset.requested, auth.password_reset.completed, auth.password.changed, auth.sessions.revoked und app_link.redeemed (Anmeldung in der App per QR-Code). Der Typ audit.export hält jeden Export des Audit-Logs mit Zeitraum und Zeilenzahl fest. Anmelde-Ereignisse tragen nie ipAddress oder userAgent; gespeichert werden nur Konto, Zeit, Methode und Grund-Code.
Häufige Fehler
400 invalidRequestBody, wenn ein Query-Parameter außerhalb des Bereichs liegt oder falsch geformt ist400 userMustBelongToOrg, wenn sich aus Sitzung oder Token keine Organisation ableiten lässt401 unauthorized, wenn du nicht angemeldet bist403 forbidden, wenn du kein Organisations-Admin bist