Mandrill / Mailchimp Bridge
Drop-in replacement for the Mandrill (Mailchimp Transactional) API — keep the key-in-body convention and your existing request structure, swap in your wemail API key.
The Mandrill bridge lets you migrate from Mandrill (Mailchimp Transactional) to wemail without changing your integration code. Point your base URL to https://api.wemail.io/bridge/mandrill, put your wemail API key in the same key field of each request body, and keep the same request and response shapes — sends, template sends, message search, and reject listings all work the same way.
Authentication
Exactly like Mandrill, every endpoint is a POST with the API key in the JSON body's key field. Use your wemail API key (afn_live_… or afn_test_…) where your Mandrill key (md-…) used to be. Test-environment keys route through the sandbox: messages are accepted, simulated, and never delivered.
{ "key": "afn_live_YOUR_WEMAIL_KEY", "message": { … } }Supported Endpoints
POST /bridge/mandrill/api/1.0/messages/send.json
Send a message.
POST /bridge/mandrill/api/1.0/messages/send-template.json
Send using a stored template.
POST /bridge/mandrill/api/1.0/messages/search.json
Search sent messages.
POST /bridge/mandrill/api/1.0/messages/info.json
Get a single message's details.
POST /bridge/mandrill/api/1.0/rejects/list.json
List the rejection (suppression) list.
POST /bridge/mandrill/api/1.0/users/ping.json
Health check — returns "PONG!".
POST /bridge/mandrill/api/1.0/users/info.json
Account info + sending stats envelope.
Field-Level Compatibility
POST /messages/send.json — message fields
| Parameter | Type | Required | Description |
|---|---|---|---|
from_email / from_name | string | Required | Sender — must use a domain verified in your wemail workspace. |
to | array | Required | [{ email, name?, type?: "to"|"cc"|"bcc" }] recipients. |
subject | string | Required | Message subject. |
html / text | string | Optional | Body parts — at least one is required. |
headers | object | Optional | Custom SMTP headers. |
tags | array | Optional | Up to 10 tags, echoed on events and webhooks. |
metadata | object | Optional | Custom metadata, echoed on webhooks. |
global_merge_vars / merge_vars | array | Optional | Merge variables, substituted like Mandrill merge tags. |
track_opens / track_clicks | boolean | Optional | Tracking controls, mapped to wemail tracking. |
send_at | string | Optional | Scheduled delivery (via the top-level send_at field). |
Response
A successful send returns 200 with the Mandrill array — one entry per recipient: [{ _id, email, status: "sent", reject_reason: null }]. Errors return the Mandrill error object { status: "error", code, name, message } (ValidationError, InvalidKeyError, …).
POST /rejects/list.json
Returns the Mandrill rejects array: [{ email, reason, detail, created_at, last_event_at, expires_at, expired, subaccount }] with wemail suppressions mapped to Mandrill reasons (hard-bounce, spam, unsub).
Webhooks
When the Mandrill bridge is active, webhook deliveries are formatted exactly like Mandrill webhooks: an application/x-www-form-urlencoded POST with the event batch JSON in the mandrill_events field, signed with the X-Mandrill-Signature header (base64 HMAC-SHA1 over the webhook URL + sorted POST params, Mandrill's exact scheme). Event names use Mandrill vocabulary (send, hard_bounce, soft_bounce, open, click, spam, unsub, reject).
Known Deviations from Mandrill API
| Parameter | Type | Required | Description |
|---|---|---|---|
template_name | behavior | Optional | Mandrill template slugs are not resolvable; use the wemail tpl_… id of the migrated template in template_name. |
subaccounts / ip_pool | behavior | Optional | Accepted and ignored — use wemail workspaces and IP pools instead. |
attachments / images | unsupported | Optional | Not yet supported through the bridge; use the native wemail /v3/send for attachments. |
async / batch splitting | behavior | Optional | The async flag is accepted and ignored — wemail always queues asynchronously. |
Code examples
curl -X POST https://api.wemail.io/bridge/mandrill/api/1.0/messages/send.json \
-H "Content-Type: application/json" \
-d '{
"key": "afn_live_YOUR_KEY",
"message": {
"from_email": "sender@yourdomain.com",
"to": [{ "email": "user@example.com" }],
"subject": "Hello from the Mandrill bridge",
"html": "<p>It works — zero code changes.</p>"
}
}'// Mailchimp Transactional SDK — point the client at the wemail bridge
const mailchimp = require('@mailchimp/mailchimp_transactional')('afn_live_YOUR_KEY');
mailchimp.setDefaultOutputFormat('json');
// The official SDK pins mandrillapp.com; for the bridge use plain fetch:
const res = await fetch('https://api.wemail.io/bridge/mandrill/api/1.0/messages/send.json', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({
key: 'afn_live_YOUR_KEY',
message: {
from_email: 'sender@yourdomain.com',
to: [{ email: 'user@example.com' }],
subject: 'Hello from the Mandrill bridge',
html: '<p>It works — zero code changes.</p>',
},
}),
});
console.log(await res.json()); // [{ _id, email, status: 'sent', … }]import requests
resp = requests.post(
"https://api.wemail.io/bridge/mandrill/api/1.0/messages/send.json",
json={
"key": "afn_live_YOUR_KEY",
"message": {
"from_email": "sender@yourdomain.com",
"to": [{"email": "user@example.com"}],
"subject": "Hello from the Mandrill bridge",
"html": "<p>It works — zero code changes.</p>",
},
},
)
print(resp.status_code, resp.json()) # 200 [{'_id': 'msg_…', 'status': 'sent', ...}]