The capture sandbox your agent can drive.
Catch email and webhooks in dev, then let Claude Code or Cursor block on
wait_for_email, pull the OTP, and assert — over a hosted MCP server.
The web UI is for the humans watching.
No card. No SDK. No config to babysit.
# ephemeral sandbox → OTP, one agent loop > create_sandbox { "ephemeral": true } ← { "smtpUsername": "<sandbox-id>", "smtpPassword": "…" } > wait_for_email { "timeout": 30 } ← "Verify your account" · 1.4s > extract_otp ← { "otp": "482913" }
# point any webhook at your sandbox $ curl -X POST https://<sandbox-id>.trapit.dev/hooks/stripe \ -d '{"type":"payment_intent.ok"}' # answered with the mock you configured HTTP/1.1 200 OK content-type: application/json { "ok": true, "received": "2026-08-09T09:12:04.881Z" }
# staging SMTP → a sandbox. that's the whole setup. SMTP_HOST=smtp.trapit.dev SMTP_PORT=587 # STARTTLS before AUTH SMTP_USER=<sandbox-id> SMTP_PASS=<sandbox-secret> # the credential picks the sandbox — the address is yours TO=anything@example.com # lands as a Message, full MIME intact
Somewhere for your dev traffic to land.
Sign-up mail, OTPs, provider webhooks, service-to-service calls — point them at a sandbox and every payload is kept, parsed, and ready to read.
Sign-ups, OTPs, magic links, receipts — anything your app hands to SMTP.
Provider webhooks, callbacks, and your own services calling each other.
One sandbox, two ways in: an SMTP credential for the mail, and a capture URL for the requests, which it answers with the mock you set. Same dashboard, same API, same permissions.
Newest-first list, sandboxed preview, pretty JSON.
Cursor-paginated, trap_ keys, your CI's favourite.
Blocking waits and extraction for agents.
What's inside every sandbox.
The same feature set whether you made it in the dashboard or your agent minted it thirty seconds ago.
HTML and text parts, headers, and attachments kept as sent. Unknown recipients are refused at RCPT, so the list stays yours.
See the mail the way the recipient would, rendered in a sandboxed frame where tracking pixels and remote loads go nowhere.
Any method, path, query, or body. Headers, source IP, and arrival time recorded, with JSON and form payloads parsed for you.
Set the status, headers, and body your caller should see. Template in
{{uuid}}, {{now}}, or any value from the request body.
OTPs, magic links, and body paths come back as values you can assert on — no regex against a MIME blob in your test file.
Mint one per test run and let it expire with everything it caught. Parallel runs stop stepping on each other's captures.
Your test loop already knows what to do.
Point Claude Code, Cursor, or any MCP client at the hosted server and the loop drives TrapIt itself: mint a sandbox, block until the mail or request lands, pull the value it needs, assert, move on.
Three steps, however you drive it.
The dashboard, the REST API, and MCP do the same three things — you or your agent can take either route.
Click New sandbox, call the API, or let your agent mint an ephemeral one mid-test. Keep it around for a shared staging env, or let it expire with the run.
dashboard · POST https://trapit.dev/api/v1/sandboxes · create_sandbox
Swap SMTP_HOST in your staging env file, or paste the capture URL into
the webhook config. That is the whole integration — no SDK, no code change, and it
reverts as easily as it went in.
.env · appsettings.json · provider webhook URL
Open it in the UI, pull it over the API, or block on wait_for_* from your
agent and get the OTP, link, or body value straight out.
GET https://trapit.dev/api/v1/sandboxes/{id}/messages · wait_for_email
Free until you're big.
One product, no feature gates — MCP, the REST API, mock responses and ephemeral sandboxes are in the free tier. The limits exist so we know when to talk, not to meter your test loop.
Enough headroom that most teams never leave it:
The same product with the ceiling lifted:
Coming up on either number? Mail sales@trapit.io and we'll work out what fits — sandboxes and captures are counted per organisation.
Give your test loop somewhere to aim.
Create a sandbox, point one env var at it, and watch the captures land.
No card. No SDK. No config to babysit.