Audit

Every material change writes an AuditEvent: who acted, what they did, which record changed, and a request id when the call came from the API.

Actors are user, api_key, or system. System covers autopay, the worker, and Circle reconcile.

Hash chain

Events in an organization are chained. Each row stores the previous entry hash and its own hash over a canonical payload. GET /api/v1/audit/verify (scope audit:read) walks the chain.

  • 200 and ok: true means the chain matches.
  • 409 means a row was altered or removed. Treat that as a security incident, not a retry.

custara audit verify calls the same route. The console list is /app/audit.

Export

GET /api/v1/audit/export?limit=100&cursor= returns a page of events for a SIEM. limit caps at 500. custara audit export prints the latest page. Page with next_cursor until it is null. Metadata is JSON. Bank account numbers are not included in the clear; those fields stay encrypted on the vendor endpoint.

What is recorded

Representative actions:

ActionWhen
auth.cli_login / auth.otp_verifiedSign-in
user.invitedTeam invite
user.mfa_enroll_started, user.mfa_enabled, user.mfa_disabledAuthenticator setup
org.settings_updatedPayment mode, autopay, profile
org.mfa_pay_threshold_updatedMFA pay threshold
api_key.created, api_key.revokedDeveloper keys
webhook.created, webhook.activated, webhook.deactivatedEndpoints
wallet.allowlist_added, wallet.allowlist_revokedDestinations
wallet.balance_spent, wallet.balance_restoredAgent balance movement around a transfer
payment.intent_createdPay
agent.arc_transfer, agent.arc_reconciledOn-chain execution
invoice.reconciledSettlement
approval.decidedApprover vote

Request ids on API responses (request_id, header x-request-id) match the audit row when the route supplies one.