add_prospect_to_campaign
Add one contact to an existing email campaign so it receives the sequence, like Manual Entry in the app.
Add contact to campaign · Changes data · Acts outside your account
Add one contact to an existing email campaign so it receives the sequence, like Manual Entry in the app. The first step is scheduled inside the campaign's sending window and then sent to the contact by real email. Confirm with the user before calling. campaignId comes from list_campaigns or create_campaign; the campaign must be active and have at least one step. Each added contact uses 1 from the account's prospecting allowance (remaining.prospectorHardLimit in get_account), not lead credits; it is used even when the contact lands in error-sending, and neither stop_prospect nor remove_prospect_from_campaign gives it back. The address is not verified at this point. Returns scheduled: true and the prospectId, or scheduled: false with a reason: already-in-campaign (HTTP 409, nothing used), campaign-inactive, company-excluded, contact-not-found, error-sending (a prospect row was kept, prospectId returned so you can remove it) or error.
| Connection | Account URL, team member URL or OAuth |
|---|
Parameters
| Parameter | Type | Required | Description |
|---|---|---|---|
campaignId | string | Yes | Email campaign id from list_campaigns or create_campaign. |
email | string | Yes | The contact's email address. Must be a valid address. |
domain | string | No | Optional company domain of the contact, e.g. acme.example. Used for company merge fields and exclusion checks. |
firstName | string | No | Optional first name, used by {{ first_name }}. |
lastName | string | No | Optional last name. |
position | string | No | Optional job title, used by {{ position }}. |
phone | string | No | Optional phone number. |
scheduledFor | string | No | Optional ISO 8601 date/time for the first step, e.g. 2026-11-03T09:30:00Z. Omit to send at the next free slot. |
emailAccountIds | string[] | No | Optional mailbox ids from list_email_accounts to send from. Leave empty and the connected mailboxes with the most remaining daily capacity are used. |
validation | string[] | No | Optional, accepted for compatibility. Contacts are not verified when added to a campaign, so this does not filter anything today. Values: valid, catch-all, risky. |
custom | object | No | Optional object of extra merge fields for this contact, e.g. { "industry": "SaaS" }. |
Tool definition
What your assistant receives from tools/list:
{
"name": "add_prospect_to_campaign",
"title": "Add contact to campaign",
"annotations": {
"title": "Add contact to campaign",
"readOnlyHint": false,
"destructiveHint": false,
"idempotentHint": true,
"openWorldHint": true
},
"inputSchema": {
"type": "object",
"properties": {
"campaignId": {
"type": "string",
"description": "Email campaign id from list_campaigns or create_campaign."
},
"email": {
"type": "string",
"description": "The contact's email address. Must be a valid address."
},
"domain": {
"type": "string",
"description": "Optional company domain of the contact, e.g. acme.example. Used for company merge fields and exclusion checks."
},
"firstName": {
"type": "string",
"description": "Optional first name, used by {{ first_name }}."
},
"lastName": {
"type": "string",
"description": "Optional last name."
},
"position": {
"type": "string",
"description": "Optional job title, used by {{ position }}."
},
"phone": {
"type": "string",
"description": "Optional phone number."
},
"scheduledFor": {
"type": "string",
"description": "Optional ISO 8601 date/time for the first step, e.g. 2026-11-03T09:30:00Z. Omit to send at the next free slot."
},
"emailAccountIds": {
"type": "array",
"items": {
"type": "string"
},
"description": "Optional mailbox ids from list_email_accounts to send from. Leave empty and the connected mailboxes with the most remaining daily capacity are used."
},
"validation": {
"type": "array",
"items": {
"type": "string",
"enum": [
"valid",
"catch-all",
"risky"
]
},
"description": "Optional, accepted for compatibility. Contacts are not verified when added to a campaign, so this does not filter anything today. Values: valid, catch-all, risky."
},
"custom": {
"type": "object",
"description": "Optional object of extra merge fields for this contact, e.g. { \"industry\": \"SaaS\" }."
}
},
"required": [
"campaignId",
"email"
]
}
}Used in
get_campaign
Get one email campaign with live analytics: settings (isActive, schedule, timezone), its steps in emailCampaignTemplates[] (each with _id = templateId for update_campaign_step, subject, body and per-step stats), stats (prospect total, scheduledCount, uniqueContacted, totalEmailsSent, opens, clicks, replies, warm replies, bounced, unsubscribed and their rates), steps[] (per-step sent/opened/clicked/replied), statusBuckets (prospect counts per status) and statistics (sent vs scheduled over time).
remove_prospect_from_campaign
Delete a prospect from its campaign, like "Remove from campaign" in the app: the prospect and its scheduled emails are deleted, emails already sent stay sent, and its history is gone.