A TypeScript implementation of a simple MCP server that exposes datetime information to agentic systems and chat REPLs
Courier is installed from its publisher's own source and answers where it runs, so this marketplace is not in the path of a single call. There is no address here to send one to, and a panel that pretended otherwise would be showing you an answer we made up. Install it and call it from your own client — the Installation tab has the entry for each one.
What it does
Send notifications, manage templates, and configure integrations with Courier.
Quickstart
# 1 — add it to Claude Code
claude mcp add --scope user --transport http trycourier-courier-mcp https://mcp.courier.com --header 'api_key: ${API_KEY}'
# 2 — ask your agent for something these tools do
# list_messages, get_message, get_message_content and 170 more
It needs API_KEY (Your Courier API key): this sends it in the api_key header from your environment, so export it first — its endpoint answers 401 without it.
Courier costs nothing on mcprush: there is no plan to choose here, no cap to set and nothing mcprush can bill you for.
Collected from a public index. Nobody has claimed this account, so nothing here was written by its author — claim it if it is yours.
Where are you running it?
Every route below installs the same thing and ends at the same approval screen. Nothing here runs on your machine and nothing runs on ours: this server answers at its publisher’s own address, and what you install is the connection straight to it.
This is a public server: it answers at its publisher’s own address and this marketplace is not in the path. Claude Code registers it in one command; --scope user makes it available in every project. The transport below is http, as the publisher's own manifest declares it. Claude Code reads API_KEY (Your Courier API key) from your environment each time it connects and sends it in the api_key header — its endpoint answers 401 without it — so the key stays out of its config: export it in your shell profile (macOS, Linux), or run setx API_KEY … and open a new terminal (Windows).
claude mcp add --scope user --transport http trycourier-courier-mcp https://mcp.courier.com --header 'api_key: ${API_KEY}'Reconnect, or start a new session, and the tools appear in the model’s tool list.
It reaches a system of yours, so it needs your own credential rather than the publisher’s: api_key header — Your Courier API key. You set it in your own client’s config, on your machine — this marketplace never holds it.
One config entry pointing straight at the publisher’s own address — this marketplace is not in the path, and nothing from this listing executes on your machine.
173 tools, with what each one reads, writes and reaches shown before you agree — the same list on every route above. Read the tool surface.
Tool surface
What the model actually sees. Descriptions are diffed on every release — see version history.
List messages you've previously sent. Filter by status, recipient, notification, provider, tags, or tenant.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| cursor | string | no | 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 ent |
| event | string | no | Filter by event ID |
| list | string | no | Filter by list ID |
| messageId | string | no | Filter by message ID |
| notification | string | no | Filter by notification ID |
| recipient | string | no | Filter by recipient user ID |
| status | array | no | Filter by status (e.g. DELIVERED, UNDELIVERABLE) |
| tag | array | no | Filter by metadata tags |
| tags | string | no | Comma-delimited list of tags |
| tenant_id | string | no | Filter by tenant ID |
| traceId | string | no | Filter by trace ID |
| enqueued_after | string | no | ISO 8601 timestamp; only return messages enqueued after this time |
| provider | array | no | Filter by provider key (e.g. sendgrid, twilio) |
| archived | boolean | no | This NARROWS, it does not widen: true returns ONLY archived messages, excluding every active one. Omit it entirely to search active messages — the default view for a normal delivery question. Setting |
Get the full details and status of a single message by its ID.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| message_id | string | yes | The message ID to retrieve |
Get the rendered content (HTML, text, subject) of a previously sent message.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| message_id | string | yes | The message ID |
Get the event history for a message, showing each step in the delivery pipeline (enqueued, sent, delivered, etc.).
| Parameter | Type | Required | Notes |
|---|---|---|---|
| message_id | string | yes | The message ID |
| type | string | no | Filter by event type |
List notification templates, newest first. Pass tags to return only templates carrying ALL of the given tags. Page through the rest with cursor.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| cursor | string | no | 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 on |
| tags | array | no | Only return templates carrying ALL of these tags, matched case-insensitively on the tag name shown in a template's tags field (e.g. ["onboarding"]). Omit to list every template. |
Get the published content blocks of a notification template.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| notification_id | string | yes | The notification template ID. Copy it exactly, character for character, from the response that returned it — never retype it from memory or reconstruct it. |
Get the draft (unpublished) content blocks of a notification template.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| notification_id | string | yes | The notification template ID. Copy it exactly, character for character, from the response that returned it — never retype it from memory or reconstruct it. |
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,
| Parameter | Type | Required | Notes |
|---|---|---|---|
| notification | object | yes | Notification template payload |
| state | string | no | Must be "DRAFT". These tools cannot publish. |
Retrieve a notification template by ID. Optionally request draft, published, or a version such as v001.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| notification_id | string | yes | 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 | string | no | Version to retrieve: "draft", "published" (default — omit this to get it), or a version string like "v001" |
Replace a notification template entirely (full document PUT). The template stays a draft; making it live is a separate step this tool cannot perform.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| notification_id | string | yes | The notification template ID to replace. Copy it exactly, character for character, from the response that returned it — never retype it from memory or reconstruct it. |
| notification | object | yes | Full notification template payload |
| state | string | no | Must be "DRAFT". These tools cannot publish. |
Replace the elemental content of a V2 notification template. Overwrites all elements. Use channel elements to target specific channels. Multi-channel example: elements: [{ type: "channel", channel: "email", elements: [{ type: "meta", title: "Hello" }, { type: "text", content: "Email body" }] }, { type: "channel", channel: "push", elements: [{ type: "meta", title: "Hello" }, { type: "text", content
| Parameter | Type | Required | Notes |
|---|---|---|---|
| notification_id | string | yes | The notification template ID (nt_ prefix). Copy it exactly, character for character, from the response that returned it — never retype it from memory or reconstruct it. |
| elements | array | yes | Array of elemental content nodes |
| version | string | no | Content version string (e.g. "2022-01-01"). Server defaults when omitted. |
| state | string | no | Must be "DRAFT". These tools cannot publish. |
Update a single element within a V2 notification template. The template stays a draft; making it live is a separate step this tool cannot perform.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| notification_id | string | yes | The notification template ID (nt_ prefix). Copy it exactly, character for character, from the response that returned it — never retype it from memory or reconstruct it. |
| element_id | string | yes | The element ID to update, from a prior get_notification or get_notification_draft_content response. Copy it exactly, character for character, from the response that returned it — never retype it from |
| type | string | yes | Element type (e.g. text, action, image, divider, meta) |
| channels | array | no | Channels this element applies to |
| data | object | no | Element data payload |
| if | string | no | Conditional expression for element visibility |
| loop | string | no | Loop expression for repeating elements |
| ref | string | no | Reference identifier |
| state | string | no | Must be "DRAFT". These tools cannot publish. |
Set locale-specific content overrides for a V2 notification template. Each element override must reference an existing element by its id. Example for Spanish locale: { notification_id: "nt_01abc", locale_id: "es", elements: [{ id: "elem_meta_1", title: "Restablecer contraseña" }, { id: "elem_text_1", content: "Haga clic en el enlace para restablecer su contraseña." }] }. The template stays a draft
| Parameter | Type | Required | Notes |
|---|---|---|---|
| notification_id | string | yes | The notification template ID (nt_ prefix). Copy it exactly, character for character, from the response that returned it — never retype it from memory or reconstruct it. |
| locale_id | string | yes | Locale identifier (e.g. es, fr, pt-BR) |
| elements | array | yes | Array of element overrides with id and locale-specific content |
| state | string | no | Must be "DRAFT". These tools cannot publish. |
List the version history of a notification template — each published version with when it was created. Use this to say what changed and when, or to find the version string get_notification accepts.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| notification_id | string | yes | The notification template ID |
| cursor | string | no | 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 ent |
| limit | number | no | Maximum versions to return per page. Defaults to 10, which is also the maximum. |
List the checks recorded against one notification submission. Checks are the gates a submission has to clear before it goes out, so a failing check here is the reason a template is stuck rather than live.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| notification_id | string | yes | The notification template ID |
| submission_id | string | yes | The submission ID whose checks to list |
List configured provider integrations for the workspace.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| cursor | string | no | 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 on |
Fetch a single provider configuration by ID.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| provider_id | string | yes | The provider configuration ID |
List the provider integrations Courier supports and the configuration each one expects. This is the catalog of what COULD be connected, not what this workspace has configured — use list_providers for that. Answers "what can I connect Courier to" and "what do I need in order to set up this provider".
| Parameter | Type | Required | Notes |
|---|---|---|---|
| keys | string | no | Comma-separated provider keys to return, for example "sendgrid,twilio". |
| name | string | no | Substring match against the provider's display name. |
| channel | string | no | Return only providers serving this channel, for example email, sms or push. |
Retrieve a routing strategy by ID. Returns the full entity including routing, channels, and providers.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| routing_strategy_id | string | yes | The routing strategy ID (rs_ prefix) |
List the workspace's routing strategies, returning metadata only. A routing strategy decides which channel a notification takes and in what order. Use this to find the rs_-prefixed strategy ID that get_routing_strategy needs for the full definition.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| cursor | string | no | 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 ent |
| limit | number | no | Maximum strategies to return per page. Defaults to 20; the API caps this at 100. |
List the workspace's preference sections, each with the topics inside it. One call returns the whole opt-in surface: everything a user could subscribe to or opt out of. This is what the workspace DEFINES — use get_user_preferences for what a particular person actually chose.
No parameter schema on file.
Get one preference section by ID, including its topics. Use this when you already know which section you need; list_preference_sections returns every section with its topics in one call.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| section_id | string | yes | Id of the preference section |
List the subscription topics inside one preference section. A topic is the individual thing a user opts in or out of, and its ID is what get_user_preference_topic takes.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| section_id | string | yes | Id of the preference section |
Get one subscription topic within a section, including its default opt-in state. Returns 404 if the section or topic does not exist, or if the topic belongs to a different section — so a 404 here can mean the pairing is wrong rather than the topic missing.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| section_id | string | yes | Id of the preference section |
| topic_id | string | yes | Id of the subscription preference topic |
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
| Parameter | Type | Required | Notes |
|---|---|---|---|
| name | string | yes | Journey display name |
| nodes | array | yes | 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: "tri |
| enabled | boolean | no | Whether the journey is active. Defaults to true. |
| state | string | no | Must be "DRAFT". These tools cannot publish. |
Get a journey by ID. Pass version=draft to retrieve the working draft, or version=vN for a historical version. Defaults to published.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| journey_id | string | yes | 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 | string | no | Version to retrieve: "draft", "published" (default), or a version string like "v001" |
Replace (update) a journey draft. Full document replacement — include all nodes and properties in the body, the trigger included; anything omitted is deleted. The journey stays a draft; making the change live is a separate step this tool cannot perform. This is where send, delay, branch and exit nodes are added, and send node template IDs must already be scoped to this journey. The result carries
| Parameter | Type | Required | Notes |
|---|---|---|---|
| journey_id | string | yes | The journey template ID to update. Copy it exactly, character for character, from the response that returned it — never retype it from memory or reconstruct it. |
| name | string | yes | Journey display name |
| nodes | array | yes | Complete array of journey nodes: the trigger first, a terminal exit last, and everything else between them. Use server-assigned node ids from get_journey — do NOT invent new ids. Send node example: { |
| enabled | boolean | no | Whether the journey is active. |
| state | string | no | Must be "DRAFT". These tools cannot publish. |
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, subsc
| Parameter | Type | Required | Notes |
|---|---|---|---|
| journey_id | string | yes | The journey template ID. Copy it exactly, character for character, from the response that returned it — never retype it from memory or reconstruct it. |
| channel | string | yes | Channel for this template (e.g. "email", "push", "sms", "inbox") |
| notification | object | yes | Notification template definition |
| provider_key | string | no | Specific provider key to target |
| state | string | no | Must be "DRAFT". These tools cannot publish. |
Replace the elemental content of a journey-scoped notification template. Overwrites all elements. The template stays a draft; making it live is a separate step this tool cannot perform.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| notification_id | string | yes | The notification template ID. Copy it exactly, character for character, from the response that returned it — never retype it from memory or reconstruct it. |
| journey_id | string | yes | 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. |
| elements | array | yes | Array of elemental content nodes. Likely must be wrapped in a channel block, the same way create_journey_template's content requires — not independently confirmed for this call, but they write the sam |
| version | string | no | Content version string (e.g. "2022-01-01"). Server defaults when omitted. |
| state | string | no | Template state after update. Must be "DRAFT". These tools cannot publish. |
Set locale-specific content overrides for a journey-scoped notification template. Each element override must reference an existing element by its id. The template stays a draft; making it live is a separate step this tool cannot perform.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| notification_id | string | yes | The notification template ID. Copy it exactly, character for character, from the response that returned it — never retype it from memory or reconstruct it. |
| journey_id | string | yes | 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. |
| locale_id | string | yes | Locale identifier (e.g. es, fr, pt-BR) |
| elements | array | yes | Array of element overrides with id and locale-specific content |
| state | string | no | Template state after update. Must be "DRAFT". These tools cannot publish. |
List journey templates in the workspace, returning the journey IDs and version state of each. Optionally filter by version (published or draft).
| Parameter | Type | Required | Notes |
|---|---|---|---|
| cursor | string | no | If a response has no cursor, every journey already came back — calling this again with the same arguments returns the same page, not new data. This is an opaque token — never decode it, edit it, or re |
| version | string | no | Filter by version state. Defaults to published, and the two are never combined in one call. If you don't know whether the journey you want is published or still a draft, calling this twice — once per |
List notification templates scoped to a journey. Journey-scoped templates can only be used by send nodes within the same journey. Call this to discover template IDs before wiring send nodes in replace_journey.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| journey_id | string | yes | The journey template ID. Copy it exactly, character for character, from the response that returned it — never retype it from memory or reconstruct it. |
| cursor | string | no | Check the response's paging.more before calling again — false means every template already came back, and calling again with the same arguments returns the same page, not new data. This is an opaque t |
| limit | number | no | Page size (1–100) |
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.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| notification_id | string | yes | The notification template ID. Copy it exactly, character for character, from the response that returned it — never retype it from memory or reconstruct it. |
| journey_id | string | yes | 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. |
| version | string | no | Version to retrieve: "draft", "published" (default), or "vN" |
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.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| notification_id | string | yes | The notification template ID. Copy it exactly, character for character, from the response that returned it — never retype it from memory or reconstruct it. |
| journey_id | string | yes | 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. |
| version | string | no | Version to retrieve: "draft", "published" (default), or a version string like "v001" |
Delivery funnel for ONE notification template over time: sent, delivered, opened, clicked, errors and undeliverable, per provider and channel, in time buckets. Choosing the window — supply EITHER lookback OR start and end together, NEVER both. Supplying both is rejected. For a relative window like 'the last week', lookback alone is the whole answer: do not also pin start and end. Defa
| Parameter | Type | Required | Notes |
|---|---|---|---|
| notification_id | string | yes | The notification template ID to report on (no commas or whitespace) |
| granularity | string | no | Bucket size. HOUR covers at most 7 days, DAY at most 90. Defaults to DAY. |
| lookback | string | no | Window length counted back from now, as an ISO 8601 duration (P30D, P12W, PT12H). Defaults to P30D. Must not be combined with start/end. |
| start | string | no | Inclusive window start, ISO 8601 with offset (2026-04-01T00:00:00Z). Requires end. Must not be combined with lookback. |
| end | string | no | Window end, ISO 8601 with offset. Requires start. Must not be combined with lookback. |
Get a tenant by its ID.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| tenant_id | string | yes | The tenant ID |
List the workspace's tenants. A tenant is a customer or organisation whose users, branding and preferences are scoped separately; this answers "what tenants do I have" and gives you the tenant IDs get_tenant needs.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| cursor | string | no | 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 ent |
| limit | number | no | Maximum tenants to return per page. |
List the users associated with one tenant. Use this to confirm whether someone actually belongs to the tenant whose branding or preferences you are reasoning about.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| tenant_id | string | yes | The tenant ID |
| cursor | string | no | 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 ent |
| limit | number | no | Maximum users to return per page. Defaults to 20; the API caps this at 100. |
Get a user profile by their ID. Returns profile data including email, phone, and custom properties.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| user_id | string | yes | The user ID to look up |
List the lists one user is subscribed to. Use this when explaining why a user received something — a subscription here is the reason a list-addressed send reached them, and its absence rules that path out.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| user_id | string | yes | The user ID |
| cursor | string | no | 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 ent |
Get a user's notification preferences (subscriptions, opt-outs, channel preferences).
| Parameter | Type | Required | Notes |
|---|---|---|---|
| user_id | string | yes | The user ID |
| tenant_id | string | no | Omit this to get the user's workspace-level preferences — that answers most preference questions. Only pass it when you need the tenant-scoped overrides for one specific tenant instead. |
Get one user's choice for a single subscription topic — whether they opted in or out, and per channel. Use this when you already know which topic is in question; get_user_preferences returns all of them at once.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| user_id | string | yes | The user ID |
| topic_id | string | yes | The subscription topic ID |
| tenant_id | string | no | Omit this for the user's workspace-level choice, which answers most questions. Only pass it when you need this topic as scoped to one specific tenant. |
List the tenants a user belongs to. Preferences and branding can be scoped per tenant, so this tells you which tenant-scoped settings could apply to this user at all before you go looking for them.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| user_id | string | yes | The user ID |
| cursor | string | no | 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 ent |
| limit | number | no | Maximum tenants to return per page. |
List the workspace's brands. A brand is the reusable logo, colors and email styling a notification template renders with; this gives you the brand IDs a template's brand reference points at.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| cursor | string | no | 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 ent |
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.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| brand_id | string | yes | The brand ID |
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.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| platform | string | yes | Which SDK to return the installation guide for. |
List the workspace's automation templates, each with its template ID and whether it has a published or draft version. Answers "what automations already exist here" — this only reads the catalog, it never runs one.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| cursor | string | no | 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 ent |
| version | string | no | Return only templates in this state. Omit to return every automation template regardless of state. |
List the workspace's audiences. An audience is a saved filter over user profiles — a dynamic segment — so this answers "who can I target" and gives you the audience IDs that journey audience triggers and send requests refer to.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| cursor | string | no | 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 ent |
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.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| audience_id | string | yes | The audience ID |
List the users who currently match an audience's filter. Membership is computed, so this reflects profiles as they are right now — a profile change can move someone in or out without the audience itself being edited.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| audience_id | string | yes | The audience ID |
| cursor | string | no | 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 ent |
List the workspace's lists. A list is an explicit, subscription-based group of users — someone is on it because they were subscribed, not because they match a rule. Optionally filter by an id pattern such as "example.list.*".
| Parameter | Type | Required | Notes |
|---|---|---|---|
| pattern | string | no | Filter by list id pattern, where * matches a segment — for example "example.list.*". Omit to return every list. |
| cursor | string | no | 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 ent |
Get one list by its ID, including its name and current state.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| list_id | string | yes | The list ID |
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.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| list_id | string | yes | The list ID |
| cursor | string | no | 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 ent |
List the digest instances for a digest schedule. Each instance is the events accumulated so far for one user against that schedule, so this shows what is waiting to go out and answers why a digest has not arrived yet — it is still accumulating, or it has nothing in it.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| schedule_id | string | yes | The digest schedule id, in the form "sch/{uuid}" |
| cursor | string | no | 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 ent |
| limit | number | no | Maximum instances to return. Defaults to 20; the API caps this at 100. |
Create or update an audience with a filter definition.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| audience_id | string | yes | The audience ID |
| name | string | no | Display name |
| description | string | no | Description |
| filter | no | Audience membership filter. Either a single condition ({ operator, path, value }) or a group ({ operator: "AND" | "OR", filters: [...] }) nesting to any depth. Example: { "operator": "AND", "filters": |
Delete an audience by its ID.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| audience_id | string | yes | The audience ID to delete |
Get a specific audit event by its ID.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| audit_event_id | string | yes | The audit event ID |
List audit events in the workspace. Useful for tracking API usage and changes.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| cursor | string | no | Pagination cursor |
Generate a JWT authentication token for a user. Used for client-side SDK auth (Inbox, Preferences, etc.).
| Parameter | Type | Required | Notes |
|---|---|---|---|
| user_id | string | yes | The user ID to scope the token to |
| scopes | array | no | Permission scopes for the token |
| expires_in | string | no | Token expiry duration (e.g. "1h", "2 days") |
Invoke an automation run from an existing automation template. template_id refers to an existing automation template in the workspace. Example: { template_id: "auto-onboarding", recipient: "user-123", data: { plan: "pro" } }.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| template_id | string | yes | The automation template ID |
| recipient | string | yes | Recipient user ID |
| brand | string | no | Brand ID override |
| data | object | no | Data to pass to the automation |
| profile | object | no | Profile data for the recipient |
| template | string | no | Notification template override |
Invoke an ad-hoc automation with inline steps. Valid step actions: send, send-list, delay, cancel, update-profile, invoke, fetch-data. To cancel a previously started automation, use the cancel_automation tool instead.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| automation | object | yes | The automation definition with typed steps |
| brand | string | no | — |
| data | object | no | — |
| profile | object | no | — |
| recipient | string | no | — |
| template | string | no | — |
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").
| Parameter | Type | Required | Notes |
|---|---|---|---|
| cancelation_token | string | yes | The cancelation_token that was set when the automation was originally invoked |
List automation runs, newest first. Filter by automation template, status, or a created_at window to find a run that stalled or errored, then read its steps with list_automation_run_steps. Journey runs are listed by list_journey_runs instead.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| template_id | string | no | Comma-separated automation template ids to filter on |
| status | string | no | Comma-separated run statuses to filter on, e.g. PROCESSED,ERROR |
| start_date | string | no | Inclusive lower bound on created_at, ISO 8601 date or timestamp |
| end_date | string | no | Inclusive upper bound on created_at, ISO 8601 date or timestamp |
| cursor | string | no | next_cursor from a previous response |
| limit | integer | no | Runs per page, 1 to 50. Defaults to 20. |
List the steps of an automation run in order, with what happened at each. Send steps carry a message_id to follow with get_message.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| run_id | string | yes | The automation run id |
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" } } }.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| name | string | yes | Brand display name |
| id | string | no | Optional brand ID; auto-generated if omitted |
| settings | object | no | Brand appearance settings. If omitted, defaults to { colors: { primary: "#000000", secondary: "#ffffff" } }. |
| snippets | object | no | Brand snippets |
Replace an existing brand with new values.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| brand_id | string | yes | The brand ID to update |
| name | string | yes | Brand display name |
| settings | object | no | Brand settings (colors, email, inapp) |
| snippets | object | no | Brand snippets |
Delete a brand by its ID.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| brand_id | string | yes | The brand ID to delete |
Create a new bulk job for sending messages to multiple recipients. Workflow: create_bulk_job → add_bulk_users → run_bulk_job.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| message | object | yes | Bulk message definition with event/template and content |
Add users to an existing bulk job.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| job_id | string | yes | The bulk job ID |
| users | array | yes | Array of user objects to add |
Run a bulk job, triggering delivery to all added users.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| job_id | string | yes | The bulk job ID to run |
Get the status of a bulk job.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| job_id | string | yes | The bulk job ID |
List the users in a bulk job.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| job_id | string | yes | The bulk job ID |
| cursor | string | no | Pagination cursor |
Track an inbound event that can trigger automations. Requires event name, messageId (for deduplication), and properties.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| event | string | yes | The event name (appears as trigger in Automation Trigger node) |
| messageId | string | yes | Unique ID for deduplication (returns 409 if not unique) |
| properties | object | yes | Event properties payload |
| userId | string | no | User ID associated with the event |
Create or update a list by list ID.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| list_id | string | yes | The list ID |
| name | string | yes | Display name for the list |
Subscribe a user to a list. Creates the list if it doesn't exist.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| list_id | string | yes | The list ID |
| user_id | string | yes | The user ID to subscribe |
| preferences | object | no | Optional notification preferences |
Unsubscribe a user from a list.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| list_id | string | yes | The list ID |
| user_id | string | yes | The user ID to unsubscribe |
Delete a list by its ID.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| list_id | string | yes | The list ID |
Restore a previously deleted list.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| list_id | string | yes | The list ID |
Replace all subscribers on a list with the given recipients.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| list_id | string | yes | The list ID |
| recipients | array | yes | Recipients to set on the list |
Append subscribers to a list without removing existing subscribers.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| list_id | string | yes | The list ID |
| recipients | array | yes | Recipients to set on the list |
Cancel a message that is currently being delivered. Returns the message details with updated status.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| message_id | string | yes | The message ID to cancel |
Resend a previously sent message. Loads the original send request and enqueues a brand-new send to the same recipient with the same content, producing a new messageId; the original message is unchanged. Rate limited per message (429 on rapid repeats).
| Parameter | Type | Required | Notes |
|---|---|---|---|
| message_id | string | yes | The message ID of the original message to resend |
Trace delivery in one call. Give EXACTLY ONE of message_id (a single message) or trace_id (the metadata.trace_id set on a send, which can span several messages). Returns each matching message with its event history, which carries the status reason when a message is undeliverable. Set include_output to also return the rendered content each provider received.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| message_id | string | no | A message id, as returned by send. Mutually exclusive with trace_id. |
| trace_id | string | no | The metadata.trace_id set on the send. Mutually exclusive with message_id. |
| include_output | boolean | no | Also return rendered content per provider. Off by default, since rendered email can be large. |
| limit | integer | no | Max messages to trace for a trace_id. Defaults to 10. |
Archive a notification template by ID.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| notification_id | string | yes | The notification template ID to archive |
Publish a notification template, making it available for sending. Must be called before send_message_template unless the template was created with state: 'PUBLISHED'. Publishes the current draft by default; pass version (e.g. 'v001') to publish a specific historical version. Returns 204 on success.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| notification_id | string | yes | The notification template ID to publish |
| version | string | no | Historical version to publish (e.g. v001); omit to publish current draft |
Update check statuses for a notification submission.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| notification_id | string | yes | The notification template ID |
| submission_id | string | yes | The submission ID for the checks resource |
| checks | array | yes | Checks to update |
Cancel a notification template submission.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| notification_id | string | yes | The notification template ID |
| submission_id | string | yes | The submission ID to cancel |
Create a new user profile or merge supplied values into an existing profile (POST). Existing fields not included are preserved.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| user_id | string | yes | The user ID |
| profile | object | no | Profile data to create or merge (e.g. { email: "...", phone_number: "..." }) |
Fully replace a user profile (PUT). All existing data is overwritten; include every field you want to keep.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| user_id | string | yes | The user ID |
| profile | object | yes | Complete profile data to replace with |
Partially update a user profile via JSON Patch (RFC 6902). Use add/replace/remove operations on specific profile paths.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| user_id | string | yes | The user ID |
| patch | array | yes | Array of JSON Patch operations to apply to the profile |
Delete a user profile permanently.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| user_id | string | yes | The user ID to delete |
Subscribe a user to one or more lists. Creates lists that do not exist.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| user_id | string | yes | The user ID |
| lists | array | yes | Array of lists to subscribe to |
Delete all list subscriptions for a user.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| user_id | string | yes | The user ID |
Send a message to a user using inline title and body content (no template). Optionally specify routing channels. API reference: https://www.courier.com/docs/api-reference/send/send-a-message.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| user_id | string | yes | The recipient user ID |
| title | string | yes | Message title |
| body | string | yes | Message body |
| data | object | no | Key-value data to include with the message |
| method | string | no | Routing method: deliver to all channels or stop after first success |
| channels | array | no | Channel names to route through (e.g. email, sms, push). Omit to use default routing. |
Send a message to a user using a published notification template. Only published templates can be sent; publishing a draft is a separate operation. Example: { user_id: "user-123", template: "nt_01abc123", data: { name: "Alex", resetUrl: "https://app.example.com/reset" } }.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| user_id | string | yes | The recipient user ID |
| template | string | yes | Template ID or notification slug |
| data | object | no | Key-value data for template variables |
| method | string | no | Routing method |
| channels | array | no | Channel names to route through. Omit to use template routing config. |
Send a message to all subscribers of a list using inline title and body content. API reference: https://www.courier.com/docs/api-reference/send/send-a-message.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| list_id | string | yes | The list ID to send to |
| title | string | yes | Message title |
| body | string | yes | Message body |
| data | object | no | Key-value data to include |
| method | string | no | Routing method |
| channels | array | no | Channel names to route through. Omit to use default routing. |
Send a message to all subscribers of a list using a notification template.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| list_id | string | yes | The list ID to send to |
| template | string | yes | Template ID or notification slug |
| data | object | no | Key-value data for template variables |
| method | string | no | Routing method |
| channels | array | no | Channel names to route through. Omit to use template routing config. |
Create or replace a tenant. Tenants represent organizations or groups that users belong to.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| tenant_id | string | yes | The tenant ID |
| name | string | yes | Display name for the tenant |
| parent_tenant_id | string | no | Parent tenant ID for hierarchical tenants |
| default_preferences | object | no | Default notification preferences applied to users in this tenant. Example: { "items": [{ "id": "topic_abc", "status": "OPTED_IN", "type": "subscription_topic" }] } |
| properties | object | no | Custom properties for the tenant |
| user_profile | object | no | Default profile data for users in this tenant |
| brand_id | string | no | Brand ID to associate with this tenant |
Delete a tenant by its ID.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| tenant_id | string | yes | The tenant ID to delete |
Set the default notification preference for a subscription topic on a tenant. This controls tenant-level defaults — it does NOT set per-user preferences (use the user preferences API for that). The topic_id must already exist as a subscription topic in the workspace; a 404 means the topic has not been created yet. Example: { tenant_id: "acme", topic_id: "marketing-updates", status: "OPTED_IN", has
| Parameter | Type | Required | Notes |
|---|---|---|---|
| tenant_id | string | yes | The tenant ID |
| topic_id | string | yes | The subscription topic ID — must already exist in the workspace. A 404 response means the topic does not exist; create it in the Preferences Editor first. |
| status | string | yes | Subscription status for the topic |
| custom_routing | array | no | Default channels when has_custom_routing is enabled |
| has_custom_routing | boolean | no | When true, use custom_routing instead of template defaults |
Remove default notification preference for a topic from a tenant.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| tenant_id | string | yes | The tenant ID |
| topic_id | string | yes | The subscription topic ID |
List notification templates configured for a tenant.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| tenant_id | string | yes | The tenant ID |
| cursor | string | no | Pagination cursor |
| limit | number | no | Max results per page (default 20, max 100) |
Get a tenant notification template association by template ID.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| tenant_id | string | yes | The tenant ID |
| template_id | string | yes | The template ID |
Create or replace a tenant notification template (draft unless published is true).
| Parameter | Type | Required | Notes |
|---|---|---|---|
| tenant_id | string | yes | The tenant ID |
| template_id | string | yes | The template ID |
| title | string | no | Optional title merged into template content when provided |
| content | object | yes | Elemental content document. Example: { "version": "2022-01-01", "elements": [{ "type": "meta", "title": "Welcome" }, { "type": "text", "content": "Thanks for signing up." }] } |
| channels | object | no | Per-channel delivery configuration, keyed by channel name. Example: { "email": { "providers": ["sendgrid"], "routing_method": "single" } } |
| providers | object | no | Per-provider configuration, keyed by provider name. Example: { "sendgrid": { "override": { "from": "noreply@example.com" } } } |
| routing | object | no | Message routing tree. Example: { "method": "single", "channels": ["email", "sms"] } |
| published | boolean | no | When true, publish immediately after save |
Publish a version of a tenant notification template.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| tenant_id | string | yes | The tenant ID |
| template_id | string | yes | The template ID |
| version | string | no | Version to publish (e.g. v1, latest); defaults to latest if omitted |
Get a specific version of a tenant notification template (e.g. latest, published, or v1).
| Parameter | Type | Required | Notes |
|---|---|---|---|
| tenant_id | string | yes | The tenant ID |
| template_id | string | yes | The template ID |
| version | string | yes | Version identifier (latest, published, or v-prefixed) |
Delete a tenant notification template. Returns 204 on success, 404 if the template does not exist for this tenant.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| tenant_id | string | yes | The tenant ID that owns the template |
| template_id | string | yes | The notification template ID to delete |
Get a translation for a specific locale (e.g. "en_US", "fr_FR").
| Parameter | Type | Required | Notes |
|---|---|---|---|
| locale | string | yes | Locale code (e.g. en_US, fr_FR) |
| domain | string | no | Translation domain (only "default" is supported currently) |
Create or update a translation for a specific locale. API reference: https://www.courier.com/docs/api-reference/translations/update-translations-by-locale.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| locale | string | yes | Locale code (e.g. en_US, fr_FR) |
| body | string | yes | Translation content (PO file format) |
| domain | string | no | Translation domain |
List all push/device tokens for a user.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| user_id | string | yes | The user ID |
Get a specific push/device token for a user.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| user_id | string | yes | The user ID |
| token | string | yes | The token identifier |
Create or replace a push/device token for a user.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| user_id | string | yes | The user ID |
| token | string | yes | The token string |
| provider_key | string | yes | Push provider |
| device | object | no | Device metadata |
Add multiple push/device tokens for a user in one request. Overwrites matching existing tokens.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| user_id | string | yes | The user ID |
| tokens | array | yes | Token records to upsert |
Apply a JSON Patch (RFC 6902) to a specific push token.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| user_id | string | yes | The user ID |
| token | string | yes | The token identifier |
| patch | array | yes | Array of JSON Patch operations |
Delete a specific push token for a user.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| user_id | string | yes | The user ID |
| token | string | yes | The token identifier to delete |
Update a user's preference for a specific subscription topic (opt in, opt out, or set channel preferences).
| Parameter | Type | Required | Notes |
|---|---|---|---|
| user_id | string | yes | The user ID |
| topic_id | string | yes | The subscription topic ID |
| status | string | yes | Preference status |
| has_custom_routing | boolean | no | Whether custom channel routing is set |
| custom_routing | array | no | Custom channel routing order |
| digest_schedule_id | string/null | no | Put the user on one of the topic's digest schedules. Pass null to clear their choice and fall back to the default schedule. |
| tenant_id | string | no | Update the preference for this tenant context only |
Delete a user's preference for a specific subscription topic, reverting it to the topic's default status.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| user_id | string | yes | The user ID |
| topic_id | string | yes | The subscription topic ID |
Add a user to a tenant.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| user_id | string | yes | The user ID |
| tenant_id | string | yes | The tenant ID |
| profile | object | no | Tenant-scoped profile overrides |
Remove a user from a tenant.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| user_id | string | yes | The user ID |
| tenant_id | string | yes | The tenant ID |
Add a user to multiple tenants at once. A custom profile can be supplied per tenant.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| user_id | string | yes | The user ID |
| tenants | array | yes | Array of tenant associations |
Remove a user from all tenants.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| user_id | string | yes | The user ID |
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.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| user_id | string | yes | The user ID |
| topics | array | yes | Topics to create or update |
| tenant_id | string | no | Scope the update to a specific tenant context |
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).
| Parameter | Type | Required | Notes |
|---|---|---|---|
| user_id | string | yes | The user ID |
| topics | array | yes | The complete set of topic overrides. An empty array resets every existing override. |
| tenant_id | string | no | Scope the replacement to a specific tenant context |
Archive a send request and all its associated messages by request ID.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| request_id | string | yes | The request ID (requestId returned from /send) |
Create a routing strategy defining how notifications are delivered across channels and providers.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| name | string | yes | Human-readable name for the routing strategy |
| routing | object | yes | Routing tree defining channel selection method and order |
| channels | object | no | Per-channel delivery configuration |
| providers | object | no | Per-provider delivery configuration |
| description | string | no | Description of the routing strategy |
| tags | array | no | Tags for categorization |
Replace a routing strategy. Full document replacement; missing optional fields are cleared.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| routing_strategy_id | string | yes | The routing strategy ID |
| name | string | yes | Human-readable name |
| routing | object | yes | Routing tree |
| channels | object | no | Per-channel delivery configuration. Omit to clear. |
| providers | object | no | Per-provider delivery configuration. Omit to clear. |
| description | string | no | Description. Omit to clear. |
| tags | array | no | Tags. Omit to clear. |
Archive a routing strategy. The strategy must not have associated notification templates; unlink all templates before archiving.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| routing_strategy_id | string | yes | The routing strategy ID to archive |
List notification templates associated with a routing strategy. Useful for checking linked templates before archiving.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| routing_strategy_id | string | yes | The routing strategy ID (rs_ prefix) |
| cursor | string | no | Pagination cursor |
| limit | number | no | Max results per page (default 20, max 100) |
Invoke a journey run from a journey template. template_id refers to an existing journey template in the workspace. Example: { template_id: "j-onboarding", user_id: "user-123", data: { plan: "pro" } }.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| template_id | string | yes | The journey template ID |
| user_id | string | no | Recipient user ID. Can also be resolved from profile or data. |
| data | object | no | Data payload passed to the journey for conditions and template variables |
| profile | object | no | Profile data for the user (email, phone, custom fields) |
Publish the current draft of a journey, making it live and invokable. Pass version to roll back to a prior published version instead of publishing the draft. Returns 404 if there is no draft to publish.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| journey_id | string | yes | The journey template ID to publish |
| version | string | no | Historical version to roll back to (e.g. "v001"). Omit to publish the current draft. |
Archive a journey. Archived journeys cannot be invoked but existing runs continue to completion.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| journey_id | string | yes | The journey template ID to archive |
List published versions of a journey, ordered most recent first.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| journey_id | string | yes | The journey template ID |
Replace the draft of a journey-scoped notification template. Full document replacement. Call publish_journey_template afterwards to make it live.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| notification_id | string | yes | The notification template ID |
| journey_id | string | yes | The journey template ID that owns this notification |
| notification | object | yes | Full notification template definition |
| state | string | no | "PUBLISHED" to publish immediately after replace |
Archive a journey-scoped notification template. Archived templates cannot be sent.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| notification_id | string | yes | The notification template ID |
| journey_id | string | yes | The journey template ID that owns this notification |
Publish the current draft of a journey-scoped notification template. Optionally pass version to roll back to a prior version.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| notification_id | string | yes | The notification template ID |
| journey_id | string | yes | The journey template ID that owns this notification |
| version | string | no | Version to roll back to (e.g. "v1"). Omit to publish current draft. |
List published versions of a journey-scoped notification template, ordered most recent first.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| notification_id | string | yes | The notification template ID |
| journey_id | string | yes | The journey template ID that owns this notification |
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.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| cancelation_token | string | no | Cancels every run associated with this token. Mutually exclusive with run_id. |
| run_id | string | no | Cancels a single run by id. Mutually exclusive with cancelation_token. |
List journey runs, newest first. Filter by journey, status, or a created_at window to find a run that stalled or errored, then read its steps with list_journey_run_steps.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| template_id | string | no | Comma-separated journey ids to filter on |
| status | string | no | Comma-separated run statuses to filter on, e.g. PROCESSED,ERROR |
| start_date | string | no | Inclusive lower bound on created_at, ISO 8601 date or timestamp |
| end_date | string | no | Inclusive upper bound on created_at, ISO 8601 date or timestamp |
| cursor | string | no | next_cursor from a previous response |
| limit | integer | no | Runs per page, 1 to 50. Defaults to 20. |
Get one journey run by id: its journey, status, and timestamps.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| run_id | string | yes | The journey run id |
List the steps of a journey run in order, with each node and what happened at it. This is how to see where a run stopped and why.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| run_id | string | yes | The journey run id |
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.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| provider | string | yes | Provider key from the catalog (e.g. sendgrid, twilio, firebase-fcm) |
| title | string | no | Display name for this provider configuration |
| alias | string | no | Short alias for referencing this provider |
| settings | object | no | Provider-specific settings (API keys, credentials, etc.) |
Replace an existing provider configuration. Full replacement — retrieve current config with get_provider first; omitted optional fields are cleared. Changing API keys or settings affects live delivery if this integration is in use.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| provider_id | string | yes | The provider configuration ID |
| provider | string | yes | Provider key (must match existing; changing provider type is not supported) |
| title | string | no | Display name |
| alias | string | no | Short alias |
| settings | object | no | Provider-specific settings |
Delete a provider configuration. Returns 409 if the provider is still referenced by routing or notifications.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| provider_id | string | yes | The provider configuration ID to delete |
Create a preference section in your workspace. The section id is generated and returned. Add topics afterwards with create_preference_topic.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| name | string | yes | Human-readable name for the section |
| routing_options | array | no | Default channels for the section. Defaults to empty if omitted. |
| has_custom_routing | boolean | no | Whether the section defines custom routing for its topics |
Replace a preference section. Full document replacement; missing optional fields are cleared. Topics attached to the section are unaffected.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| section_id | string | yes | Id of the preference section |
| name | string | yes | Human-readable name for the section |
| routing_options | array | no | Default channels for the section. Omit to clear. |
| has_custom_routing | boolean | no | Whether the section defines custom routing for its topics |
Archive a preference section. The section must be empty: delete its topics first, otherwise the request fails with 409.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| section_id | string | yes | Id of the preference section to archive |
Publish the workspace's preferences page. Takes a snapshot of every section with its topics under a new published version, making the current state visible on the hosted preferences page.
No parameter schema on file.
Create a subscription preference topic inside a section. The topic id is generated and returned. Fails with 404 if the section does not exist.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| section_id | string | yes | Id of the preference section to create the topic in |
| name | string | yes | Human-readable name for the preference topic |
| default_status | string | yes | Default subscription status applied when a recipient has not set their own |
| routing_options | array | no | Default channels delivered for this topic. Defaults to empty if omitted. |
| allowed_preferences | array | no | Preference controls a recipient may customize for this topic |
| include_unsubscribe_header | boolean | no | Whether to include a list-unsubscribe header on emails for this topic |
| topic_data | object | no | Arbitrary metadata associated with the topic |
| digest | no | Batch this topic's notifications into a scheduled digest. Omit to leave any existing digest untouched; pass null to turn it off. |
Replace a topic within a section. Full document replacement: omitted optional fields are cleared, except digest, which is left untouched when omitted. Pass digest: null to turn a digest off.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| section_id | string | yes | Id of the preference section |
| topic_id | string | yes | Id of the subscription preference topic |
| name | string | yes | Human-readable name for the preference topic |
| default_status | string | yes | Default subscription status applied when a recipient has not set their own |
| routing_options | array | no | Default channels delivered for this topic. Omit to clear. |
| allowed_preferences | array | no | Preference controls a recipient may customize. Omit to clear. |
| include_unsubscribe_header | boolean | no | Whether to include a list-unsubscribe header on emails for this topic |
| topic_data | object | no | Arbitrary metadata associated with the topic. Omit to clear. |
| digest | no | Batch this topic's notifications into a scheduled digest. Omit to leave any existing digest untouched; pass null to turn it off. |
Archive a topic within a section.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| section_id | string | yes | Id of the preference section |
| topic_id | string | yes | Id of the subscription preference topic to archive |
List preference changes, newest first. Each entry is one change a user made to one subscription topic, with the value before it where there was one. Pass user_id to answer "when did this user opt out, and of what?"; omit it to read the whole environment. Page with paging.cursor while paging.more is true.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| user_id | string | no | Return only this user's changes. Omit to read every change in the environment. |
| tenant_id | string | no | Narrow to the changes the user made in one tenant context. Requires user_id. |
| since | string | no | Only changes at or after this time, as an ISO 8601 date or date-time. A date alone is the start of that day in UTC. |
| limit | integer | no | Entries per page, 1 to 100. Defaults to 25. |
| cursor | string | no | paging.cursor from a previous response |
Release a digest schedule early — send what users have collected so far now instead of waiting for the scheduled time. A 204 is also returned when the schedule has no in-progress instances to release.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| schedule_id | string | yes | The digest schedule id, in the form "sch/{uuid}" |
Release one recipient's held digest for a topic now, instead of waiting for its schedule. Use it to preview a digest, or to let a user flush their own, without releasing everyone else on the schedule. There is no release-everyone form of this call; use release_digest with a schedule id for that.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| section_id | string | yes | Id of the preference section the topic belongs to |
| topic_id | string | yes | Id of the digest topic |
| user_id | string | yes | The recipient whose digest to release |
| tenant_id | string | no | The recipient's tenant, when they were sent to as part of one |
List broadcasts in the workspace.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| cursor | string | no | Pagination cursor from a previous response |
| limit | integer | no | Max broadcasts per page |
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.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| name | string | yes | Human-readable name |
| channel | string | yes | The single delivery channel for this broadcast |
Get a broadcast by id, including its channel and send or schedule state.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| broadcast_id | string | yes | The broadcast id |
Rename a broadcast. Content and channel are unchanged.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| broadcast_id | string | yes | The broadcast id |
| name | string | yes | The new name |
Delete a broadcast.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| broadcast_id | string | yes | The broadcast id |
Get a broadcast's Elemental content.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| broadcast_id | string | yes | The broadcast id |
Replace a broadcast's content with an Elemental document. Saved as a draft unless state is PUBLISHED.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| broadcast_id | string | yes | The broadcast id |
| content | object | yes | Elemental content, e.g. { "version": "2022-01-01", "elements": [...] }. version defaults when omitted. |
| state | string | no | Template state. Defaults to DRAFT. |
Send a broadcast now to every member of a list or audience. This delivers real messages.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| broadcast_id | string | yes | The broadcast id |
| recipient_type | string | yes | Whether to send to a list or an audience |
| recipient_id | string | yes | The list or audience id |
Schedule a broadcast to send later to a list or audience. Cancel with cancel_broadcast_schedule.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| broadcast_id | string | yes | The broadcast id |
| recipient_type | string | yes | Whether to send to a list or an audience |
| recipient_id | string | yes | The list or audience id |
| scheduled_to | string | yes | Wall-clock time of the send with no timezone offset, e.g. 2026-10-01T09:00:00 |
| timezone | string | no | IANA timezone scheduled_to is expressed in, e.g. America/New_York |
Cancel a broadcast's scheduled send. The broadcast itself is kept.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| broadcast_id | string | yes | The broadcast id |
Copy a broadcast into a new draft. The original is left unchanged.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| broadcast_id | string | yes | The broadcast to copy |
List the email clients a preview can render on. Each device has a pvd_ id, a display name, and fields to filter by: category, app, platform, os, os_version and theme. Use these ids in a device set or in create_preview_run.
No parameter schema on file.
List saved preview device sets. Every workspace has a read-only Courier Recommended set that runs can use without creating a set first.
No parameter schema on file.
Create a named, reusable set of preview devices.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| name | string | yes | Human-readable name for the set |
| device_ids | array | yes | Device ids (pvd_...) from list_preview_devices. An id the catalog does not list is rejected. |
Get a preview device set by id.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| device_set_id | string | yes | The device set id (pvs_...) |
Replace a preview device set's name and devices. This is a full replace, so send every device the set should keep. The Courier Recommended set cannot be changed.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| device_set_id | string | yes | The device set id (pvs_...) |
| name | string | yes | The new name |
| device_ids | array | yes | Device ids (pvd_...) from list_preview_devices. An id the catalog does not list is rejected. |
Archive a preview device set. Runs that used it keep their own copy of its devices. The Courier Recommended set cannot be archived.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| device_set_id | string | yes | The device set id (pvs_...) |
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.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| template_id | string | yes | The notification template id (nt_...). It must be a Design Studio template with an email channel. |
| device_set_id | string | no | A saved device set id (pvs_...). Use the Courier Recommended set from list_preview_device_sets for a sensible default. |
| device_ids | array | no | Device ids (pvd_...) from list_preview_devices. An id the catalog does not list is rejected. |
| template_version | string | no | Which version renders: omit for the latest draft, "published" for the live version, or a publish such as "v002". |
| data | object | no | Variables for the template, the same shape as the data a send would carry |
| locale | string | no | Locale to render, e.g. "en-US" |
List a template's preview runs, newest first.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| template_id | string | yes | The notification template id (nt_...) |
| cursor | string | no | Pagination cursor from a previous response |
| limit | integer | no | Max runs per page |
Get a preview run with its per-device results and screenshot URLs. Poll until status is COMPLETED or FAILED. The URLs are short-lived and re-signed on every read, so fetch them rather than storing them.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| template_id | string | yes | The notification template id (nt_...) the run previewed |
| preview_run_id | string | yes | The preview run id (pvr_...) |
- Every tool — any call limit is its publisher’s, not ours
- No card, and mcprush charges nothing for it
- Runs at its publisher’s own address — this marketplace is not in the path
- Nothing to cap, because mcprush bills nothing
What counts against your monthly calls
| Tool | Unit | Calls used | Out of the allowance |
|---|
Nothing here is billable: mcprush charges nothing to install Courier or to call it, at any volume.
Two independent axes, because powerful and malicious are different questions. The grade is threat only. The capability level is blast radius, and it is never a penalty on the grade — it is priced as one subtract-only term in the score, where you can see it.
| Term | Level | What it prices | Points |
|---|---|---|---|
| capability-exposure | moderate | capability blast radius (moderate) — client exposure if the model is manipulated | −3 |
| coverage-honesty | manifest | inspection depth (manifest) — how much of the target the scan could see | −4 |
What the scan could actually read
A grade is only as meaningful as its coverage, so the scanner publishes its own depth before it publishes its result.
The scan read each tool’s name, description, input schema and annotations exactly as the server listed them the last time it answered us; no code was reviewed. We ask the server again about once a month, and a list that changed is graded again.
The implementation source was not read — this reflects the declared tool metadata only.
Capability — what it could do if the model were manipulated
Tags derived from each tool’s schema and the implementation, not from what the tool calls itself. moderate is the level these add up to.
| Tool | Capability tags | Why the tag was assigned |
|---|---|---|
| list_messages | no tags | |
| get_message | no tags | |
| get_message_content | no tags | |
| get_message_history | no tags | |
| list_notifications | no tags | |
| get_notification_content | no tags | |
| get_notification_draft_content | no tags | |
| create_notification | state-write | state-write: declares readOnlyHint: false |
| get_notification | no tags | |
| replace_notification | state-write | state-write: declares readOnlyHint: false |
| put_notification_content | state-write | state-write: declares readOnlyHint: false |
| put_notification_element | state-write | state-write: declares readOnlyHint: false |
| put_notification_locale | state-write | state-write: declares readOnlyHint: false |
| list_notification_versions | no tags | |
| list_notification_checks | no tags | |
| list_providers | no tags | |
| get_provider | untrusted-input | untrusted-input: keyword "fetch" |
| list_provider_catalog | no tags | |
| get_routing_strategy | no tags | |
| list_routing_strategies | no tags | |
| list_preference_sections | no tags | |
| get_preference_section | no tags | |
| list_preference_topics | no tags | |
| get_preference_topic | no tags | |
| create_journey | state-write | state-write: declares readOnlyHint: false |
| get_journey | no tags | |
| replace_journey | state-write | state-write: declares readOnlyHint: false, destructiveHint: true |
| create_journey_template | state-write | state-write: declares readOnlyHint: false |
| put_journey_template_content | state-write | state-write: declares readOnlyHint: false, destructiveHint: true |
| put_journey_template_locale | state-write | state-write: declares readOnlyHint: false |
| list_journeys | no tags | |
| list_journey_templates | no tags | |
| get_journey_template | no tags | |
| get_journey_template_content | untrusted-input | untrusted-input: keyword "fetch" |
| get_notification_metrics | no tags | |
| get_tenant | no tags | |
| list_tenants | no tags | |
| list_tenant_users | no tags | |
| get_user_profile_by_id | no tags | |
| get_user_list_subscriptions | no tags | |
| get_user_preferences | no tags | |
| get_user_preference_topic | no tags | |
| list_user_tenants | no tags | |
| list_brands | no tags | |
| get_brand | no tags | |
| courier_installation_guide | no tags | |
| list_automations | no tags | |
| list_audiences | no tags | |
| get_audience | no tags | |
| list_audience_members | no tags | |
| list_lists | no tags | |
| get_list | no tags | |
| get_list_subscribers | no tags | |
| list_digest_instances | no tags | |
| update_audience | state-write | state-write: declares readOnlyHint: false |
| delete_audience | state-write | state-write: declares readOnlyHint: false, destructiveHint: true |
| get_audit_event | no tags | |
| list_audit_events | no tags | |
| generate_jwt_for_user | state-write | state-write: declares readOnlyHint: false |
| invoke_automation_template | external-sinkstate-write | external-sink: parameter "recipient"; state-write: declares readOnlyHint: false |
| invoke_ad_hoc_automation | untrusted-inputexternal-sinkstate-write | untrusted-input: keyword "fetch"; external-sink: parameter "recipient"; state-write: declares readOnlyHint: false |
| cancel_automation | state-write | state-write: declares readOnlyHint: false |
| list_automation_runs | no tags | |
| list_automation_run_steps | no tags | |
| create_brand | state-write | state-write: declares readOnlyHint: false |
| update_brand | state-write | state-write: declares readOnlyHint: false |
| delete_brand | state-write | state-write: declares readOnlyHint: false, destructiveHint: true |
| create_bulk_job | state-write | state-write: declares readOnlyHint: false |
| add_bulk_users | state-write | state-write: declares readOnlyHint: false |
| run_bulk_job | state-write | state-write: declares readOnlyHint: false |
| get_bulk_job | no tags | |
| list_bulk_users | no tags | |
| track_inbound_event | state-write | state-write: declares readOnlyHint: false |
| create_list | state-write | state-write: declares readOnlyHint: false |
| subscribe_user_to_list | state-write | state-write: declares readOnlyHint: false |
| unsubscribe_user_from_list | state-write | state-write: declares readOnlyHint: false, destructiveHint: true |
| delete_list | state-write | state-write: declares readOnlyHint: false, destructiveHint: true |
| restore_list | state-write | state-write: declares readOnlyHint: false |
| bulk_subscribe_to_list | state-write | state-write: declares readOnlyHint: false, destructiveHint: true |
| add_subscribers_to_list | state-write | state-write: declares readOnlyHint: false |
| cancel_message | state-write | state-write: declares readOnlyHint: false, destructiveHint: true |
| resend_message | state-write | state-write: declares readOnlyHint: false |
| trace_message | no tags | |
| archive_notification | state-write | state-write: declares readOnlyHint: false, destructiveHint: true |
| publish_notification | state-write | state-write: declares readOnlyHint: false |
| update_notification_checks | state-write | state-write: declares readOnlyHint: false |
| cancel_notification_submission | state-write | state-write: declares readOnlyHint: false, destructiveHint: true |
| create_or_merge_user | state-write | state-write: declares readOnlyHint: false |
| replace_profile | state-write | state-write: declares readOnlyHint: false, destructiveHint: true |
| patch_profile | state-write | state-write: declares readOnlyHint: false |
| delete_profile | state-write | state-write: declares readOnlyHint: false, destructiveHint: true |
| subscribe_user_to_lists | state-write | state-write: declares readOnlyHint: false |
| delete_user_list_subscriptions | state-write | state-write: declares readOnlyHint: false, destructiveHint: true |
| send_message | external-sinkstate-write | external-sink: keyword "send_message"; state-write: declares readOnlyHint: false |
| send_message_template | external-sinkstate-write | external-sink: keyword "send_message"; state-write: declares readOnlyHint: false |
| send_message_to_list | external-sinkstate-write | external-sink: keyword "send_message"; state-write: declares readOnlyHint: false |
| send_message_to_list_template | external-sinkstate-write | external-sink: keyword "send_message"; state-write: declares readOnlyHint: false |
| create_or_update_tenant | state-write | state-write: declares readOnlyHint: false |
| delete_tenant | state-write | state-write: declares readOnlyHint: false, destructiveHint: true |
| update_tenant_preference | state-write | state-write: declares readOnlyHint: false |
| delete_tenant_preference | state-write | state-write: declares readOnlyHint: false, destructiveHint: true |
| list_tenant_templates | no tags | |
| get_tenant_template | no tags | |
| replace_tenant_template | state-write | state-write: declares readOnlyHint: false |
| publish_tenant_template | state-write | state-write: declares readOnlyHint: false |
| get_tenant_template_version | no tags | |
| delete_tenant_template | state-write | state-write: declares readOnlyHint: false, destructiveHint: true |
| get_translation | no tags | |
| update_translation | state-write | state-write: declares readOnlyHint: false |
| list_user_push_tokens | no tags | |
| get_user_push_token | no tags | |
| create_or_replace_user_push_token | state-write | state-write: declares readOnlyHint: false |
| bulk_add_user_tokens | state-write | state-write: declares readOnlyHint: false |
| patch_user_token | state-write | state-write: declares readOnlyHint: false |
| delete_user_token | state-write | state-write: declares readOnlyHint: false, destructiveHint: true |
| update_user_preference_topic | state-write | state-write: declares readOnlyHint: false |
| delete_user_preference_topic | state-write | state-write: declares readOnlyHint: false, destructiveHint: true |
| add_user_to_tenant | state-write | state-write: declares readOnlyHint: false |
| remove_user_from_tenant | state-write | state-write: declares readOnlyHint: false, destructiveHint: true |
| bulk_add_user_tenants | state-write | state-write: declares readOnlyHint: false |
| remove_all_user_tenants | state-write | state-write: declares readOnlyHint: false, destructiveHint: true |
| bulk_update_user_preferences | state-write | state-write: declares readOnlyHint: false |
| bulk_replace_user_preferences | state-write | state-write: declares readOnlyHint: false, destructiveHint: true |
| archive_request | state-write | state-write: declares readOnlyHint: false, destructiveHint: true |
| create_routing_strategy | state-write | state-write: declares readOnlyHint: false |
| replace_routing_strategy | state-write | state-write: declares readOnlyHint: false |
| archive_routing_strategy | state-write | state-write: declares readOnlyHint: false, destructiveHint: true |
| list_routing_strategy_notifications | no tags | |
| invoke_journey | state-write | state-write: declares readOnlyHint: false |
| publish_journey | state-write | state-write: declares readOnlyHint: false |
| archive_journey | state-write | state-write: declares readOnlyHint: false, destructiveHint: true |
| list_journey_versions | no tags | |
| replace_journey_template | state-write | state-write: declares readOnlyHint: false |
| archive_journey_template | state-write | state-write: declares readOnlyHint: false, destructiveHint: true |
| publish_journey_template | state-write | state-write: declares readOnlyHint: false |
| list_journey_template_versions | no tags | |
| cancel_journey | state-write | state-write: declares readOnlyHint: false, destructiveHint: true |
| list_journey_runs | no tags | |
| get_journey_run | no tags | |
| list_journey_run_steps | no tags | |
| create_provider | state-write | state-write: declares readOnlyHint: false |
| update_provider | state-write | state-write: declares readOnlyHint: false, destructiveHint: true |
| delete_provider | state-write | state-write: declares readOnlyHint: false, destructiveHint: true |
| create_preference_section | state-write | state-write: declares readOnlyHint: false |
| replace_preference_section | state-write | state-write: declares readOnlyHint: false |
| archive_preference_section | state-write | state-write: declares readOnlyHint: false, destructiveHint: true |
| publish_preferences | state-write | state-write: declares readOnlyHint: false |
| create_preference_topic | state-write | state-write: declares readOnlyHint: false |
| replace_preference_topic | state-write | state-write: declares readOnlyHint: false |
| archive_preference_topic | state-write | state-write: declares readOnlyHint: false, destructiveHint: true |
| list_preference_logs | no tags | |
| release_digest | state-write | state-write: declares readOnlyHint: false |
| release_user_digest | state-write | state-write: declares readOnlyHint: false |
| list_broadcasts | no tags | |
| create_broadcast | state-write | state-write: declares readOnlyHint: false |
| get_broadcast | no tags | |
| rename_broadcast | state-write | state-write: declares readOnlyHint: false |
| delete_broadcast | state-write | state-write: declares readOnlyHint: false, destructiveHint: true |
| get_broadcast_content | no tags | |
| put_broadcast_content | state-write | state-write: declares readOnlyHint: false |
| send_broadcast | external-sinkstate-write | external-sink: parameter "recipient"; state-write: declares readOnlyHint: false |
| schedule_broadcast | external-sinkstate-write | external-sink: parameter "recipient"; state-write: declares readOnlyHint: false |
| cancel_broadcast_schedule | state-write | state-write: declares readOnlyHint: false, destructiveHint: true |
| duplicate_broadcast | state-write | state-write: declares readOnlyHint: false |
| list_preview_devices | no tags | |
| list_preview_device_sets | no tags | |
| create_preview_device_set | state-write | state-write: declares readOnlyHint: false |
| get_preview_device_set | no tags | |
| replace_preview_device_set | state-write | state-write: declares readOnlyHint: false |
| archive_preview_device_set | state-write | state-write: declares readOnlyHint: false, destructiveHint: true |
| create_preview_run | state-write | state-write: declares readOnlyHint: false |
| list_preview_runs | no tags | |
| get_preview_run | untrusted-input | untrusted-input: keyword "fetch" |
Toxic-flow graph
The lethal trifecta, checked as a graph rather than as a checklist: untrusted input, a sensitive source and an external sink have to meet before there is a path worth worrying about.
Supply chain and provenance
This is the first scan of this surface here, so there is nothing yet to compare it against.
Every result on this tab comes from one deterministic pass over the published package — offline, rule by rule, and auditable line by line above. Same methodology version, same bytes, same score.
Release history
This is an address its publisher runs: which release it serves is theirs to choose, so there is nothing here to pin. The history below is for reading; the current release on file is 1.3.7.
No release note was published with this version.
One review per account, from a signed-in account that does not publish this listing. Nothing else is asked — you can say what you think before you install it. Publishers can reply once per review, and a review can be edited or deleted by whoever wrote it.
Any signed-in account that does not publish Courier can review it, once — before installing it or after. A review from an account that has installed it is marked as one.
Nobody has reviewed this listing. The rating on the card is the mean of the reviews written here and nothing else, so there is no rating until somebody writes the first — which takes a signed-in account that does not publish it, and nothing else.