Tools reference

All 126 Lumail tools with their parameters, permissions and availability.

Generated from the tool registry by pnpm tools:reference. Do not edit this page by hand.

Lumail exposes 126 organization-scoped tools. The same definitions power the in-app assistant, the MCP server, the ChatGPT / Claude plugin and the Tools API (POST /api/v2/tools/{name}). GET /api/v2/tools returns the full JSON Schema of every tool your token can call.

Campaigns

list_campaigns

List email campaigns in your organization with optional filtering by status and search.

  • Endpoint: POST /api/v2/tools/list_campaigns
  • Token permission: campaigns
  • In-app assistant: every member
  • ChatGPT / Claude plugin: read
ParameterTypeRequiredDescription
limitintegerNoDefault: 20.
pageintegerNoDefault: 1.
afterstringNo
beforestringNo
status"DRAFT" | "SCHEDULED" | "SENDING" | "SENT" | "ARCHIVED" | "FAILED"No
querystringNo

create_campaign

Create a new email campaign. The campaign will be created in DRAFT status. If no senderId is provided, it will use the default sender, then last used sender, then any available sender.

  • Endpoint: POST /api/v2/tools/create_campaign
  • Token permission: campaigns
  • In-app assistant: owners and admins
  • ChatGPT / Claude plugin: write
ParameterTypeRequiredDescription
subjectstringYesEmail subject line (required)
namestringNoCampaign name. Default: "Untitled".
previewstring | nullNoPreview/preheader text shown in email clients
contentanyNoMAILY: TipTap JSON ({ type: "doc", content: [...] }). HTML: a raw HTML string that already includes <a href="{{unsubscribeUrl}}">Unsubscribe</a>. Rendering does not add a footer. Call get_skill({ type: "campaign" }) for examples.
contentType"MAILY" | "HTML"NoContent format. MAILY is the visual editor; HTML is raw source. Default: "MAILY".
senderIdstringNoEmail sender ID. If not provided, uses default sender. Call get_email_senders to list available senders.
replyTostring | nullNoReply-to email address

get_campaign

Get detailed information about a specific campaign by ID.

  • Endpoint: POST /api/v2/tools/get_campaign
  • Token permission: campaigns
  • In-app assistant: every member
  • ChatGPT / Claude plugin: read
ParameterTypeRequiredDescription
campaignIdstringYes

get_campaign_progress

Get the sending progress of a campaign that is currently being sent.

  • Endpoint: POST /api/v2/tools/get_campaign_progress
  • Token permission: analytics
  • In-app assistant: every member
  • ChatGPT / Claude plugin: read
ParameterTypeRequiredDescription
campaignIdstringYes

get_campaign_analytics

Get detailed analytics for a sent campaign including opens, clicks, and link performance.

  • Endpoint: POST /api/v2/tools/get_campaign_analytics
  • Token permission: analytics
  • In-app assistant: every member
  • ChatGPT / Claude plugin: read
ParameterTypeRequiredDescription
campaignIdstringYes

duplicate_campaign

Create a complete copy of a campaign including all content and settings. The duplicate will be a DRAFT.

  • Endpoint: POST /api/v2/tools/duplicate_campaign
  • Token permission: campaigns
  • In-app assistant: owners and admins
  • ChatGPT / Claude plugin: write
ParameterTypeRequiredDescription
campaignIdstringYes
newNamestringNo

edit_campaign

Modify a broadcast campaign (name, subject, preview, senderId, replyTo, content, contentType). Rejects workflow emails — use configure_workflow_draft.

TWO exclusive modes:

  • "content": full body rewrite. MAILY = TipTap JSON ({ type: "doc", content: [...] }). HTML = a raw HTML string. Switching format requires contentType plus a matching replacement body. This replaces the old body.
  • "operations": surgical TipTap edits only. Rejected on HTML campaigns. Metadata fields (name, subject, preview, senderId, replyTo) can be combined with either mode. NEVER send content and operations together. Metadata-only updates never switch format.

Call get_campaign first. After an HTML edit, call get_campaign and render_campaign. Rendering does not add an unsubscribe footer. Missing unsubscribe is a send-time error, not a save-time error.

WHEN NOT TO USE:

  • Workflow EMAIL steps (type WORKFLOW) -> configure_workflow_draft with an inline email object. Never edit_campaign. get_campaign is read-only.

  • Listing/searching campaigns -> use list_campaigns

  • Getting campaign details -> use get_campaign

  • Updating recipient filters -> use update_campaign_filters

  • Endpoint: POST /api/v2/tools/edit_campaign

  • Token permission: campaigns

  • In-app assistant: owners and admins

  • ChatGPT / Claude plugin: write

ParameterTypeRequiredDescription
idstringYesCampaign ID to update
namestringNoNew campaign name
subjectstringNoNew subject line
previewstring | nullNoNew preview/preheader text
contentanyNoReplacement body. MAILY: TipTap JSON. HTML: raw HTML string, e.g. <p>Updated email</p><p><a href="{{unsubscribeUrl}}">Unsubscribe</a></p>. Cannot be combined with operations.
operationsany[]NoArray of surgical edit operations to apply to existing content. Cannot be combined with content.
senderIdstringNoEmail sender ID. Call get_email_senders to list available senders.
replyTostring | nullNoReply-to email address. Pass null to clear.
contentType"MAILY" | "HTML"NoTarget format. Required with content when switching MAILY ↔ HTML. Metadata-only updates must omit this or keep the current format.
expectedUpdatedAtstringNoRevision guard from get_campaign.updatedAt. Required when switching format.

auto_fit_campaign_images

Apply the editor's magic-wand auto-fit to a draft campaign's images: reads each image's natural dimensions and fits it without upscaling. Always run with dryRun=true first to inspect the proposed sizes. Call get_skill({ type: "images" }) for the full sequence, sizing rules and safety limits.

  • Endpoint: POST /api/v2/tools/auto_fit_campaign_images
  • Token permission: campaigns
  • In-app assistant: owners and admins
  • ChatGPT / Claude plugin: write
ParameterTypeRequiredDescription
campaignIdstringYesCampaign or internal workflow email ID.
imageIndexesinteger[]NoOptional image indexes from this tool's dry-run output. Omit to auto-fit every image in document traversal order.
maxWidthintegerNoDefault: 600.
maxHeightintegerNoDefault: 400.
dryRunbooleanNoInspect and calculate dimensions without changing the campaign. Default: false.

get_available_filters

Get the machine-readable filter schema (types, operators, required fields) used by update_campaign_filters, query_subscribers and segments. Prefer get_skill({ type: 'filters' }), which also documents how to resolve each ID.

  • Endpoint: POST /api/v2/tools/get_available_filters
  • Token permission: campaigns
  • In-app assistant: every member
  • ChatGPT / Claude plugin: not available

No parameters.

update_campaign_filters

Update the recipient filters of a DRAFT campaign. Conditions in the same group use AND; groups use OR. Omitted group means 0. Call get_skill({ type: 'filters' }) first for the filter shapes, operators and how to resolve each ID.

  • Endpoint: POST /api/v2/tools/update_campaign_filters
  • Token permission: campaigns
  • In-app assistant: owners and admins
  • ChatGPT / Claude plugin: not available
ParameterTypeRequiredDescription
campaignIdstringYesCampaign ID to update
filtersobject[]YesArray of filters to apply

send_test_email

Send a test email for a campaign to one or more email addresses (max 50). The test email will have '[Test]' prefix in the subject. Test emails are not tracked in analytics.

  • Endpoint: POST /api/v2/tools/send_test_email
  • Token permission: campaigns
  • In-app assistant: owners and admins
  • ChatGPT / Claude plugin: not available
ParameterTypeRequiredDescription
campaignIdstringYesCampaign ID to send test for
emailsstring[]YesEmail addresses to send test to (1-50)

render_campaign

Render a campaign to its final HTML and plain text. Nothing is sent. Rendering does not add an unsubscribe footer — hasUnsubscribeLink reports whether a usable link is already present. Pass subscriberId to resolve variables and Show if conditions; otherwise all conditional blocks are shown.

  • Endpoint: POST /api/v2/tools/render_campaign
  • Token permission: campaigns
  • In-app assistant: every member
  • ChatGPT / Claude plugin: read
ParameterTypeRequiredDescription
campaignIdstringYesCampaign ID to render
subscriberIdstringNoOptional subscriber ID to resolve variables and conditional blocks for
format"html" | "text" | "both"NoWhich output to return (default: both)

schedule_campaign

Schedule a DRAFT campaign (status becomes SCHEDULED). Campaign AI findings and evaluator outages do not block HUMAN_VERIFIED, WHITELISTED, or organizations retaining prior human approval. AUTO_VERIFIED and AI_VERIFIED without prior human approval remain subject to blocking checks. The server determines eligibility; other sending restrictions and the unsubscribe link requirement still apply. No date sends immediately; a date without time sends at midnight in the given timezone.

