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
| Parameter | Type | Required | Description |
|---|---|---|---|
limit | integer | No | Default: 20. |
page | integer | No | Default: 1. |
after | string | No | |
before | string | No | |
status | "DRAFT" | "SCHEDULED" | "SENDING" | "SENT" | "ARCHIVED" | "FAILED" | No | |
query | string | No |
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
| Parameter | Type | Required | Description |
|---|---|---|---|
subject | string | Yes | Email subject line (required) |
name | string | No | Campaign name. Default: "Untitled". |
preview | string | null | No | Preview/preheader text shown in email clients |
content | any | No | MAILY: 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" | No | Content format. MAILY is the visual editor; HTML is raw source. Default: "MAILY". |
senderId | string | No | Email sender ID. If not provided, uses default sender. Call get_email_senders to list available senders. |
replyTo | string | null | No | Reply-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
| Parameter | Type | Required | Description |
|---|---|---|---|
campaignId | string | Yes |
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
| Parameter | Type | Required | Description |
|---|---|---|---|
campaignId | string | Yes |
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
| Parameter | Type | Required | Description |
|---|---|---|---|
campaignId | string | Yes |
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
| Parameter | Type | Required | Description |
|---|---|---|---|
campaignId | string | Yes | |
newName | string | No |
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_campaignToken permission:
campaignsIn-app assistant: owners and admins
ChatGPT / Claude plugin: write
| Parameter | Type | Required | Description |
|---|---|---|---|
id | string | Yes | Campaign ID to update |
name | string | No | New campaign name |
subject | string | No | New subject line |
preview | string | null | No | New preview/preheader text |
content | any | No | Replacement 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. |
operations | any[] | No | Array of surgical edit operations to apply to existing content. Cannot be combined with content. |
senderId | string | No | Email sender ID. Call get_email_senders to list available senders. |
replyTo | string | null | No | Reply-to email address. Pass null to clear. |
contentType | "MAILY" | "HTML" | No | Target format. Required with content when switching MAILY ↔ HTML. Metadata-only updates must omit this or keep the current format. |
expectedUpdatedAt | string | No | Revision 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
| Parameter | Type | Required | Description |
|---|---|---|---|
campaignId | string | Yes | Campaign or internal workflow email ID. |
imageIndexes | integer[] | No | Optional image indexes from this tool's dry-run output. Omit to auto-fit every image in document traversal order. |
maxWidth | integer | No | Default: 600. |
maxHeight | integer | No | Default: 400. |
dryRun | boolean | No | Inspect 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
| Parameter | Type | Required | Description |
|---|---|---|---|
campaignId | string | Yes | Campaign ID to update |
filters | object[] | Yes | Array 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
| Parameter | Type | Required | Description |
|---|---|---|---|
campaignId | string | Yes | Campaign ID to send test for |
emails | string[] | Yes | Email 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
| Parameter | Type | Required | Description |
|---|---|---|---|
campaignId | string | Yes | Campaign ID to render |
subscriberId | string | No | Optional subscriber ID to resolve variables and conditional blocks for |
format | "html" | "text" | "both" | No | Which 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
| Parameter | Type | Required | Description |
|---|---|---|---|
campaignId | string | Yes | Campaign ID to schedule |
date | string | No | Date to schedule (ISO format, e.g. '2025-03-20'). If omitted, sends immediately. |
hours | integer | No | Hour to send (0-23) |
minutes | integer | No | Minutes (0-59) |
timezone | string | null | No | Timezone for the scheduled time (e.g. 'Europe/Paris', 'America/New_York') |
confirmationCode | number | No | Required 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
| Parameter | Type | Required | Description |
|---|---|---|---|
campaignId | string | Yes | Campaign ID to cancel schedule for |
confirmationCode | number | No | Required 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
| Parameter | Type | Required | Description |
|---|---|---|---|
campaignId | string | Yes | Campaign ID to get history for |
cursor | string | No | Cursor for pagination (history entry ID from previous page) |
limit | integer | No | Number 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
| Parameter | Type | Required | Description |
|---|---|---|---|
campaignId | string | Yes | Campaign ID |
historyId | string | Yes | History 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
| Parameter | Type | Required | Description |
|---|---|---|---|
campaignId | string | Yes | Campaign ID to restore |
historyId | string | Yes | History 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
| Parameter | Type | Required | Description |
|---|---|---|---|
campaignId | string | Yes | Campaign 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
| Parameter | Type | Required | Description |
|---|---|---|---|
campaignId | string | Yes | Campaign 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
| Parameter | Type | Required | Description |
|---|---|---|---|
campaignId | string | Yes | |
confirmationCode | number | No | Required 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
| Parameter | Type | Required | Description |
|---|---|---|---|
limit | integer | No | Default: 50. |
status | "all" | "SUBSCRIBED" | "UNSUBSCRIBED" | "PENDING_CONFIRMATION" | "BOUNCED" | "BANNED" | "COMPLAINED" | "TRANSACTIONAL" | No | Default: "all". |
tag | string | No | Filter by tag name (case-insensitive) |
query | string | No | |
cursor | string | No | Cursor 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
| Parameter | Type | Required | Description |
|---|---|---|---|
filters | object[] | No | Array 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" | No | Subscriber status filter - applied in addition to the filters array. Defaults to ALL. Default: "ALL". |
query | string | No | Free-text search across email, name, and tag name. |
limit | integer | No | Default: 50. |
cursor | string | No | Cursor for pagination (subscriber ID from previous page). |
fields | ("id" | "email" | "name" | "phone" | "status" | "createdAt" | "updatedAt" | "tags" | "customFields" | "revenue" | "emailCount" | "openCount" | "clickCount")[] | No | Subset 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
| Parameter | Type | Required | Description |
|---|---|---|---|
filters | object[] | No | Array of filter objects - same shape as update_campaign_filters and create_segment. Default: []. |
status | "PENDING_CONFIRMATION" | "SUBSCRIBED" | "UNSUBSCRIBED" | "BOUNCED" | "BANNED" | "COMPLAINED" | "TRANSACTIONAL" | "ALL" | No | Subscriber status filter - applied in addition to the filters array. Defaults to ALL. Default: "ALL". |
query | string | No | Free-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
| Parameter | Type | Required | Description |
|---|---|---|---|
subscriberId | string | No | |
email | string | No |
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
| Parameter | Type | Required | Description |
|---|---|---|---|
email | string | Yes | |
name | string | No | |
phone | string | No | |
tags | string[] | No | Default: []. |
fields | object | null | No | Default: {}. |
replaceTags | boolean | No | Default: false. |
resubscribe | boolean | No | Default: true. |
triggerWorkflows | boolean | No | |
skipDoubleOptIn | boolean | No | |
ipAddress | string | No | |
country | string | No |
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
| Parameter | Type | Required | Description |
|---|---|---|---|
subscriber | string | Yes | |
email | string | No | |
name | string | No | |
phone | string | No | |
tags | string[] | No | |
fields | object | null | No | Default: {}. |
replaceTags | boolean | No | |
resubscribe | boolean | No | |
triggerWorkflows | boolean | No | |
skipDoubleOptIn | boolean | No | |
ipAddress | string | No | |
country | string | No |
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
| Parameter | Type | Required | Description |
|---|---|---|---|
subscriber | string | Yes | |
confirmationCode | number | No | Required 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
| Parameter | Type | Required | Description |
|---|---|---|---|
subscriberId | string | No | |
email | string | No | |
reason | string | No | |
confirmationCode | number | No | Required 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
| Parameter | Type | Required | Description |
|---|---|---|---|
subscriberIds | string[] | Yes | |
tagNames | string[] | Yes | |
confirmationCode | number | No | Required 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
| Parameter | Type | Required | Description |
|---|---|---|---|
subscriberIds | string[] | Yes | |
tagNames | string[] | Yes | |
confirmationCode | number | No | Required 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
| Parameter | Type | Required | Description |
|---|---|---|---|
action | "ADD_TAGS" | "REMOVE_TAGS" | "UNSUBSCRIBE" | "SUBSCRIBE" | "BAN" | "ADD_TO_WORKFLOW" | "REMOVE_FROM_WORKFLOW" | Yes | Same actions as Subscribers → Actions. Large audiences are queued, not applied in this request. |
idempotencyKey | string | No | Reuse to avoid double-queue. Generated if omitted. |
subscriberIds | string[] | No | Explicit IDs. Omit to use the current filters/query/status. |
sourceOperationId | string | No | Reuse a previous operation's frozen audience. |
filters | object[] | No | Same filter objects as query_subscribers. |
query | string | No | Free-text search across email, name, and tag name. |
status | "PENDING_CONFIRMATION" | "SUBSCRIBED" | "UNSUBSCRIBED" | "BOUNCED" | "BANNED" | "COMPLAINED" | "TRANSACTIONAL" | "ALL" | No | |
tags | string[] | No | |
reason | string | No | Optional unsubscribe reason. |
workflowId | string | No | |
stepId | string | No | Starting step when action is ADD_TO_WORKFLOW. |
confirmationCode | number | No | Required 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
| Parameter | Type | Required | Description |
|---|---|---|---|
operationId | string | Yes |
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
| Parameter | Type | Required | Description |
|---|---|---|---|
subscriberId | string | No | |
email | string | No | |
eventType | "SUBSCRIBER_PAYMENT" | "SUBSCRIBER_REFUND" | Yes | |
amount | number | No | |
currency | string | No | Default: "USD". |
metadata | object | No |
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
| Parameter | Type | Required | Description |
|---|---|---|---|
subscriberId | string | No | |
email | string | No | |
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 | |
limit | integer | No | Default: 50. |
after | string | No |
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
| Parameter | Type | Required | Description |
|---|---|---|---|
subscriberId | string | No | |
email | string | No | |
status | "PENDING" | "SENT" | "DELIVERED" | "BOUNCED" | "COMPLAINED" | No | |
limit | integer | No | Default: 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
| Parameter | Type | Required | Description |
|---|---|---|---|
limit | integer | No | Default: 20. |
query | string | No |
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
| Parameter | Type | Required | Description |
|---|---|---|---|
workflowId | string | Yes |
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
| Parameter | Type | Required | Description |
|---|---|---|---|
name | string | Yes |
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
| Parameter | Type | Required | Description |
|---|---|---|---|
workflowId | string | Yes | |
expectedUpdatedAt | string | Yes | Exact updatedAt returned by get_workflow |
settings | object | No | |
steps | object[] | Yes | Complete replacement list of Workflow steps |
edges | object[] | Yes | Complete replacement list of directed graph edges |
successGoals | object[] | 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
| Parameter | Type | Required | Description |
|---|---|---|---|
workflowId | string | Yes | |
expectedUpdatedAt | string | Yes | |
definition | object | Yes | Complete 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
| Parameter | Type | Required | Description |
|---|---|---|---|
workflowId | string | Yes | |
activate | boolean | No | true: activate after publishing. false: keep the workflow paused. Omitted: first publish activates, a paused workflow stays paused. |
confirmationCode | number | No | Required 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
| Parameter | Type | Required | Description |
|---|---|---|---|
workflowId | string | Yes | |
status | "ACTIVE" | "PAUSED" | "ARCHIVED" | Yes | |
confirmationCode | number | No | Required 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
| Parameter | Type | Required | Description |
|---|---|---|---|
workflowId | string | Yes | |
subscriberId | string | No | |
email | string | No | |
stepId | string | No | Published 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
| Parameter | Type | Required | Description |
|---|---|---|---|
workflowId | string | Yes | |
stepId | string | No | Published step to start from. Omit to start at the trigger. |
filters | object[] | No | Same filter objects as query_subscribers. Call get_skill({ type: "filters" }) for shapes. Default: []. |
query | string | No | Free-text search across email, name, and tag name. |
status | "PENDING_CONFIRMATION" | "SUBSCRIBED" | "UNSUBSCRIBED" | "BOUNCED" | "BANNED" | "COMPLAINED" | "TRANSACTIONAL" | "ALL" | No | Default: "SUBSCRIBED". |
subscriberIds | string[] | No | Explicit IDs instead of filters. Max 500. |
dryRun | boolean | No | If true, return the match count and published steps only. Default: false. |
confirmationCode | number | No | Required 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
| Parameter | Type | Required | Description |
|---|---|---|---|
workflowId | string | Yes | |
subscriberId | string | No | |
email | string | No |
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
| Parameter | Type | Required | Description |
|---|---|---|---|
subscriberId | string | No | |
email | string | No | |
workflowId | string | No | If 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
| Parameter | Type | Required | Description |
|---|---|---|---|
workflowId | string | Yes | |
subscriberId | string | No | |
email | string | No | |
workflowSubscriberId | string | No | Required 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
| Parameter | Type | Required | Description |
|---|---|---|---|
workflowId | string | Yes | |
confirmationCode | number | No | Required 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
| Parameter | Type | Required | Description |
|---|---|---|---|
query | string | No | |
limit | integer | No | Default: 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
| Parameter | Type | Required | Description |
|---|---|---|---|
groupId | string | Yes |
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
| Parameter | Type | Required | Description |
|---|---|---|---|
name | string | Yes | |
conflictStrategy | "CANCEL_EXISTING" | "SKIP_NEW" | "RUN_FIRST_STEP" | No | Default: "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
| Parameter | Type | Required | Description |
|---|---|---|---|
groupId | string | Yes | |
expectedUpdatedAt | string | Yes | |
name | string | No | |
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
| Parameter | Type | Required | Description |
|---|---|---|---|
workflowId | string | Yes | |
expectedUpdatedAt | string | Yes | |
groupId | string | null | Yes |
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
| Parameter | Type | Required | Description |
|---|---|---|---|
groupId | string | Yes | |
expectedName | string | Yes | |
expectedUpdatedAt | string | Yes | |
unassignWorkflows | boolean | No | Default: false. |
confirmationCode | number | No | Required 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
| Parameter | Type | Required | Description |
|---|---|---|---|
limit | integer | No | Default: 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
| Parameter | Type | Required | Description |
|---|---|---|---|
segmentId | string | Yes |
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
| Parameter | Type | Required | Description |
|---|---|---|---|
name | string | Yes | |
filters | object[] | No | Default: []. |
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
| Parameter | Type | Required | Description |
|---|---|---|---|
segmentId | string | Yes | |
name | string | No | |
filters | object[] | 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
| Parameter | Type | Required | Description |
|---|---|---|---|
segmentId | string | Yes | |
confirmationCode | number | No | Required 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
| Parameter | Type | Required | Description |
|---|---|---|---|
segmentId | string | Yes | |
newName | string | No |
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
| Parameter | Type | Required | Description |
|---|---|---|---|
name | string | Yes |
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
| Parameter | Type | Required | Description |
|---|---|---|---|
tag | string | Yes |
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
| Parameter | Type | Required | Description |
|---|---|---|---|
tag | string | Yes | |
name | string | Yes |
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
| Parameter | Type | Required | Description |
|---|---|---|---|
tagId | string | No | |
name | string | No | |
confirmationCode | number | No | Required 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
| Parameter | Type | Required | Description |
|---|---|---|---|
names | string[] | Yes | Array 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
| Parameter | Type | Required | Description |
|---|---|---|---|
days | integer | No | Default: 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
| Parameter | Type | Required | Description |
|---|---|---|---|
tagName | string | Yes | |
limit | integer | No | Default: 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
| Parameter | Type | Required | Description |
|---|---|---|---|
status | "SUBSCRIBED" | "UNSUBSCRIBED" | "BOUNCED" | "BANNED" | "COMPLAINED" | "TRANSACTIONAL" | No |
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
| Parameter | Type | Required | Description |
|---|---|---|---|
from | string | Yes | |
to | string | string[] | Yes | One recipient. Multiple addresses are not supported. |
subject | string | Yes | |
html | string | No | |
tiptap | string | object | No | |
markdown | string | No | |
text | string | No | |
reply_to | string | string[] | No | |
cc | string | string[] | No | |
bcc | string | string[] | No | |
headers | object | No | |
tags | object[] | No | |
preview | string | No | |
tracking | object | No | Open and click tracking. Both default to true. |
idempotencyKey | string | No | |
attachments | any | No | |
template | any | No | |
topic_id | any | No | |
scheduled_at | any | No | |
react | any | No | |
content | any | No | |
contentType | any | No | |
confirmationCode | number | No | Required 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
| Parameter | Type | Required | Description |
|---|---|---|---|
emails | object[] | Yes | |
idempotencyKey | string | No | |
confirmationCode | number | No | Required 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
| Parameter | Type | Required | Description |
|---|---|---|---|
id | string | Yes |
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
| Parameter | Type | Required | Description |
|---|---|---|---|
limit | integer | No | Default: 20. |
after | string | No | |
before | string | No |
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
| Parameter | Type | Required | Description |
|---|---|---|---|
email | string | Yes |
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
| Parameter | Type | Required | Description |
|---|---|---|---|
sinceDays | integer | No |
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
| Parameter | Type | Required | Description |
|---|---|---|---|
status | "BOUNCED" | "COMPLAINED" | No | |
page | integer | No | Default: 1. |
pageSize | integer | No | Default: 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
| Parameter | Type | Required | Description |
|---|---|---|---|
subscriberId | string | Yes | |
force | boolean | No | |
confirmationCode | number | No | Required 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
| Parameter | Type | Required | Description |
|---|---|---|---|
domain | string | Yes | The domain to register, e.g. mail.example.com |
region | "AP_SOUTHEAST_2" | "EU_CENTRAL_1" | "US_WEST_1" | No | SES 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
| Parameter | Type | Required | Description |
|---|---|---|---|
domain | string | Yes |
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
| Parameter | Type | Required | Description |
|---|---|---|---|
domainId | string | Yes | The 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
| Parameter | Type | Required | Description |
|---|---|---|---|
domainId | string | Yes | The 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
| Parameter | Type | Required | Description |
|---|---|---|---|
displayName | string | Yes | The display name shown in the From header |
localPart | string | Yes | The part before the @, e.g. 'hello' in [email protected] |
domainId | string | Yes | The MailDomain id to attach the sender to |
replyTo | string | null | No | Optional 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
| Parameter | Type | Required | Description |
|---|---|---|---|
domainId | string | Yes | The 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
| Parameter | Type | Required | Description |
|---|---|---|---|
domainId | string | Yes | The 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
| Parameter | Type | Required | Description |
|---|---|---|---|
url | string | Yes | Public http(s) URL of the image to import. |
name | string | No | Optional display name for the imported image. |
description | string | No | Short 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
| Parameter | Type | Required | Description |
|---|---|---|---|
query | string | No | Optional case-insensitive search matched against both the image name and its description. |
capturePageId | string | No | Only return images uploaded for this capture page. Omit to search the whole library. |
page | integer | No | Default: 1. |
pageSize | integer | No | Default: 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
| Parameter | Type | Required | Description |
|---|---|---|---|
imageId | string | No | Id of the image. Provide either imageId or url. |
url | string | No | URL of the image. Provide either imageId or url. |
description | string | Yes | What the image shows: subject, dominant colors, and how it should be used on the page. |
name | string | No | Optional 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
| Parameter | Type | Required | Description |
|---|---|---|---|
subscribers | object[] | Yes | |
resubscribe | boolean | No | Re-subscribe previously unsubscribed contacts. Default: false. |
triggerWorkflows | boolean | No | Trigger 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
| Parameter | Type | Required | Description |
|---|---|---|---|
status | "PENDING_CONFIRMATION" | "SUBSCRIBED" | "UNSUBSCRIBED" | "BOUNCED" | "BANNED" | "COMPLAINED" | "TRANSACTIONAL" | No | |
tag | string | No | Filter by tag name (case-insensitive). |
format | "json" | "csv" | No | Default: "json". |
limit | integer | No | Default: 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
| Parameter | Type | Required | Description |
|---|---|---|---|
status | "PENDING_CONFIRMATION" | "SUBSCRIBED" | "UNSUBSCRIBED" | "BOUNCED" | "BANNED" | "COMPLAINED" | "TRANSACTIONAL" | "ALL" | No | Default: "SUBSCRIBED". |
query | string | No | Default: "". |
filters | object[] | No | Default: []. |
subscriberIds | string[] | No | |
columns | ("email" | "name" | "phone" | "status" | "tags" | "emailCount" | "openCount" | "clickCount" | "createdAt")[] | No | Default: ["email","name","tags","emailCount","openCount","clickCount","createdAt"]. |
fieldIds | string[] | No | Default: []. |
idempotencyKey | string | No | Reuse 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
| Parameter | Type | Required | Description |
|---|---|---|---|
exportId | string | Yes |
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
| Parameter | Type | Required | Description |
|---|---|---|---|
url | string | Yes | The 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
| Parameter | Type | Required | Description |
|---|---|---|---|
type | "campaign" | "snippets" | "templates" | "variables" | "copywriter" | "filters" | "images" | "sending" | "workflow" | "onboarding" | "docs" | Yes | Skill type to retrieve |
page | string | No | Only 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
| Parameter | Type | Required | Description |
|---|---|---|---|
name | string | No | |
persona | string | No | |
audience | string | No | |
vocabulary | string | No | |
rules | string | No |
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
| Parameter | Type | Required | Description |
|---|---|---|---|
name | string | Yes | Field 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
| Parameter | Type | Required | Description |
|---|---|---|---|
fieldId | string | Yes | |
name | string | Yes | New 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
| Parameter | Type | Required | Description |
|---|---|---|---|
fieldId | string | Yes | |
confirmationCode | number | No | Required 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
| Parameter | Type | Required | Description |
|---|---|---|---|
includeArchived | boolean | No | Include 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
| Parameter | Type | Required | Description |
|---|---|---|---|
id | string | Yes | Snippet 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
| Parameter | Type | Required | Description |
|---|---|---|---|
name | string | Yes | Snippet name |
description | string | No | Optional description |
content | any | No | TipTap 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
| Parameter | Type | Required | Description |
|---|---|---|---|
id | string | Yes | Snippet id, e.g. snp_... |
name | string | No | New snippet name |
description | string | No | New description |
content | any | No | New 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
| Parameter | Type | Required | Description |
|---|---|---|---|
id | string | Yes | Snippet 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
| Parameter | Type | Required | Description |
|---|---|---|---|
id | string | Yes | Snippet 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
| Parameter | Type | Required | Description |
|---|---|---|---|
name | string | No | Organization name |
timezone | string | null | No | Timezone in IANA format |
adresse | string | null | No | Postal address used as {{org-adresse}} in email footers |
doubleOptInEnabled | boolean | No | When 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
| Parameter | Type | Required | Description |
|---|---|---|---|
subject | string | Yes | Inbox subject |
preview | string | No | Inbox preview text. Empty string is allowed. |
template | any | Yes | TipTap 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
| Parameter | Type | Required | Description |
|---|---|---|---|
listCleanupEnabled | boolean | No | |
listCleanupInactivityDays | 30 | 90 | 180 | No | |
listCleanupReengagementEnabled | boolean | No |
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
| Parameter | Type | Required | Description |
|---|---|---|---|
inactivityDays | 30 | 90 | 180 | Yes | |
reengagementEnabled | boolean | Yes |
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
| Parameter | Type | Required | Description |
|---|---|---|---|
jobId | string | Yes | jobId 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
| Parameter | Type | Required | Description |
|---|---|---|---|
receipt | string | Yes |
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
| Parameter | Type | Required | Description |
|---|---|---|---|
subject | string | Yes | |
preview | string | No | |
template | any | Yes |
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
| Parameter | Type | Required | Description |
|---|---|---|---|
domainId | string | Yes | The 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.