Skip to main content

Audit Logs

LumoAuth records an audit trail of authentication events, administrative actions, and data changes within each organization. Audit logs support security monitoring, compliance reporting, and incident investigation, and can be streamed to your SIEM (security information and event management system) through log sinks.


Viewing Audit Logs​

Portal​

Navigate to Audit logs in the sidebar (under Security, /orgs/{orgId}/portal/audit-logs):

  • Filters - Filter by Actor, keyword Search, Event type, Status (success or failure), Severity and a From / To date range, then click Apply filters (Clear resets them)
  • Event detail - Each row shows the time, event, actor (with how it authenticated and the truncated IP address), target and details; click Data on a row to open Log entry metadata with the full event context including request metadata
  • Export logs - Download logs as CSV. The export contains the whole filtered result, not just the page on screen, up to 100,000 rows. Exporting needs audit.export and is itself audited as audit.exported. On plans without the audit_export feature the button reads Upgrade to export.

The Audit logs page with the filter bar, the Export logs button and the event table

The Log entry metadata dialog opened with the Data button of a row


Event Categories​

The tables below list every event type LumoAuth writes today, grouped by area. Use the names exactly as shown when you filter by eventType. A name written as a / b is two events that mirror each other. Most events can end in success or failure; the Result field (status in the API) tells you which.

Two families of rows are written automatically, whatever screen, API or command made the change:

  • Record changes. Creating, changing or deleting users, the organization, roles, permissions, applications, social login providers, linked identities, agents and webhooks writes <type>.created, <type>.updated or <type>.deleted, with the before/after values in changes.
  • Grants and memberships. Adding or removing a role, a permission or a group member writes role.assigned / role.removed, permission.granted / permission.revoked or group.member_added / group.member_removed.

The screen or API that made the change often writes its own, more specific row as well (for example client.created next to application.created).

For risk levels and alerting, see Security-relevant events.

Authentication & sessions​

EventWhen it's recorded
user.loginA browser session was created after a successful sign-in (ip_address, user_agent)
auth.loginA sign-in through the hosted OAuth login form or the JSON login endpoint succeeded or failed (channel: hosted_form or json; reason on failure, e.g. csrf_invalid, captcha_*, locked_out, adaptive_auth_block)
login.failedA password, passkey, magic-link or push sign-in failed (method, reason)
auth.failedA machine credential failed: API key, Bearer token, SCIM (automatic user provisioning) token, or a passkey that matched no user (auth_method)
access.deniedA 403 was returned to an authenticated caller
account.lockedAn account was locked after repeated failed sign-ins
magic_link_loginA user signed in with a magic link
captcha.login_rejectedCAPTCHA verification failed before the password was checked
captcha.bypassedThe CAPTCHA provider was unreachable and lenient mode let the request through
password.breached_at_loginThe password used to sign in appears in a known breach; a password change is enforced (breach_count)
password.breach_check_unavailableThe breached-password service was unreachable, so a password was accepted without that check
adaptive_auth.decisionAdaptive authentication scored a sign-in (decision, risk_score); a block decision is high risk and raises an alert
security.ip_blockedA sign-in was refused by a network block ("Block Tor exit nodes" or "Block datacenter / VPN") before scoring (reason: network_block_tor_exit_node or network_block_vpn_or_datacenter, ip, provider, country)
adaptive_auth.errorThe risk assessment failed during sign-in
adaptive_auth.ai_assessmentAn AI risk assessment ran (risk_score, signals_triggered) or failed
adaptive_auth.ai_quota_exceededThe AI risk assessment was skipped because the AI quota is used up
adaptive_auth.ai_risk_assessment_disabled_by_tenantThe AI risk assessment was skipped because the organization turned it off
oauth.root_fallback_loginA platform (root) administrator signed in through this organization's login page; severity critical
password_reset.requestedA password reset was requested by the user or by an administrator (requested_by)
password_reset_completedA password-reset link was used
user.password_changedA password was changed (source: self_service, password_reset_token, force_password_change or admin_api)
user.password.set_by_adminAn administrator set a user's password in the portal user editor
email_verification_token_generated / email_verifiedAn e-mail verification link was issued / used
account.pre_verification_bindings_droppedVerifying the e-mail (from another browser) or resetting the password removed social links and MFA (multi-factor authentication) factors attached before the address was proven, and revoked the user's tokens (trigger: email_verification or password_reset, social_provider, mfa_methods)
user.pending_signup_removedUnverified self-service sign-ups were deleted (reason: unverified_signup_expired after 48 hours, or claimed_by_invitation / claimed_by_org_invitation when an invitation claimed the address; users, organizations)
session.revokedOne session was ended: the user signed out, or revoked a device, or an administrator revoked it
session.revoked_allAll of a user's sessions, or all of the organization's sessions, were revoked (count)
tenant.resolution / oauth.tenant_resolutionA public or OAuth endpoint was called for an organization that doesn't exist or is inactive

Social, enterprise SSO and LDAP sign-in​