This is a dangerous action requiring an explicit second request. The first call returns a short-lived, one-use confirmation code bound to the organization, token, tool, and exact input.

  • Endpoint: POST /api/v2/tools/schedule_campaign
  • Token permission: send
  • In-app assistant: owners and admins
  • ChatGPT / Claude plugin: not available
ParameterTypeRequiredDescription
campaignIdstringYesCampaign ID to schedule
datestringNoDate to schedule (ISO format, e.g. '2025-03-20'). If omitted, sends immediately.
hoursintegerNoHour to send (0-23)
minutesintegerNoMinutes (0-59)
timezonestring | nullNoTimezone for the scheduled time (e.g. 'Europe/Paris', 'America/New_York')
confirmationCodenumberNoRequired for dangerous actions. Include the code from the confirmation challenge to execute.

cancel_campaign_schedule

Cancel a scheduled campaign, reverting it back to DRAFT status. Only works on SCHEDULED campaigns (not SENDING or SENT).

This is a dangerous action requiring an explicit second request. The first call returns a short-lived, one-use confirmation code bound to the organization, token, tool, and exact input.

  • Endpoint: POST /api/v2/tools/cancel_campaign_schedule
  • Token permission: send
  • In-app assistant: owners and admins
  • ChatGPT / Claude plugin: not available
ParameterTypeRequiredDescription
campaignIdstringYesCampaign ID to cancel schedule for
confirmationCodenumberNoRequired for dangerous actions. Include the code from the confirmation challenge to execute.

list_campaign_history

List version history entries for a campaign. Returns entries sorted by most recent first with cursor-based pagination. Each entry shows when it was saved and the source (autosave, manual, or ai).

  • Endpoint: POST /api/v2/tools/list_campaign_history
  • Token permission: campaigns
  • In-app assistant: every member
  • ChatGPT / Claude plugin: not available
ParameterTypeRequiredDescription
campaignIdstringYesCampaign ID to get history for
cursorstringNoCursor for pagination (history entry ID from previous page)
limitintegerNoNumber of entries to return (default 20, max 100) Default: 20.

get_campaign_history_entry

Get a specific campaign history entry with full content. Use this to inspect what the campaign looked like at a specific point in time before restoring it.

  • Endpoint: POST /api/v2/tools/get_campaign_history_entry
  • Token permission: campaigns
  • In-app assistant: every member
  • ChatGPT / Claude plugin: not available
ParameterTypeRequiredDescription
campaignIdstringYesCampaign ID
historyIdstringYesHistory entry ID to retrieve

restore_campaign_history

Restore a campaign to a previous version from its history. This updates the campaign's subject and content to match the selected history entry, and creates a new history entry recording the restoration.

  • Endpoint: POST /api/v2/tools/restore_campaign_history
  • Token permission: campaigns
  • In-app assistant: owners and admins
  • ChatGPT / Claude plugin: not available
ParameterTypeRequiredDescription
campaignIdstringYesCampaign ID to restore
historyIdstringYesHistory entry ID to restore from

archive_campaign

Archive a DRAFT campaign. Archived campaigns are hidden from the main campaign list but can be restored with unarchive_campaign. Only DRAFT campaigns can be archived.

  • Endpoint: POST /api/v2/tools/archive_campaign
  • Token permission: campaigns
  • In-app assistant: owners and admins
  • ChatGPT / Claude plugin: not available
ParameterTypeRequiredDescription
campaignIdstringYesCampaign ID to archive

unarchive_campaign

Restore an ARCHIVED campaign back to DRAFT status so it can be edited and scheduled again.

  • Endpoint: POST /api/v2/tools/unarchive_campaign
  • Token permission: campaigns
  • In-app assistant: owners and admins
  • ChatGPT / Claude plugin: not available
ParameterTypeRequiredDescription
campaignIdstringYesCampaign ID to unarchive

delete_campaign

Delete a draft campaign by id.

This is a dangerous action requiring an explicit second request. The first call returns a short-lived, one-use confirmation code bound to the organization, token, tool, and exact input.

  • Endpoint: POST /api/v2/tools/delete_campaign
  • Token permission: campaigns
  • In-app assistant: owners and admins
  • ChatGPT / Claude plugin: not available
ParameterTypeRequiredDescription
campaignIdstringYes
confirmationCodenumberNoRequired for dangerous actions. Include the code from the confirmation challenge to execute.

Subscribers

list_subscribers

List subscribers in your organization. Filter by tag, status, or search query. Returns results with email, name, status, tags, sorted by creation date descending.

  • Endpoint: POST /api/v2/tools/list_subscribers
  • Token permission: subscribers
  • In-app assistant: every member
  • ChatGPT / Claude plugin: read
ParameterTypeRequiredDescription
limitintegerNoDefault: 50.
status"all" | "SUBSCRIBED" | "UNSUBSCRIBED" | "PENDING_CONFIRMATION" | "BOUNCED" | "BANNED" | "COMPLAINED" | "TRANSACTIONAL"NoDefault: "all".
tagstringNoFilter by tag name (case-insensitive)
querystringNo
cursorstringNoCursor for pagination (subscriber ID from previous page)

query_subscribers

List subscribers matching composed filters - the same engine the UI uses, cursor-paginated. Use it instead of list_subscribers when you need conditional filters (e.g. clicked link X in campaign Y AND is BANNED). Call get_skill({ type: "filters" }) for the filter shapes and operators.

  • Endpoint: POST /api/v2/tools/query_subscribers
  • Token permission: subscribers
  • In-app assistant: every member
  • ChatGPT / Claude plugin: read
ParameterTypeRequiredDescription
filtersobject[]NoArray of filter objects - same shape as update_campaign_filters and create_segment. See get_skill({ type: "filters" }). Default: [].
status"PENDING_CONFIRMATION" | "SUBSCRIBED" | "UNSUBSCRIBED" | "BOUNCED" | "BANNED" | "COMPLAINED" | "TRANSACTIONAL" | "ALL"NoSubscriber status filter - applied in addition to the filters array. Defaults to ALL. Default: "ALL".
querystringNoFree-text search across email, name, and tag name.
limitintegerNoDefault: 50.
cursorstringNoCursor for pagination (subscriber ID from previous page).
fields("id" | "email" | "name" | "phone" | "status" | "createdAt" | "updatedAt" | "tags" | "customFields" | "revenue" | "emailCount" | "openCount" | "clickCount")[]NoSubset of fields to include per subscriber. Defaults to id, email, name, status, createdAt, tags. Available: id, email, name, phone, status, createdAt, updatedAt, tags, customFields, revenue, emailCount, openCount, clickCount.

count_subscribers

Count subscribers matching composed filters - same engine as query_subscribers but returns only the total. Useful for previews before scheduling a campaign or building a segment.

  • Endpoint: POST /api/v2/tools/count_subscribers
  • Token permission: subscribers
  • In-app assistant: every member
  • ChatGPT / Claude plugin: read
ParameterTypeRequiredDescription
filtersobject[]NoArray of filter objects - same shape as update_campaign_filters and create_segment. Default: [].
status"PENDING_CONFIRMATION" | "SUBSCRIBED" | "UNSUBSCRIBED" | "BOUNCED" | "BANNED" | "COMPLAINED" | "TRANSACTIONAL" | "ALL"NoSubscriber status filter - applied in addition to the filters array. Defaults to ALL. Default: "ALL".
querystringNoFree-text search across email, name, and tag name.

get_subscriber

Get detailed information about a specific subscriber by ID or email.

  • Endpoint: POST /api/v2/tools/get_subscriber
  • Token permission: subscribers
  • In-app assistant: every member
  • ChatGPT / Claude plugin: read
ParameterTypeRequiredDescription
subscriberIdstringNo
emailstringNo

add_subscriber

Add a new subscriber or update an existing one. Supports tags and custom fields.

  • Endpoint: POST /api/v2/tools/add_subscriber
  • Token permission: subscribers
  • In-app assistant: owners and admins
  • ChatGPT / Claude plugin: write
ParameterTypeRequiredDescription
emailstringYes
namestringNo
phonestringNo
tagsstring[]NoDefault: [].
fieldsobject | nullNoDefault: {}.
replaceTagsbooleanNoDefault: false.
resubscribebooleanNoDefault: true.
triggerWorkflowsbooleanNo
skipDoubleOptInbooleanNo
ipAddressstringNo
countrystringNo

update_subscriber

Update a subscriber by ID or email.

  • Endpoint: POST /api/v2/tools/update_subscriber
  • Token permission: subscribers
  • In-app assistant: owners and admins
  • ChatGPT / Claude plugin: not available
