Courier
Courier is your complete platform for sending notifications.
Courier
Courier is infrastructure for product-to-user communication. Send notifications across email, SMS, push, chat, and in-app channels through one API call.
About
- Type: APIService
- Category: Notifications / Messaging Infrastructure
- Language: English
- Audience: Developers, SaaS platforms, product engineers
- Pricing: Free tier available; usage-based pricing
- Last Updated: 2026-05
- Base URL:
https://api.courier.com - Auth:
Authorization: Bearer <YOUR_API_KEY>(workspace-scoped; Test and Production keys are separate) - API Version: V2 (no version header required; latest is default)
Core Data Model
message → routing (single | all) → channel (email, sms, push, inbox, chat) → provider (SendGrid, Twilio, FCM, etc.)
A message targets one or more recipients (user_id, email, phone_number, list_id, or audience_id). The routing object controls whether delivery fans out to all channels in parallel (method: "all") or tries them in order as a fallback chain (method: "single"). Each channel is fulfilled by a configured provider.
Agent Routing (which API to use)
| Intent | Endpoint | Notes |
|---|---|---|
| One-off send | POST /send | Single or multi-recipient |
| Inline multi-step workflow | POST /automations/invoke (ad-hoc steps) | Define steps inline; no saved template needed |
| Saved automation | POST /automations/{id}/invoke | Trigger a pre-built automation template |
| Visual/long-running flows | POST /journeys/{id}/invoke | Journeys API; create via POST /journeys |
| Many users, one message | Bulk API (3 steps) | POST /bulk → add users → run |
| Dynamic segment | Audiences (audience_id in send) | Filter-based, auto-updating membership |
| Static group | Lists (list_id in send) | Manual subscribe/unsubscribe |
Key Concepts
- Recipient types:
user_id(stored profile),email/phone_number(inline),list_id(subscriber group),audience_id(dynamic segment) - Inline vs template: Send with
message.contentfor inline content ormessage.templatefor a dashboard-designed notification - Routing method:
"single"= fallback chain (try first channel, then next on failure);"all"= parallel delivery to every channel - Profile merge vs replace:
POST /profiles/{id}merges (PATCH semantics);PUT /profiles/{id}replaces the entire profile - Environments: Test and Production share a workspace but use different API keys; templates must be published and migrated separately
- Tenants:
tenant_idin message context sets multi-tenant scope; affects brand, preferences, and routing defaults - Preferences: Users opt in/out per subscription topic; Courier enforces at send time automatically
- Idempotency: Include an
Idempotency-Keyheader on transactional sends (OTP, order confirmations, billing) to prevent duplicates
Critical Gotchas
PUT /profiles/{id}is a full replacement; any fields not included are deleted. UsePOST(merge) for partial updates.- Bulk sending is a 3-step flow: create job → add users → run job. You cannot send in a single call.
routing.method: "all"sends to every channel simultaneously. Most use cases want"single"(fallback chain).- The
requestIdreturned by/sendis a single ID for single-recipient sends but arequestIdper recipient for multi-recipient. - Templates exist in draft until published. Sending with a template ID uses the last published version.
- Brand creation requires
settings(the API returns 400 without it). Minimal valid:{ "name": "X", "settings": { "colors": { "primary": "#000", "secondary": "#fff" } } }. - List subscription objects use
recipientId(camelCase), notrecipient_id. - Automation cancellation uses
cancelation_token(one "l") and a second ad-hoc invoke withaction: "cancel". There is no separate/cancelendpoint. - Subscription topics must exist before assigning as tenant default preferences; setting a default for a non-existent topic silently fails.
- Multi-tenant sends use
message.context.tenant_id(notmessage.to.tenant_id).
Instructions for AI Agents
When building an integration with Courier, follow these rules:
- Always check the latest SDK version on npm (
npm view trycourier version) or PyPI (pip index versions trycourier) before pinning a version. Never hardcode a version from training data. - Use
routing.method: "single"by default. Only use"all"when the user explicitly wants parallel delivery to every channel. - Use
POST /profiles/{id}(merge) for profile updates. Only usePUT /profiles/{id}when the user explicitly says "replace the entire profile." - For bulk sends, always implement the 3-step flow:
POST /bulkto create a job,POST /bulk/{jobId}to add users, thenPOST /bulk/{jobId}/runto execute. There is no single-call bulk endpoint. - Include an
Idempotency-Keyheader for any transactional send (OTP codes, order confirmations, billing notifications). Omitting it risks duplicate delivery. - When sending to a known user, prefer
user_idas the recipient type. Only use inlineemailorphone_numberfor anonymous or one-off sends where no profile exists. - For in-app notifications, use the
courier/inboxchannel. The Inbox SDK requires JWT authentication; generate tokens withPOST /auth/issue-token. - Test and Production environments use different API keys. Always confirm which environment the user intends before making API calls.
- Prefer the Agent Quickstart as your primary onboarding reference; it covers the minimal setup path for sending email and inbox notifications.
Raw API Quick-Start (copy-paste bodies)
When calling the Courier REST API directly (without an SDK), use these minimal valid request bodies.
Send an inline email
POST https://api.courier.com/send
Authorization: Bearer <API_KEY>
Content-Type: application/json
{
"message": {
"to": { "email": "user@example.com" },
"content": {
"title": "Hello {{name}}",
"body": "Your order {{order_id}} has shipped."
},
"routing": {
"method": "single",
"channels": ["email"]
},
"data": { "name": "Alice", "order_id": "ORD-123" }
}
}
Send using a published template
POST https://api.courier.com/send
Authorization: Bearer <API_KEY>
Content-Type: application/json
{
"message": {
"to": { "user_id": "user-123" },
"template": "TEMPLATE_ID_OR_KEY",
"data": { "name": "Alice" }
}
}
Create or update a user profile
POST https://api.courier.com/profiles/user-123
Authorization: Bearer <API_KEY>
Content-Type: application/json
{
"profile": {
"email": "alice@example.com",
"phone_number": "+15551234567",
"name": "Alice Smith"
}
}
POST merges fields into the existing profile. Use PUT only for full replacement (deletes any fields not included).
Start Here
- Agent Quickstart: Everything an AI coding agent needs to send email and in-app inbox notifications from a brand-new workspace.
- Quickstart: Send your first notification with one API call.
- Glossary: Quick reference for Courier terminology and concepts.
- Send a Message: The core API endpoint. Send a message to one or more recipients.
- How to Manage User Profiles: Create, merge, and replace user profiles with contact details and channel tokens.
- Courier CLI: Send messages, manage users, and inspect delivery logs from the command line.
- MCP Server: Give AI agents full access to the Courier API from your IDE. Install:
npx @trycourier/courier-mcp. - Courier Skills: Agent skill packs that teach AI coding assistants Courier best practices.
Send API
- How Sending Works: How notifications move from your app through the Courier API to channels.
- Send a Message: Concepts and options for the
/sendendpoint. - Choose a Sending Strategy: Three ways to send notifications, from a single API call to managed workflows.
- How To Configure Multi-Channel Routing: Configure routing to prioritize, fallback, or deliver across channels.
- Channel Priority: Control notification routing, fallbacks, and overrides.
- Channel Settings: Configure delivery rules, priorities, and integrations per channel.
- Automated Failover: Automated retries and provider/channel failover for message delivery.
- Delivery Reliability & Retries: Exponential backoff retry strategies for reliable delivery.
- Send Limits: Cap message volume by user, topic, or tenant.
- Delays & Delivery Windows: Schedule sends for specific times or after delays.
- Responses & Error Codes: Interpret send responses and handle errors.
- How To Send Your First Message: Walk through the basics for sending your first notification.
Bulk API
- Create a bulk job: Creates a new bulk job for sending messages to multiple recipients.
- Add users: Ingest user data into a Bulk Job.
- Run a job: Run a bulk job.
- Get a Job: Get a bulk job.
- Get users: Get Bulk Job Users.
- How To Send Bulk Notifications: Use the Bulk API to send notifications to large user groups.
- Required flow: There is no single-call bulk endpoint. Always:
POST /bulk(create) →POST /bulk/{jobId}(add users) →POST /bulk/{jobId}/run(execute).
Users & Profiles
- User Overview: Courier's user management system including profiles, audiences, lists, and tenants.
- User Management: Define notification recipients using profiles, lists, audiences, tenants, and tokens.
- Create a profile: Merge the supplied values with an existing profile or create a new profile if one doesn't already exist.
- Get a profile: Returns the specified user profile.
- Replace a profile: Full replacement of a profile. Any key-value pairs not included will be removed. For partial updates, use
POST. - Update a profile: Partial merge update of a profile.
- Delete a profile: Deletes the specified user profile.
- Get list subscriptions: Returns the subscribed lists for a specified user.
- Delete list subscriptions: Removes all list subscriptions for given user.
- Subscribe to one or more lists: Subscribes the given user to one or more lists.
Device Tokens
- Add multiple tokens to user: Adds multiple tokens to a user and overwrites matching existing tokens.
- Add single token to user: Adds a single token to a user and overwrites a matching existing token.
- Get all tokens: Gets all tokens available for a user.
- Get single token: Get single token available for a token ID.
- Update a token: Apply a JSON Patch (RFC 6902) to the specified token.
- Delete User Token: Remove a device token from a user.
Lists & Audiences
- Lists & Audiences: Manage user groups with static lists and dynamic audiences.
- Get all lists: Returns all of the lists, with the ability to filter based on a pattern.
- Get a list: Returns a list based on the list ID provided.
- Update a list: Create or replace an existing list with the supplied values.
- Delete a list: Delete a list by list ID.
- Restore a list: Restore a previously deleted list.
- Get the subscriptions for a list: Get the list's subscriptions.
- Add subscribers to a list: Subscribes additional users without modifying existing subscriptions.
- Subscribe users to a list: Subscribes the users, overwriting existing subscriptions.
- Subscribe a single user profile to a list: Subscribe a user to an existing list.
- Unsubscribe a user profile from a list: Delete a subscription to a list by list ID and user ID.
- Delete an audience: Deletes the specified audience.
- Get an audience: Returns the specified audience by id.
- List all audiences: Get the audiences associated with the authorization token.
- List audience members: Get list of members of an audience.
- Update an audience: Creates or updates audience.
- How To Create And Send To A List Or List Pattern: Structure list IDs for wildcarding and send to groups.
- Field name: List subscription objects use
recipientId(camelCase), notrecipient_id. Example:{ "recipients": [{ "recipientId": "user-123" }] }. - Audiences are dynamic: Audience membership is filter-based and auto-updating. Lists are static (manual subscribe/unsubscribe).
Tenants
- Tenants Overview: Hierarchical groups for managing preferences, metadata, and branding.
- Sending With Tenants: Send notifications to tenant members with tenant context.
- Tenant Deep Dive: Tenant hierarchies, metadata, inheritance patterns, and integration details.
- User Tenant Preferences: Manage notification preferences per tenant.
- Inbox and Tenants: Send Inbox notifications to tenant-specific or global inboxes.
- Create or Replace a Tenant:
PUT /tenants/{id}with name, brand_id, parent_tenant_id, properties. - Delete a Tenant: Remove a tenant and disassociate its users.
- Get a Tenant: Retrieve tenant details by ID.
- Get a List of Tenants: List tenants in the workspace.
- Get Users in Tenant: List users belonging to a tenant.
- Create or Replace Default Preferences For Topic: Set tenant-level default preference for a subscription topic.
- Remove Default Preferences For Topic: Delete a tenant default preference.
- Add a User to a Single Tenant: Associate a user with a tenant.
- Add a User to Multiple Tenants: Batch add a user to multiple tenants.
- Get tenants associated with a given user: List a user's tenant memberships.
- Remove User from a Tenant: Disassociate a user from a tenant.
- Remove User From All Associated Tenants: Remove a user from every tenant.
- Send recipe: Multi-tenant sends use
message.context.tenant_id(notmessage.to.tenant_id). The tenant context sets brand, preferences, and routing defaults for the message. - Default preferences: Tenant-level default preferences for a subscription topic use
PUT /tenants/{id}/default_preferences/items/{topic_id}. These live on the tenant, not the user profile. Payload:{ "status": "OPTED_IN", "has_custom_routing": true, "custom_routing": { "channels": ["email", "push"] } }. MCP tool:update_tenant_preference.
Multi-tenant hierarchy setup (ordered checklist)
When wiring brand → parent tenant → child tenant → preferences → users → send:
- Create brand —
POST /brandswithsettings(required). MCP:create_brand - Create parent tenant —
PUT /tenants/{parent_id}withbrand_id. MCP:create_or_update_tenant - Create child tenant —
PUT /tenants/{child_id}withparent_tenant_id. MCP:create_or_update_tenant - Set default preferences on tenant —
PUT /tenants/{id}/default_preferences/items/{topic_id}. MCP:update_tenant_preference - Add user to tenant —
PUT /users/{user_id}/tenants/{tenant_id}. MCP:add_user_to_tenant - Send with tenant context —
POST /sendwithmessage.context.tenant_id. MCP:send_message
Child tenants inherit parent brand and preferences unless overridden. User preferences take final precedence.
Preferences
- Preferences Overview: Let users control which notifications they receive and how.
- Preferences Editor: Configure subscription topics, sections, and channel settings.
- Hosted Preference Center: Deploy a Courier-hosted page for managing notification preferences.
- Embedding Preferences: Integrate preference management components in your React or web app.
- User Preference Logs & Data: Access user preference audit trails and query current preferences.
- Get user's preferences: Fetch all user preferences.
- Get user subscription topic: Fetch user preferences for a specific subscription topic.
- Update or Create user preferences for a specific subscription topic: Set user opt-in/out for a topic.
- How To Configure Preferences via API: Read and update user notification preferences programmatically.
- How To Embed Preferences in React: Add an in-app notification preference center to React.
- How To Set Up a Hosted Preference Center: Create subscription topics and deploy a hosted preference page.
- Subscription topics must exist before use: Create a subscription topic in the Preferences Editor (or via API at
PUT /users/{user_id}/preferences/{topic_id}) before assigning it as a tenant default preference. Setting a default for a non-existent topic silently fails. - Tenant vs user preferences: Tenant default preferences (
PUT /tenants/{id}/default_preferences/items/{topic_id}) set the baseline for all users in that tenant. Individual users override viaPUT /users/{id}/preferences/{topic_id}. At send time, user preferences take precedence over tenant defaults.
Templates & Content
-
What are Templates?: Templates define the content and structure of your notifications.
-
Design Studio Overview: Build multi-channel notifications with Design Studio.
-
Content Blocks: Drag-and-drop content blocks for Design Studio.
-
Manage Templates via API: Template management over the /notifications API.
-
Routing Configuration: Configure reusable routing configurations.
-
Elemental Markup Overview: JSON-based templating format for notification content across channels.
-
Control Flow: Conditional rendering, loops, and channel-specific content in Elemental.
-
Locales: Localize Elemental templates for multiple languages and regions.
-
What are Brands?: Brands define the visual appearance of your notifications.
-
Brand Designer: Customize brand appearance with logos, colors, headers, footers, and custom templates.
-
Brand Snippets: Reusable Handlebars components for notification templates.
-
Handlebars Helpers: Logic, math, string formatting, localization, and control flow for templates.
-
Inserting Data with Variables: Personalize notifications with variables from data, profile, tenant, or brand objects.
-
Localization: Send notifications in multiple languages.
-
Templates API: REST API for listing, creating, updating, and publishing notification templates.
-
Archive Notification Template: Archive a notification template.
-
Create Notification Template: Create a notification template. Templates are created in draft state by default.
-
Get Notification Template: Retrieve a notification template by ID. Returns the published version by default.
-
List Notification Templates: List notification templates in your workspace.
-
Publish Notification Template: Publish a notification template.
-
Replace Notification Template: Replace a notification template. All fields are required.
-
List Notification Template Versions: List versions of a notification template.
-
How to Build Notifications with Elemental: Create notification content programmatically using Courier Elemental.
-
How to Use the Templates API: Manage workspace templates with the REST API.
-
How to Brand Your Notifications: Create and customize Courier Brands for consistent email styling.
-
Design and Send Your First Notification: Create a template, configure a provider, add content, preview, publish, and send.
-
How to Internationalize Notifications: Send multi-language notifications using locale-based conditions.
-
Brand create requires
settings: Minimal valid:{ "name": "My Brand", "settings": { "colors": { "primary": "#000000", "secondary": "#ffffff" } } }. -
V2 template workflow (5 steps):
POST /notifications(create with name + content) →PUT /notifications/{id}/content(optional update) →POST /routing-strategies(create with name + routing) →POST /notifications/{id}/publish(empty body, returns 204) →POST /sendwith"template": "nt_...". Shortcut: pass"state": "PUBLISHED"on create to skip steps 2–4. MCP equivalents:create_notification→update_notification_content→create_routing_strategy→publish_notification→send_message. Full JSON bodies in the "V2 Template Recipe" section under Optional below.
Routing Strategies
- Archive Routing Strategy: Archive a routing strategy. The strategy must not have associated notification templates.
- Create Routing Strategy: Create a routing strategy. Requires
nameandrouting(method + channels). - Get Routing Strategy: Retrieve a routing strategy by ID.
- List Routing Strategies: List routing strategies in your workspace.
- Replace Routing Strategy: Replace a routing strategy. Full document replacement.
- Shared across templates: A single routing strategy can be linked to multiple notification templates. Updating it changes routing for all linked templates.
Inbox
- Get Started with Courier Inbox: Add real-time in-app notifications to web, iOS, and Android apps.
- Authenticate Courier Inbox SDKs: Courier Inbox and toasts use JWTs to authenticate.
- Send an Inbox Message: Send Inbox messages with the Courier Send API.
- Notify with Toasts: Small, dismissable pop-up notifications for Inbox messages.
- Organize Messages with Tabs: Create tabbed views for Inbox messages.
- How to Implement Courier Inbox: Add an in-app notification center powered by JWT-authenticated React components.
- How to Organize Inbox with Tabs: Tag messages at send time and configure tabs in the Inbox SDK.
- How to Send a JWT from Your Backend: Generate user-scoped JWTs for Courier Inbox and Toast.
- Auth required: Inbox requires JWT authentication via
POST /auth/issue-token. The token is scoped to a single user and used by client SDKs.
Automations
- Automation Overview: Build notification workflows with triggers, actions, batching, digests, and conditional logic.
- The Automations Designer: Visual builder for creating notification workflows.
- Ad hoc Automation Steps: Define automation workflows inline via API in a single request.
- Batching: Group multiple events into a single notification.
- Automation Digests: Aggregate user events into scheduled notifications.
- If / Switch: Conditional logic using "If" nodes to branch automation workflows.
- Scheduling: Schedule one-time, recurring, or cron-based automation triggers.
- Throttle Node: Limit automation-triggered messages per user or group within a timeframe.
- Fetch Data: Make HTTP requests through an automation workflow.
- Accessing Dynamic Data: Access dynamic data using the refs object in automations.
- Cancelling An Automation: Cancel automations using a dynamic cancellation token.
- Webhook Trigger: Launch automations from external systems via webhook.
- Inbound Event Triggers: Trigger automations from CourierJS, Segment, and Rudderstack events.
- Debugger: Simulate test events through automation workflows and inspect node-level data.
- Invoke an Ad Hoc Automation: Invoke an ad hoc automation run.
- Invoke an Automation: Invoke an automation run from an automation template.
- List Automations: Get the list of automations.
- Build and Send Your First Automation: Create a multi-step notification workflow in the visual Automations Designer.
- How to Cancel an Automation: Stop in-flight automation runs using cancellation tokens.
- How To Send Automations via API: Invoke automations via the Courier API.
- How to Send Automations with Tenant Context: Invoke automations with tenant-specific branding, overrides, and preferences.
- Cancel recipe: Cancellation uses
cancelation_token(one "l") set at invoke time, then a secondPOST /automations/invokewith{ "automation": { "steps": [{ "action": "cancel", "cancelation_token": "<token>" }] } }. There is no separate/cancelendpoint. - List before invoke: Use
GET /automations(or MCPlist_automations) to discover template IDs before invoking. Template IDs are required forPOST /automations/{id}/invoke.
Journeys
Journeys are visual, multi-step messaging workflows. Lifecycle: create (draft) → publish → invoke.
- Journeys Overview: Build customer messaging experiences with a visual workflow editor.
- Building Journeys: Compose journeys from triggers, send nodes, and function nodes.
- Send Node: Configure which channels your journey uses.
- Starting a Journey: Invoke a journey via the Courier API or from a Segment event.
- Journey Templates: Create and edit notification templates scoped to a journey.
- Branch: Split a journey into conditional paths.
- Delay: Pause journey execution for a duration or until a specific time.
- Fetch Data: Make HTTP requests during journey execution.
- Throttle: Limit how often a user passes through a journey point.
- Create a Journey: Create a new journey in draft state. Use
POST /journeys. - Invoke a Journey: Invoke a journey run from a journey template. Use
POST /journeys/{id}/invoke. - List Journeys: Get the list of journeys.
- Publish a Journey: Publish a draft journey to make it live. Use
POST /journeys/{id}/publish. - How to Create Your First Journey: Build a journey from scratch with triggers, schemas, and send nodes.
- How to Build a Multi-Step Onboarding Journey: Build an onboarding sequence with delays, fetching, branching, and sends.
- Create flow: Create the journey shell via
POST /journeys, add notification templates withPOST /journeys/{id}/templates, wire them into send nodes withPUT /journeys/{id}, then publish withPOST /journeys/{id}/publish. - Send nodes require templates: A journey send node must reference an existing notification template. Create the template first, then assign it to the node.
Analytics & Monitoring
- Analytics Overview: Track notification delivery, monitor status, and debug issues with message logs and audit trails.
- Template Analytics: Track send volume, delivery rates, opens, clicks, and errors per template.
- Message Logs: Track each message's status with filtering by status, provider, recipient, and timeline events.
- Audit Trail: Track workspace user activity including API key changes, publishing events, and integration updates.
- Custom Domain Tracking: Use a custom tracking domain instead of ct0.app for branded link tracking in email.
- Get all audit events: Fetch the list of audit events.
- Get an audit event: Fetch a specific audit event by ID.
- Archive message: Archive a sent message.
- Cancel message: Cancel a message that is currently being delivered.
- Get message: Fetch the status of a message you've previously sent.
- Get message content: Retrieve the rendered content of a sent message.
- Get message history: Fetch the array of events of a message you've previously sent.
- List messages: Fetch the statuses of messages you've previously sent.
- How to Debug Email Delivery Issues: Troubleshoot delivery problems using Courier message logs.
- Message lifecycle: ENQUEUED → SENT → DELIVERED (or UNDELIVERABLE). Use
GET /messages/{id}to check status. TherequestIdfrom/sendmaps to one or more message IDs.
Workspaces & Settings
- Workspace Overview: Environments, API keys, templates, team access, and settings.
- Environments, API Keys, and Assets: Isolated Test and Production environments with distinct API keys.
- Roles and Permissions: Role-based access control for workspace teammates.
- Outbound Webhooks: Receive event notifications for message updates and audience changes.
- Workspace Security Settings: Manage team invites, SSO, and workspace discoverability.
- Okta Integration: Set up Okta SSO and SCIM provisioning with Courier.
- EU Datacenter: European datacenter for data residency and GDPR compliance.
- Create a JWT: Returns a new access token.
- Safe Notification Deployment: Move templates from Test to Production safely.
SDKs
- Get Started with Courier SDKs: Server-side SDKs for sending and client-side SDKs for in-app experiences.
- Courier Node.js SDK: Send notifications from Node.js/TypeScript with typed requests and retries.
- Courier Python SDK: Send notifications from Python with sync/async clients and Pydantic models.
- Courier Go SDK: Send notifications from Go with typed params and automatic retries.
- Courier Ruby SDK: Send notifications from Ruby with Sorbet support and retries.
- Courier Java SDK: Send notifications from Java with builder-pattern requests.
- Courier C# SDK: Send notifications from .NET with strongly typed models and async methods.
- Courier PHP SDK: Send notifications from PHP with typed responses and retries.
- Courier React SDK: Customizable in-app notification center and toasts for React.
- Courier Web Components SDK: In-app notification center, toasts, and preferences using Web Components.
- Courier JS: The API client for Courier's browser SDKs.
- Courier Android SDK: In-app notifications, push, and preferences for Android.
- Courier iOS SDK: In-app notifications, push, and preferences for iOS.
- Courier Flutter SDK: In-app notifications, push, and preferences for Flutter.
- Courier React Native SDK: In-app notifications, push, and preferences for React Native.
Developer Tools
- Build with AI: Use Courier with AI coding agents via the CLI, MCP server, agent skills, and machine-readable docs.
- Courier and Postman: Explore and test Courier's API using the official Postman collection.
- API Reference: Authenticate, explore endpoints, and start integrating with the Courier API.
Brands & Translations
- Create a new brand: Create a brand. Requires
settings. - Delete a brand: Delete a brand by brand ID.
- Get a brand: Fetch a specific brand by brand ID.
- List brands: Get the list of brands.
- Replace a brand: Replace an existing brand with the supplied values.
- Get a translation: Get translations by locale.
- Update translations by locale: Update a translation.
Digests & Advanced Sending
- Send a Message Digest: Aggregate messages into a scheduled digest.
- How To Send Digests: Build scheduled digests using preferences, automations, and subscription topics.
- How To Send Notifications With Segment: Trigger automated notifications from Segment events.
- How to Send Webhook Notifications: Deliver notification payloads to any HTTP endpoint.
- Courier Track Event: Ingest events for automation triggers.
- How to Use Test Events: Preview and validate variables, branding, and content before sending.
Resources
- What is Courier?: Courier is infrastructure for product-to-user communication.
- Courier Help Center: Find the answers to your questions or explore helpful resources.
- Tutorials: Step-by-step guides for designing, sending, and managing notifications with Courier.
Optional
Low-priority reference content. Skip under tight context windows; use the section overviews above for general patterns.
Provider Integrations
- Integrations Overview: Connect Courier to your email, in-app, SMS, push, and chat providers.
- Email Providers: Overview of email provider integrations.
- Amply
- AWS SES
- Gmail
- MailerSend
- Mailgun
- Mailjet
- Mandrill
- OneSignal Email
- Postmark
- Resend
- SendGrid
- SMTP
- SparkPost
- SMS Providers: Overview of SMS provider integrations.
- Africa's Talking
- Azure SMS
- MessageBird
- MessageMedia
- Plivo
- Sinch
- SMSCentral
- Telnyx
- TextUs
- Twilio
- Vonage
- Push Notifications: Overview of push notification integrations.
- Airship
- Apple Push Notifications Service (APNS)
- Beamer
- Expo
- Firebase Cloud Messaging (FCM)
- MagicBell
- NowPush
- OneSignal Push
- Pushbullet
- Pusher
- Pusher Beams
- Chat & Direct Message Providers: Overview of chat and direct message integrations.
- Chat API
- Discord
- Facebook Messenger
- Microsoft Teams
- Slack
- Stream Chat
- Viber
- AWS SNS
- Custom Provider
- Drift
- Intercom
- Opsgenie
- PagerDuty
- Splunk On Call
- Webhook Integration
- Customer Data Platforms (CDP)
- RudderStack
- Segment
- Datadog
- Observability
- New Relic
- OpenTelemetry
Courier Create (Embeddable Designer)
- Courier Create Overview: Manage and customize multi-tenant email templates in React with Courier Create.
- Integrating the Embeddable Designer: Embed and customize the Template Editor in your React application.
- Authenticating the Embeddable Designer: JWT authentication for Courier Create.
- Integrating the Embeddable Brand Editor: Embed tenant branding management in React apps.
- Courier Create API: HTTP reference for tenant template endpoints used by Design Studio.
- Editor Properties: Configuration options for Courier Create Template and Brand Editors.
- Create or Update a Tenant Template: Creates or updates a notification template for a tenant.
- Get a Template in Tenant
- List Templates in Tenant
- Publish a Tenant Template: Publishes a specific version of a notification template for a tenant.
- Get a Specific Template Version: Fetches a specific version of a tenant template.
- How to Use the Courier Create API: Create, iterate, and publish tenant notification templates via API.
Journeys Admin (metrics, versioning, run inspection)
- Run Inspection: Step through individual journey runs to see what happened at every node.
- Metrics: Track send volume, delivery rates, opens, and clicks across journey templates.
- Version History: Track published versions and revert to previous journey versions.
Elemental Elements (individual element types)
- Elements Reference: Complete reference for all Elemental element types.
- Export to Elemental: Convert Designer-built notifications into Elemental JSON.
- Fonts
- Action
- Channel
- Columns
- Comment
- Divider
- Group
- HTML
- Image
- Jsonnet
- List
- Meta
- Quote
- Text
Design Studio Block Details
- Button Blocks
- Text Blocks
- Image Blocks
- HTML Blocks
- Heading Blocks
- Divider Blocks
- Spacer Blocks
- Channels
- Template Settings
- White-Labeling Email Domains
- Template Approval Workflow
Template Designer (legacy V1)
- Email Template CSS Classes
- Email Safe Formatting
- Handlebars Editor for Email Templates
- Overview
- Version History
- Test with Sample Data
- Jsonnet Webhook Designer
- Customizing Email Address Fields
- General Settings
- Using Send Conditions
- Throw on Variable Not Found
Content Blocks (V2 individual block types)
V2 Template Recipe (full JSON bodies)
Complete request bodies for the 5-step V2 notification template workflow.
Step 1 — Create template (required: name, content)
POST /notifications
{
"notification": {
"name": "Order Shipped",
"tags": ["transactional"],
"brand": null,
"subscription": null,
"routing": null,
"content": {
"version": "2022-01-01",
"elements": [
{
"type": "channel",
"channel": "email",
"elements": [
{ "type": "meta", "title": "Your order shipped" },
{ "type": "text", "content": "Hi {{data.name}}, your order {{data.order_id}} is on its way." }
]
}
]
}
},
"state": "DRAFT"
}
Response includes id (e.g. nt_01abc123). Pass "state": "PUBLISHED" to skip steps 2–4.
Step 2 — Update content (optional)
PUT /notifications/{id}/content
{
"content": {
"version": "2022-01-01",
"elements": [
{
"type": "channel",
"channel": "email",
"elements": [
{ "type": "meta", "title": "Updated Subject" },
{ "type": "text", "content": "Updated body text." }
]
}
]
},
"state": "DRAFT"
}
Step 3 — Create routing strategy (required: name, routing)
POST /routing-strategies
{
"name": "Email Only",
"routing": {
"method": "single",
"channels": ["email"]
}
}
Response includes id (e.g. rs_01xyz). Associate with template via PUT /notifications/{id} with "routing": { "strategy_id": "rs_01xyz" }.
Step 4 — Publish
POST /notifications/{id}/publish
{}
Empty body publishes the current draft. Returns 204.
Step 5 — Send
POST /send
{
"message": {
"to": { "user_id": "user-123" },
"template": "nt_01abc123",
"data": { "name": "Alice", "order_id": "ORD-456" }
}
}
Migration Guides
- Migrate from Braze to Courier
- Migrate from Knock to Courier
- Migrate from Novu to Courier
- Migrate from OneSignal to Courier
- Migrate from SuprSend to Courier
Other Optional
- GET Profile
- Segment
- Get Notification Content: Retrieve published or draft content of a notification template.
- Get Submission Checks: Retrieve the checks for a notification template submission.
- Replace Submission Checks: Replace the checks for a notification template submission.
- Cancel Submission: Cancel a notification template submission.
API Reference
- API Reference: Full REST API documentation with request/response schemas for all endpoints.
Workflow automation software for everyone. Automate your work across 7,000+ app integrations—no developers, no IT tickets, no delays.
Dub.co is the open-source link management platform for modern marketing teams to create marketing campaigns, link sharing features, and referral programs.
We help modern software companies drive more up-sells, cross-sells and renewals through industry leading product onboarding, engagement, and adoption.
Respond to customers on any channel, sync with your entire team and turn support conversations into product strategy.
Platform for businesses to send gifts to customers/employees.
Loops makes email marketing for modern SaaS companies easy. It's the best way to create, send and track beautiful email campaigns.
Drive pipeline with 10+ intent data sources, AI, and automation. Scale prospecting, personalization, engagement in one unified workflow.