EventWhen it's recorded
oauth.social_login_initiatedA social sign-in was started (provider)
oauth.social_login_successA social sign-in completed
oauth.social_login_link_refusedA social sign-in matched an existing local account and was not linked automatically
user.social_unlinkedA user unlinked a social account (provider)
oidc_login_initiated / oidc_login_successA sign-in through an enterprise OIDC identity provider started / completed
oidc_callback_error / oidc_callback_invalid_stateThe OIDC provider returned an error / a callback carried an invalid state
saml_login_successA SAML sign-in (LumoAuth as service provider) completed
saml_login_error / saml_acs_errorStarting a SAML sign-in / processing the SAML response failed
saml_login_blockedAdaptive authentication blocked a SAML sign-in
saml_acs_missing_session, saml_acs_invalid_idp, saml_acs_missing_request_idA SAML response was rejected because it could not be tied to a sign-in this browser started
saml_user_provisionedA user was created just in time from a SAML sign-in
saml_jit_domain_mismatchJust-in-time provisioning was refused because the e-mail domain doesn't match the IdP
saml_legacy_binding_upgradedA user bound by bare NameID (before per-IdP binding) was re-bound to the organization's only SAML IdP at sign-in (idp_config_id, user_id)
saml_legacy_binding_ambiguousA legacy bare-NameID user signed in to an organization with several SAML IdPs; sign-in was refused until an administrator relinks the account (idp_config_id, user_id)
saml_default_role_skippedA privileged default role was not assigned during SAML provisioning
saml_slo_initiatedA SAML single logout to the IdP was started
saml_slo_error, saml_slo_process_error, saml_slo_request_id_capture_errorA SAML single logout failed
saml_response_issued / saml_response_errorLumoAuth, as SAML IdP, issued / failed to issue a response to an application (sp_entity_id)
saml_unknown_sp, saml_invalid_acs, saml_invalid_authnreq_signatureLumoAuth, as SAML IdP, rejected a request (unknown application, wrong ACS URL, bad signature)
saml_sso_errorLumoAuth, as SAML IdP, failed to process a sign-in request
saml_unsigned_authnreq_acceptedAn unsigned request was accepted because the application allows it; severity warning
saml_slo_completed / saml_slo_nameid_mismatchA logout request from an application was processed / refused because the NameID doesn't match the session
ldap.bind.success / ldap.bind.failedAn LDAP bind with the user's credentials succeeded / failed (user_dn, error_category)
ldap.user.imported / ldap.user_provisionedA user was created from the directory on first LDAP sign-in
ldap.local_account_missingAn LDAP user has no local account and just-in-time provisioning is off
ldap.account_link_refusedAn LDAP sign-in matched an existing account by e-mail that may not be adopted (it has a local password, social links, admin rights, or is bound to another directory entry); sign-in was refused (ldap_config_id, reason)
ldap.authentication_errorLDAP sign-in failed with an error
ldap.attr_mapping.errorRequired attributes were missing from the directory entry (missing_attrs)
user.attrs_synced_from_ldapProfile attributes were updated from the directory at sign-in
user.email_changed_by_ldap_syncA user's e-mail was changed by directory sync; severity warning

MFA Events​

Every MFA action is audited under an mfa.* event name and delivered to webhooks with the same name. Entries carry the user as the target, the actor (user, admin, API key or system), the client IP and user agent, and event-specific metadata such as authenticator_id (for example push:5), factor_type, purpose and reason.

EventDescription
mfa.enroll.startedA user started enrolling a factor (factor_type)
mfa.enroll.completedA factor became active (authenticator_id, factor_type, source: self_service or api)
mfa.enroll.failedAn enrollment verification code was rejected
mfa.enroll.deferredA user chose "Remind me later" (deferral_count, grace_days_left)
mfa.challenge.issuedA challenge was issued (challenge_id, authenticator_id, factor_type, purpose: login or step_up)
mfa.challenge.succeededA challenge was passed (includes the amr values)
mfa.challenge.failedA wrong code or credential, or a push denied on the phone (attempts, reason)
mfa.push.deniedA push request was denied in the LumoAuth app (push_suspended is true when this denial paused push)
mfa.push.reported_fraudThe user chose Deny – this wasn't me (initiating_ip, location, user_agent); severity warning
mfa.factor.removedA factor was removed (source: user or admin)
mfa.factor.default_changedA user changed their default factor (previous)
mfa.recovery_codes.generatedRecovery codes were generated or regenerated (regenerated, source)
mfa.recovery_code.usedA recovery code was used (remaining)
mfa.recovery.startedAccount recovery started (method: recovery_code, temporary_access_code or not_me_link)
mfa.recovery.completedA recovered user finished re-enrolling (new factor and recovery codes confirmed)
mfa.tap.issuedAn admin issued a temporary access code (reason, ttl_minutes, single_use)
mfa.lockedMFA was locked after 10 failures in 15 minutes (lock_seconds)
mfa.policy.changedThe MFA policy changed (changes with from/to values, source: portal or admin_api)
mfa.trusted_device.addedA user trusted a device (trusted_device_id, days)
mfa.trusted_device.revokedTrusted devices were revoked (count, reason: user, password_changed, factor_removed, recovery, high_risk, reported_not_me)
mfa.enabledA user enrolled their first factor (also delivered to webhooks as user.mfa_enabled)
mfa.disabledRemoving an authenticator left the user with no active factor (also delivered as user.mfa_disabled)
mfa.sms_failedA wrong code during text-message enrollment

