---
title: "Audit-Log auflisten"
description: "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](/de/api/organization/export-audit-log).

## 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)

```bash
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)

```json
{
  "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](/api/organization/export-audit-log) 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 ist
- `400 userMustBelongToOrg`, wenn sich aus Sitzung oder Token keine Organisation ableiten lässt
- `401 unauthorized`, wenn du nicht angemeldet bist
- `403 forbidden`, wenn du kein Organisations-Admin bist
