PlatformEmail
Transactional email, with no domain to verify.
Welcome messages, password resets, receipts and contact forms. Your coding agent switches email on while it builds, and your app sends with the Resend package exactly as it would anywhere. There is no Resend account to open and no DNS to touch.
- The Resend packageNode and Python, written exactly as for any Resend account
- No account, no DNSMail leaves from Antideploy's own sending domain
- Delivery trackingDelivered, bounced and marked as spam, per app
- Protects its own reputationAn app whose mail bounces or draws spam reports is paused
01How it works
Switched on while your agent builds.
A password reset written against a pretend mailer is one nobody saw arrive. Your agent turns the real thing on first.
One call, before the first message.
Your agent switches email on before it writes the welcome message, so the message is written and sent against the real thing. The variables go into your .env by a redirect, so the token that lets your app send is never printed, and the deploy that follows gives the running app the same ones.
- No Resend account to open and no domain to verify
- Asking twice returns the same sender, nothing is made twice
- A
RESEND_API_KEYyou set yourself always wins
$ API=https://antideploy.com/api/v1
# 1. let the app send, once per project
$ curl -X POST "$API/email?applicationId=$APP_ID" \
-H "Authorization: Bearer $TOKEN"
# 2. write its variables into .env (the answer holds a token)
$ curl -fsS "$API/email/env?applicationId=$APP_ID" \
-H "Authorization: Bearer $TOKEN" >> .env
Send with the package you already know.
The Resend packages read RESEND_BASE_URL in Node and RESEND_API_URL in Python, and both point at Antideploy's relay, so nothing else is configured. The message always leaves from your app's own address, and replies do not come back, so set a reply-to address if people may answer.
- At most five addresses on a message, and one message at a time
- Over a limit the answer is a 429 with Resend's own error name
- No attachments, scheduling, templates or batch sending
// Node
import { Resend } from "resend";
const resend = new Resend(process.env.RESEND_API_KEY);
await resend.emails.send({
from: process.env.EMAIL_FROM,
to: "maya@example.com",
subject: "Welcome to Verdant",
html: "<p>Glad you are here.</p>",
replyTo: "hello@verdant.in",
});
# Python
import os, resend
resend.api_key = os.environ["RESEND_API_KEY"]
resend.Emails.send({
"from": os.environ["EMAIL_FROM"],
"to": ["maya@example.com"],
"subject": "Welcome to Verdant",
"html": "<p>Glad you are here.</p>",
"reply_to": "hello@verdant.in",
})
See what happened. Stop it if you need to.
The console has an Email section with six tabs: Overview, Activity, Deliverability, Sending domain, API key and Settings. Your agent can read and run the same things through the API, so questions like did my email go out and why did it stop are answered from facts. None of it holds a subject, a body or an address.
- Activity shows what each message did: accepted by the relay, then delivered, bounced or marked as spam
- A pause stops an app's email at once, and a resume starts it again
- A test sends one real message to your own account address
$ API=https://antideploy.com/api/v1
# every project and where its email stands
$ curl "$API/email/overview" -H "Authorization: Bearer $TOKEN"
# what one project sent, with what Resend reported
$ curl "$API/email/activity?applicationId=$APP_ID&limit=20" \
-H "Authorization: Bearer $TOKEN"
# how its mail is landing
$ curl "$API/email/deliverability?applicationId=$APP_ID" \
-H "Authorization: Bearer $TOKEN"
02What you get
Mail your app sends, without the setup.
Email for the people who use your app: a welcome, a reset, a receipt. Small on purpose, and safe for everyone sharing the sending domain.
-
Resend's API, unchanged. Antideploy runs a relay that speaks Resend's own API, so the Resend packages for Node and Python work as they are. The errors are Resend's too, so code that handles them already handles these.
-
Nothing to open, verify or pay separately. There is no Resend account, no domain to verify and no DNS record to add. Email is part of your plan, with daily limits that grow with it.
-
Your app's own address. Every message leaves from your application's own address under Antideploy's sending domain, with your application's name as the display name, whatever the code says. A display name is how mail pretends to be somebody else, so it is never taken from the request.
-
Delivery reports, per app. Antideploy listens to Resend's delivery reports, so each app shows how its mail is landing: delivered, bounced, marked as spam, delayed or suppressed.
-
It stops itself before it hurts anyone. Every app shares one sending domain, so one app mailing addresses that do not exist would cost the rest their place in the inbox. An app whose mail bounces or draws spam reports is paused automatically and its owner is emailed.
-
Private by design. No subject, body or address is kept. What is kept is how many addresses a message went to, whether it was accepted, and what Resend reported about delivery.
03Limits by plan
Sized for an app's own users, not a mailing list.
- 20
- addresses a day on Free
- 100
- addresses a day on Go
- 500
- addresses a day on Pro
- 2,000
- addresses a day on Scale
Per application, in any 24 hours, by the plan of its owner. An account less than 7 days old can send to 10 addresses a day whatever it pays. A message goes to at most 5 addresses, and one application can send 10 messages a minute.
04Reference
The variables your app receives.
Set by the platform in the running app, and written to your .env by your agent for local work. Do not copy them into the secrets store.
| Variable | What it holds |
|---|---|
RESEND_API_KEY | A token for Antideploy's relay. It is not a Resend key, and anyone who holds it can send as your app, so it is never printed. |
RESEND_BASE_URL | Where the Node package sends. It points at the relay. |
RESEND_API_URL | Where the Python package sends. It points at the relay. |
EMAIL_FROM | A ready-made From value for your app: its name and its own address. |
05Rules
What the relay allows.
The same rules for every app. They keep the sending domain healthy for everyone on it.
| Rule | How it works |
|---|---|
| From | Always your application's own address under Antideploy's sending domain, with your application's name as the display name. |
| Reply-To | Passed through. Nothing receives mail at the sending address, so set it to one that does. |
| Recipients | At most five addresses on one message, to, cc and bcc together. |
| Rate | Ten messages a minute for one application, so a loop is stopped in seconds. |
| Over a limit | A 429 with Resend's own error name, daily_quota_exceeded or rate_limit_exceeded, and a retry-after header. Do not retry in a loop. |
| Refused | Attachments, scheduled sending, templates and batch sending, each with a sentence saying so. |
| Paused automatically | At least 3 addresses bouncing that are 20% or more of the last day's mail, or 2 spam reports in a week. |
06Before you commit
Here's where it stops.
A platform that only tells you what it is good at is one you find the edges of in production. These are email's.
-
Transactional only
A message goes to a person, to at most five addresses. It is not for newsletters, marketing or bulk mail. The daily limits are small on purpose, and an app whose mail draws bounces or spam reports is paused.
-
No attachments, scheduling, templates or batches
These are refused with a sentence saying so. Send each message on its own.
-
Replies do not come back
Nothing receives mail at your app's sending address, so set a reply-to address that does.
-
Your own sending domain is not offered
Mail comes from Antideploy's domain, so there are no DNS records to add and no way to send from your own address.
-
A pause is not lifted from the API
When the platform pauses an app because its mail bounced or drew spam reports, you reply to the notice you were emailed. Removing email and asking again does not get round it.
07Questions
Email questions, answered.
Anything else? Write to us and a person answers.
support@antideploy.comDo I need a Resend account?
No. Your app sends through Antideploy's relay, which speaks Resend's API. Use the resend package as you would with any account.
Do I need to verify a domain or add DNS records?
No. Mail leaves from Antideploy's own sending domain, so there is nothing to add to your DNS.
What address does the mail come from?
Your application's own address under Antideploy's sending domain, for example verdant@mail.antideploy.com, with your application's name as the display name. The from in your code is not used.
Can people reply to my emails?
Not to the sending address, because nothing receives mail there. Set reply_to (replyTo in Node) to an address that does.
How many emails can I send?
By plan, per application, in any 24 hours: 20 addresses on Free, 100 on Go, 500 on Pro and 2,000 on Scale. An account under 7 days old can send to 10 a day whatever it pays. A message goes to at most 5 addresses, and one application can send 10 messages a minute.
What happens when I go over a limit?
The answer is a 429 with Resend's own error name, daily_quota_exceeded or rate_limit_exceeded, and a retry-after header. Show a person a message to try later, and do not retry in a loop.
Can I send newsletters or marketing email?
No. It is transactional mail for your app's own users: a welcome, a reset, a receipt, a contact form. It is never for bulk mail.
Can I send attachments or schedule an email?
Not today. Attachments, scheduled sending, templates and batch sending are refused with a sentence saying so, so send each message on its own.
Why was my app's email paused?
Because its mail bounced or drew spam reports: at least 3 addresses bouncing that are a fifth or more of the last day's mail, or 2 spam reports in a week. You are emailed, and you reply to that notice. You can also pause and resume email yourself at any time.
Can I send from my own domain?
Not today. Sending from your own domain would need your DNS records, so it is not offered.
Does Antideploy keep my emails?
No subject, body or address is kept. What is kept is how many addresses a message went to, whether it was accepted, and what Resend reported about its delivery.
Which plans include it?
Every plan. There is nothing to provision, so it does not use a database or a bucket from your allowance.
+The rest of the platform
Everything else your app can use.
Every service is created by your coding agent, wired into your app, and included in the plans. See the whole platform.
- Hosting
- Static sites
- Deployments
- Database
- Authentication
- File storage
- AI models
- Cron jobs
- Custom domains
- Environment variables
- Logs and monitoring
- Security checks
- Console
- Agent API
Facts on this page were checked against the live platform on 5 October 2026.
Let your app send email. In one sentence.
Paste the sentence into your agent. It switches email on, writes the variables into your project and sends the first message against the real thing.