Skip to main content
Three endpoints cover reporting: one campaign’s totals, one campaign over time, and a workspace-wide roll-up. They all draw from the same source as your dashboard, so the numbers you get here match the ones you see there.

Scopes

Campaign analytics

opens and clicks come in two cardinalities:
  • total – counted per email, bots excluded. The same email opened five times counts once; opening two different steps counts twice.
  • uniqueLeads – distinct leads who did it at least once.
Rates are computed from uniqueLeads, which is why a single enthusiastic reader cannot push your open rate above 100%. replies is a flat number – distinct leads who replied. There is no raw reply-event count, so it is deliberately not dressed up as two cardinalities.
A rate of null means “no denominator”, not “zero percent”. A campaign that has not sent anything yet returns "open": null – not 0. If we returned 0, a chart would show your open rate collapsing to zero on days you simply weren’t sending. Check for null before plotting.

Out-of-office replies

replies counts distinct leads who replied. Pass excludeOOO=true to exclude out-of-office auto-replies and count only replies from humans:
This is not a cosmetic switch. Out-of-office replies can inflate reply rate noticeably, and they inflate it unevenly across campaigns – a campaign that happened to run over a holiday looks better than it was. Pick one setting and use it consistently when you compare campaigns.

Breakdowns

Ask for extra detail with breakdown. Repeat the parameter or pass a comma-separated list. Each breakdown is a separate query, so request only what you will actually read.

Bounce breakdown

Most outreach APIs give you a single bounced number. That number cannot tell you what to do. This one can:
recipientBounces are their problem – the address is dead, so clean your list. senderBounces are yours – reputation, authentication, or content got you refused. Scrubbing your list will not fix those, and treating them as one number is how a deliverability problem hides behind a “normal” bounce rate.

Over time

Each point carries sent, delivered, opens, clicks, replies, bounces and unsubscribed – so bounce rate and unsubscribe rate over time are chartable directly, without a second call. interval accepts day, week or month. Long windows are automatically coarsened to keep the series readable; the response echoes the interval it actually used, which may be coarser than the one you asked for. Read it back rather than assuming.

Workspace roll-up

Totals across every campaign, plus activeCampaigns, sendingAccounts, and the highest-volume campaigns. Use it for a top-level view, then drill into a campaign.

Reporting windows and retention

startDate and endDate are ISO-8601. Passing only startDate means “from then until now”. Your plan retains a fixed window of history. If you ask for a start date older than that, the window is moved forward and the response tells you:
When clamped is true, the data is real but the window is shorter than you asked for. Do not label such a result “all time” – check clamped before you do.

What this API does not report

These are deliberately absent rather than silently zero:
  • Spam-complaint rate. We do not ingest feedback loops, so we cannot count complaints. Returning 0 would read as “no complaints” instead of “not measured”.
  • Hourly granularity. The smallest bucket is a day.
  • Per-link click-through. Clicks are counted, but not attributed to individual links.