Audit events
Query audit events by class, result, actor, resource, correlation, and payload
Audit events are the durable evidence trail for every governed action in a workspace. Each event records who acted, on what, under which scope, and with what result.
Refer to Audit events concept for how the trail is shaped.
Overview
Audit v1 is the public envelope and service version; the current event registry is the schema-v4 catalog. Stream Live Events shows the same record in real time. Export delivers retained history downstream. Continuous SIEM streaming is a separate forward-only path on Export data.
The typical workflow is:
- Browse the event catalog when you need field names and filterable payload keys.
- Query events with class, actor, resource, correlation, or payload filters.
- Get an event by ID when you need the full envelope.
- List or get an activity chain, or emit an
activity_idfor a run.
Requirements
Before you begin:
- Authenticate to Dome and select a workspace
- Have audit events in the workspace, or emit activity so chains appear
Permissions
Audit reads require platform permissions. People and scoped API keys query the trail. Agent credentials are not the usual path for investigation.
All workspace roles can query events, get an event by ID, and list or get activity chains with audit.view. Org owner and admin can also use org-scoped audit.view to query across the organization. Live streaming on Stream Live Events uses the same permission. Batch and scheduled delivery live under Export Data.
| Default roles | Permission | Grants |
|---|---|---|
| All workspace roles | audit.view | Query events, get by ID, list and get activity chains |
Org owner or admin | Org audit.view | Query events across every tenant and workspace in the org |
Browse the event catalog
List every audit event type Dome emits, then show field detail for one type. The same catalog powers the dashboard Event Catalog tab.
audit.view.dome audit catalog list
dome audit catalog show tool.callList is complete and unpaginated. Filter locally, then call show for field detail.
dome audit catalogTools: dome_audit_catalog_list, dome_audit_catalog_show
{ "event_type": "tool.call" }dome_audit_catalog_showOpen Settings → Eventing → Event Catalog to browse payload fields, sample bodies, and JSON schemas.
Query events
Query recent audit events. The default page returns the latest 50. Combine class, result, actor, resource, correlation, payload, and time filters to narrow the trail.
audit.view.Common flags: --limit, --types, --classes, --results, --agent-id, --since, --until, and repeatable --payload-filter. Full flags: refer to the CLI, MCP, and API references in the callouts below.
dome audit query --limit 10dome audit queryGET /v1/audit/events?page_size=10Filtered:
{
"event_types": ["tool.call"],
"stages": ["STAGE_ATTEMPTED", "STAGE_COMPLETED"],
"event_classes": ["EVENT_CLASS_GOVERNING"],
"results": ["RESULT_DENIED"],
"agent_id": "<uuid>",
"page_size": 50
}QueryEventsQuery the last 10 audit events.The response returns matched events plus a cursor. CLI, MCP, and dashboard use short enum tokens. The raw API uses full constants. Refer to enum rendering reference.
{
"events": [{
"event_id": "<uuid>",
"event_type": "tool.call",
"event_class": "governing",
"stage": "completed",
"result": "allowed",
"occurred_at": "2026-05-30T10:30:00Z",
"scope": { "kind": "workspace", "workspace_id": "ws_..." },
"actor": { "kind": "agent", "id": "agent_..." },
"primary_resource": { "kind": "tool_connection", "id": "conn_..." },
"request_surface": { "surface": "gateway_mcp" },
"correlation": { "trace_id": "0af7651916cd43dd8448eb211c80319c" },
"payload": { "@type": "type.googleapis.com/dome.audit.v1.ToolCallV1", "toolName": "database-query" }
}],
"next_page_token": "..."
}The pre-v1 total counter is gone. Use the cursor to walk the full result set.
Query events across an organization
Read audit across every tenant and workspace in one organization from an organization-scoped session or API key. Scope is derived from the authenticated identity; the request does not accept org_id. Set workspace_id only when you want to narrow an organization- or tenant-scoped read to one workspace.
audit.view (org owner or admin, or an org-scoped API key with audit.view).GET /v1/audit/events?event_classes=EVENT_CLASS_GOVERNING&results=RESULT_DENIED&start_time=2026-07-01T00:00:00Z&page_size=100QueryEventsQueryActivityChains remains workspace- and tenant-scoped. Org-scoped chains are not available yet.
CLI and MCP audit tools stay workspace-scoped today. Use the API (or an org-scoped platform key against QueryEvents) for org-wide reads.
Paginate results
Each response includes next_page_token. An empty token means the page was the last one.
dome audit query --limit 200
# ... copy the printed "Next page token: ..." value
dome audit query --limit 200 --page-token <token>{ "page_size": 200, "page_token": "<token-from-previous-response>" }Filter by class and result
Use class and result together to find denials, security signals, or audit access. Refer to event classes reference for the catalog.
# Every authorization deny in the workspace
dome audit query --classes governing --results denied
# All audit-access events — who looked at what
dome audit query --classes audit_access
# Failed logins and rejected agent-token exchanges
dome audit query --classes security --results denied --since 2026-06-01T00:00:00ZFilter by actor and producer
Slice by who acted and which service emitted the event.
dome audit query --actor-kind scheduled_job
dome audit query --producer-service gateway --request-surface gateway_mcpFor a Gateway, use producer_gateway_id through the QueryEvents API.
Filter by resource
dome audit query \
--primary-resource-kind rule_bundle \
--primary-resource-id <bundle-uuid>Reconstruct a request chain
Filter on a trace_id to return events from one request. Refer to correlation reference for the trace_id, operation_id, and parent_event_id contract.
dome audit query --trace-id 0af7651916cd43dd8448eb211c80319cFilter by payload
Apply payload filters to a query.
# Every tool call that targeted database-query
dome audit query --payload-filter "tool.call:toolName=database-query"
# Multiple values, multiple filters
dome audit query \
--payload-filter "tool.call:toolName=database-query,vector-search" \
--types authorization.evaluate --results deniedUse the JSON form for exists:
dome audit query --payload-filter '[
{"event_type":"tool.call","field":"toolName","operator":"exists"}
]'tool.call and model.call payloads carry bounded content references rather than raw request arguments by default. Cedar rules still evaluate resource.arguments.<key>.
Filter by time range
dome audit query \
--since 2026-05-01T00:00:00Z \
--until 2026-06-01T00:00:00ZGet event
Retrieve a single audit event by ID. Scope is derived from the caller's session. There is no workspace_id argument.
audit.view.dome audit get <event-id>dome audit getGET /v1/audit/events/<uuid>GetEventGoverning decision events that applied a loaded Rule bundle include decision provenance in the payload (bundle_etag, contributing_bundles, rule_id). The dashboard decision explainer deep-links those bundles to /rules/bundles?scope=<kind>&scopeId=<id>.
List activity chains
List activity chains in the active workspace. A chain is listed when any of its events matches the filter. Summary counts reflect the full chain. Refer to activity chains reference for their contract.
audit.view.# Recent chains in the active workspace
dome audit chains --limit 20
# Chains that contain a denied governing event
dome audit chains --classes governing --results denied
# Chains for one agent in the last 24 hours
dome audit chains --agent-id agent_01HQ... --since 2026-06-05T00:00:00Zdome audit chains{
"chains": [{
"activity_id": "case-12345",
"workspace_id": "ws_...",
"event_count": 47,
"first_at": "2026-06-05T10:30:00Z",
"last_at": "2026-06-05T10:34:21Z",
"allowed_count": 41,
"denied_count": 3,
"error_count": 1,
"agents": ["agent_..."],
"event_types": ["tool.call", "authorization.evaluate"],
"server_owned_count": 0,
"caller_asserted_count": 47
}],
"next_page_token": ""
}Get activity chain
Retrieve every event in one activity chain. Pass an activity_id to QueryEvents (or dome audit chain) to return events in cursor order.
# All events in one chain
dome audit chain case-12345
# Live tail one chain
dome audit stream --activity-id case-12345
# Filter the chain's events further
dome audit query --activity-id case-12345 --classes governing --results denieddome audit chainDenied operations
A refusal is the denied result of the operation itself. For example, a refused tool invocation is event_type=tool.call, stage=completed, and result=denied. The shared denial block names why. There is no separate denial event type.
denial.reason is a closed vocabulary: permission_denied, wrong_caller_type, tenant_mismatch, unauthenticated, immutable_entity, service_disabled, policy_denied, stale_policy, guard_blocked, act_as_rejected, credential_required, rate_limited, oversize, quota_exceeded, plan_limit, billing_locked, subscription_canceled, and org_suspended.
Read denial.required_permission only when reason=permission_denied. Plan, quota, Guard, and identity refusals are not permission deficits.
Treat denial.detail as operator context, not a stable programmatic contract.
Responses deliberately avoid exposing internal scope-resolution chains. Filter
and automate on reason and, where present, required_permission.
# Every denied operation in the last hour
dome audit query --results denied --since 1h
# Denied tool calls caused by a stale tenant scope
dome audit query \
--types tool.call \
--results denied \
--deny-reasons tenant_mismatch
# Guard-blocked tool and model calls
dome audit query \
--types tool.call,model.call \
--results denied \
--deny-reasons guard_blockedA tenant_mismatch row on a dashboard-initiated action almost always means the browser session's tenant scope drifted from the workspace's owning tenant — sign out and back in to re-scope the session.
Emit activity chain
Set activity_id on the emit side so events from one unit of work correlate. Pick an ID that maps to that unit, such as a case ID, job run, or conversation UUID. Chains are workspace-local, so human-meaningful IDs are safe.
Set --activity (or DOME_ACTIVITY_ID) so every API call in the run carries X-Dome-Activity-Id.
export DOME_ACTIVITY_ID="case-12345"
dome agents register --name worker
dome rules deploy ./rules
dome audit query --limit 5
dome audit chain case-12345--activity overrides DOME_ACTIVITY_ID. There is no implicit mint.
Wrap Dome API reads in client.session(). Pass an explicit ID to correlate work across processes.
with client.session() as session:
page = client.control.query_audit_events(
AuditQuery(event_types=("tool.call",), page_size=50),
)
event = client.control.get_audit_event(page.events[0].id)Send X-Dome-Activity-Id on every API request. Dome stamps the ID with caller-asserted trust and strips the header before third-party LLM or MCP egress.
GET /v1/audit/events
X-Dome-Activity-Id: case-12345Migrate legacy event queries
| Legacy audit query | Schema-v4 query |
|---|---|
mcp.tool_call.attempted / mcp.tool_call.completed | tool.call plus stage=attempted / stage=completed |
llm.model_call.attempted / llm.model_call.completed | model.call plus the stage filter |
mcp.tool_request.filtered, mcp.tool_result.filtered, or LLM Filter types | guard.filter.evaluate; use payload direction, connection type, tool, or model fields |
access.denied | The operation type plus result=denied; use --deny-reasons for the shared denial.reason |
agent.registered, agent.suspended, and other past-tense lifecycle names | Present-tense operations such as agent.register, agent.suspend, and agent.revoke |
Webhook subscriptions keep the public dome.webhook.v1 catalog. Do not rewrite webhook event names to audit names; where they differ, the webhook name remains authoritative on webhook deliveries.
Next steps
- Event catalog reference for every event type and its class
- Event contracts reference for the Audit v1 envelope, enum forms, and filter syntax
- Stream Live Events to stream events as they happen
- Export Data to ship retained records to SIEM and archival sinks
- Subscribe to Events to push signed events to external systems