Skip to main content
The Activities API gives you a queryable, paginated log of every engagement event Topo records across your outreach sequences. Each activity carries a strongly-typed payload that describes exactly what happened — which contact it involved, which sequence it came from, what channel was used, and any event-specific metadata. The payload schema is the same discriminated union that Topo delivers to webhook subscribers, so you can build consistent pipelines whether you are polling or streaming. Activities are ideal for building custom reporting dashboards, syncing engagement history to a CRM, or auditing outreach behaviour without setting up a webhook endpoint.
All Activities endpoints require an API key with the activities:read scope.

Event types

The payload.type field is always one of the following values. Topo may add new event types as additive changes within /v1; your code should handle unknown values gracefully rather than treating them as errors.
Use the event_type filter to pull only the events you care about — for example, REPLIED and CREATED events to drive CRM updates without fetching the entire activity stream.

Embedded summaries

Beyond the ids naming the records an activity touched, each payload embeds compact copies of those records — so a single page of activities is usually enough to build a report or a CRM update without fanning out into per-contact lookups. Every payload carries contact and sequence_template, plus one event-specific embed: message on message events, meeting on meeting.created, task on task events, and hot_lead on hot_lead.created. All field names are snake_case.
These are the same embeds Topo delivers to webhook subscribers. See Embedded summaries on the Webhooks page for the field-by-field reference and the null-degradation rules.

Polling for new activities

The Activities API is well-suited to incremental polling patterns for CRM sync or custom reporting. A reliable approach:
  1. On first run, fetch activities with sort_order=ASC and store the created_at of the last item in your cursor.
  2. On subsequent runs, pass that cursor as created_at_after to retrieve only new events.
  3. Page through results using has_more until it is false.
If you need real-time delivery instead of polling, use Webhooks — Topo will push events to your endpoint within seconds of them occurring.
The pagination envelope shape — { items, total_count, total_pages, has_more } — is frozen by Topo’s API stability policy. New response fields may be added additively; your client should ignore unknown fields.