Bichon Docs
Pro Edition

The audit log records security-relevant actions as structured events. Each record carries:

  • event_type — the dotted name below;
  • user — the authenticated actor, or the system/actor name;
  • account_id — the affected account when the event has exactly one, otherwise null;
  • payload — event-specific JSON (target ids, counts, reasons, request ids);
  • prev_hash and the chain fields covered in Audit Log & Integrity.

Use GET /api/v1/audit-log to query and GET /api/v1/audit-log/{record_id}/detail for one record.

Events forwarded to SIEM

SIEM forwarding is category-based. These are the categories and the events each contains.

login

EventMeaning
user.loginPassword login
ldap.login / ldap.login_failedLDAP bind success / failure
sso.login / sso.logoutOIDC login and RP-initiated logout
mfa.enabled / mfa.disabledUser changed TOTP state
mfa.reset_by_adminAdministrator reset a user's MFA

delete

EventMeaning
email.deleted / email.batch_deletedSingle / bulk message deletion
retention.purgedScheduled retention sweep removed messages (account, count, cutoff, window)
account.removedAccount deleted
user.removedUser deleted
role.removedCustom role deleted
access_token.removedAPI token revoked
oauth2.removed / proxy.removedProvider / proxy deleted
saved_search.deletedSaved search deleted
mailbox.removedMailbox removed from tracking

export

EventMeaning
export.started / export.completed / export.failed / export.cancelledExport job lifecycle
export.downloadedArtifact downloaded
export.verifiedCompliance verification finished
email.exportedIndividual message exported

repair

EventMeaning
email.repairedMessage content re-fetched and repaired in place

admin

EventMeaning
user.created / user.updatedUser created / changed
role.created / role.updated / role.delegated / role.delegation_removedRole and delegation changes
access_token.createdAPI token created
account.created / account.updatedAccount created / changed
retention.policy_changedRetention or minimum-retention window changed, with before/after values
account.download_started / account.download_stoppedManual sync started / cancelled
account.role_assignedAccount role granted in bulk
oauth2.created / oauth2.updated / oauth2.token_storedOAuth provider and token changes
proxy.created / proxy.updatedProxy changes
integrity.check_started / check_completed / check_cancelledIntegrity job lifecycle
integrity.report_downloadedIntegrity report downloaded
legal.hold.placed / legal.hold.releasedLegal-hold changes
approval.requested / approved / rejected / expired / executed / execution_failedDual-control lifecycle
gdpr.erasure_requestedGDPR Art. 17 erasure request record (runs with admin so it stays with its approval trail)
license.uploadedLicense installed
settings.changedRuntime configuration changed
branding.updatedBranding changed
timestamp.anchoredTimestamp anchor created
import.performedImport completed
saved_search.created / saved_search.renamedSaved search created / renamed
search.performedSearch executed

Events recorded but not forwarded

These events remain in audit.db and are queryable, but category_of() returns no category, so SIEM forwarding never sends them:

EventWhy it is local-only
email.viewedRoutine read; kept out of admin to avoid noise
email.restoredRestore-to-IMAP, not a deletion
email.tagged / attachment.taggedMetadata change
attachment.downloaded / attachment.previewedRead activity
audit.log_queriedReading the audit log itself
backup.config_updatedBackup policy change
compliance.config_updatedCompliance runtime overrides
remote_cleanup.previewed / run_finished / message_moved / blockedSource-mailbox cleanup activity
siem.config_updated / siem.forward_failedExcluded deliberately to prevent a forwarding feedback loop

Payload conventions

Payloads vary by event, but several conventions are stable:

  • approval.* carries request_id, op, and — on approval — requested_by, succeeded/failed counts when known. A background operation approved before execution has no counts yet; they appear on approval.executed.
  • email.batch_deleted externalizes per-item detail to a file under <root>/audit/detail/ when the batch exceeds BICHON_AUDIT_DETAIL_THRESHOLD (default 100); the row keeps a reference.
  • gdpr.erasure_requested carries subject, criteria, assessment, messages, account_ids, queued, and request_id.
  • license.uploaded carries the licensee and edition.
  • siem.* events never trigger another forward.

The full schema is available in the OpenAPI spec at /api-docs and in the audit record detail endpoint.

On this page