Lister les journaux
GET /v1/logs · autorisation logs:read
Liste les enregistrements de journal de l'environnement (connexions, sessions, jetons, MFA, protection contre les attaques et plus) avec pagination par curseur, du plus récent au plus ancien. Les enregistrements plus anciens que la période de conservation de votre offre (Free 7, Startup 14, Business 30, Enterprise 90 jours) ne sont jamais renvoyés.
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. |
from |
query | non | Heure RFC 3339 ; enregistrements à cette heure ou après. Doit se situer dans la période de conservation. |
to |
query | non | Heure RFC 3339 ; enregistrements antérieurs à cette heure. Doit être postérieure à from. |
type |
query | non | Préfixe de type de journal, comme authentication. ou session.created. Répétez le paramètre pour jusqu'à 20 valeurs ; un enregistrement correspondant à l'une d'elles est renvoyé. |
outcome |
query | non | success, failure, denied ou error. |
user_id, org_id, application_id, connection_id, directory_id, session_id |
query | non | Correspondance exacte sur l'identifiant préfixé (usr_, org_, app_, conn_, dir_, ses_). |
request_id |
query | non | Idp-Request-Id d'une requête (UUID), par exemple l'identifiant affiché sur une page d'erreur de connexion hébergée. |
correlation_id |
query | non | Idp-Correlation-Id d'un workflow (UUID). |
ip |
query | non | Adresse IP ou bloc CIDR (203.0.113.0/24). Nécessite audit-events:read_ip. |
ip_country |
query | non | Pays de l'IP, code ISO 3166-1 alpha-2 en majuscules (DE). |
q |
query | non | Préfixe de l'indice d'identifiant masqué (j***@). Nécessite users:read_pii. |
Les enregistrements sont toujours triés par occurred_at, 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 pour lesquels il a été émis.
Les filtres ip et q nécessitent leur autorisation même s'ils ne font que restreindre le résultat : sans elle, la requête échoue avec 403 insufficient_permissions avant toute recherche, afin qu'une clé ne puisse pas sonder des valeurs qu'elle n'est pas autorisée à lire.
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 s'il n'y en a pas). Aucun nombre total n'est renvoyé. Les champs vides valent null.
Les champs ip, ip_asn, user_agent et user_agent_family ne sont présents que si la clé possède l'autorisation audit-events:read_ip, et identifier_hint uniquement si elle possède users:read_pii. Sans cette autorisation, le champ est omis entièrement (aucune valeur masquée). ip_country est toujours renvoyé.
{
"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>"
}
}
Erreurs
Chaque erreur est un corps application/problem+json accompagné d'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 de journaux a rejeté un filtre ou le curseur. |
| 400 | range_outside_retention |
from est antérieur à la période de conservation de votre offre. |
| 422 | validation_failed |
Un paramètre de requête est invalide (limit hors plage, horodatage incorrect, to non postérieur à from, plus de 20 valeurs type, identifiant ou IP mal formé, paramètre répété). |
| 401 | unauthenticated |
La clé d'API est absente, invalide ou révoquée. |
| 403 | insufficient_permissions |
La clé ne possède pas logs:read, ou utilise ip sans audit-events:read_ip ou q sans users:read_pii (required_permissions indique ce dont la requête a besoin). |
| 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/logs?type=authentication.&outcome=failure&from=2026-10-01T00:00:00Z" \
-H "Authorization: Bearer $KEENAUTH_SECRET_KEY"
Données personnelles
Cet endpoint contient des données personnelles : les journaux de l'environnement. Données personnelles dans les API KeenAuth décrit ce qui est stocké, la durée de conservation et la manière dont elles sont supprimées. N'envoyez aucune catégorie particulière de données personnelles (santé, données biométriques, religion, opinions politiques, orientation sexuelle) dans aucun champ.