All three are available to workspace admins only.
Event format
The pull API and both streams send each event as the same JSON object:dateCreatedis in UTC.actionis the permission exercised or the event type, andsuccesssays whether the action was allowed.userEmailandprojectNameare the values at the time of the event.projectIdandprojectNamearenullfor workspace-level actions.metadatais a JSON object with extra context, ornull.idis stable. Use it to drop repeats.
Pull from the API
GET /v1/workspaces/{workspaceId}/audit-events returns the workspace’s audit events oldest first,
one page at a time. Call it with an admin’s API key.
To read the log incrementally, store
nextCursor from every response and send it back as cursor
on the next call. nextCursor is returned even when items is empty, and a cursor never returns the
same event twice. While hasMore is true, call again right away; once it is false, you are caught
up, so wait before polling again.
Keep in mind:
- Events from the last 10 seconds are held back, so an event that is committed a moment late still arrives in order. Expect a short lag behind real time.
startis in seconds, not milliseconds. A millisecond value lies in the future and returns400.- Polling is not audited. Reading the audit log does not add events to it.
- The rate limit is 120 requests a minute per user. Above it, the API returns
429. - Only admins can read it. Other members get
403.
Push to a SIEM
Instead of polling, you can have Openlayer push new events to a destination. Add a stream under Workspace settings → Security → Compliance & audit → Stream to SIEM, or from the Google SecOps and HTTPS endpoint cards in the Security category of the Integrations page.How delivery works
- Timing. Events usually reach the destination within about two minutes. They are sent in order, in batches of up to 500 events or 1 MB.
- Where a stream starts. A stream sends events from the moment you create it, unless you set
Send events from to an earlier time to backfill. To resend events, open Edit and set
Replay from; your destination receives those events again, so drop repeats by event
id. - Retries. When the destination fails or rejects a batch (any non-
2xxresponse), Openlayer retries it after 1, 2, 5, 15, and 30 minutes, then every hour. It never gives up and never skips an event, so a destination that comes back catches up from where it stopped. - Large events. An event bigger than 1 MB on its own is sent with its
metadatareplaced by{"truncated": true, "originalBytes": N}. The full event stays in the audit log. - Limit. A workspace can have up to 5 streams, across both destination types.
Send test event in a stream’s options menu sends one synthetic event, with the action
audit_log_stream_test, and reports whether the destination accepted it. The test event is not
recorded in the audit log. Deleting a stream stops delivery but leaves its events in the audit log.
Google SecOps
The stream sends events to a Google SecOps webhook feed. Before adding it, set up the following in Google SecOps and Google Cloud:- Create a Webhook feed in Google SecOps with the split delimiter set to
\n. Openlayer sends each batch as newline-delimited JSON, one event per line. - Copy the feed’s endpoint URL and generate its secret key.
- Create a Google Cloud API key restricted to the Chronicle API.
https:// endpoint on googleapis.com from the feed’s
details. Leave the key and secret out of the URL itself; a URL with key or secret query
parameters is rejected.
Google SecOps has no parser for Openlayer events, so they arrive as raw logs.
HTTPS endpoint
The stream sends events to a collector you run. You need an endpoint that:- uses an
https://URL with a hostname, on any port. IP addresses, usernames and passwords in the URL are rejected, and the hostname must resolve to public IP addresses only; - presents a valid TLS certificate for that hostname;
- answers with a
2xxstatus without redirecting. Openlayer does not follow redirects.
POST with a JSON body holding one batch of events:
webhook-id,
webhook-timestamp, and webhook-signature headers. Verify every request against the raw body
before you process it. With a Standard Webhooks library, the verified payload is the batch: