Documentation menu

Audit Log Codes

The Citadel audit log records a stable, machine-readable action string for every operator-visible event. This page is the canonical list — use it when writing log monitors, SIEM rules, or alerting filters.

Every audit row also carries actor (user/system that triggered it), ts (RFC3339 timestamp), and a context blob with action-specific fields (target server id, affected user id, etc.).

Authentication

CodeTrigger
auth.login.okSuccessful sign-in.
auth.login.failWrong password or unknown email. Counts toward fail2ban.
auth.login.lockedSign-in refused because the (IP, username) lockout is active.
auth.logout/api/auth/logout called.
auth.password.changeUser changed their own password.
auth.password.change-forcedOperator-forced password change.
auth.password.reset.requestReset email requested. Always logged even if the email doesn't exist (uniform behavior is intentional).
auth.password.reset.consumeReset link successfully used.
auth.mfa.enrolledTOTP enrollment confirmed.
auth.mfa.disabledTOTP disabled.
auth.mfa.backup-regeneratedBackup codes regenerated.
auth.mfa.failWrong TOTP / backup code on a 2FA challenge.

Users & roles

CodeTrigger
users.createNew user added.
users.updateUser edit (name, email, role assignment).
users.deleteUser deleted.
role.assignCitadel role assigned to a user.
role.revokeCitadel role removed from a user.
role.permissions.updateRole's permission set changed via Settings → Users & Roles.

File browser

CodeTrigger
file.readFile opened in the editor (read).
file.editStandard file edit (configs, JSON, etc.).
file.edit-scriptEdit of a .bat / .cmd / .ps1 / .sh file. Distinct so script writes are greppable in audit. Requires files.edit-scripts permission and the destination must resolve under <installDir>/lifecycle_hooks/.
file.write-blockedWrite rejected — extension not allowed for the user's permissions, or path resolved outside the allowed directory (e.g. attempted script write outside lifecycle_hooks/).
file.deleteFile deleted from the browser.

Server lifecycle

CodeTrigger
server.createNew server entry registered in Citadel.
server.deleteServer entry removed (must be stopped).
server.updateServer settings changed.
server.start/start invoked.
server.stop/stop invoked (graceful).
server.restart/restart invoked.
server.crashedDayZ process exited with a non-zero code that wasn't a graceful stop.
lifecycle.hook.startA lifecycle hook script began executing.
lifecycle.hook.completeHook finished (exit 0).
lifecycle.hook.errorHook failed (non-zero exit, timeout, or pre-start abort).

Player operations

CodeTrigger
player.kickPlayer kicked.
player.banPlayer banned.
player.unbanBan removed.
player.messageDirect in-game message sent.
player.actionOne of the in-house mod actions (heal, kill, teleport, spawn, …).

Discord bot

CodeTrigger
discord.actionA Discord-driven action ran successfully.
discord.deniedAction denied because the discord-bot Citadel role doesn't grant the required permission.
discord.sig-rejectedHMAC signature on the call was missing or wrong.
discord.user-role.setPer-Discord-user role mapping created or updated.
discord.user-role.removePer-Discord-user role mapping deleted.

Webhooks (Paddle / external)

CodeTrigger
webhook.receivedWebhook delivered and signature-verified.
webhook.duplicateIdempotency hit — already processed.
webhook.errorProcessing failed; Paddle will retry.
webhook.replayedAdmin replayed a stored webhook payload.

Sidecar / mod bridge

CodeTrigger
sidecar.command.issuedBackend pushed a command into the sidecar queue.
sidecar.command.timeoutMod did not return a response within the timeout window.
sidecar.auth.failSidecar rejected a call (bad/missing Authorization: Bearer).

Setup wizard

CodeTrigger
setup.completedWizard finished, data/.first-run-completed flag set.
setup.attempt-after-lockA /api/setup/* endpoint was called after the lock was set; refused with 403.

If you find an event in the audit log that isn't on this page, please open an issue — the doc is meant to be exhaustive.