What the export contains
Each row is one audit entry, with the same fields the audit viewer shows:
A reveal of a Kubernetes Secret’s values is one row per Secret:
action_type reveal, resource_type kubernetes_secret, resource_id <namespace>/<name>, the cluster_id, and details holding the namespace, the Secret name, its key names and surface (portal for the console, api for an API token). The values themselves are never written. Filter on resource_type=kubernetes_secret to list who read which Secret.
In CSV the details column holds a JSON document, so keep the file quoted and parse it with a real CSV reader rather than splitting on commas - the details routinely contain commas and newlines.
Cell values that would otherwise be interpreted as formulas by a spreadsheet application are neutralised before they are written, so opening an export in a spreadsheet does not execute anything an actor put in a resource name.
Permissions
Export is gated by the sameaudit.read permission as the audit viewer, held by owners and admins by default and available to custom roles. A caller without it receives a 403 naming the missing permission.
Granting audit.read to a compliance or security function lets them pull evidence themselves without broader administrative access, which is usually what you want.
An API token calling the export needs the same permission: the role behind the token (the service account’s role, or the owner’s role for a personal token) must hold audit.read, and a token restricted to a list of scopes must include it.
Exporting from the portal
1
Open the audit log
Go to Organisation → Audit log.
2
Filter to the evidence you need
Narrow by user, action type, resource type and date range. The export follows the filters currently applied, so filter first.
3
Export
Choose the CSV or JSON export action. The file downloads with the organisation and date in its name, for example
audit-log-<organisation-id>-2026-08-13.csv.Exporting for automation
Scripts, scheduled jobs and SIEM collectors call the token route of the same export:-f makes curl fail on a 401 or 403 instead of writing the error body to the file. A token without audit.read receives a 403 naming the missing permission.
Row cap and truncation
A single export returns at most 100,000 rows. When more rows match your filters, the export is truncated to the newest ones and says so:- CSV responses set the
X-Ankra-Export-Truncated: trueresponse header. - JSON responses carry a
truncatedmember in the document.
Retention, and why you export
Audit entries are retained for 365 days by default, after which older rows are removed by a background retention job. If your framework requires a longer trail - and most do, with ISO/IEC 27001 and many SOC 2 programmes expecting multi-year retention - the platform is not your system of record. Export regularly into storage you control, with the retention and immutability your policy requires: for example a scheduled daily token export into write-once object storage.Forwarding to a SIEM
There is no push integration: your SIEM pulls. Run a scheduled job that exports a bounded window with a service token and hands the file to your SIEM’s ingestion, and keep the raw file in your evidence store as well - the SIEM is for detection, the file is for the assessor.1
Create a role that can only read the audit log
In Organisation → Roles, create a custom role holding
audit.read and nothing else.2
Mint a service token with that role
Create a service token named after the job, for example
siem-audit-export, with the role from the previous step, and store it in your scheduler’s secret store.3
Schedule the export
Pull one closed window per run - yesterday, in UTC - so every row arrives exactly once. Both window bounds are inclusive, so end the window one microsecond before midnight rather than at midnight.
date, as on GitHub-hosted Linux runners; the last step is a placeholder for your SIEM’s ingestion:
{"entries": [...], "truncated": false}, newest entry first, with the columns listed above as fields of each entry. Failing the job on truncated matters: a truncated window silently drops its oldest rows.
What the audit log does not cover
Being clear about the boundary saves you from over-claiming in an audit response.- Individual Kubernetes API calls are not in the audit log. Ankra records who was given Kubernetes access (grant changes, kubeconfig generation, token minting), every pod terminal session, with a transcript, and every reveal of a Secret’s values through the console or the API. Individual calls made against your cluster’s API server - by any tool, including
kubectlthrough Ankra’s proxy - are recorded by your cluster’s own Kubernetes audit policy. Enable Kubernetes audit logging separately if you need that trail. - Desired-state changes live in Git. What changed in a cluster definition, and who committed it, is in your repository’s history as attributed commits. The audit log records the platform action, and Git records the content of the change. See GitOps.
- Data-plane activity is not recorded. Ankra is not in your application’s request path and has no view of it.
Related
Audit Log
Read and filter the trail in the platform.
Compliance Management
The organisation compliance report and benchmark results.
Roles & Access
Grant
audit.read to a compliance function.Shared Responsibility
Where this evidence fits in your certification.