Related passkey and LumoAuth app events:

EventWhen it's recorded
passkey.registeredA user registered a passkey (aaguid, authenticator_name)
passkey.registration_rejectedA passkey was refused because the authenticator is not FIDO certified and the organization requires it
push_auth.enroll / push_auth.unenrollA device was enrolled in / removed from LumoAuth app push (device_id, platform)
push_auth.initiateA push authentication request was sent to a device
push_auth.respondA device approved or denied a push request, or its response was rejected (action)

Users & profile​

EventWhen it's recorded
user.created / user.updated / user.deletedA user account was created, changed or deleted, from any surface (portal, Admin API, SCIM, sign-up, just-in-time provisioning, CLI)
user.blockedAn administrator blocked a user in the portal
user.roles.updatedAn administrator changed a user's roles in the portal user editor
user.trait.deletedAn administrator deleted a custom attribute (trait) from a user (trait_key)
user.email_change_requested / user.email_changedA user asked to change their e-mail / confirmed it from the new address (old_email, new_email)
user.invitation.sent / user.invitation.resent / user.invitation.revokedAn administrator sent, resent or revoked an invitation
user.invitation.acceptedAn invitee accepted an invitation
user_invitation.resend_failedResending an invitation failed
user_identity.created / user_identity.updated / user_identity.deletedA linked social or SSO identity was added, changed or removed
identity.link.created / identity.link.removedAn administrator linked or unlinked a user's SAML, LDAP or social identity (type, the new or removed binding, previous_binding); the user was signed out and notified
identity.link.bulk_relinkedAn administrator relinked legacy bare-NameID SAML users to an IdP (idp_config_id, relinked_user_ids, skipped)
organization.created / organization.updated / organization.deletedA customer organization was created, changed or deleted
organization.invitation.acceptedA user accepted an invitation to a customer organization

Roles, permissions, groups & policies​

EventWhen it's recorded
role.created / role.updated / role.deletedA role was created, changed or deleted
role.delete_failedDeleting a role failed
permission.created / permission.updated / permission.deletedA permission was defined, changed or deleted
role.assigned / role.removedA role was added to or removed from a user or a group (relation: user.role or group.role)
permission.granted / permission.revokedA permission was granted to or removed from a user or a role
group.created / group.updated / group.deletedA group was created, changed or deleted
group.delete_failedDeleting a group failed
group.member_added / group.member_removedA user joined or left a group
abac.attribute_created / abac.attribute_updated / abac.attribute_deletedAn ABAC (attribute-based access control) attribute definition changed
abac.policy_created / abac.policy_updated / abac.policy_deletedAn ABAC policy was changed in the portal
abac.policy.updated / abac.policy.deletedAn ABAC policy was changed through the Admin API (old_hash, policy_hash)
zanzibar.namespace_created / zanzibar.namespace_updated / zanzibar.namespace_deletedA relationship namespace changed
zanzibar.tuple_created / zanzibar.tuple_deletedA relationship tuple was written or deleted in the portal
zanzibar.sync_completedRoles and permissions were synced into relationship tuples
permission_checkThe policy decision point answered a permission check for a user or an agent (permission, granted)
abac_checkThe ABAC engine evaluated an access request
zanzibar_checkA relationship check ran (the portal tester or the decision point)
policy.parsed / policy.parse_failed / policy.parse_errorAI policy authoring turned a plain-language policy into a draft / could not
policy.created / policy.create_rejected / policy.create_errorAn AI-authored policy was saved / refused / failed

Applications & tokens​

