audit

GET /v1/audit

Read the organization's audit log.

All audit endpoints

All developer docs →

Authentication

Send an API key as a bearer token. The key must carry the audit.read permission; a key without it is refused with 403, not 404.

Where your organisation id goes

This endpoint takes org_id as a query parameter. Leave it out and the call covers your whole tenancy subtree; send it to narrow the call to one organisation.

Your organisation id is on the API keys screen in your dashboard, beside the key itself. It is the same id in every call you make.

Try it

Replace anything in angle brackets with your own values, and the key placeholder with a key from your dashboard.

curl -X GET https://api.zinndigital.com/v1/audit \
  -H "Authorization: Bearer zdk_live_…"

Signed in? The API console in your dashboard fills in your real organisation id and your own key, and runs the request against the live API so you can see the actual response. Open this endpoint in the API console

Details

Returns the append-only record of privileged actions taken in the tenant — including staff access — newest first, ordered by the sortable id, with older entries reachable by paging the cursor. (It described itself as oldest → newest until #462 made every collection newest-first: for an audit feed the answer to "what just happened here?" was on the last page.) The actor's IP is not exposed here (it is admin-console only). Requires audit.read. An undeclared query parameter is refused with 422, never ignored. A filter this endpoint does not read used to answer 200 with the whole log, which is indistinguishable from a real answer and reads as "there is a lot of history here" rather than "the filter was dropped" (D26500). Every parameter below is read.

Parameters

NameTypeRequiredWhat it is
cursor (query)stringNoOpaque cursor from a previous page's page.next_cursor.
limit (query)integerNoMaximum items to return (page size).
org_id (query)UuidNoRestrict to one organization in scope (default — the whole subtree).
action (query)stringNoFilter to one action code (e.g. apikey.created).
actor (query)stringNoFilter to one actor (e.g. user:0190… or apikey:0190…).
target (query)stringNoFilter to one acted-on object — the exact target a row carries (a hostname, a site id, a deploy sha). Exact match, never a prefix: a substring match would make site-1…
since (query)stringNoOnly entries at or after this ISO 8601 instant (inclusive).
until (query)stringNoOnly entries at or before this ISO 8601 instant (inclusive), so since and until together bound an incident window. since == until selects that instant rather than nothing.

Response

NameTypeRequiredWhat it is
dataAuditEntry[]Yes—
pagePageMetaYes—

Errors this endpoint can return

401 · 403 · 422 · 429