When to use broadcasts vs. individual messages
Use broadcasts when you have a list of recipients who all receive a variation of the same template-driven email. Use the standard send endpoint when you need per-message control, transactional timing, or real-time responses.The API
Submit a broadcast
cURL
status is one of:
| Value | Meaning |
|---|---|
accepted | Broadcast queued successfully. Use broadcastId to track progress. |
failed | Validation error. The response includes an errorCode and errorMessage. |
delayed | Transient error during submission. Helo will retry automatically. |
Broadcast lifecycle
| Status | Description |
|---|---|
Accepted | Broadcast has been validated and queued. Processing will begin when your channel is ready. |
Processing | Messages are actively being sent. Poll GET /broadcasts/{id} to track the completion percentage. |
Completed | All messages have been processed. Some may have failed — check /failures and /suppressions. |
Cancelled | The broadcast was cancelled before completing. |
Processing, additional broadcasts queue in Accepted and start automatically when the current one finishes. Broadcasts are processed in the order they were submitted.
Delivery rate
Helo processes broadcasts at up to 50 messages per second. As a rough guide:| List size | Estimated processing time |
|---|---|
| 10,000 | ~3 minutes |
| 50,000 | ~17 minutes |
| 100,000 | ~33 minutes |
| 500,000 | ~2.8 hours |
Failures and suppressions
After a broadcast completes, two categories of undelivered recipients are available: Failures — permanent errors that prevented delivery, such as invalid addresses or domain issues. Retrieve them atGET /broadcasts/{id}/failures. Each failure includes the recipient list, message index, error code, and a description.
Suppressions — recipients skipped because they appear on your suppression list (previous bounces, unsubscribes, or manual suppressions). Retrieve them at GET /broadcasts/{id}/suppressions.
Transient errors (temporary network or service issues) are retried automatically and do not appear in the failures list unless they ultimately cannot be delivered.
Validation errors
If the API returns"status": "failed", the response includes an errorCode:
| Error code | Cause |
|---|---|
channel_not_found | The channel does not exist or you don’t have access to it. |
domain_unverified | The sender domain has not been verified on your account. |
account_forbidden | Your account is not permitted to send (blocked, rejected, or cancelled). |
recipient_forbidden | Pending accounts can only send to addresses on the same domain as the sender. |
recipients_suppressed | All recipients in the request are on the suppression list. |
templating_error | A template variable or syntax error was found in the subject, HTML, or text. |
send_limit_exceeded | Pending accounts have a 1,000-email free-send limit. |
Limits at a glance
| Limit | Value |
|---|---|
Recipients per message (to + cc + bcc) | 50 |
| Subject line length | 256 characters |
| Tags per broadcast | 5 |
| Tag length | 100 characters |
| Metadata fields | 10 |
| Metadata key length | 50 characters |
| Metadata value length | 100 characters |
| Total header size | 5,000 characters |
| Email address length | 254 characters |
| Processing rate | 50 messages/second |
| Free-send limit (Pending accounts only) | 1,000 emails |
| Max results per list query | 500 |