{id} below accepts a wallet’s id or its 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 chain: either caip2 (eip155:8453, eip155:1, solana:5eykt4UsFv8P8NJdTREpY1vzqKqZKvdp, starknet:SN_MAIN) or chain (base, ethereum, solana, starknet). It must be the wallet’s chain.
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. On Solana a named transfer always waits for the owner, because only the owner can sign it.
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. The proof is not stored, so a proposal that waits for the owner needs a fresh one.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. Base and Ethereum wallets only. 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.
