Skip to main content
/secure/sendbatch queues many messages in one call.
Each element takes the same fields as a single send. A message’s to may itself be an array, which multiplies out.

The response confirms acceptance only

There are no per-message ids in this response, and no per-message results. messageCount is how many the batch expanded to, not how many succeeded.Per-message outcomes arrive on your errback URL as separate callbacks. A client that treats a 200 here as “all three sent” is wrong in exactly the cases worth knowing about.

Defaults and configuration

globals is merged under every message, so a field set on an individual message wins.
Unknown keys in batch_config are ignored, not refused. A typo in errback_url costs you every per-message result, silently — the batch is accepted and the callbacks simply never arrive.This is the one place on the API where a misspelled field does not produce a 400, so check it by sending a deliberately failing message and confirming the callback lands.

Scheduling

schedule_at takes exactly two forms: Anything else is 412 Got unknown format. A date in the past is refused too, rather than sent immediately.
Scheduled batches survive a restart only when the gateway is running with a RabbitMQ broker — and not even then while the broker connection is degraded. If durable scheduling matters to you, ask your provider which queue provider they run and whether they alert on amqp.bridge.degraded.

Limits

Array-valued destinations multiply: 100 messages each with 200 recipients is 20 000, and refused.

Pacing

Batches pace themselves against the router queue’s depth, pausing above a high-water mark. You do not need to throttle your own submission of a batch — but you do still need to respect your account’s messages-per-second limit on ordinary sends, which is a separate ceiling and returns 429.

Send a batch

Every field, with the refusals.

Batch callbacks

What arrives on callback_url and errback_url.