EventWhen it's recorded
client.created / client.updated / client.deletedAn OAuth application was created, edited or deleted in the portal
client.configuration_updatedAn application's advanced configuration was saved (form_type)
client.secret_rotatedAn application's client secret was rotated
client.credentials_synced / client.credentials_sync_failedClient credentials were pushed / failed to push to a secrets manager
application.created / application.updated / application.deletedRecord change on an OAuth application, from any surface
saml_client.createdA SAML application was created from Applications
saml_client_created / saml_client_updated / saml_client_deletedA SAML application was changed on the SAML page
oauth.client_registeredA client registered through dynamic client registration
oauth.register / oauth.client_configurationA dynamic registration request / a registration-management request was refused
oauth.initial_access_token_hash_upgradeA legacy plaintext initial access token was re-stored as a hash
oauth.cimd_client_resolved / oauth.cimd_fetch_failedA client ID metadata document was fetched and accepted / rejected (reason names the rule that failed)
oauth.cimd_document_checkedAn admin ran a client ID metadata document through the portal check tool
oauth.client_resolutionA request named an unknown, inactive or other-organization client_id
oauth.authorizeAn authorization request was rejected (invalid request object or request_uri, unknown organization)
oauth.authorize.none_with_scoperesponse_type=none was used with scopes, which were ignored
oauth.par / oauth.par_createdA pushed authorization request was rejected / accepted
oauth.authorization_issuedAn authorization response was returned to the application (response_type, response_mode)
oauth.authorization_code_issuedAn authorization code was created (pkce_used)
oauth.authorization_deniedThe user declined the consent screen
consent.revokedA user revoked an application's access from their account
oauth.tokenThe token endpoint refused client authentication
oauth.token.state_binding_absent / oauth.token.state_binding_mismatchThe token request didn't forward the authorization state / forwarded a different one
oauth.access_token_issuedTokens were issued for the authorization-code, CIBA or device-code grant (grant_type, dpop_bound, scopes)
oauth.client_token_issuedA client-credentials token was issued
oauth.token_exchangeA token exchange succeeded or was refused
oauth.token_introspectionA token was introspected (token_active)
oauth.token_revokedAn application revoked a token at the revocation endpoint
token.revokedAn administrator revoked OAuth tokens (one token, a user's, or a client's)
oauth.security.code_reuse_detected / oauth.security.refresh_token_reuse_detectedAn authorization code or refresh token was replayed
oauth.security.tokens_revokedTokens were revoked in response to a replay (reason)
oauth.ciba / oauth.ciba_request_createdA CIBA request was refused / accepted
oauth.token.cibaA CIBA token request was refused (invalid auth_req_id, user denied, …)
oauth.device_authorizationA device authorization request was accepted or refused
oauth.device_verifyA user entered a device code or approved a device
oauth.token.device_codeA device-code token request was refused (expired, polling too fast, …)
txn.token_issued / txn.token_rejectedA transaction token was issued / refused
backchannel_logout_sent / backchannel_logout_failedA back-channel logout notice was delivered / failed (client_id)
xaa.grant_policy_created / xaa.grant_policy_deletedA cross-app access grant policy was created / deleted
xaa.trusted_issuer_created / xaa.trusted_issuer_deletedA trusted identity-assertion issuer was added / removed
xaa.id_jag_issued / xaa.id_jag_redeemed / xaa.id_jag_rejectedAn identity assertion grant was issued, redeemed or refused

API keys & machine credentials​

EventWhen it's recorded
api_key.created / api_key.create_failedAn organization API key was created / creation failed (scopes)
api_key.rotated / api_key.rotate_failedA key was rotated (old_key_prefix, new_key_prefix) / rotation failed
api_key.scopes_updatedA key's scopes changed (old_scopes, new_scopes)
api_key.revoked / api_key.deletedA key was revoked / deleted
api_key.usedA request authenticated with an API key (masked_prefix, path)
scim.token_generated / scim.token_regeneratedA SCIM bearer token was created / replaced

Agents & JIT​

