Create a broadcast
Needs a token with broadcasts:write, plus flows:read to pick the flow. A broadcast reaches real leads: confirm the audience and the schedule before sending, and prefer scheduling so it can still be cancelled.
# 1. a published flow of the right provider
curl -s "$API/v1/schemas?status=1" -H "Authorization: Bearer $CF"
# 2. schedule it (page local time) for two pages
curl -s -X POST "$API/v1/broadcasts" -H "Authorization: Bearer $CF" -H "Content-Type: application/json" -d '{
"schemaId": "<published flow id>",
"pageIds": ["<page id 1>", "<page id 2>"],
"type": 5,
"notificationType": 1,
"recencyFilter": 0,
"scheduledTo": "2026-10-01T09:00:00"
}'
# 3. follow it
curl -s "$API/v1/broadcasts/<broadcastId>" -H "Authorization: Bearer $CF"
curl -s "$API/v1/broadcasts/<broadcastId>/executions?limit=50" -H "Authorization: Bearer $CF"
Check skippedPageIds in the response. A POST /v1/broadcasts is not idempotent: on a timeout, list /v1/broadcasts?search=&dateFrom= before trying again, or you will send twice.
Monitor and control
| Method | Path | Notes |
|---|---|---|
| GET | /v1/broadcasts/{broadcastId} |
Summary: status, type, scheduledTo, totalPages, executionSummary, metricsSummary, pages (pageId, pageReferenceId, name, category). |
| GET | /v1/broadcasts/{broadcastId}/executions?status=&pageIds=&hasErrors=&limit=&cursor= |
One row per page: executionId, pageId, pageReferenceId, status, total, successCount, failureCount, pendingCount, sent, errorCount, topError, isBlocked, blockedReason. |
| GET | /v1/broadcasts?status=&pageIds=&dateFrom=&dateTo=&search=&journeyId=&limit=&cursor=&sort= |
List of broadcasts, with total and categoryCounts. GET /v1/broadcasts/groups?groupBy=hour|categoryHour&timezoneOffset=-03:00 returns grouped counts instead; GET /v1/broadcasts/calendar?dateFrom=&dateTo= the calendar view. |
| GET | /v1/broadcasts/overview?days=7 |
{"broadcasts": {"total", "scheduled", "inProgress"}, "executions": {"success", "inProgress", "withErrors", "blocked"}, "leads": {"planned", "success", "sent", "errors"}}. |
| GET | /v1/broadcasts/executions?schemaId=&broadcastId=&pageIds=&dateFrom=&dateTo=&status=&limit= |
Global execution feed (defaults to today). |
| PUT | /v1/broadcasts/{broadcastId} |
Replace a Waiting or Paused broadcast with the same body and checks as the creation; an optional field left out is cleared. |
| PATCH | /v1/broadcasts/{broadcastId} |
Change part of a Waiting or Paused broadcast: a missing field is kept, null clears topicName, messageTag, the recency limits, tags, deliveryIntelligence, subscriptionTag, scheduledTo or channelTargets, and null on any other field is a 400. |
| POST | /v1/broadcasts/{broadcastId}/cancel |
400 when Completed, Failed or Cancelled. |
| POST | /v1/broadcasts/{broadcastId}/executions/{executionId}/cancel, /reprocess; /v1/broadcasts/{broadcastId}/executions/cancel, /reprocess with {"pageId"} |
Per-page control. Reprocess only for failed executions within 24h (409 otherwise). |
| GET | /v1/schemas/{schemaId}/metrics?broadcastId= |
Per-node sent, delivered, read, click and error counts for that broadcast. |
Delivery happens asynchronously: an execution goes PendingSegmentation, then Processing, then Completed; leads are sent in batches and the bot paces per page to respect Meta's per-page rate limit (error 613), retrying for up to 24h. Expect status to move over minutes to hours for large audiences.