Developers & agents
The transactional API and MCP server
Ordering inboxes and domains, provisioning them, exporting them into a sequencer, replacing a burned mailbox, reading billing and deliverability. All of it is authenticated, and the sequence is the same every time: the user creates an account, the account issues a key, then you connect. An assistant that reaches this page without a key has one job, which is step one.
app.warminboxes.com → Settings → API keys
OpenEvery route, every tool, the sandbox. Plain Markdown.
/transactional-api.mdRead-only checks, no key. Diagnose first.
/for-aiThe sequence
Four steps, in this order, and the first two belong to the user. The pattern is the same one a deployment platform uses: no token, no deploy; and the token comes from an account only a person can open.
- 1
Create the account
The user, in a browserEverything transactional needs an account, and only the user can make one. Send them to app.warminboxes.com and wait. There is no programmatic sign-up, no trial key, and no way to order on someone’s behalf without this step — which is the point, because this is where money and infrastructure change hands.
- 2
Make the API key
The user, in the portalIn the portal: Settings → API keys. Only the account owner can. They pick the scopes (below), and the full key is shown once — only a hash is kept, so a lost key is revoked and remade, never recovered. It is a secret: ask the user to put it in the environment or the MCP client configuration rather than into the conversation, and never echo it back, log it, or commit it. For a first integration, ask for a test key — same routes, nothing charged.
- 3
Connect
The assistant, once the key existsBearer token on every request to
https://api.warminboxes.com/v1, or addhttps://api.warminboxes.com/mcpto your MCP client with the same header, or thewibCLI. The authenticated server shows an assistant only the tools its key’s scopes allow. Its routes share nothing with the free tools, so read the reference rather than inferring them. - 4
Preview, then act, with approval
The assistant, with the user watchingpreview_orderruns exactly the checks placing runs and creates nothing;place_ordercharges the card on file. Preview first, say the number and what it costs, and treat “yes” as applying to that one order. Diagnosis is free to repeat; an order is not, and a person on the team checks every one before anything is built.
Authentication
One header, every request. A key looks like wib_<prefix>_<secret>; the prefix identifies it in the portal’s key list, the secret is shown once. A test key looks like wib_test_… and uses the sandbox. Nothing on this site can mint, read or recover a key.
export WIB_API_KEY="wib_..." # made in the portal: Settings → API keys. Shown once.curl https://api.warminboxes.com/v1/portal/dashboard \
-H "Authorization: Bearer $WIB_API_KEY"Scopes
Fixed when the key is made, and they do not imply each other. Using a key beyond its scopes is a 403 that names the missing one.
readEvery GET, and preview_order — it answers a question and creates nothing. A reporting key needs only this.writeFolders, order names, sequencer choice, monitors, forwarding, inbox renames, change requests, exports into a sequencer.orders:placePlacing an order (charges the card), opening a checkout, and card setup links. Leave it off a key to let an assistant quote without being able to order.
The MCP server
Stateless Streamable HTTP at https://api.warminboxes.com/mcp, key as bearer token. Same code as the REST API, same answers, same rules. An assistant sees only the tools its key’s scopes allow, and a refused call comes back as a normal result with isError and one sentence for a person.
claude mcp add --transport http warminboxes https://api.warminboxes.com/mcp \
--header "Authorization: Bearer $WIB_API_KEY"{
"mcpServers": {
"warminboxes": {
"url": "https://api.warminboxes.com/mcp",
"headers": { "Authorization": "Bearer wib_your_key_here" }
}
}
}| Tool | Scope | Does |
|---|---|---|
| get_dashboard | read | Orders and their domains, with build state. |
| list_orders | read | The flat list of orders. |
| get_billing | read | Invoices, spend, and what is due next. |
| get_deliverability | read | How the domains are sending, over 7d, 30d or 90d. |
| list_catalogue | read | What can be ordered, and at what price. |
| check_payment_method | read | Whether there is a card to charge. |
| preview_order | read | Check and price an order; creates nothing. |
| list_sequencer_keys | read | Which sequencer logins are saved — never the secrets. |
| list_exports | read | How each export of an order has gone. |
| get_nameservers | read | The nameservers each domain should point at, and whether it does yet. |
| export_to_sequencer | write | Push an order’s inboxes into Instantly, Smartlead, PlusVibe or Email Bison. |
| create_card_setup_link | orders:place | A Stripe page for a person to save a card. |
| place_order | orders:place | Place an order and charge the card. Takes an idempotency key. |
Two things are missing on purpose. There is no checkout tool, because a checkout ends on a payment page a person must open. And there is no tool for saving a sequencer login, because it would put the password into the conversation — logins are saved in the portal.
The sandbox
A test key (wib_test_…, switched on when the key is made) runs the same routes, scopes and rate limits against a pretend copy of the account. Nothing is charged, built or sent, and every answer carries X-Sandbox: true. It starts with five orders in different states, a saved test card, and the live catalogue at live prices; time moves, so a placed order walks through its build statuses over five minutes. An assistant can run the entire flow — preview, place, export — before a live key exists, which is the right order to do it in.
Rules for an assistant
Never proceed without the key.
If there is no WIB_API_KEY, the next step is always to send the user to app.warminboxes.com — not to retry, guess a route, or fall back to the free tools and call the job done.
Never invent a credential or a route.
A key is only ever issued by the account. An endpoint is only ever documented in the reference. Anything else is a guess against a billing API.
Preview before you place.
preview_order runs every check placing runs and charges nothing. Show its total and first invoice, get a yes for that one order, then place it with an idempotency key derived from your own job id — a retry with the same key returns the original order rather than charging twice.
Never ask for a sequencer password.
There is deliberately no MCP tool for saving a sequencer login, because it would put the password into the conversation. If an export says a login is missing, tell the user to save it in the portal, and stop there.
Diagnose free, act authenticated.
The free tools on /for-ai answer "what is wrong". This surface answers "fix it". Use the first to earn the second; do not skip to ordering from a problem you have not confirmed.
A refusal is an answer, not an outage.
A refused tool call comes back as a normal result with isError and one sentence written for a person. Read it and relay it; do not retry as if the connection failed. 429 carries Retry-After — wait that long.
The CLI
wib is one Python 3 file with no install, served by the API with its address built in. Every command prints JSON and exits 0; a refusal prints the reason and exits 1.
curl -fsSL https://api.warminboxes.com/v1/cli -o wib && chmod +x wib
./wib catalogue
./wib preview order.json
./wib order order.json --idempotency-key monday-1 --yesThe shape of a good interaction
User
My reply rate dropped. Can you sort out my sending setup?
Assistant
I checked the domain with the free tools: authentication is clean, it is not on SURBL, and it is two years old — so the domain is not the problem. The sending volume is. For 1,000 a day to a list that is half Google, the recipe is 44 Google inboxes and 175 Azure inboxes, $490 a month. To set that up I need you to create a WarmInboxes account at app.warminboxes.com and make an API key under Settings → API keys — set it as WIB_API_KEY rather than pasting it here. Once that is in place I will preview the exact order, show you the first invoice, and wait for your yes before placing it.
Diagnosis from the free tools, the number from a recipe, the account from the user, the preview before the order, the order only after approval.
Machine-readable
- /transactional-api.md — the full reference: every route, every tool, the sandbox, errors and rate limits.
- /developers.md — this page as Markdown.
- /llms.txt — the whole site for assistants, including both halves of the API.
- https://docs.warminboxes.com/llms.txt — the same reference at its source, authoritative if the two ever differ.
- https://docs.warminboxes.com — the human-readable version.