Read the audit log
const url = 'https://api.pealboard.com/v1/audit?cursor=MDAwMS0y&limit=50&action=api_key.issued&since=-30d';const options = {method: 'GET', headers: {Authorization: 'Bearer <token>'}};
try { const response = await fetch(url, options); const data = await response.json(); console.log(data);} catch (error) { console.error(error);}curl --request GET \ --url 'https://api.pealboard.com/v1/audit?cursor=MDAwMS0y&limit=50&action=api_key.issued&since=-30d' \ --header 'Authorization: Bearer <token>'Every write made in this workspace, newest first, with the actor, the credential kind, the API key when one was used, the request id, and the before and after of anything that changed.
Filter by action for one kind of event, or by since for a window. What happened to a single issue is GET /v1/issues/{issueId}/activity, which every member can read; this is the workspace’s own record and is limited to admins.
Access. Requires the admin role or above (admin, owner). The audit log names who did what with which credential, which is administrative information about people. API-key scope: workspace:read.
Authorizations
Section titled “Authorizations”Parameters
Section titled “Parameters”Query Parameters
Section titled “Query Parameters”The nextCursor from the previous page, unchanged. Omit it to start at the beginning.
Example
MDAwMS0yThe nextCursor from the previous page, unchanged. Omit it to start at the beginning.
How many rows to return. At most 100.
How many rows to return. At most 100.
Exactly one action, such as member.role_changed.
Example
api_key.issuedExactly one action, such as member.role_changed.
An ISO 8601 instant, or a window such as -7d.
Example
-30dAn ISO 8601 instant, or a window such as -7d.
Responses
Section titled “Responses”One page of the log.
object
object
A UUID this API issued.
The object, then what happened to it: member.role_changed.
Who did it, and with which credential — a session or a named API key.
object
object
The X-Request-Id of the request that made the change.
Pass this back as cursor for the next page. Null on the last page.
Examplegenerated
{ "data": [ { "id": "2489E9AD-2EE2-8E00-8EC9-32D5F69181C0", "action": "example", "actor": { "additionalProperty": "example" }, "target": { "type": "example", "id": "example" }, "before": "example", "after": "example", "requestId": "example", "createdAt": "2026-04-15T12:00:00Z" } ], "nextCursor": "example"}No valid credentials.
object
object
A stable identifier for the kind of failure. Safe to branch on.
What went wrong, written for a person.
Structured particulars, when there are any.
object
What to do about it, when there is something to do.
Quote this when asking about a specific failure.
Examplegenerated
{ "error": { "code": "example", "message": "example", "detail": { "additionalProperty": "example" }, "remedy": "example", "requestId": "example" }}Authenticated, but not permitted.
object
object
A stable identifier for the kind of failure. Safe to branch on.
What went wrong, written for a person.
Structured particulars, when there are any.
object
What to do about it, when there is something to do.
Quote this when asking about a specific failure.
Examplegenerated
{ "error": { "code": "example", "message": "example", "detail": { "additionalProperty": "example" }, "remedy": "example", "requestId": "example" }}No such resource, or it is not visible to you.
object
object
A stable identifier for the kind of failure. Safe to branch on.
What went wrong, written for a person.
Structured particulars, when there are any.
object
What to do about it, when there is something to do.
Quote this when asking about a specific failure.
Examplegenerated
{ "error": { "code": "example", "message": "example", "detail": { "additionalProperty": "example" }, "remedy": "example", "requestId": "example" }}The request conflicts with the current state.
object
object
A stable identifier for the kind of failure. Safe to branch on.
What went wrong, written for a person.
Structured particulars, when there are any.
object
What to do about it, when there is something to do.
Quote this when asking about a specific failure.
Examplegenerated
{ "error": { "code": "example", "message": "example", "detail": { "additionalProperty": "example" }, "remedy": "example", "requestId": "example" }}The request did not match the expected shape.
object
object
A stable identifier for the kind of failure. Safe to branch on.
What went wrong, written for a person.
Structured particulars, when there are any.
object
What to do about it, when there is something to do.
Quote this when asking about a specific failure.
Examplegenerated
{ "error": { "code": "example", "message": "example", "detail": { "additionalProperty": "example" }, "remedy": "example", "requestId": "example" }}Rate limited. Retry after the interval in the header.
object
object
A stable identifier for the kind of failure. Safe to branch on.
What went wrong, written for a person.
Structured particulars, when there are any.
object
What to do about it, when there is something to do.
Quote this when asking about a specific failure.
Examplegenerated
{ "error": { "code": "example", "message": "example", "detail": { "additionalProperty": "example" }, "remedy": "example", "requestId": "example" }}GitHub or another dependency refused or did not answer. Nothing in the workspace changed.
object
object
A stable identifier for the kind of failure. Safe to branch on.
What went wrong, written for a person.
Structured particulars, when there are any.
object
What to do about it, when there is something to do.
Quote this when asking about a specific failure.
Examplegenerated
{ "error": { "code": "example", "message": "example", "detail": { "additionalProperty": "example" }, "remedy": "example", "requestId": "example" }}