Investigate with the audit log (cross-tenant)
The canonical cross-tenant forensic read. Allow-listed filters only; cursor-paginated. Requires security-investigator. ip / userAgent are deliberately not exposed.
- GET /v1/admin/audit → audit entries across all tenants (filter by allow-listed params)
/v1/admin/auditadminCross-tenant audit queryFilters are an allow-list only — no raw columns, no $ne / bracket syntax; an unknown param → 400. Forensic-sensitive ip / userAgent are DELIBERATELY not exposed; act-as actions appear with actOperatorId / actReason (the cross-profile flow that produced them is scenario 37). Enhancement 4 added nine event codes worth filtering on: device_challenge_issued, device_trusted, device_trust_failed, device_untrusted, login_challenge_failed, registration_resumed, registration_completed, invitation_sent, login_mode_changed. device_trust_failed is the one to alert on — a CORRECT password followed by repeated device-challenge failures is the fingerprint of credential stuffing landing on a real account, a signal neither login_failed nor mfa_failed can express.
Field guide — what each value means & where it comes from9 fields
No request body — this is a bodyless GET with optional, allow-listed query filters only (all optional; default limit 20). Authorization is the security-investigator role gate via the gateway (Authorization / x-gateway-context handled by the tester); no step-up factor is required or accepted, and the .strict() schema rejects any unknown param.
tenantIdqueryUUIDoptionalfrom a responseuserIdqueryUUIDoptionalfrom a responseeventquerystringoptionalyou chooseoperatorIdqueryUUIDoptionalfrom a responseoutcomequeryenumoptionalyou choosesuccess— Return only audit entries whose recorded outcome was a success.failure— Return only audit entries whose recorded outcome was a failure.
fromqueryISO-8601optionalyou choosetoqueryISO-8601optionalyou chooselimitqueryintegeroptionalyou choosecursorquerystringoptionalfrom a responseGET https://api.kerja.team/v1/admin/audit?event=act_as_started&outcome=success&limit=20Response guide — what comes back & what each value means13 fields
200 OK returning the standard { data, meta } envelope (no special response headers; not a token endpoint so no Set-Cookie/Cache-Control). `data` is an array of AuditEntry items (forensic `ip`/`userAgent` are intentionally omitted); `meta` carries the result count and keyset cursor for pagination.
data[].idstringalwaysdata[].eventstringalwaysdata[].userIdUUIDconditionaldata[].tenantIdUUIDalwaysdata[].outcomeenumalwayssuccess— The audited action completed successfully.failure— The audited action failed or was denied.
data[].reasonstringconditionaldata[].actOperatorIdUUIDconditionaldata[].actReasonstringconditionaldata[].stepUpMethodenumconditionalpassword— Step-up was satisfied by re-entering the operator password.recoveryCode— Step-up was satisfied by a one-time recovery code (the other accepted operator step-up factor; the step-up set is { password?, recoveryCode? }).
data[].traceIdstringalwaysdata[].occurredAtISO-8601alwaysmeta.countintegeralwaysmeta.nextCursorstringconditional