Broadcasts REST API
Endpoints for monitoring and managing email broadcasts. Broadcasts are bulk email sends to a show’s subscriber list (or a filtered subset). No premium license is required to use these endpoints.
All endpoints require manage_options and a valid X-WP-Nonce header.
GET /benecaster/v1/broadcasts
Returns a paginated list of broadcast records for a show.
Auth: manage_options + X-WP-Nonce
Parameters:
| Param | Type | Default | Description |
|---|---|---|---|
show_id |
int | — | Required. Show to list broadcasts for. |
page |
int | 1 | Page number |
per_page |
int | 20 | Items per page (max 100) |
status |
string | — | Filter by status: queued, sending, complete, complete_with_failures |
Response:
{
"items": [
{
"id": 12,
"show_id": 45,
"subject": "New episode: Season finale is here",
"status": "complete",
"total_recipients": 247,
"sent": 245,
"failed": 2,
"pending": 0,
"created_at": "2026-05-17T09:00:00",
"completed_at": "2026-05-17T09:48:00"
}
],
"total": 8,
"pages": 1,
"per_page": 20,
"page": 1
}
Status values:
| Status | Meaning |
|---|---|
queued |
Broadcast created; processing hasn’t started yet |
sending |
Delivery in progress; rows still pending |
complete |
All recipients reached terminal status; zero failures |
complete_with_failures |
All recipients terminal; one or more failed rows |
The Broadcasts admin screen polls this endpoint every 30 seconds while any broadcast has status queued or sending.
GET /benecaster/v1/broadcasts/{id}/recipients
Returns per-recipient delivery status for a broadcast.
Auth: manage_options + X-WP-Nonce
Parameters:
| Param | Type | Default | Description |
|---|---|---|---|
page |
int | 1 | Page number |
per_page |
int | 50 | Items per page (max 200) |
status |
string | — | Filter by status: sent, failed, in_progress |
Response:
{
"items": [
{
"id": 4821,
"email": "sarah@example.com",
"display_name": "Sarah Chen",
"status": "sent",
"sent_at": "2026-05-17T09:03:00",
"failed_at": null,
"failure_reason": null,
"retry_count": 0
},
{
"id": 4822,
"email": "bob@example.com",
"display_name": "Bob Martinez",
"status": "failed",
"sent_at": null,
"failed_at": "2026-05-17T09:05:00",
"failure_reason": "SMTP connection timeout",
"retry_count": 1
}
],
"total": 247,
"pages": 5,
"per_page": 50,
"page": 1
}
Recipient status values:
| Status | Meaning |
|---|---|
sent |
Email delivered |
failed |
All delivery attempts exhausted |
in_progress |
Currently being sent or queued for retry |
POST /benecaster/v1/broadcasts/{id}/retry-all
Resets all failed recipient rows in a broadcast to pending, re-queuing them for delivery. Recipients that already succeeded are unaffected.
Auth: manage_options + X-WP-Nonce
Response:
{
"requeued": 2,
"broadcast_status": "sending"
}
requeued is the count of rows that moved from failed back to pending. If there are no failed rows, requeued is 0 and broadcast_status reflects the current status.
Errors:
| Code | HTTP | Condition |
|---|---|---|
rest_not_found |
404 | Broadcast ID does not exist |
POST /benecaster/v1/broadcasts/{id}/recipients/{qid}/retry
Resets a single failed recipient row to pending, re-queuing it for delivery. {qid} is the recipient row ID from GET /broadcasts/{id}/recipients.
Auth: manage_options + X-WP-Nonce
Response:
{
"requeued": true
}
Errors:
| Code | HTTP | Condition |
|---|---|---|
rest_not_found |
404 | Broadcast or recipient row ID does not exist |
invalid_status |
409 | Row is not in failed status — only failed rows can be retried |
Recipe
Recipe: Query Broadcast Delivery Status from an External Tool — use GET /broadcasts and GET /broadcasts/{id}/recipients from an external script or CI pipeline to monitor delivery after a scheduled send.