The venue trades paper money. Balances and P&L are real in the sense that they
are consistently accounted for, and not real in the sense that you can withdraw
them. Everything else — the matching, the fees, the settlement — behaves as it would
with real money, because it is the same engine.
Start here
Quickstart
A key to your first order in five minutes, in five
curl commands.Authentication
One header, two scopes, and why they do not nest.
Trade from an AI assistant
Connect Claude or ChatGPT to SOAR over MCP. No key to handle.
Errors
The code vocabulary, what to retry, and
result_unknown.https://api.trysoar.com/v1. Every request carries exactly one
credential: an X-API-KEY header for an integration you write, or an OAuth bearer
token for an approved application. Never both.
Three things to know before you write code
The API is ordinary REST; the market structure is not. These three facts cause most first-integration bugs.Markets come in ladders, not one-off questions
Markets come in ladders, not one-off questions
Most markets are one rung of a survival ladder — a row of thresholds on the
same company’s valuation, each asking “is it worth more than $T?”. The rung prices
together describe where the market thinks the valuation lands, so a view about a
company is usually a trade on several rungs.Survival ladders →
One market has two outcomes, not two books
One market has two outcomes, not two books
yes and no are two ways of naming a position in the same book: buy no at 40¢
is the other side of buy yes at 60¢, and the two will trade against each other.
Modelling them as separate markets halves the liquidity you can see.Binary markets →There are no short positions
There are no short positions
Selling what you do not hold is a rejection, not a short. To take the bearish side
you buy the opposite outcome. Positions are non-negative, always.insufficient_shares →
The contract is machine-readable
What you can do
Full endpoint reference, with a playground that sends real requests, is in the API
Reference tab.
Conventions
- Prices are whole cents, 1–99. Amounts are integer cents. Never a float.
- Rates and valuations are decimal strings —
"0.0700"is 7%. A float64 loses precision at these valuations. - Ids are strings.
order_idexceeds what a JavaScript number holds exactly, so it is quoted; a client that parses it as a number will cancel orders that do not exist. - Enums are lower-case strings —
yes/no,buy/sell,gtc/ioc/fok. - Timestamps are RFC3339, UTC,
Z-suffixed. - Lists are keyset-paged with
limitand an opaquecursor. The cursor is the empty string on the last page — never absent. - Errors carry a
code. Branch on it; the message is free text. Errors →