Skip to content

Audit event catalog

The OP emits structured audit events from a closed catalog defined in op/audit.go. The catalog is a vocabulary, not a promise that every constant fires: this page marks the signals emitted by the OP and the names reserved for a future implementation or the embedder's account/device plane. Each identifier has shape <area>.<verb> (or <area>.<verb>.<qualifier>) so SOC dashboards can pre-aggregate by area without parsing free-form messages.

One closed catalog, three destinations
Every code path in the OP emits from one closed catalog of audit events. Each emission carries its context in extras and reaches structured logs, whatever SOC pipeline consumes them, and the Prometheus counters.emitted fromlands inlogin / MFAfactor outcomes, step-upstoken / grantissuance, rotation, revocationDCR / deviceregistration, device approvalsAudit eventop.Audit* — a closed setthe context travels in extras,never in a formatted messageslog, as JSONone object per eventSOC / SIEMqueryable by event namePrometheuscounters, labelled by outcome
The catalog being closed is what makes the right-hand column possible. An alert can key on an event name because the set of names is fixed and versioned, not assembled from a format string at the call site.

Subscribing

go
op.New(
    /* required options */
    op.WithAuditLogger(slog.New(myJSONHandler)),
)

op.WithAuditLogger takes a *slog.Logger. Each event records as a structured log entry. The event attribute contains the event identifier (e.g. "token.issued"), and msg is the short human-readable message. The remaining attributes carry the request-id, subject, client-id, and an extras group with category-specific fields. Emission is synchronous on the request goroutine: the handler must not block on slow I/O or an unbounded queue, and it must be safe for concurrent calls.

If WithAuditLogger is not supplied, audit events fall through to the logger configured by WithLogger. If neither logger is supplied, audit emission is discarded.

Prometheus mirror

A curated subset of these events is mirrored onto Prometheus counters when WithPrometheus is configured. A single emission updates both the slog stream and the matching counter — there is no separate metrics emit step.

Enumerating the catalog in code

The page below is generated from the same registry the OP itself uses, and that registry is public. op.AuditEventCatalog() returns a copy of every stable event as []op.AuditEventDefinition:

go
for _, def := range op.AuditEventCatalog() {
    // def.Event       — the audit event identifier, e.g. "token.issued"
    // def.MetricName  — the Prometheus counter it feeds; empty for audit-only events
    // def.MetricLabel — the bounded label value for category counters; often empty
}

Read it when you need the event set as data rather than as prose — provisioning SIEM rules, asserting in a test that a dashboard covers every event, or checking which events have a metric projection. Because the same registry drives both the in-tree emitters and the Prometheus bridge, event discovery and metric routing cannot drift apart.

Common attributes

Each emitted event always carries audit, event, and the record time. The following attributes appear when the emitter populated them:

AttributeTypeNotes
request_idstringper-request identifier; omitted when unknown
actor_idstringsubject identifier for a user-initiated event, or client_id for a client-initiated event; omitted when unknown
client_idstringOAuth client_id; omitted when unknown
extrasgroupcategory-specific fields (see each section); omitted when empty
timetimestampslog.Record.Time; follows WithClock (or the system clock when no clock is configured)

Event catalog

The catalog is regrouped by feature area. Each group opens with a short note on what the events mean for SOC and operations, followed by a table of event constant (the Go identifier in op/audit.go), when it fires or why it is reserved, severity hint (a starting point for routing — info for routine activity, warn for suspicious / failure conditions, alert for replay or store-fault signals), and the page that documents the surrounding behaviour. Rows explicitly labelled Reserved are not emitted by the OP; an absent reserved event is not evidence that the underlying action did not occur.

Provider lifecycle

startup.profile is the audit-stream anchor for an OP instance. It fires once after op.New has validated the configuration and before the provider is returned. Its extras cover two groups:

  • Declaredprofiles, features, grants.
  • Resolved policy — PKCE, PAR, nonce, sender-constraint, client-authentication, token-TTL, token-format, JAR, JARM, introspection.
Event constantWhen it firesSeverity hintLinked doc
AuditStartupProfilea validated provider startsinfoOptions reference

Account management

Reserved. These names cover out-of-band admin paths the OP does not host directly — provisioning, recovery, federation linking. The embedder may emit them through its audit sink; the OP itself does not.

