Skip to content

Audit Log Endpoints

Audit logs provide an append-only record of the actions performed within your VeraID organization. Logs are stored in an ordinary PostgreSQL table, indexed by organization, actor, action and identity over time.

Audit Log Fields

Every audit log entry contains the following fields:

FieldTypeDescription
idstringUnique identifier for the log entry
organizationIdstringThe organization the entry belongs to
actorTypestringType of actor: USER, IDENTITY, SYSTEM
actorIdstringIdentifier of the actor
actorNamestringDisplay name of the actor
actionstringThe action that was performed
resourceTypestringType of resource affected (e.g., identity, credential, policy)
resourceIdstringIdentifier of the affected resource
resourceNamestringDisplay name of the affected resource
outcomestringResult of the action: SUCCESS, FAILURE, DENIED
errorCodestringMachine-readable error code, when the action failed
errorMessagestringWhy the action failed or was denied
ipAddressstringSource IP address of the request
userAgentstringUser agent string of the client
geoLocationobject{ country, region, city } of the source address, when known
durationMsnumberRequest duration in milliseconds, when recorded
identityIdstringThe identity the entry concerns, when there is one
identityobject{ id, name, type } of that identity, or null
metadataobjectAdditional context specific to the action
timestampstringISO 8601 timestamp of when the action occurred

Query Audit Logs

Retrieve audit logs with filters for actor, action, resource, outcome, and time range.

GET /api/v1/audit-logs

Query Parameters

ParameterTypeDescription
actorTypestringFilter by actor type: USER, IDENTITY, SYSTEM
actorIdstringFilter by specific actor ID
actorSearchstringCase-insensitive substring match on actor ID or actor name
actionstringFilter by an exact action (e.g., identity.create, credential.verify), or by prefix with a trailing .*. The prefix is the text before .*, with no dot boundary: credential.* matches every action beginning credential, and identity.* also matches identity_group.*. See Actions
actionsstringFilter by any of several exact actions; repeat the parameter (actions=credential.create&actions=credential.revoke). Takes precedence over action
resourceTypestringFilter by resource type (e.g., identity, credential, policy)
resourceIdstringFilter by specific resource ID
outcomestringFilter by outcome: SUCCESS, FAILURE, DENIED
ipAddressstringFilter by exact source IP address
startDatestringStart of time range, an ISO 8601 date-time in UTC (e.g., 2026-03-18T00:00:00Z)
endDatestringEnd of time range, an ISO 8601 date-time in UTC
pagenumberPage number (default: 1)
limitnumberItems per page (default: 50, max: 100)

Example Request

Terminal window
curl -X GET "https://app.veraid.io/api/v1/audit-logs?actorType=IDENTITY&action=credential.verify&outcome=SUCCESS&startDate=2026-03-18T00:00:00Z&endDate=2026-03-19T23:59:59Z&limit=50" \
-H "Cookie: veraid-session=<your session cookie>"

Example Response

{
"data": [
{
"id": "8c0e7f2a-4b1d-4c55-9d2e-0f6a1b3c5d7e",
"organizationId": "org_abc",
"timestamp": "2026-03-19T09:15:00Z",
"actorType": "IDENTITY",
"actorId": "id_xyz789",
"actorName": null,
"action": "credential.verify",
"resourceType": "credential",
"resourceId": "cred_def456",
"resourceName": "Production API Key",
"outcome": "SUCCESS",
"errorCode": null,
"errorMessage": null,
"ipAddress": "10.0.1.50",
"userAgent": null,
"geoLocation": null,
"metadata": {},
"durationMs": null,
"identityId": "id_xyz789",
"identity": {
"id": "id_xyz789",
"name": "aws-deploy-prod",
"type": "SERVICE_ACCOUNT"
}
}
],
"total": 1847,
"page": 1,
"limit": 50,
"totalPages": 37
}

A credential.verify entry is written each time a stored credential is presented to authenticate. A wrong secret on an otherwise usable credential is recorded with outcome: "FAILURE". Any attempt on a credential refused for its state (revoked, expired, over its usage limit, identity not active, IP not allowed) is recorded as DENIED, whether or not the secret was right, because those checks run first. Either way the reason is in errorMessage. A key that matches no stored credential (unknown prefix or malformed) leaves no entry.