ParameterTypeRequiredDescription
subscriberstringYes
emailstringNo
namestringNo
phonestringNo
tagsstring[]No
fieldsobject | nullNoDefault: {}.
replaceTagsbooleanNo
resubscribebooleanNo
triggerWorkflowsbooleanNo
skipDoubleOptInbooleanNo
ipAddressstringNo
countrystringNo

delete_subscriber

Subscriber deletion is disabled. Use unsubscribe instead.

This is a dangerous action requiring an explicit second request. The first call returns a short-lived, one-use confirmation code bound to the organization, token, tool, and exact input.

  • Endpoint: POST /api/v2/tools/delete_subscriber
  • Token permission: subscribers
  • In-app assistant: owners and admins
  • ChatGPT / Claude plugin: not available
ParameterTypeRequiredDescription
subscriberstringYes
confirmationCodenumberNoRequired for dangerous actions. Include the code from the confirmation challenge to execute.

unsubscribe

Unsubscribe a subscriber by ID or email. The subscriber will no longer receive emails.

This is a dangerous action requiring an explicit second request. The first call returns a short-lived, one-use confirmation code bound to the organization, token, tool, and exact input.

  • Endpoint: POST /api/v2/tools/unsubscribe
  • Token permission: subscribers
  • In-app assistant: owners and admins
  • ChatGPT / Claude plugin: not available
ParameterTypeRequiredDescription
subscriberIdstringNo
emailstringNo
reasonstringNo
confirmationCodenumberNoRequired for dangerous actions. Include the code from the confirmation challenge to execute.

bulk_add_tags

Add one or more tags to multiple subscribers at once. Max 100 subscribers and 20 tags per call. Emits a tag.added event for each newly added tag, so tag-based workflow triggers (including Workflow event triggers) will fire exactly like when tags are added from the app.

This is a dangerous action requiring an explicit second request. The first call returns a short-lived, one-use confirmation code bound to the organization, token, tool, and exact input.

  • Endpoint: POST /api/v2/tools/bulk_add_tags
  • Token permission: subscribers
  • In-app assistant: owners and admins
  • ChatGPT / Claude plugin: write
ParameterTypeRequiredDescription
subscriberIdsstring[]Yes
tagNamesstring[]Yes
confirmationCodenumberNoRequired for dangerous actions. Include the code from the confirmation challenge to execute.

bulk_remove_tags

Remove one or more tags from multiple subscribers. Max 100 subscribers and 20 tags per call. Emits a tag.removed event for each removed tag, so tag-based workflow triggers and exit rules react exactly like when tags are removed from the app.

This is a dangerous action requiring an explicit second request. The first call returns a short-lived, one-use confirmation code bound to the organization, token, tool, and exact input.

  • Endpoint: POST /api/v2/tools/bulk_remove_tags
  • Token permission: subscribers
  • In-app assistant: owners and admins
  • ChatGPT / Claude plugin: write
ParameterTypeRequiredDescription
subscriberIdsstring[]Yes
tagNamesstring[]Yes
confirmationCodenumberNoRequired for dangerous actions. Include the code from the confirmation challenge to execute.

create_bulk_operation

Queue a durable subscriber bulk action (same pipeline as Subscribers → Actions). Returns immediately with an operationId. Poll get_bulk_operation until status is COMPLETED, PARTIALLY_FAILED, or FAILED. Do not use bulk_add_tags / add_subscribers_to_workflow for large audiences.

This is a dangerous action requiring an explicit second request. The first call returns a short-lived, one-use confirmation code bound to the organization, token, tool, and exact input.

  • Endpoint: POST /api/v2/tools/create_bulk_operation
  • Token permission: subscribers
  • In-app assistant: owners and admins
  • ChatGPT / Claude plugin: write
ParameterTypeRequiredDescription
action"ADD_TAGS" | "REMOVE_TAGS" | "UNSUBSCRIBE" | "SUBSCRIBE" | "BAN" | "ADD_TO_WORKFLOW" | "REMOVE_FROM_WORKFLOW"YesSame actions as Subscribers → Actions. Large audiences are queued, not applied in this request.
idempotencyKeystringNoReuse to avoid double-queue. Generated if omitted.
subscriberIdsstring[]NoExplicit IDs. Omit to use the current filters/query/status.
sourceOperationIdstringNoReuse a previous operation's frozen audience.
filtersobject[]NoSame filter objects as query_subscribers.
querystringNoFree-text search across email, name, and tag name.
status"PENDING_CONFIRMATION" | "SUBSCRIBED" | "UNSUBSCRIBED" | "BOUNCED" | "BANNED" | "COMPLAINED" | "TRANSACTIONAL" | "ALL"No
tagsstring[]No
reasonstringNoOptional unsubscribe reason.
workflowIdstringNo
stepIdstringNoStarting step when action is ADD_TO_WORKFLOW.
confirmationCodenumberNoRequired for dangerous actions. Include the code from the confirmation challenge to execute.

get_bulk_operation

Read one durable subscriber bulk operation: status, progress counts, and last error. Poll until done is true.

  • Endpoint: POST /api/v2/tools/get_bulk_operation
  • Token permission: subscribers
  • In-app assistant: owners and admins
  • ChatGPT / Claude plugin: read
ParameterTypeRequiredDescription
operationIdstringYes

list_bulk_operations

List the 20 most recent visible durable subscriber bulk operations for this organization.

  • Endpoint: POST /api/v2/tools/list_bulk_operations
  • Token permission: subscribers
  • In-app assistant: owners and admins
  • ChatGPT / Claude plugin: read

No parameters.

create_event

Create a custom event for a subscriber. Useful for tracking purchases, conversions, or other actions.

  • Endpoint: POST /api/v2/tools/create_event
  • Token permission: subscribers
  • In-app assistant: owners and admins
  • ChatGPT / Claude plugin: not available
ParameterTypeRequiredDescription
subscriberIdstringNo
emailstringNo
eventType"SUBSCRIBER_PAYMENT" | "SUBSCRIBER_REFUND"Yes
amountnumberNo
currencystringNoDefault: "USD".
metadataobjectNo

list_subscriber_events

List events for a subscriber. Use this to check if an email was delivered, opened, clicked, bounced, etc. Filter by event type to find specific events.

  • Endpoint: POST /api/v2/tools/list_subscriber_events
  • Token permission: subscribers
  • In-app assistant: every member
  • ChatGPT / Claude plugin: not available
ParameterTypeRequiredDescription
subscriberIdstringNo
emailstringNo
eventType"SUBSCRIBED" | "UNSUBSCRIBED" | "TAG_ADDED" | "TAG_REMOVED" | "EMAIL_OPENED" | "EMAIL_CLICKED" | "EMAIL_SENT" | "EMAIL_DELIVERY_DELAYED" | "WORKFLOW_STARTED" | "WORKFLOW_COMPLETED" | "WORKFLOW_CANCELED" | "FIELD_UPDATED" | "EMAIL_BOUNCED" | "EMAIL_COMPLAINED" | "EMAIL_RECEIVED" | "WEBHOOK_EXECUTED" | "SUBSCRIBER_PAYMENT" | "SUBSCRIBER_REFUND"No
limitintegerNoDefault: 50.
afterstringNo

get_subscriber_emails

Get emails sent to a subscriber with their delivery status. Use this to check if emails were delivered, bounced, or are pending. Shows campaign name, subject, and detailed status.

  • Endpoint: POST /api/v2/tools/get_subscriber_emails
  • Token permission: subscribers
  • In-app assistant: every member
  • ChatGPT / Claude plugin: not available
ParameterTypeRequiredDescription
subscriberIdstringNo
emailstringNo
status"PENDING" | "SENT" | "DELIVERED" | "BOUNCED" | "COMPLAINED"No
limitintegerNoDefault: 20.

Workflows

list_workflows

List graph-based workflow automations.

  • Endpoint: POST /api/v2/tools/list_workflows
  • Token permission: workflows
  • In-app assistant: every member
  • ChatGPT / Claude plugin: read
ParameterTypeRequiredDescription
limitintegerNoDefault: 20.
querystringNo

get_workflow

Get a Workflow draft graph, published version information, settings, and active subscriber count.

  • Endpoint: POST /api/v2/tools/get_workflow
  • Token permission: workflows
  • In-app assistant: every member
  • ChatGPT / Claude plugin: read
ParameterTypeRequiredDescription
workflowIdstringYes

create_workflow

Create a graph-based Workflow draft. It must be configured and published before it can enroll subscribers.

  • Endpoint: POST /api/v2/tools/create_workflow
  • Token permission: workflows
  • In-app assistant: owners and admins
  • ChatGPT / Claude plugin: write
