Your App β β β Courier API β β β Providers β β β User
You decide what to send and who should receive it. Courier manages how it gets there, including routing, preferences, retries, failover, and logging.
A single API call is all it takes to send a notification. One request can handle rendering, routing, preferences, and delivery across email, SMS, push, inbox, chat apps, and more. See Send a Message for code examples in every supported language.
Core Concepts
Every send request is built around a few core ideas: RecipientsYou can include contact details, such as email, phone number, or push token, directly in your request or reference a
user_id linked to a stored user profile.
TemplatesDefine content inline or reference a saved template that your team manages visually. Templates keep messaging consistent across channels and editable without code changes. Data
Pass dynamic variables, such as
{{name}} or {{order_id}}, to personalize content at send time.
RoutingDeliver messages using priority routing through a single channel or by broadcasting across multiple channels at once. Courier automatically selects the right route for each message based on your configuration. User Preferences
Courier automatically enforces each userβs notification preferences at send time, respecting channel choices, frequency settings, and opt-outs without extra logic in your code.
Beyond Single Sends
The Send API is the right choice for most notifications. Use it when your application controls the recipient, timing, content, and data for a single message. When your product needs more structure, Courier gives you two ways to build on top of direct sends.Templates
Move content out of code so PMs, designers, and operators can update messages without a deploy. Your application keeps the same send call and passes the data needed to render each message.
Journeys
Build multi-step customer messaging flows in a visual editor. Use Journeys to orchestrate onboarding, activation, reminders, and re-engagement with triggers, delays, branching, enrichment, throttling, and run inspection.
FAQ
Can I send to multiple users at once?
Can I send to multiple users at once?
What happens if a channel or provider fails?
What happens if a channel or provider fails?
Courier automatically fails over based on your routing configuration. If the primary provider for a channel is unavailable, Courier tries the next configured provider. If the entire channel fails, such as when the user has no email address, Courier moves to the next channel in priority order. See Automated Failover for details.
How does Courier handle retries?
How does Courier handle retries?
Courier retries failed sends automatically using exponential backoff. Transient errors from providers, such as rate limits or temporary outages, are retried before the send is marked as failed. You can monitor retry attempts and final delivery status in Message Logs.
Can I prevent duplicate sends?
Can I prevent duplicate sends?
Yes. Include an
idempotency_key in your send request header. If Courier receives a second request with the same key, it returns the original response without sending again. This is useful for safely retrying requests after network failures.Can I schedule or delay a send?
Can I schedule or delay a send?
Yes. Use the
delay object in your send request to hold a message for a specified duration or until a specific time. See Delays & Delivery Windows for configuration options.Related Resources
Choose a Sending Strategy
Inline sends, templates, or Journeys; pick the right level
Send a Message
Code examples for every supported language
Journeys Overview
Visual workflows for multi-step customer messaging
Automated Failover
Automatic provider and channel failover