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:read scope.
  • The ID and type of the resource you want the history of.

Endpoints

PurposeMethod and path
List audit log entriesGET /v3/platform/audit-logs
Get an audit log entryGET /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

StatusCause
422 ValidationErrorYou 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.
404No entry with that ID is visible to your Account.
500 InternalErrorThe history service returned more rows than the page size.
503 ServiceUnavailableThe 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.


Did this page help you?