# VaEmail as a Resend alternative for AI agents

Resend is an email API for developers: nine SDKs, a remote MCP server, inbound email, a free tier. VaEmail covers a narrower case, handing an API key to a program that retries: scopes and caps on the key, a dry run that consumes nothing, one audit line per call without message bodies, deliverability diagnosis over the API, servers in Germany. Switch if an agent must hold the key unsupervised, or if the data has to stay in Europe. Stay on Resend if the agent needs to receive mail, if you want an SDK in your language, or if you need published pricing.

Facts checked against the VaEmail documentation on 6 September 2026. Competitor facts come from their official documentation read the same day; URLs are cited on https://vaemail.fr/compare/vaemail-vs-resend.md.

## Where Resend is ahead

- **Ecosystem.** Nine SDKs (Node, Python, PHP, Ruby, Go, Java, Laravel, Rust, .NET), a CLI, five agent skills. VaEmail has a Python SDK (`pip install vaemail`), and Brevo clients work against `/v3`. It does ship a CLI (`npx vaemail`) and an agent skill (`npx skills add vaemail/skills`).
- **Remote MCP.** Resend runs `mcp.resend.com` with OAuth or a Bearer token, plus a local `resend-mcp` over stdio or HTTP; the tool count is not published. VaEmail has two servers: a remote connector at `mcp.vaemail.fr` with OAuth (16 tools) and the local npm package over stdio (18 tools, zero dependencies).
- **Inbound email.** A catch-all `<id>.resend.app` domain or MX on your own domain, an `email.received` webhook, body and attachments readable over the API. VaEmail has no generic equivalent.
- **Webhooks.** Nineteen events, signed through Svix. VaEmail exposes six on `/v3/webhooks`, and signing is not documented.
- **Status granularity.** Twelve states on `GET /emails/{id}`, including `delivery_delayed`, against seven.
- **Throughput and scheduling.** Ten requests per second per team, `POST /emails/batch` (100 per call), `scheduled_at`, `tags`. VaEmail takes a single `tag` string per send, not an array, and has no `scheduled_at` on transactional sends.
- **Free tier.** 3,000 emails a month, 100 a day, then $20 a month for 50,000. VaEmail publishes its prices on https://vaemail.fr/tarifs/.

## Where VaEmail is ahead

- **A dry run that costs nothing.** `POST /api/v1/messages/validate` says whether the send would go out and names what blocks it, with the same codes as a real error. Nothing leaves, nothing is consumed. On Resend, `resend.dev` test addresses simulate a scenario but count against the quota.
- **Keys bounded at creation.** Eight scopes, from `email.send` and `email.read_status` to `domain.write`, `contacts.write` and `billing.read`, plus `max_emails_per_day`, `max_recipients_per_email` and `allowed_domains`. These are opt-in: a key that declares no scope holds all eight and carries no cap, so the key an agent gets has to be created bounded. A call outside its scope returns 403 `INSUFFICIENT_SCOPE`, naming the missing scope and the ones the key holds. Resend offers `full_access` or `sending_access`, optionally restricted to a domain, with quotas per team rather than per key.
- **An audit log that is not a mail archive.** `GET /api/v1/audit-logs` returns one line per call: key, agent, operation, parameters, result, emails engaged. Message bodies, attachments and merge variables never appear. Resend's `GET /logs` is a request log including request and response bodies, so it includes the emails.
- **Deliverability read over the API.** `GET /api/v1/deliverability/diagnose` returns live SPF, DKIM and DMARC verdicts per domain, ranked issues, recommended actions with the endpoint that performs each one, and delivery rates by recipient domain. Resend keeps Deliverability Insights in the dashboard.
- **Data residency.** Servers in Germany, sending in Europe. Resend sends from Virginia, Ireland, São Paulo or Tokyo, and its documentation states that all account data is stored in the United States regardless of region.
- **Structured errors.** Each failure carries a stable `code`, a `retryable` flag, `resolution.action` and a documentation link, so an agent branches on the code, not on a message string.

## What changes in the calling code

No Resend-compatible route exists: the send call is rewritten, not redirected. The `/v3` layer is for Brevo callers.

| Resend | VaEmail |
| --- | --- |
| `POST /emails`, `Authorization: Bearer re_…`, `User-Agent` mandatory | `POST /api/v1/transactional/send`, header `api-key` (`X-Api-Key` too), 202 means accepted |
| `from` required in the body | no `from` in the body: the sender address comes from the account's declared sender (`GET /v3/senders`), the body carries `from_name` and `reply_to` |
| no dry run | `POST /api/v1/messages/validate` |
| `GET /emails/{id}`, 12 states | `GET /api/v1/messages/{id}`, 7 states plus events (delivery, open, click, bounce, complaint) |
| `POST /emails/batch`, 100 per call | no transactional batch: one call per recipient, each with its own `Idempotency-Key`. `POST /api/v1/campaigns/send` is a send to a whole list, not a batch of distinct messages, and a list send needs explicit human validation. |
| `scheduled_at` on a send | not available on transactional sends |
| `Idempotency-Key`, 24 hours | same header and window, replay marked `Idempotent-Replay: true`, 409 `IDEMPOTENCY_KEY_REUSED` if the body changed |
| 10 requests per second per team | 60 requests per minute on transactional send, 10 per minute on campaign send; `POST /v3/smtp/email`: 300 per minute |
| 19 signed webhook events | 6 events on `/v3/webhooks` |

