Email as an API
One message.
One person.
One call.
An agent can write a good email. What it cannot do is make it arrive. Mailroom gives it a From address that actually delivers — priced per message, in Ounie credits or keyless USDC.
And it refuses. A recipient who opted out, a subject line with a header injection in it, a caller who has already sent that person five messages today — all turned away before a price is even quoted.
No subscription2 Ounie credits per message · pay in credits or USDC
What one call sends
Everything a message needs to be taken seriously.
Deliverability is not one feature. It is a stack of unglamorous things that all have to be right at once, and none of which an agent can assemble on its own.
One recipient
to is a single address. Not a list, not an array, not a segment — one person, one message, one call, one price.
From a domain that delivers
A verified Ounie sending domain with DKIM, SPF and DMARC aligned, and production sending access behind it. Your from_name rides on the display name.
A reply path you actually read
reply_to is required. Mailroom sends and does not receive, so a message with nowhere to reply is a dead end for the person who got it.
A working unsubscribe
RFC 8058 List-Unsubscribe and List-Unsubscribe-Post on every message. One click and that address is refused on every future send, from every key.
Text, HTML, or both
Nothing is injected into your body and no link is rewritten. There is no open tracking and no click tracking. What you send is what arrives.
A message id, synchronously
The provider's acceptance comes back on the same request, and lands in a send log you can re-read for free. The body is never stored.
Why there is no bulk verb
The refusals are the product.
An email API that any agent with a wallet can call is only defensible if it says no early, cheaply and often. So the limits are not a fair-use policy buried in the terms — they are the first four things that happen to your request, before a price exists.
Recipient lists, bulk sends, campaigns, sequences
`to` is a single address and there is no bulk verb. This is deliberate and permanent: an agent-callable bulk sender is a spam cannon. Ounie's campaign product is Sequences, which requires an account and a human.
Inboxes, receiving, reading replies
Mailroom sends. It does not receive. There is no address to provision, no message to poll, and no webhook for inbound mail — set `reply_to` to an address you already read.
Attachments
Not offered in v1 rather than half-offered. A parameter that works for some inputs and silently fails for others is worse than one that is absent.
Open tracking, click tracking, link rewriting
Nothing is injected into your message and no link is rewritten. What you send is what arrives.
The ceilings, in numbers
Tripping one returns a refusal with no price and no charge. The per-recipient ceiling is the one that carries the keyless rail: a payer is anonymous until they present a payment header, so the limit that protects a person is keyed on the person.
- 5
- per recipient, per day, from anyone
- 30
- per API key, per hour
- 200
- per account, per day
For developers & AI agents
Built to be called by something that isn’t a person.
Three rails, one set of rules. An agent that runs out of credits gets a 402 with the exact shortfall and a link to top up, never a silent debt — and an agent that asks for something we will refuse gets told before it pays, not after.
One POST, one message
Bearer key or the shared Ounie session cookie. Synchronous — the provider's acceptance comes back on the same request, with the message id.
curl -X POST https://mailbox.ounie.com/api/sends \
-H "Authorization: Bearer mbx_live_…" \
-H "Content-Type: application/json" \
-d '{"to":"someone@example.com",
"reply_to":"you@yourdomain.com",
"subject":"Your report is ready",
"text":"Attached below…"}'A tool your agent already knows how to hold
send_email, get_send, list_sends, get_sending_policy, get_credit_balance, get_pricing, whoami. Works in Claude, Cursor, ChatGPT and the Ounie AI Team — that last one can't set headers, so the key rides the URL.
Endpoint https://mailbox.ounie.com/api/mcp (legacy SSE: /api/sse)
Auth Authorization: Bearer mbx_live_…
# Hosts that can't set headers (e.g. the Ounie AI Team):
https://mailbox.ounie.com/api/mcp?api_key=mbx_live_…No account, no key — pay per call in USDC
Keyless agents pay on Base. A suppressed recipient, a tripped ceiling or a malformed message is refused before it is ever quoted, so you never sign a payment for a send that was always going to be refused. Send-only: an inbox needs an account.
curl -X POST https://mailbox.ounie.com/api/x402/send \
-H "Content-Type: application/json" \
-d '{"to":"someone@example.com","reply_to":"you@x.com",
"subject":"hello","text":"hi"}'
# → 402 { accepts: [{ scheme:"exact", network:"base",
# maxAmountRequired:"24000", payTo:"0x…" }] }
curl -X POST https://mailbox.ounie.com/api/x402/send \
-H "X-Payment: <base64 signed payload>" -d '{ … }'2 credits per message on the account rails · $0.024 per message on x402 · reading your own send log is free forever.
Credit math
2 credits a message. Nothing else.
No subscription, no minimum, no per-seat anything. Credits come from the same Ounie wallet every other Ounie app draws on, and a message the provider refuses is refunded in full.
Questions
The awkward ones first.
Can I send to a list?
No, and there is no plan to add it. `to` is a single address; passing an array is refused with a specific error rather than quietly taking the first one. The reason is not technical — it is that an agent-callable bulk sender is a spam cannon, and the reputation it would burn is shared with every other Ounie mail rail. If you want a campaign, Ounie's Sequences product does that, with an account and a person attached to it.
Can I receive email with this?
Not in v1. Mailroom sends. There is no address to provision, no inbox to poll and no webhook for inbound mail. That is why `reply_to` is required on every send: replies have to go somewhere you actually read. We would rather ship no inbox than half of one — a receive endpoint that works on some domains and silently drops mail on others is worse than an absent feature, because you stop checking.
What happens if I mail someone who unsubscribed?
The send is refused before you are quoted a price, and you are charged nothing. Every recipient is checked against Ounie's shared do-not-contact list, which holds unsubscribes, hard bounces and spam complaints from every Ounie mail rail — not just this one. A person who opts out of anything Ounie sends is opted out of all of it.
What are the rate limits?
5 messages per recipient per day (from anyone at all), 30 per API key per hour, 200 per account per day, and a deployment-wide daily cap. Tripping one returns 429 with no price and no charge — an agent is never made to pay to be rate-limited. The per-recipient ceiling is the one that matters most on the keyless rail, where there is no sender identity to limit: a payer is anonymous until they present a payment header, so the ceiling that protects a person has to be keyed on the person.
Do you store what I send?
No. The send log records the recipient, the subject, the size in bytes, when it went and which key sent it — never the body. You already have a copy of your own message; a second one sitting in our database is a liability for both of us and no use to either.
What can get my key revoked?
Recipients marking your mail as spam. 2 complaints within 30 days revokes the key automatically, and the dashboard tells you exactly why rather than leaving you to debug a credential that mysteriously stopped working. This is blunt on purpose: bounce and complaint rate on a shared sending domain is not recoverable per-key, so the cost of one abusive integration lands on everyone else using the app.
Why is it 2 credits when the wire cost is a hundredth of a cent?
Because bandwidth is not the product. 2 credits buys production sending access that took a human review to obtain, a warmed and DKIM-aligned domain, bounce and complaint handling wired into a shared suppression list, RFC 8058 one-click unsubscribe on every message, and the ceilings that keep all of it intact. Anyone can put a byte on the wire. Landing it in an inbox is the thing being sold.
How do I test without emailing a stranger?
Send to success@simulator.amazonses.com. That is the provider's own mailbox simulator: it accepts the message, returns a real message id, reaches no human, and is excluded from bounce and complaint reputation by design. There are matching addresses that simulate a hard bounce and a complaint if you want to exercise those paths. It is a real send, so it is billed like one.
What is in the From address?
A Mailroom address on a verified Ounie sending domain, with your `from_name` as the display name if you set one. You cannot bring your own domain, and that is deliberate: a caller-supplied From is how one tenant ends up spending another's reputation, and an unverified one simply does not deliver.
Can an agent use this without an Ounie account?
Yes, for sending. The x402 endpoint takes USDC on Base with no account and no key. It verifies your signature, sends, and settles only once the message has actually been accepted — an on-chain settlement is final, so a refused send is caught before the money moves rather than refunded after.
Give your agent a From address.
Sign in with the Ounie account you already have, mint a key, and send your first message to success@simulator.amazonses.com — a real send that reaches no human.