Wallets
PolySimulator separates trading balance into distinct wallets so that bot trading, manual UI trading, and paid sandbox experiments don’t interfere with each other. The wallet that fills your order depends on how the order was authenticated.Wallets at a glance
As an API user, you only need to think about the API wallet. The UI MAIN
and SANDBOX wallets are for human-trader use on the website.
The API wallet
Your API wallet is seeded at your tier’s baseline the first time it is needed — $100 on Free, $10,000 on Pro, $25,000 on Pro+. On Free, the wallet is only reachable from a key issued on or after 2026-09-05: a free key issued before that date is read-only (["read"]) and cannot place orders against
it. The $100 is a one-off budget — it cannot be reset or topped up — and free
accounts are additionally capped at 100 order placements per UTC day
(429 FREE_TIER_DAILY_LIMIT, with Retry-After and resets_at). Every order
you place via X-API-Key debits this wallet — GET /v1/account/balance
always reports the API wallet balance for API-authenticated requests.
Resetting the API wallet
On a paid tier you can reset the API wallet to your tier’s starting balance at any time — this also closes any open API-sourced positions. Pro keys reset to $10,000; Pro+ keys reset to $25,000. Free cannot reset (see below).Scoping account reads to a wallet
The account endpoints accept awallet_id query parameter with three
forms (case-insensitive keywords):
Supported on:
GET /v1/account/positionsGET /v1/account/historyGET /v1/account/profile-analysisGET /v1/account/portfolioGET /v1/account/equity
GET /v1/account/balance is always API-wallet scoped (wallet_id is a no-op). On the account
endpoints, any invalid wallet_id string returns 422 VALIDATION_FAILED.
GET /v1/orders accepts only an integer wallet_id (404 WALLET_NOT_FOUND for a wallet you do not own). It does not
accept the api or all keywords; a non-integer value returns 422. Omit wallet_id to get orders from every wallet you own.Multi-wallet querying
To enumerate all wallets associated with your account and discover their numeric IDs, call:id, kind, label, balance). You can then pass any of your wallet IDs as ?wallet_id=<id> to inspect positions, trade history, orders, or equity for that specific wallet.
Why the wallets are separate
The split exists so that:- Bots can crash without nuking your UI portfolio. A runaway loop that blows the API wallet doesn’t touch your $1,000 MAIN balance or any SANDBOX experiment.
- The leaderboard stays clean. Only MAIN-wallet trades count toward leaderboard ranking — bot performance is tracked separately on the API beta dashboard.
- Paid top-ups don’t mix with sacred state. Top-ups always credit SANDBOX wallets; the MAIN $1,000 is preserved as the canonical “fresh-account” baseline for any user.
Top-ups (paid)
Top-ups are paid Stripe purchases that credit a SANDBOX wallet for users who want extra paper-trading capital on the UI side. They do not affect the API wallet.
If you only use the API, you can ignore this entire section.