EventWhen it's recorded
agent.created / agent.updated / agent.deletedRecord change on an agent, from any surface
agent.activated, agent.suspended, agent.revoked, agent.status_changedAn agent's status changed (from, to)
agent.scopes_changedAn agent's capabilities changed (added, removed)
agent.token_issued, agent.key_rotated, agent.key_revoked, agent.credentials_rotatedAgent credentials were minted or rotated through the Admin API
agent.credentials_revokedAn agent's live credentials were revoked because it was suspended or revoked
agent.deactivated_dormantThe lifecycle job deactivated an agent with no recent activity
agent.reauth_failed, agent.reauth_rate_limited, agent.reauth_refused_mfaPassword re-authentication for agent registration failed, was throttled, or was refused for an MFA account
agent.test_runA test token or capability check was run from the portal
agent.capability_check_deniedAn agent's capability check was denied
agent.access_policy_created / agent.access_policy_deletedAn agent access policy was created / deleted
agent.access_policy_enabled / agent.access_policy_disabledAn agent access policy was switched on / off
agent.access_policy_deniedAn agent access policy denied a request (reason, policy)
agent.approval.requested / agent.approval.email_fallbackA human approval was requested, by push / by e-mail because push wasn't available
agent.attestation.accepted / agent.attestation.rejectedA workload attestation was accepted (provider, subject) / rejected
a2a.card_config_changed / a2a.card_verify_failedAn agent's A2A card settings changed / a card failed verification
agent_registry.synced / agent_registry.sync_failedAgents were synced from an external agent registry
agent_ecosystem.<kind>.<action>An agent registry, AI gateway or tracing integration changed: <kind> is registry, gateway or trace; <action> is created, updated, tested, enabled, disabled or deleted (e.g. agent_ecosystem.gateway.tested)
ai_gateway.key_provisioned / ai_gateway.key_provision_failedAn AI gateway key was issued for an agent / issuing failed
ai_gateway.key_revoked / ai_gateway.key_revoke_failedAn agent's AI gateway key was revoked / revoking failed
oauth.agent_token_issued / oauth.token_exchange_agentAn agent obtained a token with its credentials / with a workload identity
aauth.agent_token_issued / aauth.auth_token_issued / aauth.platform_token.issuedAn AAuth agent, auth or platform token was issued
aauth.authorization_granted / aauth.authorization_deniedA user approved / declined an AAuth authorization request
aauth.signature_verification_failedAn AAuth request's HTTP message signature did not verify
aauth.consent_record_missingIdentity claims were withheld because no consent record exists
aauth.agent_updated, aauth.agent_activated, aauth.agent_revoked, aauth.agent_deletedAn AAuth agent was changed in the portal
aauth.resource_created / aauth.resource_updated / aauth.resource_deletedAn AAuth resource was changed
mcp_server.created / mcp_server.updated / mcp_server.deletedAn MCP server registration changed
mcp.challenge_issuedAn MCP resource returned a 401 authorization challenge
mcp.metadata_not_foundProtected-resource metadata was requested for an unknown MCP server
mcp.tool.authorizationAn MCP tool call was authorized or denied for an agent (server_id, tool)
jit.task_created / jit.task_completedAn agent task was created / completed
jit.permission_requestedAn agent requested a just-in-time permission
jit.permission_auto_approved / jit.permission_policy_approvedA request was approved automatically (low risk) / by an approval policy
jit.hitl_triggeredA request needs a human approver (risk_level)
jit.permission_approved / jit.permission_deniedA request was approved or denied by a reviewer on any channel (portal inbox, API, mobile, approval channel), or denied by policy. Portal decisions were logged as jit.request.approved / jit.request.denied before 2026-09-28; those names remain webhook event types only
jit.token_issued / jit.permission_revokedA JIT token was issued / revoked
jit.approval_policy_created / jit.approval_policy_revokedA JIT approval policy was created / revoked
jit.callback_failed / jit.callback_blockedA decision callback failed / was blocked because it targets a private network
ciba.agent_initiatedAn agent started (or was refused) a CIBA request on behalf of a user
ciba.agent_approved / ciba.agent_deniedThe user approved / denied an agent-initiated CIBA request
caep.task_suspendedA task was suspended by a continuous access evaluation signal
approval_channel.created / approval_channel.updated / approval_channel.deletedA human-approval channel changed
approval_channel.enabled / approval_channel.disabled / approval_channel.tested / approval_channel.token_rotatedAn approval channel was switched on or off, tested, or had its token rotated
approval_channel.decision / approval_channel.decision_rejectedA decision arrived through an approval channel / was refused (reviewer not permitted, unknown request)
vault.connection_created / vault.connection_updated / vault.connection_deletedA token vault connection changed
vault.grant_linked / vault.grant_revoked / vault.refresh_failedA user linked or revoked an account in the token vault / a refresh was rejected by the provider
vault.token_issuedAn agent retrieved a token from the vault

Organization settings & integrations​

