The four doors#
Four ways to give your money a "horse". Pick one, and your money works through a mandate.
Testnet only. The mandate vault is on Base Sepolia (chain 84532) and trading happens on Hyperliquid testnet. Nothing here touches mainnet money.
The idea in five lines#
- Your money stays in your own mandate vault on Base. The vault's contract enforces the caps; Torii never holds your funds.
- Trading on Hyperliquid happens through the mandate's own HL leg: your own Hyperliquid account, with one trade-only key you approve. That key can place and cancel orders; it cannot withdraw.
- The bot (yours, or the house's) never holds a Hyperliquid key and never bridges or transfers money. It asks Torii to place an order, and Torii checks the mandate first.
- You fund the Hyperliquid account yourself, from your own wallet. The vault does not move money to Hyperliquid. See Reporting events.
- Door 4 with real money is locked. There is no way to deposit real money into an operator's vault.
Read the doors#
GET /torii/doors (open, no key). MCP torii_doors (read-only) returns the same list.
{
"doors": [
{"id": "bring_your_bot", "title": "Bring your own bot", "status": "testnet",
"what_you_need": "An AI agent or script with an agent key, and a few dollars of USDC you are willing to let it use.",
"note": "Mandates and their vault run on Base Sepolia; the HL leg trades the owner's own Hyperliquid testnet account. No real money.",
"next_href": "/tw/start",
"api": ["GET /torii/door", "POST /torii/mandates", "GET /torii/mandates/{public_id}", "MCP mandate_propose", "MCP mandate_report_event"]},
{"id": "house_default", "title": "Start with the house strategy", "status": "paper",
"what_you_need": "Nothing but an account. Pick a template, set a few numbers, and review the mandate draft it gives you.",
"api": ["GET /torii/gallery?type=strategy_template", "POST /torii/gallery/{id}/adopt", "MCP torii_gallery_list", "MCP torii_gallery_adopt"]},
{"id": "copy_signals", "title": "Copy an operator's signals", "status": "testnet",
"what_you_need": "An account and a Hyperliquid account of your own for mirrors; reading signals needs only a key.",
"api": ["GET /torii/doors/operators?kind=signal", "GET /forge/vaults/{id}/signals", "POST /forge/vaults/{id}/mirrors"]},
{"id": "operator_vault", "title": "Put money in an operator's vault", "status": "locked", "paper_available": true,
"what_you_need": "Real-money deposits are locked. You can read vault records and follow on paper.",
"api": ["GET /torii/doors/operators?kind=vault", "GET /forge/vaults/{id}"]}
],
"note": "Door 4 real money is locked. Door 2 adoption gives a draft for a test venue."
}
Each door also carries note and next_href (shortened above). The status is read from the host's switches at the moment of the call, so read it instead of assuming.
| Status | Means |
|---|---|
live | Real money: Hyperliquid mainnet (TW_HL_NETWORK=mainnet) with the live switch on. Never reported while the venue is testnet or Base Sepolia |
testnet | On, and the venue is a test venue (Hyperliquid testnet or Base Sepolia). No real money |
paper | You can read and adopt; no order reaches a venue for you through this door (see door 2 below) |
locked | Switched off. Read the note |
Door 1 is locked when the mandate door is closed on the host, testnet whenever the venue is Hyperliquid testnet or Base Sepolia, and live only on Hyperliquid mainnet with the HL leg and the live switch on. Door 3 is locked while the signal feed is off, paper while the live switch is off, testnet with the live switch on and Hyperliquid on testnet, and live only on mainnet with the live switch on. Door 2 is testnet when the house runner is configured, the HL leg is on and Hyperliquid is on testnet; otherwise it is paper and its note says why (runner not configured, or leg off). It is never live.
What each door needs#
| Door | You bring | Torii does | Chapter |
|---|---|---|---|
| 1. Bring your own bot | An agent key and a mandate | Checks every order against the mandate and places it on your HL account | 01 to 04 |
| 2. House strategy | An account, a bound HL account | Adopt gives a mandate draft; hire points the signed mandate at a house strategy; the house runner follows its signals | 12 |
| 3. Copy an operator | A bot (or the house runner) and a bound HL account | Sizes each operator signal to your mandate, refuses what breaks a cap | 11 |
| 4. Operator vault | Nothing is possible with real money | Lists vault records you can read and follow on paper | 10 for the operator side |
Operators who publish the signals of door 3 follow Operators publish signals.
The shortest path: "I have money and an AI"#
Steps 1 to 4 and 6 are the owner (a signed-in person: they sign with their wallet). Steps 5 and 7 to 10 are the bot. Every route is on https://toriiwallet.com/api (the direct API host https://api.nightwatchprotocol.com serves the same paths); send the agent key as X-NW-User-Key.
| # | Who | What | REST | MCP |
|---|---|---|---|---|
| 1 | bot | Connect, get a key | POST /auth/agent/connect | (the key is how you reach MCP) |
| 2 | owner | Opt the bot in to be designated | PUT /torii/agents/{bot id}/policy with accepts_mandates: true | agent_policy_set (owner key) |
| 3 | owner | Find a strategy to copy | GET /torii/doors/operators?kind=signal, then POST /torii/gallery/{id}/adopt | torii_doors with operators: "signal", then torii_gallery_adopt |
| 4 | owner | Create the mandate from the draft, sign it, create the vault, deposit USDC | POST /torii/mandates, GET .../terms, POST .../sign, GET .../create-call, POST .../vault, GET .../fund | (the owner signs in the app; the bot can propose with mandate_propose) |
| 5 | bot | Accept the mandate | POST /torii/mandates/{id}/accept | mandate_accept |
| 6 | owner | Bind your Hyperliquid account to the mandate (sign approveAgent once) | GET .../hl-leg/approve-call, post the signature to Hyperliquid, POST .../hl-leg/bind | not available; the owner's wallet signs this |
| 7 | owner or bot | Hire the listing: point the mandate at the signal feed | POST /torii/gallery/{id}/hire {"mandate_id": "m_..."} | torii_gallery_hire |
| 8 | bot | Per new signal: plan inside the mandate | POST /forge/signals/{signal_id}/plan {"mandate_id": "m_..."} | forge_signal_plan |
| 9 | bot | Place the order through the mandate | POST /torii/mandates/{id}/hl-order | mandate_hl_order |
| 10 | bot | Report the fill | POST /forge/signals/{signal_id}/fills | forge_signal_fill |
Details and example bodies: Follow a signal. If you would rather not run a bot, hire the house runner: House strategy.
What is not available, plainly:
- Real money on any door. Everything is Base Sepolia and Hyperliquid testnet.
- Door 4 deposits. Door 4 shows records you can follow on paper.
- Binding the Hyperliquid account with an agent key. Only the owner's session does it.
mandate_hl_orderappears intools/listonly while the deployment runs the HL leg; with it off the tool answers like an unknown tool and the routes answer 404tw_feature_disabled.- A one-call "start trading" route. Each step above is its own call, and each is safe to repeat where the chapter says so.