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.