Skip to main content

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 — 100onFree,100 on Free, 10,000 on Pro, 25,000onPro+.OnFree,thewalletisonlyreachablefromakeyissuedonorafter20260905:afreekeyissuedbeforethatdateisreadonly(["read"])andcannotplaceordersagainstit.The25,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+keysresetto10,000; Pro+ keys reset to 25,000. Free cannot reset (see below).
The reset response carries four fields:
On a paid tier, API wallet resets are currently uncapped — the cooldown is API_RESET_COOLDOWN_DAYS, presently 0, and a daily cooldown may be enabled later. Use them freely to test strategies from a clean baseline.Not available on Free. Reset returns 402 UPGRADE_REQUIRED: the $100 free budget is deliberately non-renewable, so spending it is the upgrade prompt rather than a reset away.

Scoping account reads to a wallet

The account and order endpoints accept a wallet_id query parameter with three forms (case-insensitive keywords): Supported on: Note that GET /v1/account/balance is always API-wallet scoped (wallet_id is a no-op). Any invalid wallet_id string returns 422 VALIDATION_FAILED.

Multi-wallet querying

To enumerate all wallets associated with your account and discover their numeric IDs, call:
This returns your complete wallet roster (id, name, type, 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.
Migration note (2026-06-10): GET /v1/account/positions, GET /v1/account/history and GET /v1/account/profile-analysis previously defaulted to all wallets when wallet_id was omitted. Since 2026-06-10 they default to the API wallet, consistent with Balance/Portfolio/Equity. Pass wallet_id=all to keep the old behaviour.

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.

See also

  • BalanceGET /v1/account/balance reference
  • Portfolio — combined balance + positions snapshot
  • API keys — bootstrap and key management