Skip to main content
Docs that lead with working code

Developer docs for the Senddio messaging API.

Every Senddio doc page starts with a working request you can paste directly into your terminal. Every error response tells you exactly what to do next. Every endpoint shows the call in cURL, Node and Python. The dashboard mirrors the docs, so anything you see in the documentation is one click away in the product.

Free forever · No card · All 6 channels · AI credits
Quick start

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
POST /v1/send
200 OK
# 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: '…'
});
Documentation philosophy

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.

The shift

Stop reading docs that do not actually ship code.

  • No more documentation chains that never show you a working request.
  • No more error messages that just say “something went wrong”.
  • No more sample code that would never pass your own code review.
  • No more documentation that drifts away from what the dashboard does.

Every page leads with a working command you can paste right away.

From teams who switched

Docs that respect your time.

Composite quotes from developers who integrated Senddio in an afternoon.

I pasted the request from the docs at 11pm. It worked first time. I closed my laptop. I cannot tell you the last time that happened with a vendor.
Aria S.
Solo founder · indie tool
Error responses tell you what to do next. That saved me three internal Slack threads in the first week alone.
Owen B.
Senior engineer · platform team
Our junior engineer shipped his first integration on day one. The docs do half of our onboarding for us now.
Sana M.
Engineering manager · series-A startup
Your next 30 days

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.

Read once. Ship forever.

Every endpoint, error message and dashboard screen designed to make the next move obvious.

Get a key See pricing
300 emails/day · All 6 channels · AI credits · No card