Continuum
Developers

The Continuum API, all resources.

Authenticate with your API key as a Bearer token or x-api-key header. All responses are JSON. Webhooks are HMAC-signed.

NODE.JS SDK — npm
npm install continuum-email

import { Continuum } from 'continuum-email';
const client = new Continuum({ apiKey: 'cont_live_...' });

// Verify a single email
const result = await client.verify.single('user@example.com');

// Send (add test: true to simulate without sending — no SES call, no charge)
const msg = await client.send.send({ to: 'alex@acme.com', subject: 'Hi', html_body: '<p>Hello</p>' });

// Send with MJML template (auto-compiled server-side)
const msg2 = await client.send.send({ to: 'alex@acme.com', subject: 'Hi', mjml_body: '<mjml>...</mjml>' });
MCP SERVER — CLAUDE, CURSOR & OTHER MCP CLIENTS

Continuum runs as a Streamable HTTP MCP server. Point an MCP-compatible client at the URL below with your API key and it can verify, send, and check deliverability as native tool calls — no separate SDK integration.

https://api.continuumapi.com/mcp
Authorization: Bearer YOUR_API_KEY
QUICKSTARTS
VERIFY BEFORE SEND
const r = await client.verify.single(email);
if (r.score >= 70 && r.result === 'deliverable') {
  await client.send.send({
    to: email,
    subject: 'Welcome',
    html_body: '<p>You're in.</p>',
  });
}
BULK VERIFY A LIST
// Submit CSV, poll until done
const job = await client.bulk.submit(csvFile);
let result;
do {
  await new Promise(r => setTimeout(r, 5000));
  result = await client.bulk.get(job.id);
} while (result.status !== 'complete');
// result.download_url — filtered by status
COLD OUTREACH SEQUENCE
const seq = await client.sequences.create({
  mailbox_id: 'mbx_...',
  stop_on_reply: true,
});
await client.sequences.addStep(seq.id, {
  delay_days: 0, html_body: '<p>Hi {{first_name}}</p>',
});
await client.sequences.enroll(seq.id, {
  emails: ['ceo@acme.com'],
});
FIND & ENROLL LEADS — RAW REST (not yet in the Node SDK)
const { runId } = await fetch(BASE + '/v1/finder/search', {
  method: 'POST', headers,
  body: JSON.stringify({
    personTitleIncludes: ['Head of Growth'],
    personLocationCountryIncludes: ['United States'],
  }),
}).then(r => r.json());
// poll GET /v1/finder/jobs/:runId/status until phase is "verified"
const { results } = await fetch(`${BASE}/v1/finder/jobs/${runId}/results`, { headers }).then(r => r.json());
await fetch(`${BASE}/v1/finder/jobs/${runId}/import`, {
  method: 'POST', headers,
  body: JSON.stringify({ emails: results.map(r => r.email), sequenceId: seq.id }),
});
NEWSLETTER CAMPAIGN
const list = await client.lists.create({ name: 'Waitlist' });
await client.lists.subscribe(list.id, { email, firstName });

