One POST, six possible channels.
The same shape works for email, SMS, WhatsApp, push, Slack and Telegram. Channel-specific fields are optional — pick the channel, fill the minimum, you’re done.
- Bearer auth — sdo_live_ or sdo_mcp_
- 200 OK in <50ms (queued)
- Stable id format: sdo_msg_<cuid2>
- Rate-limit headers on every response
# curl
curl https://api.senddio.com/v1/send \
-H "Authorization: Bearer sdo_live_…" \
-H "Content-Type: application/json" \
-d '{"channel":"email","from":"…","to":"…","subject":"…","html":"…"}'
# node
import { Senddio } from '@senddio/node';
const senddio = new Senddio({ apiKey: process.env.SENDDIO_KEY });
await senddio.messages.send({
channel: 'email', from: '…', to: '…', subject: '…', html: '…'
});The full surface.
How the Senddio docs are written.
Every Senddio doc page opens with a working curl command you can paste directly into your terminal with a free-plan key. Not a placeholder, not a mock — a real request that hits a real endpoint and comes back with a real response. We believe that if you can’t run the first example in under two minutes, the documentation has already failed.
Error responses are treated as first-class content. Every 4xx and 5xx includes a human-readable message field that tells you what went wrong and what to do next — not “something went wrong”, but the specific DNS record that failed verification or the exact rate-limit window you hit. The same text appears in the dashboard so the copy-paste path from docs to production is as short as possible.
The API surface is intentionally narrow. There is one endpoint for all six channels: POST /v1/send. Switching from email to SMS means changing one field. The response shape is identical across every channel, and error codes are stable machine strings so your error handling does not need to change when you add a channel. This means the reference section for each channel is short — the channel-specific parameters are the only new material to learn.
Docs that respect your time.
Composite quotes from developers who integrated Senddio in an afternoon.
Your first 30 days as an integrator.
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.