Event constantWhen it firesSeverity hintLinked doc
AuditAccountCreatedReserved — user account provisioned by the embedderinfo
AuditAccountDeletedReserved — user account removed by the embedderinfo
AuditAccountEmailAddedReserved — email address added to an accountinfo
AuditAccountEmailVerifiedReserved — email ownership proveninfo
AuditAccountEmailRemovedReserved — email address removedinfo
AuditAccountEmailSetPrimaryReserved — primary email changedinfo
AuditAccountPasskeyRegisteredReserved — WebAuthn credential addedinfo
AuditAccountPasskeyRemovedReserved — WebAuthn credential removedinfo
AuditAccountTOTPEnabledReserved — TOTP enrollment completedinfo
AuditAccountTOTPDisabledReserved — TOTP removedinfo
AuditAccountPasswordChangedReserved — password reset or changedinfo
AuditAccountRecoveryRegeneratedReserved — recovery batch reissuedinfo
AuditRecoverySupportEscalationReserved — manual recovery or support override invokedwarn
AuditAccountFederationLinkedReserved — external IdP credential linkedinfo
AuditAccountFederationUnlinkedReserved — external IdP credential unlinkedinfo

Login, MFA, step-up

login.* and mfa.* are emitted by the authenticator chain after a primary or additional factor resolves. login.failed and mfa.failed are the routine probing signals; sustained increases on either are the canonical credential-stuffing tell. AuditMFARequired, AuditStepUpRequired, and AuditStepUpSuccess are Reserved: the OP does not emit them. Step-up is decided by the resource server and an ordinary authorization request reaches the OP.

Event constantWhen it firesSeverity hintLinked doc
AuditLoginSuccessprimary credential verified, subject boundinfoUse case: MFA / step-up
AuditLoginFailedprimary credential rejectedwarnUse case: MFA / step-up
AuditLockoutStalledcross-factor lockout CAS contention abandoned a failed attempt without counting italertUse case: MFA / step-up
AuditMFARequiredReserved — catalog vocabulary; the OP does not emit a separate requirement eventinfoUse case: MFA / step-up
AuditMFASuccesssecond factor acceptedinfoUse case: MFA / step-up
AuditMFAFailedsecond factor rejectedwarnUse case: MFA / step-up
AuditStepUpRequiredReserved — resource-server decision; the OP does not emit itinfoUse case: MFA / step-up
AuditStepUpSuccessReserved — resource-server outcome; the OP does not emit itinfoUse case: MFA / step-up
extras
  • factorpassword, passkey, totp, email_otp, captcha, recovery_code, or a user-defined Step kind
  • aal, acr, amr_values — not automatically carried by these login/MFA events

AuditConsentGranted and AuditConsentGrantedFirstParty are emitted by the consent prompt and first-party fast-path. The other consent constants are Reserved: incremental consent is recorded as ordinary consent.granted, reuse of an existing grant has no audit event, and grant withdrawal uses Grant Management's grant_management.revoked.

Event constantWhen it firesSeverity hintLinked doc
AuditConsentGranteduser clicked consent in the promptinfoConcepts: consent
AuditConsentGrantedFirstPartyfirst-party auto-consent applied (no prompt)infoUse case: first-party consent
AuditConsentGrantedDeltaReserved — incremental request is emitted as ordinary AuditConsentGrantedinfoConcepts: consent
AuditConsentSkippedExistingReserved — reuse of a stored consent is not emittedinfoConcepts: consent
AuditConsentRevokedReserved — Grant Management withdrawal emits AuditGrantManagementRevokedinfoConcepts: consent
extras
  • scopes_granted, scopes_requested — string slices
  • audience — when scope is per-audience

Code and token lifecycle

Fire from the authorize-code path and the token endpoint. The replay-detection events (code.replay_detected, refresh.replay_detected) and the substore-fault events (token.revoke_failed, refresh.chain_revoke_failed, refresh.grant_revoke_failed) are the high-signal alerts in this group; the rest is steady-state lifecycle telemetry.

