Skip to content
newSeven SDKs and an MCP server are liveSDKs and an MCP server are live

Send the email. Know what happened.

Mailtruss is a transactional email API for developers. It follows every message past the 200 OK and tells you in plain language what happened and what to do next.

3,000 emails a month freeno credit card

NodePythonMCPOpenAPI

example data
curl https://mailtruss.com/api/v1/emails \
-H "Authorization: Bearer $MAILTRUSS_API_KEY" \
-d '{"from": "security@mail.acme.dev", "to": "li.wei72@contoso.org",
"subject": "New sign-in from Chrome on macOS"}'
  1. 200 OK returned to your API call after 38 ms. Everything after this is tracked by Mailtruss.
  2. Accepted, +0 ms: Request validated and stored
  3. Queued, +9 ms: Waiting for a worker
  4. Handed off, +432 ms: Delivery network took it
  5. Bounced, +2.8 s: 550 5.1.1 user unknown

Recorded event

09:41:09.930 bounced

source
delivery network
bounceType
Permanent
status
5.1.1
diagnostic
smtp; 550 5.1.1 user unknown

Recipient address does not exist

contoso.org permanently refused the message (550 5.1.1). The address was added to your suppression list to protect your sender reputation.

Next step Remove or correct the address in your system.

Do not retry

What happened nextexample data

Diagnosis

Every failure, in a sentence you can act on.

Mailtruss reads what the receiving server or the delivery network sent back and turns it into a diagnosis. Pick a failure to see what you would read.

The tag says whether sending the same message again is safe once the cause is fixed. Not every problem can be diagnosed automatically; anything that doesn’t match is shown with its raw event, never hidden.

Permanent bounce

example data

What the receiving side said

550 5.1.1 <a.novak@contoso.org>: user unknown

Diagnosis

Recipient address does not exist

The receiving server permanently refused the message.

What Mailtruss did
Added the address to your suppression list. Future sends to it are skipped.
Next step
Remove or correct the address. Repeated hard bounces damage your reputation.
Safe to retry?
No, do not retry

Open any message. Read the whole story.

Mailtruss shows where the message went, how long each hop took, and what the receiving server said. This one was held up once before it was delivered.

  1. A verdict first

    What happened and why, in plain language, above everything else. When something went wrong, it adds the next step and whether retrying is safe.

  2. The trace as proof

    Each hop with the time it waited. Built only from recorded events; a step with no event is shown as not reached.

  3. Raw evidence, one glance down

    Every event with its source (API, worker, delivery network) and the fields that came with it, including the SMTP diagnostic.

Acme / Production / Emails / 7c41d2a0example data

← Emails

Your March invoice is ready

To r.iyer@northwind.devMar 14, 09:41 UTC7c41d2a0…

Delivered

Accepted by the receiving mail server

northwind.dev deferred the first attempt (451 4.7.1) and accepted the retry 94 seconds after your request. Delivered means the receiving server accepted it; it does not confirm inbox placement or that it was read.

Next step
None needed
Took
94.3 s, one retry

Delivery trace

1m 34s end to end
  1. Accepted
  2. Queued6ms
  3. Handed off335ms
  4. Delivered1m 34s

Recorded events

  1. Request accepted

    API

    requestId
    req_4kq2m8v0xa
  2. Queued

    API · +6ms

  3. Handed off

    Worker · +335ms

    deliveryId
    0100018e3c4b9f02-71d0a8c4
  4. Delivery delayed

    Delivery network · +899ms

    delayType
    TransientCommunicationFailure
    diagnostic
    smtp; 451 4.7.1 try again later
  5. Receiving server accepted the message

    Delivery network · +1m 33s

    smtpResponse
    250 2.0.0 OK
    remoteMta
    mx1.northwind.dev
Recorded events 5
  1. Request accepted

    API

    requestId
    req_4kq2m8v0xa
  2. Queued

    API · +6ms

  3. Handed off

    Worker · +335ms

    deliveryId
    0100018e3c4b9f02-71d0a8c4
  4. Delivery delayed

    Delivery network · +899ms

    delayType
    TransientCommunicationFailure
    diagnostic
    smtp; 451 4.7.1 try again later
  5. Receiving server accepted the message

    Delivery network · +1m 33s

    smtpResponse
    250 2.0.0 OK
    remoteMta
    mx1.northwind.dev
The email detail page, rendered with the product’s own components. The message and its events are an example.

Delivered is the last thing the mail system reports. It means the receiving server accepted the message. Whether it then lands in the inbox or a spam folder isn’t reported back to any sender.

The API

One request to send. One ID to trace it.

Send from curl, Node, Python or Next.js. Every sample is the real call, and the same request works for an AI assistant through the MCP server.

