otpbox

OTPBox for teams

Running a large test matrix, need thousands of long-lived test inboxes, a dedicated plan, an SLA, or something the self-serve API doesn't cover yet? Tell us about your use case and we'll follow up by email.

Enterprise · Bulk provisioning

Bulk inbox pools

Ask for thousands of test inboxes in one API call instead of creating them one by one — for a seeded QA environment, a load test, or a signup regression that runs for weeks. The job is accepted straight away and the inboxes are created in the background; you follow it, then download the address list.

50,000inboxes per job, up to your pool size
~1 minuteto create 10,000 inboxes
12h · 90d · neverpool lifetime, within your agreement

How it works

# 1. Ask for 10,000 numbered inboxes that live 90 days
curl -X POST https://otpbox.io/api/v1/provisioning-jobs \
  -H "authorization: Bearer $OTPBOX_KEY" \
  -H "content-type: application/json" \
  -d '{ "count": 10000, "lifetime": "90d",
        "pattern": "qa-{n}", "domain": "qa.example.com" }'
# → 202 { "id": "prov_...", "status": "queued", "pattern": "qa-{n:5}", ... }

# 2. Follow it (or subscribe to the provisioning.completed webhook)
curl https://otpbox.io/api/v1/provisioning-jobs/prov_... \
  -H "authorization: Bearer $OTPBOX_KEY"
# → { "status": "completed", "createdCount": 10000, "progress": 1, ... }

# 3. Download the address list (add ?format=json for JSON)
curl -o pool.csv https://otpbox.io/api/v1/provisioning-jobs/prov_.../export \
  -H "authorization: Bearer $OTPBOX_KEY"
# address,inbox_id,created_at,expires_at
# qa-00001@qa.example.com,...
# qa-10000@qa.example.com,...

What you get

Addresses you can predict

Numbered (qa-00001 … qa-10000), random tails, or a fixed prefix — on any verified custom domain of your organization.

Pools outlive your keys

Pool inboxes belong to the project, so every key in it can read them with /otp and /wait. Rotating a key doesn't orphan a pool.

Progress you can follow

Poll the job, watch the dashboard's Provisioning page, or get a provisioning.completed webhook. Export the list as CSV or JSON.

Release or expire in bulk

Release a pool early to end every inbox at once. At the end of its lifetime it expires in bulk and provisioning.expired fires once.

Inbox-day metering

The live pool is measured every 15 minutes: 10,000 inboxes held all day are 10,000 inbox-days. Usage per billing cycle in the dashboard and the API.

Retention controls

Your agreement can cap how long pool messages are kept (N days) and how many each inbox keeps (only the newest N).

Pricing. Pools are priced per inbox-day in your agreement, which also sets the largest pool you can hold, the longest lifetime a pool may have, and can include a monthly inbox-day allowance. One job runs at a time per organization.

Ask about a pool Step-by-step guide → API reference →

Tell us about your use case

For a pool, say roughly how many inboxes you need, for how long, and on which domain. Otherwise, whatever you're trying to do.

← Back to API docs