List the audit log
https://api.norreach.app/v1/audit-logThe workspace's audit log, newest first: what happened, who did it, and — for anything done through the API — which key (or connected app), from REST or MCP, with the request id. Each entry names the ids it is about; its raw details are never served. Filter by action (exact, or a prefix like contact.*), actor (part of the name, e.g. an email or "via API key"), since / until. Owners and admins.
curl -X GET "https://api.norreach.app/v1/audit-log" \
-H "Authorization: Bearer $NORREACH_API_KEY"{
"object": "list",
"data": [
{
"id": "48211",
"object": "audit_entry",
"action": "api.approve_approval",
"actor": "anna@example.com via API key CRM sync (nr_live_8fK2pQ1x)",
"via": {
"kind": "api_key",
"surface": "rest",
"key_id": "0f1e2d3c-4b5a-4968-8776-655443322110",
"key_prefix": "nr_live_8fK2pQ1x",
"client_name": null,
"request_id": "6f0c2a1e-9b8d-4c7e-a6f5-4e3d2c1b0a99"
},
"targets": {
"contact_id": "7d1c3b2a-5e4f-4a1b-9c8d-0e1f2a3b4c5d"
},
"created_at": "2026-11-05T09:12:33.120Z"
}
],
"has_more": false,
"next_cursor": null
}Authorizations
Bearer authentication: send Authorization: Bearer <key>, with an API key or an OAuth access token. The key needs the scope audit:read. API keys and scopes
Query parameters
Page size (1–200, default 50).
The next_cursor of the previous page.
Only this action, or every action under a prefix (contact.*).
Only entries whose actor contains this.
Only entries at or after this time (RFC 3339).
Only entries before this time (RFC 3339).
Response
200application/json— List the audit log
Show child attributesHide child attributes
The entry's id.
What happened (contact.erased, api.publish_page, Approved …).
Who did it: a person's email, "<email> via API key <label> (<prefix>)", or "nora".
Set when it was done through the API: which key, from where.
The ids it is about (contact_id, campaign_id …).
RFC 3339 UTC timestamp with milliseconds.
Errors
Errors are application/problem+json with a stable code.
| Status | Code | Meaning |
|---|---|---|
| 400 | bad_request | The request couldn't be read. |
| 400 | unknown_field | The request has a field this operation doesn't know. |
| 400 | invalid_cursor | That cursor doesn't belong to this list. |
| 401 | unauthorized | A valid API key is required. |
| 403 | insufficient_scope | This API key doesn't have the scope this operation needs. |
| 403 | feature_not_enabled | The API isn't switched on for this workspace. |
| 403 | role_forbidden | The key's creator's role can't do this. |
| 422 | validation_failed | The request has invalid fields. |
| 429 | rate_limited | Too many requests. Slow down and try again. |
| 500 | server_error | Something went wrong on our side. |
| 503 | unavailable | The API isn't available right now. Try again shortly. |