---
title: "Broadcast statistics"
method: GET
path: "/v1/sites/{site_id}/broadcasts/{broadcast_id}/stats"
tags: ["Broadcasts"]
---

# Broadcast statistics

`GET /v1/sites/{site_id}/broadcasts/{broadcast_id}/stats`

## Request

- Base URL: `https://api.getsitecontrol.com`
- URL: `https://api.getsitecontrol.com/v1/sites/{site_id}/broadcasts/{broadcast_id}/stats`
- Auth: HTTP bearer

E-mail numbers of one broadcast over its whole life, its A/B variants
included, plus how many e-mails are still queued and the numbers of each A/B
variant. For a period use `get_broadcasts_stats_by_broadcast` with this id.
While the broadcast is being prepared, sent or paused, `progress` gives the
e-mails sent and left, the current step and the estimated finish time.

Every number counts e-mails, one e-mail being one message to one recipient,
and each e-mail at most once per metric: `send` e-mails sent, including those
rejected on sending; `bounce` e-mails that bounced or were rejected on
sending; `deliver` is `send` minus `bounce`, never below zero; `open` e-mails
opened; `click` e-mails with at least one link clicked; `unsubscribe` e-mails
whose recipient unsubscribed through them; `complaint` e-mails reported as
spam through the recipient's mail provider. `rates` next to each `total`
gives the delivery, open, click, click-to-open, unsubscribe, complaint and
bounce rates, rounded to 4 places; a rate is null when its denominator is 0,
as it is undefined, not zero.

## Path parameters

- `site_id` integer, required
- `broadcast_id` integer, required: Broadcast id from `list_broadcasts`

## Response `200`

Successful Response

