Skip to the documentation

Audit trail

Who did what in the org.

Read the audit trail

GET/api/v1/org/audit

Who did what in the org, newest first: role changes, invitations, key changes, limit changes. Pages by cursor, 50 at a time and up to 100. Admins only.

An API key carrying the scope named here, or a signed-in session.

Scope
audit:read
Key kinds
Organization
Access
The caller must administer the organization.

Required and optional fields, allowed values and errors, as the page shows them.

Parameters

NameInTypeRequiredDescription
limitQueryintegerOptionalHow many to return: 1 to 100, 50 when absent. A number outside that range is clamped; text is ignored.
cursorQuerystringOptionalWhere the last page ended: the cursor inside the previous page's links.next. Pass links as given; a cursor you edit is refused.

Examples

curl "https://liviamatch.com/api/v1/org/audit" \
  -H "Authorization: Bearer $LIVIA_API_KEY"

Responses

200

One page of the trail.

A role change
{
  "data": [
    {
      "id": "c8e2a6f9-3d41-4b07-9f5c-1b7d0a4e8c36",
      "action": "member.role_changed",
      "occurredAt": "2026-10-01T15:12:09.330Z",
      "actor": {
        "type": "user",
        "id": "3a8d1e47-9c52-4b0f-a6d3-5e7b2c9f1a04",
        "name": "Harper Quinn",
        "email": "harper@hearthandkey.example"
      },
      "target": {
        "type": "user",
        "id": "e1a5c8d2-6f37-4b94-a0c1-8d2e4f6a9b13",
        "label": "dev@hearthandkey.example"
      },
      "context": {
        "from": "member",
        "to": "admin"
      }
    }
  ],
  "links": {
    "next": null
  }
}
Fields (16)
FieldTypeDescription
dataobject[]
data[].idstring (uuid)
data[].actionstringWhat happened, as a dotted word: member.removed, api_key.created.
data[].occurredAtstring (date-time)
data[].actorobject
data[].actor.typestring
data[].actor.idstring (uuid) | null
data[].actor.namestring | null
data[].actor.emailstring | null
data[].targetobject
data[].target.typestring | null
data[].target.idstring | null
data[].target.labelstring | null
data[].contextobjectWhat the action carried; keys differ by action.
linksobject
links.nextstring | nullThe URL of the next page, or null when this is the last. Follow it as given.

Errors

StatusCodeWhen
403forbiddenThe caller does not administer the org.
400invalid-cursorThe cursor is not one a page linked to.

Any call of this kind can also answer401 unauthenticated401 invalid-api-key403 insufficient-scope429 rate-limited429 monthly-cap-reached500 internal