params bag — but you authenticate with a bearer API key and the server stamps channel = "server" on every row.
Endpoint
Request
Body
Onlyevent_name is required. Everything else is optional — pass what you have.
| Field | Type | Notes |
|---|---|---|
event_name | string | Required. Standard (see taxonomy) or custom. |
tag_id | string | Your tag ID. If omitted, the server derives one from page_url host. |
event_id | string | For deduplication / idempotency. |
timestamp | number | Unix seconds. Defaults to server receive time. |
page_url, referrer, user_agent | string | Browser context, when known. |
session_id, client_id | string | Your stable user identifiers. |
click_id, impression_id, bid_id | string | Attribution IDs captured from the original ad click. |
attribution_type | string | click / view / organic. |
consent | object | GDPR/CCPA consent flags. |
params | object | Free-form properties. Stored as JSON; queryable in reporting. |
Response
204 means the event was accepted for storage. There’s no per-event validation feedback beyond the basic shape check.
What the server adds
The server enriches every row before insert:ip_address— from the requestgeo_country,geo_region,geo_city,geo_lat,geo_lon— from IP lookupua_browser,ua_os,ua_device, … — parsed from youruser_agentchannel = "server"— overrides whatever you passed
Idempotency
Pass a stableevent_id to dedupe retries — used as the dedup key in reporting joins.