Event constantWhen it firesSeverity hintLinked doc
AuditCodeIssuedauthorization code minted; exactly once for each issued code, including interactive and silent pathsinfoConcepts: authorization code + PKCE
AuditCodeConsumedcode redeemed at /tokeninfoConcepts: authorization code + PKCE
AuditCodeReplayDetectedcode presented twice — chain revokedalertConcepts: authorization code + PKCE
AuditTokenIssueda first refresh token is persisted for a grant (the event is not a counter for every access token)infoConcepts: tokens
AuditTokenRefreshedrefresh token rotated; new access token mintedinfoConcepts: refresh tokens
AuditTokenRevokedtoken revoked via /revoke or grant cascadeinfoConcepts: tokens
AuditTokenRevokeFailedrevocation attempt observed a substore fault; wire still 200 per RFC 7009 §2.2alertConcepts: tokens
AuditRefreshReplayDetectedrefresh token presented past rotation grace — chain revokedalertConcepts: refresh tokens
AuditRefreshChainRevokeFailedcascade revoke from a replay observed a substore faultalertConcepts: refresh tokens
AuditRefreshGrantRevokeFailedgrant-tombstone write failed during refresh-rotation cascadealertConcepts: refresh tokens
AuditRefreshPriorAccessTokenRevokeFailedrefresh rotation could not revoke the prior access token; extras identify whether retry is possiblealertConcepts: refresh tokens

code_id and completion_id are irreversible fingerprints of the authorization-code identifier. They are correlation values, not raw authorization codes or internal identifiers. code.issued is emitted exactly once for each issued code.

extras
  • refresh_origin — the typed origin recorded on the refresh chain: authorization_code, device_code, ciba, or custom_grant; an unknown or missing origin is projected as unknown by the metrics bridge. This is the grant that actually minted the refresh chain, not an arbitrary request grant_type label.
  • formatjwt or opaque for the access token
  • offline_access — bool; true on offline_access chain
  • cnfdpop_jkt or mtls_x5t#S256 when sender-bound
  • surface — on token.revoke_failed: which call site observed the fault. /revoke emits jwt_access_token, refresh_chain, or opaque_access_token; the token endpoint emits code_replay_jwt_access_tokens when the AT cascade after authorization-code replay errors out
  • grant_id — on token.revoke_failed (token endpoint) and refresh.grant_revoke_failed: the grant whose tombstone write failed
  • reason — on refresh.chain_revoke_failed / refresh.grant_revoke_failed: stringified error from the substore
  • err — on token.revoke_failed: stringified error from the substore
  • failure_stage, retryable — on refresh.prior_access_token_revoke_failed

Sessions and logout

The session and logout rows below are emitted by the session manager, /end_session, and the detached Back-Channel Logout coordinator. AuditLogoutRPInitiated is Reserved: /end_session records the resulting session and delivery outcomes, not a separate marker that an RP asked.

Event constantWhen it firesSeverity hintLinked doc
AuditSessionCreatednew browser session minted (post-login)infoConcepts: sessions and logout
AuditSessionDestroyedsession deleted (logout, expiry, eviction)infoConcepts: sessions and logout
AuditSessionAlreadyAbsentlogout targeted a session already absent or expiredinfoConcepts: sessions and logout
AuditSessionDestroyFailedsession deletion hit a store failure; the request returns static 503 and preserves statealertConcepts: sessions and logout
AuditLogoutClientLookupFailedclient-registry lookup failed with a store error while resolving an RP-initiated logout; the wire response remains genericalertConcepts: sessions and logout
AuditLogoutRPInitiatedReserved — no separate RP-initiated marker is emittedinfoConcepts: sessions and logout
AuditLogoutTokenRevokeFailedlogout-token or logout cascade revocation hit a store failurealertConcepts: sessions and logout
AuditLogoutBackChannelDeliveredBack-Channel logout token delivered to RPinfoUse case: Back-Channel Logout
AuditLogoutBackChannelFailedBack-Channel delivery failed (HTTP error / timeout / verification)warnUse case: Back-Channel Logout
AuditLogoutBackChannelResolveFailedgrant-based target resolution failedalertUse case: Back-Channel Logout
AuditLogoutBackChannelOverflowbounded target resolution overflowedwarnUse case: Back-Channel Logout
AuditBCLNoSessionsForSubjecta session-bearing /end_session notice resolved zero grant-derived RP targets (no RPs to notify)infoUse case: Back-Channel Logout
bcl.no_sessions_for_subject rationale

This event is emitted only when Notice.SessionID is present and grant-based audience resolution returns zero RP targets; it does not mean that the coordinator walked SessionStore or that a session was evicted. If SessionStore loses the row before /end_session can snapshot it, the handler does not start detached fan-out and this event is not emitted. INFO-level by design: zero grant-derived targets can be an ordinary no-op, so SOC tooling should alert on elevated rates rather than per-event. The event includes the configured WithSessionDurabilityPosture as context for trigger/snapshot loss versus a no-target outcome.

Defensive signals

