
# Logs eines Benutzers auflisten

`GET /v1/users/{user_id}/logs` · Berechtigung `logs:read`

Listet die Log-Einträge eines Benutzers mit Cursor-Paginierung auf, neueste zuerst. Dies sind die Daten hinter der Aktivitätsansicht des Benutzers im Dashboard. Es gelten dieselben Regeln wie bei [Logs auflisten](/docs/api/management/logs/list), allerdings werden nur die Filter `from`, `to`, `type` und `org_id` akzeptiert; andere Filter werden ignoriert.

## Organisationsumfang

Übergeben Sie `org_id`, um eine Diagnoseansicht der Mitglieder für einen Organisationsadministrator zu erstellen. Der Schlüssel benötigt dann zusätzlich die Berechtigung `organizations:read`. Ist der Benutzer kein Mitglied dieser Organisation (keine Mitgliedschaft mit Status `invited`, `active` oder `suspended`), schlägt die Anfrage mit `404 not_found` fehl, derselben Antwort wie bei einem unbekannten Benutzer. Ist der Benutzer Mitglied, werden nur Einträge zurückgegeben, die im Kontext dieser Organisation entstanden sind, also Einträge, deren `org_id` diese Organisation ist. Anmeldungen des Benutzers außerhalb der Organisation oder im Kontext einer anderen Organisation werden nie zurückgegeben. Ohne `org_id` umfasst die Ansicht alle Einträge des Benutzers in der Umgebung.

## Anfrage

