Create campaign → Add steps (email templates) → Import contacts (leads)
→ Attach mailboxes → Set schedule → Preflight check → Launch
→ Track analytics → Read replies in UniboxPOST /campaigns?workspaceId=42{
"name": "Q1 SaaS Outreach",
"priority": "HIGH"
}{
"id": "cmp_abc123",
"workspaceId": 42,
"name": "Q1 SaaS Outreach",
"priority": "HIGH",
"status": "draft",
"createdAt": "2026-03-09T10:00:00Z",
"updatedAt": "2026-03-09T10:00:00Z"
}HIGH, MEDIUM (default), LOWPOST /campaigns/cmp_abc123/steps?workspaceId=42{
"order": 1,
"subject": "Quick question about {{company}}",
"bodyHtml": "<p>Hi {{firstName}},</p><p>I noticed {{company}} is growing fast. We help companies like yours with...</p><p>Would you be open to a quick chat?</p><p>Best,<br/>{{senderFirstName}}</p>",
"bodyText": "Hi {{firstName}},\n\nI noticed {{company}} is growing fast. We help companies like yours with...\n\nWould you be open to a quick chat?\n\nBest,\n{{senderFirstName}}"
}{
"id": "stp_001",
"campaignId": "cmp_abc123",
"order": 1,
"subject": "Quick question about {{company}}",
"bodyHtml": "...",
"bodyText": "...",
"delaySeconds": 0,
"variants": []
}POST /campaigns/cmp_abc123/steps?workspaceId=42{
"order": 2,
"delayDays": 3,
"subject": "Re: Quick question about {{company}}",
"bodyHtml": "<p>Hi {{firstName}},</p><p>Just wanted to follow up on my last email. Would love to connect this week.</p><p>{{senderFirstName}}</p>"
}{
"order": 3,
"delayDays": 5,
"subject": "Last try — {{firstName}}",
"bodyHtml": "<p>Hi {{firstName}},</p><p>I'll keep this short — is this something worth exploring?</p><p>If not, no worries at all.</p><p>{{senderFirstName}}</p>"
}{
"order": 1,
"subject": "Quick question about {{company}}",
"variants": [
{
"subject": "Quick question about {{company}}",
"bodyHtml": "<p>Variant A — direct approach...</p>",
"weight": 50
},
{
"subject": "Idea for {{company}}",
"bodyHtml": "<p>Variant B — value-first approach...</p>",
"weight": 50
}
]
}POST /campaigns/steps/preview?workspaceId=42{
"step": {
"subject": "Quick question about {{company}}",
"bodyHtml": "<p>Hi {{firstName}},</p><p>I noticed {{company}} is growing fast...</p>"
},
"contact": {
"firstName": "Sarah",
"lastName": "Chen",
"company": "Acme Corp",
"email": "sarah@acme.com"
}
}{
"subject": "Quick question about Acme Corp",
"bodyHtml": "<p>Hi Sarah,</p><p>I noticed Acme Corp is growing fast...</p>"
}GET /campaigns/cmp_abc123/steps?workspaceId=42PATCH /campaigns/steps/stp_001?workspaceId=42{
"subject": "Updated subject line",
"delayDays": 2
}DELETE /campaigns/steps/stp_001?workspaceId=42POST /campaigns/cmp_abc123/contacts/import?workspaceId=42Content-Type: multipart/form-data
file: leads.csv
Idempotency-Key: import-batch-001email,firstName,lastName,company,title
sarah@acme.com,Sarah,Chen,Acme Corp,VP Sales
mike@bigco.io,Mike,Johnson,BigCo,CTO{
"imported": 2,
"parsed": 2,
"valid": 2,
"invalid": 0,
"upserted": 2
}POST /imports?workspaceId=42campaignId: cmp_abc123
file: large_leads.csv
Idempotency-Key: import-large-001{
"importId": "imp_xyz789",
"status": "pending_mapping",
"campaignId": "cmp_abc123"
}GET /imports/imp_xyz789/mapping-preview?workspaceId=42{
"columns": ["email", "first_name", "last", "org", "role"],
"suggestedMapping": {
"email": "email",
"first_name": "firstName",
"last": "lastName",
"org": "company",
"role": "title"
},
"sampleRows": [
{"email": "sarah@acme.com", "first_name": "Sarah", "last": "Chen", "org": "Acme", "role": "VP"}
]
}POST /imports/imp_xyz789/mapping-confirm?workspaceId=42{
"mapping": {
"email": "email",
"first_name": "firstName",
"last": "lastName",
"org": "company",
"role": "title"
}
}GET /imports/imp_xyz789/status?workspaceId=42{
"importId": "imp_xyz789",
"status": "completed",
"totalRows": 5000,
"imported": 4950,
"invalid": 50,
"errors": [...]
}GET /campaigns/cmp_abc123/contacts?workspaceId=42&limit=50{
"items": [
{
"id": "cnt_001",
"campaignId": "cmp_abc123",
"email": "sarah@acme.com",
"name": "Sarah Chen",
"status": "pending",
"customJson": {"company": "Acme Corp", "title": "VP Sales"},
"createdAt": "2026-03-09T10:30:00Z"
}
],
"next_cursor": "cursor_abc"
}pending, active, replied, bounced, unsubscribed, suppressed, completed, failedPOST /campaigns/cmp_abc123/mailboxes?workspaceId=42{
"mailboxAddress": "john@cooloutreach.com",
"dailyLimit": 30,
"weight": 100
}{
"id": "cmb_001",
"campaignId": "cmp_abc123",
"mailboxId": "mbx_501",
"weight": 100,
"state": "active",
"dailyLimit": 30,
"gapBaseSeconds": 120,
"gapJitterSeconds": 60
}| Field | Type | Description |
|---|---|---|
mailboxAddress | string | Email address of the mailbox |
dailyLimit | integer | Max emails per day from this mailbox (1-5000) |
weight | integer | Sending weight relative to other mailboxes (1-1000) |
gapBaseSeconds | integer | Min seconds between sends (0-86400) |
gapJitterSeconds | integer | Random jitter added to gap (0-86400) |
PATCH /campaigns/cmp_abc123/mailboxes/cmb_001?workspaceId=42{
"dailyLimit": 50,
"weight": 150
}GET /campaigns/cmp_abc123/mailboxes?workspaceId=42PUT /campaigns/cmp_abc123/schedule?workspaceId=42{
"timezone": "America/New_York",
"weekdays": ["mon", "tue", "wed", "thu", "fri"],
"windows": [
{"start": "09:00", "end": "12:00"},
{"start": "14:00", "end": "17:00"}
]
}PUT /campaigns/cmp_abc123/stop-rules?workspaceId=42{
"stopOnReply": true,
"stopOnUnsub": true,
"stopOnBounce": true
}GET /campaigns/cmp_abc123/preflight?workspaceId=42{
"checks": [
{"name": "has_steps", "passed": true},
{"name": "has_contacts", "passed": true},
{"name": "has_mailboxes", "passed": true},
{"name": "mailbox_auth", "passed": true},
{"name": "schedule_set", "passed": true}
],
"blockingFailures": [],
"summary": "All checks passed. Ready to launch."
}blockingFailures is not empty, fix the issues before launching.GET /campaigns/cmp_abc123/mailbox-preflight?workspaceId=42POST /campaigns/cmp_abc123/launch?workspaceId=42| Parameter | Type | Default | Description |
|---|---|---|---|
limit | integer | null | Max contacts to send to (for gradual rollout) |
async | boolean | false | Return immediately with job ID |
{
"ok": true,
"status": "launched",
"campaignId": "cmp_abc123"
}{
"ok": true,
"jobId": "job_launch_001",
"status": "queued",
"campaignId": "cmp_abc123",
"createdAt": "2026-03-09T11:00:00Z"
}GET /campaigns/cmp_abc123/launch-jobs/job_launch_001?workspaceId=42POST /campaigns/cmp_abc123/lifecycle?workspaceId=42{"action": "pause"}{"action": "resume"}draft → active → paused / completed / erroredGET /campaigns/cmp_abc123/stats?workspaceId=42{
"campaignId": "cmp_abc123",
"status": "active",
"contacts": {
"total": 500,
"active": 200,
"completed": 150,
"replied": 45,
"bounced": 5
},
"sends": {
"total": 800,
"sent": 750,
"failed": 10,
"bounced": 20,
"replied": 45
}
}GET /campaigns/cmp_abc123/sends?workspaceId=42&limit=50{
"items": [
{
"id": "snd_001",
"campaignId": "cmp_abc123",
"contactId": "cnt_001",
"stepId": "stp_001",
"mailboxId": "mbx_501",
"to": "sarah@acme.com",
"status": "sent",
"attempts": 1,
"sentAt": "2026-03-09T09:15:00Z"
}
],
"next_cursor": "cursor_xyz"
}queued, scheduled, sending, sent, failed, bounced, skipped, canceled, repliedGET /campaigns/cmp_abc123/contacts/changes?workspaceId=42&updatedSince=2026-03-09T00:00:00Z{
"items": [
{
"contactId": "cnt_001",
"email": "sarah@acme.com",
"status": "replied",
"previousStatus": "active",
"updatedAt": "2026-03-09T14:30:00Z"
}
],
"next_cursor": "cursor_abc",
"updated_since": "2026-03-09T00:00:00Z"
}GET /campaigns/cmp_abc123/export?workspaceId=42&kind=summarycampaignId field for easy correlation:GET /threads?workspaceId=42&replyIntent=interestedcampaignId: "cmp_abc123" are replies to this campaign.GET /campaigns/webhooks/event-types?workspaceId=42POST /campaigns/webhooks/subscriptions?workspaceId=42{
"endpoint": "https://your-app.com/webhooks/outreach",
"eventTypes": ["reply.received", "contact.bounced", "contact.unsubscribed"],
"replyIntents": ["interested", "not_interested"],
"campaignIds": ["cmp_abc123"],
"ignoreOoo": true,
"ignoreAutoReply": true,
"secret": "whsec_your_webhook_secret"
}{
"subscription": {
"id": "wh_sub_001",
"endpoint": "https://your-app.com/webhooks/outreach",
"eventTypes": ["reply.received", "contact.bounced", "contact.unsubscribed"],
"status": "active",
"secret": "whsec_your_webhook_secret"
}
}POST /campaigns/webhooks/subscriptions/wh_sub_001/test?workspaceId=42PATCH /campaigns/webhooks/subscriptions/{id}?workspaceId=42 # Update
DELETE /campaigns/webhooks/subscriptions/{id}?workspaceId=42 # Delete
POST /campaigns/webhooks/subscriptions/{id}/pause?workspaceId=42 # Pause
POST /campaigns/webhooks/subscriptions/{id}/resume?workspaceId=42 # Resume
POST /campaigns/webhooks/subscriptions/{id}/rotate-secret?workspaceId=42 # Rotate secretGET /campaigns/webhooks/events?workspaceId=42&limit=50GET /campaigns/webhooks/subscriptions/{id}/deliveries?workspaceId=42POST /campaigns/suppressions?workspaceId=42{
"emails": ["do-not-email@company.com", "unsubscribed@example.com"],
"reason": "manual_suppression"
}GET /campaigns/suppressions/status?workspaceId=42&email=someone@company.comGET /campaigns/suppressions?workspaceId=42&limit=50DELETE /campaigns/suppressions?workspaceId=42&email=someone@company.comPOST /campaigns/cmp_abc123/subsequences?workspaceId=42{
"name": "Interested Follow-up",
"enrollmentMode": "manual"
}PATCH /campaigns/cmp_abc123/subsequence-routing?workspaceId=42{
"routingPolicy": {
"rules": [
{
"trigger": "reply_intent",
"value": "interested",
"subsequenceId": "sub_001"
}
]
}
}