Before you start, sign in at app.sendmux.ai and create or join a team. Every step below happens inside that team.
What you’ll build
By the end of this guide you’ll have:- A verified custom sending domain with the four DNS records (TXT, SPF, DMARC, DKIM) AWS SES requires.
- A live mailbox on that domain with bearer-token credentials.
- A webhook subscription that receives signed delivery events.
- A test email sent and confirmed in delivery logs.
Verify your sending domain
Add the domain you want to send from and publish the DNS records Sendmux generates for you.In the dashboard: open Mailbox domains and click Add domain. Enter your domain (for example,
mail.acme.com) and Sendmux returns the records you need to publish at your DNS provider:- One TXT record proving ownership.
- One SPF record authorising Sendmux to send.
- One DMARC record setting your alignment policy.
- Three DKIM CNAME records issued by AWS SES.
pending to verified.Or via the API: see the Domain management guide for the equivalent POST /api/v1/domains + POST /api/v1/domains/{id}/verify flow.Create a mailbox
A mailbox is a single sending address bound to a verified domain (or to the shared
@myagent.mx namespace). Each mailbox gets its own credentials and can have its own delivery rules.In the dashboard: open Mailboxes and click Create mailbox. Pick the verified domain from step 1, choose a local part (for example, notifications), and click Create.The dashboard shows two one-shot secrets that cannot be retrieved later — copy them now:- An API key (
smx_mbx_...) for the HTTP and SMTP APIs. - An app password plus IMAP/SMTP host details for any client that speaks IMAP or SMTP.
Send your first email
Use the API key from step 2 to send a test message. Replace A successful send returns
your_key_here and the email addresses with your own values.201 Created with an eml_* message id you can search in your delivery logs. See the HTTP sending guide for batch sends, attachments, and idempotency.Subscribe a webhook
Webhooks let your application react to delivery events (delivered, bounced, complained) and inbound mail in real time.In the dashboard: open Webhooks and click Add webhook. Provide:
- The URL that will receive events (must be HTTPS).
- The event types you want — start with
ses.bounceandses.complaintto learn about deliverability problems.
whsec_...) once. Copy it into your application’s secret store immediately — you cannot retrieve it again. If you lose it, rotate the secret from the webhook detail page.Sendmux signs every payload with HMAC-SHA256 over the request body, sent in the X-Sendmux-Signature header. Always verify the signature before trusting the payload.See Webhooks setup for the full event-type catalogue and retry behaviour, and Verify signatures for ready-to-paste verification code.Verify everything works end-to-end
Send another test message — this time to a known good inbox so you can check both delivery and the corresponding webhook.
- Send via the API as in step 3.
- Confirm the message arrived in the recipient inbox (check spam folder if needed; deliverability improves as your domain reputation builds).
- Open Logs in the dashboard — your
eml_*id should appear within seconds withstatus: delivered. - Check your webhook receiver — for a successful delivery, no
ses.bounceorses.complaintevent fires. To exercise the webhook path immediately, send a second message tobounce@simulator.amazonses.com; you’ll receive ases.bounceevent within about 30 seconds.
The bounce simulator address is provided by Amazon SES specifically for testing — it returns a hard bounce without affecting your sender reputation.
Where to next
Domain management
Add more domains, rotate DNS records, and manage verification state.
Sending API reference
Full reference for single sends, batch sends, attachments, and idempotency.
Webhooks
Subscribe to event types, handle retries, and rotate signing secrets.
Verify signatures
HMAC verification snippets for Node.js, Python, Go, and Ruby.
Need help?
Email contact@sendmux.ai with yourrequest_id from the response (every API response carries one in the meta.request_id field and the X-Request-Id header).