Idempotency-Key
Retry a timed-out request safely. The same key and body return the first response instead of sending twice.
scheduled_at
Send later, up to 30 days ahead. Cancel or reschedule until it starts.
/emails/batch
Up to 100 messages in one request; the response returns an ID for each.
x-request-id
Every response carries one. Paste it into API logs to see the stored request and response.
errors
Typed: a name, a message that names the field, and a status code. Validation errors are rejected before any quota is used.
send.ts
import { MailClient } from "mailtruss";
​
const mail = new MailClient({ apiKey: process.env.MAILTRUSS_API_KEY! });
​
const { id } = await mail.emails.send(
{
from: "Acme <hello@mail.acme.dev>",
to: "ana@fabrikam.com",
subject: "Welcome to Acme",
html: "<p>Thanks for signing up.</p>",
},
{ idempotencyKey: "welcome-user-4812" }, // retries are safe
);
Response
HTTP/1.1 200 OK
content-type: application/json
x-request-id: req_2n8f4c1k7d
​
{ "id": "4b1e9c27-58d3-4a0e-b6f1-0c9a2e7d1f35" }

The id opens this message in Emails with its full trace. Quote the x-request-id to find the stored request in API logs. Or ask your AI assistant: the MCP server exposes the same API.

Domain setup, without the detective work.

Add the domain, publish five records, and Mailtruss shows what it can see so far, and tells you when waiting longer won’t help.

  1. Step 1

    Add the domain

    Use a subdomain so your root records stay untouched.

  2. Step 2

    example data

    Publish the records

    Each value has a copy button and says what it is for.

    • CNAMEk3x7….dkim.…DKIM · k3x7…._domainkey.mail.acme.devVerified
    • CNAMEq9vb….dkim.…DKIM · q9vb…._domainkey.mail.acme.devVerified
    • CNAMEw2mf….dkim.…DKIM · w2mf…._domainkey.mail.acme.devPending
    • MX10 …Return path · send.mail.acme.devVerified
    • TXTv=spf1 include:… ~allSPF · send.mail.acme.devPending
  3. Step 3

    Verify

    Re-check when you’re ready. Nothing pretends DNS is instant.

    3/5

    records verified

    Pending
    Not confirmed yet. DNS changes can take minutes to hours.
    Failed
    We stopped waiting. The record is missing or wrong; fix it and re-check.

Everything else

Everything you need after the first send.

The previews use example data.

  • Webhooks

    Every outcome as a signed event (Standard Webhooks). Six retries with backoff over about 31 hours, replay, and a delivery log per endpoint.

    Webhooks docs →

  • Analytics

    Volume and outcomes by day and by domain, with the problems pulled to the top. Each rate links to the emails behind it.

  • Suppressions

    Hard bounces and spam complaints stop future sends automatically, per organization. Bounces can be removed once an address is fixed.

    API reference →

  • Templates

    Block editor or HTML, variables with fallbacks, versions and an explicit publish.

    API →
  • Contacts, broadcasts and topics

    CSV import, segments, scheduling, and a one-click unsubscribe on every message.

    API →
  • Playground

    Run a request through the real pipeline and read the result. Problems are flagged before anything is sent.

  • API logs

    Every request with its body and response, secrets redacted before storage. Search by path, request ID or error.

  • Alerts

    Usage near a limit, delivery quality slipping, a domain failing to verify, a webhook that keeps failing.

  • Team and roles

    Invitations and five roles (owner, admin, developer, viewer, billing), enforced on the server.

  • Scheduling and batches

    Send up to 30 days ahead, or up to 100 messages in one request.

    Docs →
  • Libraries and MCP

    SDKs for Node, Python, Go, PHP, Ruby, Java and .NET, an OpenAPI spec, and an MCP server for AI assistants.

    Docs →

What you can check before you trust us.

How accounts, keys and events are protected, and what Mailtruss can’t tell you.

Limits, stated plainly

  • Inbox or spam placement isn’t reported back to any sender, so Mailtruss doesn’t claim to know it.
  • The Free plan is capped at 100 emails a day as well as 3,000 a month.
  • Not every failure can be diagnosed automatically. Those are shown with the raw event, never hidden.

Start small. Scale when you need to.

Every plan has every feature. Plans differ only in volume and in how many domains and API keys you can create. Sending stops at your limit instead of billing overage.

  • Free3,000 a month · 100 a day$0/moStart free
  • Starter25,000 a month$9/mo
  • Pro100,000 a month$29/mo
  • Business300,000 a month$79/mo

Compare plans and use the calculator

Send your first email. Watch it arrive.

Create an account, verify a domain, and your first message comes with its trace. 3,000 emails a month are free.