Documentation

sendzy API + MCP

sendzy is a cold email platform: register sending domains, host mailboxes on private servers, and send and read email over REST and MCP. The public APIs are accessible with an API key.

Authentication

Create keys in the console under API Keys, or with POST /api/api-keys. Keys are shown once. Pass a key on every request:

headers
X-Api-Key: sk_yourkey.yoursecret
# or
Authorization: Bearer sk_yourkey.yoursecret

Every key is scoped to one organization. Session-based login (email + password) is for the console; the public APIs use keys only.

REST API

Base URL: https://app.sendzy.dev (dev: http://localhost:3000).

MethodPathDescription
GET/api/domainsList all domains with their instances and mailboxes
POST/api/domainsRegister a domain — body: { name }
DELETE/api/domains/:idDelete a domain
GET/api/mailboxesList all mailboxes
POST/api/mailboxesCreate a mailbox — body: { domain_id, user, password?, smtp_host?, smtp_port?, imap_host?, imap_port? }
PATCH/api/mailboxes/:idUpdate a mailbox — assign instance, rotate password, override hosts
DELETE/api/mailboxes/:idDelete a mailbox
GET/api/mailsInbox — query: ?mailbox_id=&direction=&limit=
GET/api/mails/threadsMails grouped as threads
POST/api/mails/send-emailSend an email — body: { mailbox_id | campaign_id, to, subject, body, thread_id? }
GET/api/campaignsList campaigns
POST/api/campaignsCreate a campaign — body: { name, mode?, mailbox_id?, mailbox_ids?, steps: [{ subject, body, delay_hours }], csv?, email_field? }
GET/api/campaigns/:idCampaign detail — steps and contacts
POST/api/campaigns/:id/contactsUpload/replace the contact list (CSV) — body: { csv, email_field }
PATCH/api/campaigns/:idUpdate ONLY the steps' subject and message — body: { steps: [{ id, subject, body }] }
POST/api/campaigns/:id/sendSend all due emails (steps advance per their delays; call repeatedly)
DELETE/api/campaigns/:idDelete a campaign
GET/api/tools/email-verifierVerify an email — query: ?email= — returns { status: "valid" | "invalid" | "catch-all" }
GET/api/api-keysList API keys
POST/api/api-keysCreate an API key — body: { name }
DELETE/api/api-keys/:idRevoke an API key

Example: send an email

bash
curl -X POST https://app.sendzy.dev/api/mails/send-email \
  -H "X-Api-Key: sk_yourkey.yoursecret" \
  -H "Content-Type: application/json" \
  -d '{
    "mailbox_id": "mbx_123",
    "to": "prospect@target.com",
    "subject": "Quick question",
    "body": "Hey — worth a chat?"
  }'

Instance allocation

By default one instance hosts up to 2 domains / 6 mailboxes (ideal: 1 domain, 3 mailboxes). Pass a custom instance_id when buying a domain, or override smtp_host / imap_host on a mailbox to bring your own infrastructure.

Campaigns

Campaigns control which mailbox sends your emails, as a multi-step sequence with a CSV contact list. Three modes:

ModeBehavior
round_robinDefault. Rotates across every mailbox in your organization — each send goes to the mailbox with the fewest sent mails so volume stays even.
singleAlways sends from one particular mailbox. Requires mailbox_id.
listRound-robins across a chosen list of mailboxes. Requires mailbox_ids.
bash
curl -X POST https://app.sendzy.dev/api/campaigns \
  -H "X-Api-Key: sk_yourkey.yoursecret" \
  -H "Content-Type: application/json" \
  -d '{
    "name": "Q4 outbound",
    "mode": "list",
    "mailbox_ids": ["mbx_1", "mbx_2", "mbx_3"],
    "steps": [
      { "subject": "Quick question, {{first_name}}", "body": "Hi {{first_name}} — saw you work at {{company}}." },
      { "subject": "Following up", "body": "Any thoughts, {{first_name}}?", "delay_hours": 72 }
    ],
    "csv": "first_name,company,email\nAda,Acme,ada@acme.io",
    "email_field": "email"
  }'

# Send due emails — first step goes immediately, later steps honor delay_hours.
# Call repeatedly (e.g. every hour) to advance the sequence.
curl -X POST https://app.sendzy.dev/api/campaigns/cmp_123/send \
  -H "X-Api-Key: sk_yourkey.yoursecret"

# Update ONLY the subject and message of existing steps
curl -X PATCH https://app.sendzy.dev/api/campaigns/cmp_123 \
  -H "X-Api-Key: sk_yourkey.yoursecret" \
  -H "Content-Type: application/json" \
  -d '{ "steps": [ { "id": "step_1", "subject": "New subject", "body": "New message" } ] }'

Variables: any CSV column is available as {{ column }} (case-insensitive) in the subject and message, plus {{ email }}. The first step sends immediately; later steps wait delay_hours after the previous step. Updating a campaign allows modifying only the steps' subject and message.

Email verifier

Check whether an email address can receive mail before you send:

bash
curl "https://app.sendzy.dev/api/tools/email-verifier?email=prospect@target.com" \
  -H "X-Api-Key: sk_yourkey.yoursecret"

Response:

json
{ "email": "prospect@target.com", "status": "valid" }
StatusMeaning
validSyntax is valid, the domain has MX records, and the server rejects unknown recipients.
invalidBad syntax or the domain has no MX records — it cannot receive mail.
catch-allThe mail server accepts any address on the domain, so deliverability of the specific mailbox is unknown.

MCP server

The sendzy MCP server exposes the public APIs as tools for Claude, Cursor and other MCP clients. Same API key auth, one endpoint:

url
https://app.sendzy.dev/mcp

Connect from Claude Code

bash
claude mcp add sendzy \
  --transport http \
  --url https://app.sendzy.dev/mcp \
  --header "X-Api-Key: sk_yourkey.yoursecret"

Connect from Cursor / any MCP client

json
{
  "mcpServers": {
    "sendzy": {
      "url": "https://app.sendzy.dev/mcp",
      "headers": {
        "X-Api-Key": "sk_yourkey.yoursecret"
      }
    }
  }
}

Tools

ToolDescription
list-domainsList all domains
buy-domainRegister a domain
delete-domainDelete a domain
list-mailboxesList all mailboxes
create-mailboxCreate a mailbox on a domain
update-mailboxAssign instance / rotate password / override hosts
delete-mailboxDelete a mailbox
list-mailsSync + list mailbox mails
list-threadsMails grouped as threads
list-campaignsList campaigns with mode and stats
create-campaignCreate a campaign with steps and a CSV contact list
update-campaignUpdate only the steps' subject and message
upload-contactsUpload/replace a campaign's contact list (CSV)
send-campaignSend all due emails for a campaign
email-verifierVerify an email address (valid / invalid / catch-all)
send-emailSend an email from a mailbox or via a campaign

Get a key

Register your organization in the console, then create keys under API Keys.