Audit feed
The audit feed is programmatic access to your organization’s audit log: every security-relevant action, with who did it, what it touched, when and from where. Security teams use it to stream events into a SIEM, alert on sensitive changes (a new administrator, a revoked key, an IP block), and answer auditors without manual CSV exports.
Today the audit log is read and exported (CSV, up to 10,000 rows) in the Console under Settings → Audit Logs. The feed below reads the same entries.
Endpoint
GET /v1/organizations/audit_events
Authenticate with an admin key and send syntic-beta: admin-2026-11-01. The key’s creator must be allowed to read the audit log in the Console (Owner, Administrator, or a custom role with Analytics access).
Query parameters
| Parameter | Description |
|---|---|
starting_at, ending_at | Time window, RFC 3339. Default: the last 24 hours. |
actions[] | Exact action names, such as api_key.revoked. Repeat for several. A trailing .* matches a prefix: member.*. |
actor_id | Events done by one member, admin key or service account. |
resource_type, resource_id | Events about one kind of resource, or one resource. |
limit | 1 to 1,000. Default 100. |
after_id | Cursor: events after this event id. |
order | asc (default, oldest first: best for streaming) or desc. |
Response
{
"data": [
{
"id": "evt_01JCE4G6J8L0N2Q4S6U8",
"type": "audit_event",
"action": "api_key.revoked",
"occurred_at": "2026-11-05T09:58:12Z",
"actor": { "kind": "user", "id": "user_01J9Y0A2C4E6G8J0L2N4", "email": "dana@example.com" },
"resource": { "type": "api_key", "id": "apikey_01JB7C9E1G3J5L7N9Q1S", "name": "billing-worker-prod" },
"workspace_id": "wrkspc_01JC0A2C4E6G8J0L2N4Q",
"ip_address": "198.51.100.23",
"user_agent": "Mozilla/5.0 ...",
"request_id": "req_4a0e8c1d2b3f4a5e6c7d8e9f",
"details": { "prefix": "sk_live_3f9c" }
}
],
"has_more": true,
"first_id": "evt_01JCE4G6J8L0N2Q4S6U8",
"last_id": "evt_01JCE4K2M4P6R8T0V2X4"
}| Field | Meaning |
|---|---|
action | A dotted name. The full list is on Audit logs, plus the API actions below. |
actor.kind | user, admin_key, api_key, service_account, directory_sync or system. |
resource | What was affected. name is what the resource was called when the event happened. |
details | Action-specific context. Never contains secrets or prompt content. |
Actions added with the API platform
| Area | Actions |
|---|---|
| Admin API | admin_api.request, admin_key.created, admin_key.updated, admin_key.revoked |
| Workspaces | workspace.created, workspace.updated, workspace.archived, workspace.unarchived, workspace.member_added, workspace.member_removed |
| Members | member.invited, member.invite_resent, member.invite_canceled, member.suspended, member.restored, member.removed |
| API keys | api_key.updated, api_key.ip_denied |
| Billing | billing.spend_limit_changed, billing.credits_toggled |
| Agents | agent.created, agent.updated, agent.archived, agent.deleted, vault.secret_written, vault.secret_deleted, vault.secret_used |
| Security | service_account.token_issued, inference.policy_denied, encryption_key.changed, organization.updated |
Streaming to a SIEM
Poll with order=asc and after_id set to the last event you stored. Events are written within seconds and never change once written, so the cursor never misses or repeats an event.
# New administrators and revoked keys in the last 7 days
curl -sS -G https://app.syntic.ai/v1/organizations/audit_events \
-H "Authorization: Bearer $SYNTIC_ADMIN_KEY" \
-H "syntic-beta: admin-2026-11-01" \
--data-urlencode "starting_at=$(date -u -d '7 days ago' +%Y-%m-%dT%H:%M:%SZ)" \
--data-urlencode "actions[]=member.change_role" \
--data-urlencode "actions[]=api_key.revoked"Retention
Audit events are kept for 1 year by default; Enterprise organizations can extend this to 7 years. Events older than the window are not returned. Stream them to your own storage if you need a longer record.
Errors
Errors use the error envelope.
| Status | type | code | When |
|---|---|---|---|
| 400 | invalid_request_error | invalid_time_range | Window reversed or older than retention. |
| 400 | invalid_request_error | invalid_action_filter | Malformed action pattern. |
| 403 | permission_error | role_required | The key’s creator may not read the audit log. |
| 429 | rate_limit_error | rate_limited | Polling faster than 60 times a minute. |
Build notes for the platform team
- Read from the existing audit table; add
workspace_id,request_id,user_agentandactor.kindcolumns, and an index on organization and event id for cursor reads. - Event ids must sort by time so
after_idis a stable cursor. - Audit rows are append-only; no API or Console action edits or deletes them.