The OP emits the CORS, DPoP (when the opt-in loose verifier is used), and retired-key signals below. Rate-limit names are Reserved for the embedder. PKCE, redirect-mismatch, and legacy-algorithm names are Reserved catalog vocabulary: the OP rejects those requests but does not emit these audit events.

Event constantWhen it firesSeverity hintLinked doc
AuditRateLimitExceededrequest rejected by rate limiter — embedder-emitted vocabulary; the library does not implement a generic per-IP / per-endpoint HTTP throttlewarn
AuditRateLimitBypassedrate-limit bypass token consumed (operator override) — embedder-emitted vocabulary; same scoping as AuditRateLimitExceededwarn
AuditPKCEViolationReserved — PKCE rejection is returned on the wire; no OP audit event is emittedalertConcepts: authorization code + PKCE
AuditRedirectURIMismatchReserved — redirect rejection is returned on the wire; no OP audit event is emittedwarnConcepts: redirect URI
AuditAlgLegacyUsedReserved — no OP path emits a legacy-algorithm telemetry eventwarnConcepts: JOSE basics
AuditCORSPreflightAlloweda CORS preflight matched the strict allow-listinfoUse case: CORS for SPA
AuditDPoPLooseMethodCaseAdmittedConditional — emitted only by a verifier configured with the loose method-case bridge; the standard op.New path is strictinfoConcepts: DPoP
AuditKeyRetiredKidPresentedrequest presented a kid past the JWKS grace window — verifier rejectedwarnOperations: key rotation

Interaction

The OP emits a render-failure signal only when the interaction driver fails before committing a response. If the driver has already committed the response, the OP cannot replace it and emits no duplicate event.

Event constantWhen it firesSeverity hintLinked doc
AuditInteractionRenderFailedthe interaction driver's render failed before response commitment; the OP serves a generic server_error pagealertUse case: SPA custom interaction

Introspection

Fire from /introspect when client authentication rejects or an opaque access-token / refresh-token store lookup fails. A clean inactive miss emits no error event. For a non-NotFound lookup fault, the audit event surfaces the outage while the RFC 7662 wire response remains HTTP 200 with {"active":false}; client-authentication failures retain the canonical error response.

Event constantWhen it firesSeverity hintLinked doc
AuditIntrospectionError/introspect rejected inbound client credentials or observed a non-NotFound opaque token-store lookup faultwarn / alertOperations: observability

Client authentication

Fire from /token, /par, /device_authorization, and /bc-authorize whenever client authentication rejects. The wire response stays at the canonical invalid_client; this event exposes the attempted client_id and a short reason code so SOC tooling can spot probing. /introspect uses AuditIntrospectionError instead, and /revoke does not emit this event.

Event constantWhen it firesSeverity hintLinked doc
AuditClientAuthnFailure/token, /par, /device_authorization, or /bc-authorize rejected the client (wrong secret, expired assertion, alg mismatch, missing private_key_jwt)warnConcepts: client types

Dynamic Client Registration

Fire from /register and /register/{client_id}. RAT and IAT failure events are the canonical probing signal under DCR.

Event constantWhen it firesSeverity hintLinked doc
AuditDCRIATConsumedInitial Access Token redeemedinfoUse case: Dynamic Client Registration
AuditDCRIATExpiredIAT presented past TTLwarnUse case: Dynamic Client Registration
AuditDCRIATInvalidIAT signature / format invalidwarnUse case: Dynamic Client Registration
AuditDCROpenRegistrationUsedopen (no-IAT) registration acceptedinfoUse case: Dynamic Client Registration
AuditDCRClientRegisterednew client createdinfoUse case: Dynamic Client Registration
AuditDCRClientMetadataReadRAT-bearing GET against /register/{client_id}infoUse case: Dynamic Client Registration
AuditDCRClientMetadataUpdatedRAT-bearing PUT against /register/{client_id}infoUse case: Dynamic Client Registration
AuditDCRClientDeletedRAT-bearing DELETE against /register/{client_id}infoUse case: Dynamic Client Registration
AuditDCRRATInvalidRegistration Access Token rejectedwarnUse case: Dynamic Client Registration
AuditDCRMetadataValidationmetadata payload failed policywarnUse case: Dynamic Client Registration
AuditDCRCascadeRefreshRevokeFailedclient deletion could not revoke that client's refresh-token rowsalertUse case: Dynamic Client Registration
AuditDCRCascadeGrantRevokeFailedclient deletion could not revoke that client's grantsalertUse case: Dynamic Client Registration
AuditDCRCascadeAccessTokenRevokeFailedclient deletion could not revoke that client's JWT access-token rowsalertUse case: Dynamic Client Registration
AuditDCRCascadeOpaqueAccessTokenRevokeFailedclient deletion could not revoke that client's opaque access-token rowsalertUse case: Dynamic Client Registration

