Email for developers — both directions.
One request to send. Four DNS records to verify — DKIM is a single record under your domain, and each row diagnoses itself while you wait. And the part every email API skipped: a real inbox for every domain you connect — support@ that your team and your agents can actually read, answer, and search.
Free for 3,000 emails a month. Plans from $20 with volume included — unlimited brands on every plan.
$ curl -X POST https://api.mycompany.email/v1/emails \
-H "Authorization: Bearer $MYCO_API_KEY" \
-d '{"from":"billing@acme.com", ...}'
{
"status": "accepted",
"brand_id": "brand_d9b63ab8",
"routed_from": "organization"
}
# 1.2s later:
✓ DELIVERY outgoing_ip=54.240.8.43One bad brand shouldn't stop the others
On a shared sending platform, a single client's list hygiene can put the whole account under review. Every brand you run is exposed to every other brand's worst week.
Reputation you rent is reputation you can lose
Shared IP pools mean your deliverability depends on strangers. An account suspension is someone else's decision about your business, delivered without notice.
The right answer has brutal onboarding
Truly isolated sending is the correct architecture — and it normally comes with brutal setup friction: consoles, templates, review essays. That friction is why senders settle for shared pools. We removed the friction instead of the isolation.
Integrate
One request from any language. The From address decides the rest.
Plain REST — no SDK required, nothing to install. No account id, no region, no tenant name in the call: we resolve where your message sends from by its From domain.
curl https://api.mycompany.email/v1/emails \
-H "Authorization: Bearer $MYCO_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"from": "billing@acme-client.com",
"to": "customer@example.com",
"subject": "Your invoice",
"html": "<p>Thanks for your order.</p>"
}'const res = await fetch("https://api.mycompany.email/v1/emails", {
method: "POST",
headers: {
Authorization: `Bearer ${process.env.MYCO_API_KEY}`,
"Content-Type": "application/json",
},
body: JSON.stringify({
from: "billing@acme-client.com",
to: "customer@example.com",
subject: "Your invoice",
html: "<p>Thanks for your order.</p>",
}),
});import os, requests
requests.post(
"https://api.mycompany.email/v1/emails",
headers={"Authorization": "Bearer " + os.environ["MYCO_API_KEY"]},
json={
"from": "billing@acme-client.com",
"to": "customer@example.com",
"subject": "Your invoice",
"html": "<p>Thanks for your order.</p>",
},
){
"id": "msg_456e62e7421e4316",
"provider_message_id": "0100019fa04e0539-7a285e21",
"status": "accepted",
"brand_id": "brand_d9b63ab8c30b4a65",
"environment_id": "env_800556b3b4a8",
"routed_from": "organization"
}routed_from tells you which level of the hierarchy chose the route — domain, brand, or organization default. Most specific wins, and custody is never ambiguous: the response names exactly what carried the send.
The platform
Everything around the send, so you never build it twice.
Most-specific-wins routing
Domain → brand → organization default. You send from an address; we work out which account, which tenant, which configuration set — and tell you which level decided.
DNS on autopilot
Four records per domain — a single DKIM TXT under your own name, MX and SPF for an aligned return path, and DMARC — published for you when we manage the zone, then re-checked until each one verifies.
Guardrails ahead of trouble
We pause a brand at 2% bounce / 0.05% complaint — half of the thresholds that trigger upstream reviews — and tell you exactly which numbers moved. One brand pauses; the rest keep sending.
A request log you can read
Every API call with its status, duration and error code, queryable by API. No reproducing a bug just to find out what you sent.
Full event history per message
Send, delivery, bounce, complaint — with the sending IP, the SMTP diagnostic, and the exact time it happened.
Errors that say what to do
Every failure carries a machine-readable requirement — verify_domain, remove_suppression — not just a sentence to parse.
Reputation isolation
One brand's hard bounce shouldn't be another brand's problem.
Each brand maps to its own isolated sending identity, with its own event stream, suppression list and reputation policy. That is the smallest thing that can be paused without stopping anything else.
We watch bounce and complaint rates per brand and pause at 2% and 0.05%. Upstream reviews trigger at 5% and 0.1% and nobody will tell you how close you are. We act first, on one brand, and tell you which numbers moved.
| Brand | Bounce | Complaint | Status |
|---|---|---|---|
| Northwind | 2.41% | 0.012% | Paused by us |
| Acme Retail | 1.08% | 0.031% | Warning |
| Contoso | 0.21% | 0.004% | Sending |
| Fabrikam | 0.17% | 0.002% | Sending |
How it works
Five steps, and none of them require learning anything but an API key.
Sign up, get a key
No console trip, no CloudFormation, no sandbox essay. You start sending immediately from the labeled warm-up pool — 3,000 a month free, ramped daily caps in the open.
We vend your dedicated account
On any paid plan your sending runs in an environment that carries you alone — your reputation, your quota, your suppression list, structurally separate from every other customer's. No standing credentials to it exist anywhere in the system.
We clear the production review
All fresh sending infrastructure starts sandboxed, and getting out is a human review. That review is our job — typically one to three days, and we show you its status instead of hiding the wait. Your domains flip over the moment it clears.
Brands and domains, provisioned
Each brand gets its own sending identity, event stream and reputation boundary. Each domain gets four records — DKIM is a single record under your own name — published for you when we manage the zone, re-checked until they confirm.
Send
One REST call. We resolve the route from the From domain, check suppression, respect the real send rate, and hand the message off with the right identity attached.
The inbox
Sending APIs stop at "delivered". Yours shouldn't.
Any verified domain can receive. Claim support@ — or a catch-all — and replies land in a real inbox: parsed, sanitized, searchable, isolated per tenant.
An inbox per domain
Mailboxes are one API call. Mail to unclaimed addresses on your domains lands in quarantine, never the void, and the raw message is always kept. Full-text search across everything you have ever received.
Replies meet their sends
When a reply answers something you sent through us, it arrives correlated — opened next to the original send's delivery history, event by event. No bolt-on inbound webhook can assemble that view.
For your team and your agents
Read, archive and search over REST today — replies go out through the same send API — so an AI agent can work a support inbox end to end. The webmail app for humans is in active development, and it is being built like a product, not an afterthought.
Start sending today. Take the keys whenever you want.
3,000 emails a month free, no card. 50,000 a month from $20, inbox included — and the exit is a feature, not a breakup.