Skip to content

Audit actions

The audit log is append-only and kept per application. Every sensitive operation writes one row before it answers; if the row cannot be written, the operation fails. This page lists every action and what a row holds. It is for administrators, for backends that read the log, and for evaluators.

Permission: files.audit.read
{
"audit_id": "01J9Z7A2B3C4D5E6F7G8H9J0K1", "tenant_id": "fitness-co", "application_id": "fitness-app", "at": "2026-10-22T09:30:00.000Z",
"actor": { "type": "client", "client_id": "fitness-backend", "acting_user_id": "user-ana" },
"action": "file.downloaded",
"target": { "type": "file", "id": "01J9Z6S9Q5F5R6Y2W2GZ3B3K4D", "name": "contract.pdf" },
"ip": "203.0.113.7", "user_agent": "…",
"metadata": { "version_no": 2, "size": 1048576, "expires_in_seconds": 900 }
}
  • actor.type is user, client (a backend client, with acting_user_id when it named one) or system (processing, retention).
  • metadata holds a fixed list of facts per action: never file contents, extracted text, tokens or passwords.
  • Reading metadata and previews is not logged. Downloads of originals are, one row per minted download URL (not per byte).
Route Answers
GET P/audit The application’s rows, newest first, filtered by action, actor_user_id, actor_client_id, target_type, target_id, from and to; paged
GET P/audit/export The same filters as JSON lines (application/x-ndjson), up to 100,000 rows
GET P/files/:file_id/audit, GET P/folders/:folder_id/audit One item’s rows: view on it plus files.audit.read, or files.manage

Rows are kept 365 days. A machine client reads the log with files:config.manage.

Some rows belong to the tenant rather than one application (application_id: null): changes to the tenant’s ceilings, and the platform administrators’ reads and exports of the tenant’s log and usage (tenant_audit.read, audit.exported, usage.exported, with the target { type: "tenant", id }). An application’s routes above never show them; platform administrators read them, with every application’s rows, through GET /platform/tenants/:tenant_id/audit and GET /platform/tenants/:tenant_id/audit/export (Platform administration). A tenant’s storage assignment and its moves are tenant rows too (tenant_storage.assigned, storage_migration.*); changes to the storage accounts themselves (storage_account.*) belong to no tenant.

Actions marked as coming are declared and written once their feature exists.

Files

ActionWritten when
file.createdAn upload completed: the file exists with its first version.
file.version.createdA new version was uploaded and became current.
file.version.deletedAn old version was deleted.
file.version.restoredAn old version was copied into a new current version.
file.renamedThe file's name changed.
file.movedThe file moved to another folder.
file.copiedThe file was copied (the row is written for the new file).
file.metadata.updatedTitle, description, category, department, tags, custom metadata or external_ref changed.
file.status.changedThe approval status changed (from, to).
file.visibility.changedThe visibility changed between private, application and public.
file.trashedThe file moved to the trash.
file.restoredThe file came back from the trash.
file.purgedThe file and every version were deleted for good (on request, or when the trash retention ended).
file.downloadedA download URL for the original was minted with disposition=attachment: one row per URL, not per byte.
file.quarantinedMalware scanning found the file infected and quarantined it.
file.rejectedProcessing refused the file: its detected type did not match, its type is not allowed, or its checksum differed.
file.owner.changedThe file was given another owner.
file.checked_outThe file was checked out for editing. Coming
file.checked_inA checked-out file was checked in with a new version. Coming
file.lock.brokenSomeone with files.manage broke another user's check-out. Coming
ActionWritten when
hold.placedSomeone with files.manage placed a legal hold on the file (reason, until).
hold.updatedThe reason or the end of a legal hold in force changed (previous_reason, previous_until).
hold.releasedA legal hold ended: released by someone with files.manage (with their optional reason), or by the system with reason: expired once until passed. The row keeps the hold's reason, who placed it, when and its end.

Folders

ActionWritten when
folder.createdA folder was created.
folder.renamedThe folder's name changed.
folder.movedThe folder moved under another parent, with its subtree.
folder.copiedThe folder was copied with its subtree.
folder.updatedThe folder's description, metadata or owner changed.
folder.trashedThe folder moved to the trash with its subtree.
folder.restoredThe folder came back from the trash with its subtree.
folder.purgedThe folder and its subtree were deleted for good.
folder.managedA machine client marked the folder application-managed, on creation or later: it and its subtree became read-only for people (client_id, name).
folder.unmanagedA machine client removed the application-managed mark from the folder (client_id, name of the removed mark).
folder.management_releasedThe tenant owner released an application-managed folder in an emergency (reason, and the client_id and name of the released mark).

Access entries

ActionWritten when
entry.grantedAn access entry was added to a file or folder.
entry.revokedAn access entry was removed.
inheritance.changedA file or folder stopped or started inheriting its parent's entries.

Role matrix

ActionWritten when
permissions.updatedThe role matrix changed: what a role may do in the application.
ActionWritten when
share.createdA share link was created.
share.revokedA share link was revoked.
share.accessedA share link was opened or downloaded from, with the IP address.
share.password_failedA wrong password was tried on a share link.

Administration

ActionWritten when
settings.updatedThe application's settings changed, with the values before and after.
quota.updatedThe application's quota changed.
usage.reconciledThe stored bytes were counted again and the usage was corrected by more than a small margin.
taxonomy.updatedA managed value list (categories or departments) changed.

Platform administration

ActionWritten when
tenant_settings.updatedA platform administrator changed the tenant's ceilings (quota, sizes, types, visibility, share links, suspension).
platform_settings.updatedA platform administrator changed the platform defaults for new tenants.
tenant_audit.readA platform administrator read the tenant's audit log across its applications (the filters and the number of rows).
audit.exportedA platform administrator exported the tenant's audit log (the format, the filters and whether the row cap cut it). Written before the first row.
usage.exportedA platform administrator exported the tenant's daily usage (the format and the period).

Trash

ActionWritten when
trash.emptiedSomeone with files.manage emptied the trash.

Webhooks

ActionWritten when
webhook.updatedThe application's webhook changed.
webhook.disabledThe webhook was switched off after repeated failed deliveries.

Storage

ActionWritten when
storage_account.createdA platform administrator added a storage account; it was probed before it was saved. Credentials are never in the row.
storage_account.updatedA storage account was renamed, given new credentials or a new location.
storage_account.verifiedA storage account was probed again (the outcome).
storage_account.deletedA storage account no tenant used was removed. Its stored bytes are not touched.
tenant_storage.assignedThe tenant was assigned to another storage account: its new files go there.
storage_migration.startedA move of the tenant's files to another storage account started.
storage_migration.switchedEvery file of the tenant was copied and verified, and the tenant switched to the target account.
storage_migration.completedThe move finished: the copies in the source account were deleted.
storage_migration.failedThe move stopped after repeated failures; files already moved stay readable where they are.