EventWhen it's recorded
tenant.created / tenant.updated / tenant.deletedRecord change on the organization itself (name, slug, status and settings)
signing_key.generated, signing_key.rotated, signing_key.primary_set, signing_key.imported, signing_key.revoked, signing_key.deletedSigning key lifecycle (kid, algorithm)
webhook.created / webhook.updated / webhook.deletedA webhook endpoint was added, changed or removed
webhook.secret_rotatedA webhook's signing secret was rotated
custom_domain.added / custom_domain.add_failed / custom_domain.verifiedA custom domain was added / couldn't be added / passed DNS verification
custom_domain.set_primary / custom_domain.set_primary_failedA domain was made primary / couldn't be
custom_domain.activated / custom_domain.disabled / custom_domain.deletedA domain was switched on, off, or removed
custom_domain.needs_reverificationDNS re-verification kept failing past the grace period, so the domain was flagged; severity warning
email_template.updated / email_template.revertedAn e-mail template was customized / reverted to the default
email_provider.created / email_provider.updated / email_provider.tested / email_provider.deletedA custom e-mail provider changed
sms_provider.created / sms_provider.updated / sms_provider.deletedA text-message provider changed
sms.sent / sms.failed / sms.rate_limitedA text message was sent / failed / was refused by the rate limit
social_login_provider.created / social_login_provider.updated / social_login_provider.deletedA social login provider was configured
oidc_idp_config_created / oidc_idp_config_updated / oidc_idp_config_deletedAn enterprise OIDC identity provider changed
oidc_idp_discover_failedOIDC discovery for a new identity provider failed
idp_connector.configured / idp_connector.discovery_failedAn identity provider was set up from the integrations catalog / its discovery failed
saml_idp_config_created / saml_idp_config_updated / saml_idp_config_deletedA SAML identity provider changed
saml.metadata_importedSAML IdP metadata was fetched from a URL or file
ldap.configured / ldap.updated / ldap.toggled / ldap.deletedAn LDAP directory connection changed
scim.configuration_updatedInbound SCIM settings changed
scim.<resource>.<operation>A SCIM client changed data: scim.user.create, .replace, .patch, .delete, the same for scim.group.*, scim.me.replace / scim.me.patch, scim.subscription.create / .delete, scim.mixed.bulk (reads are not recorded)
scim_outbound.configuration_updated / scim_outbound.connection_test_failedOutbound SCIM provisioning settings changed / its connection test failed
log_sink.created / log_sink.updated / log_sink.enabled / log_sink.disabled / log_sink.deletedA log shipper changed
alert_channel.created / alert_channel.updated / alert_channel.enabled / alert_channel.disabled / alert_channel.tested / alert_channel.deletedA security alert channel changed or was tested
analytics.integration_updated / analytics.integration_enabled / analytics.integration_disabled / analytics.integration_deletedA product-analytics integration changed
crm.integration_updated / crm.integration_enabled / crm.integration_disabled / crm.integration_deletedA CRM integration changed
crm.record_syncedA record was pushed to the CRM
hris.integration_created / hris.integration_updated / hris.integration_toggled / hris.integration_deletedAn HR system connection changed
hris.connection_testAn HR connection was tested (success or failure)
hris.sync_requested / hris.sync_completed / hris.sync_failedAn HR sync was started / finished / failed (run_id, dry_run)
risk_provider.created / risk_provider.updated / risk_provider.toggled / risk_provider.deletedA risk-signal provider changed
device_posture.integration_updated / device_posture.integration_deletedA device-posture integration changed
captcha.created / captcha.updated / captcha.deletedA CAPTCHA integration changed
secrets_manager.created / secrets_manager.updated / secrets_manager.deletedA secrets-manager connection changed
deploy_secret_target.created / deploy_secret_target.updated / deploy_secret_target.deletedA secret deployment target changed
fido_mds.refreshed / fido_mds.refresh_failedThe FIDO metadata service was refreshed / the refresh failed
ssf.stream_created / ssf.stream_deleted / ssf.verification_requestedA Shared Signals transmitter stream was created, deleted, or sent a verification event
ssf.set_delivered / ssf.set_delivery_failedA security event was delivered / failed to deliver to a receiver
ssf.receiver_created / ssf.receiver_deleted / ssf.receiver_status_changed / ssf.receiver_bearer_rotatedA Shared Signals receiver stream changed
ssf.receiver.<event>A received security event was processed or rejected, e.g. ssf.receiver.session_revoked, ssf.receiver.credential_change
ssf.receiver.set_rejectedAn incoming security event token was rejected before processing
ai_theme.login_page_failed / ai_theme.consent_page_failedAI theme generation for the login / consent page failed
billing.checkout_started / billing.portal_opened / billing.stripe_binding_resetA plan checkout or the billing portal was opened / the Stripe binding was reset
billing.addon_added / billing.addon_removed / billing.addon_trial_startedAn add-on was bought, removed or trialed
billing.checkout_session_completed, billing.customer_subscription_created, billing.customer_subscription_updated, billing.customer_subscription_deleted, billing.invoice_payment_failedA Stripe billing event was applied to the organization (before, after)
billing.quota_enforcedThe quota job enforced a plan limit; severity warning

Compliance & GDPR​

EventWhen it's recorded
data.exportedAn organization data export, or a user's personal data export (format)
audit.exportedThe audit log was exported (portal CSV or API)
gdpr.dsr.created / gdpr.dsr.updatedA data subject request was opened / changed status
gdpr.dsr.identity_challenge_issued / gdpr.dsr.identity_verifiedThe requester's identity was challenged / verified (method)
gdpr.erasure.completed / gdpr.erasure.failedA user was erased / erasure failed
gdpr.erasure.cross_tenant_scrubAn erased user's data was scrubbed across organizations (rows_scrubbed)
gdpr.portability.transmittedPersonal data was sent to another controller
gdpr.restriction.applied / gdpr.restriction.lift_scheduled / gdpr.restriction.liftedProcessing restriction for a user was applied, scheduled to lift, or lifted
gdpr.consent.granted / gdpr.consent.withdrawn / gdpr.consent.expiredA processing consent was given, withdrawn or expired (purpose)
gdpr.reconsent.triggeredUsers were asked to consent again (affected_users)
gdpr.cookie_consent.recordedA cookie consent choice was stored
gdpr.parental_consent.initiated / gdpr.parental_consent.verifiedParental consent for a child was requested / verified
gdpr.automated_decision.recorded / gdpr.automated_decision.contested / gdpr.automated_decision.reviewedAn automated decision was logged, contested, or reviewed by a person
gdpr.breach.created / gdpr.breach.authority_notified / gdpr.breach.subjects_notifiedA breach incident was opened / the authority or data subjects were notified
gdpr.dpia.created / gdpr.dpia.submitted / gdpr.dpia.approved / gdpr.dpia.rejectedA DPIA moved through review
gdpr.policy.created / gdpr.policy.published / gdpr.policy.publish_blockedA privacy policy version was drafted / published / blocked from publishing (missing)
gdpr.ropa.updated / gdpr.ropa.deactivatedA processing activity was edited / deactivated
gdpr.settings.updatedPrivacy settings changed
gdpr.subprocessor.announced / gdpr.subprocessor.deprecatedA sub-processor was announced / retired
gdpr.recipient_notification.dispatched / gdpr.recipient_notification.delivered / gdpr.recipient_notification.dead_letterRecipients were told about a data subject action / delivery succeeded / gave up
gdpr.lifecycle.dormant_processedThe retention job processed dormant accounts
security.audit_log_retention_deletionAudit rows older than the retention period were deleted (deleted_count, retention_days)
security.consent_integrity_violationA user's consent record chain failed its integrity check; severity critical

