Skip to main content
A send is one API call. Name who it goes to and what it says. Courier renders it, applies preferences, routes, and delivers.
The response returns a 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 supplies data, 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 one message 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 an Idempotency-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.
Add routing to pin the channels for this request, or channels and providers to adjust delivery settings. See and .

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-Key header to dedupe retries. Without it, each call sends.

FAQ

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 ).
Not directly. It returns a requestId and the send runs asynchronously. Check delivery in or receive a message:updated .
Send an Idempotency-Key header. A second request with the same key returns the original result without sending again.