ParameterTypeRequiredDescription
namestringYes

configure_workflow_draft

Configure an entire Workflow draft (steps, edges, waits, branches, actions, goals, settings) in one atomic operation. Never publishes or sends. Call get_skill({ type: 'workflow' }) then get_workflow first - the skill documents the step types, edges, eventFilters keys and the EMAIL-step rule that replaces create_campaign and edit_campaign.

  • Endpoint: POST /api/v2/tools/configure_workflow_draft
  • Token permission: workflows
  • In-app assistant: owners and admins
  • ChatGPT / Claude plugin: write
ParameterTypeRequiredDescription
workflowIdstringYes
expectedUpdatedAtstringYesExact updatedAt returned by get_workflow
settingsobjectNo
stepsobject[]YesComplete replacement list of Workflow steps
edgesobject[]YesComplete replacement list of directed graph edges
successGoalsobject[]No

update_workflow_draft

Replace a Workflow draft graph atomically. The full {steps, edges} definition is validated before it is saved. Every EMAIL step is ownership-checked; foreign or broadcast campaign IDs are duplicated into dedicated internal WORKFLOW emails before saving.

  • Endpoint: POST /api/v2/tools/update_workflow_draft
  • Token permission: workflows
  • In-app assistant: owners and admins
  • ChatGPT / Claude plugin: write
ParameterTypeRequiredDescription
workflowIdstringYes
expectedUpdatedAtstringYes
definitionobjectYesComplete Workflow graph. Use configure_workflow_draft to add EMAIL steps with inline content. Existing campaign IDs are ownership-checked and duplicated rather than linked when they do not belong to that exact step.

publish_workflow

Validate and publish the current Workflow draft as a new immutable version. Activation: publishing never deactivates a live workflow and never re-activates a paused one; pass activate:true to go live, activate:false to publish paused. When omitted, only a first publish (DRAFT) activates.

This is a dangerous action requiring an explicit second request. The first call returns a short-lived, one-use confirmation code bound to the organization, token, tool, and exact input.

  • Endpoint: POST /api/v2/tools/publish_workflow
  • Token permission: workflows
  • In-app assistant: owners and admins
  • ChatGPT / Claude plugin: not available
ParameterTypeRequiredDescription
workflowIdstringYes
activatebooleanNotrue: activate after publishing. false: keep the workflow paused. Omitted: first publish activates, a paused workflow stays paused.
confirmationCodenumberNoRequired for dangerous actions. Include the code from the confirmation challenge to execute.

update_workflow_status

Activate, pause, or archive a published Workflow.

This is a dangerous action requiring an explicit second request. The first call returns a short-lived, one-use confirmation code bound to the organization, token, tool, and exact input.

  • Endpoint: POST /api/v2/tools/update_workflow_status
  • Token permission: workflows
  • In-app assistant: owners and admins
  • ChatGPT / Claude plugin: not available
ParameterTypeRequiredDescription
workflowIdstringYes
status"ACTIVE" | "PAUSED" | "ARCHIVED"Yes
confirmationCodenumberNoRequired for dangerous actions. Include the code from the confirmation challenge to execute.

add_subscriber_to_workflow

Manually enroll one subscriber in an active, published Workflow. Optional stepId starts at that published step. Bypasses trigger events and trigger audience filters; exit rules still apply. For a filtered list, use add_subscribers_to_workflow.

  • Endpoint: POST /api/v2/tools/add_subscriber_to_workflow
  • Token permission: workflows
  • In-app assistant: owners and admins
  • ChatGPT / Claude plugin: write
ParameterTypeRequiredDescription
workflowIdstringYes
subscriberIdstringNo
emailstringNo
stepIdstringNoPublished step to start from. Omit to start at the trigger.

add_subscribers_to_workflow

Manually enroll a filtered subscriber set in an active published Workflow — same as Subscribers → Select all → Add to workflow, but synchronous and capped. For large audiences use create_bulk_operation({ action: 'ADD_TO_WORKFLOW' }) then poll get_bulk_operation. Use the same filters as query_subscribers. Call dryRun:true first to preview the match count and published steps. Optional stepId starts at that step. Bypasses trigger rules; does not bypass exit rules. Call get_skill({ type: 'docs', page: 'workflows/workflow-manual-enrollment' }) for the product rules.

This is a dangerous action requiring an explicit second request. The first call returns a short-lived, one-use confirmation code bound to the organization, token, tool, and exact input.

  • Endpoint: POST /api/v2/tools/add_subscribers_to_workflow
  • Token permission: workflows
  • In-app assistant: owners and admins
  • ChatGPT / Claude plugin: write
ParameterTypeRequiredDescription
workflowIdstringYes
stepIdstringNoPublished step to start from. Omit to start at the trigger.
filtersobject[]NoSame filter objects as query_subscribers. Call get_skill({ type: "filters" }) for shapes. Default: [].
querystringNoFree-text search across email, name, and tag name.
status"PENDING_CONFIRMATION" | "SUBSCRIBED" | "UNSUBSCRIBED" | "BOUNCED" | "BANNED" | "COMPLAINED" | "TRANSACTIONAL" | "ALL"NoDefault: "SUBSCRIBED".
subscriberIdsstring[]NoExplicit IDs instead of filters. Max 500.
dryRunbooleanNoIf true, return the match count and published steps only. Default: false.
confirmationCodenumberNoRequired for dangerous actions. Include the code from the confirmation challenge to execute.

remove_subscriber_from_workflow

Cancel active Workflow runs for a subscriber.

  • Endpoint: POST /api/v2/tools/remove_subscriber_from_workflow
  • Token permission: workflows
  • In-app assistant: owners and admins
  • ChatGPT / Claude plugin: not available
ParameterTypeRequiredDescription
workflowIdstringYes
subscriberIdstringNo
emailstringNo

get_subscriber_workflow_runs

List a subscriber's workflow runs in this organization: status, current step, and nextActionAt. Active and waiting runs first, then recent completed or failed runs. Optional workflowId narrows to one workflow.

  • Endpoint: POST /api/v2/tools/get_subscriber_workflow_runs
  • Token permission: workflows
  • In-app assistant: every member
  • ChatGPT / Claude plugin: read
ParameterTypeRequiredDescription
subscriberIdstringNo
emailstringNo
workflowIdstringNoIf set, only return runs for this workflow.

fast_forward_workflow_subscriber

Expire the current WAIT or WAIT_UNTIL timer on one subscriber's run and resume the runner immediately. The next EMAIL or ACTION executes for real. One call completes one wait. WAIT_UNTIL follows the TIMEOUT edge. Inspect first with get_subscriber_workflow_runs. Not for EMAIL delivery parks or jumping to an arbitrary step.

  • Endpoint: POST /api/v2/tools/fast_forward_workflow_subscriber
  • Token permission: workflows
  • In-app assistant: owners and admins
  • ChatGPT / Claude plugin: write
ParameterTypeRequiredDescription
workflowIdstringYes
subscriberIdstringNo
emailstringNo
workflowSubscriberIdstringNoRequired when the subscriber has more than one waiting run in this workflow.

delete_workflow

Delete an unused Workflow draft, or archive it when published versions or run history must be preserved.

This is a dangerous action requiring an explicit second request. The first call returns a short-lived, one-use confirmation code bound to the organization, token, tool, and exact input.

  • Endpoint: POST /api/v2/tools/delete_workflow
  • Token permission: workflows
  • In-app assistant: owners and admins
  • ChatGPT / Claude plugin: not available
ParameterTypeRequiredDescription
workflowIdstringYes
confirmationCodenumberNoRequired for dangerous actions. Include the code from the confirmation challenge to execute.

list_workflow_groups

List Workflow groups with their conflict strategy and assigned workflow count. Call this before assigning a groupId; never invent a group ID.

  • Endpoint: POST /api/v2/tools/list_workflow_groups
  • Token permission: workflows
  • In-app assistant: every member
  • ChatGPT / Claude plugin: read
ParameterTypeRequiredDescription
querystringNo
limitintegerNoDefault: 50.

get_workflow_group

Get a Workflow group, its assigned workflows, and current active-run counts.

  • Endpoint: POST /api/v2/tools/get_workflow_group
  • Token permission: workflows
  • In-app assistant: every member
  • ChatGPT / Claude plugin: read
ParameterTypeRequiredDescription
groupIdstringYes

create_workflow_group

Create a Workflow group. The operation is idempotent when a case-insensitive name match already has the requested strategy.

  • Endpoint: POST /api/v2/tools/create_workflow_group
  • Token permission: workflows
  • In-app assistant: owners and admins
  • ChatGPT / Claude plugin: write
ParameterTypeRequiredDescription
namestringYes
conflictStrategy"CANCEL_EXISTING" | "SKIP_NEW" | "RUN_FIRST_STEP"NoDefault: "CANCEL_EXISTING".

