ChatFood API

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.