- BroadcastLifetimeStats
  - `total` EmailMetrics, required: E-mail counts; every key is always present. `open`, `click` and the rest count each e-mail once. `send` includes e-mails rejected on sending, which are also counted in `bounce`. `complaint` is spam complaints reported by mail providers. For a period, each number counts the events dated in it, so the numbers are independent: a bounce may fall in a later period than its sending. `deliver` is `send` minus `bounce`, never below zero.
    - `send` integer, required
    - `deliver` integer, required
    - `bounce` integer, required
    - `open` integer, required
    - `click` integer, required
    - `unsubscribe` integer, required
    - `complaint` integer, required
  - `rates` EmailRates, required: Rates from `total`, each a fraction rounded to 4 places: 0.0125 is 1.25%. For a period, each counter counts the events dated in it, so an open or a bounce of an e-mail sent before the period counts while its sending does not, and a rate can exceed 1.
    - `deliver` number, nullable: Delivery rate: `deliver` / `send`; null when `send` is 0: the rate is undefined, not zero
    - `open` number, nullable: Open rate: `open` / `deliver`; null when `deliver` is 0: the rate is undefined, not zero
    - `click` number, nullable: Click rate: `click` / `deliver`; null when `deliver` is 0: the rate is undefined, not zero
    - `click_to_open` number, nullable: Click-to-open rate: `click` / `open`; null when `open` is 0: the rate is undefined, not zero. A click is counted without an open when the recipient's mail app does not load images, so it can exceed 1
    - `unsubscribe` number, nullable: Unsubscribe rate: `unsubscribe` / `deliver`; null when `deliver` is 0: the rate is undefined, not zero
    - `complaint` number, nullable: Spam complaint rate: `complaint` / `deliver`; null when `deliver` is 0: the rate is undefined, not zero
    - `bounce` number, nullable: Bounce rate: `bounce` / `send`; null when `send` is 0: the rate is undefined, not zero
  - `queued` integer, nullable: E-mails waiting to be sent, as `progress.queued`. null for a draft or a scheduled broadcast and when the count is not available; 0 once stopped or completed
  - `variants` BroadcastVariant[], required: A/B variants in their order, empty without A/B. The winner also counts the e-mails of the main phase. A deleted e-mail shows zeros.
    - `email_id` integer, required: The variant's e-mail, as in `ab_test.variant_email_ids`
    - `subject` string, nullable: Subject of the variant's e-mail; null when the e-mail was deleted
    - `preview_text` string, nullable: Preview text of the variant's e-mail, shown after the subject in inboxes; null when it has none or the e-mail was deleted
    - `sender` string, nullable: From address of the variant's e-mail; null when the e-mail was deleted
    - `total` EmailMetrics, required: E-mail counts; every key is always present. `open`, `click` and the rest count each e-mail once. `send` includes e-mails rejected on sending, which are also counted in `bounce`. `complaint` is spam complaints reported by mail providers. For a period, each number counts the events dated in it, so the numbers are independent: a bounce may fall in a later period than its sending. `deliver` is `send` minus `bounce`, never below zero.
      - `send` integer, required
      - `deliver` integer, required
      - `bounce` integer, required
      - `open` integer, required
      - `click` integer, required
      - `unsubscribe` integer, required
      - `complaint` integer, required
    - `rates` EmailRates, required: Rates from `total`, each a fraction rounded to 4 places: 0.0125 is 1.25%. For a period, each counter counts the events dated in it, so an open or a bounce of an e-mail sent before the period counts while its sending does not, and a rate can exceed 1.
      - `deliver` number, nullable: Delivery rate: `deliver` / `send`; null when `send` is 0: the rate is undefined, not zero
      - `open` number, nullable: Open rate: `open` / `deliver`; null when `deliver` is 0: the rate is undefined, not zero
      - `click` number, nullable: Click rate: `click` / `deliver`; null when `deliver` is 0: the rate is undefined, not zero
      - `click_to_open` number, nullable: Click-to-open rate: `click` / `open`; null when `open` is 0: the rate is undefined, not zero. A click is counted without an open when the recipient's mail app does not load images, so it can exceed 1
      - `unsubscribe` number, nullable: Unsubscribe rate: `unsubscribe` / `deliver`; null when `deliver` is 0: the rate is undefined, not zero
      - `complaint` number, nullable: Spam complaint rate: `complaint` / `deliver`; null when `deliver` is 0: the rate is undefined, not zero
      - `bounce` number, nullable: Bounce rate: `bounce` / `send`; null when `send` is 0: the rate is undefined, not zero
  - `progress` BroadcastProgress
    - `sent` integer, required: E-mails sent so far, as `total.send`
    - `queued` integer, nullable: E-mails left to send, the same as `queued` of the response; while the audience is being selected, the contacts matching it. null when the count is not available
    - `total` integer, nullable: `sent` plus `queued`; null together with `queued`
    - `finishes_at` string, date-time, nullable: Estimated time (UTC) the last e-mail is sent; for an A/B test it includes the test duration and the sending to the rest of the audience. null while the audience is being selected, while paused and together with `queued`
    - `step` 'audience_segmentation' | 'ab_test_sending' | 'ab_test_waiting' | 'sending', required: audience_segmentation: the recipients are being selected and queued. ab_test_sending: an A/B broadcast is sending its variants to the test group. ab_test_waiting: the test e-mails are sent and the winner is being chosen. sending: the e-mails are being sent to the recipients.
    - `step_status` 'running' | 'paused' | 'paused_balance', required: running: the step goes on. paused: paused by a person or via the API. paused_balance: paused because the e-mail balance ran out.

## Other responses

- `400`: Unsupported GSC-Version
- `401`: Missing or invalid API key or access token
- `403`: Access denied
- `404`: `site_not_found`: no such site in your account; `broadcast_not_found`: the site has no broadcast with this id, or it was deleted
- `422`: Validation failed
- `429`: `rate_limited`: a limit of the key or the account is spent; statistics also spend the heavy request limit of the key. Retry after `Retry-After` seconds
- `503`: `temporarily_unavailable`: the numbers took too long to count or the limits cannot be checked right now; retry later or shorten the period

---

[API](https://skmtc.dev/getsitecontrol/apis/getsitecontrol-public-api.md) - [All operations](https://skmtc.dev/getsitecontrol/apis/getsitecontrol-public-api/llms.txt) - [OpenAPI document](https://skmtc.dev/getsitecontrol/apis/getsitecontrol-public-api/revisions/084fcad80e75?raw)
