Skip to main content
The activity endpoint returns page-visit history — every page browsed, when the visit started and ended. Scope it to a specific account or contact with account_id/contact_id, or omit both to get a single tenant-wide feed across every account and contact, newest first. Use it to understand engagement patterns, build timelines in your CRM, or trigger workflows based on high-intent page visits.
Polling many individual contacts for activity in a loop (N+1) is expensive and slow. If you’re doing that today, switch to the tenant-wide feed instead (omit account_id/contact_id). next_cursor walks backward through history — it is not a since-cursor — so to poll for new activity, call with no cursor on each poll and compare the returned created_at values against the newest one you’ve already processed (a client-side high-water mark), rather than passing next_cursor back in.

Endpoint

Required Scope

Your API key must have the activity:read scope (or the broader all:read scope) to call this endpoint.

Parameters

string
The ID of the account whose page visits you want to retrieve. Returns company-level page visits when provided without contact_id. Omit both account_id and contact_id to get the tenant-wide feed instead (see below).
string
The ID of the contact whose page visits you want to retrieve. Returns person-level page visits. If combined with account_id, contact-level activity is returned. Omit both account_id and contact_id to get the tenant-wide feed instead (see below).
integer
default:"50"
The number of activity records to return per page. Accepts values between 1 and 100.
string
A pagination cursor returned in a previous response as next_cursor. Pass this value to retrieve the next page of results.
string
Read a direct child tenant’s activity instead of your own (multi-tenant partners only). The X-Knock-Tenant header takes precedence if both are supplied. See Reading a Child Tenant’s Data.
string
Same as product_slug above, as a header instead of a query param. Naming a slug that isn’t a direct child of your key returns 404, never 403.

Tenant-Wide Feed

Omit both account_id and contact_id to receive a single feed merging every account’s and contact’s page visits for the tenant, ordered newest first. This is the recommended way to stay in sync with activity across your whole tenant instead of polling individual contacts. next_cursor walks backward through history on every branch of this endpoint, including the tenant-wide feed — each page you fetch with it is strictly older than the last, the same as paging back through a list. It is not a since-cursor. To poll this feed for new activity on an interval, call it with no cursor on each poll and compare the returned created_at values against the newest one you’ve already processed client-side, rather than feeding next_cursor back in. The tenant-wide feed automatically excludes activity for accounts and contacts that have been identified but not yet revealed (locked), or soft-deleted — the same visibility rules that apply when reading those records directly.

Example Requests

Response

Returns an ActivityListResponse object containing an array of page-visit events.

Response Fields

array
An array of page-visit event objects.
boolean
true if additional pages of results are available. Pass next_cursor in your next request to retrieve them.
string | null
A cursor string to retrieve the next page of results. null when there are no further pages.

Error Responses