Infrastructure key
For operators and platform code. Manages providers, mailboxes, billing, and logs.
Use scoped keys for services, signed webhooks for backend work, and Server-Sent Events when an agent needs a live mailbox stream.
curl -N "https://app.sendmux.ai/api/v1/mailbox/events?event_types=message.received,message.received.spam" \ -H "Authorization: Bearer smx_mbx_your_key_here"
active API keys
webhooks per team
retry window
payload retention
Sendmux keeps the human workspace and the automation surface on one team boundary, so a SaaS product adds email without building tenancy per customer.
Owner, Admin, Developer, Member. Decide what humans can touch, no more.
Sending, mailbox, and infrastructure keys decide what code can do. Rotated without resetting people.
100 active API keys per team. Each key carries only the permissions a single job actually needs — rotate or revoke without resetting the team.
For operators and platform code. Manages providers, mailboxes, billing, and logs.
For workers that send. Scoped to a delivery group, 1,800 req per 60s.
For clients that read. One mailbox, scoped reads, optional settings.
Increase requests appear at 80% of a limit
Webhooks are the backend path for email events. Sendmux signs the exact outbound body and retries non-2xx responses across a 24-hour window.
An unsigned callback makes your worker trust parsed JSON before it can prove where the event actually came from.
Sendmux signs the raw bytes and carries event identity in headers, so trust starts before you parse anything.
# incoming delivery — headers carry identity + seal X-Sendmux-Event-Id: evt_01J1M9C3K8 X-Sendmux-Event-Type: message.delivered X-Sendmux-Signature: sha256=A2F3…d09f # compute hmac over the raw body, not parsed JSON const mac = hmac.sha256(secret, rawBody); const expected = `sha256=${mac}`; # constant-time compare avoids a timing oracle timingSafeEqual(expected, headerSig) → true ✓ trusted · safe to JSON.parse(body)
Use the mailbox stream when an agent can hold a live HTTP connection open. Use signed webhooks when a backend should receive events while clients are offline.
Stream controls
event_types
Selects received and spam events for one stream.
Last-Event-ID
Resumes after a disconnect without a new webhook.
ping
Heartbeat cadence from 10 to 300 seconds.
close_after
Bounded sessions from 30 to 3,600 seconds.
Per thousand emails, or per gigabyte of mailbox storage. No per-seat fees.
1,000 emails
for just $0.15
The headline rate covers outbound through the customer's own providers. Inbound mail you accept lands at the same number.
per 1,000
accepted inbound
per 1,000
managed Amazon SES
per GB / month
mailbox storage
per seat / month
unlimited teammates
These blocks stay inline so agents and crawlers can read the endpoint, header, and parameter names without opening a widget.
curl -N "https://app.sendmux.ai/api/v1/mailbox/events?event_types=message.received,message.received.spam" \ -H "Authorization: Bearer smx_mbx_your_key_here"
// verify X-Sendmux-Signature before parsing the body const body = await req.text(); const mac = crypto.createHmac("sha256", secret).update(body).digest("hex"); const sig = req.headers["x-sendmux-signature"] ?? ""; const expected = `sha256=${mac}`; // constant-time compare avoids a signature timing oracle const ok = expected.length === sig.length && crypto.timingSafeEqual(Buffer.from(expected), Buffer.from(sig));
import requests res = requests.get( "https://app.sendmux.ai/api/v1/billing/usage", headers={"Authorization": "Bearer smx_infrastructure_key_here"}, ) print(res.json())
Common questions