Skip to content

Campaign Steps

One campaign's results per sequence step and variant.

GET/api/v1/analytics/campaigns/{campaign_id}/steps

Requires an API key with the read scope.

Counts follow the Reports page: a bounced email counts as sent, replies are distinct leads, and replies from bounce, warmup and unrelated mail are left out. Days are bucketed in the timezone of the user who created the API key.

These are the Reports numbers narrowed to one campaign. The campaign totals endpoint counts differently (from the campaign's lifetime counters), so the two can disagree.

Path Parameters#

campaign_idstringpathrequired
The campaign id.

Query Parameters#

startstringquery
First day, YYYY-MM-DD. Defaults to 30 days before end.
endstringquery
Last day, YYYY-MM-DD. Defaults to today in the key owner's timezone. A range is at most 365 days.

Response#

dataobject
Show data
rangeobject
start, end and the timezone used to bucket days.
stepsarray
One row per step and variant with step, stepName, variant and the counters.

Errors#

StatusDescription
401Missing, invalid, revoked or expired API key
403API key does not have the required scope: read
400start is after end, or the range is longer than 365 days
404Campaign not found: the campaign does not exist in this workspace

Rate Limit#

  • 300 requests per minute, shared by every read call in your workspace. Fixed 60-second window.
  • Every response includes X-RateLimit-Limit, X-RateLimit-Remaining, X-RateLimit-Reset (unix epoch seconds) and X-RateLimit-Bucket (read).
  • A 429 response includes a Retry-After header (seconds until the bucket resets).

For client-side patterns, see Rate Limiting.

Was this page helpful?
View as MarkdownLast updated November 4, 2026