---
title: "Contact activity"
method: GET
path: "/v1/sites/{site_id}/contacts/{contact_id}/activity"
tags: ["Contacts"]
---

# Contact activity

`GET /v1/sites/{site_id}/contacts/{contact_id}/activity`

## Request

- Base URL: `https://api.getsitecontrol.com`
- URL: `https://api.getsitecontrol.com/v1/sites/{site_id}/contacts/{contact_id}/activity`
- Auth: HTTP bearer

Events of one contact, oldest first (`order=newest` for the latest
first): widget events, e-mails received,
bounced and unsubscribed, clicks, automation runs, the e-mail confirmation
and the creation of the contact. Call it to see what a contact did and
received. E-mail opens are not listed.

For e-mail events `source_id` is the broadcast or the automation that sent
the message and `source_name` is its subject. The URL of a click is given
without its query string. `response_id` is the form submission for
`get_response`.

A page holds up to `limit` events; while `next_cursor` is set, pass it as
`cursor` for the next page. `occurred_since` includes events at that moment. Merge
repeated reads by `id`: `occurred_at` is given to the second, so it does not
order events within one second; the cursor keeps the exact order.

## Path parameters

- `site_id` integer, required
- `contact_id` integer, required: Contact id from `list_contacts`

## Query parameters

- `cursor` string: `next_cursor` of the previous page, sent with the same `order`; omit for the first
- `limit` integer: Events per page
- `order` 'oldest' | 'newest': Order of a list. oldest: the oldest item first; newest: the newest item first, for the latest items without paging through the history.
- `occurred_since` string, date-time: Only events at or after this moment; without an offset, taken as UTC; a plain date means its start
- `type` string[]: Only events of these types; repeat for several. `contactCreate` and `emailConfirmed` are the contact's own, `widget*` widget events, `email*` e-mails and their clicks, `automationStart` and `automationEnd` the start and the end of automation runs

## Response `200`

Successful Response

- ContactActivityPage: One page of a list; `next_cursor` is null on the last page.
  - `items` ContactActivity[], required
    - `id` string, required: Stable across pages: the same event keeps its id
    - `type` string, required: One of: `contactCreate`, `emailConfirmed`, `widgetAddToCart`, `widgetApplyCoupon`, `widgetCopyToClipboard`, `widgetOpenUrl`, `widgetShow`, `widgetShowWidget`, `widgetSubmit`, `emailReceive`, `emailBounce`, `emailUnsubscribe`, `emailClick`, `emailViewProduct`, `emailContinueCheckout`, `emailViewOrder`, `emailBuyNow`, `emailAddToCart`, `emailApplyDiscount`, `automationStart`, `automationEnd`
    - `occurred_at` string, date-time, required: When it happened, UTC
    - `source_type` 'contact' | 'widget' | 'broadcast' | 'automation', required: What the event came from: `contact` the contact itself (its creation, the e-mail confirmation), `widget` a widget, `broadcast` a broadcast, `automation` an automation
    - `source_id` integer, nullable: The widget, the broadcast or the automation; for e-mails the broadcast or the automation that sent it
    - `source_name` string, nullable: The widget or automation name; for e-mails the subject of the message
    - `label` string, nullable: The button or link of a click, without the query string of its URL; the link, coupon or copied text of a widget event
    - `response_id` integer, nullable: The form submission for `get_response`, when it is listed there
    - `trigger_type` 'widget_submit' | 'manual' | 'email_click' | 'webhook' | 'segment_join' | 'shopify_order_paid' | 'shopify_order_fulfilled' | 'shopify_checkout_abandoned' | 'shopify_customer_winback' | 'shopify_customer_subscribed' | 'other': What starts the automation; `shopify_*` come from the connected Shopify store. New values may be added; strict clients must accept unknown values. `widget_submit`: a visitor submits a form of a chosen widget. `manual`: another automation, a contact import, the dashboard or `run_automation`. `email_click`: a contact clicks a link in an e-mail. `webhook`: a request to the automation's own webhook URL, or `run_automation`. `segment_join`: a contact joins a chosen segment. `shopify_order_paid`: an order is paid. `shopify_order_fulfilled`: an order is fulfilled. `shopify_checkout_abandoned`: a checkout is abandoned. `shopify_customer_winback`: a customer has not ordered for a chosen number of days. `shopify_customer_subscribed`: a customer subscribes to e-mail marketing. `other`: a trigger the dashboard does not offer.
  - `next_cursor` string, nullable

## Other responses

- `400`: Unsupported GSC-Version
- `401`: Missing or invalid API key or access token
- `403`: Access denied
- `404`: `contact_not_found`: no contact with this id on the site, or it is deleted
- `422`: `invalid_cursor`: `cursor` was not issued here or was issued for another `order`. `validation_failed`: a parameter is invalid
- `429`: `rate_limited`: a request limit is spent; this request also spends the heavy request limit
- `503`: `temporarily_unavailable`: the request took too long, or limits or idempotency keys cannot be enforced; narrow the filters or retry later

---

[API](https://skmtc.dev/getsitecontrol/apis/getsitecontrol-public-api.md) - [All operations](https://skmtc.dev/getsitecontrol/apis/getsitecontrol-public-api/llms.txt) - [OpenAPI document](https://skmtc.dev/getsitecontrol/apis/getsitecontrol-public-api/revisions/084fcad80e75?raw)
