Quick start
One POST, six possible channels.
One endpoint covers all six channels. Use each channel’s required sender, recipient and content fields.
- Bearer auth: sdo_live_ or sdo_mcp_
- 202 Accepted (queued, not yet delivered)
- Stable id format: sdo_msg_<cuid2>
- Rate-limit headers on every response
POST /v1/send
202 Accepted
# curl
curl https://api.senddio.com/v1/send \
-H "Authorization: Bearer sdo_live_…" \
-H "Content-Type: application/json" \
-d '{"channel":"email","messageType":"transactional","from":"…","to":"…","subject":"…","html":"…","trackOpens":true,"trackClicks":true}'
# node
import { Senddio } from 'senddio';
const senddio = new Senddio({ apiKey: process.env.SENDDIO_KEY });
await senddio.messages.send({
channel: 'email', messageType: 'transactional', from: '…', to: '…',
subject: '…', html: '…', trackOpens: true, trackClicks: true
});Browse
The full surface.
API reference
Every endpoint, every error code, every header.
Node SDK
Typed client, retries, idempotency keys.
Webhooks
Signed deliveries, retry schedule, replay.
Authentication
API keys, scopes, IP allow-lists, expiry.
Claude MCP
@senddio/mcp-server reference + tools.
OpenAI tools
Schemas + handler reference.
Domains
SPF, DKIM, DMARC verification.
Suppressions
Per-channel suppression lists.
Suggested integration milestones
Your first 30 days as an integrator.
01
Day 1
First curl from the docs ships a real message
02
Day 3
Node SDK installed, tests passing in CI
03
Week 1
Webhook signature verification live in prod
04
Day 30
Onboarding new engineers takes one afternoon
●Every milestone above ships on the Free plan. No card, no upgrade gate.
FAQ
Developer FAQ
Dashboard → API keys → Create. You'll see the full sdo_live_… value exactly once — copy and store securely. We only persist the SHA-256 hash.
Daily quota per org, enforced via Redis with X-RateLimit-Limit / Remaining / Reset headers on every response. Over-quota returns 429 with a clear "wait until X or upgrade" body — never a silent drop.
Every error returns { error, message, code, …context }. message is human-readable instruction (what happened + what to do), code is a stable machine string. We'd rather you fix it than apologize.
Start sending