Skip to content

Audit expectations

Every state-changing action you take as a platform admin writes to at least one audit log. Impersonation actions write to two simultaneously. Nothing platform admins do is invisible to the target org Owner. Logs are immutable — no UPDATE, no DELETE, not even by platform admins (D80).

Platform-side log (platform_audit_log)

365-day retention. Visible only to platform admins via GET /api/v1/platform/audit-log and the /platform/audit-log page.

ActionWhen emittedIncludes
platform.loginEvery successful platform loginplatform_user_id, IP, User-Agent
platform.login_failedEvery failed platform login attemptemail attempted, IP, User-Agent
platform.logoutExplicit logout or session expiryplatform_user_id, revoked impersonation count
platform.password_changedPlatform-admin self-service password changeplatform_user_id
platform.user_createdAnother platform admin provisioned a new platform accountactor, target platform user, role
platform.user_disabledPlatform-admin account disabledactor, target
platform.org_createdNew customer org provisioned via POST /platform/orgsorg name, slug, owner email, plan
platform.org_disabledOrg suspended via POST /platform/orgs/{id}/disableorg id, reason
platform.org_enabledOrg re-enabledorg id
platform.org_deletion_initiated7-day grace deletion startedorg id, confirmation_text hash
platform.org_deletedHard delete after 7-day graceorg id
platform.impersonation_startedScoped token mintedtarget org, reason, ticket_ref, target_user_id
platform.impersonation_actionSummarised per-request activity during impersonationimpersonation_id, request count, endpoints touched
platform.impersonation_endedExplicit end or expiryimpersonation_id, end reason
platform.impersonation_blockedMint rejected by allow_platform_impersonation = falsetarget org, platform_user_id

Org-side log (audit_log)

90-day retention. Visible to the customer’s Owner and Admins via /admin/audit-log. Platform actions appear with a Platform Support badge.

Action written hereactor_typeVisible with these details
platform.impersonation_startedplatform_admin_impersonatingreason, ticket_ref, expiry time
platform.impersonation_endedplatform_admin_impersonatingend reason
Org-domain action under impersonation (e.g. user.role_changed, camera.updated, alert_rule.deleted)platform_admin_impersonatingoriginal action fields + impersonation_id
org.platform_impersonation_disableduser (the Owner)who toggled off, when
org.platform_impersonation_enableduser (the Owner)who toggled on, when
org.created_by_platformplatform_admininitial provisioning, platform actor id
org.disabled_by_platformplatform_adminreason

Visibility matrix

LogPlatform adminsOrg OwnerOrg AdminOrg OperatorOrg Viewer
platform_audit_logfullnononono
Customer audit_log (own org)via impersonation onlyfullfullnono
Customer audit_log (other org)nonononono

What is NOT audited

Read-only platform activity is intentionally summarised, not per-request. Specifically:

  • GET /api/v1/platform/orgs listing — emits one platform.impersonation_action summary per listing session, not per row.
  • GET /api/v1/platform/fleet/health — emits a summary entry, not a per-metric entry.
  • Cross-org search queries (see Cross-org search) — emit platform.cross_org_search with the search term hash and result count, not the full result set.
  • Browser navigation inside /platform/* pages — frontend route changes are not audited. Only backend API calls are.

State-changing calls are always audited, no exception. If you find a state-changing path that is not in this table, treat it as a bug and file an incident.

Retention and export

  • Platform log: 365 days, rolled into cold storage after day 30. Export via GET /api/v1/platform/audit-log?format=csv.
  • Org log: 90 days. Exportable by the org Owner via /admin/audit-log?format=csv.
  • Hard deletion of an org deletes its org-side audit log with the rest of the org’s data. The platform-side record (platform.org_deleted) survives.

See also