📨 Outbox

Metrics#

Email metrics#

GET /emails/metrics

Aggregates over email_events, so it reflects the same data the dashboard charts.

Parameters#

ParameterNotes
start_dateISO 8601. Defaults to 30 days ago
end_dateISO 8601. Defaults to now
granularityhourly, daily (default), weekly, monthly
timezoneIANA name for bucket boundaries. Default UTC
metricsComma-separated. See below
dimensionsComma-separated: period, domain, email
domain_idComma-separated filter
email_idComma-separated filter
sort_byA metric or dimension name
sort_orderasc or desc

Available metrics#

Counts: sent, delivered, opened, clicked, bounced, complained, delivery_delayed, failed, canceled, suppressed.

Rates, returned as percentages: delivery_rate, open_rate, click_rate, bounce_rate, complaint_rate.

RateComputed as
delivery_ratedelivered ÷ sent
open_rateopened ÷ delivered
click_rateclicked ÷ delivered
bounce_ratebounced ÷ sent
complaint_ratecomplained ÷ delivered

Open and click rates use delivered as the denominator, not sent — a message that never arrived cannot be opened, and dividing by sent understates engagement.

Example#

sh
curl "https://outbox.example.com/emails/metrics?start_date=2026-07-01&end_date=2026-07-08&granularity=daily&dimensions=period&metrics=sent,delivered,open_rate" \
  -H "Authorization: Bearer ob_xxxxxxxxx" -H "User-Agent: my-app/1.0"
json
{
  "object": "list",
  "data": [
    { "period": "2026-07-01T00:00:00.000Z", "sent": 1204, "delivered": 1180, "open_rate": 43.39 },
    { "period": "2026-07-02T00:00:00.000Z", "sent": 998, "delivered": 981, "open_rate": 41.08 }
  ],
  "start_date": "2026-07-01T00:00:00.000Z",
  "end_date": "2026-07-08T00:00:00.000Z",
  "granularity": "daily"
}

Without dimensions you get a single bucket covering the whole range — useful for a headline number.

Combine dimensions to slice:

?dimensions=period,domain&metrics=sent,bounce_rate

Counting#

Counts are distinct emails, not raw events. One recipient opening the same message five times counts once toward opened. Per-recipient counts live in broadcast recipients.

On open tracking#

Open rates are directionally useful and precisely wrong. Apple Mail Privacy Protection pre-fetches images, inflating opens; clients that block images suppress them entirely. Outbox drops obvious bot and proxy user-agents, which helps but does not fix it.

Trust clicks. Watch opens as a trend, not a number.

Segment metrics#

GET /segments/metrics
ParameterNotes
segment_idComma-separated filter
sort_by, sort_order
json
{
  "object": "list",
  "data": [
    {
      "segment_id": "78261eea-8f8b-4381-83c6-79fa7120f1cf",
      "name": "Registered Users",
      "all_contacts": 1284,
      "subscribed_contacts": 1201,
      "unsubscribed_contacts": 83
    }
  ]
}

Dashboard summary#

GET /dashboard/summary

Session-authenticated rather than key-authenticated — it backs the dashboard's own counters. Returns totals for emails, contacts, domains, broadcasts, templates, segments, suppressions, webhooks, automations, API keys, and pending jobs.

queued_jobs is the one to watch operationally. If it climbs and does not fall, no worker is running.