Available

Use the audit record

Read and search your project's audit record, send its entries to your log tools, and check that no entry was changed or removed.

Every sign-in, grant, approval and denial in a project is written to one audit record, for people and AI agents alike. Read it in the AuthFI console, or send it to the log tools you already use.

Use this guide to find out who did what, to keep a copy of the record in your own systems, and to check that the record was not altered.

Before you begin

You need:

  • Access to Security > Audit in the console.
  • To send entries elsewhere: access to Integrations > Connections, and the details and the credential your destination needs. They are listed in Send entries to your log tools.

Read the record

In the console, open Security > Audit. The page lists the entries, newest first.

ColumnShows
What happenedThe action
WhoThe actor
On whatThe resource
Refused atFor a denial, the gate that denied it
AttestedWhether the chain covers the entry
WhenWhen it was recorded

Entries come in pages. To see older entries, choose Load earlier events.

What an entry contains

Each entry records one event: who did something, what they did, and what they did it to.

{
  "id": "0d6c1b9e-...",
  "actor": "agent:agt_7c21...",
  "action": "agent.authorize.denied",
  "resource": "mcp:payments.refund",
  "recorded_at": "2026-10-10T09:14:07Z",
  "metadata": {
    "decision": "deny",
    "reason": "constraint:max",
    "request_id": "req_81f...",
    "country": "IN"
  }
}
FieldMeaning
idThe entry's identifier
actorWho did it: user:, agent: or app: and an ID
actionWhat was done, as a dotted name
resourceWhat it was done to: a kind and an ID
recorded_atWhen, in UTC
metadataThe details: the decision and reason, the session, where from

metadata often carries these keys:

KeyMeaning
decision, reasonAllowed or denied, and why
session_id, request_idThe session and the request this belongs to
ip_prefix, country, cityWhere it came from. The address is shortened, not stored whole.
device_hashA fingerprint of the device, not the device's details

Search the record

On Security > Audit, narrow the record in two ways.

Choose a lens. The tiles at the top of the page each show one part of the record: Events, People & admin, AI response and Datapath. Choose a tile to see only that part.

Filter by actor or resource. Two fields filter the entries:

FieldEnterFinds
WhoThe exact actor, for example user:[email protected]Everything one person or agent did
On whatThe exact resource, as the record names itEverything that happened to one thing

Filters match exactly. A partial name matches nothing.

To clear the filters, choose Show the whole record.

Count denials

In the console, open Security > Signals. Choose Last 24 hours, Last 7 days or Last 30 days.

The page counts the denials in that time. The table groups them by the reason given and the gate that denied the request, in the columns Cause, Refused at and Refusals.

How long entries are kept

The audit record is kept for 15 days on the Team plan and 30 days on the Professional plan. On the Enterprise plan you set the period yourself.

To keep entries longer, send them to a log tool as they are written. Entries you export are yours to keep for as long as you need.

Send entries to your log tools

A log destination is a connection in your project.

Choose the destination

In the console, open Integrations > Connections and choose Connect something. Choose your log tool. The log destinations are grouped under the heading Where the audit tape goes.

Enter the settings

On the Settings step, enter a Name for the connection. The Connections list uses this name. Then enter the details for your destination.

DestinationYou provide
Any HTTPS endpointA URL and a token
SplunkThe HEC URL, a token and an index
Grafana LokiThe URL, a username and a token
Amazon S3A bucket, region, prefix and an access key
Google Cloud StorageA bucket, prefix and a service account key
BigQueryA project, dataset, table and a service account key
Microsoft SentinelThe ingestion endpoint, rule ID, stream and an app registration

A credential you enter is sealed when you save, and is never shown again.

Review and connect

Choose Review. Nothing is saved at this point. Check the values, then choose Connect.

The Done step confirms that the connection is saved. Choose All connections to see it in the list.

Risk findings can also be sent to PagerDuty, AWS Security Hub and Google Security Command Center. Add them the same way, under Where security findings go and Who gets paged.

What a destination receives

Entries are sent in batches, about once a minute. An HTTPS endpoint receives them as newline-delimited JSON. Each line sent is one entry:

{
  "id": "0d6c1b9e-...",
  "tenant_id": "...",
  "actor": "user:[email protected]",
  "action": "login.succeeded",
  "resource": "app:grafana",
  "recorded_at": "2026-10-10T09:14:07Z",
  "metadata": {}
}
Delivery is at least once

After a failure, a batch is sent again. An entry can arrive twice and is never lost. Use id to drop duplicates.

Check that it works

Sign in to an application in the project, then look in your destination. Within about a minute, a batch arrives that contains a login.succeeded entry with your own account as actor.

The same entry appears on Security > Audit. Enter your own account in Who, for example user:[email protected], to find it.

Check that the record was not altered

Entries are chained. Each entry carries a hash computed from the entry before it and from its own contents. An entry cannot be changed, removed or inserted without breaking every hash after it.

The console checks the chain each time you open Security > Audit, and shows the result in a banner at the top of the page.

Banner titleMeaning
Record intactEvery entry checked links to the one before it
This record has been alteredThe chain breaks. The banner names the first entry that does not fit, and why.
Could not verify the chainThe check did not complete on this load. Choose Check again.

Record intact also reports how many entries were checked, and how many exist in all.

The check looks for four things:

  • A gap in the numbering
  • A link that does not match
  • A missing entry
  • An entry whose contents no longer produce its hash

Troubleshooting

What you seeCauseFix
The same entry arrives twice at a destinationA batch was sent again after a failureDrop duplicates by id
A filter returns nothing for a value you expectFilters match exactlyEnter the whole actor or resource
The banner This record has been alteredAn entry was changed, removed or insertedStart from the entry the banner names
The banner Could not verify the chainThe check did not complete on this loadChoose Check again

Next steps