Short Locates
A locate is a short-borrow reservation. Before you can sell short a stock that is not easy to borrow, you must locate the shares first - the locate secures your right to borrow at a specific price for the current session.
TradeZero exposes three locate pools, each suited to different borrow scenarios:
Locate- standard inventory for any non-easy-to-borrow name that is not on the Reg SHO threshold list. Reusable throughout the day; credit-back eligible.Pre-Borrow- reserved inventory for Reg SHO threshold securities. Reusable throughout the day; credit-back eligible.Single Use- one-and-done inventory for Reg SHO threshold securities. Consumed by the first short you open against it; credit-back eligible only if you have not shorted yet.
The system picks the pool automatically based on the symbol. Your job is to request a priced quote, decide which offer to accept, and credit back any inventory you do not use. The Locates API covers that entire workflow: check whether a symbol is easy to borrow, request a quote, accept the priced offer, manage live inventory, and credit back anything unused at the end of the session.
The Locates API completes the full quote → accept → inventory workflow on live accounts. On paper, the endpoints accept requests but do not allocate borrow inventory - see Account Types → Locates for how paper behaves.
GET /is-easy-to-borrowalways returns{ "isEasyToBorrow": true }regardless of symbol - including for Reg SHO threshold names like CYCU.POST /quotereturns200 OK { "locateQuoteSent": "true" }and the quote appears in/historyaslocateStatus: 56 Rejectedwith an explanatorytextfield - locates require a live account with offerable inventory.POST /acceptandPOST /sellack with 200 OK but nothing ever lands in/inventory.GET /inventoryon a paper account returns an empty array.
To run the full locate workflow you need a funded live account - see Account Types for the difference between the two.
The three locate types
TradeZero exposes three classes of locate. The system picks the type automatically based on the symbol and the inventory pools that are loaded - you cannot ask for a specific type on the quote request.
| Type | Code (locateType) | /sell string | Reusable in a day? | Credit-back eligible? | Applies to |
|---|---|---|---|---|---|
Locate | 1 or 2 | "Locate" | Yes | Yes, while not tied to a short | Non-easy-to-borrow equities |
PreBorrow | 3 | "PreBorrow" | Yes | Yes, while not tied to a short | Reg SHO threshold securities |
SingleUse | 4 | "SingleUse" | No - one-time use | Yes, only if never used to short | Reg SHO threshold securities |
A few rules worth committing to memory:
- A
Locatecovers any non-easy-to-borrow stock that is not on the Reg SHO threshold list. You can short and cover against it repeatedly throughout the day as long as the located share count is large enough. SettledLocaterows come back as eitherlocateType: 1orlocateType: 2depending on which inventory pool funded the row, but the two codes are the same product - always send"Locate"on/sell. Pre-Borrow(3) andSingle Use(4) are the two ways to short a Reg SHO threshold security.Pre-Borrowis reusable within the day;Single Useis gone the moment you open a short with it, even if you cover the position again.- All three credit-back paths work - sell back any locate that is not tied to an open short and the unused portion comes off your bill.
Reg SHO threshold securities
A Reg SHO threshold security is a stock that has accumulated significant "fails to deliver" - five consecutive settlement days of unsettled trades crossing the SEC's threshold. The SEC publishes the list daily, and brokers are required to apply stricter borrowing rules to any name on it. That is why these symbols never satisfy a regular Locate and instead need either a Pre-Borrow (reusable) or a Single Use (one-and-done). For background see the SEC's Reg SHO page.
How the lifecycle works
The locates API is asynchronous. Every POST and DELETE returns 200 OK with a { "*Sent": "true" } body as soon as the request is accepted - that confirms queuing, not completion. The outcome is written to /locates/history within a few seconds.
Every short-locate workflow walks through the same six steps, regardless of whether you are integrating from a desktop client, a server backend, or a one-off script:
- Is the symbol easy to borrow?
GET /v1/api/accounts/{accountId}/is-easy-to-borrow/symbol/{symbol}returns{ "isEasyToBorrow": true }if the symbol is on the ETB list - no locate needed, send the short directly. Iffalse, continue. - Request a quote.
POST /v1/api/accounts/locates/quotewith the symbol, share count, and a freshquoteReqIDyou generate. The response is just an ack. - Poll
/locates/history. Look for the row whosequoteReqIDmatches yours. WhenlocateStatusreaches65(Offered) andlocatePrice > 0, the price is firm. For Reg SHO threshold symbols you will see two matching rows - one with your originalquoteReqID(the Pre-Borrow offer) and one with a<your-quoteReqID>.SUsuffix (the Single Use offer, the lower-cost pool). You pick which to accept. - Accept within 30 seconds. Every priced quote expires 30 seconds after it is first offered.
POST /v1/api/accounts/locates/acceptwith the chosenquoteReqID. Accepting one Reg SHO offer auto-expires the sibling - if you accept the.SUrow the Pre-Borrow row moves to status67(Expired), and vice versa. If the 30-second window elapses without an accept, both rows move to67(Expired) and a fresh/quoteis required to try again. - Watch the inventory. Once an accept is processed, the symbol appears in
GET /v1/api/accounts/{accountId}/locates/inventorywithavailableequal to the share count. You can short against this row up toavailableshares; covers return shares to the pool forLocateandPre-Borrowrows, but not forSingle Use. - Optionally credit back what you did not use.
POST /v1/api/accounts/locates/sellwith thelocateTypestring and the residual quantity. The shares move fromavailableintotoBeSold, then drop off the inventory once the credit clears. You canDELETEthe sellquoteReqIDto undo it before it fills.
Polling cadence
The locates API is asynchronous, so timing your polls correctly matters more than polling frequency.
Default cadence after POST /quote: wait 2 seconds, then poll /locates/history up to four times at 2-second intervals (an 8-to-10-second budget total). Quotes settle within 1.5–3 seconds when the symbol has offerable inventory. Symbols with no inventory either never produce a history row or come back canceled with text: "No shares available.".
While a Locates screen is open: refresh /locates/inventory every 5 seconds, and /locates/history every 8 seconds.
The general rule: poll aggressively (1.5–2 seconds) for the short window immediately after any write (/quote, /accept, /sell, /cancel), then back off to 5–8 seconds while idle. Polling faster than ~1 second does not surface new data while a write is still being applied.
Endpoint reference
The base URL for production is https://webapi.trade0.click. Every call needs the TZ-API-KEY-ID and TZ-API-SECRET-KEY headers; JSON POST calls also need Content-Type: application/json.
The field name for the account identifier in the request body is not the same on every write endpoint:
| Endpoint | Account field |
|---|---|
POST /locates/quote | account |
POST /locates/accept | accountId |
POST /locates/sell | account |
DELETE /locates/cancel/... | n/a - account ID is in the URL path |
Response payloads always echo the field as accountId. The easiest approach is to define one constant per endpoint in your client rather than sharing a single variable.
Check easy-to-borrow
GET /v1/api/accounts/{accountId}/is-easy-to-borrow/symbol/{symbol}
Returns a single boolean. The endpoint compares the supplied symbol against the platform-wide Easy-to-Borrow list using an exact, case-sensitive match - send the symbol in uppercase. Any value that is not on the list returns { "isEasyToBorrow": false }, so validate symbols upstream in your client before calling this endpoint. An empty symbol or a path segment like a single . returns a 404 from the router rather than a JSON body, so always supply a non-empty path segment.
{ "isEasyToBorrow": true }
{ "isEasyToBorrow": false }
The status does not flip after you successfully locate. ETB reflects the platform-wide classification of the symbol's borrow pool, not your account's locate inventory. Always uppercase the symbol before calling this endpoint, and run your own symbol validation upstream - the endpoint will not catch typos for you.