Retries that never double-send
Send an Idempotency-Key header and a repeated request returns the first email instead of sending a second one, even when two retries race each other.
Warm up now. Book January. New year head start: 30 days free on any paid plan. Claim 30 days free
Send password resets, verification emails, receipts and product notifications through infrastructure built around deliverability.
From $15/month. No complicated pricing.
Send your first email in under 5 minutes.
What is Warmerly's transactional email API?
Warmerly's transactional email API sends the emails your app triggers, such as password resets and receipts, over a REST API on infrastructure kept separate from cold outreach. The Free plan includes 5,000 emails a month with no card, and paid plans start at $15 a month for 50,000.
One request
Create a sending key and make one HTTP request, from any language. Every email gets an id you can look up, with its full delivery timeline.
See the code samplesfrom no-reply@mail.acme.example to jane@example.org subject Reset your password
Delivery events
When it was accepted for delivery, then delivered, deferred, bounced or marked as spam, with the receiving server's own response. From the API and the dashboard.
Read the delivery docsjane@example.orgOne email is one recipient
What counts
An email that fails on our side and is never handed to the recipient's mail server doesn't count toward your allowance or your overage.
See pricingTransactional API
Follow an email from your app through sending to its delivery events.
How it works
Most of the work is pasting DNS records. The API call is the short part.
For example mail.acme.com. Warmerly registers it for sending and hands you the DNS records for it.
Three DKIM CNAMEs, an MX and an SPF record on a bounce. subdomain, and DMARC. None of them touch your inbound mail, and Verify tells you exactly which record is still missing.
Create a sending key and make one HTTP request, from any language. Every email gets an id you can look up, with its full delivery timeline.
curl -X POST https://app.warmerly.com/api/v1/transactional/emails \
-H "Authorization: Bearer wm_tx_…" \
-H "Idempotency-Key: reset-7f3a9c" \
-H "Content-Type: application/json" \
-d '{
"from": "Acme <no-reply@mail.acme.com>",
"to": "jane@example.org",
"subject": "Reset your password",
"html": "<p>Click the link to reset your password.</p>"
}'const res = await fetch("https://app.warmerly.com/api/v1/transactional/emails", {
method: "POST",
headers: {
Authorization: "Bearer wm_tx_…",
"Idempotency-Key": "reset-7f3a9c",
"Content-Type": "application/json",
},
body: JSON.stringify({
from: "Acme <no-reply@mail.acme.com>",
to: "jane@example.org",
subject: "Reset your password",
html: "<p>Click the link to reset your password.</p>",
}),
});
console.log(res.status, await res.json());import requests
res = requests.post(
"https://app.warmerly.com/api/v1/transactional/emails",
headers={
"Authorization": "Bearer wm_tx_…",
"Idempotency-Key": "reset-7f3a9c",
},
json={
"from": "Acme <no-reply@mail.acme.com>",
"to": "jane@example.org",
"subject": "Reset your password",
"html": "<p>Click the link to reset your password.</p>",
},
)
print(res.status_code, res.json())$ch = curl_init("https://app.warmerly.com/api/v1/transactional/emails");
curl_setopt_array($ch, [
CURLOPT_POST => true,
CURLOPT_RETURNTRANSFER => true,
CURLOPT_HTTPHEADER => [
"Authorization: Bearer wm_tx_…",
"Idempotency-Key: reset-7f3a9c",
"Content-Type: application/json",
],
CURLOPT_POSTFIELDS => json_encode([
"from" => "Acme <no-reply@mail.acme.com>",
"to" => "jane@example.org",
"subject" => "Reset your password",
"html" => "<p>Click the link to reset your password.</p>",
]),
]);
$response = curl_exec($ch);202 Accepted
{ "id": "9b1e…", "status": "sent", "duplicate": false }Copy this prompt into Claude Code, Cursor, Codex or any agent with your project open. It adds your domain, waits while you publish the DNS records, writes the send function with safe retries, and sends a test email to you.
Deliverability
Warmerly is also an outreach tool, so we built this the other way round: the email your users asked for goes out on a path your campaigns can never touch.
bounce. subdomain of yours, so SPF aligns too, and DMARC can pass on both.Built in
Each of these is enforced in code, not left to a setting you have to remember.
Send an Idempotency-Key header and a repeated request returns the first email instead of sending a second one, even when two retries race each other.
If a send is throttled or the mail server can't be reached, the email waits and is retried with backoff for up to 24 hours, under the same id. You don't write the retry loop.
When it was accepted for delivery, then delivered, deferred, bounced or marked as spam, with the receiving server's own response. From the API and the dashboard.
Hard bounces and spam complaints join your workspace's suppression list, the same one your campaigns use. Skipped recipients are recorded, so you can see why.
Give your app a sending-only key, optionally limited to one domain. It can't read your email log, change domains, or touch anything else in Warmerly.
Mail goes out from servers in the EU. Warmerly sends no cold outreach or warmup through them.
Pricing
One email is one recipient. Every plan keeps each email's content for 30 days. Nothing past your allowance is ever charged unless you switch overage on; without it you get 10% extra free, then sends are refused until the next month.
One email is one recipient. Pick a monthly number, or estimate it from your users: sign-up, verification and password-reset emails add up to about four per user a month for most apps.
Prices in USD. Tax is added at checkout where it applies.
Every account starts on Free, with no card. Choose a paid plan in the dashboard when you need more.
This is separate from the outreach and warmup plans: a workspace can have either, both or neither.
Compare
At every volume Resend publishes, Warmerly costs less, and overage only happens if you turn it on.
Resend is still the better pick if you need an SMTP relay, webhooks, templates or open and click tracking today; those are on our roadmap, not built. The full Resend comparison shows the code change line by line.
Start sending free| Volume | Warmerly | Resend |
|---|---|---|
| Free plan | 5,000 a month, 200 a day | 3,000 a month, 100 a day |
| 50,000 emails a month | $15/mo | $20/mo (Pro) |
| 100,000 emails a month | $29/mo | $35/mo (Pro) |
| 200,000 emails a month | $129/mo | $160/mo (Scale) |
| 500,000 emails a month | $279/mo | $350/mo (Scale) |
| 1,000,000 emails a month | $499/mo | $650/mo (Scale) |
| 2,500,000 emails a month | $899/mo | $1,150/mo (Scale) |
| Overage per 1,000 | $0.60 down to $0.35, only if you switch it on | $0.90 down to $0.46 |
| Dedicated IP | $29/mo on Scale | $30/mo |
Resend prices are those published on resend.com/pricing as of September 2026. Check resend.com for current rates.
Alternatives
Head-to-head pages with prices at four volumes, a feature table, and the cases where the other one is the better pick.
In writing
What we commit to in writing. The binding wording is in section 18A of our Terms.
What's next
Sending, verification, suppression and delivery tracking are live today. Next up:
Fair use
FAQ
Not here? The API docs cover every field, or email support@warmerly.com.
Free covers 5,000 emails a month (up to 200 a day) with no card. Starter is $15 a month for 50,000, Growth is $29 for 100,000, and Scale runs from $129 for 200,000 to $899 for 2,500,000. It is a separate subscription from Warmerly's outreach plans: you can have either, both or neither.
One email is one recipient. A message sent to one address counts once; the same message to one address in to and two in cc counts three times. Recipients skipped because they are on your suppression list do not count, and neither does an email that fails on Warmerly's side before it is handed to the recipient's mail server.
Nothing is charged unless you switch overage on. Without it, you can go 10% past your monthly allowance free, so an unexpected spike does not stop password resets mid-month; past that, sends are refused until the next month or until you upgrade. With overage switched on, extra email costs $0.60 per 1,000 on Starter and Growth, falling to $0.35 on the largest Scale plan.
Inbox providers judge mail partly by where it comes from and by the domain behind it. If password resets shared a sender with a cold campaign that drew complaints, the resets would pay for it. Warmerly's outreach and warmup run on your mailboxes; your app's email runs on separate transactional infrastructure, and the two never share a sending server or a domain.
On price, yes: at every published volume Warmerly costs less (for example $29 against $35 for 100,000 emails a month, as of September 2026), the free plan is larger, and overage is cheaper and opt-in. Resend is the better pick today if you need an SMTP relay, delivery webhooks, templates or open and click tracking, which Warmerly does not have yet, or official SDKs in many languages; Warmerly is a REST API.
Yes. The transactional email API is covered by a 99.9% monthly availability commitment. If Warmerly misses it, you get a service credit on that month's transactional fee: 10% below 99.9%, 25% below 99.0%, 50% below 95.0%. Request it within 30 days by emailing support@warmerly.com. The full terms, including what is excluded, are in section 18A of the Terms of Service.
Email your application sends to one person because of something they did: a password reset, a sign-in link, a receipt, a notification. It is expected and time-sensitive, unlike marketing or cold outreach, which is why it should never share sending reputation with them.
Transactional sending infrastructure in the EU, separate from everything else in Warmerly: it never carries cold outreach or warmup. Each workspace is isolated, so a workspace whose bounce or complaint rate gets too high is paused on its own without affecting anyone else.
A few, all shown in the dashboard ready to copy: three DKIM CNAMEs, an MX and an SPF TXT on bounce.yourdomain (where bounce reports are received), and a DMARC TXT. None of them touch your domain's own inbound mail. The only MX is on bounce.yourdomain, so your mailboxes keep receiving exactly where they do today, and your existing SPF record is left alone.
Use a domain or subdomain you don't send cold outreach from, such as mail.yourcompany.com. Warmerly refuses a domain that is already used for anything else in Warmerly. A subdomain of a domain that already receives mail is ideal.
The complaint is reported back to us, the email's status becomes complained, and the address is added to your workspace's suppression list, just like a hard bounce. Later sends to it are skipped and recorded as suppressed.
Yes, on any Scale plan, for $29 a month. Most apps don't need one: a dedicated IP's reputation rests on your own sending alone, so it suits senders with high, steady volume. Everyone else is better served by the shared sending infrastructure, where each workspace is still isolated from every other.
3 on Free, 10 on Starter, 25 on Growth and unlimited on Scale. Every domain has to pass SPF, DKIM and DMARC before it can send, and its records are re-checked automatically after that.
If you want to send without building the parts around the sending yourself, yes: domain verification with ready-to-copy DNS records, bounce and complaint handling, a suppression list, retries and a delivery timeline for every email come with it. If you only need raw sending at the lowest possible price and have engineers to build that plumbing, sending through SES directly, at $0.10 per 1,000 emails, is cheaper.
Not yet. Sending is through the REST API, which any language that can make an HTTP request can call. An SMTP relay, delivery webhooks to your app, templates and open/click tracking are on the roadmap.
Sending cold outreach too? Warmerly's email warmup keeps those mailboxes out of spam, and the free deliverability checker audits any domain's SPF, DKIM and DMARC in seconds. See outreach pricing, the suppression list both products share, or send from a conversation with ChatGPT or Claude.
More from Warmerly
Transactional email is one product on the same account, the same workspace and the same bill.
Pick your volume
Choose the allowance closest to what your app sends. You can change plan any time from the dashboard.
Up to 200 a day, 3 sending domains, no card.
Summarize with AI
Create a free Warmerly account, add a sending domain and send your first email from the dashboard. 5,000 emails a month free, no card required.