Skip to content

Torii Wallet API routes#

Every /torii/* route in the code, with method, who may call it and what it does. Generated by scripts/gen_tw_docs_routes.py; a test fails when a route exists in code and is missing here.

Auth words: open (no key), owner session (signed-in person), agent key (X-NW-User-Key), owner or agent, keeper (the house), admin. Base URL: https://api.nightwatchprotocol.com. Refusals use the standard nightwatch block; see Refusals.

Mandates (owner and agent)#

MethodPathAuthWhat it does
GET/torii/dooropenAlways answers 402 with X-Torii-Door: mandate, the mandate schema, the start steps, refusal catalogue, rate limits and client config. Nothing is charged. 404 while TW_DOOR_ENABLED is off
GET/torii/skill.mdopenOne-page bootstrap for any agent harness, generated from the live tool list and refusal registry. 404 while TW_DOOR_ENABLED is off
GET/torii/mcp-toolsopenThe Torii MCP tools with titles and read/write hints, as JSON. 404 while TW_DOOR_ENABLED is off
GET/torii/marketsopenMarkets with status (live, paper, planned) and who enforces the limit (contract, venue, guard)
POST/torii/mandates/draftopenTurn a purpose note into a draft with the Standard preset. Deterministic parser, no model; stores nothing unless save is true
POST/torii/mandatesowner sessionCreate a draft mandate from typed fields (budget, caps, stop line, markets, end date, fee)
PUT/torii/mandates/{public_id}owner sessionCorrect a draft. Refused once signed (409)
POST/torii/mandates/{public_id}/assignowner sessionDesignate the agent on a draft
GET/torii/mandatesowner or agentThe mandates you own, or the ones assigned to your key
GET/torii/mandates/{public_id}owner or agentMandate detail: progress, events, clauses, limits, fees, steps, lock and chain state
GET/torii/mandates/{public_id}/statementowner sessionWeekly statement for one mandate (?week=YYYY-Www)
GET/torii/me/statementowner sessionWeekly statement across all your non-draft mandates, with totals
GET/torii/mandates/{public_id}/termsowner sessionThe exact typed data (EIP-712 v2) to sign, its hash and the clauses
POST/torii/mandates/{public_id}/signowner sessionStore the owner's signature on the terms
GET/torii/mandates/{public_id}/create-callowner sessionCalldata for the factory call that creates the vault. configured:false while no factory is set
GET/torii/mandates/{public_id}/execute-callagent keyCalldata for execute(target, data, approveAmount) on the vault. The agent signs it. Above the owner's approval amount: 202 pending_approval, no calldata (clause 6)
GET/torii/mandates/{public_id}/approvalsowner or agentApproval items for actions held above the owner's approval amount (?status=&approval_id=). Clause 6
POST/torii/mandates/{public_id}/approvals/{approval_id}owner sessionApprove or decline one pending item (decision approve or decline). A decline is recorded as refused: owner_declined
GET/torii/mandates/{public_id}/unwind-callowner or agentCalldata for unwind(target, data) on a closed mandate. The caller signs it
POST/torii/mandates/{public_id}/vaultowner sessionAttach the vault from the creation transaction's chain log
POST/torii/mandates/{public_id}/eventsagent keyReport an event (buy, sell, move, fee, resolve, note). 201, or 202 with violation:true. Takes Idempotency-Key
POST/torii/mandates/{public_id}/refusalsagent keyReport a refused attempt (TargetNotAllowed, OverPerTxCap, OverDailyCap, MandateStopped, MandateEnded, server_guard). With tx_hash the receipt is read: chain if it proves a reverted call from your wallet to the vault, else agent. 201, or 200 for a tx_hash already reported
POST/torii/mandates/{public_id}/acceptagent keyConfirm a mandate that names you. Idempotent
POST/torii/mandates/{public_id}/stopowner sessionStop the mandate in the record. Does not send the on-chain stop
GET/torii/mandates/{public_id}/stop-callowner sessionCalldata for the vault's stop() (also revokes the agent)
GET/torii/mandates/{public_id}/pause-callowner sessionCalldata for revokeAgent()
GET/torii/mandates/{public_id}/resume-callowner sessionCalldata for setAgent(agent), only while paused
GET/torii/mandates/{public_id}/withdraw-callowner sessionCalldata for withdrawAll(), or the reason it is locked and until when
GET/torii/mandates/{public_id}/close-all-planowner sessionOrdered steps for Stop and close everything, with exit cost estimates
GET/torii/mandates/{public_id}/fundowner sessionVault address, chain, USDC address, best way in, and the approve and deposit calls for an amount
POST/torii/mandates/{public_id}/vault-txowner sessionRecord a stop, pause, resume, withdraw, unwind or deposit transaction; only a successful receipt changes anything
POST/torii/mandates/{public_id}/settlekeeperSettle once, from chain facts only

Agents, balances, transfers#

MethodPathAuthWhat it does
GET/torii/agents/meowner or agentThe caller's agent identity, policy state and mandates
GET/torii/agents/{agent_id}/policyowner or agentThe agent policy (eight items, accepts_mandates) and the last 10 changes
PUT/torii/agents/{agent_id}/policyowner sessionReplace the whole policy. An agent never widens its own limits
GET/torii/agents/{agent_id}/balancesowner or agentFour balance states per chain and asset: idle, reserved, in transit, delivered
POST/torii/agents/{agent_id}/deposit-addressowner or agentThe agent wallet on file for a chain. No custody
POST/torii/transfers/reportagent keySelf-report a transfer; lands in in_transit. Takes Idempotency-Key
GET/torii/agents/{agent_id}/offersowner or agentMandates waiting for this agent to accept
GET/torii/agents/{agent_id}/activityowner or agentMerged feed of events, balance changes and Cherry references

Hall and deposit rails#

MethodPathAuthWhat it does
GET/torii/hallopenAgent records in fixed windows; sort by one fact (?sort=days_live default); ?accepting=1
GET/torii/hall/proofopenFour live numbers for the Gate proof strip
GET/torii/hall/{agent_id}openOne agent: every mandate, chart series, paper results apart, last 10 policy changes
GET/torii/deposit/routesopenWays in as estimates (quoted:false), best first
GET/torii/deposit/assetsopenAssets that can be brought in

Trading side (Terminal routes the Trade door uses)#

MethodPathAuthWhat it does
GET/torii/builder-fee/configopenThe builder address and fee (0.1%)
POST/torii/builder-fee/recordowner sessionRecord that the owner approved the builder fee
GET/torii/builder-fee/statusowner sessionWhether the builder fee is approved for your wallet
GET/torii/builder-fee/admin/countadminCount of approvals
GET/torii/indicesopenIndex perps list
GET/torii/indices/{sym}openOne index perp
GET/torii/info/metaopenHyperliquid market metadata relay (?dex=main
GET/torii/info/spot-metaopenSpot metadata relay, keyless
GET/torii/info/fundingopenFunding relay, keyless
GET/torii/info/order-historyopenOrder history relay, keyless
GET/torii/info/feesopenFee tier relay, keyless
GET/torii/info/portfolioopenPortfolio relay, keyless
POST/torii/orderowner or agentPrepare a Hyperliquid order; returns a confirm_id when the owner signs (sign_mode client). Gated by NW_TORII_LIVE_ENABLED
POST/torii/order/executeowner or agentExecute a prepared order
POST/torii/order/recordowner or agentRecord an order the owner signed in the browser
GET/torii/order/pendingowner or agentOrders waiting for confirmation
GET/torii/order/capowner or agentYour order caps and what is used today
POST/torii/order/cap/raiseowner or agentLegacy cap step in the Terminal. The Trade door does not use it: limits there can only be lowered (PUT /tw/trade/limits); see user guide 05
GET/torii/agent/statusowner or agentWhether the caller's agent may trade, and why not
GET/torii/own/termsopenTerms text for linking an own account
POST/torii/own/link/challengeowner sessionStart linking a Hyperliquid account by signed challenge
POST/torii/own/linkowner sessionFinish linking
POST/torii/own/enable/relayowner sessionRelay the owner's approval of the order agent key to Hyperliquid
POST/torii/own/enable/verifyowner sessionVerify that the approval is on chain
GET/torii/own/statusowner sessionOwn-account link and approval state
POST/torii/own/intentowner sessionRecord an intent for the own-account flow
POST/torii/own/paper/booksowner sessionCreate a paper book
GET/torii/own/paper/booksowner sessionList paper books
GET/torii/own/paper/books/{book}owner sessionOne paper book

Parked#

MethodPathAuthWhat it does
GET/torii/tusd/reserveopenParked (2026-10-11): proof-of-reserve read for the Torii dollar. Not part of the product
POST/torii/tusd/quoteopenParked: 1:1 quote. Not part of the product

Pages (the human screens)#

PathScreen
/twHome: the first screen, try any bot
/tw/startGate: pick an agent, set limits, review and sign
/tw/mandatesYour mandates
/tw/mandates/{id}One mandate: three numbers, allowed vs used, record, Pause, Stop, Withdraw, Fund
/tw/mandates/{id}/statementWeekly statement
/tw/hallThe Hall: agents with records
/tw/hall/{agent}One agent's record
/tw/marketsMarkets with status and who enforces the limit
/tw/depositBest way in and your deposit address
/tw/agentAgent console
/tw/docsThese docs
/tw/llms.txtThe agent front door as plain text

Built: /tw/trade (Watch, Manual trade, Delegation link). Routes (prefix /tw/trade): GET /products (open, 20 s cache, sample:false), GET /me, GET /positions, PUT /limits (owner session; lower only), POST /order (paper unsigned, live owner-signed; mode_seen required), POST /close (reduce only; a verified live close bypasses the live switch and the caps). Owner Bearer session only; an API key is never an owner here. Refusals are the 13 tw_* codes in the refusals chapter. /tw/money and /tw/record remain as described in their chapters.