Operator actions​

Changes LumoAuth operators make to your organization or its users at your request (plan or add-on changes by contract, suspending or reactivating the organization, enabling the allow_root_admin_login fallback) are written to your organization's log as admin.tenant.*, admin.user.* and billing.admin_* events, and admin.tenant.* / admin.user.* always raise a high-risk alert.

Security-relevant events​

These events are written the same way from the portal, the Admin API, SCIM and the CLI, because they are emitted by the service that owns the change rather than by one screen. The Risk column is what drives alerts; events not mapped to a risk count as critical when their severity is critical, medium when they fail or carry severity warning or error, and low otherwise.

EventWhenRisk
login.failedA password, passkey, magic-link or push sign-in failed. Recorded against the organization whose login page was used, so it is visible in that organization's log (metadata.method: password, passkey, magic_link or push; reason)medium
auth.failedA machine credential failed: invalid, expired or cross-organization API key, invalid Bearer token, bad SCIM token, a passkey that matched no user (metadata.auth_method)medium
access.deniedAny 403 answered to an authenticated caller (route, auth method)medium
account.lockedAn account was locked after repeated failed sign-inshigh
oauth.security.code_reuse_detectedAn authorization code was replayedhigh
oauth.root_fallback_loginA LumoAuth operator signed in through this organization's login page (allow_root_admin_login)critical
role.assigned / role.removedA role was added to or removed from a user or group, from any surfacehigh / low
user.roles.updatedRoles changed in the portal user editorhigh
permission.granted / permission.revokedA permission was granted to or removed from a user or rolehigh / low
group.member_added / group.member_removedA user joined or left a grouplow
signing_key.generated, signing_key.rotated, signing_key.primary_setSigning key lifecyclehigh
signing_key.imported, signing_key.revoked, signing_key.deletedSigning key import and removalcritical
agent.created, agent.updated, agent.deletedAgent registry changeslow
agent.scopes_changedAn agent's capabilities changedhigh
agent.status_changed, agent.activated, agent.suspended, agent.revokedAgent lifecycle and kill switchlow
agent.token_issued, agent.key_rotated, agent.key_revoked, agent.credentials_rotatedAgent credentials minted or rotated through the Admin APIlow
webhook.created / webhook.updated / webhook.deletedA webhook endpoint was added, changed or removedlow
session.revoked / session.revoked_allOne session, or all of a user's or the organization's sessions, revokedlow
token.revokedOAuth tokens revoked by an administrator (one token, a user's, or a client's)low
data.exportedAn organization data export, or a user's personal data exporthigh
audit.exportedThe audit log was exported (portal CSV or API)high
password_reset.requestedA password reset was requested, by the user or by an administrator (metadata.requested_by). Renamed from password_reset_requested: update saved filters and SIEM ruleslow
user.email_change_requested / user.email_changedA user asked to change their e-mail / confirmed it from the new addresslow
user.password_changed with metadata.source admin_api, admin or portalAn administrator set another user's password through the Admin API or the portalhigh
user.password.set_by_adminAn administrator set a user's password in the portal (the Admin API equivalent is user.password_changed with source: admin_api)high
mfa.tap.issued, mfa.factor.removed, mfa.disabled, mfa.policy.changedCredential-takeover primitiveshigh
mfa.locked, mfa.push.reported_fraud, mfa.recovery.completedMFA lockout, a reported push, a finished account recoveryhigh
api_key.created, api_key.scopes_updated, client.secret_rotated, scim.token_generated, scim.token_regeneratedCredentials minted for machineshigh
admin.tenant.*, admin.user.*, super_admin.*Actions taken on the organization or its users by LumoAuth operatorshigh
impersonation.*A LumoAuth operator impersonated a usercritical
gdpr.erasure.completed, gdpr.erasure.cross_tenant_scrubA user was erasedhigh
security.audit_log_retention_deletionAudit rows were deleted by the retention jobhigh
security.consent_integrity_violationA consent record chain failed its integrity checkcritical
organization.deletedA customer organization was deletedhigh
adaptive_auth.decision with metadata.decision blockAdaptive authentication refused a sign-in (risk level or network block)high
security.ip_blockedA network block (Tor / datacenter-VPN) refused a sign-in; alerted through the matching adaptive_auth.decision block rowmedium

Failure rows for credentials and 403s are rate limited to one per credential, route and event per minute, so a credential-stuffing burst cannot flood the log.


Who did it: actor attribution​

