# VaEmail as a Brevo alternative for AI agents

Brevo is a marketing platform: email, SMS, WhatsApp, CRM, automation, with a widely used `/v3` API. VaEmail serves that same `/v3` namespace, so an integration already written for Brevo switches by changing the base URL, and adds an `/api/v1` namespace designed for a program that holds the key on its own. Move if an agent operates the key unsupervised and you want scopes, daily caps and an audit line per call. Stay on Brevo if you use the platform beyond email, or if you need its throughput, its batch sends and its fifteen webhook events.

Facts checked against the VaEmail documentation on 6 September 2026. Competitor facts come from their official documentation read the same day; URLs are cited at the end.

## The compatibility layer, and what it actually covers

The OpenAPI 3.1 specification describes two namespaces on the same host. `/api/v1` is the VaEmail API, the one to use for an agent: structured errors, dry run, idempotency, journal. `/v3` is described there as an API compatible with Brevo, identical in path and schema, existing so that a project already written for Brevo switches by changing the base URL. Both authenticate with the same key, in the `api-key` header, or `X-Api-Key`. That is the header name Brevo uses too, so the credential handling does not move either.

Coverage is a subset, and the subset matters more than the label. The specification at `https://app.vaemail.fr/openapi.json` lists 63 paths, 41 of them under `/v3`, and sixteen of those 41 are VaEmail's own prospecting routes (`/v3/outreach/...`), not Brevo paths. What remains maps to transactional send (`POST /v3/smtp/email`), template listing, aggregated statistics, campaigns, contacts, lists and attributes, senders, webhooks, media and account. Anything outside that set has no equivalent: SMS, WhatsApp, CRM objects, automation workflows, and the per-message log Brevo exposes at `GET /v3/smtp/emails`. Inventory the calls your code makes before you point it elsewhere.

Since the Brevo SDKs are generated against those paths, the seven official clients (Node, PHP, Python, Java, C#, Go, Ruby) work against `/v3` by changing the URL. VaEmail also ships a Python SDK (`pip install vaemail`).

## Where Brevo is ahead

- **Scope of the product.** Email, SMS, WhatsApp, CRM, automation, forms. VaEmail does email.
- **Throughput and batching.** Up to 1,000 requests per second on `POST /v3/smtp/email` on the general plan, `messageVersions` with up to 1,000 versions per call, `scheduledAt` up to 72 hours ahead. VaEmail rate limits transactional send at 60 requests per minute on `/api/v1/transactional/send`, and 300 per minute on `/v3/smtp/email`.
- **Webhooks.** Fifteen email events, including `deferred`, `blocked`, `invalid` and proxy opens, plus ten SMS events. VaEmail exposes six: sent, delivered, bounce, complaint, opened, clicked.
- **Inbound.** Inbound parsing on a dedicated subdomain with MX records pointed at Brevo, an `inboundEmailProcessed` webhook, attachments retrieved with a download token.
- **Hosted MCP.** A remote server at `mcp.brevo.com`, 27 modules with one server per module and a dedicated MCP token, plus a second MCP server that serves the documentation. 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).
- **A free tier.** 300 emails a day, then Business marketing from 99 euros a month. VaEmail publishes its prices on https://vaemail.fr/tarifs/.

## Where VaEmail is ahead

- **A key you can hand to a program.** Eight scopes (`email.send`, `email.read_status`, `domain.read`, `domain.write`, `contacts.read`, `contacts.write`, `analytics.read`, `billing.read`), plus `max_emails_per_day`, `max_recipients_per_email` and `allowed_domains`. A call outside its scope returns 403 `INSUFFICIENT_SCOPE`, naming the missing scope and the ones the key holds. A Brevo API key carries no scopes at all: full account access, with an IP allowlist as the only restriction. Scopes exist there for OAuth apps, not for the key your code uses.
- **A dry run that says why.** `POST /api/v1/messages/validate` reports whether the send would go out and lists what blocks it, using the same error codes as a real send, including a recipient sitting on the suppression list. Nothing is sent, nothing is consumed. Brevo's `X-Sib-Sandbox: drop` validates the request format and returns a fake `messageId`.
- **Idempotency in a standard header.** `Idempotency-Key` is remembered for 24 hours and replayed identically, marked `Idempotent-Replay: true`; the same key with a different body is refused with 409 `IDEMPOTENCY_KEY_REUSED`. Brevo takes a UUID in the JSON body at `headers.idempotencyKey`, keeps it 30 minutes, and answers a replay with `duplicate_parameter`.
- **An audit log on every plan.** `GET /api/v1/audit-logs` returns one line per call: which key, which agent, which operation, which parameters, which result, how many emails were engaged. Message bodies, attachments and merge variables never appear. Brevo's `GET /v3/organization/activities` is Enterprise only and returns one month per request.
- **Deliverability diagnosed 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. No dedicated equivalent was found in Brevo's documentation.
- **Errors an agent can branch on.** Every failure carries a stable `code`, a `retryable` flag, `resolution.action` and a documentation link.