update_workflow_group

Rename a Workflow group or change its conflict strategy for future enrollments. Requires a fresh get_workflow_group read and optimistic concurrency.

  • Endpoint: POST /api/v2/tools/update_workflow_group
  • Token permission: workflows
  • In-app assistant: owners and admins
  • ChatGPT / Claude plugin: write
ParameterTypeRequiredDescription
groupIdstringYes
expectedUpdatedAtstringYes
namestringNo
conflictStrategy"CANCEL_EXISTING" | "SKIP_NEW" | "RUN_FIRST_STEP"No

set_workflow_group

Assign a Workflow to an existing group, or detach it with groupId:null, without replacing its graph or publishing. The change affects future enrollments only.

  • Endpoint: POST /api/v2/tools/set_workflow_group
  • Token permission: workflows
  • In-app assistant: owners and admins
  • ChatGPT / Claude plugin: write
ParameterTypeRequiredDescription
workflowIdstringYes
expectedUpdatedAtstringYes
groupIdstring | nullYes

delete_workflow_group

Permanently delete a Workflow group after a fresh read. Refuses to delete an assigned group unless unassignWorkflows:true is explicit.

This is a dangerous action requiring an explicit second request. The first call returns a short-lived, one-use confirmation code bound to the organization, token, tool, and exact input.

  • Endpoint: POST /api/v2/tools/delete_workflow_group
  • Token permission: workflows
  • In-app assistant: owners and admins
  • ChatGPT / Claude plugin: not available
ParameterTypeRequiredDescription
groupIdstringYes
expectedNamestringYes
expectedUpdatedAtstringYes
unassignWorkflowsbooleanNoDefault: false.
confirmationCodenumberNoRequired for dangerous actions. Include the code from the confirmation challenge to execute.

Segments

list_segments

List saved subscriber segments in your organization.

  • Endpoint: POST /api/v2/tools/list_segments
  • Token permission: audience
  • In-app assistant: every member
  • ChatGPT / Claude plugin: not available
ParameterTypeRequiredDescription
limitintegerNoDefault: 20.

get_segment

Get detailed information about a specific segment including all filter configurations.

  • Endpoint: POST /api/v2/tools/get_segment
  • Token permission: audience
  • In-app assistant: every member
  • ChatGPT / Claude plugin: not available
ParameterTypeRequiredDescription
segmentIdstringYes

create_segment

Create a new subscriber segment with filter configuration.

  • Endpoint: POST /api/v2/tools/create_segment
  • Token permission: audience
  • In-app assistant: owners and admins
  • ChatGPT / Claude plugin: not available
ParameterTypeRequiredDescription
namestringYes
filtersobject[]NoDefault: [].

update_segment

Update a segment's name or filter configuration.

  • Endpoint: POST /api/v2/tools/update_segment
  • Token permission: audience
  • In-app assistant: owners and admins
  • ChatGPT / Claude plugin: not available
ParameterTypeRequiredDescription
segmentIdstringYes
namestringNo
filtersobject[]No

delete_segment

Permanently delete a segment.

This is a dangerous action requiring an explicit second request. The first call returns a short-lived, one-use confirmation code bound to the organization, token, tool, and exact input.

  • Endpoint: POST /api/v2/tools/delete_segment
  • Token permission: audience
  • In-app assistant: owners and admins
  • ChatGPT / Claude plugin: not available
ParameterTypeRequiredDescription
segmentIdstringYes
confirmationCodenumberNoRequired for dangerous actions. Include the code from the confirmation challenge to execute.

duplicate_segment

Create a copy of a segment with all its filters.

  • Endpoint: POST /api/v2/tools/duplicate_segment
  • Token permission: audience
  • In-app assistant: owners and admins
  • ChatGPT / Claude plugin: not available
ParameterTypeRequiredDescription
segmentIdstringYes
newNamestringNo

Tags

list_tags

List all tags in your organization.

  • Endpoint: POST /api/v2/tools/list_tags
  • Token permission: audience
  • In-app assistant: every member
  • ChatGPT / Claude plugin: read

No parameters.

create_tag

Create a new tag in your organization.

  • Endpoint: POST /api/v2/tools/create_tag
  • Token permission: audience
  • In-app assistant: owners and admins
  • ChatGPT / Claude plugin: not available
ParameterTypeRequiredDescription
namestringYes

get_tag

Get a tag by id or name, including subscriber count.

  • Endpoint: POST /api/v2/tools/get_tag
  • Token permission: audience
  • In-app assistant: owners and admins
  • ChatGPT / Claude plugin: not available
ParameterTypeRequiredDescription
tagstringYes

update_tag

Rename a tag by id or name.

  • Endpoint: POST /api/v2/tools/update_tag
  • Token permission: audience
  • In-app assistant: owners and admins
  • ChatGPT / Claude plugin: not available
ParameterTypeRequiredDescription
tagstringYes
namestringYes

delete_tag

Delete a tag by ID or name. This will remove the tag from all subscribers.

This is a dangerous action requiring an explicit second request. The first call returns a short-lived, one-use confirmation code bound to the organization, token, tool, and exact input.

  • Endpoint: POST /api/v2/tools/delete_tag
  • Token permission: audience
  • In-app assistant: owners and admins
  • ChatGPT / Claude plugin: not available
ParameterTypeRequiredDescription
tagIdstringNo
namestringNo
confirmationCodenumberNoRequired for dangerous actions. Include the code from the confirmation challenge to execute.

get_or_create_tags

Get existing tags or create new ones by name. Tags are labels used to categorize subscribers and trigger workflows. This tool automatically creates any tags that don't exist yet.

  • Endpoint: POST /api/v2/tools/get_or_create_tags
  • Token permission: audience
  • In-app assistant: owners and admins
  • ChatGPT / Claude plugin: write
ParameterTypeRequiredDescription
namesstring[]YesArray of tag names to get or create

Analytics

get_org_stats

Get overall organization statistics including subscriber counts, campaign metrics, and resource totals.

  • Endpoint: POST /api/v2/tools/get_org_stats
  • Token permission: analytics
  • In-app assistant: every member
  • ChatGPT / Claude plugin: read

No parameters.

get_subscriber_growth

Analyze subscriber growth over a specified time period. Shows new subscribers, unsubscribes, and net growth.

  • Endpoint: POST /api/v2/tools/get_subscriber_growth
  • Token permission: analytics
  • In-app assistant: every member
  • ChatGPT / Claude plugin: read
ParameterTypeRequiredDescription
daysintegerNoDefault: 30.

get_subscriber_stats

Get subscriber growth and status statistics for your organization.

  • Endpoint: POST /api/v2/tools/get_subscriber_stats
  • Token permission: analytics
  • In-app assistant: every member
  • ChatGPT / Claude plugin: read

No parameters.

get_subscribers_by_tag

Get all subscribers that have a specific tag. Useful for understanding tag usage.

  • Endpoint: POST /api/v2/tools/get_subscribers_by_tag
  • Token permission: analytics
  • In-app assistant: every member
  • ChatGPT / Claude plugin: not available
ParameterTypeRequiredDescription
tagNamestringYes
limitintegerNoDefault: 10.

count_subscribers_by_status

Get subscriber count by status. Optionally filter by a specific status.

  • Endpoint: POST /api/v2/tools/count_subscribers_by_status
  • Token permission: analytics
  • In-app assistant: every member
  • ChatGPT / Claude plugin: not available
ParameterTypeRequiredDescription
status"SUBSCRIBED" | "UNSUBSCRIBED" | "BOUNCED" | "BANNED" | "COMPLAINED" | "TRANSACTIONAL"No

Email

send_email

Send a transactional email. Provide exactly one of html, tiptap, or markdown. Markdown is rendered to HTML. text is generated from the rendered HTML when omitted.

This is a dangerous action requiring an explicit second request. The first call returns a short-lived, one-use confirmation code bound to the organization, token, tool, and exact input.

  • Endpoint: POST /api/v2/tools/send_email
  • Token permission: emails
  • In-app assistant: owners and admins
  • ChatGPT / Claude plugin: not available
ParameterTypeRequiredDescription
fromstringYes
tostring | string[]YesOne recipient. Multiple addresses are not supported.
subjectstringYes
htmlstringNo
tiptapstring | objectNo
markdownstringNo
textstringNo
reply_tostring | string[]No
ccstring | string[]No
bccstring | string[]No
headersobjectNo
tagsobject[]No
previewstringNo
trackingobjectNoOpen and click tracking. Both default to true.
idempotencyKeystringNo
attachmentsanyNo
templateanyNo
topic_idanyNo
scheduled_atanyNo
reactanyNo
contentanyNo
contentTypeanyNo
confirmationCodenumberNoRequired for dangerous actions. Include the code from the confirmation challenge to execute.

