Every change Wellknown observed on this MCP server, newest first, with what it was before and what it became. Tool-surface changes carry the definition diff. Nothing here is edited after the fact.
Added "list_automation_run_steps", "list_automation_runs" and "list_preference_logs"; changed the definition of "replace_tenant_template" (170 tools before, 173 now)
⟨186 unchanged words⟩ up.\" }] }","properties":{"brand":{"additionalProperties":{},"description":"Inline brand overrides","type":"object"},"elements":{"description":"Elemental nodes. Channel and ⟨9 unchanged words⟩ ":[{"additionalProperties":false,"properties":{"align":{"enum":["center","left","right","full"],"type":"string"},"background_color":{"type":"string"},"border_color":{"type":"string"},"border_size":{"type":"string"},"channels":{"description":"Restrict this element to ⟨11 unchanged words⟩ to render","type":"string"},"font_size":{"description":"CSS px size, e.g. \"16px\"","type":"string"},"format":{"const":"markdown","description": ⟨16 unchanged words⟩ when truthy","type":"string"},"line_height":{"type":"string"},"locales":{"additionalProperties":{"additionalProperties":false,"properties":{"content":{"type":"string"}},"type":"object"},"description":"Overrides keyed by locale code","type":"object"},"loop":{"description":"Expression resolving to a list to repeat this element over","type":"string"},"padding":{"type":"string"},"ref":{"description":"Reference name for this element","type":"string"},"text_style":{"enum":["text","h1","h2","h3","subtext"],"type":"string"},"type":{"const":"text","type":"string"}},"required":["type","content"],"type":"object"},{"additionalProperties": ⟨5 unchanged words⟩ ,"if":{"$ref":"#/properties/content/properties/elements/items/anyOf/0/anyOf/0/properties/if"},"locales":{"additionalProperties":{"additionalProperties":false,"properties":{"title":{"type":"string"}},"type":"object"},"description":"Overrides keyed by locale code","type":"object"},"loop":{"$ref":"#/properties/content/properties/elements/items/anyOf/0/anyOf/0/properties/loop"},"ref" ⟨22 unchanged words⟩ additionalProperties":false,"properties":{"align":{"enum$ref":["center#/properties/content/properties/elements/items/anyOf/0/anyOf/0/properties/align"},"leftalt_text",:{"righttype",:"fullstring"]},"border_color":{"type":"string"},"altTextborder_size":{"type":"string"},"channels": ⟨11 unchanged words⟩ ,"if":{"$ref":"#/properties/content/properties/elements/items/anyOf/0/anyOf/0/properties/if"},"locales":{"additionalProperties":{"additionalProperties":false,"properties":{"href":{"type":"string"},"src":{"type":"string"}},"type":"object"},"description":"Overrides keyed by locale code","type":"object"},"loop":{"$ref":"#/properties/content/properties/elements/items/anyOf/0/anyOf/0/properties/loop"},"padding":{"type":"string"},"ref":{"$ref":"#/properties/content/properties/elements/items/anyOf/0/anyOf/0/properties/ref"},"src" ⟨24 unchanged words⟩ "},{"additionalProperties":false,"properties":{"actionIdaction_id":{"description":"Identifier reported with click tracking","type":"string"},"align":{"$ref":"#/properties/content/properties/elements/items/anyOf/0/anyOf/2/properties/align#/properties/content/properties/elements/items/anyOf/0/anyOf/0/properties/align"},"backgroundColorbackground_color":{"description":"Fill for `button`; border and label color for `secondary`","type":"string"},"border_radius":{"type":"string"},"border_size":{"type":"string"},"channels":{"$ref":"#/properties/content/properties/elements/items/anyOf/0/anyOf/0/properties/channels"},"content" ⟨3 unchanged words⟩ link label","type":"string"},"disable_tracking":{"description":"Skip click tracking for this href","type":"boolean"},"font_size":{"type":"string"},"href":{"description":"URL the action opens","type":"string"},"if":{"$ref":"#/properties/content/properties/elements/items/anyOf/0/anyOf/0/properties/if"},"locales":{"additionalProperties":{"additionalProperties":false,"properties":{"content":{"type":"string"},"href":{"type":"string"}},"type":"object"},"description":"Overrides keyed by locale code","type":"object"},"loop":{"$ref":"#/properties/content/properties/elements/items/anyOf/0/anyOf/0/properties/loop"},"padding":{"type":"string"},"ref":{"$ref":"#/properties/content/properties/elements/items/anyOf/0/anyOf/0/properties/ref"},"style":{"description":"How prominent the action is. `button` (default) is filled, `secondary` and `tertiary` are the other two button styles, and `link` is inline text","enum":["button","secondary","tertiary","link"],"type":"string"},"type" ⟨10 unchanged words⟩ "},{"additionalProperties":false,"properties":{"border_width":{"type":"string"},"channels":{"$ref":"#/properties/content/properties/elements/items/anyOf/0/anyOf/0/properties/channels"},"color" ⟨5 unchanged words⟩ ,"loop":{"$ref":"#/properties/content/properties/elements/items/anyOf/0/anyOf/0/properties/loop"},"padding":{"type":"string"},"ref":{"$ref":"#/properties/content/properties/elements/items/anyOf/0/anyOf/0/properties/ref"},"type":{"const":"divider","type":"string"},"width":{"type":"string"}},"required":["type"],"type":"object"},{"additionalProperties":false,"properties":{"align":{"$refenum":["#/properties/content/properties/elements/items/anyOf/0/anyOf/2/properties/aligncenter","left","right","full","justify"],"type":"string"},"borderColorborder_color":{"type":"string"},"border_size":{"type":"string"},"channels":{"$ref":"#/properties/content/properties/elements/items/anyOf/0/anyOf/0/properties/channels"},"content":{"type":"string"},"font_size":{"type":"string"},"if":{"$ref":"#/properties/content/properties/elements/items/anyOf/0/anyOf/0/properties/if"},"line_height":{"type":"string"},"locales":{"additionalProperties":{"additionalProperties":false,"properties":{"content":{"type":"string"}},"type":"object"},"description":"Overrides keyed by locale code","type":"object"},"loop":{"$ref":"#/properties/content/properties/elements/items/anyOf/0/anyOf/0/properties/loop"},"padding":{"type":"string"},"ref":{"$ref":"#/properties/content/properties/elements/items/anyOf/0/anyOf/0/properties/ref"},"textStyletext_style":{"enum$ref":["text#/properties/content/properties/elements/items/anyOf/0/anyOf/0/properties/text_style"},"h1type":{"const":"quote","h2type":"string"}},"subtextrequired":["type","content"],"type":"object"},{"additionalProperties":false,"properties":{"channels":{"$ref":"#/properties/content/properties/elements/items/anyOf/0/anyOf/0/properties/channels"},"content":{"description":"Raw HTML, rendered as-is","type":"string"},"if":{"$ref":"#/properties/content/properties/elements/items/anyOf/0/anyOf/0/properties/if"},"locales":{"additionalProperties":{"additionalProperties":false,"properties":{"content":{"type":"string"}},"type":"object"},"description":"Overrides keyed by locale code","type":"object"},"loop":{"$ref":"#/properties/content/properties/elements/items/anyOf/0/anyOf/0/properties/loop"},"ref":{"$ref":"#/properties/content/properties/elements/items/anyOf/0/anyOf/0/properties/ref"},"type":{"const":"quotehtml","type":"string"}},"required": ⟨98 unchanged words⟩ type":"object"}]},"type":"array"},"scope":{"description":"\"strict\" reads send data only under the `data.` prefix, e.g. {{data.name}}. Under \"default\", data is spread to the root and {{data.name}} renders empty","enum":["default","strict"],"type":"string"},"version":{"const":"2022-01-01", ⟨238 unchanged words⟩
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.
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.
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.
Added "archive_preview_device_set", "create_preview_device_set", "create_preview_run" and 6 more (161 tools before, 170 now)
Archive a preview device set. Runs that used it keep their own copy of its devices. The Courier Recommended set cannot be archived.
Create a named, reusable set of preview devices.
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.
Get a preview device set by id.
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.
Changed the definition of "courier_installation_guide", "get_audience", "get_brand" and 22 more
Get the Courier SDK installation guide for one platform: the install command, aspecificquick-startplatform.codeForsampleclient-sideandSDKsthe(React,relevantiOS,docAndroid,links.Flutter,
Added "cancel_broadcast_schedule", "create_broadcast", "delete_broadcast" and 13 more; changed the definition of "create_preference_topic", "replace_preference_topic" and "update_user_preference_topic" (145 tools before, 161 now)
⟨42 unchanged words⟩ ,"REQUIRED"],"type":"string"},"digest":{"anyOf":[{"additionalProperties":false,"properties":{"audience_id":{"description":"Optional audience the digest is scoped to","type":"string"},"categories":{"description":"Retention rules per category key. Defaults to a single `digest` category.","items":{"additionalProperties":false,"properties":{"category_key":{"description":"Key identifying the category within the digest","type":"string"},"limit":{"description":"How many collected events reach the rendered digest. Defaults to 10.","type":"integer"},"retain":{"description":"Which collected events survive the limit","enum":["FIRST","LAST","HIGHEST","LOWEST","NONE"],"type":"string"},"sort_key":{"description":"Data key to rank events by. Required when retain is HIGHEST or LOWEST.","type":"string"}},"required":["category_key"],"type":"object"},"type":"array"},"schedules":{"description":"The cadences this digest delivers on. At least one is required.","items":{"additionalProperties":false,"properties":{"day_of_month":{"description":"Required when frequency is monthly","type":"integer"},"day_of_week":{"description":"Required when frequency is weekly","enum":["sunday","monday","tuesday","wednesday","thursday","friday","saturday"],"type":"string"},"days_of_week":{"description":"Required when frequency is custom_days","items":{"enum":["sunday","monday","tuesday","wednesday","thursday","friday","saturday"],"type":"string"},"type":"array"},"disabled":{"description":"Whether the schedule is disabled","type":"boolean"},"frequency":{"description":"How often the digest delivers. `instant` delivers each event immediately.","enum":["instant","daily","weekdays","weekly","custom_days","monthly"],"type":"string"},"is_default":{"description":"The schedule recipients are placed on when they have not chosen one","type":"boolean"},"schedule_id":{"description":"Id of an existing schedule to update. Omit to create a new one.","type":"string"},"time":{"description":"24-hour local delivery time, HH:MM. Required for every frequency except instant.","type":"string"},"timezone":{"description":"IANA timezone for `time` and the day fields, e.g. America/New_York","type":"string"}},"required":["frequency"],"type":"object"},"minItems":1,"type":"array"},"template_id":{"description":"The notification template that renders the digest","type":"string"},"trigger_empty":{"description":"Deliver the digest even when nothing was collected","type":"boolean"}},"required":["template_id","schedules"],"type":"object"},{"type":"null"}],"description":"Batch this topic's notifications into a scheduled digest. Omit to leave any existing digest untouched; pass null to turn it off."},"
Changed the definition of "put_journey_template_locale"
⟨12 unchanged words⟩ must reference an existing element by its id. The template stays a draft; making it live is a separate step this tool cannot perform.
⟨21 unchanged words⟩ :{"description":"Target element ID to override, from a prior get_journey_template or get_journey_template_content response. Copy it exactly, character for character, from the response that returned it — never retype it from memory or reconstruct it.","type":"string"}},"required": ⟨7 unchanged words⟩ :"The journey template ID that owns thisnotificationnotification. Copy it exactly, character for character, from the response that returned it — never retype it from memory or reconstruct it.","type":"string"},"locale_id":{ ⟨9 unchanged words⟩ "notification_id":{"description":"The notification template
Changed the definition of "create_journey_template", "create_notification", "get_journey" and 17 more
⟨26 unchanged words⟩ 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: ⟨12 unchanged words⟩ "2022-01-01", elements: [{ type: "channel", channel: "email", elements: [{ type: "text", content: "Hello!" }] }] } } }. The result carries ⟨70 unchanged words⟩
⟨23 unchanged words⟩ "journey_id":{"description":"The journey templateIDID. Copy it exactly, character for character, from the response that returned it — never retype it from memory or reconstruct it.","type":"string"},"notification":{ ⟨31 unchanged words⟩
Added "get_notification_metrics" (144 tools before, 145 now)
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`. Default is the last 30 days by day. Fine granularities cover shorter windows: HOUR spans at most 7 days and DAY at most 90. How far back a workspace may look also depends on its plan; a request reaching …
Certificate recorded, valid to 2026-11-07
Authorization not required
First tool surface recorded: 144 tools (server version 1.3.7)
Showing the latest 10 events. The API returns up to 500 and filters by kind: ?kind=tool_surface_changed
List saved preview device sets. Every workspace has a read-only Courier Recommended set that runs can use without creating a set first.
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.
List a template's preview runs, newest first.
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.
⟨5 unchanged words⟩ ,"properties":{"platform":{"description":"TheWhichplatformSDK togetreturn the installation guideforfor.","enum":["nodejs","python","react","ios","android","flutter","react native"],"type":"string"},"user_id":{"description":"User ID for JWT generation (client-side SDKs only). Defaults to \"example_user\".","type":"string"}},"required":[ ⟨3 unchanged words⟩
Getanone audience byitsID, including the filter that defines its membership. Read this to explain why someone is or is not in an audience — the filterdefinition.is the rule, not a stored member list. Use list_audience_members for who currently matches.
Getaone brand by ID, including itsID.colors, logo and styling settings. Read this to describe what a template referencing this brand will actually look like.
Getaone list by itsID.ID, including its name and current state.
GetListallthesubscribersusersofsubscribed 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.
⟨5 unchanged words⟩ ,"properties":{"cursor":{"description":"PaginationFor fetching the next page. This is an opaque token — never decode it, edit it, or rebuild it. Pass it back exactly as it appeared in the previous response's cursor field, byte for byte. Omit this entirely when you don't have one from a prior response of this exact call.","type":"string"},"list_id":{ ⟨10 unchanged words⟩
RetrieveGetaone preference section byidID, 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.
RetrieveGetaone subscription topic within asection.section, including its default opt-in state. Returns 404 if the section or topic does not exist, or if the topic belongs to a differentsection.section — so a 404 here can mean the pairing is wrong rather than the topic missing.
GetListallthelistlistssubscriptionsoneforuser is subscribed to. Use this when explaining why auser.user received something — a subscription here is the reason a list-addressed send reached them, and its absence rules that path out.
⟨5 unchanged words⟩ ,"properties":{"cursor":{"description":"PaginationFor fetching the next page. This is an opaque token — never decode it, edit it, or rebuild it. Pass it back exactly as it appeared in the previous response's cursor field, byte for byte. Omit this entirely when you don't have one from a prior response of this exact call.","type":"string"},"user_id":{ ⟨10 unchanged words⟩
Getaone user'spreferencechoice for aspecificsingle subscriptiontopic.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.
⟨5 unchanged words⟩ ,"properties":{"tenant_id":{"description":"ScopeOmit this for the user's workspace-level choice, which answers most questions. Only pass it when you need this topic as scoped toaone specifictenanttenant.","type":"string"},"topic_id":{ ⟨19 unchanged words⟩
Listallthemembersusersofwho currently match anaudience.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.
⟨12 unchanged words⟩ :"string"},"cursor":{"description":"PaginationFor fetching the next page. This is an opaque token — never decode it, edit it, or rebuild it. Pass it back exactly as it appeared in the previous response's cursor field, byte for byte. Omit this entirely when you don't have one from a prior response of this exact call.","type":"string"}},"required": ⟨3 unchanged words⟩
Listalltheaudiencesworkspace'sinaudiences. An audience is a saved filter over user profiles — a dynamic segment — so this answers "who can I target" and gives you theworkspace.audience IDs that journey audience triggers and send requests refer to.
⟨5 unchanged words⟩ ,"properties":{"cursor":{"description":"PaginationFor fetching the next page. This is an opaque token — never decode it, edit it, or rebuild it. Pass it back exactly as it appeared in the previous response's cursor field, byte for byte. Omit this entirely when you don't have one from a prior response of this exact call.","type":"string"}},"type":"object"}
List the workspace's automation templatesin,theeachworkspace,withreturningitseachtemplatetemplate_idID anditswhetherversionitstate.hasOptionallyafilterpublishedbyor draft version. Answers "what automations already exist here" — this only reads the catalog, it never runs one.
⟨5 unchanged words⟩ ,"properties":{"cursor":{"description":"PaginationFor fetching the next page. This is an opaque token — never decode it, edit it, or rebuild it. Pass it back exactly as it appeared in the previous response's cursor field, byte for byte. Omit this entirely when you don't have one from a prior response of this exact call.","type":"string"},"version":{"description":"FilterReturnbyonlyversiontemplatesstatein this state. Omit to return every automation template regardless of state.","enum":["published","draft"], ⟨4 unchanged words⟩
Listallthebrandsworkspace'sinbrands. A brand is theworkspace.reusable logo, colors and email styling a notification template renders with; this gives you the brand IDs a template's brand reference points at.
⟨5 unchanged words⟩ ,"properties":{"cursor":{"description":"PaginationFor fetching the next page. This is an opaque token — never decode it, edit it, or rebuild it. Pass it back exactly as it appeared in the previous response's cursor field, byte for byte. Omit this entirely when you don't have one from a prior response of this exact call.","type":"string"}},"type":"object"}
List the digest instances for a digest schedule. Each instancerepresentsis the events accumulatedforsoafarsinglefor one user againstthethat schedule,usefulsoforthismonitoringshowsaccumulationwhatbeforeis waiting to go out and answers why a digest has not arrived yet — it isreleased.still accumulating, or it has nothing in it.
⟨5 unchanged words⟩ ,"properties":{"cursor":{"description":"PaginationFor fetching the next page. This is an opaque token — never decode it, edit it, or rebuild it. Pass it back exactly as it appeared in the previous response's cursor field, byte for byte. Omit this entirely when you don't have one from apreviousprior response of this exact call.","type":"string"},"limit":{"description":"MaxMaximum instances toreturnreturn.(defaultDefaults20,tomax20;100)the API caps this at 100.","type":"number"},"schedule_id":{ ⟨18 unchanged words⟩
GetListallthe 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(e.g.such'example.list.*')as "example.list.*".
⟨5 unchanged words⟩ ,"properties":{"cursor":{"description":"PaginationFor fetching the next page. This is an opaque token — never decode it, edit it, or rebuild it. Pass it back exactly as it appeared in the previous response's cursor field, byte for byte. Omit this entirely when you don't have one from a prior response of this exact call.","type":"string"},"pattern":{"description":"Filter by list id pattern,(e.g.where'example.list.*')* matches a segment — for example \"example.list.*\". Omit to return every list.","type":"string"}},"type":"object"}
List the checksforrecordedaagainst 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.
⟨14 unchanged words⟩ "submission_id":{"description":"The submission IDfor thewhose checksresourceto list","type":"string"}},"required": ⟨4 unchanged words⟩
List the version historyforof a notificationtemplate.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.
⟨5 unchanged words⟩ ,"properties":{"cursor":{"description":"PaginationFor fetching the next page. This is an opaque token — never decode it, edit it, or rebuild it. Pass it back exactly as it appeared in the previous response's cursor field, byte for byte. Omit this entirely when you don't have one from apreviousprior response of this exact call.","type":"string"},"limit":{"description":"MaxMaximum versions to return perpagepage.(defaultDefaults to 10,maxwhich10)is also the maximum.","type":"number"},"notification_id":{ ⟨11 unchanged words⟩
List notificationtemplates.templates,Optionallynewestfilterfirst.byPass tags to return only templates carrying ALL of the given tags. Page through the rest with cursor.
⟨51 unchanged words⟩ this exact call.","type":"string"},"tags":{"description":"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.","items":{"minLength":1,"type":"string"},"type":"array"}},"type":"object"}
List the workspace's preferencesections.sections,Eacheachsectionwithembedstheitstopicstopics.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.
List the subscription topicsininsideaone 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.
Listavailablethe providertypesintegrationsfromCourier supports and the configuration each one expects. This is the catalogwithoftheirwhatconfigurationCOULDschemas.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".
⟨5 unchanged words⟩ ,"properties":{"channel":{"description":"FilterReturnbyonly providers serving this channel,typefor(example email, sms,push,oretc.)push.","type":"string"},"keys":{"description":"Comma-separated provider keys tofilterreturn,byfor example \"sendgrid,twilio\".","type":"string"},"name":{"description":"Substring matchonagainstproviderthenameprovider's display name.","type":"string"}},"type":"object"}
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 theworkspace.rs_-prefixedReturnsstrategymetadataIDonly;thatuseget_routing_strategygetneeds for the fulldetails.definition.
⟨5 unchanged words⟩ ,"properties":{"cursor":{"description":"PaginationFor fetching the next page. This is an opaque token — never decode it, edit it, or rebuild it. Pass it back exactly as it appeared in the previous response's cursor field, byte for byte. Omit this entirely when you don't have one from a prior response of this exact call.","type":"string"},"limit":{"description":"MaxMaximumresultsstrategies to return perpagepage.(defaultDefaults20,tomax20;100)the API caps this at 100.","type":"number"}},"type":"object"}
List the users associated withaone tenant. Use this to confirm whether someone actually belongs to the tenant whose branding or preferences you are reasoning about.
⟨5 unchanged words⟩ ,"properties":{"cursor":{"description":"PaginationFor fetching the next page. This is an opaque token — never decode it, edit it, or rebuild it. Pass it back exactly as it appeared in the previous response's cursor field, byte for byte. Omit this entirely when you don't have one from a prior response of this exact call.","type":"string"},"limit":{"description":"MaxMaximumresultsusers to return perpagepage.(defaultDefaults20,tomax20;100)the API caps this at 100.","type":"number"},"tenant_id":{ ⟨10 unchanged words⟩
Listallthe workspace's tenants. A tenant is a customer or organisation whose users, branding and preferences are scoped separately; this answers "what tenantsindo I have" and gives you theworkspace.tenant IDs get_tenant needs.
⟨5 unchanged words⟩ ,"properties":{"cursor":{"description":"PaginationFor fetching the next page. This is an opaque token — never decode it, edit it, or rebuild it. Pass it back exactly as it appeared in the previous response's cursor field, byte for byte. Omit this entirely when you don't have one from a prior response of this exact call.","type":"string"},"limit":{"description":"MaxMaximumresultstenants to return perpagepage.","type":"number"}},"type":"object"}
Listallthe 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.
⟨5 unchanged words⟩ ,"properties":{"cursor":{"description":"PaginationFor fetching the next page. This is an opaque token — never decode it, edit it, or rebuild it. Pass it back exactly as it appeared in the previous response's cursor field, byte for byte. Omit this entirely when you don't have one from a prior response of this exact call.","type":"string"},"limit":{"description":"MaxMaximumresultstenants to return perpagepage.","type":"number"},"user_id":{ ⟨10 unchanged words⟩
Replace a topic within a section. Full documentreplacement;replacement:missingomitted optional fields arecleared.cleared, except `digest`, which is left untouched when omitted. Pass `digest: null` to turn a digest off.
⟨42 unchanged words⟩ ,"REQUIRED"],"type":"string"},"digest":{"anyOf":[{"additionalProperties":false,"properties":{"audience_id":{"description":"Optional audience the digest is scoped to","type":"string"},"categories":{"description":"Retention rules per category key. Defaults to a single `digest` category.","items":{"additionalProperties":false,"properties":{"category_key":{"description":"Key identifying the category within the digest","type":"string"},"limit":{"description":"How many collected events reach the rendered digest. Defaults to 10.","type":"integer"},"retain":{"description":"Which collected events survive the limit","enum":["FIRST","LAST","HIGHEST","LOWEST","NONE"],"type":"string"},"sort_key":{"description":"Data key to rank events by. Required when retain is HIGHEST or LOWEST.","type":"string"}},"required":["category_key"],"type":"object"},"type":"array"},"schedules":{"description":"The cadences this digest delivers on. At least one is required.","items":{"additionalProperties":false,"properties":{"day_of_month":{"description":"Required when frequency is monthly","type":"integer"},"day_of_week":{"description":"Required when frequency is weekly","enum":["sunday","monday","tuesday","wednesday","thursday","friday","saturday"],"type":"string"},"days_of_week":{"description":"Required when frequency is custom_days","items":{"enum":["sunday","monday","tuesday","wednesday","thursday","friday","saturday"],"type":"string"},"type":"array"},"disabled":{"description":"Whether the schedule is disabled","type":"boolean"},"frequency":{"description":"How often the digest delivers. `instant` delivers each event immediately.","enum":["instant","daily","weekdays","weekly","custom_days","monthly"],"type":"string"},"is_default":{"description":"The schedule recipients are placed on when they have not chosen one","type":"boolean"},"schedule_id":{"description":"Id of an existing schedule to update. Omit to create a new one.","type":"string"},"time":{"description":"24-hour local delivery time, HH:MM. Required for every frequency except instant.","type":"string"},"timezone":{"description":"IANA timezone for `time` and the day fields, e.g. America/New_York","type":"string"}},"required":["frequency"],"type":"object"},"minItems":1,"type":"array"},"template_id":{"description":"The notification template that renders the digest","type":"string"},"trigger_empty":{"description":"Deliver the digest even when nothing was collected","type":"boolean"}},"required":["template_id","schedules"],"type":"object"},{"type":"null"}],"description":"Batch this topic's notifications into a scheduled digest. Omit to leave any existing digest untouched; pass null to turn it off."},"include_unsubscribe_header":{"description":"Whether to include a ⟨82 unchanged words⟩
⟨14 unchanged words⟩ :"string"},"type":"array"},"digest_schedule_id":{"description":"Put the user on one of the topic's digest schedules. Pass null to clear their choice and fall back to the default schedule.","type":["string","null"]},"has_custom_routing":{"description":"Whether custom channel routing ⟨8 unchanged words⟩ enum":["OPTED_IN","OPTED_OUT","REQUIRED"],"type":"string"},"tenant_id":{"description":"Update the preference for this tenant context only","type":"string"},"topic_id":{" ⟨20 unchanged words⟩
Cancel a broadcast's scheduled send. The broadcast itself is kept.
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.
Delete a broadcast.
Copy a broadcast into a new draft. The original is left unchanged.
Get a broadcast by id, including its channel and send or schedule state.
Get a broadcast's Elemental content.
Get one journey run by id: its journey, status, and timestamps.
List broadcasts in the workspace.
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.
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.
Replace a broadcast's content with an Elemental document. Saved as a draft unless state is PUBLISHED.
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.
Rename a broadcast. Content and channel are unchanged.
Schedule a broadcast to send later to a list or audience. Cancel with cancel_broadcast_schedule.
Send a broadcast now to every member of a list or audience. This delivers real messages.
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.
⟨15 unchanged words⟩ separately afterwards. A newly created template is adraft and cannot be sentdraft;untilmaking itis published; publishinglive is a separateoperation (or passstepstate:this'PUBLISHED'tooloncannotcreate).perform. Link a routing strategy via notification.routing.strategy_id to control ⟨21 unchanged words⟩
⟨13 unchanged words⟩ "properties":{"brand":{"anyOf":[{"additionalProperties":false,"properties":{"id":{"type":"string"}},"required":["id"],"type":"object"},{"type":"null"}],"description":"Brand to apply, or null for none. Required on every call — never omit this key, and never send {}."},"content":{"additionalProperties":false,"description":"Elemental content, required on every call. Example: { version: \"2022-01-01\", elements: [{ type: \"text\", content: \"Hello!\" }] }.","properties":{"elements":{"description":"Elemental content nodes","items":{"additionalProperties":{},"type":"object"},"type":"array"},"version":{"description":"Content version identifier, e.g. \"2022-01-01\"","type":"string"}},"required":["version","elements"],"type":"object"},"name":{"description":"Template display name","type":"string"},"routing":{"anyOf":[{"additionalProperties":false,"properties":{"strategy_id":{"description":"From a get_routing_strategy or list_notifications/get_notification response for THIS template's own intended strategy — never an id borrowed from an unrelated template found while searching for one.","type":"string"}},"required":["strategy_id"],"type":"object"},{"type":"null"}],"description":"Routing strategy reference, or null to use the workspace default. Required on every call — never omit this key, and never send {}: the API rejects both an absent routing key and an empty object; if you have no strategy id, send null explicitly."},"subscription":{"anyOf":[{"additionalProperties":false,"properties":{"topic_id":{"type":"string"}},"required":["topic_id"],"type":"object"},{"type":"null"}],"description":"Subscription topic reference, or null for none. Required on every call — never omit this key, and never send {}."},"tags":{"description":"Tag list (use [] if none)","items":{"type":"string"},"type":"array"}},"required":["name","tags","brand","subscription","routing","content"],"type":"object"},"state":{"description":"TemplateMuststatebeafter\"DRAFT\".creationThese(defaultstoolstocannotDRAFT)publish.","enum":["DRAFT","PUBLISHED"],"type":"string"}},"required" ⟨3 unchanged words⟩
⟨6 unchanged words⟩ "journey_id":{"description":"The journey templateIDID. Copy it exactly, character for character, from the response that returned it — never retype it from memory or reconstruct it.","type":"string"},"version":{ ⟨22 unchanged words⟩
⟨8 unchanged words⟩ :"The journey template ID that owns thisnotificationnotification. Copy it exactly, character for character, from the response that returned it — never retype it from memory or reconstruct it.","type":"string"},"notification_id":{"description":"The notification templateIDID. Copy it exactly, character for character, from the response that returned it — never retype it from memory or reconstruct it.","type":"string"},"version":{ ⟨19 unchanged words⟩
⟨8 unchanged words⟩ :"The journey template ID that owns thisnotificationnotification. Copy it exactly, character for character, from the response that returned it — never retype it from memory or reconstruct it.","type":"string"},"notification_id":{"description":"The notification templateIDID. Copy it exactly, character for character, from the response that returned it — never retype it from memory or reconstruct it.","type":"string"},"version":{ ⟨23 unchanged words⟩
⟨6 unchanged words⟩ "notification_id":{"description":"The notification templateIDID. Copy it exactly, character for character, from the response that returned it — never retype it from memory or reconstruct it.","type":"string"},"version":{"description":"Version to retrieve:draft\"draft\",published\"published\" (default — omit this to get it), or a version string likev001\"v001\"","type":"string"}},"required": ⟨3 unchanged words⟩
⟨6 unchanged words⟩ "notification_id":{"description":"The notification templateIDID. Copy it exactly, character for character, from the response that returned it — never retype it from memory or reconstruct it.","type":"string"}},"required": ⟨3 unchanged words⟩
⟨6 unchanged words⟩ "notification_id":{"description":"The notification templateIDID. Copy it exactly, character for character, from the response that returned it — never retype it from memory or reconstruct it.","type":"string"}},"required": ⟨3 unchanged words⟩
⟨5 unchanged words⟩ ,"properties":{"tenant_id":{"description":"ScopeOmitpreferencesthis toaget 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.","type":"string"},"user_id":{ ⟨10 unchanged words⟩
⟨5 unchanged words⟩ ,"properties":{"cursor":{"description":"PaginationCheck 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 token — never decode it, edit it, or rebuild it. Pass it back exactly as it appeared in the previous response's cursor field, byte for byte. Omit this entirely when you don't have one from a prior response of this exact call.","type":"string"},"journey_id":{"description":"The journey templateIDID. Copy it exactly, character for character, from the response that returned it — never retype it from memory or reconstruct it.","type":"string"},"limit":{ ⟨10 unchanged words⟩
⟨5 unchanged words⟩ ,"properties":{"cursor":{"description":"PaginationIf 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 rebuild it. Pass it back exactly as it appeared in the previous response's cursor field, byte for byte. Omit this entirely when you don't have one from a prior response of this exact call.","type":"string"},"version":{"description":"Filter by version state. Defaults topublished.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 value — is the correct way to check both, not a repeat.","enum":["published","draft"], ⟨4 unchanged words⟩
⟨5 unchanged words⟩ ,"properties":{"archived":{"description":"IncludeThis 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 it true is not the thorough or safe choice; it is a different, much smaller result set.","type":"boolean"},"cursor":{"description":"PaginationFor 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 forfetchingbyte.theOmitnextthispageentirely when you don't have one from a prior response of this exact call.","type":"string"},"enqueued_after":{ ⟨118 unchanged words⟩
⟨5 unchanged words⟩ ,"properties":{"cursor":{"description":"PaginationThis is an opaque token — never decode it, edit it, or rebuild it. Pass it back exactly as it appeared in the previous response's cursor field, byte for byte. Omit this entirely when you don't have one from a prior response of this exact call.","type":"string"}},"type":"object"}
⟨5 unchanged words⟩ ,"properties":{"cursor":{"description":"PaginationThis is an opaque token — never decode it, edit it, or rebuild it. Pass it back exactly as it appeared in the previous response's cursor field, byte for byte. Omit this entirely when you don't have one from a prior response of this exact call.","type":"string"}},"type":"object"}
⟨7 unchanged words⟩ ":{"description":"Array of elemental contentnodesnodes. 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 same field. Example: [{ type: \"channel\", channel: \"email\", elements: [{ type: \"text\", content: \"Hello!\" }] }].","items":{"additionalProperties":{},"type":" ⟨5 unchanged words⟩ :"The journey template ID that owns thisnotificationnotification. Copy it exactly, character for character, from the response that returned it — never retype it from memory or reconstruct it.","type":"string"},"notification_id":{"description":"The notification templateIDID. Copy it exactly, character for character, from the response that returned it — never retype it from memory or reconstruct it.","type":"string"},"state":{ ⟨39 unchanged words⟩
⟨58 unchanged words⟩ "Inbox plain text only" }] }]. The template stays a draft; making it live is a separate step this tool cannot perform.
⟨21 unchanged words⟩ ":"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.","type":"string"},"state":{"description":"TemplateMuststatebeafter\"DRAFT\".updateThese tools cannot publish.","enum":["DRAFT","PUBLISHED"],"type":"string"},"version":{"description":"Content version string (e.g. \"2022-01-01\"). Server defaults when omitted.","type":"string"}},"required": ⟨4 unchanged words⟩
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.⟨27 unchanged words⟩ :{"description":"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 memory or reconstruct it.","type":"string"},"if":{ ⟨19 unchanged words⟩ ":"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.","type":"string"},"ref":{ ⟨4 unchanged words⟩ :"string"},"state":{"description":"TemplateMuststatebeafter\"DRAFT\".updateThese tools cannot publish.","enum":["DRAFT","PUBLISHED"],"type":"string"},"type": ⟨17 unchanged words⟩
⟨41 unchanged words⟩ enlace para restablecer su contraseña." }] }. The template stays a draft; making it live is a separate step this tool cannot perform.
⟨21 unchanged words⟩ :{"description":"Target element ID to override, 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 memory or reconstruct it.","type":"string"}},"required": ⟨17 unchanged words⟩ ":"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.","type":"string"},"state":{"description":"TemplateMuststatebeafter\"DRAFT\".updateThese tools cannot publish.","enum":["DRAFT","PUBLISHED"],"type":"string"}},"required" ⟨5 unchanged words⟩
⟨16 unchanged words⟩ {"description":"The journey template ID toupdateupdate. Copy it exactly, character for character, from the response that returned it — never retype it from memory or reconstruct it.","type":"string"},"name":{ ⟨310 unchanged words⟩
Replace a notification template entirely (full document PUT). The template stays a draft; making it live is a separate step this tool cannot perform.⟨14 unchanged words⟩ "properties":{"brand":{"anyOf":[{"additionalProperties":false,"properties":{"id":{"type":"string"}},"required":["id"],"type":"object"},{"type":"null"}],"description":"Brand to apply, or null for none. Required on every call — never omit this key, and never send {}."},"content":{"additionalProperties":false,"description":"Elemental content, required on every call. Example: { version: \"2022-01-01\", elements: [{ type: \"text\", content: \"Hello!\" }] }.","properties":{"elements":{"description":"Elemental content nodes","items":{"additionalProperties":{},"type":"object"},"type":"array"},"version":{"description":"Content version identifier, e.g. \"2022-01-01\"","type":"string"}},"required":["version","elements"],"type":"object"},"name":{"description":"Template display name","type":"string"},"routing":{"anyOf":[{"additionalProperties":false,"properties":{"strategy_id":{"description":"From a get_routing_strategy or list_notifications/get_notification response for THIS template's own intended strategy — never an id borrowed from an unrelated template found while searching for one.","type":"string"}},"required":["strategy_id"],"type":"object"},{"type":"null"}],"description":"Routing strategy reference, or null to use the workspace default. Required on every call — never omit this key, and never send {}: the API rejects both an absent routing key and an empty object; if you have no strategy id, send null explicitly."},"subscription":{"anyOf":[{"additionalProperties":false,"properties":{"topic_id":{"type":"string"}},"required":["topic_id"],"type":"object"},{"type":"null"}],"description":"Subscription topic reference, or null for none. Required on every call — never omit this key, and never send {}."},"tags":{"description":"Tag list (use [] if none)","items":{"type":"string"},"type":"array"}},"required":["name","tags","brand","subscription","routing","content"],"type":"object"},"notification_id":{"description":"The notification template ID toreplacereplace. Copy it exactly, character for character, from the response that returned it — never retype it from memory or reconstruct it.","type":"string"},"state":{"description":"TemplateMuststatebeafter\"DRAFT\".updateThese(defaultstoolstocannotDRAFT)publish.","enum":["DRAFT","PUBLISHED"],"type":"string"}},"required" ⟨4 unchanged words⟩