Deliverability time series

Search Documentation

Search across all developer documentation

reports

Deliverability time series

GET /v1/reports/deliverability
Auth required api.reports.view

Time-bucketed counts of sent, delivered, bounced, complained, and suppressed, with a per-bucket delivery_rate. Numbers match what you see in the SendOps dashboard. Buckets are aligned to UTC (day = midnight UTC; week = Monday 00:00 UTC; month = first of month 00:00 UTC). Empty periods are not zero-filled — buckets with no underlying events are omitted entirely.

delivered counts SES Delivery events: messages accepted by the receiving server (SMTP 250); not inbox placement. Providers filter after accepting — a message can be accepted and still be filed as spam or quarantined, and SES never sees that — so delivery_rate is an acceptance rate, not an inbox rate.

Formula: delivery_rate = delivered / sent, a ratio in [0, 1]. When sent is zero, delivery_rate is 0.0 (never null). suppressed counts SES Reject events — sends SES dropped against the account-level suppression list — not the size of your suppression table.

Default window is the trailing 30 days. A from older than your plan's retention returns 403 plan_retention_exceeded with a retention_days extension.

Query parameters

from string<date-time> optional

Window start (RFC 3339). Defaults to 30 days ago.

to string<date-time> optional

Window end (RFC 3339). Defaults to now.

group_by string enum optional

Time-bucket size for the report. UTC-aligned: day = midnight UTC; week = Monday 00:00 UTC (ISO week); month = first of month 00:00 UTC. Buckets with no underlying events are omitted, not zero-filled.

channel string optional

Filter by channel — its UUID, or the channel's name, which is the handle GET /v1/channels returns and GET /v1/channels/{name} is keyed on. A value that names no channel in the org returns 422 validation_failed rather than an empty page, so a typo reads as a typo instead of as a channel with no traffic.

identity string optional

Filter by sending identity. Accepts a full email address (the local-part is ignored — only the domain matches) or a bare domain.

Responses

Errors follow the RFC 7807 problem format — see the error reference.

200 Deliverability buckets, oldest-first application/json
data array<object> required

Each entry in data:

period string<date-time> required
sent integer<int64> required
delivered integer<int64> required

SES Delivery events in this bucket: messages accepted by the receiving server (SMTP 250); not inbox placement.

bounced integer<int64> required
complained integer<int64> required
suppressed integer<int64> required
delivery_rate number<double> required

delivered / sent: the share of sends accepted by the receiving server (SMTP 250); not inbox placement.

401 Missing, malformed, or unknown API key application/problem+json
403 Key lacks the required scope or plan limit violated application/problem+json
422 A query parameter, path value or body field failed validation. The body is a validation_failed Problem. When the refusal is about a reference — a segment key, template slug, topic or attribute name the organization does not have — it additionally carries validation_code, field, line/column, missing, candidates and next_step, so a client can correct the call without a second round of guessing. See ValidationProblem. application/problem+json
429 Per-org rate limit exceeded application/problem+json
500 Unexpected server-side failure. The code is internal_error. The request_id field can be quoted to SendOps support to investigate. application/problem+json