send_batch_emails

Send up to 100 transactional emails. Same body as send_email.

This is a dangerous action requiring an explicit second request. The first call returns a short-lived, one-use confirmation code bound to the organization, token, tool, and exact input.

  • Endpoint: POST /api/v2/tools/send_batch_emails
  • Token permission: emails
  • In-app assistant: owners and admins
  • ChatGPT / Claude plugin: not available
ParameterTypeRequiredDescription
emailsobject[]Yes
idempotencyKeystringNo
confirmationCodenumberNoRequired for dangerous actions. Include the code from the confirmation challenge to execute.

get_email

Retrieve a single sent or queued transactional email.

  • Endpoint: POST /api/v2/tools/get_email
  • Token permission: emails
  • In-app assistant: owners and admins
  • ChatGPT / Claude plugin: not available
ParameterTypeRequiredDescription
idstringYes

list_emails

List transactional emails sent through the API, newest first. Paginate with after/before ids.

  • Endpoint: POST /api/v2/tools/list_emails
  • Token permission: emails
  • In-app assistant: owners and admins
  • ChatGPT / Claude plugin: not available
ParameterTypeRequiredDescription
limitintegerNoDefault: 20.
afterstringNo
beforestringNo

verify_email

Verify an email address. Returns an email_verification object. accept is the policy decision. result is deliverable, risky, undeliverable, or unknown. suggestion is a better address when the domain looks like a typo. issues lists every error or warning. score is 0-100 or null.

  • Endpoint: POST /api/v2/tools/verify_email
  • Token permission: emails
  • In-app assistant: owners and admins
  • ChatGPT / Claude plugin: not available
ParameterTypeRequiredDescription
emailstringYes

Deliverability

get_deliverability_health

Assess the organization's deliverability health (sender reputation). Omit sinceDays for the all-time trust score; pass it for a windowed sent/delivered/bounced/complained report with verdicts.

  • Endpoint: POST /api/v2/tools/get_deliverability_health
  • Token permission: domains
  • In-app assistant: every member
  • ChatGPT / Claude plugin: not available
ParameterTypeRequiredDescription
sinceDaysintegerNo

list_suppressed_subscribers

List suppressed subscribers (BOUNCED and/or COMPLAINED), most recently suppressed first, with pagination. Each entry includes the most recent bounce/complaint event details (bounceCategory, reason, bounceType, provider, complaintFeedbackType).

  • Endpoint: POST /api/v2/tools/list_suppressed_subscribers
  • Token permission: domains
  • In-app assistant: every member
  • ChatGPT / Claude plugin: not available
ParameterTypeRequiredDescription
status"BOUNCED" | "COMPLAINED"No
pageintegerNoDefault: 1.
pageSizeintegerNoDefault: 50.

reactivate_subscriber

Reactivate a suppressed subscriber (BOUNCED, COMPLAINED, or UNSUBSCRIBED) by setting their status back to SUBSCRIBED. Refuses hard bounces (bounceCategory NO_SUCH_USER or INTERNAL / SES suppression list) unless 'force' is true.

This is a dangerous action requiring an explicit second request. The first call returns a short-lived, one-use confirmation code bound to the organization, token, tool, and exact input.

  • Endpoint: POST /api/v2/tools/reactivate_subscriber
  • Token permission: domains
  • In-app assistant: owners and admins
  • ChatGPT / Claude plugin: not available
ParameterTypeRequiredDescription
subscriberIdstringYes
forcebooleanNo
confirmationCodenumberNoRequired for dangerous actions. Include the code from the confirmation challenge to execute.

Domains

list_domains

List the organization's email sending domains with their verification status. Call get_skill({ type: 'sending' }) for the full domain and sender setup flow.

  • Endpoint: POST /api/v2/tools/list_domains
  • Token permission: domains
  • In-app assistant: every member
  • ChatGPT / Claude plugin: not available

No parameters.

create_domain

Register a new email sending domain and return the DNS records the user must add. Call get_skill({ type: 'sending' }) first for the full setup flow.

  • Endpoint: POST /api/v2/tools/create_domain
  • Token permission: domains
  • In-app assistant: owners and admins
  • ChatGPT / Claude plugin: not available
ParameterTypeRequiredDescription
domainstringYesThe domain to register, e.g. mail.example.com
region"AP_SOUTHEAST_2" | "EU_CENTRAL_1" | "US_WEST_1"NoSES sending region for this domain; defaults to Frankfurt. Cannot be changed after creation.

get_domain

Retrieve one sending domain by id or domain name.

  • Endpoint: POST /api/v2/tools/get_domain
  • Token permission: domains
  • In-app assistant: owners and admins
  • ChatGPT / Claude plugin: not available
ParameterTypeRequiredDescription
domainstringYes

get_domain_dns_records

Get a domain's DNS records with their per-record verification status, to show the user what to configure and what is still pending.

  • Endpoint: POST /api/v2/tools/get_domain_dns_records
  • Token permission: domains
  • In-app assistant: every member
  • ChatGPT / Claude plugin: not available
ParameterTypeRequiredDescription
domainIdstringYesThe MailDomain id

verify_domain

Re-check a domain's verification, DKIM and MAIL FROM state and return the updated per-record DNS statuses. Call get_skill({ type: 'sending' }) for what to do with the result.

  • Endpoint: POST /api/v2/tools/verify_domain
  • Token permission: domains
  • In-app assistant: owners and admins
  • ChatGPT / Claude plugin: not available
ParameterTypeRequiredDescription
domainIdstringYesThe MailDomain id or hostname

create_email_sender

Create an email sender (from-address) as localPart@domain. The domain does not need to be verified yet — the sender cannot send until it is. Call get_skill({ type: 'sending' }) for the prerequisites.

  • Endpoint: POST /api/v2/tools/create_email_sender
  • Token permission: domains
  • In-app assistant: owners and admins
  • ChatGPT / Claude plugin: not available
ParameterTypeRequiredDescription
displayNamestringYesThe display name shown in the From header
localPartstringYesThe part before the @, e.g. 'hello' in [email protected]
domainIdstringYesThe MailDomain id to attach the sender to
replyTostring | nullNoOptional reply-to email address

list_web_domains

List the organization's web domains (capture pages and click-tracking hosts) with their verification status. Use verify_web_domain to re-check a host. Sending domains are list_domains.

  • Endpoint: POST /api/v2/tools/list_web_domains
  • Token permission: domains
  • In-app assistant: every member
  • ChatGPT / Claude plugin: not available

No parameters.

get_web_domain

Retrieve one web domain by id (wdom_...) or hostname, including the CNAME the user must add. Sending domains are get_domain.

  • Endpoint: POST /api/v2/tools/get_web_domain
  • Token permission: domains
  • In-app assistant: every member
  • ChatGPT / Claude plugin: not available
ParameterTypeRequiredDescription
domainIdstringYesThe WebDomain id (wdom_...) or hostname

verify_web_domain

Re-check a web domain's Cloudflare custom-hostname verification (the Check Verification Status button on /domains/web/:id). Returns the updated status and CNAME. Use this for wdom_... hosts — verify_domain is SES sending domains only.

  • Endpoint: POST /api/v2/tools/verify_web_domain
  • Token permission: domains
  • In-app assistant: owners and admins
  • ChatGPT / Claude plugin: not available
ParameterTypeRequiredDescription
domainIdstringYesThe WebDomain id (wdom_...) or hostname

Images

upload_image

Import an image from a public http/https URL into your organization media library. Fetches the image, validates it is an image under 2MB, uploads it to storage, and returns the hosted image with a URL that can be used directly in campaign image blocks.

  • Endpoint: POST /api/v2/tools/upload_image
  • Token permission: campaigns
  • In-app assistant: owners and admins
  • ChatGPT / Claude plugin: not available
ParameterTypeRequiredDescription
urlstringYesPublic http(s) URL of the image to import.
namestringNoOptional display name for the imported image.
descriptionstringNoShort description of what the image shows (subject, colors, intended usage). Strongly recommended: this is what makes the image findable later with list_images.

list_images

Search the organization media library. The query matches both the image name and its description, so you can search by what the image shows (e.g. 'logo', 'hero photo'). Newest first.

  • Endpoint: POST /api/v2/tools/list_images
  • Token permission: campaigns
  • In-app assistant: every member
  • ChatGPT / Claude plugin: not available
ParameterTypeRequiredDescription
querystringNoOptional case-insensitive search matched against both the image name and its description.
capturePageIdstringNoOnly return images uploaded for this capture page. Omit to search the whole library.
pageintegerNoDefault: 1.
pageSizeintegerNoDefault: 50.

describe_image

