stmp Get started

stmp / Email testing, opened up

Send mail.
Catch bugs.
Ship with confidence.

Give every test run its own inbox. Inspect real emails, retrieve sign-in codes, and check the details through the UI or REST API. Send freely within the sandbox.

INBOUND / INSPECT / ASSERT
stmp POST
DEVELOPER EDITION
SANDBOX
ONLY

TO: YOUR NEXT TEST RUN

Signed, sealed.
Tested before delivery.

SUBJECT: CONFIDENCE
Real email. Room to test.
SMTP INEVERY DETAIL CAPTUREDREST API OUT

01 / Open the envelope

See the whole message.

Delivery Checks

HTML preview, text, headers, raw source. Plus SPF/DKIM/DMARC results via API.

CI-Ready

Send with standard SMTP. Read the result through the API and make it part of your CI checks.

Deliverability Audit

SPF/DKIM/DMARC results, Message-ID, size, and Authentication-Results checks. Grouped by severity.

02 / Your first test

Send it. Read it. Assert it.

Your app sends over SMTP. Your test reads the result over the API. The whole loop fits on one screen.

QUICKSTART / REST API
# create an inbox
export SMTPDEV_API_KEY="token-from-/tokens"
curl -X POST https://stmp.ink/api/accounts \
  -H "X-API-KEY: $SMTPDEV_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"address": "qa@example.test", "password": "use-a-secret"}'

# your app sends to it, then read what arrived
curl "https://stmp.ink/api/accounts/1/mailboxes/1/messages" \
  -H "X-API-KEY: $SMTPDEV_API_KEY"
# 1. Register in the browser, then sign in:
# https://stmp.ink/register

# 2. Create a token from the web session.
curl -X POST https://stmp.ink/api/tokens \
  -H "Content-Type: application/json" \
  -d '{"name":"quickstart"}'

export SMTPDEV_API_KEY="paste-token"

# 3. Add a domain and create an account.
curl -X POST https://stmp.ink/api/domains \
  -H "X-API-KEY: $SMTPDEV_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"domain":"example.test"}'

curl -X POST https://stmp.ink/api/accounts \
  -H "X-API-KEY: $SMTPDEV_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"address":"qa@example.test","password":"account-password"}'

# 4. Send through SMTP.
printf "Subject: Hello\nFrom: app@example.test\nTo: qa@example.test\n\nIt works." | \
  nc stmp.ink 25

# 5. List messages from the Inbox mailbox.
curl "https://stmp.ink/api/accounts/1/mailboxes/1/messages?page=1&limit=25" \
  -H "X-API-KEY: $SMTPDEV_API_KEY"
import os
import requests
import smtplib
from email.message import EmailMessage

base = "https://stmp.ink/api"
token = os.environ["SMTPDEV_API_KEY"]
headers = {"X-API-KEY": token}

requests.post(
    f"{base}/domains",
    headers={**headers, "Content-Type": "application/json"},
    json={"domain": "example.test"},
)

account = requests.post(
    f"{base}/accounts",
    headers={**headers, "Content-Type": "application/json"},
    json={
        "address": "qa@example.test",
        "password": "account-password",
    },
).json()

msg = EmailMessage()
msg["From"] = "app@example.test"
msg["To"] = account["address"]
msg["Subject"] = "Hello"
msg.set_content("It works.")

with smtplib.SMTP("stmp.ink", 25) as smtp:
    smtp.send_message(msg)

mailboxes = requests.get(f"{base}/accounts/{account['id']}/mailboxes", headers=headers).json()
inbox = next(box for box in mailboxes["items"] if box["path"] == "INBOX")
messages = requests.get(
    f"{base}/accounts/{account['id']}/mailboxes/{inbox['id']}/messages",
    headers=headers,
    params={"page": 1, "limit": 25},
).json()

Read the CI guide

03 / Put it through its paces

From a single code to a complete signup.

CI Assertions

Send from the test suite, poll the API, assert on subject and body.

E2E Flows

The Playwright test clicks the real reset link from the real email.

OTP & Magic Links

Agents and QA read one-time codes and sign-in links straight from the API.

QA Signups

A catch-all account hands every test run a fresh address on your domain.

Client Previews planned

The same message in Thunderbird and Apple Mail, over plain IMAP.

AI Agents

Agents read OTP codes and confirmation links from the API — without touching a real inbox.

04 / Built into stmp

Everything your test inbox needs.

Custom Domains

Bring your own domains and subdomains. One MX record each.

Disposable Accounts

Create an address per test run over the API. Delete it after.

Unlimited Messages

No daily caps, no metering.

Sandboxed

Receives real email from services that deliver to your MX. Sends only within the sandbox.

SPF, DKIM & DMARC

Checked on every inbound message. Results in the UI and the API.

Retention Timers

Auto-deleted after 30 days by default; per-message expiry for anything shorter.

REST API

Domains, accounts, mailboxes, messages, tokens. OpenAPI spec included.

Real-time Updates

New messages pushed via SSE. No polling.

Catch-All & Aliasing

Wildcard accounts and plus-sign addressing. Capture everything or route by tag.

SMTP, IMAP, POP3 planned

Your existing mail clients work out of the box. No vendor SDK, no lock-in.

05 / Connection desk

Address your next test here.

Point your app at these endpoints — they're the same in every environment you deploy to.

ProtocolHostPortSecurity
SMTP instmp.ink25Local plain SMTP
REST APIhttps://stmp.ink/apiX-API-KEY header

Ready when you are

Make email part of your next test.

Works with your stack

Fits your stack. Follows your tests.

Use the SMTP client you already have. Inspect messages in stmp, then turn what you find into repeatable API assertions.