Audit Logs

Audit logs give your workspace an append-only record of the sensitive actions that change its state — who did what, when, to which resource, and from where. They are designed for compliance reviews, incident investigation, and answering questions like “did anyone delete this Secret last Thursday?” without asking Modal support.

Audit logs are viewable within the settings page.

Fields 

Every audit event captures the same shape alongside the time it occurred:

FieldWhat it is
actionThe kind of change that happened — e.g. secret.create, app.deploy. See the full list below.
actorThe user or service user that initiated the action.
targetsThe resource(s) the action affected, each recorded by ID so the event stays attributable after a rename or delete.
context.environmentThe environment the action was scoped to.
context.ip_addressThe client IP address.
context.sourceweb for the dashboard, sdk for the Modal CLI and client libraries.
statusWhether the action succeeded or failed.
metadataAction-specific extra fields — e.g. the old and new budget values for workspace.set_budget, or the requested region for a Proxy.

Filtering 

Filters are entered in the search bar above the table as key:value pairs, separated by spaces. Any filter can be negated by prefixing it with - to exclude matching events. The search bar autocompletes keys and values as you type.

For example:

FilterMatches
action:secret.createEvery Secret created in the selected time range.
-status:successAll actions that did not succeed.
action:volume.delete -actor_type:serviceVolume deletions by non-service users.

Actions 

The table below lists every action currently recorded. New actions will be added as additional workspace operations are instrumented.

Note: container runtime activity is not audited. Audit logs record workspace-level actions (deploying an App, creating a Volume, revoking a token) — not individual Function invocations or Sandbox exec calls, which are captured in Function and Sandbox logs.


ActionDescription
access_grant.approveA workspace manager approved a pending Modal-admin access grant.
access_grant.createA Modal admin requested time-limited access to a workspace.
access_grant.revokeA workspace manager revoked an active Modal-admin access grant.
app.deployAn App was deployed to the workspace (via modal deploy or implicitly via App.lookup).
app.rollbackAn App was rolled back to an earlier deployed version.
app.rolloverAn App was rolled over — its current version was redeployed, restarting running tasks.
app.runAn ephemeral App was started with modal run or modal serve.
app.stopAn App was stopped from the dashboard or with modal app stop.
container.stopA running container (task) was terminated from the dashboard or CLI. Routine container exits at the end of a call are not audited.
dict.createA Dict was created.
dict.getAn existing Dict was looked up by name or by ID.
domain.createA custom domain was attached to an environment.
domain.deleteA custom domain was removed.
environment.createA new environment was created in the workspace.
environment.deleteAn environment was deleted.
environment.getAn environment was looked up by name.
environment.updateAn environment’s settings changed — name, web suffix, or per-environment concurrency limits. Before/after values are recorded in the event metadata.
environment.update_memberA user or service user’s per-environment role (Contributor / Viewer) was changed, or their environment-level access was removed. Independent of their workspace-level role.
image.deleteAn Image was deleted.
invite.createA user-to-user workspace invite was generated.
invite.create_for_workspaceA workspace-wide invite link was generated by a workspace admin.
member.deleteA member was removed from the workspace.
member.set_roleA workspace member’s workspace-wide role (Owner / Manager / User) was changed. The affected member(s) appear in the event targets and the new role(s) are recorded in the event metadata. Per-environment access is set separately via environment.update_member.
nfs.createA NetworkFileSystem was created.
nfs.getAn existing NetworkFileSystem was looked up by name.
proxy.add_ipA static egress IP was added to a Proxy.
proxy.createA Proxy was created. The requested name and region are recorded in the event metadata.
proxy.deleteA Proxy was deleted.
queue.deleteA Queue was deleted.
queue.getAn existing Queue was looked up by ID.
sandbox.createA Sandbox was launched.
sandbox.terminateA Sandbox was explicitly terminated before its natural exit.
secret.createA Secret was created or its values were overwritten (via modal secret create or the dashboard).
secret.getA named Secret was resolved to an ID (e.g. at deploy, or when opening a secret in the dashboard). Values are not returned; only the Secret’s ID and metadata are.
token.deleteAn API token was revoked.
user.createA new user account was created.
user.set_approvalA user’s workspace-membership approval state was changed. The new approved/unapproved value is recorded in the event metadata.
volume.createA Volume was created.
volume.deleteA Volume was deleted.
volume.getAn existing Volume was looked up by name or by ID.
volume.renameA Volume was renamed.
workspace.createA new workspace was created.
workspace.joinA user joined a workspace (by accepting an invite or self-serve signup).
workspace.leaveA user left a workspace.
workspace.set_budgetA workspace’s spend budget was updated. The previous and new per-cycle budget values are recorded in the event metadata.