Set or update the description of an image already in the media library. Use it right after a user uploads an image so it becomes findable later with list_images. Accepts either the image id or its URL.

  • Endpoint: POST /api/v2/tools/describe_image
  • Token permission: campaigns
  • In-app assistant: owners and admins
  • ChatGPT / Claude plugin: not available
ParameterTypeRequiredDescription
imageIdstringNoId of the image. Provide either imageId or url.
urlstringNoURL of the image. Provide either imageId or url.
descriptionstringYesWhat the image shows: subject, dominant colors, and how it should be used on the page.
namestringNoOptional human-readable name replacing the raw filename.

Import / Export

import_subscribers

Bulk import subscribers (up to 500 per call). Existing subscribers are updated, new ones created, and workflows are NOT triggered by default. Returns imported/updated/failed counts with per-row errors.

  • Endpoint: POST /api/v2/tools/import_subscribers
  • Token permission: subscribers
  • In-app assistant: owners and admins
  • ChatGPT / Claude plugin: not available
ParameterTypeRequiredDescription
subscribersobject[]Yes
resubscribebooleanNoRe-subscribe previously unsubscribed contacts. Default: false.
triggerWorkflowsbooleanNoTrigger automation workflows on import. Defaults to false for bulk imports. Default: false.

export_subscribers

Export a small subscriber sample inline (default 1000, max 10000). For the full filtered audience as CSV, use create_subscriber_export and poll get_subscriber_export.

  • Endpoint: POST /api/v2/tools/export_subscribers
  • Token permission: subscribers
  • In-app assistant: every member
  • ChatGPT / Claude plugin: not available
ParameterTypeRequiredDescription
status"PENDING_CONFIRMATION" | "SUBSCRIBED" | "UNSUBSCRIBED" | "BOUNCED" | "BANNED" | "COMPLAINED" | "TRANSACTIONAL"No
tagstringNoFilter by tag name (case-insensitive).
format"json" | "csv"NoDefault: "json".
limitintegerNoDefault: 1000.

create_subscriber_export

Queue a durable CSV export of the current subscriber filters (same pipeline as Subscribers → Export). Returns immediately with an exportId. Poll get_subscriber_export until done is true, then download from the app.

  • Endpoint: POST /api/v2/tools/create_subscriber_export
  • Token permission: subscribers
  • In-app assistant: owners and admins
  • ChatGPT / Claude plugin: write
ParameterTypeRequiredDescription
status"PENDING_CONFIRMATION" | "SUBSCRIBED" | "UNSUBSCRIBED" | "BOUNCED" | "BANNED" | "COMPLAINED" | "TRANSACTIONAL" | "ALL"NoDefault: "SUBSCRIBED".
querystringNoDefault: "".
filtersobject[]NoDefault: [].
subscriberIdsstring[]No
columns("email" | "name" | "phone" | "status" | "tags" | "emailCount" | "openCount" | "clickCount" | "createdAt")[]NoDefault: ["email","name","tags","emailCount","openCount","clickCount","createdAt"].
fieldIdsstring[]NoDefault: [].
idempotencyKeystringNoReuse to avoid double-queue. Generated if omitted.

get_subscriber_export

Poll a durable subscriber CSV export. When done is true and downloadable is true, the CSV is ready in the Lumail app.

  • Endpoint: POST /api/v2/tools/get_subscriber_export
  • Token permission: subscribers
  • In-app assistant: owners and admins
  • ChatGPT / Claude plugin: read
ParameterTypeRequiredDescription
exportIdstringYes

list_subscriber_exports

List the 10 most recent subscriber CSV exports.

  • Endpoint: POST /api/v2/tools/list_subscriber_exports
  • Token permission: subscribers
  • In-app assistant: owners and admins
  • ChatGPT / Claude plugin: read

No parameters.

Web

fetch_web_page

Fetch a web page and convert to markdown format

  • Endpoint: POST /api/v2/tools/fetch_web_page
  • Token permission: settings
  • In-app assistant: every member
  • ChatGPT / Claude plugin: not available