| Parameter | In | Pflicht | Beschreibung |
|---|---|---|---|
| `user_id` | Pfad | ja | Benutzer-ID mit dem Präfix `usr_`. |
| `limit` | Query | nein | Seitengröße, 1 bis 100. Standardwert 20. |
| `after` | Query | nein | Undurchsichtiger Cursor aus `list_metadata.after` (ältere Einträge). Schließt `before` aus. |
| `before` | Query | nein | Undurchsichtiger Cursor aus `list_metadata.before` (neuere Einträge). Schließt `after` aus. |
| `from` | Query | nein | RFC-3339-Zeitpunkt; Einträge ab diesem Zeitpunkt. Muss innerhalb des Aufbewahrungszeitraums liegen. |
| `to` | Query | nein | RFC-3339-Zeitpunkt; Einträge vor diesem Zeitpunkt. Muss später als `from` sein. |
| `type` | Query | nein | Präfix des Log-Typs, etwa `authentication.` oder `session.created`. Wiederholen Sie den Parameter für bis zu 20 Werte; ein Eintrag, der einem davon entspricht, wird zurückgegeben. |
| `org_id` | Query | nein | Organisations-ID mit dem Präfix `org_`. Beschränkt die Ansicht auf Einträge dieser Organisation; siehe [Organisationsumfang](#organisationsumfang). Benötigt `organizations:read`. |

Einträge werden immer nach `occurred_at` sortiert, neueste zuerst; es gibt keinen Parameter `order` (`order=desc` wird akzeptiert, jeder andere Wert schlägt mit `validation_failed` fehl). Ein Cursor ist nur mit den Filtern gültig, für die er ausgestellt wurde.

## Antwort

`200 OK`. `data` enthält die Einträge der Seite; `list_metadata.after` verweist auf ältere und `list_metadata.before` auf neuere Einträge (`null`, wenn es keine gibt). Eine Gesamtanzahl wird nicht zurückgegeben. Leere Felder sind `null`.

`ip`, `ip_asn`, `user_agent` und `user_agent_family` sind nur vorhanden, wenn der Schlüssel die Berechtigung `audit-events:read_ip` besitzt, und `identifier_hint` nur, wenn er `users:read_pii` besitzt. Ohne die Berechtigung wird das Feld vollständig weggelassen (kein maskierter Wert). `ip_country` wird immer zurückgegeben.

```json
{
  "data": [
    {
      "id": "evt_01j9xk3m7q8r2s4t6v8w0y2z4a",
      "occurred_at": "2026-10-01T08:15:42.120Z",
      "type": "authentication.password.failed",
      "outcome": "failure",
      "reason_code": "invalid_credentials",
      "user_id": "usr_0a1b2c3d4e5f6g7h8j9k0m1n2p",
      "org_id": null,
      "application_id": "app_01j9xk3m7q8r2s4t6v8w0y2z4b",
      "connection_id": "conn_01j9xk3m7q8r2s4t6v8w0y2z4c",
      "directory_id": null,
      "session_id": null,
      "identifier_hint": "a***@e***.com",
      "ip": "203.0.113.7",
      "ip_country": "DE",
      "ip_asn": 64500,
      "user_agent": "Mozilla/5.0 (X11; Linux x86_64)",
      "user_agent_family": "Firefox",
      "risk": null,
      "auth_context": null,
      "act_chain": null,
      "details": {"attempt": 3},
      "request_id": "0192a6c1-7d3e-7a10-9b2c-3d4e5f607182",
      "correlation_id": null,
      "trace_id": "4bf92f3577b34da6a3ce929d0e0e4736"
    }
  ],
  "list_metadata": {
    "before": null,
    "after": "<opaque cursor>"
  }
}
```

## Fehler

Jeder Fehler ist ein `application/problem+json`-Body mit einem stabilen `code`.

| HTTP | `code` | Wann |
|---|---|---|
| 400 | `invalid_cursor` | Der Cursor ist fehlerhaft oder wurde nicht für diese Anfrage ausgestellt. |
| 400 | `invalid_filter` | Der Log-Dienst hat einen Filter oder den Cursor abgelehnt. |
| 400 | `range_outside_retention` | `from` liegt vor dem Aufbewahrungszeitraum Ihres Tarifs. |
| 422 | `validation_failed` | Ein Query-Parameter ist ungültig (`limit` außerhalb des Bereichs, fehlerhafter Zeitstempel, `to` nicht nach `from`, mehr als 20 Werte für `type`, fehlerhafte `org_id`, wiederholter Parameter). |
| 401 | `unauthenticated` | Der API-Schlüssel fehlt, ist ungültig oder wurde widerrufen. |
| 403 | `insufficient_permissions` | Dem Schlüssel fehlt die Berechtigung `logs:read`, oder `org_id` ist gesetzt und dem Schlüssel fehlt `organizations:read`. `required_permissions` listet auf, was die Anfrage benötigt. |
| 404 | `not_found` | Die Benutzer-ID ist fehlerhaft, oder `org_id` ist gesetzt und der Benutzer ist kein Mitglied dieser Organisation. |
| 429 | `rate_limited` | Das Ratenlimit wurde überschritten; beachten Sie `Retry-After`. |
| 503 | `service_unavailable` | Eine Abhängigkeit ist vorübergehend nicht verfügbar; versuchen Sie es später erneut. |

## Beispiel

```bash
curl "https://api.eu.keenauth.com/v1/users/usr_0a1b2c3d4e5f6g7h8j9k0m1n2p/logs?limit=50" \
  -H "Authorization: Bearer $KEENAUTH_SECRET_KEY"
```

Nur die Einträge einer Organisation:

```bash
keenauth users logs list usr_0a1b2c3d4e5f6g7h8j9k0m1n2p --org-id org_01j9xk3m7q8r2s4t6v8w0y2z4d --type authentication.
```

## Personenbezogene Daten

Dieser Endpunkt enthält personenbezogene Daten: Umgebungslogs. [Personenbezogene Daten in den KeenAuth-APIs](/docs/policies/personal-data) beschreibt, was gespeichert wird, wie lange es aufbewahrt wird und wie es gelöscht wird. Senden Sie in keinem Feld besondere Kategorien personenbezogener Daten (Gesundheitsdaten, biometrische Daten, Religion, politische Meinungen, sexuelle Orientierung).
