Send email API
The api.email send email API delivers transactional email — password resets, login codes, receipts, invitations — with one HTTPS request. Post JSON, get an id back, and follow every email through delivery webhooks. Prefer SMTP? The same key works there too.
- One request to
POST https://api.email/v1/emails - Idempotency keys, so a retried request never sends twice
- HTML and text, attachments, tags and scheduled sends
- Delivered, bounced and complained events as signed webhooks
curl https://api.email/v1/emails \ -H "Authorization: Bearer $API_EMAIL_KEY" \ -H "Content-Type: application/json" \ -d '{"from": "Acme <[email protected]>", "to": "[email protected]", "subject": "Reset your password", "text": "Reset it here: https://acme.com/r/8f2c"}'
const res = await fetch("https://api.email/v1/emails", { method: "POST", headers: { Authorization: `Bearer ${process.env.API_EMAIL_KEY}`, "Content-Type": "application/json", }, body: JSON.stringify({ from: "Acme <[email protected]>", to: "[email protected]", subject: "Reset your password", text: "Reset it here: https://acme.com/r/8f2c", }), }); const { id } = await res.json(); // "em_8f2c1a"
import os, requests resp = requests.post( "https://api.email/v1/emails", headers={"Authorization": f"Bearer {os.environ['API_EMAIL_KEY']}"}, json={ "from": "Acme <[email protected]>", "to": "[email protected]", "subject": "Reset your password", "text": "Reset it here: https://acme.com/r/8f2c", }, timeout=10, ) print(resp.json()["id"])
# Any SMTP client or framework
Host: smtp.api.email
Port: 587 (STARTTLS) or 465 (TLS)
Username: api
Password: $API_EMAIL_KEYFrom zero to the first email in three steps
1. Add your domain
Add two CNAME records to your DNS: one for the sending subdomain, one for DKIM. We check them live.
2. Create an API key
Use separate keys for development, staging and production. Test keys never deliver real email.
3. Send
POST the sender, recipient, subject and content. Store the returned id next to your own records.
The parts of sending email you don't want to build
Idempotency keys
Send an Idempotency-Key per logical email. Retries return the original result.
Scheduled sends
Pass scheduled_at to queue an email for later, and cancel it if plans change.
Attachments
Base64 files in the same JSON request, up to 10 MB per message.
Tags
Label emails by type to filter logs and count bounces per flow.
Delivery webhooks
Signed events for sent, delivered, bounced, complained, opened and clicked.
Suppression list
Hard bounces and complaints are blocked automatically to protect your reputation.
Prefer SMTP? Use smtp.api.email, port 587 (STARTTLS) or 465 (TLS), username api and your API key as the password. SMTP settings →
Send email from your stack
Step-by-step guides with complete, copy-paste code. No SDK required.
Send email API questions
What is a send email API?
A send email API lets your application send email with an HTTPS request instead of talking SMTP to a mail server. You post the sender, recipients and content as JSON; the provider signs the message, delivers it, handles retries and bounces and reports what happened through webhooks.
Is there a free tier?
Yes. The free plan includes 3,000 emails a month (100 a day) on up to 3 domains, with inbound email included. No credit card is required. Pricing →
Should I use the REST API or SMTP?
Use the REST API for new code: it is one request, returns an email id you can track and supports idempotency keys. Use SMTP when a framework, CMS or device can only speak SMTP. Both use the same API key, logs and webhooks.
How fast is delivery?
Most messages are handed to the recipient's mail server within seconds of your request. You get an email.delivered webhook when the receiving server accepts the message, or email.bounced if it refuses it.
Can I schedule emails for later?
Yes. Add scheduled_at with an ISO 8601 timestamp to POST /v1/emails and the email is queued until then. You can cancel a scheduled email before it is sent.