Skip to content
Skip to main content

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

CapabilityPaperLive
REST API accessYesYes
WebSocket streaming (P&L, Portfolio)YesYes
Equities orders (market, limit, stop, stop-limit)YesYes
Multi-leg options orders (when options are enabled)YesYes
Short sellingYes - every symbol treated as easy-to-borrowYes - real ETB/HTB inventory
is-easy-to-borrow checkAlways returns trueReal classification
Locate quote / accept / cancel / sell-backReturns HTTP 200 with a Rejected status / no inventoryYes
Locate inventory & historyAlways empty ([])Yes
Real-time market data over APIComing soonComing soon
Starting balance$1,000,000 paper dollarsYour funded balance
Account expiration30 days (permanent if linked to a live account)None
Account-ID prefixAlways starts with TZPOpaque - don't pattern-match

Locates are live-only

Paper accounts can't run the locate workflow

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:

  1. Swap the key pair. Replace your TZ-API-KEY-ID and TZ-API-SECRET-KEY env vars with the values from your live account's API Keys page. The base URL stays the same.
  2. 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.
  3. 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.
  4. Guard live writes. If your tool can write to both environments, add an explicit accountType assertion before every mutating call: verify accountType === "Paper" when targeting paper, and verify accountType !== "Paper" when targeting live. A misconfigured env var should never be the only thing between a script and a real order.

Where to next