const campaign = await client.campaigns.create({
  subject: 'We launched 🎉',
  html_body: '<p>Hello {{first_name}}</p>',
  list_ids: [list.id],
});
await client.campaigns.send(campaign.id);
QUICK START — REST
curl -X POST https://api.continuumapi.com/v1/send \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{ "to": "alex@acme.com", "subject": "Welcome", "html_body": "<p>Hi Alex!</p>", "verify_before_send": true }'
Verification
POST/v1/verifySingle email — 12 checks, score 0–100, sub-status.
GET/v1/verify/publicFree unauthenticated check — 5/day per IP. No API key needed.
POST/v1/bulk-jobsSubmit a CSV; poll for results or use a webhook.
GET/v1/bulk-jobs/:id/resultsPaginated results filtered by status.
Transactional
POST/v1/sendSend an email — templates, MJML, attachments, tracking, scheduled_at. Add \"test\":true to simulate without sending.
POST/v1/send/batchUp to 100 messages in one call, per-message suppression.
GET/v1/messagesMessage log with delivery events.
GET/v1/messages/statsAggregate delivery / bounce / open / click rates.
Templates
POST/v1/templatesCreate a reusable template — pass html_body or mjml_body (auto-compiled to HTML).
GET/v1/templatesList all templates.
PATCH/v1/templates/:idUpdate subject, html_body, mjml_body, or variables.
DELETE/v1/templates/:idDelete a template.
Sending domains
POST/v1/domainsAdd a domain — DKIM keypair generated; DNS records returned.
GET/v1/domains/:idStatus + SPF / DKIM / DMARC check.
POST/v1/domains/:id/verifyForce re-check DNS from SES.
GET/v1/domains/:id/healthFull deliverability score + blacklist status.
Lists & contacts
POST/v1/listsCreate a mailing list.
POST/v1/lists/:id/contactsSubscribe a contact (double-opt-in optional).
GET/v1/lists/:id/contactsPaginated contact list filtered by status.
DELETE/v1/lists/:id/contacts/:emailUnsubscribe.
Campaigns
POST/v1/campaignsCreate a draft campaign with list_ids and segment_ids.
POST/v1/campaigns/:id/sendTrigger send — fan-out worker starts immediately.
GET/v1/campaigns/:idLive stats: sent, open_rate, click_rate, bounce_rate.
POST/v1/campaigns/:id/duplicateClone a campaign into a new draft.
Sequences
POST/v1/sequencesCreate a sequence — inbox rotation, stop_on_reply, send windows, timezone.
POST/v1/sequences/:id/stepsAdd a step: delay_days, condition (if_not_opened / if_not_replied), html_body. Spintax supported.
POST/v1/sequences/:id/steps/:stepId/variantsAdd an A/B variant — variantLabel + weight for split testing.
POST/v1/sequences/:id/subsequencesCreate a child sequence triggered by REPLIED / OPENED / NOT_REPLIED_IN_DAYS.
POST/v1/sequences/:id/contactsEnroll leads — accepts list_id or emails[].
GET/v1/sequences/:id/contactsEnrollment status per contact.
Mailboxes
POST/v1/mailboxesConnect SMTP, Gmail, or Outlook.
POST/v1/mailboxes/:id/testTest connectivity and credentials.
POST/v1/mailboxes/:id/warmupEnable warmup ramp — target_per_day, ramp_up_days.
GET/v1/inboxUnified inbox — replies across all mailboxes and sequences.
Lead Finder
POST/v1/finder/searchStart a search — personTitleIncludes, companyIndustryIncludes, personLocationCountryIncludes, etc. (arrays). Returns a runId immediately; search runs async.
GET/v1/finder/jobs/:runId/statusPoll until phase is \"verified\" — search and verification both run in the background.
GET/v1/finder/jobs/:runId/resultsPaginated, verified leads: email, firstName, lastName, company, title, linkedinUrl, emailStatus.
POST/v1/finder/jobs/:runId/importImport selected emails as leads — pass sequenceId to auto-enroll.
AI
POST/v1/ai/personalizeGenerate a first-line opener per lead. Growth+ plan.
POST/v1/ai/generate-emailGenerate subject + HTML body from a plain-text brief. Growth+ plan.
POST/v1/ai/generate-sequenceGenerate a full multi-step sequence from a brief. Growth+ plan.
POST/v1/ai/classify-replyClassify an inbound reply: interested / not interested / ooo. Growth+ plan.
POST/v1/ai/detect-espDetect Gmail / Outlook / Yahoo by MX — for smart mailbox routing.
Analytics & usage
GET/v1/analytics/sendsDelivery, open, click, bounce rates — filterable by date and domain.
GET/v1/analytics/sends/timelineDaily breakdown for charting.
GET/v1/usageCurrent plan, verifications.used / limit, sends.used / limit.
Suppressions & monitoring
GET/v1/suppressionsList suppressed addresses with reason.
POST/v1/suppressionsManually suppress an address.
DELETE/v1/suppressions/:emailRemove from suppression list.
POST/v1/monitorsRegister an address for continuous re-verification.

Get your API key from the dashboard — free plan includes 1,000 verifications and 1,000 sends per month.