Broadcasts
Create broadcast
Create a draft broadcast. Returns 201 with the broadcast. The from domain is not checked here; if it is not verified, every recipient fails at send time.
POST
https://api.sndr.sh/v1/broadcastsCreate broadcast
curl -X POST 'https://api.sndr.sh/v1/broadcasts' \
-H "Authorization: Bearer $SNDR_API_KEY" \
-H 'Content-Type: application/json' \
-d '{
"name": "June newsletter",
"group_id": "grp_4d8a0c5e-1f7",
"from_email": "Acme <hello@acme.com>",
"subject": "June product update",
"html": "<h1>June update</h1><p>Here is what is new.</p>"
}'201Created
{
"id": "bca_9b3e6d12-a40",
"organization_id": "org_8d41c7a2-3f6",
"name": "June newsletter",
"group_id": "grp_4d8a0c5e-1f7",
"from_email": "\"Acme\" <hello@acme.com>",
"subject": "June product update",
"html": "<h1>June update</h1><p>Here is what is new.</p>",
"status": "draft",
"total_recipients": 0,
"sent_count": 0,
"failed_count": 0,
"created_at": "2026-06-01T12:00:00Z"
}Authorization
AuthorizationstringheaderrequiredBearer followed by your API key. Needs the send scope.
Body
application/jsonnamestringrequiredInternal campaign name, 1–120 characters.
group_idstringrequiredContact group to send to (grp_...). Must belong to your workspace.
from_emailstringrequiredSender, as an address or "Name <address>", on a verified domain.
subjectstringrequiredSubject line, 1–500 characters.
htmlstringHTML body. Required unless text or template_id is set. {{email}}, {{first_name}}, {{last_name}} and any contact attribute (e.g. {{plan}}) are filled in per recipient.
textstringPlain-text body.
template_idstringSaved template (tpl_...) whose html and text are used when the broadcast has no body.
Errors
401
unauthenticatedMissing or invalid API key.400
invalid_requestBody is not valid JSON, has an unknown field, or a field has the wrong type.403
insufficient_scopeThe API key is missing the send scope.422
validation_failedA required field is missing or too long, from_email is invalid, there is no body or template, or group_id is not in this account.