Email that just works.
The email API for developers. usend sends your app's verification codes, receipts and newsletters, brings replies back to you, and reports every delivery, bounce and open as a webhook.
Your sending, receiving
and deliverability partner
- SDKs for Node.js and Python
- Domains verified in one click
- Receive mail at your domain
- Pay in ETB or USD
Send from any stack
that speaks HTTP
Your login code
- Queued
- Sent through Amazon SES
- Delivered to gmail.com
- Opened
- Clicked "Sign in"
Webhook · email.delivered
{
"type": "email.delivered",
"created_at": "2026-10-11T09:41:04Z",
"data": {
"email_id": "e3b1c2…",
"to": ["[email protected]"],
"subject": "Your login code"
}
}
Illustrative example.
Replace your email stack
The records, events, receiving and safeguards are built in, so email is one less thing to run.
Quick to start.
Ready to grow.
No mail servers to run, no IP warm-up and no blocklists to watch. Verify a domain and send.
Domains verified in one click
DKIM, SPF and DMARC for every domain. On Cloudflare usend adds the records for you; anywhere else, import a zone file.
Pay the way you can
Plans in ETB through Chapa (Telebirr, CBE Birr, M-Pesa, cards) or in USD by international card.
Node.js and Python
Official usend SDKs for emails, batches, scheduling, templates, domains, contacts, broadcasts and webhooks. Every other language works over plain HTTP.
Everything between your code and the inbox
Sending, receiving, events and DNS behind one API, with a dashboard that shows every message.
Every event, in real time
Sent, delivered, delayed, bounced, complained, opened and clicked, per email, and pushed to your signed webhooks with retries and replay.
How webhooks work →DNS, done for you
Publish the records usend shows you, or let Auto-configure add them on Cloudflare. Verification takes minutes.
Verify a domain →Email that comes back to you
Add one MX record and every address at your domain can receive. Each message arrives in your dashboard and at your webhook as JSON, attachments included, ready to route into your app.
How receiving works →// npm install @usend/node import { Usend } from "@usend/node"; const usend = new Usend(process.env.USEND_API_KEY); const { data, error } = await usend.emails.send({ from: "Acme <[email protected]>", to: "[email protected]", subject: "Your login code", html: "<p>Your code is <b>482913</b></p>", });
# pip install usend import os from usend import Usend usend = Usend(os.environ["USEND_API_KEY"]) email = usend.emails.send({ "from": "Acme <[email protected]>", "to": "[email protected]", "subject": "Your login code", "html": "<p>Your code is <b>482913</b></p>", }) print(email["id"])
body := strings.NewReader(`{ "from": "Acme <[email protected]>", "to": "[email protected]", "subject": "Your login code", "html": "<p>Your code is <b>482913</b></p>" }`) req, _ := http.NewRequest("POST", "https://api.usend.et/emails", body) req.Header.Set("Authorization", "Bearer "+os.Getenv("USEND_API_KEY")) req.Header.Set("Content-Type", "application/json") resp, err := http.DefaultClient.Do(req)
$ch = curl_init("https://api.usend.et/emails"); curl_setopt_array($ch, [ CURLOPT_POST => true, CURLOPT_RETURNTRANSFER => true, CURLOPT_HTTPHEADER => [ "Authorization: Bearer " . getenv("USEND_API_KEY"), "Content-Type: application/json", ], CURLOPT_POSTFIELDS => json_encode([ "from" => "Acme <[email protected]>", "to" => "[email protected]", "subject" => "Your login code", "html" => "<p>Your code is <b>482913</b></p>", ]), ]); $response = curl_exec($ch);
curl https://api.usend.et/emails \ -H "Authorization: Bearer $USEND_API_KEY" \ -H "Content-Type: application/json" \ -d '{ "from": "Acme <[email protected]>", "to": "[email protected]", "subject": "Your login code", "html": "<p>Your code is <b>482913</b></p>" }'
// POST to your webhook when mail arrives at your domain { "type": "email.received", "data": { "email_id": "7f2a…", "from": "Ann <[email protected]>", "to": ["[email protected]"], "subject": "Re: Your invoice #1042", "text": "Thanks! Paid today.", "attachments": [ { "filename": "receipt.pdf", "size": 48213 } ] } }
An API you already know
One REST API with official SDKs for Node.js and Python, and plain HTTP for everything else. Send your first email in a few lines.
- Official SDKs, or any HTTP client
- Idempotency keys, batch sending, scheduling
- Webhooks signed per Standard Webhooks
- Clear errors with a status, name and message
import { verifyWebhook } from "@usend/node"; app.post("/webhooks/usend", express.text({ type: "*/*" }), async (req, res) => { const event = await verifyWebhook({ payload: req.body, headers: req.headers, secret: process.env.USEND_WEBHOOK_SECRET, }); if (event.type === "email.bounced") markUndeliverable(event.data.to); res.sendStatus(200); });
Trust every event you receive
Each delivery is signed. One call checks the signature and the timestamp and hands you the event, so a forged or replayed request never reaches your code. Failed deliveries retry for a day and can be replayed from the dashboard.
Verify signatures →Also included
Every plan includes all of it.
Templates & broadcasts
Publish templates with typed variables. Send opt-in newsletters with one-click unsubscribe and staged delivery.
↗Suppression built in
Hard bounces and complaints are suppressed automatically, so you never email a dead or unhappy address twice.
↗Scheduling & batches
Send up to 100 emails in one request, or schedule them up to 30 days ahead with a date or a phrase like "tomorrow at 9am".
↗Cloudflare auto-configure
Paste a scoped Cloudflare token and usend publishes your DNS records itself, without touching anything else.
Reach inboxes, not spam folders
Authentication, hygiene and safeguards are on by default for every domain and every account.
Your own DKIM key
Every message is signed with a key generated for your domain, so receivers see your brand, not ours.
SPF on your domain
The return path lives under your domain, so SPF, DKIM and DMARC all align.
DMARC ready
Publish a DMARC record from day one and tighten it as your reports come back clean.
Records watched for you
DNS is re-checked continuously, and a verified domain gets 72 hours of grace before a broken record stops it.
Automatic suppression
Hard bounces and complaints are suppressed instantly and never mailed again.
Bounces & complaints
Provider feedback arrives as events and webhooks the moment it happens.
One-click unsubscribe
Every broadcast carries List-Unsubscribe headers that Gmail and Yahoo require.
Staged broadcasts
Large sends go out in waves and pause automatically if the first wave bounces or draws complaints.
Amazon SES underneath
Mail leaves through Amazon SES's sending network, with its reputation monitoring and feedback loops.
Simple plans, in ETB or USD
Start free. Upgrade when you outgrow it: paid plans add broadcasts and longer history. That works out from $0.0004 per email.
Free Recommended
- 3,000 emails / month
- 100 emails / day
- 3 days of email history
- Sending, receiving & webhooks
- Broadcasts
Pro Recommended
- 50,000 emails / month
- No daily limit
- 30 days of email history
- Broadcasts with one-click unsubscribe
- Sending, receiving & webhooks
Scale Recommended
- 200,000 emails / month
- No daily limit
- 90 days of email history
- Broadcasts with one-click unsubscribe
- Sending, receiving & webhooks
The Pro plan covers this.
Good deliverability is a shared responsibility
Every customer's mail shares the platform's reputation, so these safeguards are built in, not optional. Our Acceptable Use Policy forbids purchased lists, unsolicited bulk mail and cold outreach without opt-in.
- Every sending domain is verified with DKIM, SPF and DMARC before it can send.
- New accounts start in a sandbox and are reviewed by our team before production sending.
- Bounced and complaining addresses are suppressed automatically and never emailed again.
- Accounts with high bounce or complaint rates are paused automatically and reviewed.
- Daily and monthly quotas, rate limits, and one-click unsubscribe on every newsletter.
Questions, answered
Something else? Write to [email protected] or read the docs.
Which languages can I use?
Any. usend has official SDKs for Node.js and Python, and a REST API that any HTTP client can call.
Who actually delivers my email?
Mail is delivered through Amazon SES, signed with your domain's own DKIM key and sent from a return-path on your domain, so SPF, DKIM and DMARC align with your brand.
Can I receive email, not just send it?
Yes. Turn on receiving for a domain and point its MX record where usend shows you. Incoming mail appears in your dashboard and is posted to your webhook as JSON with attachments.
Can I pay in ETB?
Yes. Pay in ETB through Chapa (Telebirr, CBE Birr, M-Pesa and local cards), prepaid for 1 to 12 months, or pay in USD by international card.
Why does my new account start in a sandbox?
To protect deliverability for everyone. In the sandbox you can send to your own verified team members; request production access from the dashboard and our team reviews it, usually quickly.
What can't I send with usend?
Mail to purchased, rented or scraped lists, unsolicited bulk email and cold outreach without opt-in. See the Acceptable Use Policy.
Start sending in minutes
Create a free account, verify a domain, and send in minutes.