Sign up, create an API key, verify a domain, and send your first email
By the end of this page you will have sent a real email through send.dev and read its delivery status back. It takes five steps and nothing beyond an HTTP client.
Create an account at send.dev/sign-up. The dashboard is where you manage API keys, domains, and senders; everything else is done over the API.
In the dashboard, open API Keys and click Create key. Give it a name you will recognize later (for example production-server).
The key is shown once. Copy it and store it as an environment variable:
export SEND_API_KEY="do_live_..."Keep the key server-side
The key can send email as any of your verified domains. Never ship it in browser or mobile code, commit it to a repository, or paste it into logs. If a key leaks, revoke it in the dashboard and create a new one. See API Keys.
You can only send from an address you have proven you control. The normal way is to verify a domain; the alternative for a single address is described in Senders.
Add the domain:
curl -X POST https://api.do.dev/v1/send/domains \
-H "Authorization: Bearer $SEND_API_KEY" \
-H "Content-Type: application/json" \
-d '{"domain": "mail.example.com"}'The response contains the DNS records to publish. There are three kinds:
| Record | Purpose |
|---|---|
3 CNAME records at <token>._domainkey.mail.example.com pointing to <token>.dkim.amazonses.com | DKIM signing |
TXT at mail.example.com with value v=spf1 include:amazonses.com ~all | SPF |
TXT at _send-dev-verify.mail.example.com with value send-dev-verify=<token> | Proves to send.dev that you own the domain |
Publish all of them at your DNS provider, then ask send.dev to check:
curl -X POST https://api.do.dev/v1/send/domains/DOMAIN_ID/verify \
-H "Authorization: Bearer $SEND_API_KEY"Repeat until status is verified. DNS propagation is usually minutes; DKIM confirmation by SES can occasionally take longer. The response tells you exactly which records are still missing. Once verified, the domain is approved automatically and you can send right away; new accounts start with modest hourly and daily caps for the first 72 hours (see Rate limits). Full details are on the Domains page.
curl -X POST https://api.do.dev/v1/send/emails/send \
-H "Authorization: Bearer $SEND_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"from": { "email": "hello@mail.example.com", "name": "Example App" },
"to": ["you@yourinbox.com"],
"subject": "Hello from send.dev",
"html": "<p>Your first message.</p>",
"text": "Your first message."
}'{
"id": "msg_3f9c2a1d7b8e4c0f9a1b2",
"status": "queued"
}A 202 means the message was accepted and queued. Delivery happens asynchronously, usually within a few seconds.
curl https://api.do.dev/v1/send/emails/msg_3f9c2a1d7b8e4c0f9a1b2 \
-H "Authorization: Bearer $SEND_API_KEY"{
"id": "msg_3f9c2a1d7b8e4c0f9a1b2",
"from": { "email": "hello@mail.example.com", "name": "Example App" },
"to": ["you@yourinbox.com"],
"subject": "Hello from send.dev",
"status": "delivered",
"createdAt": 1757000000000,
"sentAt": 1757000001200,
"deliveredAt": 1757000003900
}The status moves through queued, processing, sent, and then delivered, bounced, complained, or failed. See Get an email for every field.
send.email.sent event to your server instead of polling.