Skip to main content

Read the Team Audit Trail

What you'll build: a filtered view of your team's audit trail that answers one specific question — who revoked that key, who changed a role, who moved production to the version that is live — and a URL you can paste into a ticket so a teammate sees exactly the same rows.

AcruxCore records two different kinds of history, and it helps to keep them apart. A trace is traffic: a call your application made. An audit event is a change: something a person did to the workspace. Every write the platform performs is recorded as an audit event with the person behind it — prompts, versions and aliases, tools and their bindings, members and invites, API keys, gateway credentials, models, virtual keys, budgets, secrets, and the team's trace settings. The team-wide trail is readable by the owner and admin roles; an editor or viewer sees a short message instead of the table.

1. Open it from the Team page

Open Team in the sidebar and scroll to the bottom. The Recent activity panel shows the five newest events and the total the team has recorded, with View audit trail leading to the full screen.

The Team page's Recent activity panel, reading 1,005 recorded actions in this team, listing five API key events with their actor and age, and a View audit trail button

Audit trail is also in the sidebar, directly under Team. It only appears for the two roles that can read it, so a teammate who cannot open the page is never shown a link to it.

2. Read the table

The trail is newest first, 25 events to a page.

The Audit trail page showing 1,005 events recorded, with area, event and actor filters above a table of API key and prompt events

Each column answers one thing:

  • Time — how long ago, hovered for the exact timestamp.
  • Area — which part of the platform the event belongs to.
  • Event — what happened, in words rather than the stored event name.
  • Detail — the part that makes the row readable, built from what was recorded: the key name, an alias move as production · v1 → v2, a budget as key · day · $5.00. A member event names the person it happened to by email address, so a removal does not read as a bare id. A dash means the event carried nothing worth showing.
  • Actor — who did it.

Prompt and tool events also carry a view prompt link, which takes you to the prompt the event changed.

3. Filter by area

The platform can write thirty-four kinds of event, which is too many for one dropdown. Area groups them into seven, and picking one or more narrows the table.

The Area filter open, listing seven checkboxes: Prompts, Tools, Members and invites, API keys, Gateway, Secrets and Settings

The count under the filters follows what you picked, and a Clear filters link appears next to it. That count is the number of matching events in the whole team, not the number on the page in front of you — the filtering happens in the database, so a match 30 pages deep is still counted and still reachable.

4. Narrow to a single event

Once an area is chosen, the Event filter offers only the events inside it. Its placeholder changes to Every event in these areas to say so.

The Event filter open below the Gateway area chip, listing gateway events only — provider credential added, updated and deleted, virtual key created and revoked, budget created and updated — with 157 events match these filters above the table

Naming an event filters to exactly that event. Adding a filter always makes the result smaller, never larger, so the second filter you add cannot widen what the first one found.

The Audit trail filtered by the Gateway area and the Virtual key revoked event, reading 41 events match these filters above a table of virtual key revocations

5. Filter by person, then share the view

Actor lists everyone who appears in the trail, with how many events each of them has. That list is built from the recorded events rather than from the current member list, so someone who has already left the team is still there to select — which is usually the person a compliance question is about.

Every filter, and the page number, lives in the URL:

/team/audit?group=gateway&event=virtual_key_revoked&page=2

Copy the address and a teammate with the owner or admin role opens the same rows. Changing any filter returns you to page 1, so a narrowed search never leaves you on a page that no longer exists.

Doing this over the API

Two endpoints back this screen. Both take a session cookie rather than a Bearer API key: the team-wide trail is the one read in the platform an API key cannot make, because a record of what people did should not be readable by a program holding a key. Neither SDK wraps them for the same reason — this is a curl (or browser) call.

# The whole team's trail, newest first
curl "$ACRUXCORE_BASE_URL/teams/<team-id>/audit?limit=2" \
-H "Cookie: $ACRUXCORE_SESSION_COOKIE"
{
"data": [
{
"id": "3f84fa30-a1de-4ceb-a01c-aa33f0b1445b",
"event": "api_key_revoked",
"actor": { "id": "18c76b52-ee0d-4001-be8e-c29976488fbb", "email": "[email protected]" },
"metadata": { "apiKeyId": "1df65dba-c2d2-490d-a41f-8331a2f5990a" },
"createdAt": "2026-09-08T11:45:31.890Z",
"promptId": null,
"target": null
},
{
"id": "7cf02538-efaa-4940-a954-3eb2477dc3b2",
"event": "api_key_generated",
"actor": { "id": "18c76b52-ee0d-4001-be8e-c29976488fbb", "email": "[email protected]" },
"metadata": { "name": "video-capture", "apiKeyId": "1df65dba-c2d2-490d-a41f-8331a2f5990a" },
"createdAt": "2026-09-08T11:45:29.696Z",
"promptId": null,
"target": null
}
],
"total": 1005,
"page": 1,
"limit": 2
}
# Filter by event type — a comma-separated list, and `actorId` for one person
curl "$ACRUXCORE_BASE_URL/teams/<team-id>/audit?event=virtual_key_revoked&limit=1" \
-H "Cookie: $ACRUXCORE_SESSION_COOKIE"
{
"data": [
{
"id": "cd52109e-9859-4c60-9c30-f41b421a5545",
"event": "virtual_key_revoked",
"actor": { "id": "18c76b52-ee0d-4001-be8e-c29976488fbb", "email": "[email protected]" },
"metadata": { "virtualKeyId": "d4408560-8319-42e8-8d8e-12df7a37126e" },
"createdAt": "2026-09-07T05:14:42.692Z",
"promptId": null,
"target": null
}
],
"total": 41,
"page": 1,
"limit": 1
}

total follows the filter, which is what makes the count on the screen trustworthy.

# Everyone who appears in the trail, for the actor filter
curl "$ACRUXCORE_BASE_URL/teams/<team-id>/audit/actors" \
-H "Cookie: $ACRUXCORE_SESSION_COOKIE"
{
"data": [
{
"id": "18c76b52-ee0d-4001-be8e-c29976488fbb",
"email": "[email protected]",
"eventCount": 1005
}
]
}

A Bearer API key on either call returns 401, not a filtered list:

{ "error": { "code": "UNAUTHORIZED", "message": "Authentication required." } }

There is no CSV or JSON export yet, and no retention window to configure — every event is kept, and the way to hand a colleague a slice of the trail is the URL of the filtered view.

What's next