Elenca eventi di audit
GET /v1/audit-events · autorizzazione audit-events:read
Elenca i record di audit dell'ambiente con paginazione a cursore, dal più recente al più vecchio. Il flusso admin contiene le modifiche fatte tramite l'API di gestione, la dashboard e la piattaforma; il flusso application contiene gli eventi scritti dalla tua applicazione. Ogni record fa parte di una catena di hash per ambiente e flusso, quindi la cronologia può essere verificata in modo indipendente con un export (POST /v1/audit-exports).
L'ambiente proviene sempre dalla chiave API; non esiste un parametro per l'ambiente.
Richiesta
| Parametro | In | Obbligatorio | Descrizione |
|---|---|---|---|
limit |
query | no | Dimensione della pagina, da 1 a 100. Predefinito 20. |
after |
query | no | Cursore opaco da list_metadata.after (record più vecchi). Esclusivo con before. |
before |
query | no | Cursore opaco da list_metadata.before (record più recenti). Esclusivo con after. |
stream |
query | no | admin (predefinito) oppure application. |
from |
query | no | Orario RFC 3339; record a partire da questo orario. Predefinito: il più recente tra l'inizio della finestra di conservazione e to meno 92 giorni. |
to |
query | no | Orario RFC 3339; record prima di questo orario. Predefinito: ora. L'intervallo da from a to è al massimo di 92 giorni. |
action |
query | no | Prefisso dell'azione, ad esempio user. o connection.updated. |
category |
query | no | authentication, session, token, administration, provisioning, federation, authorization, data_access, security, key_management, configuration oppure application. |
actor_type |
query | no | Tipo di attore, ad esempio api_key, dashboard_user, m2m_client, agent o system. |
actor_id |
query | no | ID esatto dell'attore come registrato (key_…, usr_…, system:<service>). |
target_type |
query | no | Tipo di destinazione, ad esempio user, organization o audit_export. |
target_id |
query | no | ID esatto della destinazione. Con target_type, entrambi devono corrispondere alla stessa destinazione. |
org_id |
query | no | Record relativi a un'organizzazione (org_…). |
outcome |
query | no | success, failure, denied oppure error. |
request_id |
query | no | Idp-Request-Id di una richiesta (UUID). |
correlation_id |
query | no | Idp-Correlation-Id di un flusso di lavoro (UUID). |
agent_only |
query | no | true restituisce solo le azioni degli agenti: actor_type agent oppure un act_chain non vuoto. |
client |
query | no | Tipo di client che ha effettuato la chiamata: mcp (il server MCP di gestione, metadata.client = mcp/<version>) oppure cli (la CLI di KeenAuth, cli/<version>). Il client dichiara questo valore da sé; non è una prova di chi ha agito, lo è l'attore del record. Solo per l'elenco: un export non ha il filtro client. |
I record sono sempre ordinati per occurred_at (poi id), dal più recente al più vecchio; non esiste un parametro order (order=desc è accettato, qualsiasi altro valore fallisce con validation_failed). Un cursore è valido solo con i filtri e l'ambiente per cui è stato emesso. Non viene restituito alcun conteggio totale.
Una ricerca che impiega più di 10 secondi si interrompe con 422 search_too_broad: restringi i filtri o l'intervallo di tempo, oppure usa un export per intervalli ampi.
Risposta
200 OK. data contiene i record della pagina; list_metadata.after punta ai record più vecchi e list_metadata.before a quelli più recenti (null quando non ce ne sono). I campi vuoti sono null.
ip e user_agent sono presenti solo quando la chiave ha l'autorizzazione audit-events:read_ip e sono valorizzati solo per i record più recenti di 13 mesi. Senza l'autorizzazione i campi vengono omessi del tutto (nessun valore mascherato). ip_prefix, ip_country, ip_asn e user_agent_family vengono sempre restituiti. prev_hash, org_prev_hash e record_hash sono valori SHA-256 in base64url senza padding.
{
"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>"
}
}
Errori
Ogni errore è un corpo application/problem+json con un code stabile.
| HTTP | code |
Quando |
|---|---|---|
| 400 | invalid_cursor |
Il cursore è malformato oppure non è stato emesso per questa richiesta. |
| 400 | invalid_filter |
Il servizio di audit ha rifiutato un filtro, ad esempio un intervallo superiore a 92 giorni. |
| 400 | range_outside_retention |
from o to è fuori dalla finestra di conservazione dell'audit del tuo piano. |
| 422 | validation_failed |
Un parametro di query non è valido (limit fuori intervallo, timestamp errato, to non successivo a from, stream, category o outcome sconosciuto, ID malformato, parametro ripetuto, order diverso da desc). |
| 422 | search_too_broad |
La ricerca ha impiegato più di 10 secondi; restringila. |
| 401 | unauthenticated |
La chiave API manca, non è valida o è stata revocata. |
| 403 | insufficient_permissions |
La chiave non ha audit-events:read. |
| 429 | rate_limited |
È stato superato il limite di richieste; rispetta Retry-After. |
| 503 | service_unavailable |
Una dipendenza è temporaneamente non disponibile; riprova più tardi. |
Esempio
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
Dati personali
Questo endpoint contiene dati personali: eventi di audit. Dati personali nelle API di KeenAuth descrive cosa viene memorizzato, per quanto tempo viene conservato e come viene cancellato. Non inviare categorie particolari di dati personali (salute, dati biometrici, religione, opinioni politiche, orientamento sessuale) in nessun campo.