Skip to content

Developer preview

Send the email. Know what happened.

A transactional email API with a delivery trace for every message: each hop, how long it waited, and a plain-language diagnosis when it fails.

POST /api/v1/emailscURLbody
curl -X POST "$MAILTRUSS_URL/api/v1/emails" \
  -H "Authorization: Bearer $MAILTRUSS_API_KEY" \
  -H "Idempotency-Key: signin-alert-8812" \
  -d '{
    "from": "Acme <security@mail.acme.dev>",
    "to": "li.wei72@yahoo.com",
    "subject": "New sign-in from Chrome on macOS",
    "html": "<p>We noticed a new sign-in…</p>"
  }'
{
  "from": "security@mail.acme.dev",
  "to": "li.wei72@yahoo.com",
  "subject": "New sign-in"
}
200 OK{ "id": "e1968588…" }38 ms

Example: what happened after the request

Bouncedto li.wei72@yahoo.comexample data

Delivery trace

2.8s end to end
  1. Accepted
  2. Queued9ms
  3. Handed off423ms
  4. Bounced2.4s

Recipient address does not exist

yahoo.com 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

Outcome
  • REST API on /api/v1
  • Idempotency keys
  • Batches of 100
  • Scheduling up to 30 days
  • Suppression built in

01The problem

200 OK doesn’t tell the whole story.

Your send call returns in milliseconds. Whether the message arrives is decided seconds later, by a mail server you don’t control. Most APIs stop telling you anything at the first step.

  1. API accepted09:41:07.120

    The request was valid and the message was stored. This is where 200 OK comes from.← 200 OK confirms only this step.

  2. Queued+9 ms

    Waiting for a worker. Milliseconds normally; longer under load or when scheduled.

  3. Handed off+423 ms

    The mail network accepted the message for sending. It has not reached anyone yet.

  4. Delivered+1.2 s

    or Bounced 5.1.1+2.4 s

    The receiving server decides.

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 senders, by anyone.

02The delivery trace

From request to receiving server. Every event accounted for.

Open any message and Mailtruss shows you where it went, how long each hop took, and what the receiving server said.

  1. A verdict first

    What happened, why, the next step, and whether retrying is safe. In plain language, above everything else.

  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 / e1968588example data

← Emails

New sign-in from Chrome on macOS

To li.wei72@yahoo.comMar 14, 09:41 UTCe1968588…

Bounced

Recipient address does not exist

yahoo.com 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.
Retry
Do not retry

Delivery trace

2.8s end to end
  1. Accepted
  2. Queued9ms
  3. Handed off423ms
  4. Bounced2.4s

Recorded events

  1. Request accepted

    API

    requestId
    req_j8td7l5hg1
  2. Validated

    API · +4ms

  3. Queued

    API · +5ms

  4. Worker picked up the message

    Worker · +131ms

  5. Handed off

    Worker · +292ms

    sesMessageId
    0100018e3c2a7d41-e9b3c1f2
  6. Bounced

    Delivery network · +2.4s

    bounceType
    Permanent
    status
    5.1.1
    diagnostic
    smtp; 550 5.1.1 <li.wei72@yahoo.com>: user unknown
From
Acme <security@mail.acme.dev>
Domain
mail.acme.dev
Source
api
Request
req_j8td7l5hg1
Delivery ID
0100018e3c2a7d41-e…
Suppressed
yes, after this bounce
The email detail page, rendered with the product’s own components. The message and its events are an example.

03Developer experience

An API that gets out of your way.

One POST sends an email. The request shape will feel familiar if you have used Resend.

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.
curl -X POST "$MAILTRUSS_URL/api/v1/emails" \
  -H "Authorization: Bearer $MAILTRUSS_API_KEY" \
  -H "Content-Type: application/json" \
  -H "Idempotency-Key: welcome-user-4812" \
  -d '{
    "from": "Acme <hello@mail.acme.dev>",
    "to": "ana@fabrikam.com",
    "subject": "Welcome to Acme",
    "html": "<p>Thanks for signing up.</p>",
    "tags": [{ "name": "flow", "value": "onboarding" }]
  }'
Response200 OK · 41 ms
x-request-id: req_5n2kq8vd0w

