Most email APIs tell you your message was queued. Truncus tells you whether the receiving server accepted it — in the same call.
curl https://truncus.co/api/v1/emails/send_sync ...
{
"message_id": "cmvxr6q4q000120ajvvjpxhq8",
"global_message_id": "gm_8b96f356-f7e9-472e-bbe4-88a9be1651b5",
"status": "delivered",
"delivered_at": "2026-11-01T11:35:11.909Z",
"smtp_response": "250 2.0.0 Ok: queued as 4jHXnV4rtkz9vNPx",
"latency_ms": 2080
}smtp_response is the receiving server's reply as reported by the provider; null when the provider sent none. latency_ms is time waiting for that confirmation.
{
"status": "duplicate",
"message_id": "cmvxr6q4q000120ajvvjpxhq8",
"email_status": "delivered",
"created_at": "2026-11-01T11:35:09.771Z"
}What other APIs return
{"id":"..."}(docs)201 {"id":"...","object":"email"}(docs){"id":"...","message":"Queued. Thank you."}(docs)202 {"message_id":"...","status":"pending"}(docs)Built for software that can’t afford to guess.
“Delivered” means the receiving mail server accepted the message — not inbox placement. Nobody can honestly promise the inbox. We tell you what actually happened.
Idempotency-Key is mandatory on every send — architecture, not a best-practices footnote. Replay a call, get the original message id back as duplicate. Try it twice and watch.
send_sync returns terminal delivery status in the response body. No endpoint to host, no polling loop to write. Takes longer than 25 seconds? You get an explicit pending and an id to poll — never silence.
claude mcp add truncus --env TRUNCUS_API_KEY=tr_live_xxx -- npx -y @vanmoose/mcp-server — send, validate, events, stats, domains, suppression. Idempotency keys injected automatically.
OpenAPI 3.1. llms.txt, current. Stable machine codes on every error — DOMAIN_TYPE_MISMATCH, MONTHLY_LIMIT_EXCEEDED, granular provider_code on failures. Your agent branches on codes, not prose.
Public. No auth. No account. Never cached — no-store on every response. Rate-limited at 600 requests/minute per IP, so monitoring never trips it. Point yours at /api/status before you even have an account.
→ Verify it yourself. Replay the duplicate key. Fetch the status JSON. Every claim on this page has a curl.
Truncus halts a domain at 2.0% bounce or 0.07% complaint — tighter than the thresholds that get SES accounts suspended. Nobody’s bad list burns the pool. Including yours.
Total provider failure on the async path lands in a durable queue — retried at 30s, 2m, 8m, 30m, 2h, then dead-lettered, replayable, watchable. A published schedule, not a promise.
Truncus sends transactional email only. Cold outreach and marketing campaigns are not permitted on customer accounts.
Flagged domains are born held — their first send is blocked before any provider sees it. Fingerprinting, burst detection, auto-pause. Boring infrastructure, on purpose.
Sending runs on AWS SES (Ireland). Scaleway TEM (France) is the second provider; failover works where a domain is authenticated with both.
See if your domain is ready to send email — SPF, DMARC, and MX in seconds.
→ Verify it yourself. The breaker thresholds, the backoff schedule, the 403 — all documented, all reproducible.
Your email content is sent and stored in the EU: SES eu-west-1, Scaleway fr-par, Supabase Frankfurt. Run dig +short TXT mail.truncus.co and see both providers yourself.
What we won’t claim: residency is not sovereignty. US-incorporated providers sit in the path and are CLOUD-Act reachable — our pricing page says so in plain text. If a vendor claims otherwise while running on AWS, ask them to put it in their DPA.
The sub-processor table in ours is complete — including the parts vendors usually omit.
99.5% uptime SLA, in writing, with the honest disclaimer no SLA can offer: inbox placement isn’t guaranteed by anyone.
→ Verify it yourself. Run the dig on mail.truncus.co. Read the DPA. It’s all public.
Scaleway TEM and SES are good providers, and Truncus runs on both. Truncus is the layer above them: one API with a required idempotency key, synchronous delivery confirmation (send_sync), a suppression list, a strict transactional-only policy, and a second provider for domains authenticated with both. You would otherwise build and maintain that yourself, and again for every provider you switch to. It also works out of the box with Claude Code and other agents through MCP. If you don't need any of that, use Scaleway or SES directly.
Truncus sends through AWS SES in Ireland (eu-west-1), with Scaleway TEM in France (fr-par) as a second provider for domains authenticated with both; message data is stored in Frankfurt. Residency is not the same as sovereignty: AWS is a US-incorporated provider. An EU-only route with no US-incorporated processor is in development. If you need it, email us at info@truncus.co; the first requests get it first.
Yes. Our DPA and the current list of sub-processors are at /dpa. Truncus is built for business and professional use; the DPA is part of the Terms.
No. Truncus is for transactional email only: password resets, confirmations, receipts, alerts, and other messages your users expect because of something they did. Sends declared as outreach are rejected with OUTREACH_NOT_AVAILABLE; bulk or marketing use of the transactional stream breaches the Terms and may lead to suspension.
Your sends via /emails/send are accepted (HTTP 200, status "queued"), kept in a durable retry queue, and retried at increasing intervals for about two and a half hours; after that they are dead-lettered and shown in your dashboard. /emails/send_sync returns status "queued" with a message ID you can poll. Sends with attachments are not retried and return ATTACHMENTS_NOT_RETRIED; send those again yourself. For domains authenticated with both providers, failed sends are also retried through Scaleway TEM in France.
Several run their own network inside the EU, and some are cheaper. If you need a US-free route or the lowest price, use them. Truncus is for when your code needs to know, in the response, what the receiving server said, and when a retried request should not send twice. Most email APIs return an id, "queued" or "pending"; the delivery result comes later, by webhook, if at all.
Built on
Free: 3,000/mo, 1 domain · Pro €19: 50,000, 10 domains · Scale €99: 300,000, up to 999 domains.
Caps enforced in code — the pricing page and the API agree.
USD pricing applies outside the EU
Free tier, no card. Your first delivered is one curl away.