List a contact's activity
Changed onRetrieve the contact's activity timeline — signups, email and SMS sends, opens and clicks, orders, checkouts, tag changes — newest first. This is the same record the Privy dashboard's contact page shows, so "why did this contact get X?" can be answered from the API alone: find the send, the signup that triggered it, and the display or campaign each traces to.
Each entry names its type (the event vocabulary below, as stored), when it happened, the display or campaign it belongs to (when the event carries one, even one since deleted), and the event's raw properties, whose shape varies by type (the recipient IP and user agent recorded on email opens and clicks, and the IP-derived location on signups, are not included).
By default the timeline covers the last 24 months; narrow it with occurred_after / occurred_before (both bounds exclusive; a bare date means midnight at the start of that day) or to one event type with type.
Required scope: contacts_read
Request
- Base URLhttps://api.privy.com/v1
- AuthHTTP bearer
Path parameters
The contact's unique identifier (returned as id in contact responses). Ids are opaque cus_-prefixed strings — a numeric id from a Privy dashboard URL is not a valid API id and will 404; list contacts, or look the contact up by ?email= or ?phone_number=, instead.
Query parameters
Only return events of this type. Any type value a row carries is accepted (including names a merchant's own integration sent through the events ingest), so a type read off the timeline always filters. Common values: customer-subscribed, email-sent, email-delivered, email-opened, email-clicked, text-message-sent, text-message-delivered, view, new-session, redemption, signup, sms-signup, order-created, checkout-started, customer-tag-added, customer-tag-removed.
Only events after this instant (exclusive). ISO 8601 datetime or date. Defaults to 24 months before occurred_before — 24 months ago when neither bound is given.
Only events before this instant (exclusive). ISO 8601 datetime or date. Defaults to now.
Page number (starts at 1).
Number of results per page. Values outside 10–100 are clamped to the nearest bound.
Headers
Target a subaccount instead of the main connected account. Pass a subaccount id from get_account's subaccounts list. Only direct subaccounts of the connected account are reachable — omit this for the main account itself.
Response
A paginated list of the contact's events, newest first.
Example response
{
"data": [
{
"type": "email-opened",
"occurred_at": "2026-08-20T14:22:00Z",
"campaign": {
"id": "gk2P8Zw1Lq",
"title": "Welcome Popup",
"type": "display"
}
}
],
"pagination": {
"page": 1,
"per_page": 25,
"total_count": 142,
"total_pages": 6
}
}Changes
- warning
added the new
forbiddenenum value to the/response property for the response status - warning
added the new
forbiddenenum value to the/response property for the response status - warning
added the new
forbiddenenum value to the/response property for the response status - warning
added the new
forbiddenenum value to the/response property for the response status - warning
added the new
forbiddenenum value to the/response property for the response status - warning
added the new
segment_builder_requiredenum value to the/response property for the response status - warning
added the new
segment_builder_requiredenum value to the/response property for the response status - warning
added the new
segment_builder_requiredenum value to the/response property for the response status - warning
added the new
segment_builder_requiredenum value to the/response property for the response status - warning
added the new
segment_builder_requiredenum value to the/response property for the response status
- warning
- info
endpoint added
- info