One API. Every provider you're connected to.
Integrate Mailers.io once and send across Amazon SES, Mailgun, SendGrid, Resend, SMTP, or any provider in your stack. The router picks the right provider, applies your quotas, and hands your code a predictable response every time.
- JSON over HTTPS
- RESTJSON over HTTPS
- Typical API p95
- < 50msTypical API p95
- Messages per bulk send
- 1,000Messages per bulk send
- Safe retries by default
- IdempotentSafe retries by default
An API designed for teams that outgrow single-provider setups.
Most email APIs wrap one provider. Mailers.io wraps your whole stack — and keeps the developer surface boring in the best way: stable, normalized, and safe to retry.
One contract, every provider
POST /v1/send is the same call whether the router chooses SES, Mailgun, SendGrid, or your SMTP relay. No provider-specific branches in your code, ever.
Idempotent by design
Use an idempotency key on any send. Retries — from your workers, your queues, or the network — never duplicate mail. The API knows the difference between a retry and a fresh send.
Normalized events
Deliveries, bounces, complaints, opens, clicks, unsubscribes — all providers are mapped to one event shape. Webhook consumers stay simple as your provider mix changes.
Dashboard = API
Every action available in the UI is available via the API. Campaigns, lists, templates, automations, subscribers, suppression, analytics — all first-class endpoints.
Scoped API keys
Issue keys per service, environment, or workspace. Scope them to specific domains or actions. Rotate without downtime. Track usage per key in audit logs.
Stable, predictable responses
Documented error codes. Consistent pagination. Real status codes (not 200 OK with an error body). Provider quirks stay behind the interface — not in your exception handlers.
Drop it into your existing codebase in minutes.
Official SDKs for Node.js, Python, Go, PHP, and Ruby. A clean REST surface for everything else. Idempotency keys are first-class so retries never duplicate mail.
- AuthBearer token · scoped keys
- RetriesIdempotency-Key header
- BulkUp to 1,000 messages per request
- ErrorsDocumented codes, real HTTP status
- WebhooksSigned, replay-safe, normalized schema
curl -X POST https://api.mailers.io/v1/send \
-H "Authorization: Bearer $MAILERS_API_KEY" \
-H "Idempotency-Key: $(uuidgen)" \
-H "Content-Type: application/json" \
-d '{
"from": "[email protected]",
"to": "[email protected]",
"subject": "Welcome to Acme",
"html": "<p>Thanks for joining.</p>",
"tags": ["onboarding"],
"routing": { "purpose": "transactional" }
}'p95
38ms
regions
3 pops
uptime
99.95%
What happens between POST and delivery.
A single call to /v1/send triggers a short, deterministic pipeline. Nothing hidden, nothing magical.
Step 01
Authenticate
Bearer token + scope check. Requests from unknown keys or unauthorized scopes are rejected before any work.
Step 02
Validate & resolve
Normalize payload, resolve sender, attach workspace context, apply idempotency if key is present.
Step 03
Route
Evaluate quota-aware routing rules, pick an eligible provider, apply priority and domain scoping.
Step 04
Suppress
Check global, domain, workspace, and list-level suppression. Blocked recipients never leave the boundary.
Step 05
Dispatch & track
Send via the chosen provider. Record events. Emit normalized webhooks as delivery milestones land.
The entire pipeline runs in a single request. Typical p95 for the API call is < 50ms — provider dispatch happens in the background and flows back to you through webhook events.
Everything the dashboard does, also through the API.
Eight resource families. Consistent shapes. No hidden dashboard-only features. If you can click it, you can script it.
- POST
/v1/send
Send a single email through the router.
- POST
/v1/send/bulk
Bulk send up to 1,000 messages per request.
- GET
/v1/messages/:id
Fetch status and event history for one message.
- POST
/v1/campaigns
Create or schedule a campaign.
- GET
/v1/campaigns
List campaigns with pagination and status filters.
- POST
/v1/campaigns/:id/launch
Launch or queue a scheduled campaign.
- GET
/v1/campaigns/:id/report
Read the normalized campaign report.
- POST
/v1/automations
Create an event, time, or condition-based automation.
- POST
/v1/automations/:id/trigger
Trigger an automation for a specific subscriber.
- GET
/v1/automations/:id/runs
Inspect automation runs and outcomes.
- GET
/v1/templates
List templates with filters and pagination.
- POST
/v1/templates
Create or update a reusable template.
- POST
/v1/templates/:id/render
Render a template with variables for preview.
- GET
/v1/lists
List mail lists and segments.
- POST
/v1/lists/:id/subscribers
Add, update, or bulk import subscribers.
- DELETE
/v1/lists/:id/subscribers/:sid
Remove or unsubscribe a subscriber.
- POST
/v1/suppressions
Push unsubscribes, bounces, or complaints.
- GET
/v1/suppressions
Query global and scoped suppression records.
- GET
/v1/audit-logs
Read signed audit log entries.
- GET
/v1/analytics/events
Query raw message events with filters and time windows.
- GET
/v1/analytics/summary
Aggregated deliverability and engagement metrics.
- GET
/v1/webhooks
Manage webhook endpoints and signing secrets.
- GET
/v1/sending-servers
List connected providers and SMTP servers.
- POST
/v1/sending-domains
Register and verify a sending domain.
- POST
/v1/routing/rules
Manage quota-aware routing rules.
Full schema, error codes, and pagination rules live in the API reference. Every endpoint is versioned and documented.
Keys that behave like infrastructure credentials.
Mailers.io treats API keys the way you already treat cloud credentials — scoped, rotatable, auditable, and isolated per workload. No global master keys sprayed across services.
Per-service keys
Issue a key for each service, environment, or workspace. Your staging worker never shares credentials with production.
Granular scopes
Restrict a key to specific actions, domains, or resources — send-only, read-only analytics, list management, and more.
Rotate without downtime
Generate a new key, deploy, then revoke the old one. Multiple active keys per workspace keep rotations safe.
Audit every call
Every authenticated request is logged. Filter by key, user, or workspace. Export to SIEM or read via the audit-logs API.
API keys · acme-workspace
4 active- active
prod-api-worker
send · read:messages
- active
prod-analytics-readonly
read:analytics · read:events
- active
staging-integration
send · read:messages · write:lists
- rotating
legacy-worker
send
Keys are revealed once at creation time, stored hashed, and displayed as prefixes only afterwards — same posture as modern cloud credentials.
One event schema, every provider.
Mailers.io normalizes delivery and engagement events across every connected provider. Your webhook consumers speak one shape — whether the send routed through SES, Mailgun, SendGrid, or your own SMTP relay.
- •message.accepted
- •message.delivered
- •message.opened
- •message.clicked
- •message.bounced
- •message.complained
- •subscriber.unsubscribed
- •automation.triggered
signing
HMAC-SHA256
delivery
Retries + DLQ
order
Per-message
{
"id": "evt_01HM...",
"type": "message.delivered",
"created_at": "2026-04-19T10:24:11Z",
"workspace": "acme",
"message": {
"id": "msg_01HM...",
"provider": "amazon-ses",
"from": "[email protected]",
"to": "[email protected]",
"tags": ["onboarding"]
},
"signature": "t=1713516251,v1=..."
}Failed deliveries are retried with exponential backoff and pushed to a replay queue you can re-trigger from the dashboard or API. No events lost to your downtime.
Engineering-honest answers about the developer surface
What to expect when you plug Mailers.io into real production systems.
One integration. A provider stack you can actually evolve.
Ship faster with a single contract. Rotate providers without redeploying. Keep your sending architecture flexible — not locked to whichever provider you picked on day one.
- Free to start
- REST · JSON · signed webhooks
- SDKs for Node, Python, Go, PHP, Ruby