Lister les événements d'audit

GET /v1/audit-events · autorisation audit-events:read

Liste les enregistrements d'audit de l'environnement avec une pagination par curseur, du plus récent au plus ancien. Le flux admin contient les modifications effectuées via l'API de gestion, le tableau de bord et la plateforme ; le flux application contient les événements écrits par votre application. Chaque enregistrement fait partie d'une chaîne de hachage par environnement et par flux, de sorte que l'historique peut être vérifié indépendamment à l'aide d'un export (POST /v1/audit-exports).

L'environnement provient toujours de la clé API ; il n'existe pas de paramètre d'environnement.

Requête

Paramètre Dans Obligatoire Description
limit query non Taille de page, de 1 à 100. Valeur par défaut : 20.
after query non Curseur opaque issu de list_metadata.after (enregistrements plus anciens). Exclusif avec before.
before query non Curseur opaque issu de list_metadata.before (enregistrements plus récents). Exclusif avec after.
stream query non admin (par défaut) ou application.
from query non Heure RFC 3339 ; enregistrements à cette heure ou après. Par défaut, la plus tardive entre le début de la fenêtre de conservation et to moins 92 jours.
to query non Heure RFC 3339 ; enregistrements antérieurs à cette heure. Par défaut, maintenant. La plage de from à to ne dépasse pas 92 jours.
action query non Préfixe d'action, tel que user. ou connection.updated.
category query non authentication, session, token, administration, provisioning, federation, authorization, data_access, security, key_management, configuration ou application.
actor_type query non Type d'acteur, tel que api_key, dashboard_user, m2m_client, agent ou system.
actor_id query non Identifiant exact de l'acteur tel qu'enregistré (key_…, usr_…, system:<service>).
target_type query non Type de cible, tel que user, organization ou audit_export.
target_id query non Identifiant exact de la cible. Avec target_type, les deux doivent correspondre à la même cible.
org_id query non Enregistrements concernant une organisation (org_…).
outcome query non success, failure, denied ou error.
request_id query non Idp-Request-Id d'une requête (UUID).
correlation_id query non Idp-Correlation-Id d'un workflow (UUID).
agent_only query non true ne renvoie que les actions d'agents : actor_type agent ou un act_chain non vide.
client query non Type de client ayant effectué l'appel : mcp (le serveur MCP de gestion, metadata.client = mcp/<version>) ou cli (la CLI KeenAuth, cli/<version>). Le client déclare lui-même cette valeur ; elle ne prouve pas qui a agi, c'est l'acteur de l'enregistrement qui le fait. Liste uniquement : un export n'a pas de filtre client.

Les enregistrements sont toujours triés par occurred_at (puis id), du plus récent au plus ancien ; il n'existe pas de paramètre order (order=desc est accepté, toute autre valeur échoue avec validation_failed). Un curseur n'est valide qu'avec les filtres et l'environnement pour lesquels il a été émis. Aucun nombre total n'est renvoyé.

Une recherche dépassant 10 secondes s'interrompt avec 422 search_too_broad : restreignez les filtres ou la plage de temps, ou utilisez un export pour les plages étendues.

Réponse

200 OK. data contient les enregistrements de la page ; list_metadata.after pointe vers les enregistrements plus anciens et list_metadata.before vers les plus récents (null lorsqu'il n'y en a pas). Les champs vides valent null.

ip et user_agent ne sont présents que si la clé possède l'autorisation audit-events:read_ip, et ne sont renseignés que pour les enregistrements de moins de 13 mois. Sans cette autorisation, les champs sont entièrement omis (aucune valeur masquée). ip_prefix, ip_country, ip_asn et user_agent_family sont toujours renvoyés. prev_hash, org_prev_hash et record_hash sont des valeurs SHA-256 en base64url sans remplissage.

{
  "data": [
    {
      "id": "evt_01j9xk3m7q8r2s4t6v8w0y2z4a",
      "stream": "admin",
      "seq": 4182,
      "schema_version": 1,
      "action": "user.blocked",
      "category": "administration",
      "outcome": "success",
      "reason_code": null,
      "occurred_at": "2026-10-01T08:15:42.120Z",
      "received_at": "2026-10-01T08:15:42.131Z",
      "recorded_at": "2026-10-01T08:15:42.140Z",
      "clock_anomaly": false,
      "actor_type": "api_key",
      "actor_id": "key_01j9xk3m7q8r2s4t6v8w0y2z4d",
      "act_chain": null,
      "session_id": null,
      "auth_context": null,
      "elevation_ref": null,
      "org_id": null,
      "targets": [
        {"type": "user", "id": "usr_0a1b2c3d4e5f6g7h8j9k0m1n2p", "org_id": null, "name": null}
      ],
      "application_id": null,
      "ip_prefix": "203.0.113.0/24",
      "ip_country": "DE",
      "ip_asn": 64500,
      "user_agent_family": "keenauth-go",
      "request_id": "0192a6c1-7d3e-7a10-9b2c-3d4e5f607182",
      "correlation_id": null,
      "trace_id": "4bf92f3577b34da6a3ce929d0e0e4736",
      "producer_service": "directory",
      "policy_ref": "perm:users:write",
      "changes": {"status": {"old": "active", "new": "blocked"}},
      "metadata": null,
      "prev_hash": "n4bQgYhMfWWaL-qgxVrQFaO_TxsrC4Is0V1sFbDwCgg",
      "org_prev_hash": null,
      "record_hash": "LCa0a2j_xo_5m0U8HTBBNBNCLXBkg7-g-YpeiGJm564"
    }
  ],
  "list_metadata": {
    "before": null,
    "after": "<opaque cursor>"
  }
}

Erreurs

Chaque erreur est un corps application/problem+json avec un code stable.

HTTP code Quand
400 invalid_cursor Le curseur est mal formé ou n'a pas été émis pour cette requête.
400 invalid_filter Le service d'audit a rejeté un filtre, par exemple une plage de plus de 92 jours.
400 range_outside_retention from ou to est en dehors de la fenêtre de conservation des audits de votre offre.
422 validation_failed Un paramètre de requête est invalide (limit hors plage, horodatage incorrect, to non postérieur à from, stream, category ou outcome inconnu, identifiant mal formé, paramètre répété, order autre que desc).
422 search_too_broad La recherche a dépassé 10 secondes ; restreignez-la.
401 unauthenticated La clé API est absente, invalide ou révoquée.
403 insufficient_permissions La clé ne possède pas audit-events:read.
429 rate_limited La limite de débit a été dépassée ; respectez Retry-After.
503 service_unavailable Une dépendance est temporairement indisponible ; réessayez plus tard.

Exemple

curl "https://api.eu.keenauth.com/v1/audit-events?action=user.&from=2026-10-01T00:00:00Z" \
  -H "Authorization: Bearer $KEENAUTH_SECRET_KEY"
keenauth audit-events list --action user. --from 2026-10-01T00:00:00Z

Données personnelles

Ce point de terminaison traite des données personnelles : des événements d'audit. Données personnelles dans les API KeenAuth décrit ce qui est stocké, pendant combien de temps il est conservé et comment il est supprimé. Ne transmettez de catégories particulières de données personnelles (santé, données biométriques, religion, opinions politiques, orientation sexuelle) dans aucun champ.