ParameterTypeRequiredDescription
urlstringYesThe full URL of the web page to fetch (must start with http:// or https://)

Skills

get_available_variables

Get all available variables for email content (built-in, organization, custom fields, snippets)

  • Endpoint: POST /api/v2/tools/get_available_variables
  • Token permission: any
  • In-app assistant: every member
  • ChatGPT / Claude plugin: read

No parameters.

get_skill

Get task-specific documentation. Call it BEFORE writing content, filters, or a workflow graph - never guess a format from memory. Types: 'campaign' (TipTap content + edit_campaign operations), 'filters' (subscriber/recipient filter shapes), 'workflow' (draft graph), 'sending' (sending domain, web domain, DNS and sender setup), 'images', 'snippets', 'templates', 'variables', 'copywriter', 'onboarding', 'docs' (full product docs catalog; pass page to read one markdown page).

  • Endpoint: POST /api/v2/tools/get_skill
  • Token permission: any
  • In-app assistant: every member
  • ChatGPT / Claude plugin: read
ParameterTypeRequiredDescription
type"campaign" | "snippets" | "templates" | "variables" | "copywriter" | "filters" | "images" | "sending" | "workflow" | "onboarding" | "docs"YesSkill type to retrieve
pagestringNoOnly for type=docs. Docs slug such as workflows/workflow-manual-enrollment. Omit to list every page.

Settings

get_writing_style

Get the organization's default writing style for content generation including persona, audience, vocabulary, and rules.

  • Endpoint: POST /api/v2/tools/get_writing_style
  • Token permission: settings
  • In-app assistant: every member
  • ChatGPT / Claude plugin: read

No parameters.

update_writing_style

Modify writing style settings (persona, audience, vocabulary, rules)

  • Endpoint: POST /api/v2/tools/update_writing_style
  • Token permission: settings
  • In-app assistant: owners and admins
  • ChatGPT / Claude plugin: not available
ParameterTypeRequiredDescription
namestringNo
personastringNo
audiencestringNo
vocabularystringNo
rulesstringNo

get_email_senders

List all configured email senders (from addresses) for this organization.

  • Endpoint: POST /api/v2/tools/get_email_senders
  • Token permission: settings
  • In-app assistant: every member
  • ChatGPT / Claude plugin: read

No parameters.

get_custom_fields

List all custom subscriber field definitions for this organization.

  • Endpoint: POST /api/v2/tools/get_custom_fields
  • Token permission: audience
  • In-app assistant: every member
  • ChatGPT / Claude plugin: read

No parameters.

create_custom_field

Create a custom subscriber field definition by name. This only creates the definition (id + name). It does not set subscriber values or change subscription status. Reserved names like email, name, phone, country, and ip are rejected. Examples: has_double_opt_in, has_custom_domains.

  • Endpoint: POST /api/v2/tools/create_custom_field
  • Token permission: audience
  • In-app assistant: owners and admins
  • ChatGPT / Claude plugin: write
ParameterTypeRequiredDescription
namestringYesField definition name, e.g. has_double_opt_in or has_custom_domains

rename_custom_field

Rename a custom subscriber field definition by id. Same reserved-name and duplicate checks as create. Does not change subscriber values.

  • Endpoint: POST /api/v2/tools/rename_custom_field
  • Token permission: audience
  • In-app assistant: owners and admins
  • ChatGPT / Claude plugin: write
ParameterTypeRequiredDescription
fieldIdstringYes
namestringYesNew field definition name

delete_custom_field

Delete a custom subscriber field definition by id. This removes the definition and every stored value for that field. It does not resubscribe contacts.

This is a dangerous action requiring an explicit second request. The first call returns a short-lived, one-use confirmation code bound to the organization, token, tool, and exact input.

  • Endpoint: POST /api/v2/tools/delete_custom_field
  • Token permission: audience
  • In-app assistant: owners and admins
  • ChatGPT / Claude plugin: not available
ParameterTypeRequiredDescription
fieldIdstringYes
confirmationCodenumberNoRequired for dangerous actions. Include the code from the confirmation challenge to execute.

get_email_snippets

List email snippets (reusable content blocks) for this organization. Use get_email_snippet to read a snippet's content.

  • Endpoint: POST /api/v2/tools/get_email_snippets
  • Token permission: settings
  • In-app assistant: every member
  • ChatGPT / Claude plugin: read
ParameterTypeRequiredDescription
includeArchivedbooleanNoInclude archived snippets (default: false)

get_email_snippet

Get a single email snippet by id (snp_...) including its full TipTap JSON content. Use this before update_email_snippet to read the current content.

  • Endpoint: POST /api/v2/tools/get_email_snippet
  • Token permission: settings
  • In-app assistant: every member
  • ChatGPT / Claude plugin: not available
ParameterTypeRequiredDescription
idstringYesSnippet id, e.g. snp_...

create_email_snippet

Create a new email snippet (reusable content block). Content is TipTap JSON with the same node types as campaigns: { type: "doc", content: [...] }. Snippets can then be referenced inside campaign content.

  • Endpoint: POST /api/v2/tools/create_email_snippet
  • Token permission: settings
  • In-app assistant: owners and admins
  • ChatGPT / Claude plugin: not available
ParameterTypeRequiredDescription
namestringYesSnippet name
descriptionstringNoOptional description
contentanyNoTipTap JSON content: { type: "doc", content: [...] }. Omit to create an empty snippet.

update_email_snippet

Update an email snippet by id (snp_...): name, description, and/or its TipTap JSON content ({ type: "doc", content: [...] }, same node types as campaigns). Content updates apply everywhere the snippet is used. Read the current content with get_email_snippet first when editing.

  • Endpoint: POST /api/v2/tools/update_email_snippet
  • Token permission: settings
  • In-app assistant: owners and admins
  • ChatGPT / Claude plugin: not available
ParameterTypeRequiredDescription
idstringYesSnippet id, e.g. snp_...
namestringNoNew snippet name
descriptionstringNoNew description
contentanyNoNew TipTap JSON content: { type: "doc", content: [...] }. Replaces the entire snippet content.

archive_email_snippet

Archive an email snippet by id (snp_...). Archived snippets are hidden from the snippet list but existing campaigns referencing them keep working. Restore with unarchive_email_snippet.

  • Endpoint: POST /api/v2/tools/archive_email_snippet
  • Token permission: settings
  • In-app assistant: owners and admins
  • ChatGPT / Claude plugin: not available
ParameterTypeRequiredDescription
idstringYesSnippet id, e.g. snp_...

unarchive_email_snippet

Restore an archived email snippet by id (snp_...).

  • Endpoint: POST /api/v2/tools/unarchive_email_snippet
  • Token permission: settings
  • In-app assistant: owners and admins
  • ChatGPT / Claude plugin: not available
ParameterTypeRequiredDescription
idstringYesSnippet id, e.g. snp_...

get_organization_settings

Read organization name, timezone, address, logo, and double opt-in. Call this before update_organization_settings or update_confirmation_email. For the inbox-hygiene migration (branding, why-you-receive, DOI, workflows) read get_skill({ type: 'docs', page: 'tutorials/migration-to-high-deliverability-emails' }).

  • Endpoint: POST /api/v2/tools/get_organization_settings
  • Token permission: settings
  • In-app assistant: every member
  • ChatGPT / Claude plugin: read

No parameters.

update_organization_settings

Update organization name, timezone, postal address (adresse), and/or doubleOptInEnabled. Enabling double opt-in makes new public signups PENDING_CONFIRMATION and sends the confirmation email. Existing SUBSCRIBED contacts stay subscribed. After enabling, customize the email with get_confirmation_email then update_confirmation_email. Workflows that start on subscriber created or tag added wait until confirmation.

  • Endpoint: POST /api/v2/tools/update_organization_settings
  • Token permission: settings
  • In-app assistant: owners and admins
  • ChatGPT / Claude plugin: write
ParameterTypeRequiredDescription
namestringNoOrganization name
timezonestring | nullNoTimezone in IANA format
adressestring | nullNoPostal address used as {{org-adresse}} in email footers
doubleOptInEnabledbooleanNoWhen true, new public signups must confirm before campaigns or marketing workflows. Trusted backends should pass skipDoubleOptIn on subscriber create instead of turning this off.

get_confirmation_email

Read the native double-opt-in confirmation email (TipTap JSON, subject, preview). Required variable is {{confirmUrl}} on a button url or link href. Call this before update_confirmation_email. Same node types as campaigns — get_skill({ type: 'campaign' }).

  • Endpoint: POST /api/v2/tools/get_confirmation_email
  • Token permission: settings
  • In-app assistant: every member
  • ChatGPT / Claude plugin: read

No parameters.

update_confirmation_email

Replace the native double-opt-in confirmation email. Template is TipTap JSON { type: 'doc', content: [...] }. Must include {{confirmUrl}} in a button url or link href. Add visible branding and a why-you-receive line. Call get_confirmation_email first. get_skill({ type: 'campaign' }) for nodes.

  • Endpoint: POST /api/v2/tools/update_confirmation_email
  • Token permission: settings
  • In-app assistant: owners and admins
  • ChatGPT / Claude plugin: write
ParameterTypeRequiredDescription
subjectstringYesInbox subject
previewstringNoInbox preview text. Empty string is allowed.
templateanyYesTipTap JSON: { type: "doc", content: [...] }

get_list_cleanup_settings

Read automatic list cleanup policy (off by default) and the re-engagement email (TipTap JSON, subject, preview). Enabling requires a completed preview receipt: preview_list_cleanup, poll get_list_cleanup_preview, then enable_list_cleanup.

  • Endpoint: POST /api/v2/tools/get_list_cleanup_settings
  • Token permission: settings
  • In-app assistant: owners and admins
  • ChatGPT / Claude plugin: not available

No parameters.

update_list_cleanup_settings

Save the cleanup interval and re-engagement toggle. Cannot enable. Disable with listCleanupEnabled: false. To enable, preview_list_cleanup then enable_list_cleanup with the receipt.

  • Endpoint: POST /api/v2/tools/update_list_cleanup_settings
  • Token permission: settings
  • In-app assistant: owners and admins
  • ChatGPT / Claude plugin: not available
ParameterTypeRequiredDescription
listCleanupEnabledbooleanNo
listCleanupInactivityDays30 | 90 | 180No
listCleanupReengagementEnabledbooleanNo

preview_list_cleanup

Start an async preview of who would be unsubscribed. Saves the interval and re-engagement toggle, then returns a jobId. Poll get_list_cleanup_preview until status is completed and pass its receipt to enable_list_cleanup.

  • Endpoint: POST /api/v2/tools/preview_list_cleanup
  • Token permission: settings
  • In-app assistant: owners and admins
  • ChatGPT / Claude plugin: not available
ParameterTypeRequiredDescription
inactivityDays30 | 90 | 180Yes
reengagementEnabledbooleanYes

get_list_cleanup_preview

Read a list cleanup preview started by preview_list_cleanup: status (queued, running, completed, error), counts, sample contacts, and the receipt once completed. Show the eligible count to the user before calling enable_list_cleanup.

  • Endpoint: POST /api/v2/tools/get_list_cleanup_preview
  • Token permission: settings
  • In-app assistant: owners and admins
  • ChatGPT / Claude plugin: not available
ParameterTypeRequiredDescription
jobIdstringYesjobId returned by preview_list_cleanup

enable_list_cleanup

Enable automatic list cleanup from a completed preview receipt. Receipt expires in 10 minutes.

  • Endpoint: POST /api/v2/tools/enable_list_cleanup
  • Token permission: settings
  • In-app assistant: owners and admins
  • ChatGPT / Claude plugin: not available
ParameterTypeRequiredDescription
receiptstringYes

update_list_cleanup_email

Replace the re-engagement email. Template is TipTap JSON. Must include {{subscribeUrl}} on a button url or link href.

  • Endpoint: POST /api/v2/tools/update_list_cleanup_email
  • Token permission: settings
  • In-app assistant: owners and admins
  • ChatGPT / Claude plugin: not available
ParameterTypeRequiredDescription
subjectstringYes
previewstringNo
templateanyYes

get_tracking_domain

Read the click-tracking domain picker: every web domain with readiness (DNS/SSL), Spamhaus status, the selected domain (selectedId) and the one actually serving links (activeId). When activeId is null, links use the default Lumail tracking host. Add or verify hosts with list_web_domains / verify_web_domain.

  • Endpoint: POST /api/v2/tools/get_tracking_domain
  • Token permission: settings
  • In-app assistant: every member
  • ChatGPT / Claude plugin: not available

No parameters.

set_tracking_domain

Use a verified web domain as the click-tracking host for new emails. The domain must be VERIFIED with working HTTPS; otherwise it is refused (and demoted to PENDING if HTTPS fails). Call get_tracking_domain first.

  • Endpoint: POST /api/v2/tools/set_tracking_domain
  • Token permission: settings
  • In-app assistant: owners and admins
  • ChatGPT / Claude plugin: not available
ParameterTypeRequiredDescription
domainIdstringYesThe WebDomain id (wdom_...) or hostname

disable_tracking_domain

Stop using a custom click-tracking domain. New emails fall back to the default Lumail tracking host. The web domain itself is kept.

  • Endpoint: POST /api/v2/tools/disable_tracking_domain
  • Token permission: settings
  • In-app assistant: owners and admins
  • ChatGPT / Claude plugin: not available

No parameters.