# Transactional email, with no domain to verify.

URL: https://antideploy.com/platform/email

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.

## At a glance

- **The Resend package**: Node and Python, written exactly as for any Resend account
- **No account, no DNS**: Mail leaves from Antideploy's own sending domain
- **Delivery tracking**: Delivered, bounced and marked as spam, per app
- **Protects its own reputation**: An app whose mail bounces or draws spam reports is paused

## 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_KEY` you set yourself always wins

[See what your agent reads](https://antideploy.com/agent.md)

**Your agent runs**

```bash
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
```

Related: `POST /api/v1/email`, `GET /api/v1/email/env`, `GET /api/v1/email`

### 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

[The Resend docs](https://resend.com/docs/send-with-nodejs)

**In your code**

```
// 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

[See the Agent API](https://antideploy.com/platform/agent-api)

**Your agent runs**

```bash
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"
```

Related: `overview`, `activity`, `deliverability`, `domain`, `test`, `pause`, `resume`

## 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.

## 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.

## 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. |

## 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. |

## 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.

## Email questions, answered.

Anything else? Write to us and a person answers.

[support@antideploy.com](mailto:support@antideploy.com)

### Do 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.

## 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](https://antideploy.com/platform).

- [Hosting](https://antideploy.com/platform/hosting)
- [Static sites](https://antideploy.com/platform/static-sites)
- [Deployments](https://antideploy.com/platform/deployments)
- [Database](https://antideploy.com/platform/database)
- [Authentication](https://antideploy.com/platform/authentication)
- [File storage](https://antideploy.com/platform/file-storage)
- [AI models](https://antideploy.com/platform/ai-models)
- [Cron jobs](https://antideploy.com/platform/cron-jobs)
- [Custom domains](https://antideploy.com/platform/custom-domains)
- [Environment variables](https://antideploy.com/platform/environment-variables)
- [Logs and monitoring](https://antideploy.com/platform/logs-and-monitoring)
- [Security checks](https://antideploy.com/platform/security-checks)
- [Console](https://antideploy.com/platform/console)
- [Agent API](https://antideploy.com/platform/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.

To set this up, give your coding agent this sentence:

```text
Set this project up to deploy on Antideploy. Fetch https://antideploy.com/agent.md and follow it.
```
