Skip to main content

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.

See Also