## What changes in the calling code

| Brevo | VaEmail |
| --- | --- |
| `https://api.brevo.com/v3`, header `api-key` | `https://app.vaemail.fr/v3`, same paths, same schema, same header |
| `POST /v3/smtp/email` | same path, kept for existing code. New code: `POST /api/v1/transactional/send`, which returns 202 and structured errors |
| `headers.idempotencyKey` in the body, 30 minutes | `Idempotency-Key` header, 24 hours, 409 if the body changed. The specification marks idempotency support on `/api/v1/transactional/send`, `/api/v1/campaigns/send` and `/api/v1/domains`, not on `/v3/smtp/email` |
| `X-Sib-Sandbox: drop` | `POST /api/v1/messages/validate` |
| `GET /v3/smtp/emails` for per-message status | `GET /api/v1/messages/{id}`, 7 states plus the event list |
| 15 webhook events | 6 events, registered on `/v3/webhooks` |
| no per-key scope or cap | scopes, daily cap, recipients per message, allowed sender domains |

`POST /v3/emailCampaigns/{id}/sendNow` exists on both sides and is irreversible. On VaEmail it requires an explicit confirmation in the request body, and the specification flags it `x-vaemail-destructive: true`. That guard was added after a call with no body sent 2,982 emails on a Saturday evening.

## 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` and `email.read_status`, with `max_emails_per_day`, `max_recipients_per_email: 1` and a single sender domain in `allowed_domains`.

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

Re-authenticate the sending domain. The records come back ready to publish, but publishing them 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
```

The fastest switch is the base URL alone. It keeps your Brevo client, and it also keeps Brevo's semantics: no structured error block, no idempotency guarantee on that route.

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

For code you are willing to touch, move the send to `/api/v1`: dry run, send with an idempotency key derived from the business action, then read the status before reporting anything.

```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","html":"<p>Hello</p>"}'

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" \
  -d '{"to":"client@example.com","subject":"Your invoice","html":"<p>Hello</p>"}'

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

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

## When not to switch

- **You use Brevo as a platform.** SMS, WhatsApp, CRM, automation workflows and forms have no counterpart.
- **Your agent needs an inbox.** VaEmail creates no address on demand; `/v3/outreach/inbox` only collects replies to prospecting sequences on a declared IMAP mailbox. Brevo's inbound parsing needs a subdomain configured once, which is closer but still not an inbox created per agent.
- **You send in bulk or ahead of time.** No `messageVersions` equivalent, no scheduled transactional send.
- **You consume webhook events outside the six supported ones**, or you want a remote MCP server with its own token.
- **You need published pricing** or a free tier before writing code.

Two more limits worth naming: the VaEmail documentation is partly in French, and the product is young, run by an agency rather than a funded company.

## Copy this to your agent

```
Migrate this project's outbound email from Brevo 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.
- First, list every Brevo endpoint this project calls. The /v3 layer covers transactional
  send, templates, aggregated statistics, campaigns, contacts, lists, senders, webhooks,
  media and account. Report anything outside that set instead of substituting something.
- Fastest path: keep the Brevo client and change the base URL to
  https://app.vaemail.fr/v3, header api-key unchanged.
- For code we can change, use POST /api/v1/transactional/send: one recipient per call,
  header api-key, Idempotency-Key derived from the business action.
- Before any real send, call POST /api/v1/messages/validate and stop if "sendable" is false.
- 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.
- POST /v3/emailCampaigns/{id}/sendNow is irreversible. Ask me in plain words, with the
  list size, before calling it.

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` and can be called without a prompt; sending is not annotated that way.

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

## Links

- Full comparison, with the official Brevo URLs behind every claim: https://vaemail.fr/compare/vaemail-vs-brevo.md
- All five providers side by side: https://vaemail.fr/compare/index.md
- Agent page: https://vaemail.fr/agents · Quickstart: https://vaemail.fr/docs/quickstart.md
- API reference: https://vaemail.fr/docs/api.md · Error codes: https://vaemail.fr/docs/errors.md
- Scopes, caps, audit log: https://vaemail.fr/docs/security.md · Deliverability: https://vaemail.fr/docs/deliverability.md
- MCP server and CLI: https://vaemail.fr/docs/mcp.md · Source: https://github.com/vaemail/vaemail-mcp
- 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/resend-alternative-for-ai-agents
