---
title: "Broadcast status history"
method: GET
path: "/v1/sites/{site_id}/broadcasts/history"
tags: ["Broadcasts"]
---

# Broadcast status history

`GET /v1/sites/{site_id}/broadcasts/history`

## Request

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

Status changes of the site's broadcasts: launches, pauses, stops,
completions, oldest first; `order=newest` gives the latest first. Deleting a
started broadcast stops it with `reason=deleted`; a deleted draft gets a
`draft` entry with `reason=deleted`.
Each entry names the broadcast, the status entered, where the change came
from (`source`), why (`reason`, null when a person simply made the change)
and the person who did it (`author`). Call it to answer why a broadcast is
paused or stopped and who did it; `broadcast_id` keeps one broadcast.
Broadcasts deleted since keep their entries, with the name they had. The last
edit of a broadcast and its e-mails is `edited_at` and `edited_by` of
`get_broadcast`.

## Path parameters

- `site_id` integer, required

## Query parameters

- `broadcast_id` integer: Only this broadcast, id from `list_broadcasts`
- `cursor` string: `next_cursor` of the previous page, sent with the same `order`; omit for the first
- `limit` integer: Items per page
- `fields` string: Comma-separated fields to keep in each item, for example `id,name`; each item then carries only those fields and `id`. Omit for every field
- `order` 'oldest' | 'newest': Order of a list. oldest: the oldest item first; newest: the newest item first, for the latest items without paging through the history.

## Response `200`

Successful Response

- BroadcastHistoryPage: One page of a list; `next_cursor` is null on the last page.
  - `items` BroadcastHistoryEntry[], required
    - `id` integer, required
    - `occurred_at` string, date-time, required
    - `broadcast` BroadcastRef, required
      - `id` integer, required
      - `name` string, nullable: Name in the admin; kept for a broadcast deleted since
    - `status` 'draft' | 'scheduled' | 'testing' | 'running' | 'paused' | 'stopped' | 'completed', required: draft: not scheduled or started yet. scheduled: waits for `schedule.scheduled_at`. testing: an A/B broadcast sending its variants to a test group or choosing the winner. running: being prepared or sending. paused: sending paused; it can be resumed. stopped: stopped before the end; it will not resume; to send it to those who did not get it, the user picks Resend > Resend to non-recipients on it in the admin. completed: sending finished.
    - `source` 'ui' | 'api' | 'mcp' | 'system' | 'support', required: Who made a change. ui: the admin; api: an API key; mcp: an AI assistant; system: done automatically; support: GetSiteControl support.
    - `reason` 'ab_test' | 'completed' | 'scheduled' | 'no_recipients' | 'balance' | 'blocked_suspicious_activity' | 'blocked_poor_delivery' | 'sandbox' | 'not_on_plan' | 'failed' | 'paused_too_long' | 'stop_all' | 'deleted' | 'other': Why a status changed; null when a person simply made the change. While the site's sending is held, `diagnose_email_sending` names what holds it. ab_test: the A/B test finished or its winner was chosen. completed: every e-mail was sent. scheduled: started at the scheduled time. no_recipients: stopped because no contact matched the audience. balance: paused because the e-mail balance ran out. blocked_suspicious_activity: stopped because our automatic check for suspicious activity blocked the site's sending. blocked_poor_delivery: stopped because the site's sending was blocked: too many recipients bounced or complained. It stays blocked until the contact list is cleaned and support lifts the block. sandbox: stopped because sending is not enabled for the site yet or is paused pending a review. not_on_plan: paused because the site's plan no longer included broadcasts (a plan change, an ended trial or a suspended subscription). failed: stopped because it could not be prepared for sending. paused_too_long: stopped after being paused for over 30 days. stop_all: every broadcast of the site was paused or stopped at once. deleted: the broadcast was deleted, one entry per deletion: a preparing, running or paused broadcast is stopped by it (status stopped), any other keeps its status in the entry. other: another automatic change.
    - `author` Author: A user of the account, as the admin shows them.
      - `id` integer, nullable: null for Support or for a user who was deleted
      - `name` string, nullable: null when the user has no name
      - `email` string, nullable: The user's sign-in e-mail; null for Support
  - `next_cursor` string, nullable

## Other responses

- `400`: Unsupported GSC-Version
- `401`: Missing or invalid API key or access token
- `403`: Access denied
- `404`: Not found
- `422`: Validation failed
- `429`: Rate limited
- `503`: Temporarily unavailable; retry later

---

[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)
