Docs·Events

GET/api/v1/event/analytics/web-analytics/events/feed

Get the event feed

Every event as it happened, newest first, one row each: page views, your own events, payments, scroll and link-click events, and session ends. It is the table on the Events page and the Timeline of a profile. /events gives the totals per name instead.

Each row names its session and visitor, and carries the page, the visit's source and channel, the session's country and device, and the event's own properties.

startDate and endDate are required unless you set profileId; with profileId you can leave them out to get that profile's whole history.

Keys: an account key. Getting started explains both kinds.

Parameters

PropInTypeNotes
contactListIdquerystringThe id of the audience (the tracked site) to read, a UUID: anything else returns a 400. You must be a member of the workspace the audience belongs to, or the call returns a 401. An id that matches no audience is not an error: the call returns no data.
pagequerynumberPage number, starting at 0.
pageSizequerynumberRows per page.
startDate?querystringStart of the date range, read as UTC: a date such as 2026-09-01 (from midnight), or an exact time such as 2026-09-01T09:30:00Z. Use one of these two forms. Required unless profileId is set.
endDate?querystringEnd of the date range, read as UTC. A date such as 2026-09-30 includes that whole day; an exact time such as 2026-09-30T18:00:00Z ends the range right before that moment. If the workspace has gone past its plan's event allowance this billing period, the range is cut short at the moment the allowance ran out. Required unless profileId is set.
search?querystringKeep only events whose name or page path contains this text, ignoring case.
filter?querystringNarrows the results: a URL-encoded JSON array of conditions, each [key, values, operator], where a missing operator means is. Example: [["country",["US","GB"]],["page",["/pricing"],"startsWith"]] keeps visits from the US or the UK that viewed a page starting with /pricing. Every condition must match, and each key can appear once (a second condition on the same key replaces the first). A condition matches any of its values, except that isNot, notContains and notRegex rule out all of them. Operators: is and isNot (exact), contains, notContains, startsWith and endsWith (ignoring case), regex and notRegex (RE2 syntax, so no lookarounds; a pattern that does not compile returns a 400), and isNull and isNotNull (the value is not set, or is set; send [] as the values). Keys: channel, referrer_source, referrer, utm_source, utm_medium, utm_campaign, utm_term, utm_content, country (a two-letter code), region, city, browser, browser_version, os, os_version, screen_size (Desktop, Mobile or Tablet), hostname, entry_page, exit_page, page and event_name (visits that viewed such a page or sent such an event), identified (["true"] or ["false"]), goal_id (people who completed the goal in the range) and cohort_id (members of a segment). The last two take ids and only is or isNot. Unknown keys, and a filter that is not valid JSON, are ignored rather than refused.
profileId?querystringLimit the feed to one profile: a person id (every device the person used, plus events recorded against the person directly, such as payments sent from a server) or a visitor id (that one browser).

Response

PropTypeNotes
contentEventFeedRow[]One row per event, newest first.
sizenumberThe pageSize you asked for.
pagenumberThe page you asked for, counted from 0.
totalItemsnumberRows across all pages.
totalPagesnumbertotalItems divided by size, rounded up.

Each item in content

PropTypeNotes
idstringThe event id.
createdAtstringWhen it happened, in UTC to the second, such as 2026-09-30T14:03:12Z.
sessionIdstringThe session it belongs to, '' for an event sent from a server with no session.
visitorIdstringThe visitor (browser) it came from, '' when there is none.
contactIdstringThe person id when the visitor is identified, '' when anonymous.
visitorDisplaystringThe person's email when identified, else the visitor id.
eventNamestringThe event's name. Page views read page_view; an event stored without a name reads its type, such as session_end.
eventTypeKeystringThe event's type, such as page_view, custom_event (your own events and payments), scroll, link_click or session_end.
pathstringPath of the page it happened on, '' when unknown.
hostnamestringHostname of that page.
titlestringPage title, on page views.
referrerSourcestringSource of the visit it belongs to, such as Google, '' when none.
channelstringChannel of the visit it belongs to, such as Organic Search.
countrystringTwo-letter country code of the event's session, '' when unknown or when the event has no session.
browserstringBrowser of the event's session, '' when it has none.
osstringOperating system of the event's session, '' when it has none.
devicestringDesktop, Mobile or Tablet, from the event's session, '' when it has none.
revenuenumberAmount in the reporting currency, 0 when the event carries none. Refunds are negative.
scrollDepthnumberOn scroll events, how far down the page the visitor got, as a percentage from 0 to 100. Null on other events.
timeOnPagenumberAlways 0 for tracked events: the time spent on a page is stored with the page view that follows it, not on this row. For time on page, use avgTimeOnPage from /pages.
propertiesobject[]The event's own properties as { key, value } pairs, in the order they were sent, with values as strings. Nested objects arrive flattened to dotted keys such as plan.name.

Request

curl 'https://app.spreelytics.com/api/v1/event/analytics/web-analytics/events/feed?contactListId=…&page=…&pageSize=…' \
  -H 'Authorization: Bearer YOUR_API_KEY'
const url = new URL('https://app.spreelytics.com/api/v1/event/analytics/web-analytics/events/feed');
url.searchParams.set('contactListId', '…');
url.searchParams.set('page', '…');
url.searchParams.set('pageSize', '…');

const res = await fetch(url, {
  headers: { Authorization: 'Bearer YOUR_API_KEY' },
});
const data = await res.json();
import requests

res = requests.get(
    "https://app.spreelytics.com/api/v1/event/analytics/web-analytics/events/feed",
    headers={"Authorization": "Bearer YOUR_API_KEY"},
    params={"contactListId": "…", "page": "…", "pageSize": "…"},
)
data = res.json()

Response

{
  "content": [
    {
      "id": "string",
      "createdAt": "string",
      "sessionId": "string",
      "visitorId": "string",
      "contactId": "string",
      "visitorDisplay": "string",
      "eventName": "string",
      "eventTypeKey": "string",
      "path": "string",
      "hostname": "string",
      "title": "string",
      "referrerSource": "string",
      "channel": "string",
      "country": "string",
      "browser": "string",
      "os": "string",
      "device": "string",
      "revenue": 0,
      "scrollDepth": 0,
      "timeOnPage": 0,
      "properties": [
        {
          "value": null,
          "key": null
        }
      ]
    }
  ],
  "size": 0,
  "page": 0,
  "totalItems": 0,
  "totalPages": 0
}

See your own numbers today.

Free up to 100k events a month · no credit card

Contact

Tell us what you need.

A real person reads these. We usually reply within one working day.

Or email us directly at contact@spreelytics.com.