Account Types
TradeZero offers two account types: live and paper. Both live under the same base URL (https://webapi.tradezero.com), accept the same auth headers, and expose the same endpoint catalog. The API key pair you send is what selects the environment - paper keys hit paper, live keys hit live. There's no separate sandbox URL to remember and no environment flag to flip in your client.
Almost every workflow behaves identically between the two. The one substantive divergence is short locates, which paper accounts can't run at all. This page covers that exception, how to tell paper and live apart over the API, the paper-account lifecycle, what the portal exposes for each, and what changes when you're ready to move to live.
Paper vs live, at a glance
| Capability | Paper | Live |
|---|---|---|
| REST API access | Yes | Yes |
| WebSocket streaming (P&L, Portfolio) | Yes | Yes |
| Equities orders (market, limit, stop, stop-limit) | Yes | Yes |
| Multi-leg options orders (when options are enabled) | Yes | Yes |
| Short selling | Yes - every symbol treated as easy-to-borrow | Yes - real ETB/HTB inventory |
is-easy-to-borrow check | Always returns true | Real classification |
| Locate quote / accept / cancel / sell-back | Returns HTTP 200 with a Rejected status / no inventory | Yes |
| Locate inventory & history | Always empty ([]) | Yes |
| Real-time market data over API | Coming soon | Coming soon |
| Starting balance | $1,000,000 paper dollars | Your funded balance |
| Account expiration | 30 days (permanent if linked to a live account) | None |
| Account-ID prefix | Always starts with TZP | Opaque - don't pattern-match |
Locates are live-only
The locate endpoints accept requests on paper accounts, but the locate flow requires a live inventory feed. On paper, quote typically returns HTTP 200 with a Rejected status (there is no inventory to reserve against), accept and sell-back also resolve to a Rejected status at the engine level, and inventory and history return empty arrays. To exercise the Short Locates flow end to end, use a live account.
Paper accounts model short selling differently from production: every symbol is treated as easy-to-borrow. The is-easy-to-borrow check always returns true regardless of the symbol you query, and there's no real borrow inventory to quote against. You can short any symbol you like directly from a paper account - the order will be accepted - but the underlying state simply doesn't include the hard-to-borrow inventory that locates exist to reserve.
If your integration uses locates, build the order side against paper, then move the locate-quote / accept / sell-back loop onto a live key pair to verify it works against the real borrow market.
Telling paper and live apart over the API
Every per-account detail response carries an accountType field. Paper accounts return accountType: "Paper". Live accounts typically return accountType: "Live", though specially-classified accounts can return other values (e.g. "Margin", "Cash"). Treat anything other than "Paper" as live.
Use this field. Do not pattern-match account IDs over the API. Paper account IDs do start with the TZP prefix - that's a portal-routing convention - but live account IDs are opaque and shouldn't be parsed. Driving paper-vs-live behavior off a server-issued value also means a misconfigured env var can't trick your code into thinking a live account is paper.
detail = client.get(f"/v1/api/account/{account_id}").json()
is_paper = detail.get("accountType") == "Paper"
The List All Your Accounts recipe walks through this end to end: list accounts, fan out for per-account detail in parallel, then partition on accountType.
Paper account lifecycle
Starting balance. Every new paper account opens with $1,000,000 in paper money.
Lifespan. By default, a paper account is active for 30 days from creation. After that it's deactivated and you'd need to create a new one.
Make it permanent. If you link the paper account to your existing live TradeZero account in the portal, the paper account becomes permanent and never expires. This is the recommended setup for anyone using paper as a development sandbox alongside their live trading.
Reset. From the paper portal you can reset the account at any time. The balance returns to $1,000,000 and all positions, orders, and order history clear. Your API key pair keeps working - no need to regenerate keys after a reset.
Managing your accounts in the portal
Sign in at portal.tradezero.com/login with either a live or paper account. The portal recognizes the TZP prefix on paper account IDs and routes you to the paper-trading portal automatically; otherwise you land in the live portal.
From the paper portal you can:
- Enable options on the paper account.
- View and copy your API key pair and Trading API endpoint.
- Reset the account back to a clean $1,000,000 balance with no positions or orders.
From the live portal you can also:
- Send wires in and out of the account.
- Enable options access and apply for higher option-trading levels (Level 2, Level 3).
- Manage account settings, statements, market-data subscriptions, and the rest of the standard live-account toolset.
Market data is coming soon - on both environments
Neither paper nor live currently exposes real-time quotes, historical bars, or the depth-of-market feed over the developer API. You can still place orders without that data - your client picks the route and the venue prices it - but if you need quotes for pre-trade logic today, you'll have to source them outside the API. We're working on it.
Moving from paper to live
The migration story is small, because there's almost nothing to migrate:
- Swap the key pair. Replace your
TZ-API-KEY-IDandTZ-API-SECRET-KEYenv vars with the values from your live account's API Keys page. The base URL stays the same. - Re-test your locate flow. Paper can't exercise locates, so this is the one part of your integration you'll be running for the first time against live. Quote a single share to confirm the round-trip works before you scale up.
- Start small. Paper doesn't model market impact, queue position, partial-fill behavior, or borrow fees. Place a few small orders first to verify your assumptions hold against the real market.
- Guard live writes. If your tool can write to both environments, add an explicit
accountTypeassertion before every mutating call: verifyaccountType === "Paper"when targeting paper, and verifyaccountType !== "Paper"when targeting live. A misconfigured env var should never be the only thing between a script and a real order.
Where to next
- Authentication - generate a paper key pair to start with.
- Equity Trading - place your first paper trade.
- Short Locates - the workflow you'll only fully test on live.
- API Reference - every endpoint with full request and response specs.