## Migration, in order

Creating the account and the key is a human step: there is no signup endpoint. Ask for a key scoped to `email.send`, `email.read_status`, `domain.read` and `domain.write` (the last two are needed for the domain step; drop `domain.write` once the domain is authenticated), with `max_emails_per_day`, `max_recipients_per_email: 1` and one `allowed_domains` entry.

```bash
export VAEMAIL_API_KEY=swm_your_key
npx vaemail init
```

Authenticate the sending domain again. Publishing the returned records at the registrar is a human step, and a record flagged `publishable: false` still holds a placeholder that would break authentication if posted as is.

```bash
npx vaemail domains:add example.com
npx vaemail domains
```

Then replace the send: dry run, send with an idempotency key derived from the business action, read the status.

```bash
curl -X POST https://app.vaemail.fr/api/v1/messages/validate \
  -H "api-key: $VAEMAIL_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"to":"client@example.com","subject":"Your invoice","html":"<p>Hello</p>"}'

MESSAGE_ID=$(curl -X POST https://app.vaemail.fr/api/v1/transactional/send \
  -H "api-key: $VAEMAIL_API_KEY" \
  -H "Content-Type: application/json" \
  -H "Idempotency-Key: invoice-2412-client@example.com" \
  -d '{"to":"client@example.com","subject":"Your invoice","html":"<p>Hello</p>"}' | jq -r '.data.id')

curl https://app.vaemail.fr/api/v1/messages/$MESSAGE_ID \
  -H "api-key: $VAEMAIL_API_KEY"
```

A 202 with `{"success": true, "data": {"id": 2841, "status": "queued"}}` means accepted, not delivered. Only `delivered` on `GET /api/v1/messages/{id}` licenses that claim. Re-register webhooks on `/v3/webhooks` and check the six events cover what your pipeline consumed.

## When not to switch

- **Your agent needs an inbox.** Verification codes, human replies, anything read back from a mailbox. VaEmail creates no inbox on demand; `/v3/outreach/inbox` only collects replies to prospecting sequences on a declared IMAP mailbox.
- **Batch and scheduled sends.** Neither exists on `/api/v1/transactional/send`.
- **You burst above five requests per second.** `POST /api/v1/transactional/send` is capped at 60 requests per minute, and the Brevo-compatible `POST /v3/smtp/email` at 300 per minute, still below Resend's ten per second.
- **You want a remote MCP server with OAuth**, an SDK in your language, or the signed webhook events.
- **Published pricing before writing code**, or a free tier to prototype on.

Two more limits: the VaEmail documentation is partly in French, and the product is young, run by an agency.

## Copy this to your agent

```
Migrate this project's outbound email from Resend to VaEmail.
Documentation for agents: https://vaemail.fr/llms.txt
OpenAPI specification: https://app.vaemail.fr/openapi.json
What the service supports, no key needed: https://app.vaemail.fr/api/v1/capabilities

Rules:
- The API key is in the environment variable VAEMAIL_API_KEY. Do not ask for it, never
  write it to a versioned file.
- Replace POST /emails with POST /api/v1/transactional/send, header api-key, one
  recipient per call.
- VaEmail has no `from` field: drop it, use `from_name` and `reply_to`, and check the
  declared sender with GET /v3/senders.
- Before any real send, call POST /api/v1/messages/validate and stop if "sendable" is false.
- Put an Idempotency-Key header on every send, derived from the business action.
- A 202 means "accepted", not "delivered": read GET /api/v1/messages/{id} before you
  report a delivery.
- Publishing DNS records, creating an account or paying are human steps: name them, never
  declare them done.
- Report what is not portable: scheduled sends, batch sends, webhook events outside the six
  supported ones.

Start with `npx vaemail init` and tell me what it reports.
```

For an agent that picks its own tools, install the MCP server. Read tools carry `readOnlyHint`; sending does not.

```bash
claude mcp add vaemail --env VAEMAIL_API_KEY=swm_your_key -- npx -y vaemail mcp
npx skills add vaemail/skills
```

## Links

- Full comparison, official Resend URLs behind every claim: https://vaemail.fr/compare/vaemail-vs-resend.md
- All five providers side by side: https://vaemail.fr/compare/index.md
- Agent page: https://vaemail.fr/agents · Start here: https://vaemail.fr/docs/quickstart.md
- API reference: https://vaemail.fr/docs/api.md · Error codes: https://vaemail.fr/docs/errors.md
- MCP server and CLI: https://vaemail.fr/docs/mcp.md · Source: https://github.com/vaemail/vaemail-mcp
- Agent skill: https://github.com/vaemail/skills
- Scopes and caps: https://vaemail.fr/docs/security.md · Deliverability: https://vaemail.fr/docs/deliverability.md
- Everything in one file: https://vaemail.fr/llms-full.txt · Examples: https://github.com/vaemail/examples
- Related: https://vaemail.fr/email-api-for-ai-agents · https://vaemail.fr/mcp-email-server · https://vaemail.fr/ai-agent-email-deliverability · https://vaemail.fr/brevo-alternative-for-ai-agents
