Skip to main content
Every fill page (direct link, embed, or popup) sends batched analytics events to a single endpoint. This is what powers Reading Insights — you generally never call it directly, but it’s useful to understand if you’re debugging traffic numbers or building a custom fill client.

Try it in the API playground

This endpoint is also published as OpenAPI — open the interactive playground to send a real request against your app.

Request

endpoint
Route throttle 60 requests/minute per client, plus a per-form × IP event budget (default 120 events/minute). web middleware, no auth required (public fill pages are anonymous). Only active forms accept events.
string
required
A UUID identifying the visitor’s fill session.
integer
Numeric form ID. Either this or form_slug is required.
string
The form’s public slug, if form_id isn’t known client-side.
array
required
1–20 event objects per batch.

Event object

string
required
One of: visit_start, page_view, page_leave, field_interact, started_answering, submit, heartbeat.
string
Which page/block the event refers to.
string
ISO timestamp within now − 5 minutes … now + 2 minutes. Outside that window the batch is rejected (422). Omitted timestamps use server time.
integer
0 to 86,400,000 (24h ceiling).
string
Parsed client hints, sent as plain strings.
string
ISO-2 country code and city, when geo IP resolution is enabled.
string
Standard UTM parameters captured from the visit.
string
A hashed key used to de-duplicate a respondent across events without exposing PII.

Response

boolean
true when the batch was accepted and queued for processing.
integer
Number of events accepted from the batch.
Events are queued for asynchronous processing (RecordAnalyticsEventsJob) — a 200 response means the batch was accepted, not that Insights has been recomputed yet. Bot/crawler traffic is flagged and excluded from Insights KPIs during processing, not at ingestion time.
This endpoint intentionally accepts unauthenticated requests from any public fill page. Don’t rely on it as a general-purpose event pipe for your own app — it only accepts the fixed event vocabulary above, scoped to an active form.
Last modified on September 7, 2026