Courier MCP server
Endpoint: https://mcp.courier.com · Authentication: API key header
Sends notifications and manages Courier users, lists, templates, journeys, preferences, tenants, and brands through the Courier API. Requires a Courier API key in the api_key header.
How do I authenticate?
Create a scoped API key with the provider and configure api_key in your client. Use the generated setup below; do not put the key in the endpoint URL.
Authentication and connection guideConnection specification
- Remote endpoint
https://mcp.courier.com- Live-validated endpoint
https://mcp.courier.com/- Browser access
- Not yet measured
- Declared MCP transport
- Streamable HTTP
- Live-validated MCP transport
- Streamable HTTP — Observed by the latest catalog validation
- Declared authentication
- API key
- Detected authentication
- API key detected or retained from publisher evidence
- Protocol lifecycle
- Stateful MCP · 2025-11-25
- Required header
api_key— Courier API key, sent without a Bearer prefix- Category
- Communication
Product documentation · Source repository · Official listing documentation
Provider guidance
- Initialization succeeded without credentials in the 2026-10-20 audit; tool calls require the api_key header.
More Communication MCP servers · Browse all MCP servers · Test this endpoint in the MCP Playground
Connect it
Live-validated endpoint: https://mcp.courier.com/ · Streamable HTTP. API key authentication uses the publisher-documented header name when available.
Agent prompt for Claude Code or Codex
Add the Courier MCP server to my MCP client configuration and verify that it works.
What it is: Sends notifications and manages Courier users, lists, templates, journeys, preferences, tenants, and brands through the Courier API. Requires a Courier API key in the api_key header.
Server URL: https://mcp.courier.com/
Transport: Streamable HTTP (remote MCP server, no local install).
Authentication: API key. API key authentication uses the publisher-documented header name when available.
Tools (first 25 of 69, as last observed by mcptest): add_bulk_users, add_subscribers_to_list, add_user_to_tenant, archive_journey, archive_journey_template, archive_notification, archive_preference_section, archive_preference_topic, archive_preview_device_set, archive_request, archive_routing_strategy, bulk_add_user_tenants, bulk_add_user_tokens, bulk_replace_user_preferences, bulk_subscribe_to_list, bulk_update_user_preferences, cancel_automation, cancel_broadcast_schedule, cancel_journey, cancel_message, cancel_notification_submission, courier_installation_guide, create_brand, create_broadcast, create_bulk_job.
Reference: https://mcptest.io/servers/courier/
Steps:
1. Work out which MCP client I use (Claude Code, Codex, Cursor, VS Code or another) and add the server under the name "courier" in that client's MCP configuration, user scope unless I ask otherwise.
Claude Code: claude mcp add --transport http --scope user --header 'api_key: '"${COURIER_API_KEY}" 'courier' 'https://mcp.courier.com/'
Other clients: use the setup for that client on the reference page.
2. Never write a credential value into a file that could be committed; reference an environment variable or the client's secret store, and ask me for any value you need.
3. Verify: connect to the server and call tools/list. Confirm the tools above are listed, and report any sign-in step I still have to complete.Claude Code setup
Run in a terminal. This user-scoped entry is available across projects.
claude mcp add --transport http --scope user --header 'api_key: '"${COURIER_API_KEY}" 'courier' 'https://mcp.courier.com/'- Store COURIER_API_KEY in your operating system keychain, secret manager, or protected environment; never commit the value. The api_key header syntax is <COURIER_API_KEY>.
Codex CLI setup
Add to ~/.codex/config.toml, then securely set COURIER_API_KEY_HEADER to the raw credential value, which is the complete api_key header value.
[mcp_servers.courier]
url = "https://mcp.courier.com/"
env_http_headers = { "api_key" = "COURIER_API_KEY_HEADER" }- Store COURIER_API_KEY_HEADER in your operating system keychain, secret manager, or protected environment; never commit the value. Set it to the raw credential value, which is the complete api_key header value.
Cursor setup
Add to .cursor/mcp.json for this project, or ~/.cursor/mcp.json for all projects.
{
"mcpServers": {
"courier": {
"url": "https://mcp.courier.com/",
"headers": {
"api_key": "${env:COURIER_API_KEY}"
}
}
}
}- Store COURIER_API_KEY in your operating system keychain, secret manager, or protected environment; never commit the value. The api_key header syntax is <COURIER_API_KEY>.
VS Code setup
Add to .vscode/mcp.json, or run “MCP: Open User Configuration” for a private user-level entry.
{
"servers": {
"courier": {
"type": "http",
"url": "https://mcp.courier.com/",
"headers": {
"api_key": "${input:courier_api_key}"
}
}
},
"inputs": [
{
"type": "promptString",
"id": "courier_api_key",
"description": "COURIER_API_KEY for Courier",
"password": true
}
]
}- VS Code requests COURIER_API_KEY as a masked input; use a secret manager and do not put a default value in mcp.json. The api_key syntax remains <COURIER_API_KEY>.
Claude setup
Add the endpoint above in Claude:
- Customize > Connectors > Add custom connector
- Team/Enterprise: Organization settings > Connectors > Add > Custom > Web
Claude Desktop setup
Add the endpoint above in Claude Desktop:
- Remote: Customize > Connectors (same as claude.ai)
- Local: Settings > Developer > Edit Config, or Settings > Extensions for .mcpb files
~/Library/Application Support/Claude/claude_desktop_config.json(macOS) or%APPDATA%\Claude\claude_desktop_config.json(Windows), local servers only
ChatGPT setup
Add the endpoint above in ChatGPT:
- ChatGPT web: Plugins > Add custom MCP server, then configure authentication and accept the risk warning
Windsurf setup
Add the endpoint above in Windsurf:
~/.config/devin/mcp_config.json(%APPDATA%\devin\mcp_config.jsonon Windows),serverUrlorurl- Cascade panel > ... > MCPs > Open MCP config file
Gemini CLI setup
Add the endpoint above in Gemini CLI:
gemini mcp add --transport http <name> <url>~/.gemini/settings.json(user) or.gemini/settings.json(project),mcpServers
MCP SDK setup
Add the endpoint above in MCP SDK:
- Programmatic:
new Client(...).connect(new StreamableHTTPClientTransport(url))
Notes for every client
- Provider guidance: Initialization succeeded without credentials in the 2026-10-20 audit; tool calls require the api_key header.
Client compatibility
| Client | Status | Why |
|---|---|---|
| Claude Code | Supported | Claude Code supports Streamable HTTP servers and API key headers. |
| Codex | Supported | Codex supports Streamable HTTP servers and API key headers. |
| Cursor | Supported | Cursor supports Streamable HTTP servers and API key headers. |
| VS Code | Supported | VS Code supports Streamable HTTP servers and API key headers. |
| Claude | Partial | Claude supports API key headers only in limited availability. static_headers: beta, for a limited set of organizations. |
| Claude Desktop | Partial | Claude Desktop supports API key headers only in limited availability. static_headers: beta, for a limited set of organizations. |
| ChatGPT | Not supported | ChatGPT does not support API key headers. ChatGPT cannot present custom API keys. |
| Windsurf | Supported | Windsurf supports Streamable HTTP servers and API key headers. |
| Gemini CLI | Supported | Gemini CLI supports Streamable HTTP servers and API key headers. |
| MCP SDK | Supported | MCP SDK supports Streamable HTTP servers and API key headers. |
Computed from this server's validated transport, protocol and authentication against documented client support. Checks the catalog has not observed are not counted.
Latest validation evidence
- Validation status
- Online when last tested
- Validation checked at
- Oct 26, 2026 at 11:07 AM
- Validation detail
- Negotiated stateful MCP 2025-11-25 at https://mcp.courier.com/; detected transport streamable-http; authentication api-key
Tool inventory
What the catalog validator observed on at https://mcp.courier.com/ without credentials. The live server may have changed since; connect in the Playground for the current list.
Tools provided by Courier 173
69 of 173 shown; 104 omitted to keep the page bounded.
add_bulk_usersNo outputSchemaAdd users to an existing bulk job.
Input
job_id: string, users: arrayjob_id: stringrequiredThe bulk job ID
users: arrayrequiredArray of user objects to add
add_subscribers_to_listNo outputSchemaAppend subscribers to a list without removing existing subscribers.
Input
list_id: string, recipients: arraylist_id: stringrequiredThe list ID
recipients: arrayrequiredRecipients to set on the list
add_user_to_tenantNo outputSchemaAdd a user to a tenant.
Input
profile?: object, tenant_id: string, user_id: stringprofile?: objectoptionalTenant-scoped profile overrides
tenant_id: stringrequiredThe tenant ID
user_id: stringrequiredThe user ID
archive_journeyNo outputSchemaArchive a journey. Archived journeys cannot be invoked but existing runs continue to completion.
Input
journey_id: stringjourney_id: stringrequiredThe journey template ID to archive
archive_journey_templateNo outputSchemaArchive a journey-scoped notification template. Archived templates cannot be sent.
Input
journey_id: string, notification_id: stringjourney_id: stringrequiredThe journey template ID that owns this notification
notification_id: stringrequiredThe notification template ID
archive_notificationNo outputSchemaArchive a notification template by ID.
Input
notification_id: stringnotification_id: stringrequiredThe notification template ID to archive
archive_preference_sectionNo outputSchemaArchive a preference section. The section must be empty: delete its topics first, otherwise the request fails with 409.
Input
section_id: stringsection_id: stringrequiredId of the preference section to archive
archive_preference_topicNo outputSchemaArchive a topic within a section.
Input
section_id: string, topic_id: stringsection_id: stringrequiredId of the preference section
topic_id: stringrequiredId of the subscription preference topic to archive
archive_preview_device_setNo outputSchemaArchive a preview device set. Runs that used it keep their own copy of its devices. The Courier Recommended set cannot be archived.
Input
device_set_id: stringdevice_set_id: stringrequiredThe device set id (pvs_...)
archive_requestNo outputSchemaArchive a send request and all its associated messages by request ID.
Input
request_id: stringrequest_id: stringrequiredThe request ID (requestId returned from /send)
archive_routing_strategyNo outputSchemaArchive a routing strategy. The strategy must not have associated notification templates; unlink all templates before archiving.
Input
routing_strategy_id: stringrouting_strategy_id: stringrequiredThe routing strategy ID to archive
bulk_add_user_tenantsNo outputSchemaAdd a user to multiple tenants at once. A custom profile can be supplied per tenant.
Input
tenants: array, user_id: stringtenants: arrayrequiredArray of tenant associations
user_id: stringrequiredThe user ID
bulk_add_user_tokensNo outputSchemaAdd multiple push/device tokens for a user in one request. Overwrites matching existing tokens.
Input
tokens: array, user_id: stringtokens: arrayrequiredToken records to upsert
user_id: stringrequiredThe user ID
bulk_replace_user_preferencesNo outputSchemaReplace a user's complete set of preference overrides in one request. The topics in the body become the recipient's entire override set: listed topics are created or updated, and every existing override not included is reset to its topic default. An empty `topics` array clears all overrides. Validation-atomic (all-or-nothing).
Input
tenant_id?: string, topics: array, user_id: stringtenant_id?: stringoptionalScope the replacement to a specific tenant context
topics: arrayrequiredThe complete set of topic overrides. An empty array resets every existing override.
user_id: stringrequiredThe user ID
bulk_subscribe_to_listNo outputSchemaReplace all subscribers on a list with the given recipients.
Input
list_id: string, recipients: arraylist_id: stringrequiredThe list ID
recipients: arrayrequiredRecipients to set on the list
bulk_update_user_preferencesNo outputSchemaAdditively create or update a user's preferences for one or more topics in a single request. Only the topics in the body are touched; existing overrides for other topics are left untouched. Partial-success: valid topics are written and returned in `items`, unapplicable ones collected in `errors`.
Input
tenant_id?: string, topics: array, user_id: stringtenant_id?: stringoptionalScope the update to a specific tenant context
topics: arrayrequiredTopics to create or update
user_id: stringrequiredThe user ID
cancel_automationNo outputSchemaCancel a running automation by its cancelation_token. This invokes a second ad-hoc automation with a single cancel step. The token must match the cancelation_token set when the original automation was started. Note: spelling is "cancelation_token" (single "l").
Input
cancelation_token: stringcancelation_token: stringrequiredThe cancelation_token that was set when the automation was originally invoked
cancel_broadcast_scheduleNo outputSchemaCancel a broadcast's scheduled send. The broadcast itself is kept.
Input
broadcast_id: stringbroadcast_id: stringrequiredThe broadcast id
cancel_journeyNo outputSchemaCancel journey runs. Supply EXACTLY ONE of cancelation_token (cancels every run associated with the token) or run_id (cancels a single run). Cancelation is idempotent: a run that already finished or was already canceled is left unchanged.
Input
cancelation_token?: string, run_id?: stringcancelation_token?: stringoptionalCancels every run associated with this token. Mutually exclusive with run_id.
run_id?: stringoptionalCancels a single run by id. Mutually exclusive with cancelation_token.
cancel_messageNo outputSchemaCancel a message that is currently being delivered. Returns the message details with updated status.
Input
message_id: stringmessage_id: stringrequiredThe message ID to cancel
cancel_notification_submissionNo outputSchemaCancel a notification template submission.
Input
notification_id: string, submission_id: stringnotification_id: stringrequiredThe notification template ID
submission_id: stringrequiredThe submission ID to cancel
courier_installation_guideNo outputSchemaGet the Courier SDK installation guide for one platform: the install command, a quick-start code sample and the relevant doc links. This is the answer to "how do I integrate Courier" or "how do I get started". Client-side platforms need a JWT to authenticate; each guide says so and names the tool that issues one.
Input
platform: stringplatform: stringrequiredWhich SDK to return the installation guide for.
create_brandNo outputSchemaCreate a new brand. The API requires settings — omitting it returns a 400. If you do not have specific brand colors, omit settings and a safe default will be used automatically (black primary, white secondary). Example: { name: "Acme", settings: { colors: { primary: "#1a73e8", secondary: "#ffffff" } } }.
Input
id?: string, name: string, settings?: object, snippets?: objectid?: stringoptionalOptional brand ID; auto-generated if omitted
name: stringrequiredBrand display name
settings?: objectoptionalBrand appearance settings. If omitted, defaults to { colors: { primary: "#000000", secondary: "#ffffff" } }.
snippets?: objectoptionalBrand snippets
create_broadcastNo outputSchemaCreate a broadcast: a one-off message to a list or audience on a single channel. It starts as a draft with no content; add content with put_broadcast_content, then send_broadcast or schedule_broadcast.
Input
channel: string, name: stringchannel: stringrequiredThe single delivery channel for this broadcast
name: stringrequiredHuman-readable name
create_bulk_jobNo outputSchemaCreate a new bulk job for sending messages to multiple recipients. Workflow: create_bulk_job → add_bulk_users → run_bulk_job.
Input
message: objectmessage: objectrequiredBulk message definition with event/template and content
create_journeyNo outputSchemaCreate a new journey. Always created as a draft; making it live is a separate step this tool cannot perform. Send two nodes: the trigger, and an exit node last. Both are required — a create with no exit node is rejected, and the API reports that as "exit node must be the last node in the journey" even when no exit was sent at all. Send and delay nodes are added afterwards by replace_journey, once journey-scoped templates exist. Node ids are server-generated; do NOT include an id field. Example: { name: "Welcome Journey", nodes: [{ type: "trigger", trigger_type: "api-invoke" }, { type: "exit" }
Input
enabled?: boolean, name: string, nodes: array, state?: stringenabled?: booleanoptionalWhether the journey is active. Defaults to true.
name: stringrequiredJourney display name
nodes: arrayrequiredThe trigger node, then a terminal exit node — both required. Send and delay nodes are added later by replace_journey. Node ids are server-generated — do NOT include an id field. Example: [{ type: "trigger", trigger_type: "api-invoke" }, { type: "exit" }].
state?: stringoptionalMust be "DRAFT". These tools cannot publish.
create_journey_templateNo outputSchemaCreate a notification template scoped to a journey. Always created as a draft; making it live is a separate step this tool cannot perform. The template can then be referenced in journey send nodes. content.elements must be wrapped in a channel block — the API rejects bare elements. Example: { journey_id: "j-abc", channel: "email", notification: { name: "Welcome Email", tags: [], brand: null, subscription: null, content: { version: "2022-01-01", elements: [{ type: "channel", channel: "email", elements: [{ type: "text", content: "Hello!" }] }] } } }. The result carries a "verification" object co
Input
channel: string, journey_id: string, notification: object, provider_key?: string, state?: stringchannel: stringrequiredChannel for this template (e.g. "email", "push", "sms", "inbox")
journey_id: stringrequiredThe journey template ID. Copy it exactly, character for character, from the response that returned it — never retype it from memory or reconstruct it.
notification: objectrequiredNotification template definition
provider_key?: stringoptionalSpecific provider key to target
state?: stringoptionalMust be "DRAFT". These tools cannot publish.
create_listNo outputSchemaCreate or update a list by list ID.
Input
list_id: string, name: stringlist_id: stringrequiredThe list ID
name: stringrequiredDisplay name for the list
create_notificationNo outputSchemaCreate a V2 notification template. name is required. Content may be provided inline or set separately afterwards. A newly created template is a draft; making it live is a separate step this tool cannot perform. Link a routing strategy via notification.routing.strategy_id to control which channels are used. Example: { notification: { name: 'welcome-email', tags: [], brand: null, subscription: null, routing: { strategy_id: 'rs_01abc' }, content: { version: '2022-01-01', elements: [] } } }.
Input
notification: object, state?: stringnotification: objectrequiredNotification template payload
state?: stringoptionalMust be "DRAFT". These tools cannot publish.
create_or_merge_userNo outputSchemaCreate a new user profile or merge supplied values into an existing profile (POST). Existing fields not included are preserved.
Input
profile?: object, user_id: stringprofile?: objectoptionalProfile data to create or merge (e.g. { email: "...", phone_number: "..." })
user_id: stringrequiredThe user ID
create_or_replace_user_push_tokenNo outputSchemaCreate or replace a push/device token for a user.
Input
device?: object, provider_key: string, token: string, user_id: stringdevice?: objectoptionalDevice metadata
provider_key: stringrequiredPush provider
token: stringrequiredThe token string
user_id: stringrequiredThe user ID
create_or_update_tenantNo outputSchemaCreate or replace a tenant. Tenants represent organizations or groups that users belong to.
Input
brand_id?: string, default_preferences?: object, name: string, parent_tenant_id?: string, properties?: object, tenant_id: string, user_profile?: objectbrand_id?: stringoptionalBrand ID to associate with this tenant
default_preferences?: objectoptionalDefault notification preferences applied to users in this tenant. Example: { "items": [{ "id": "topic_abc", "status": "OPTED_IN", "type": "subscription_topic" }] }
name: stringrequiredDisplay name for the tenant
parent_tenant_id?: stringoptionalParent tenant ID for hierarchical tenants
properties?: objectoptionalCustom properties for the tenant
tenant_id: stringrequiredThe tenant ID
user_profile?: objectoptionalDefault profile data for users in this tenant
create_preference_sectionNo outputSchemaCreate a preference section in your workspace. The section id is generated and returned. Add topics afterwards with create_preference_topic.
Input
has_custom_routing?: boolean, name: string, routing_options?: arrayhas_custom_routing?: booleanoptionalWhether the section defines custom routing for its topics
name: stringrequiredHuman-readable name for the section
routing_options?: arrayoptionalDefault channels for the section. Defaults to empty if omitted.
create_preference_topicNo outputSchemaCreate a subscription preference topic inside a section. The topic id is generated and returned. Fails with 404 if the section does not exist.
Input
allowed_preferences?: array, default_status: string, digest?: any, include_unsubscribe_header?: boolean, name: string, routing_options?: array, section_id: string, topic_data?: objectallowed_preferences?: arrayoptionalPreference controls a recipient may customize for this topic
default_status: stringrequiredDefault subscription status applied when a recipient has not set their own
digest?: anyoptionalBatch this topic's notifications into a scheduled digest. Omit to leave any existing digest untouched; pass null to turn it off.
include_unsubscribe_header?: booleanoptionalWhether to include a list-unsubscribe header on emails for this topic
name: stringrequiredHuman-readable name for the preference topic
routing_options?: arrayoptionalDefault channels delivered for this topic. Defaults to empty if omitted.
section_id: stringrequiredId of the preference section to create the topic in
topic_data?: objectoptionalArbitrary metadata associated with the topic
create_preview_device_setNo outputSchemaCreate a named, reusable set of preview devices.
Input
device_ids: array, name: stringdevice_ids: arrayrequiredDevice ids (pvd_...) from list_preview_devices. An id the catalog does not list is rejected.
name: stringrequiredHuman-readable name for the set
create_preview_runNo outputSchemaRender a template's email on real email clients and capture screenshots. Pass exactly one of device_set_id or device_ids. Each run is billed to the workspace's previews add-on. The run starts PENDING, so poll get_preview_run for the results.
Input
data?: object, device_ids?: array, device_set_id?: string, locale?: string, template_id: string, template_version?: stringdata?: objectoptionalVariables for the template, the same shape as the data a send would carry
device_ids?: arrayoptionalDevice ids (pvd_...) from list_preview_devices. An id the catalog does not list is rejected.
device_set_id?: stringoptionalA saved device set id (pvs_...). Use the Courier Recommended set from list_preview_device_sets for a sensible default.
locale?: stringoptionalLocale to render, e.g. "en-US"
template_id: stringrequiredThe notification template id (nt_...). It must be a Design Studio template with an email channel.
template_version?: stringoptionalWhich version renders: omit for the latest draft, "published" for the live version, or a publish such as "v002".
create_providerNo outputSchemaCreate a new provider (integration) configuration. Once routing strategies or notification templates reference this config, credential or settings mistakes can affect live sends—confirm provider key and settings against list_provider_catalog before saving. The provider field must be a known Courier provider key.
Input
alias?: string, provider: string, settings?: object, title?: stringalias?: stringoptionalShort alias for referencing this provider
provider: stringrequiredProvider key from the catalog (e.g. sendgrid, twilio, firebase-fcm)
settings?: objectoptionalProvider-specific settings (API keys, credentials, etc.)
title?: stringoptionalDisplay name for this provider configuration
create_routing_strategyNo outputSchemaCreate a routing strategy defining how notifications are delivered across channels and providers.
Input
channels?: object, description?: string, name: string, providers?: object, routing: object, tags?: arraychannels?: objectoptionalPer-channel delivery configuration
description?: stringoptionalDescription of the routing strategy
name: stringrequiredHuman-readable name for the routing strategy
providers?: objectoptionalPer-provider delivery configuration
routing: objectrequiredRouting tree defining channel selection method and order
tags?: arrayoptionalTags for categorization
delete_audienceNo outputSchemaDelete an audience by its ID.
Input
audience_id: stringaudience_id: stringrequiredThe audience ID to delete
delete_brandNo outputSchemaDelete a brand by its ID.
Input
brand_id: stringbrand_id: stringrequiredThe brand ID to delete
delete_broadcastNo outputSchemaDelete a broadcast.
Input
broadcast_id: stringbroadcast_id: stringrequiredThe broadcast id
delete_listNo outputSchemaDelete a list by its ID.
Input
list_id: stringlist_id: stringrequiredThe list ID
delete_profileNo outputSchemaDelete a user profile permanently.
Input
user_id: stringuser_id: stringrequiredThe user ID to delete
delete_providerNo outputSchemaDelete a provider configuration. Returns 409 if the provider is still referenced by routing or notifications.
Input
provider_id: stringprovider_id: stringrequiredThe provider configuration ID to delete
delete_tenantNo outputSchemaDelete a tenant by its ID.
Input
tenant_id: stringtenant_id: stringrequiredThe tenant ID to delete
delete_tenant_preferenceNo outputSchemaRemove default notification preference for a topic from a tenant.
Input
tenant_id: string, topic_id: stringtenant_id: stringrequiredThe tenant ID
topic_id: stringrequiredThe subscription topic ID
delete_tenant_templateNo outputSchemaDelete a tenant notification template. Returns 204 on success, 404 if the template does not exist for this tenant.
Input
template_id: string, tenant_id: stringtemplate_id: stringrequiredThe notification template ID to delete
tenant_id: stringrequiredThe tenant ID that owns the template
delete_user_list_subscriptionsNo outputSchemaDelete all list subscriptions for a user.
Input
user_id: stringuser_id: stringrequiredThe user ID
delete_user_preference_topicNo outputSchemaDelete a user's preference for a specific subscription topic, reverting it to the topic's default status.
Input
topic_id: string, user_id: stringtopic_id: stringrequiredThe subscription topic ID
user_id: stringrequiredThe user ID
delete_user_tokenNo outputSchemaDelete a specific push token for a user.
Input
token: string, user_id: stringtoken: stringrequiredThe token identifier to delete
user_id: stringrequiredThe user ID
duplicate_broadcastNo outputSchemaCopy a broadcast into a new draft. The original is left unchanged.
Input
broadcast_id: stringbroadcast_id: stringrequiredThe broadcast to copy
generate_jwt_for_userNo outputSchemaGenerate a JWT authentication token for a user. Used for client-side SDK auth (Inbox, Preferences, etc.).
Input
expires_in?: string, scopes?: array, user_id: stringexpires_in?: stringoptionalToken expiry duration (e.g. "1h", "2 days")
scopes?: arrayoptionalPermission scopes for the token
user_id: stringrequiredThe user ID to scope the token to
get_audienceNo outputSchemaGet one audience by ID, including the filter that defines its membership. Read this to explain why someone is or is not in an audience — the filter is the rule, not a stored member list. Use list_audience_members for who currently matches.
Input
audience_id: stringaudience_id: stringrequiredThe audience ID
get_audit_eventNo outputSchemaGet a specific audit event by its ID.
Input
audit_event_id: stringaudit_event_id: stringrequiredThe audit event ID
get_brandNo outputSchemaGet one brand by ID, including its colors, logo and styling settings. Read this to describe what a template referencing this brand will actually look like.
Input
brand_id: stringbrand_id: stringrequiredThe brand ID
get_broadcastNo outputSchemaGet a broadcast by id, including its channel and send or schedule state.
Input
broadcast_id: stringbroadcast_id: stringrequiredThe broadcast id
get_broadcast_contentNo outputSchemaGet a broadcast's Elemental content.
Input
broadcast_id: stringbroadcast_id: stringrequiredThe broadcast id
get_bulk_jobNo outputSchemaGet the status of a bulk job.
Input
job_id: stringjob_id: stringrequiredThe bulk job ID
get_journeyNo outputSchemaGet a journey by ID. Pass version=draft to retrieve the working draft, or version=vN for a historical version. Defaults to published.
Input
journey_id: string, version?: stringjourney_id: stringrequiredThe journey template ID. Copy it exactly, character for character, from the response that returned it — never retype it from memory or reconstruct it.
version?: stringoptionalVersion to retrieve: "draft", "published" (default), or a version string like "v001"
get_journey_runNo outputSchemaGet one journey run by id: its journey, status, and timestamps.
Input
run_id: stringrun_id: stringrequiredThe journey run id
get_journey_templateNo outputSchemaGet a journey-scoped notification template by notification ID. Pass version=draft to retrieve the working draft (required before the template has been published). Defaults to published.
Input
journey_id: string, notification_id: string, version?: stringjourney_id: stringrequiredThe journey template ID that owns this notification. Copy it exactly, character for character, from the response that returned it — never retype it from memory or reconstruct it.
notification_id: stringrequiredThe notification template ID. Copy it exactly, character for character, from the response that returned it — never retype it from memory or reconstruct it.
version?: stringoptionalVersion to retrieve: "draft", "published" (default), or "vN"
get_journey_template_contentNo outputSchemaFetch the elemental content of a journey-scoped notification template. Pass version=draft for the working draft, or vN for a historical version. Defaults to published.
Input
journey_id: string, notification_id: string, version?: stringjourney_id: stringrequiredThe journey template ID that owns this notification. Copy it exactly, character for character, from the response that returned it — never retype it from memory or reconstruct it.
notification_id: stringrequiredThe notification template ID. Copy it exactly, character for character, from the response that returned it — never retype it from memory or reconstruct it.
version?: stringoptionalVersion to retrieve: "draft", "published" (default), or a version string like "v001"
get_listNo outputSchemaGet one list by its ID, including its name and current state.
Input
list_id: stringlist_id: stringrequiredThe list ID
get_list_subscribersNo outputSchemaList the users subscribed to a list. Use this to confirm whether someone was actually on a list at all — a subscription here is the reason a list-addressed send reached them.
Input
cursor?: string, list_id: stringcursor?: stringoptionalFor fetching the next page. This is an opaque token — never decode it, edit it, or rebuild it. Pass it back exactly as it appeared in the previous response's cursor field, byte for byte. Omit this entirely when you don't have one from a prior response of this exact call.
list_id: stringrequiredThe list ID
get_messageNo outputSchemaGet the full details and status of a single message by its ID.
Input
message_id: stringmessage_id: stringrequiredThe message ID to retrieve
get_message_contentNo outputSchemaGet the rendered content (HTML, text, subject) of a previously sent message.
Input
message_id: stringmessage_id: stringrequiredThe message ID
get_message_historyNo outputSchemaGet the event history for a message, showing each step in the delivery pipeline (enqueued, sent, delivered, etc.).
Input
message_id: string, type?: stringmessage_id: stringrequiredThe message ID
type?: stringoptionalFilter by event type
get_notificationNo outputSchemaRetrieve a notification template by ID. Optionally request draft, published, or a version such as v001.
Input
notification_id: string, version?: stringnotification_id: stringrequiredThe notification template ID. Copy it exactly, character for character, from the response that returned it — never retype it from memory or reconstruct it.
version?: stringoptionalVersion to retrieve: "draft", "published" (default — omit this to get it), or a version string like "v001"
get_notification_contentNo outputSchemaGet the published content blocks of a notification template.
Input
notification_id: stringnotification_id: stringrequiredThe notification template ID. Copy it exactly, character for character, from the response that returned it — never retype it from memory or reconstruct it.