Inboxes and codes
A fresh email address per run, and the verification code it receives.
Sign-up, sign-in and password reset are the first flows anyone writes, and nearly all of them send a code. An inbox gives the flow an address of its own and reads the mail that arrives.
{
"name": "Rote: sign up",
"app": { "bundleId": "com.example.rote" },
"goal": "Sign up with the email in data, then enter the verification code from data when asked",
"data": { "email": "{{ inbox.new }}", "code": "{{ inbox.code }}" },
"expectText": ["Welcome"]
}How it works
{{ inbox.new }}becomes a fresh address likerun-8f2a1c3d9e@mail.testedok.devbefore the run starts. It lives for two hours.{{ inbox.code }}is filled in at the moment of typing: the CLI waits (up to 90 seconds) for mail to arrive at the address and types the code it carries.{{ inbox.link }}gives the mail's most likely link instead.- Codes are picked out on arrival: a 4–8 digit number near a word like "code" ranks first, a spaced code such as
123 456is joined, letter-and-digit codes count, and a bare year comes last. Links that say verify, confirm or login rank above footer links. - Each code is read once. A resend produces a new message, and the next
{{ inbox.code }}waits for it.
Mail for an address that is not a live inbox is rejected, so the sending server knows.
From a coding agent
The MCP tools create_inbox and wait_for_code do the same by hand: make an address, sign up with it, then wait for the code and type it.
Limits
Twenty live inboxes per project at once; they expire on their own. The dashboard's Fixtures page shows how many are alive.