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 guide

Connection 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

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

Authorization setup

API key required

Use the publisher-documented API key route. Keep the credential in protected client storage and replace only the named placeholder at connection time.

Safe header template: <COURIER_API_KEY>. Replace only the named placeholder in protected client configuration.

Publisher documentation

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.
MCP client

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.json on Windows), serverUrl or url
  • 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

ClientStatusWhy
Claude CodeSupportedClaude Code supports Streamable HTTP servers and API key headers.
CodexSupportedCodex supports Streamable HTTP servers and API key headers.
CursorSupportedCursor supports Streamable HTTP servers and API key headers.
VS CodeSupportedVS Code supports Streamable HTTP servers and API key headers.
ClaudePartialClaude supports API key headers only in limited availability. static_headers: beta, for a limited set of organizations.
Claude DesktopPartialClaude Desktop supports API key headers only in limited availability. static_headers: beta, for a limited set of organizations.
ChatGPTNot supportedChatGPT does not support API key headers. ChatGPT cannot present custom API keys.
WindsurfSupportedWindsurf supports Streamable HTTP servers and API key headers.
Gemini CLISupportedGemini CLI supports Streamable HTTP servers and API key headers.
MCP SDKSupportedMCP 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.

Similar servers

  • Slack — Remote MCP server for Slack messages, channels, users, canvases, and collaboration context. OAuth 2.1
  • Intercom — Intercom's hosted MCP server provides customer-support context through conversations, contacts, search, and retrieval tools. OAuth 2.1
  • Resend — Sends and schedules email and manages Resend domains, audiences, contacts, broadcasts, and API keys. Requires Resend sign-in through OAuth. OAuth 2.1
  • Vapi — Lists, creates, and updates Vapi voice assistants, phone numbers, and tools and places outbound calls. Requires a Vapi API key as a bearer token. Bearer token
  • AgentMail — Creates and manages AgentMail inboxes, threads, messages, drafts, and attachments for AI agents. Requires AgentMail sign-in through OAuth; an x-api-key header is also documented. OAuth 2.1
  • Infobip SMS — Sends, previews, and schedules SMS messages through Infobip and reads delivery reports and message logs. Requires Infobip sign-in through OAuth; an App API key header is also documented. OAuth 2.1

Guides for this server

Watch this server for breaking changes

Share and embed

Maintain Courier? Embed this badge in your README. It follows the latest catalog validation result and links to this server profile.

