What gets recorded
The audit log captures every state-changing event across nine categories. Each entry carries the actor (user id and session id), the resource (the affected agent, run, or policy), the event kind, an ISO 8601 timestamp, the originating IP, and a structured payload describing exactly what happened.
- Run events — run.started, run.succeeded, run.failed, run.cancelled.
- Approval events — approval.requested, approval.granted, approval.denied, approval.expired.
- Connector events — connector.authorized, connector.scope_changed, connector.revoked.
- Policy events — policy.created, policy.updated, policy.deleted.
- Billing events — billing.invoice.finalized, billing.charge.succeeded, billing.dispute.opened.
- Admin events — member.invited, member.role_changed, member.removed.
- Override events — kill_switch.flipped, manual_override.applied.
- Buildout events — version.built, version.promoted, version.deprecated.
- Read events — every audit drill-down is itself audited.
Tamper-evidence
Every entry stores the SHA-256 hash of the prior entry’s payload, forming a hash chain per workspace. A scheduled cron walks the chain end-to-end every twenty-four hours and pages on-call if any link breaks. Admins can also run the verification on demand from /dashboard/security/audit and download a signed verification proof for any time window.
Retention policy
Retention is configurable up to a hard ceiling of seven years; the default soft window is 365 days. Beyond the soft window, entries roll into compressed cold storage and are retrievable through a slower export path. Below the soft window, entries are queryable live with millisecond filter performance.
Workspaces on the enterprise tier can pin retention at any value up to the seven-year ceiling. Healthcare-vertical packs default to a longer retention to satisfy HIPAA documentation requirements; see /docs/security-and-compliance.
Exporting via the API
The export endpoint streams a CSV (or JSON) of every event in a window, signed and timestamped so a downstream auditor can verify the file was not modified after download.
# CSV export for the last 30 days curl -H "Authorization: Bearer $TOKEN" \ "https://app.mvsagents.ai/api/v1/orgs/$ORG_ID/audit/export?format=csv&since=30d" \ -o audit-last-30d.csv # JSON export for a precise window curl -H "Authorization: Bearer $TOKEN" \ "https://app.mvsagents.ai/api/v1/orgs/$ORG_ID/audit/export?format=json&from=2026-04-01T00:00:00Z&to=2026-05-01T00:00:00Z" \ -o audit-april.json
The CSV columns are stable and self-documenting:
event_id,event_type,occurred_at,actor_user_id,actor_ip,resource_type,resource_id,prev_hash,payload_sha256 evt_01HZ...,run.succeeded,2026-05-19T18:42:11Z,usr_abc,203.0.113.10,run,run_42,a1b2...,c3d4... evt_01HZ...,approval.granted,2026-05-19T18:43:01Z,usr_xyz,203.0.113.10,approval,apv_55,c3d4...,e5f6... evt_01HZ...,connector.authorized,2026-05-19T18:50:09Z,usr_abc,203.0.113.10,connector,con_77,e5f6...,7890...
Filter and search
The dashboard’s audit view supports filtering by actor, resource, event kind, or time window, plus free-text search across the structured payload. Click any entry to drill into the full execution timeline. Reviewer reads are themselves audited, so chain of custody is preserved end-to-end.