Resend compatibility
3AVA Mail’s transactional API is wire-compatible with Resend’s. If you’re already using the Resend SDK or have built around https://api.resend.com, you can switch with a one-line baseUrl override.
Drop-in SDK example
Section titled “Drop-in SDK example”import { Resend } from "resend";
// Point the SDK at 3AVA Mail.const resend = new Resend(process.env.AMDY_API_KEY, { baseUrl: "https://mail.3ava.com/api",});
await resend.emails.send({ subject: "Order confirmed", html: "<p>Thanks for your order.</p>",});import resend
resend.api_key = "am_YOUR_KEY"resend.api_url = "https://mail.3ava.com/api" # override
resend.Emails.send({ "subject": "Order confirmed", "html": "<p>Thanks for your order.</p>",})That’s the only change. Everything else — request shape, response shape, attachment encoding, headers — matches.
Endpoint mapping
Section titled “Endpoint mapping”| Resend | 3AVA Mail | Notes |
|---|---|---|
POST /emails | POST /emails | Identical request body. |
POST /emails/batch | POST /emails/batch | Up to 100 per request. |
GET /emails/:id | GET /emails/:id | Returns the same fields plus bounce_type, bounce_detail. |
POST /domains | POST /domains | Returns DKIM/SPF/DMARC DNS records to add. |
GET /domains | GET /domains | |
POST /domains/:id/verify | POST /domains/:id/verify | |
POST /api-keys | POST /api-keys | Permission enum: full_access | sending_access (Resend uses full_access | sending_access — same names). |
GET /api-keys | GET /api-keys | |
DELETE /api-keys/:id | DELETE /api-keys/:id | |
POST /audiences | POST /lists | Different name, same idea. |
POST /broadcasts | POST /campaigns | Different name, richer fields (rate caps, send windows, AI preview). |
POST /webhooks | POST /webhooks | Same shape; 3AVA Mail uses whsec_ prefix on signing secrets, like Resend. |
Webhook event names
Section titled “Webhook event names”Identical where they overlap:
| Event | Resend | 3AVA Mail |
|---|---|---|
| Email sent | email.sent | email.sent |
| Email delivered | email.delivered | email.delivered |
| Email bounced | email.bounced | email.bounced |
| Email complained | email.complained | email.complained |
| Email opened | email.opened | email.opened |
| Email clicked | email.clicked | email.clicked |
| — | (none) | campaign.sent |
| — | (none) | campaign.delivered |
3AVA Mail adds campaign.* events on top of the Resend set.
Differences worth knowing
Section titled “Differences worth knowing”- Base URL:
https://mail.3ava.com/apivshttps://api.resend.com. - Key prefix:
am_vsre_. - No idempotency-key SLA: 3AVA Mail honors
Idempotency-Keyfor 24h (Resend honors it for 24h too — same window). - No Apple Mail Privacy Protection filtering on opens — open rates will read higher; clicks are the real engagement signal.
- No
delivery_delayedevent: 3AVA Mail retries internally for 72h before marking as bounced; we don’t surface intermediate retry attempts. - Marketing: campaigns are first-class with built-in IP rotation, AI subject preview, warmup respect, and a
daily_cap/per_minute_capper campaign. Resend’s broadcasts are simpler.
Migrating from Resend
Section titled “Migrating from Resend”The cheapest path:
- Set
RESEND_API_URL=https://mail.3ava.com/apiandRESEND_API_KEY=am_...in your environment. - Re-verify your sending domain in 3AVA Mail (DNS records will be different — SPF, DKIM selector, DMARC).
- Send a test email and confirm it arrives.
- Re-register your webhooks with the new URL.
- Cut traffic over.
Existing data (sent emails, audiences) doesn’t migrate automatically. Suppression lists are re-built from incoming bounce/complaint signal once you start sending.