Device Code (RFC 8628)

Fire from /device_authorization, the embedder's verification ceremony helpers in op/devicecodekit, and the token-endpoint device-code grant. device_code.verification.user_code_brute_force and device_code.token.slow_down are the canonical poll-abuse signals.

Event constantWhen it firesSeverity hintLinked doc
AuditDeviceAuthorizationIssued/device_authorization returned a fresh device_code + user_code pairinfoConcepts: device code
AuditDeviceAuthorizationRejected/device_authorization rejected the inbound request (unknown client, scope refusal, etc.)warnConcepts: device code
AuditDeviceAuthorizationUnboundRejectedDPoP / mTLS proof was required but absent from /device_authorizationwarnConcepts: sender-constrained tokens
AuditDeviceCodeVerificationApprovedembedder's verification page reported the user approved the pending codeinfoUse case: device code
AuditDeviceCodeVerificationDeniedembedder's verification page reported the user denied the pending code (or the per-record brute-force gate locked the row out)warnUse case: device code
AuditDeviceCodeUserCodeBruteForcea user_code submission missed; counter incremented (lockout fires after devicecodekit.MaxUserCodeStrikes, default 5)alertUse case: device code
AuditDeviceCodeTokenIssued/token minted a token for an approved device authorizationinfoUse case: device code
AuditDeviceCodeTokenRejected/token rejected the device-code grant (access_denied, expired_token, etc.)warnUse case: device code
AuditDeviceCodeTokenSlowDown/token returned slow_down; the substore row's interval was doubledwarnUse case: device code
AuditDeviceCodeRevokedop/devicecodekit.Revoke flipped the row to denied; when Deps.AccessTokens is wired, the helper also cascade-revoked issued access tokens and reports revoked_access_tokensinfoUse case: device code
AuditDeviceCodePollObservationFailedpersisting the LastPolledAt stamp on a poll faulted; decision still proceeds (best-effort observability)warnUse case: device code

CIBA

Fire from /bc-authorize and the token-endpoint CIBA grant. ciba.poll_abuse.lockout is the canonical client-misbehaviour signal. The authentication-device approval and denial names are Reserved: the embedder calls CIBARequestStore.Approve or Deny directly, outside an OP emission point.

Event constantWhen it firesSeverity hintLinked doc
AuditCIBAAuthorizationIssued/bc-authorize returned a fresh auth_req_idinfoConcepts: CIBA
AuditCIBAAuthorizationRejected/bc-authorize rejected the inbound request (unknown user, hint resolver failed, scope refusal)warnConcepts: CIBA
AuditCIBAAuthorizationUnboundRejectedDPoP / mTLS proof was required but absent from /bc-authorizewarnConcepts: sender-constrained tokens
AuditCIBAAuthDeviceApprovedReserved — embedder authentication-device callback; the OP does not observe the direct Approve callinfoUse case: CIBA
AuditCIBAAuthDeviceDeniedReserved — embedder authentication-device callback; the OP does not observe the direct Deny callwarnUse case: CIBA
AuditCIBAPollAbuseLockoutpoll cadence sustained well below the negotiated interval; the request was locked outalertUse case: CIBA
AuditCIBATokenIssued/token minted a token for an approved CIBA requestinfoUse case: CIBA
AuditCIBATokenRejected/token rejected the CIBA grant (access_denied, expired_token, authorization_pending)warnUse case: CIBA
AuditCIBATokenSlowDown/token returned slow_down because the client polled faster than the negotiated intervalwarnUse case: CIBA
AuditCIBAPollObservationFailedpersisting the LastPolledAt stamp on a poll faulted; decision still proceeds (best-effort observability)warnUse case: CIBA

Token Exchange (RFC 8693)

Fire from the in-tree RegisterTokenExchange handler. requested is emitted at handler entry, before parsing and structural validation, so structurally rejected attempts are included. Every successful exchange then emits requested + granted; later rejections emit requested + one of the failure-class events. policy_denied, scope_inflation_blocked, and audience_blocked are the policy-decision signals SOC dashboards usually want.

