A clean REST API, drop-in SMTP, typed SDKs for Node and Python, templates, and signed webhooks. Six doors into one engine.
Free sandbox to integrate · Production from $3/month

cURL, Node, Python, Go, PHP, Ruby — or no code at all over SMTP. Attachments, scheduling, batch: everything rides one endpoint. Switch the door; nothing else changes.
curl -X POST https://api.drin.run/v1/emails \ -H "Authorization: Bearer drin_k_…" \ -d '{ "from": "billing@yourapp.com", "to": "sarah@gmail.com", "subject": "Your June invoice", "html": "<p>Attached.</p>", "attachments": [{ "filename": "invoice.pdf", "content": "…" }], "sendAt": "2026-06-13T09:00:00Z" }' # one or many: POST /v1/emails/batch takes a list # of messages and returns one id per message.
Anything that speaks SMTP speaks Drin. Point your framework's mailer at our relay and every send shows up in the same activity feed, fires the same webhooks, and obeys the same suppressions — zero code changes.
SMTP setup guide →Versioned, reusable content with merge fields. Author in the dashboard, send by id from the API, the CLI, or an agent — the content team edits copy without a deploy.
Template reference →{{first_name}} {{cta_url}}{{order_id}} {{total}} {{items}}{{reset_url}} {{expires_in}}{{month}} {{amount_due}}Whichever door mail leaves by, events come back on one wire — signed, ordered, and mirrored in the dashboard activity feed.
Every webhook is HMAC-signed so your server can verify it came from Drin before acting on it.
sent, delivered, bounced, complained, received — each state change posts to your endpoint as it happens.
Hard bounces and complaints land on your suppression list automatically — the next send already knows.
12:04:18 email.sent em_8f2… sarah@gmail.com 12:04:19 email.delivered em_8f2… gmail-smtp-in 12:05:02 email.sent em_8g1… tom@outlook.com 12:05:04 email.bounced em_8g1… 550 no such user 12:05:04 → tom@outlook.com suppressed automatically