requestId, not a delivery result. Find it in to confirm the message rendered and delivered.
Prerequisites
- , and or curl
- , for the
nt_id in the call above - , or their contact details inline in
to - for the channel it goes out on. Test email and the need none.
Three ways to send
All three send the same content: a you design once. What differs is what starts the send.1. Templates
Use a template when your application triggers the send. A receipt, a password reset, an alert. Your app calls the API with a recipient and a template, like the example above. The template holds what the message says on every channel, plus its routing and brand settings. Your app suppliesdata, and the template’s render each recipient’s own version.
That split keeps a send small. Content changes ship by publishing the template, with no deploy.
Design a Template
Build it in the visual editor, or manage it as JSON over the Templates API.
2. Broadcasts
Use a broadcast when you choose the moment. One message to a whole , sent now or on a schedule. You pick the group, and Courier fans it out.Send a Broadcast
Reach a saved list or audience in one send.
3. Journeys
Use a journey when the send happens later, or depends on what the user does. A multi-step flow that runs per user, with delays, branching, and enrichment between steps. A user event or an API call starts it, and the journey decides what comes next.Build a Journey
Lay out steps, delays, and branches in the visual builder.
How it works
Every send is onemessage object posted to , whichever SDK you call it from. It has four parts:
Pass an array in
to to reach several recipients, or contact details inline for a one-off: { "email": "sarah@acme-corp.com" }.
A message with no reusable design can carry its content inline instead of a template. That content is , the same format a template renders.
Courier enforces each recipient’s at send time. Opt-outs and channel choices apply without extra logic in your code.
The pipeline
The send is asynchronous, so the API responds before delivery happens. Courier records every step, so you can follow a message from request to delivery in . Transient provider errors retry, and an unavailable provider or channel fails over to the next one.Idempotency
Send anIdempotency-Key header to make a retry safe. A repeated request with the same key returns the original response instead of sending again. A retry after a network failure cannot duplicate the send.
Limits & behavior
- A send is asynchronous. The API returns a
requestId, not a delivery result. Track the outcome in the logs or via . - Preferences are enforced automatically. A recipient’s opt-outs and channel choices apply at send time with no extra code.
- Idempotency is opt-in. Send an
Idempotency-Keyheader to dedupe retries. Without it, each call sends.
FAQ
Can I send to multiple users at once?
Can I send to multiple users at once?
Pass an array of recipients in
to, or send to a . For a large group, a list or audience send fans out for you (see ).Does the API tell me if delivery succeeded?
Does the API tell me if delivery succeeded?
Not directly. It returns a
requestId and the send runs asynchronously. Check delivery in or receive a message:updated .How do I prevent duplicate sends?
How do I prevent duplicate sends?
Send an
Idempotency-Key header. A second request with the same key returns the original result without sending again.