The Bulk API lets you incrementally build a notification job for a large number of users and then execute it with a single API call. While the Send API can deliver messages to multiple recipients, the Bulk API gives you more control over ingestion and lets you track progress as the job runs. Like sending a single message, the Bulk API works across channels (email, SMS, chat, in-app inbox, push) and providers (Twilio, SendGrid, etc).Documentation Index
Fetch the complete documentation index at: https://www.courier.com/docs/llms.txt
Use this file to discover all available pages before exploring further.
Prerequisites
- A Courier account with an API key
- A published notification template (or inline content)
- Recipient user IDs or profile data for the users you want to notify
Sending a Bulk Job
Create a bulk job
Define the job with a template and any global data that applies to all recipients. The response returns a Response:You can also pass optional fields like
jobId you’ll use for the remaining steps.brand, locale, and a global data object that applies to every recipient. Per-user data (added in the next step) takes precedence over global data.Ingest users into the job
Add recipients to the job using the Each user object supports these optional fields:
If there are errors (e.g. duplicate users), the response includes them alongside the successful count:
jobId. You can call this endpoint multiple times to ingest users in batches; the job won’t expire until you run it.| Field | Description |
|---|---|
to.user_id | Courier user ID for the recipient |
to.data | Per-user data that overrides the global data from the job |
profile | Inline profile data (email, phone, etc.) |
preferences | Per-user preference overrides |
You can call this endpoint as many times as needed before running the job. The bulk job will not expire until it is invoked.
Run the job
Once all users are ingested, execute the job. This triggers Courier to fan out and send individual messages to each recipient.Returns
202 Accepted. The job begins processing asynchronously.Monitor job status
Track the job’s progress using the
You can also fetch individual user statuses with pagination:Each item’s
jobId. The status response includes delivery statistics.| Field | Description |
|---|---|
received | Total users ingested into the job |
enqueued | Messages placed on the pipeline |
failures | Errors during job processing |
status | CREATED, PROCESSING, or COMPLETED |
messageId is the same ID you’d get from a regular /send request. You can look up individual messages in the Message Logs or via the Messages API. If you have Outbound Webhooks configured, Courier will invoke them throughout the message lifecycle.What’s Next
Send to Lists and List Patterns
Use lists and wildcarding to target groups of recipients
Configure Multi-Channel Routing
Set up channel priority and failover rules
Bulk API Reference
Full API documentation for the Bulk endpoint
Message Logs
Track delivery status and debug notification issues