Filtering by Denied Access

To find all denied access attempts:

Terminal window
curl -X GET "https://app.veraid.io/api/v1/audit-logs?outcome=DENIED&startDate=2026-03-01T00:00:00Z" \
-H "Cookie: veraid-session=<your session cookie>"

Denials come mostly from policy enforcement, which records every decision it makes as policy.evaluate.<action>:

{
"data": [
{
"id": "1f4b9c7e-2d3a-4e8f-b6c1-9a0d2e3f4a5b",
"timestamp": "2026-03-15T22:45:00Z",
"actorType": "IDENTITY",
"actorId": "id_legacy01",
"action": "policy.evaluate.credential.read",
"resourceType": "credential",
"resourceId": null,
"outcome": "DENIED",
"errorMessage": "No matching policy found - default deny",
"ipAddress": "203.0.113.42",
"userAgent": "curl/8.1.2",
"identityId": "id_legacy01",
"metadata": {
"policyAction": "credential.read",
"refusedBy": {
"id": "pol_abc123",
"name": "Production Secrets - Office IPs Only",
"condition": "ip_range",
"reason": "IP 203.0.113.42 not in allowed ranges"
},
"conditions": [
{ "type": "ip_range", "passed": false, "reason": "IP 203.0.113.42 not in allowed ranges" }
],
"credentialId": "cred_legacy01",
"scopes": ["credentials:read"]
}
}
]
}

Filtering by System Actions

System-initiated actions include credential expiry, scheduled job runs, audit retention and rotation schedule deactivation:

Terminal window
curl -X GET "https://app.veraid.io/api/v1/audit-logs?actorType=SYSTEM&limit=10" \
-H "Cookie: veraid-session=<your session cookie>"
{
"data": [
{
"id": "6a2d8e1f-7c4b-4f3a-9e5d-1b2c3d4e5f60",
"timestamp": "2026-03-19T02:00:00Z",
"actorType": "SYSTEM",
"actorId": "credential-expiration-job",
"actorName": "Credential Expiration Job",
"action": "credential.expired",
"resourceType": "credential",
"resourceId": "cred_exp001",
"resourceName": "Analytics API Key",
"outcome": "SUCCESS",
"identityId": "id_gcp_analytics",
"metadata": {
"jobId": "job_123",
"expiredAt": "2026-03-19T00:00:00.000Z",
"credentialType": "API_KEY",
"identityName": "gcp-analytics-prod"
}
}
]
}

Export Audit Logs

Export audit logs in bulk for compliance reporting, archival, or analysis in external tools.

GET /api/v1/audit-logs/export

Query Parameters

Every parameter is optional.

ParameterTypeDescription
formatstringjson (default) or csv
startDatestringStart of the time range (ISO 8601)
endDatestringEnd of the time range (ISO 8601)
actorTypestringUSER, IDENTITY or SYSTEM
actorIdstringEntries by this actor
actionstringEntries with exactly this action. Unlike the list endpoint, a trailing .* prefix is not supported here
resourceTypestringEntries for this resource type
outcomestringSUCCESS, FAILURE or DENIED

Example Request

Terminal window
curl -X GET "https://app.veraid.io/api/v1/audit-logs/export?format=json&startDate=2026-03-01T00:00:00Z&endDate=2026-03-19T23:59:59Z" \
-H "Cookie: veraid-session=<your session cookie>" \
-o audit-logs-march.json

The JSON export is an array of audit log entries with every field listed under Audit Log Fields, except identity, which only the list endpoint adds (identityId is included).

CSV Export

Terminal window
curl -X GET "https://app.veraid.io/api/v1/audit-logs/export?format=csv&startDate=2026-03-01T00:00:00Z&endDate=2026-03-19T23:59:59Z" \
-H "Cookie: veraid-session=<your session cookie>" \
-o audit-logs-march.csv

The CSV export has these columns. Every value in the data rows is quoted, with embedded quotes doubled:

timestamp,actorType,actorId,actorName,action,resourceType,resourceId,resourceName,outcome,ipAddress,errorMessage

