Skip to content

Live markets

Every /api/v1 route requires a signed request, but you should not need a working Ed25519 implementation before you see a single price. This page streams a book straight into your browser.

Below is a real order book, streaming over the same WebSocket channel your client would join. It reads from the US demo exchange, so the orders are real but the money is not. Books there are seeded for testing, which is why the spreads look more uniform than a live market’s.

The book itself needs no key: paste a market id or symbol and it streams. To pick from a list of open markets instead, save a demo API key in Try it on Quick start first. The page uses it, from your browser, to make one signed GET /api/v1/markets call.

Feed-
Spread-
Last-
Bids
Offers
Last framethe message the socket sent, unedited - click ▸ to expand
Waiting for the first frame…

Connecting…US demo environment - real orders, no real money

The panel below the ladder is the wire, unedited: the same message your client will parse, including the fields this page ignores. Phoenix sends each one as a five-element array: join reference, message reference, topic, event, payload.

The ladder shows prices in cents. A bid of 44¢ is someone offering to pay that for a contract worth $1 if the event resolves yes, and nothing if it does not, so it reads directly as “a 44% chance”. On the wire, in the ob book, the same level is the JSON number 0.44, in dollars. To place that order over REST you send the price as the dollar string "0.44".

The number beside each price is quantity, in contracts. The shaded bar behind a row is that level’s size relative to the largest on its side.

Spread is the number worth looking at. It is what a taker pays to cross, and what a maker earns for standing between the two sides. Wide spreads on markets with real volume are the opportunity: the book you see is what your quotes would be competing against, and there is currently a lot of room in it.

If you want the same data programmatically, this is the join the page sends. Market-wide channels accept it on an unsigned connection, as long as the handshake sends a User-Agent header. Your account channels need a signed one (see WebSocket channels):

["1", "1", "market:<market_id>", "phx_join", {}]

The join reply carries the whole book, recent_trades, volume_24h and last_traded_price. See WebSocket channels for the frame format and the order book channel for the update events.

Everything else, from placing orders to your positions and fills, is signed. That is Quick Start.

v1.5.9Changelogllms.txtllms-full.txt