Website session
Cookie-backed AJAX inbox — no API key required for guests.
RUN MAIL
Create temporary mailboxes, control TTL, and fetch messages over a clean REST surface — built for QA, automation, and product tests.
Your inbox is ready
Guests use the website session. Apps and CI use API keys and mailbox tokens.
Cookie-backed AJAX inbox — no API key required for guests.
Bearer / X-Api-Key auth against /api/runmail/v1.
Each mailbox returns an access token for message operations.
Pull messages on demand; refresh endpoints keep inboxes current.
Pick the mailbox shape that matches your workflow.
Short-lived addresses with configurable TTL for sign-up flows.
OTP capture · account smoke tests
Learn moreOne-shot identities you can rotate the moment a test finishes.
Privacy · throwaway registrations
Learn moreStable-enough mailboxes for longer automation and staging.
CI pipelines · integration suites
Learn moreAssert delivery, subject lines, and HTML bodies from your suite.
E2E · webhook QA
Learn moreA full browser client for humans watching live verification mail.
Manual QA · support demos
Learn moreProgrammatic create, rotate, list, and delete over REST.
SDKs · scripts · bots
Learn moreCreate a mailbox, then list messages — same shapes the API returns.
curl -X POST /api/runmail/v1/mailboxes \
-H "Authorization: Bearer rm_live_YOUR_KEY" \
-H "Content-Type: application/json" \
-d '{"type":"temp","ttl":3600}'
curl -X GET /api/runmail/v1/mailboxes/{uuid}/messages \
-H "Authorization: Bearer rm_live_YOUR_KEY" \
-H "X-Mailbox-Token: mbx_YOUR_TOKEN"
const res = await fetch('/api/runmail/v1/mailboxes', {
method: 'POST',
headers: {
'Authorization': 'Bearer rm_live_YOUR_KEY',
'Content-Type': 'application/json'
},
body: JSON.stringify({ type: 'temp', ttl: 3600 })
});
const { data } = await res.json();
// data.email, data.uuid, data.access_token
const res = await fetch(`/api/runmail/v1/mailboxes/${uuid}/messages`, {
headers: {
'Authorization': 'Bearer rm_live_YOUR_KEY',
'X-Mailbox-Token': accessToken
}
});
const { data } = await res.json();
$ch = curl_init('/api/runmail/v1/mailboxes');
curl_setopt_array($ch, [
CURLOPT_POST => true,
CURLOPT_HTTPHEADER => [
'Authorization: Bearer rm_live_YOUR_KEY',
'Content-Type: application/json',
],
CURLOPT_POSTFIELDS => json_encode(['type' => 'temp', 'ttl' => 3600]),
CURLOPT_RETURNTRANSFER => true,
]);
$json = json_decode(curl_exec($ch), true);
$ch = curl_init('/api/runmail/v1/mailboxes/' . $uuid . '/messages');
curl_setopt_array($ch, [
CURLOPT_HTTPHEADER => [
'Authorization: Bearer rm_live_YOUR_KEY',
'X-Mailbox-Token: ' . $token,
],
CURLOPT_RETURNTRANSFER => true,
]);
$json = json_decode(curl_exec($ch), true);
import requests
r = requests.post(
'/api/runmail/v1/mailboxes',
headers={'Authorization': 'Bearer rm_live_YOUR_KEY'},
json={'type': 'temp', 'ttl': 3600},
)
data = r.json()['data']
print(data['email'], data['access_token'])
r = requests.get(
f'/api/runmail/v1/mailboxes/{uuid}/messages',
headers={
'Authorization': 'Bearer rm_live_YOUR_KEY',
'X-Mailbox-Token': access_token,
},
)
messages = r.json()['data']['messages']
Where teams plug RUN MAIL into the stack.
Spin a mailbox, trigger registration, assert the verification code.
Wire Playwright or Cypress to the API instead of scraping UI mail.
Ephemeral addresses per job — rotate and delete when the run ends.
Give QA isolated inboxes without burning real employee addresses.
Confirm transactional templates land with the right subject and body.
Disposable identities for demos and untrusted third-party forms.
Mobile
Create temporary inboxes, get notified, and keep testing on the go.
Coming soon on Google Play
Creates a session mailbox via the website — then open the inbox.
Start in the browser or call the API with a key and mailbox token.