The CSV leaves out metadata, userAgent, geoLocation and the other fields; use the JSON export when you need them.


Actions

The action values VeraID writes. The action filter matches them exactly (or by prefix with .*), so use them as written: most are resource.verb in the present tense (credential.create, not credential.created), but connector, Sectora and governance entries use their own forms. Entries shown with <...> are built at run time; the possible values are listed beside them.

Identities

ActionDescription
identity.createAn identity was created
identity.updateAn identity’s configuration was modified
identity.suspendAn identity was suspended
identity.activateA suspended identity was reactivated
identity.revokeAn identity was revoked
identity.deleteAn identity was deleted
identity.create_from_nhiAn identity was created from a discovered non-human identity
nhi.linkA discovered non-human identity was linked to an existing identity
identity.import.create / identity.import.updateAn import created or updated an identity
identity_group.create / identity_group.update / identity_group.deleteAn identity group was created, modified or deleted
identity_group.add_member / identity_group.remove_memberAn identity was added to or removed from a group

Credentials

ActionDescription
credential.createA credential was issued
credential.verifyA stored credential was presented to authenticate: SUCCESS, FAILURE (wrong secret on a usable credential) or DENIED (refused for its state, checked before the secret)
credential.revokeA credential was revoked
credential.expiredThe expiration job found a credential past its expiry (actor SYSTEM)
credential.fetchA credential’s secret was fetched with an organization API key
credential.emergency_rotateA credential was rotated as an emergency
credential.emergency_revokeA credential was revoked through the emergency-rotation endpoint
credential.rotation_startedA scheduled or manual rotation began
credential.rotation_completedA rotation finished
credential.rotation_failedA rotation failed
credential.rotation_rollbackA rotation was rolled back to the previous secret
credential.sync_success / credential.sync_failedA credential was pushed, or failed to push, to a sync target
credential.vault_store / credential.vault_read / credential.vault_revokeA secret in an AI agent’s vault was stored, read by the agent, or revoked
rotation_schedule.create / rotation_schedule.update / rotation_schedule.deleteA rotation schedule was created, modified or deleted
rotation_schedule.deactivateA rotation schedule was switched off automatically because its credential cannot be rotated by a schedule, such as a temporary credential or a vault secret (actor SYSTEM)
sync_target.create / sync_target.deleteA credential sync target was added or removed

Policies

ActionDescription
policy.createA policy was created
policy.updateA policy was modified
policy.enable / policy.disableA policy was switched on or off
policy.deleteA policy was deleted
policy.created_from_templateA policy was created from a template
policy.framework_bundle_appliedA compliance framework’s policy bundle was applied
policy.import.create / policy.import.updateAn import created or updated a policy
policy.evaluate.<action>Policy enforcement decided a request. outcome is SUCCESS (allowed) or DENIED; metadata carries the matched policy, or on a denial the ALLOW policy whose condition failed (refusedBy)
policy.bypass.<action>A request skipped evaluation because a configured bypass condition was met. Today that is a dashboard user (actor USER) on GET or POST /api/v1/credentials
policy.skip.<action>Enforcement was switched off for the route or HTTP method; actor SYSTEM. No current route is configured this way, so this is not written today

<action> is the enforced operation. Today enforcement covers credential.read and credential.create (GET and POST /api/v1/credentials) and identity.read, identity.update and identity.delete (/api/v1/identities/{id}), so for example policy.evaluate.credential.read.

Webhooks

ActionDescription
webhook.create / webhook.update / webhook.deleteA webhook was created, modified or deleted
webhook.secret_regeneratedA webhook’s signing secret was regenerated
webhook.testA test delivery was sent
webhook.import.create / webhook.import.updateAn import created or updated a webhook

Alerts and incidents

ActionDescription
alert.acknowledge / alert.resolve / alert.dismissAn alert was acknowledged, resolved or dismissed
incident.createdAn incident was opened in a connected incident tool
incident_integration.configured / incident_integration.deletedAn incident-tool integration was configured or removed

Just-in-time access

ActionDescription
jit.request.createdA JIT access request was submitted
jit.request.auto_approvedA request was approved automatically by an approval policy
jit.request.approved / jit.request.rejected / jit.request.cancelledA request was approved, rejected or cancelled
jit.request.reviewed_via_<platform>A request was decided from Slack or Teams (<platform> is slack or teams)
jit.credential.revealed / jit.credential.reveal_deniedA JIT credential was revealed, or a reveal was refused
jit.approval_policy.created / jit.approval_policy.updated / jit.approval_policy.deletedA JIT approval policy was created, modified or deleted

AI agents

ActionDescription
agent.register / agent.update / agent.approveAn agent was registered, modified or approved
agent.suspend / agent.reactivate / agent.terminate / agent.expiredAn agent’s lifecycle changed
agent.discoveredAn unregistered agent was discovered
discovery.<resolution>A discovered agent was resolved: discovery.register, discovery.block, discovery.ignore or discovery.link
agent.api_key_generated / agent.api_key_revokedAn agent API key was issued or revoked
agent_policy.create / agent_policy.update / agent_policy.delete / agent_policy.reorderAn agent policy was created, modified, deleted or reordered
agent_policy.enable / agent_policy.disableAn agent policy was switched on or off
agent_approval.request_createdAn agent action was held for human approval
agent_approval.approved / agent_approval.deniedA held action was decided
agent_approval.cancelled / agent_approval.expiredA held action was cancelled or timed out
gateway.<decision>The agent gateway decided an action: gateway.allow, gateway.challenge, gateway.block, gateway.throttle or gateway.alert
gateway.session_endedAn agent gateway session ended
ai.usage_recordedAI spend was recorded
ai.budget_warning / ai.budget_blockedA budget check warned or refused
ai.budget_resetAn admin reset an AI budget
ai.prompt_injection_checkA prompt was checked for injection
ai.<call>An AI call was logged through AI monitoring: ai.completion, ai.chat, ai.embedding, ai.image, ai.audio or ai.custom
quota.warning / quota.exceededA usage quota check warned or refused
mcp.server.registered / mcp.server.verified / mcp.server.blockedAn MCP server was registered, verified or blocked
ai_platform.integration.createAn AI platform integration was added
ai_platform.agent.offboard / ai_platform.credential.rotateAn AI platform agent was offboarded, or its credential rotated
ai_platform.<activityType>Usage synced from an AI platform, e.g. ai_platform.code_suggestions, ai_platform.conversations
LLM_PROVIDER_CONFIGUREDAn LLM provider was configured
FRAMEWORK_INTEGRATION_CREATED / FRAMEWORK_INTEGRATION_UPDATED / FRAMEWORK_INTEGRATION_DEACTIVATEDAn AI framework integration was added, changed or deactivated

Cloud and CI/CD connectors

ActionDescription
aws.access_key_created / aws.access_key_rotated / aws.access_key_revokedAn AWS IAM access key was created, rotated or revoked
gcp.service_account_key_created / gcp.service_account_key_rotated / gcp.service_account_key_revokedA GCP service account key was created, rotated or revoked
azure.client_secret_created / azure.client_secret_rotated / azure.client_secret_revokedAn Azure client secret was created, rotated or revoked
azure.service_principal_disabled / azure.service_principal_permissions_revokedAn Azure service principal was disabled, or its permissions revoked
kubernetes.token_created / kubernetes.token_secret_created / kubernetes.token_rotated / kubernetes.token_revokedA Kubernetes service account token changed
github_actions.secret_created / github_actions.secret_deletedA GitHub Actions secret was written or deleted
gitlab_ci.variable_created / gitlab_ci.variable_updated / gitlab_ci.variable_deletedA GitLab CI variable changed
circleci.context_created / circleci.context_deleted / circleci.env_var_created / circleci.env_var_deletedA CircleCI context or environment variable changed
jenkins.credential_created / jenkins.credential_deletedA Jenkins credential was written or deleted
aws.sync_completed, gcp.sync_completed, azure.sync_completed, azure.service_principals_sync_completed, kubernetes.sync_completed, github_actions.sync_completed, gitlab_ci.sync_completed, circleci.sync_completed, jenkins.sync_completedA user-started connector sync finished (actor USER). Only the CI/CD connectors (GitHub Actions, GitLab CI, CircleCI, Jenkins) record a failed sync, as FAILURE; the cloud connectors write a row only on success
discovery.scan_started / discovery.scan_completed / discovery.scan_failedA discovery scan started, finished or failed
integration_credential.configure / integration_credential.deleteA connector’s stored credentials were set or removed
integration.<platform>.account_linked / integration.<platform>.account_unlinkedA user linked or unlinked a Slack or Teams account

