The deliverability loop, closed

Email should answer.

Most email APIs tell you your message was queued. Truncus tells you whether the receiving server accepted it — in the same call.

POST /v1/emails/send_sync
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.

Same key, sent twice
{
  "status": "duplicate",
  "message_id": "cmvxr6q4q000120ajvvjpxhq8",
  "email_status": "delivered",
  "created_at": "2026-11-01T11:35:09.771Z"
}

What other APIs return

  • Resend{"id":"..."}(docs)
  • Wesender201 {"id":"...","object":"email"}(docs)
  • Mailgun{"id":"...","message":"Queued. Thank you."}(docs)
  • Lettermint202 {"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.

Built for AI agents. Great for everyone else.

Your agent retries. We don’t double-send.

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.

Wait for the answer — not a webhook.

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.

Eight MCP tools. One command.

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.

Built for LLMs, not dashboards.

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.

A status endpoint with no login.

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.

Reliability you can inspect

Every sending domain gets its own circuit breaker.

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.

Failed sends don’t vanish.

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.

Transactional only.

Truncus sends transactional email only. Cold outreach and marketing campaigns are not permitted on customer accounts.

A clean pool, enforced at the gate.

Flagged domains are born held — their first send is blocked before any provider sees it. Fingerprinting, burst detection, auto-pause. Boring infrastructure, on purpose.

Two providers, two jurisdictions.

Sending runs on AWS SES (Ireland). Scaleway TEM (France) is the second provider; failover works where a domain is authenticated with both.

Infrastructureall systems go
SES · eu-west-1healthy
Scaleway TEM · fr-parfailover where authenticated
Circuit breakerclosed
Idempotencyenforced

Check your domain readiness

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.

EU-resident. Verifiably.

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.

Questions we get

Why Truncus instead of Scaleway TEM or Amazon SES directly?

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.

Is my data EU-only?

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.

Can I include Truncus in my data processing agreement?

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.

Can I send newsletters or cold outreach with Truncus?

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.

What happens when SES has an outage?

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.

Why not another EU email provider?

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

AWS SESScalewaySupabase (Frankfurt)ClerkVercel

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

Send one email. Get one answer.

Free tier, no card. Your first delivered is one curl away.

Truncus — EU transactional email API. Email should answer.