Send events
From the browser
Anonymous storefront events with no token, sent one by one or in batches.
Use browser events for things that happen before anyone logs in: page views, product views, cart adds. The endpoint needs no token, so storefront code can call it directly.
Send a browser event#
The body is one event.
await fetch("https://<collector-host>/v1/events", {
method: "POST",
headers: {
"content-type": "application/json",
"x-tenant-id": "breeze",
"x-workspace-id": "my-store"
},
body: JSON.stringify({
envelop_version: "1.0",
id: crypto.randomUUID(),
name: "addtocart",
tenant_id: "breeze",
workspace_id: "my-store",
anon_id: "cookie:" + visitorId,
occured_at: new Date().toISOString(),
properties: { product_id: "SKU-1042", price: 1399, identifiers: { cookie: visitorId } }
})
});Cross-origin calls need CORS enabled on the collector for your domain. The BreezeIQ team sets that up.
Untrusted by design#
Anyone could claim an email or phone from a browser, so BreezeIQ limits what browser events can do:
- Only
cookieanddevice_idare kept. Email and phone are dropped. - Browser events never merge two existing profiles.
When the same cookie later appears in a server-side event together with an email (login, order), the visitor's history joins that customer's profile.
Batches#
To send several events as one JSON document instead of one per line, use the batch endpoint. It takes the same events, without a token.
Send a batch#
The body is an object whose events array holds the events.
{
"events": [
{
"envelop_version": "1.0",
"id": "1f7c…",
"name": "addtocart",
"tenant_id": "breeze",
"workspace_id": "my-store",
"anon_id": "cookie:3f9a1c7e",
"occured_at": "2026-10-08T10:11:02Z",
"properties": {
"product_id": "SKU-1042",
"identifiers": { "cookie": "3f9a1c7e" }
}
}
]
}Batch events count as browser events: device-level identifiers only.