Secret scanning (Sectora)

ActionDescription
secret.leakedA leaked secret was reported
secret.remediatedA leaked secret was remediated
credential.revokedA credential was revoked automatically because it was found leaked (actor SYSTEM)
scan.completed / scan.failedA Sectora scan finished or failed
oauth.risky_appA risky OAuth app was reported

Governance and lifecycle

ActionDescription
ATTESTATION_CAMPAIGN_CREATED / ATTESTATION_CAMPAIGN_LAUNCHEDAn attestation campaign was created or launched
ATTESTATION_DECISION_SUBMITTED / ATTESTATION_ITEMS_ESCALATEDAn attestation decision was submitted, or overdue items were escalated
IDENTITY_REVOKED_VIA_ATTESTATIONAn identity was revoked by an attestation decision
IDENTITY_AUTO_DISABLEDA lifecycle rule disabled an inactive identity
IDENTITY_OWNERSHIP_TRANSFERRED / BULK_OWNER_ASSIGNMENTIdentity ownership was transferred or assigned in bulk
OFFBOARDING_EXECUTEDAn owner’s offboarding plan was executed
OFFBOARDING_<step>One step of an offboarding plan: OFFBOARDING_TRANSFER, OFFBOARDING_REVOKE or OFFBOARDING_DISABLE
CORRELATION_GROUP_CREATED / CORRELATION_GROUP_SUSPENDEDA cross-platform identity correlation group was created or suspended
OAUTH_APP_REVIEWED / OAUTH_APP_REVOKEDA third-party OAuth app was reviewed or revoked
CLOUDVERA_ANOMALY_DETECTED / CLOUDVERA_COST_SPIKE / CLOUDVERA_GEO_ANOMALYCloudVera reported an anomaly

Organization, team and account

ActionDescription
organization.createdAn MSP created a client organization
organization.member.role_updated / organization.member.removedA member’s role was changed, or the member removed
team.created / team.updated / team.deletedA team was created, modified or deleted
team.member.added / team.member.removed / team.member.role_updatedTeam membership changed
team.invitation.sent / team.invitation.accepted / team.invitation.cancelledA team invitation was sent, accepted or cancelled
mfa.enabled / mfa.disabled / mfa.admin_force_disabledMFA was turned on or off, or an admin turned it off for a user
mfa.backup_code_used / mfa.backup_codes_regeneratedA backup code was used, or the codes regenerated
mfa.account_lockedAn account was locked after repeated MFA failures
user.mfa_verified / user.mfa_failedA session MFA check passed or failed
user.email_change.requested / user.email_change.completedA user asked to change their email address, or confirmed the change

System

ActionDescription
job.<name>.completed / job.<name>.failedA scheduled job ran for the organization
job.credential-expiration.summaryThe credential expiration job’s summary for the organization
audit.retention.cleanupThe retention job deleted audit entries past the organization’s retention period
audit_log.exportAn audit report was exported

Alerts, credential.used and policy.violated are not audit actions. alert.triggered and policy.violated are webhook events, and a credential’s use is recorded as credential.verify.

Retention

A job runs nightly at 02:00 UTC and deletes audit entries older than the organization’s retention period:

PlanRetention Period
Free, Team, or no plan set90 days
Business1 year
Enterprise10 years

VeraID can set a different period for your organization on request (contact support), down to a minimum of 7 days. When a run deletes entries from your organization, it records an audit.retention.cleanup entry (actor SYSTEM) in your log. Entries are otherwise removed only when the organization itself is deleted.

Deleted entries cannot be recovered through the API. A file you export is yours and is not touched by retention, so export regularly if your compliance requirements need history beyond your retention period.