Every row records how the actor authenticated in authMethod (API field; auth_method in exports and log shippers): session, api_key, bearer, scim, agent or system. Machine actors are no longer disguised as the person behind them:

CalleractorTypeactorId / actorNameAlso recorded
Browser session or user access tokenuserThe usermetadata.oauth_client_id for tokens
Organization API keyapi_keyThe key's id and namemetadata.api_key_id, metadata.actor_owner_id (the key's creator)
AI agent (agent token or agk_ key)agentThe agent_id and namemetadata.actor_owner_id (the agent's owner)
SCIM provisioningscim—metadata.actor_owner_id when the SCIM token maps to a user
Console command or background jobsystem——

All rows written by one request share one requestId, so you can group them. Stored IP addresses are truncated (/24 for IPv4, /48 for IPv6), session ids are stored as a keyed hash, and tokens that appear in URL paths (reset, magic-link, invitation, consent links) are replaced with [REDACTED].

Alerts for high-risk events​

Events with risk high or critical (see the table above; unmapped events count as critical when their severity is critical) are pushed as security alerts as they are written:

  • to the platform's own security sinks, operated by LumoAuth, and
  • to the organization's own Alert channels, filtered by each channel's minimum severity (default high).

Critical events are also appended to an emergency log file on the server, so they survive a log-pipeline outage. Alerts never block the audited operation.

Erasure and audit rows​

Deleting a user from the portal or the Admin API is a full Article 17 erasure (tokens, sessions, login attempts, consents and other side tables are cleared, and Article 19 recipients are notified), recorded as gdpr.erasure.completed plus user.deleted (admin.user.deleted when a LumoAuth operator performed the deletion). When a user is erased under GDPR Article 17, their audit rows are pseudonymised: e-mail addresses, names and before/after values that identify them are replaced, including rows where they appear only as the owner of an API key or agent (metadata.actor_owner_id). The erasure itself does not write a new row containing the original values.


Log Entry Structure​

Each audit log entry contains:

FieldDescriptionExample
TimestampWhen the event occurred2025-02-01T14:30:00Z
Event TypeEvent identifieruser.login
ActorUser, API key, agent, SCIM or system that triggered the eventalice@acme.com
Auth methodHow the actor authenticatedapi_key
TargetResource affecteduser:bob-uuid
IP AddressSource IP, truncated to its /24 (IPv4) or /48 (IPv6) prefix192.168.1.0/24
User AgentBrowser/client infoMozilla/5.0...
GeolocationApproximate locationNew York, US
DetailsAdditional context{"method": "passkey"}
ResultSuccess or failuresuccess

Querying via API​

Audit logs are read through the admin API under /orgs/{orgId}/api/v1/admin/audit-logs.

# Get recent audit logs
curl https://your-domain.com/orgs/{orgId}/api/v1/admin/audit-logs \
-H "Authorization: Bearer {admin_token}"

# Filter by event type (camelCase param name)
curl "https://your-domain.com/orgs/{orgId}/api/v1/admin/audit-logs?eventType=login.failed" \
-H "Authorization: Bearer {admin_token}"

# Filter by actor (user ID, not email) and date range
curl "https://your-domain.com/orgs/{orgId}/api/v1/admin/audit-logs?actorId=<userId>&from=2025-01-01&to=2025-02-01" \
-H "Authorization: Bearer {admin_token}"

Supported query parameters: eventType, action, actorId (alias userId), targetType (alias resourceType), targetId, severity, ipAddress, search, from/startDate, to/endDate, plus page and limit for pagination.

The response is paginated:

{
"data": [ /* audit log entries */ ],
"meta": { "total": 904, "page": 1, "limit": 50, "totalPages": 19, "hasNextPage": true, "hasPreviousPage": false },
"resourceType": "audit_logs"
}

Related endpoints under the same base path:

EndpointPurpose
GET /audit-logs/{logId}Fetch a single entry
GET /audit-logs/statsAggregate event counts
GET /audit-logs/actionsList distinct actions/event types
GET /audit-logs/export?format=csv|jsonExport filtered logs (CSV by default, format=json for JSON; at most 10,000 rows — the portal CSV export goes to 100,000)
GET /audit-logs/retentionRead the retention policy
PUT /audit-logs/retentionUpdate the retention policy

Log Retention​

SettingDefaultConfigurable
Retention Period730 days (2 years); minimum 90, maximum 3650, capped by the plan's limitYes

Configure retention in the portal under Privacy overview → Settings → Data retention (/orgs/{orgId}/portal/gdpr/settings): set Audit log retention (days) and click Save GDPR settings. The field starts at 730 days. The retention API above (PUT /audit-logs/retention) sets it programmatically.

The Data retention section of GDPR settings with the Audit log retention field

Audit rows are pruned by a daily platform job, which applies each organization's own settings and only runs for organizations that have data retention enabled. When autoDelete has been set to false through the retention API, audit rows are never pruned (the portal has no switch for this). The retention period is never shorter than 90 days (or the organization's security retention in years, when set), and each deletion is recorded as security.audit_log_retention_deletion.