{id} accepts its id or name.
Not available over HTTP: changing a wallet’s rules, x402 payments, withdrawals and confirming a held proposal. Use the dashboard or the MCP tools for rules and x402. Only the owner, signed in to the dashboard, can confirm or withdraw.
List wallets
GET /api/v1/wallets. Free. Archived wallets are left out unless you add ?includeArchived=true.
Returns { "wallets": [...] }. Each wallet:
Create a wallet
POST /api/v1/wallets. Free. Returns 201 with the wallet row above.
Chain and mode cannot be changed later. An account can have 25 wallets.
Balances
GET /api/v1/wallets/{id}/balances. Free.
amount is in base units. Use amountFormatted.
Propose a transaction
POST /api/v1/wallets/{id}/propose with { "input": {...}, "note"?: "..." }.
note is context for the judge. It is treated as untrusted narration that cannot grant permission, and it is cut at 2,000 characters.
Every input has a kind and a target network. Use chain (base, ethereum, arbitrum, optimism, polygon, robinhood, solana or starknet) or its CAIP-2 identifier. The network must match the wallet family: an EVM wallet may use the supported EVM networks, while Solana and Starknet wallets stay on their own networks.
transfer
transfer
A named asset, in whole units, sent as-is with no conversion. On EVM and Starknet a known asset becomes the plain transfer call. On Starknet the asset must be STRK, ETH, USDC or USDT. Solana execution depends on the wallet’s signer and sponsorship route; use the returned proposal status rather than assuming it always needs owner approval.
amount must be a plain decimal string greater than zero: "1.5", not "1e3".evm_transaction
evm_transaction
One transaction.
value may be decimal or hex. from, if sent, must be the wallet. Fee fields above 1 ETH are refused.evm_calls
evm_calls
A batch executed together, for example an approval and the call that uses it.
solana_transaction
solana_transaction
A base64 serialized transaction.
starknet_calls
starknet_calls
A multicall executed as one transaction. For a STRK20 private action, add
calldata holds felts as hex or decimal strings."proof": { "facts": [...], "data": "..." }: 1 to 64 hex felts and a base64 proof under 4 MB. For prepared private actions, use the sealed preparation reference returned by the current proving tools. The server retains the actual proof and checks its expiry before submission; do not use stale raw-proof examples.x402_payment is refused here. Chance builds x402 payments itself from terms it fetches; use the escrow_pay_x402 MCP tool.
Result
Status200 with a proposal result:
How a proposal is routed:
- A wallet limit fails:
blocked,verdict: "BLOCK", no judge, no credit. - The judge returns
BLOCK:blocked. The escrow judge is told to block a transaction whose simulation reverts. ALLOWon an autonomous wallet, with a clean simulation that the wallet’s limits can be checked against, for an action Chance can sign: executes now.statusisexecutedwith atxHash,executingwhile no transaction hash is known yet, orfailed.- Anything else, including every proposal on a safe wallet and every
ESCALATE:awaiting_userwith anapprovalUrl. The link expires after the approval window, 60 minutes by default.
Propose a swap
POST /api/v1/wallets/{id}/swap. This endpoint uses supported Uniswap EVM routes. Use the current endpoint schema for accepted networks; Jupiter and LI.FI have separate MCP tools. Chance quotes the swap on the Uniswap Trading API, builds the batch (an approval for exactly the sell amount when one is needed, then the swap) and proposes it as above.
Returns the proposal result plus
swap: routing, sell and buy (address, decimals, symbol), amountIn, amountOut, minimumOut in base units and their …Human versions, priceImpactPct, slippagePct, gasFeeUSD, routeString, approvalNeeded, approvalSpender.
Proposal status
GET /api/v1/escrow-transactions/{txId}. Free.
status is one of verifying, blocked, awaiting_user, executing, executed, failed, rejected, expired. A held proposal past its window reads expired. approvalUrl is set only while awaiting_user.

