Every resource you drive in the NuMail app — campaigns, leads, mailboxes, the unibox, A/B tests, workspaces — is a clean REST resource. Bearer auth with a nm_live_ key. HMAC-signed inbound webhooks for Gmail and Microsoft Graph. Honest about what's shipped, ambitious about the DX.
Generate a key in Settings · API Keys, then talk to the same endpoints the app uses.
Every request carries an Authorization: Bearer nm_live_••• header. Keys are minted per workspace from Settings · API Keys, and you can revoke and re-issue them at any time.
# List your campaigns curl https://api.numail.ai/campaigns \ -H "Authorization: Bearer nm_live_•••" # → { # "data": [ # { "id": "cmp_3f9", "name": "Q2 outbound · cohort B", # "status": "active", "leads": 4820 } # ] # }
Today these endpoints are the same Next.js routes the dashboard calls, authenticated with your workspace key. We're hardening them into a stable, documented public surface — versioned paths under /v1, an OpenAPI spec, and official SDKs are on the roadmap below, not shipped yet. The shapes here are real; we'll keep them backwards-compatible as the public contract firms up.
List / get / create / update / delete, plus action sub-routes for the verbs that matter (/start, /approve-draft, /declare-winner). Sequences live inside campaigns — there's no separate sequences resource.
/v1 gateway and OpenAPI spec are on the roadmap.Two distinct things: keys that authenticate your API calls, and OAuth flows that let NuMail send from real mailboxes.
Mint a key in Settings · API Keys and pass it as a Bearer token. Keys are scoped to a single workspace — agencies issue one per client workspace.
Authorization: Bearer nm_live_•••nm_test_ prefix planned for sandbox keysConnecting a sending inbox is a hosted OAuth handoff. Kick it off, send the user through, and the callback stores tokens against the workspace.
GET /auth/google — start the Gmail API consent flowGET /auth/microsoft — start the Microsoft Graph flow/mailboxes/connect-smtpNuMail receives provider push notifications — Gmail and Microsoft Graph — at dedicated inbound endpoints. Each is verified with a per-workspace HMAC-SHA256 secret before the reply pipeline runs and fires the 2.4s draft.
POST /webhooks/gmailGmail Pub/Sub pushPOST /webhooks/graphMS Graph change notificationreply detected2.4s median, inbound parsedclassificationpositive · neutral · objection · OOOai_draft readyClaude writes in your voicethread surfacedlands in the unibox to approve# Inbound: Gmail Pub/Sub hits /webhooks/gmail # NuMail verifies the per-workspace HMAC, then # parses the reply and emits an internal event: { "event": "reply.received", "workspace_id": "wks_anchor", "source": "gmail", "created_at": "2026-06-24T13:32:11.043Z", "data": { "thread_id": "thr_2c1", "campaign_id": "cmp_3f9", "lead_id": "lead_9a2", "classification": "positive", "detected_in_ms": 2400, "ai_draft": { "id": "drf_9a4", "body": "Hey Sarah — usually a week…" } } } # Signature header: # X-NuMail-Signature: t=1750771931,v1=…
The Gmail and Graph receivers are live and HMAC-verified today. Outbound webhooks — where NuMail pushes events like reply.received to your endpoint — are on the roadmap; for now, poll /threads or watch /threads/unread-count.
Straight about what's shipped versus what's coming. The resources above work now; the polish below is in flight.
Campaigns, leads, mailboxes, unibox threads, A/B tests and workspaces — all callable now with a workspace key.
Mint, scope and rotate nm_live_ keys from Settings · API Keys today.
Gmail Pub/Sub and Microsoft Graph receivers, HMAC-verified per workspace, powering 2.4s reply detection.
A stable public path prefix with documented, backwards-compatible contracts and consistent error shapes.
A published spec at /v1/openapi.json and generated TypeScript & Python clients.
Push events to your endpoints, plus an MCP server so AI agents can run campaigns conversationally.
Grab a workspace key from Settings · API Keys and start driving campaigns, leads and the unibox over HTTP.