Audit logs
Read the change history of a resource, such as a Payee or a PayrollRun, with the V3 audit log endpoints.
An audit log entry records one change to a resource: who made it, when, and which fields changed. Use it to answer "what happened to this Payee?" or "who changed this engagement?".
Audit logs are best-effort operational history. They are not a copy of each request and response, and they are not a complete compliance ledger. To debug a request payload, use API request logs.
Prerequisites
- A credential with the
platform.audit-log:readscope. - The ID and type of the resource you want the history of.
Endpoints
| Purpose | Method and path |
|---|---|
| List audit log entries | GET /v3/platform/audit-logs |
| Get an audit log entry | GET /v3/platform/audit-logs/{auditLogId} |
List the history of one resource
The list takes one pair of filters, and you must send both: filter[resourceType][eq] and filter[resourceId][eq]. There is no accountId filter and no other filter.
resourceType is one of BackgroundCheck, BackgroundCheckRequest, Engagement, IdentityVerificationRequest, InsuranceCoverage, InsuranceMonitor, InsuranceImport, Payee, Payer, PayerEngagement, PayeeEngagement, BenefitEnrollment, Requirement, RequirementDefinition, SharedFileRequest, SignatureRequest, WorkItem, WorkLog, PayrollRun or PayStatement.
curl -g "https://api.wingspan.app/v3/platform/audit-logs?filter[resourceType][eq]=Payee&filter[resourceId][eq]=Rt4nVb8KxLq2Wz6mCd9HpE&page[size]=25" \
-H "Authorization: Bearer $WINGSPAN_TOKEN" \
-H "X-Wingspan-Account: Nw7kQ2pLx9RtVb3mHc5dZa"{
"url": "/v3/platform/audit-logs?filter[resourceType][eq]=Payee&filter[resourceId][eq]=Rt4nVb8KxLq2Wz6mCd9HpE",
"data": [
{
"id": "evt_01",
"title": "Payee updated",
"timestamp": "2026-11-02T15:20:09.000Z",
"resourceType": "Payee",
"resourceId": "Rt4nVb8KxLq2Wz6mCd9HpE",
"resources": [{ "resourceType": "Payee", "resourceId": "Rt4nVb8KxLq2Wz6mCd9HpE" }],
"changes": [
{ "path": "defaults.paymentTermsDays", "type": "Updated", "before": 30, "after": 15 }
],
"actorId": "Pq3mT8vLw2NzKc5xRb7HdA",
"viewers": ["Nw7kQ2pLx9RtVb3mHc5dZa"]
}
],
"pagination": { "nextPageToken": "", "totalSize": 1 }
}The values in the example are illustrative. Entry IDs are opaque strings, and changes[].type is a string.
An entry has id, title, timestamp, resources, changes and viewers, and may have description, note, attachmentId, resourceType, resourceId, actorId, actorName, accountId and accountName. Each change has path, type, and, when known, name, before and after. Responses are not cached.
Get one entry
Get an audit log entry returns the entry by ID when your effective Account is allowed to see it.
Errors
| Status | Cause |
|---|---|
422 ValidationError | You sent only one of the two resource filters, or resourceType is not in the list above, or auditLogId is empty or longer than 256 characters. |
404 | No entry with that ID is visible to your Account. |
500 InternalError | The history service returned more rows than the page size. |
503 ServiceUnavailable | The history service did not return the entry you asked for. |
Some resource routes also return their own history, such as GET /v3/payments/payees/{payeeId}/events. These use the same entry shape.
Updated about 1 hour ago