{ "id": "4b1e7c2a-58d3-4c0f-9a61-2f7d1e8b9c30" }
GET /api/v1/emails/4b1e7c2a…seconds later · trimmed
{
  "object": "email",
  "id": "4b1e7c2a-58d3-4c0f-9a61-2f7d1e8b9c30",
  "to": ["ana@fabrikam.com"],
  "subject": "Welcome to Acme",
  "last_event": "delivered"
}

04Debugging

When something fails, know where to look.

Mailtruss reads the event the receiving server or the delivery network sent back and turns it into a diagnosis you can act on, with the raw evidence beside it.

Bounced· li.wei72@yahoo.com

example data

Diagnosis

Recipient address does not exist

The receiving server refused the message permanently. Retrying will bounce again and costs reputation.

What Mailtruss did
Added the address to your suppression list. Future sends to it are skipped.
Next step
Correct or remove the address in your system.
Retry
Do not retry

Evidence, from the bounce event

bounceType
Permanent
bounceSubType
General
status
5.1.1
action
failed
diagnostic
smtp; 550 5.1.1 <li.wei72@yahoo.com>: user unknown
reportingMTA
dns; mta1.am0.yahoodns.net

Recognised today

Retry advice
  • Recipient address does not existPermanent bounceDo not retry
  • Temporary bounceTransient bounceSafe after fixing
  • Recipient marked the message as spamComplaintDo not retry
  • Sending domain is not verifiedDelivery rejectionSafe after fixing
  • Recipient not allowed yetDelivery rejectionSafe after fixing
  • Sending rate limit reachedRate limitingSafe after fixing
  • Message too largeDelivery rejectionDo not retry
  • Outcome uncertainTimeout after hand-offDo not retry

Not every deliverability problem can be diagnosed automatically. Anything that doesn’t match is shown with its raw event and the error the delivery network returned, never hidden.

05Domains

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 feedback-smtp.…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.

06Developer tooling

Everything around the send call. Already in the dashboard.

Playground

Edit a request, run it through the real pipeline, read the result. Problems are flagged before you send.

example data
POST /api/v1/emailsRun ⌘↵
{
  "from": "Acme <hello@mail.acme.dev>",
  "to": "ana@fabrikam.com",
  "html": "<p>Your receipt</p>"
}

422 validation_error

subject: Missing subject field.

Rejected before processing; no quota was used.

API logs

Every request, with its body and response. Secrets are redacted before storage.

example data
Example API request log
StatusRequestTime
200POST/api/v1/emails38 ms
200POST/api/v1/emails/batch112 ms
422POST/api/v1/emails11 ms
200GET/api/v1/emails/4b1e7c2a…19 ms
200POST/api/v1/domains/…/verify640 ms
429POST/api/v1/emails6 ms

Also built

Scheduling
scheduled_at up to 30 days; cancel or reschedule
Suppression list
hard bounces and complaints stop future sends
Webhooks
signed payloads, retries with backoff, replay, delivery log
Templates
block editor or HTML, variables, versions, explicit publish
Organizations and projects
separate data per organization; scope views by project
Team and roles
invitations, five roles enforced on the server
Analytics
volume and outcomes by day and domain
Contacts and broadcasts
CSV import, segments, scheduling, one-click unsubscribe

Not built yet

  • Inbound email
  • Automations
  • SMTP relay

Nothing here is in the product until it works.

07Visibility

Clarity for every message.

Volume and outcomes by day and by domain, with the problems pulled to the top. The headline rates and each domain link to the emails behind them.

Last 14 days

example data
Sent
6,125
Delivered
96.2%
Bounced
2.4%
Complaints
0.03%
  • Delivered
  • In flight
  • Bounced / complained
  • Failed

Bounces tripled on Mar 9. 29 of them went to one domain from an imported list. Mailbox providers penalise senders whose bounce rate stays above 5%.

08Pricing

Start small. Scale when you need to.

Provisional launch pricing. Paid plans can’t be bought yet; prices may change before billing opens. Every plan has every feature. Plans differ only in volume.

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

Sending stops at your limit instead of billing overage, so there are no surprise charges. Limits are enforced atomically: two requests at once cannot both slip past the cap.

Know what happens after send.

Create an account, verify a domain, and your first message arrives with its trace.