mcptest.io: ready

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 outputSchema

    Add users to an existing bulk job.

    Input job_id: string, users: array
    • job_id: stringrequired

      The bulk job ID

    • users: arrayrequired

      Array of user objects to add

  • add_subscribers_to_listNo outputSchema

    Append subscribers to a list without removing existing subscribers.

    Input list_id: string, recipients: array
    • list_id: stringrequired

      The list ID

    • recipients: arrayrequired

      Recipients to set on the list

  • add_user_to_tenantNo outputSchema

    Add a user to a tenant.

    Input profile?: object, tenant_id: string, user_id: string
    • profile?: objectoptional

      Tenant-scoped profile overrides

    • tenant_id: stringrequired

      The tenant ID

    • user_id: stringrequired

      The user ID

  • archive_journeyNo outputSchema

    Archive a journey. Archived journeys cannot be invoked but existing runs continue to completion.

    Input journey_id: string
    • journey_id: stringrequired

      The journey template ID to archive

  • archive_journey_templateNo outputSchema

    Archive a journey-scoped notification template. Archived templates cannot be sent.

    Input journey_id: string, notification_id: string
    • journey_id: stringrequired

      The journey template ID that owns this notification

    • notification_id: stringrequired

      The notification template ID

  • archive_notificationNo outputSchema

    Archive a notification template by ID.

    Input notification_id: string
    • notification_id: stringrequired

      The notification template ID to archive

  • archive_preference_sectionNo outputSchema

    Archive a preference section. The section must be empty: delete its topics first, otherwise the request fails with 409.

    Input section_id: string
    • section_id: stringrequired

      Id of the preference section to archive

  • archive_preference_topicNo outputSchema

    Archive a topic within a section.

    Input section_id: string, topic_id: string
    • section_id: stringrequired

      Id of the preference section

    • topic_id: stringrequired

      Id of the subscription preference topic to archive

  • archive_preview_device_setNo outputSchema

    Archive 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: string
    • device_set_id: stringrequired

      The device set id (pvs_...)

  • archive_requestNo outputSchema

    Archive a send request and all its associated messages by request ID.

    Input request_id: string
    • request_id: stringrequired

      The request ID (requestId returned from /send)

  • archive_routing_strategyNo outputSchema

    Archive a routing strategy. The strategy must not have associated notification templates; unlink all templates before archiving.

    Input routing_strategy_id: string
    • routing_strategy_id: stringrequired

      The routing strategy ID to archive

  • bulk_add_user_tenantsNo outputSchema

    Add a user to multiple tenants at once. A custom profile can be supplied per tenant.

    Input tenants: array, user_id: string
    • tenants: arrayrequired

      Array of tenant associations

    • user_id: stringrequired

      The user ID

  • bulk_add_user_tokensNo outputSchema

    Add multiple push/device tokens for a user in one request. Overwrites matching existing tokens.

    Input tokens: array, user_id: string
    • tokens: arrayrequired

      Token records to upsert

    • user_id: stringrequired

      The user ID

  • bulk_replace_user_preferencesNo outputSchema

    Replace 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: string
    • tenant_id?: stringoptional

      Scope the replacement to a specific tenant context

    • topics: arrayrequired

      The complete set of topic overrides. An empty array resets every existing override.

    • user_id: stringrequired

      The user ID

  • bulk_subscribe_to_listNo outputSchema

    Replace all subscribers on a list with the given recipients.

    Input list_id: string, recipients: array
    • list_id: stringrequired

      The list ID

    • recipients: arrayrequired

      Recipients to set on the list

  • bulk_update_user_preferencesNo outputSchema

    Additively 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: string
    • tenant_id?: stringoptional

      Scope the update to a specific tenant context

    • topics: arrayrequired

      Topics to create or update

    • user_id: stringrequired

      The user ID

  • cancel_automationNo outputSchema

    Cancel 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: string
    • cancelation_token: stringrequired

      The cancelation_token that was set when the automation was originally invoked

  • cancel_broadcast_scheduleNo outputSchema

    Cancel a broadcast's scheduled send. The broadcast itself is kept.

    Input broadcast_id: string
    • broadcast_id: stringrequired

      The broadcast id

  • cancel_journeyNo outputSchema

    Cancel 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?: string
    • cancelation_token?: stringoptional

      Cancels every run associated with this token. Mutually exclusive with run_id.

    • run_id?: stringoptional

      Cancels a single run by id. Mutually exclusive with cancelation_token.

  • cancel_messageNo outputSchema

    Cancel a message that is currently being delivered. Returns the message details with updated status.

    Input message_id: string
    • message_id: stringrequired

      The message ID to cancel

  • cancel_notification_submissionNo outputSchema

    Cancel a notification template submission.

    Input notification_id: string, submission_id: string
    • notification_id: stringrequired

      The notification template ID

    • submission_id: stringrequired

      The submission ID to cancel

  • courier_installation_guideNo outputSchema

    Get 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: string
    • platform: stringrequired

      Which SDK to return the installation guide for.

  • create_brandNo outputSchema

    Create 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?: object
    • id?: stringoptional

      Optional brand ID; auto-generated if omitted

    • name: stringrequired

      Brand display name

    • settings?: objectoptional

      Brand appearance settings. If omitted, defaults to { colors: { primary: "#000000", secondary: "#ffffff" } }.

    • snippets?: objectoptional

      Brand snippets

  • create_broadcastNo outputSchema

    Create 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: string
    • channel: stringrequired

      The single delivery channel for this broadcast

    • name: stringrequired

      Human-readable name

  • create_bulk_jobNo outputSchema

    Create a new bulk job for sending messages to multiple recipients. Workflow: create_bulk_job → add_bulk_users → run_bulk_job.

    Input message: object
    • message: objectrequired

      Bulk message definition with event/template and content

  • create_journeyNo outputSchema

    Create 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?: string
    • enabled?: booleanoptional

      Whether the journey is active. Defaults to true.

    • name: stringrequired

      Journey display name

    • nodes: arrayrequired

      The 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?: stringoptional

      Must be "DRAFT". These tools cannot publish.

  • create_journey_templateNo outputSchema

    Create 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?: string
    • channel: stringrequired

      Channel for this template (e.g. "email", "push", "sms", "inbox")

    • journey_id: stringrequired

      The journey template ID. Copy it exactly, character for character, from the response that returned it — never retype it from memory or reconstruct it.

    • notification: objectrequired

      Notification template definition

    • provider_key?: stringoptional

      Specific provider key to target

    • state?: stringoptional

      Must be "DRAFT". These tools cannot publish.

  • create_listNo outputSchema

    Create or update a list by list ID.

    Input list_id: string, name: string
    • list_id: stringrequired

      The list ID

    • name: stringrequired

      Display name for the list

  • create_notificationNo outputSchema

    Create 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?: string
    • notification: objectrequired

      Notification template payload

    • state?: stringoptional

      Must be "DRAFT". These tools cannot publish.

  • create_or_merge_userNo outputSchema

    Create a new user profile or merge supplied values into an existing profile (POST). Existing fields not included are preserved.

    Input profile?: object, user_id: string
    • profile?: objectoptional

      Profile data to create or merge (e.g. { email: "...", phone_number: "..." })

    • user_id: stringrequired

      The user ID

  • create_or_replace_user_push_tokenNo outputSchema

    Create or replace a push/device token for a user.

    Input device?: object, provider_key: string, token: string, user_id: string
    • device?: objectoptional

      Device metadata

    • provider_key: stringrequired

      Push provider

    • token: stringrequired

      The token string

    • user_id: stringrequired

      The user ID

  • create_or_update_tenantNo outputSchema

    Create 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?: object
    • brand_id?: stringoptional

      Brand ID to associate with this tenant

    • default_preferences?: objectoptional

      Default notification preferences applied to users in this tenant. Example: { "items": [{ "id": "topic_abc", "status": "OPTED_IN", "type": "subscription_topic" }] }

    • name: stringrequired

      Display name for the tenant

    • parent_tenant_id?: stringoptional

      Parent tenant ID for hierarchical tenants

    • properties?: objectoptional

      Custom properties for the tenant

    • tenant_id: stringrequired

      The tenant ID

    • user_profile?: objectoptional

      Default profile data for users in this tenant

  • create_preference_sectionNo outputSchema

    Create 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?: array
    • has_custom_routing?: booleanoptional

      Whether the section defines custom routing for its topics

    • name: stringrequired

      Human-readable name for the section

    • routing_options?: arrayoptional

      Default channels for the section. Defaults to empty if omitted.

  • create_preference_topicNo outputSchema

    Create 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?: object
    • allowed_preferences?: arrayoptional

      Preference controls a recipient may customize for this topic

    • default_status: stringrequired

      Default subscription status applied when a recipient has not set their own

    • digest?: anyoptional

      Batch this topic's notifications into a scheduled digest. Omit to leave any existing digest untouched; pass null to turn it off.

    • include_unsubscribe_header?: booleanoptional

      Whether to include a list-unsubscribe header on emails for this topic

    • name: stringrequired

      Human-readable name for the preference topic

    • routing_options?: arrayoptional

      Default channels delivered for this topic. Defaults to empty if omitted.

    • section_id: stringrequired

      Id of the preference section to create the topic in

    • topic_data?: objectoptional

      Arbitrary metadata associated with the topic

  • create_preview_device_setNo outputSchema

    Create a named, reusable set of preview devices.

    Input device_ids: array, name: string
    • device_ids: arrayrequired

      Device ids (pvd_...) from list_preview_devices. An id the catalog does not list is rejected.

    • name: stringrequired

      Human-readable name for the set

  • create_preview_runNo outputSchema

    Render 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?: string
    • data?: objectoptional

      Variables for the template, the same shape as the data a send would carry

    • device_ids?: arrayoptional

      Device ids (pvd_...) from list_preview_devices. An id the catalog does not list is rejected.

    • device_set_id?: stringoptional

      A saved device set id (pvs_...). Use the Courier Recommended set from list_preview_device_sets for a sensible default.

    • locale?: stringoptional

      Locale to render, e.g. "en-US"

    • template_id: stringrequired

      The notification template id (nt_...). It must be a Design Studio template with an email channel.

    • template_version?: stringoptional

      Which version renders: omit for the latest draft, "published" for the live version, or a publish such as "v002".

  • create_providerNo outputSchema

    Create 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?: string
    • alias?: stringoptional

      Short alias for referencing this provider

    • provider: stringrequired

      Provider key from the catalog (e.g. sendgrid, twilio, firebase-fcm)

    • settings?: objectoptional

      Provider-specific settings (API keys, credentials, etc.)

    • title?: stringoptional

      Display name for this provider configuration

  • create_routing_strategyNo outputSchema

    Create a routing strategy defining how notifications are delivered across channels and providers.

    Input channels?: object, description?: string, name: string, providers?: object, routing: object, tags?: array
    • channels?: objectoptional

      Per-channel delivery configuration

    • description?: stringoptional

      Description of the routing strategy

    • name: stringrequired

      Human-readable name for the routing strategy

    • providers?: objectoptional

      Per-provider delivery configuration

    • routing: objectrequired

      Routing tree defining channel selection method and order

    • tags?: arrayoptional

      Tags for categorization

  • delete_audienceNo outputSchema

    Delete an audience by its ID.

    Input audience_id: string
    • audience_id: stringrequired

      The audience ID to delete

  • delete_brandNo outputSchema

    Delete a brand by its ID.

    Input brand_id: string
    • brand_id: stringrequired

      The brand ID to delete

  • delete_broadcastNo outputSchema

    Delete a broadcast.

    Input broadcast_id: string
    • broadcast_id: stringrequired

      The broadcast id

  • delete_listNo outputSchema

    Delete a list by its ID.

    Input list_id: string
    • list_id: stringrequired

      The list ID

  • delete_profileNo outputSchema

    Delete a user profile permanently.

    Input user_id: string
    • user_id: stringrequired

      The user ID to delete

  • delete_providerNo outputSchema

    Delete a provider configuration. Returns 409 if the provider is still referenced by routing or notifications.

    Input provider_id: string
    • provider_id: stringrequired

      The provider configuration ID to delete

  • delete_tenantNo outputSchema

    Delete a tenant by its ID.

    Input tenant_id: string
    • tenant_id: stringrequired

      The tenant ID to delete

  • delete_tenant_preferenceNo outputSchema

    Remove default notification preference for a topic from a tenant.

    Input tenant_id: string, topic_id: string
    • tenant_id: stringrequired

      The tenant ID

    • topic_id: stringrequired

      The subscription topic ID

  • delete_tenant_templateNo outputSchema

    Delete a tenant notification template. Returns 204 on success, 404 if the template does not exist for this tenant.

    Input template_id: string, tenant_id: string
    • template_id: stringrequired

      The notification template ID to delete

    • tenant_id: stringrequired

      The tenant ID that owns the template

  • delete_user_list_subscriptionsNo outputSchema

    Delete all list subscriptions for a user.

    Input user_id: string
    • user_id: stringrequired

      The user ID

  • delete_user_preference_topicNo outputSchema

    Delete a user's preference for a specific subscription topic, reverting it to the topic's default status.

    Input topic_id: string, user_id: string
    • topic_id: stringrequired

      The subscription topic ID

    • user_id: stringrequired

      The user ID

  • delete_user_tokenNo outputSchema

    Delete a specific push token for a user.

    Input token: string, user_id: string
    • token: stringrequired

      The token identifier to delete

    • user_id: stringrequired

      The user ID

  • duplicate_broadcastNo outputSchema

    Copy a broadcast into a new draft. The original is left unchanged.

    Input broadcast_id: string
    • broadcast_id: stringrequired

      The broadcast to copy

  • generate_jwt_for_userNo outputSchema

    Generate a JWT authentication token for a user. Used for client-side SDK auth (Inbox, Preferences, etc.).

    Input expires_in?: string, scopes?: array, user_id: string
    • expires_in?: stringoptional

      Token expiry duration (e.g. "1h", "2 days")

    • scopes?: arrayoptional

      Permission scopes for the token

    • user_id: stringrequired

      The user ID to scope the token to

  • get_audienceNo outputSchema

    Get 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: string
    • audience_id: stringrequired

      The audience ID

  • get_audit_eventNo outputSchema

    Get a specific audit event by its ID.

    Input audit_event_id: string
    • audit_event_id: stringrequired

      The audit event ID

  • get_brandNo outputSchema

    Get 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: string
    • brand_id: stringrequired

      The brand ID

  • get_broadcastNo outputSchema

    Get a broadcast by id, including its channel and send or schedule state.

    Input broadcast_id: string
    • broadcast_id: stringrequired

      The broadcast id

  • get_broadcast_contentNo outputSchema

    Get a broadcast's Elemental content.

    Input broadcast_id: string
    • broadcast_id: stringrequired

      The broadcast id

  • get_bulk_jobNo outputSchema

    Get the status of a bulk job.

    Input job_id: string
    • job_id: stringrequired

      The bulk job ID

  • get_journeyNo outputSchema

    Get 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?: string
    • journey_id: stringrequired

      The journey template ID. Copy it exactly, character for character, from the response that returned it — never retype it from memory or reconstruct it.

    • version?: stringoptional

      Version to retrieve: "draft", "published" (default), or a version string like "v001"

  • get_journey_runNo outputSchema

    Get one journey run by id: its journey, status, and timestamps.

    Input run_id: string
    • run_id: stringrequired

      The journey run id

  • get_journey_templateNo outputSchema

    Get 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?: string
    • journey_id: stringrequired

      The 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: stringrequired

      The notification template ID. Copy it exactly, character for character, from the response that returned it — never retype it from memory or reconstruct it.

    • version?: stringoptional

      Version to retrieve: "draft", "published" (default), or "vN"

  • get_journey_template_contentNo outputSchema

    Fetch 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?: string
    • journey_id: stringrequired

      The 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: stringrequired

      The notification template ID. Copy it exactly, character for character, from the response that returned it — never retype it from memory or reconstruct it.

    • version?: stringoptional

      Version to retrieve: "draft", "published" (default), or a version string like "v001"

  • get_listNo outputSchema

    Get one list by its ID, including its name and current state.

    Input list_id: string
    • list_id: stringrequired

      The list ID

  • get_list_subscribersNo outputSchema

    List 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: string
    • cursor?: stringoptional

      For 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: stringrequired

      The list ID

  • get_messageNo outputSchema

    Get the full details and status of a single message by its ID.

    Input message_id: string
    • message_id: stringrequired

      The message ID to retrieve

  • get_message_contentNo outputSchema

    Get the rendered content (HTML, text, subject) of a previously sent message.

    Input message_id: string
    • message_id: stringrequired

      The message ID

  • get_message_historyNo outputSchema

    Get the event history for a message, showing each step in the delivery pipeline (enqueued, sent, delivered, etc.).

    Input message_id: string, type?: string
    • message_id: stringrequired

      The message ID

    • type?: stringoptional

      Filter by event type

  • get_notificationNo outputSchema

    Retrieve a notification template by ID. Optionally request draft, published, or a version such as v001.

    Input notification_id: string, version?: string
    • notification_id: stringrequired

      The notification template ID. Copy it exactly, character for character, from the response that returned it — never retype it from memory or reconstruct it.

    • version?: stringoptional

      Version to retrieve: "draft", "published" (default — omit this to get it), or a version string like "v001"

  • get_notification_contentNo outputSchema

    Get the published content blocks of a notification template.

    Input notification_id: string
    • notification_id: stringrequired

      The notification template ID. Copy it exactly, character for character, from the response that returned it — never retype it from memory or reconstruct it.