Event constantWhen it firesSeverity hintLinked doc
AuditTokenExchangeRequested/token dispatched an RFC 8693 attempt to the exchange handler, before parsing and structural validationinfoConcepts: token exchange
AuditTokenExchangeGrantedexchange admitted; new access token (and optionally refresh) mintedinfoUse case: token exchange
AuditTokenExchangePolicyDeniedthe embedder-supplied TokenExchangePolicy returned a denywarnUse case: token exchange
AuditTokenExchangePolicyErrorthe policy returned a non-deny error (transient infrastructure failure)warnUse case: token exchange
AuditTokenExchangeScopeInflationBlockedrequested scope exceeded the subject_token's scope or the client's allow-listwarnUse case: token exchange
AuditTokenExchangeAudienceBlockedrequested audience was not in the policy's allow-listwarnUse case: token exchange
AuditTokenExchangeTTLCappedissued TTL was clipped against (handler request, subject_token remaining, global ceiling)infoUse case: token exchange
AuditTokenExchangeActChainTooDeepnested act chain exceeded the configured depth limitwarnUse case: token exchange
AuditTokenExchangeEmptyScopeRejectedexchange requested a non-empty scope subset that resolved to the empty setwarnUse case: token exchange
AuditTokenExchangeActorEqualsSubjectactor_token resolved to the same subject as subject_token (no delegation)infoUse case: token exchange
AuditTokenExchangeSubjectTokenExternalsubject_token did not resolve in the local registry; treated as opaque externalinfoUse case: token exchange
AuditTokenExchangeActorTokenExternalactor_token did not resolve in the local registry; treated as opaque externalinfoUse case: token exchange
AuditTokenExchangeSubjectTokenInvalidsubject_token verification failed (signature / TTL / cnf mismatch)warnUse case: token exchange
AuditTokenExchangeSubjectTokenRegistryErrorregistry lookup observed a non-NotFound fault (transient outage); wire stays invalid_grantalertUse case: token exchange
AuditTokenExchangeRefreshIssuedexchange opted into refresh issuance (IssueRefreshToken=op.PtrBool(true))infoUse case: token exchange
AuditTokenExchangeSelfExchangeexchange targeted the calling client (passive token replay scenario)warnUse case: token exchange

Custom Grant

The dispatcher emits custom_grant.requested at dispatch entry for every attempt that reaches a registered custom handler, including successes and attempts that fail a gate before the handler runs. An unknown or unregistered grant_type returns before custom-grant dispatch and emits no custom-grant audit event. The dispatcher emits one custom_grant.failed at the single failure exit; a handler panic is recovered and produces that same one failed event with panic details in extras.

EventMeaningLevelSee
AuditCustomGrantRequested (custom_grant.requested)every dispatch attempt that reaches a registered custom handler, including pre-handler gate failuresinfoUse case: custom grant
AuditCustomGrantFailed (custom_grant.failed)custom grant dispatch or handler failed; emitted once per failed attempt, including a recovered panicwarnUse case: custom grant
AuditCustomGrantRefreshDropped (custom_grant.refresh_dropped)handler asked for a refresh token with IssueRefreshToken, but the client is not registered for refresh_token; the access-token response still succeedsinfoUse case: custom grant

Grant management

These events come from the OAuth 2.0 Grant Management endpoint. The failure signal is emitted when the authenticated revoke request cannot complete its grant cascade.

Event constantWhen it firesSeverity hintLinked doc
AuditGrantManagementRevokeda DELETE to the grant management endpoint revoked a grant and cascaded its tokensinfoUse case: grant management
AuditGrantManagementRevokeFaileda DELETE was authenticated but the grant-revoke side effect failedalertUse case: grant management

Stability

Audit event names are part of the public API surface:

  • New events MAY be added in any minor release.
  • Existing event names are renamed only in a major release with a deprecation notice.

Pin your dashboards on the names; do not rely on the order or the extras shape for any field not documented here.

Verifying this list

sh
git clone https://github.com/libraz/go-oidc-provider.git
cd go-oidc-provider
audit_catalog_tmp=$(mktemp ./audit-catalog-XXXXXX.go)
trap 'rm -f "$audit_catalog_tmp"' EXIT
cat >"$audit_catalog_tmp" <<'EOF'
package main

import (
  "fmt"
  "github.com/libraz/go-oidc-provider/op"
)

func main() {
  for _, def := range op.AuditEventCatalog() {
    fmt.Println(def.Event)
  }
}
EOF
go run "$audit_catalog_tmp"

This calls the public op.AuditEventCatalog() API and prints the closed catalog this page mirrors.