Broadcasts
A broadcast sends one approved WhatsApp template to every contact in one or more segments, or retargets the recipients of an earlier broadcast based on what they did with it. Create and schedule broadcasts from your own systems, change or cancel them before they start, and read their delivery stats and per-recipient logs.
Send your key in the x-api-key header and bodies as JSON with Content-Type: application/json. Requests without a valid key get 401 { "message": "Unauthorized" }; other errors look like { "error": "message" }. The workspace goes in the request (workspace: { "id" } in the body, or ?workspaceId= when listing). Lists are plain arrays, paged with page (default 1) and limit (default 10, max 100; higher values are reduced to 100): keep increasing page until you get fewer results than your limit. See REST API for your API host and key.
/v1/broadcastsList broadcastsPOST/v1/broadcastsCreate and schedule a broadcastGET/v1/broadcasts/{id}Get a broadcast with its statsPUT/v1/broadcasts/{id}Update a broadcast that hasn't startedDEL/v1/broadcasts/{id}Cancel and delete a broadcast that hasn't startedGET/v1/broadcasts/{id}/logsPer-recipient resultsHow broadcasts run
- Scheduling. A new broadcast has status
PENDINGand runs atscheduleDateTime. LeavescheduleDateTimeout to send it straight away. - Changing or cancelling. You can update or delete a broadcast only while its status is
PENDINGand itsscheduleDateTimeis still in the future. A broadcast created withoutscheduleDateTimestarts at once, so it can't be changed or deleted afterwards. - Audience. A
contactbroadcast goes to the contacts its segments select when it runs. Aretargetbroadcast goes to recipients of an earlier broadcast, filtered byretargetEngagementType. - Template. The template is looked up by its WhatsApp name and language in the broadcast's workspace. See the WhatsApp templates API to list them.
The broadcast object
idstringnamestringstatusstringPENDING until it starts. Other values include RUNNING, SENDING, MESSAGES QUEUED, COMPLETED, STOPPING and FAILED.typestringcontact or retargetsegmentsobject[]contact broadcasts: the segments, each { id, name }. Older broadcasts may have a single segment instead.retargetBroadcast, retargetEngagementTypeobject, stringretarget broadcasts: the earlier broadcast ({ id, name }) and the engagement filterscheduleDateTime, startedAt, completedAtstringtemplateobjectname and languageheaderMediaUrl, headerTextParameters, bodyTextParameters, buttonUrlParameters, locationParameters, flowParametersprocessedStats, deliveryStatsobjectworkspaceobject{ id, title }createdAt, updatedAtstringFields with no value, including stats a new broadcast doesn't have yet, are left out of the response.
{
"id": "Bc6tY3pLq8",
"name": "October offer",
"status": "COMPLETED",
"type": "contact",
"segments": [
{ "id": "Sg4mN7qRt2", "name": "VIP customers, inactive 30 days" }
],
"scheduleDateTime": "2026-10-20T14:00:00.000Z",
"startedAt": "2026-10-20T14:00:02.000Z",
"completedAt": "2026-10-20T14:06:45.000Z",
"template": {
"name": "october_offer",
"language": "en_US"
},
"headerMediaUrl": "https://cdn.example.com/offers/october.jpg",
"bodyTextParameters": ["{{contact.name}}", "20%"],
"processedStats": {
"totalCount": 1250,
"successCount": 1238,
"failureCount": 12
},
"deliveryStats": {
"sentCount": 1238,
"deliveredCount": 1201,
"failedCount": 12,
"readCount": 864,
"repliedCount": 97
},
"workspace": {
"id": "Wq3nT8vYp1",
"title": "Downtown Studio"
},
"createdAt": "2026-10-14T09:30:00.000Z",
"updatedAt": "2026-10-20T14:06:45.000Z"
}
The broadcast stats
totalCountintegersuccessCountintegerfailureCountintegersentCountintegerdeliveredCountintegerfailedCountintegerreadCountintegerrepliedCountinteger{
"processedStats": {
"totalCount": 1250,
"successCount": 1238,
"failureCount": 12
},
"deliveryStats": {
"sentCount": 1238,
"deliveredCount": 1201,
"failedCount": 12,
"readCount": 864,
"repliedCount": 97
}
}
The broadcast log entry
broadcastobject{ id, name }recepientNamestringcountryCode, phonestring+) and national numberstatusstringerrorstringreplystringcreatedAt, updatedAtstring{
"broadcast": { "id": "Bc6tY3pLq8", "name": "October offer" },
"recepientName": "Maria Lopez",
"countryCode": "+1",
"phone": "2025550188",
"status": "read",
"reply": "Yes, please book me in",
"createdAt": "2026-10-20T14:00:05.000Z",
"updatedAt": "2026-10-20T14:21:40.000Z"
}
List broadcasts
/v1/broadcastsworkspaceIdstringsearchTextstringstartDatestringYYYY-MM-DD, for example 2026-10-01. Days follow your account's time zone.endDatestringYYYY-MM-DD, for example 2026-10-31pageintegerdefault 1limitintegerdefault 10100. Higher values are reduced to 100.200 OK: a JSON array of broadcasts, latest scheduleDateTime first. When it has fewer than limit items, it's the last page. This list doesn't filter out broadcasts you have deleted.
Errors
| Status | Body | When |
|---|---|---|
404 | { "error": "Invalid workspaceId" } | workspaceId isn't in your account |
500 | { "error": "Could not retrieve Broadcasts" } | The request could not be completed. Retry. |
curl "https://api.whauto.chat/v1/broadcasts?workspaceId=Wq3nT8vYp1&startDate=2026-10-01&endDate=2026-10-31&limit=50" \
-H "x-api-key: $WHAUTOCHAT_API_KEY"
[
{
"id": "Bc6tY3pLq8",
"name": "October offer",
"status": "COMPLETED",
"type": "contact",
"segments": [{ "id": "Sg4mN7qRt2", "name": "VIP customers, inactive 30 days" }],
"scheduleDateTime": "2026-10-20T14:00:00.000Z",
"template": { "name": "october_offer", "language": "en_US" },
"workspace": { "id": "Wq3nT8vYp1", "title": "Downtown Studio" },
"createdAt": "2026-10-14T09:30:00.000Z",
"updatedAt": "2026-10-20T14:06:45.000Z"
}
]
Create a broadcast
/v1/broadcastsCreates a broadcast with status PENDING. See how broadcasts run.
namestringrequiredtypestringrequiredcontact to send to segments, or retarget to follow up an earlier broadcastworkspaceobjectrequiredThe broadcast's workspace
templateobjectrequiredThe approved WhatsApp template
segmentsobject[]for contact[{ "id": "..." }]. Every segment must belong to the same workspace and not be deleted.retargetBroadcastobjectfor retargetThe earlier broadcast
retargetEngagementTypestringfor retargetsent, delivered, read, replied, not-replied or failedscheduleDateTimestring2026-10-20T14:00:00Z. Leave it out to send now.headerMediaUrlstringheaderTextParametersstring[]bodyTextParametersstring[]buttonUrlParametersstring[]locationParametersobjectFor templates with a location header
flowParametersobjectFor templates with a WhatsApp Flow button
Text, button and flow values can include personalisation placeholders that are filled in for each recipient, such as {{contact.name}}, {{contact.phone}}, {{contact.id}}, {{contact.customFields.city}}, {{workspace.name}}, {{currentDate}} and {{currentTime}}.
200 OK: the new broadcast.
Errors
| Status | Body | When |
|---|---|---|
400 | { "error": "Invalid parameters" } | A required field is missing, including segments for a contact broadcast or retargetBroadcast and retargetEngagementType for a retarget broadcast |
404 | { "error": "Location not found in the account." } | The workspace isn't in your account |
404 | { "error": "Invalid whatsApp Template" } | No template with that name and language in the workspace |
404 | { "error": "Invalid Retarget Broadcast" } | The earlier broadcast isn't in the workspace |
404 | { "error": "Invalid Segments: ..." } | Listed segments aren't in the workspace or were deleted |
500 | { "error": "Could not create Broadcast" } | The request could not be completed. Retry. |
curl -X POST https://api.whauto.chat/v1/broadcasts \
-H "x-api-key: $WHAUTOCHAT_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"name": "October offer",
"type": "contact",
"workspace": { "id": "Wq3nT8vYp1" },
"segments": [{ "id": "Sg4mN7qRt2" }],
"template": { "name": "october_offer", "language": "en_US" },
"scheduleDateTime": "2026-10-20T14:00:00Z",
"headerMediaUrl": "https://cdn.example.com/offers/october.jpg",
"bodyTextParameters": ["{{contact.name}}", "20%"]
}'
curl -X POST https://api.whauto.chat/v1/broadcasts \
-H "x-api-key: $WHAUTOCHAT_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"name": "October offer reminder",
"type": "retarget",
"workspace": { "id": "Wq3nT8vYp1" },
"retargetBroadcast": { "id": "Bc6tY3pLq8" },
"retargetEngagementType": "not-replied",
"template": { "name": "october_offer_reminder", "language": "en_US" },
"scheduleDateTime": "2026-10-23T14:00:00Z"
}'
{
"id": "Bc6tY3pLq8",
"name": "October offer",
"status": "PENDING",
"type": "contact",
"segments": [{ "id": "Sg4mN7qRt2", "name": "VIP customers, inactive 30 days" }],
"scheduleDateTime": "2026-10-20T14:00:00.000Z",
"template": { "name": "october_offer", "language": "en_US" },
"headerMediaUrl": "https://cdn.example.com/offers/october.jpg",
"bodyTextParameters": ["{{contact.name}}", "20%"],
"workspace": { "id": "Wq3nT8vYp1", "title": "Downtown Studio" },
"createdAt": "2026-10-14T09:30:00.000Z",
"updatedAt": "2026-10-14T09:30:00.000Z"
}
Get a broadcast
/v1/broadcasts/{id}idstringrequired200 OK: the broadcast, including its current stats.
Errors
| Status | Body | When |
|---|---|---|
404 | { "error": "Broadcast not found" } | The broadcast isn't in your account |
500 | { "error": "Could not retrieve Broadcast" } | The request could not be completed. Retry. |
curl "https://api.whauto.chat/v1/broadcasts/Bc6tY3pLq8" \
-H "x-api-key: $WHAUTOCHAT_API_KEY"
{
"id": "Bc6tY3pLq8",
"name": "October offer",
"status": "COMPLETED",
"type": "contact",
"segments": [{ "id": "Sg4mN7qRt2", "name": "VIP customers, inactive 30 days" }],
"scheduleDateTime": "2026-10-20T14:00:00.000Z",
"startedAt": "2026-10-20T14:00:02.000Z",
"completedAt": "2026-10-20T14:06:45.000Z",
"template": { "name": "october_offer", "language": "en_US" },
"processedStats": { "totalCount": 1250, "successCount": 1238, "failureCount": 12 },
"deliveryStats": { "sentCount": 1238, "deliveredCount": 1201, "failedCount": 12, "readCount": 864, "repliedCount": 97 },
"workspace": { "id": "Wq3nT8vYp1", "title": "Downtown Studio" },
"createdAt": "2026-10-14T09:30:00.000Z",
"updatedAt": "2026-10-20T14:06:45.000Z"
}
Update a broadcast
/v1/broadcasts/{id}idstringrequiredOnly for a broadcast that is still PENDING with a scheduleDateTime in the future. The body takes the same fields as create, with the same required fields, so send the whole broadcast each time. Send the broadcast's own workspace in workspace.id: the template and segments are looked up there.
- A new
scheduleDateTimereschedules the broadcast. Leave it out to keep the current time. - Changing
typetoretargetremoves the segments. Changing it tocontactremoves the retarget settings. - If you leave out
locationParametersorflowParameters, they are removed from the broadcast. If you leave outheaderMediaUrl,headerTextParameters,bodyTextParametersorbuttonUrlParameters, the current values are kept.
200 OK: the updated broadcast.
Errors
| Status | Body | When |
|---|---|---|
400 | { "error": "Invalid parameters" } | A required field is missing (same rules as create) |
401 | { "error": "\"You cannot update this broadcast at this time" } | The broadcast has started or its scheduled time has passed |
404 | { "error": "Workspace not found in the account" } | The workspace isn't in your account |
404 | { "error": "Broadcast not found" } | The broadcast isn't in your account |
404 | { "error": "Invalid whatsApp Template" } | No template with that name and language in the workspace |
404 | { "error": "Invalid Retarget Broadcast" } | The earlier broadcast isn't in the workspace |
404 | { "error": "Invalid Segments: ..." } | Listed segments aren't in the workspace or were deleted |
500 | { "error": "Could not update Broadcast" } | The request could not be completed. Retry. |
curl -X PUT https://api.whauto.chat/v1/broadcasts/Bc6tY3pLq8 \
-H "x-api-key: $WHAUTOCHAT_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"name": "October offer",
"type": "contact",
"workspace": { "id": "Wq3nT8vYp1" },
"segments": [{ "id": "Sg4mN7qRt2" }],
"template": { "name": "october_offer", "language": "en_US" },
"scheduleDateTime": "2026-10-21T15:00:00Z",
"bodyTextParameters": ["{{contact.name}}", "25%"]
}'
{
"id": "Bc6tY3pLq8",
"name": "October offer",
"status": "PENDING",
"type": "contact",
"segments": [{ "id": "Sg4mN7qRt2", "name": "VIP customers, inactive 30 days" }],
"scheduleDateTime": "2026-10-21T15:00:00.000Z",
"template": { "name": "october_offer", "language": "en_US" },
"headerMediaUrl": "https://cdn.example.com/offers/october.jpg",
"bodyTextParameters": ["{{contact.name}}", "25%"],
"workspace": { "id": "Wq3nT8vYp1", "title": "Downtown Studio" },
"createdAt": "2026-10-14T09:30:00.000Z",
"updatedAt": "2026-10-15T10:12:00.000Z"
}
Delete a broadcast
/v1/broadcasts/{id}idstringrequiredCancels a broadcast that is still PENDING with a scheduleDateTime in the future, so it never sends.
Errors
| Status | Body | When |
|---|---|---|
401 | { "error": "\"You cannot delete this broadcast at this time" } | The broadcast has started or its scheduled time has passed |
404 | { "error": "Broadcast not found" } | The broadcast isn't in your account |
500 | { "error": "Could not delete Broadcast" } | The request could not be completed. Retry. |
curl -X DELETE https://api.whauto.chat/v1/broadcasts/Bc6tY3pLq8 \
-H "x-api-key: $WHAUTOCHAT_API_KEY"
{ "success": true }
List broadcast logs
/v1/broadcasts/{id}/logsidstringrequiredpageintegerdefault 1limitintegerdefault 10100. Higher values are reduced to 100.200 OK: a JSON array with one log entry per recipient, newest first.
Errors
| Status | Body | When |
|---|---|---|
404 | { "error": "Broadcast not found" } | The broadcast isn't in your account |
500 | { "error": "Could not retrieve Broadcast Logs" } | The request could not be completed. Retry. |
curl "https://api.whauto.chat/v1/broadcasts/Bc6tY3pLq8/logs?page=1&limit=100" \
-H "x-api-key: $WHAUTOCHAT_API_KEY"
[
{
"broadcast": { "id": "Bc6tY3pLq8", "name": "October offer" },
"recepientName": "Maria Lopez",
"countryCode": "+1",
"phone": "2025550188",
"status": "read",
"reply": "Yes, please book me in",
"createdAt": "2026-10-20T14:00:05.000Z",
"updatedAt": "2026-10-20T14:21:40.000Z"
},
{
"broadcast": { "id": "Bc6tY3pLq8", "name": "October offer" },
"recepientName": "James Carter",
"countryCode": "+44",
"phone": "7700900123",
"status": "failed",
"error": "Message undeliverable",
"createdAt": "2026-10-20T14:00:05.000Z",
"updatedAt": "2026-10-20T14:00:09.000Z"
}
]