Prediction markets
Sona serves two kinds of Polymarket data. The history routes read one closed snapshot of Polymarket's full order-book history. The live routes show what Polymarket is trading now. Sona also records four other venues, described under Other venues. The routes are not chain-scoped.
History
The history ends at Polygon block 85,948,288, 2026-04-24 07:43:40 UTC. Trades after it are not included, and a market that resolved after it counts as open. /v1/pm/status shows whether the dataset is loaded, when it was built and its totals.
Every history answer carries data.coverage with the source (Envio's public Polymarket dataset, licence CC BY 4.0), an attribution line and a modified notice that Sona changed the rows and is not affiliated with Polymarket or Envio. Keep both wherever you show the data.
Answers are finalized, meta.as_of["eip155:137"] repeats the last block, and answers are kept for 10 minutes. Amounts are objects with raw, decimals, symbol and value, and a loss is negative.
curl -s "https://api.sonaintel.com/v1/pm/status"Traders
The record of one wallet. The wallet is 0x and 40 hex digits in any case, answered in lowercase.
curl -s "https://api.sonaintel.com/v1/pm/traders/0x467ecfc0c6265683e90899C41881c0431bDEE2ed"| Part | Meaning |
|---|---|
| Activity | Fills, markets, volume, first and last trade |
| Profit and loss | Lifetime result in USDC with fees taken off |
skill | A skill rating with a calibration curve. Empty for a wallet with too few resolved markets. |
| Wash check | A wash-trading verdict with the trades behind any flag |
A wallet with no fills in the data answers 404 not_found.
Leaderboards
/v1/pm/leaderboards/{board} ranks wallets. limit is 1 to 100 (default 50) and offset is 0 to 10000, and the first row of a page has the rank offset + 1.
curl -s "https://api.sonaintel.com/v1/pm/leaderboards/pnl?limit=5"| Board | Ranks by |
|---|---|
pnl | Net profit |
volume | USDC volume |
skill | The lower bound of the forecasting edge, rated wallets only |
| Row field | Meaning |
|---|---|
rank, wallet | Position and address |
fills, markets, volume | Activity |
realized, final | Realized result in USDC. final is true when the wallet has no open unresolved position, so realized will not change. |
wash_share | The flagged part of the shares the wallet traded against other wallets, from 0 to 1 |
skill | Rating, null unless the wallet is rated |
total is the size of the whole board.
Calibration
Whether market prices were honest. data.buckets has twenty price buckets of width 0.05. Each holds the number of markets, their mean price and the share that came true (observed). A well calibrated market has observed close to mean_price. brier is the mean squared gap between price and outcome, and lower is better.
curl -s "https://api.sonaintel.com/v1/pm/calibration?horizon=1d&market_kind=all"| Parameter | Values |
|---|---|
horizon | How long before resolution the price is taken: 4h, 12h (default), 1d, 1w |
market_kind | other (default, ordinary markets), updown (short Up or Down markets), unknown, all |
Live routes
These two routes show the present. They have no coverage object, their meta.finality is none, their dollar amounts are plain JSON numbers instead of ledger objects, and answers are kept for 30 seconds. Sona refreshes them once a minute, so a list can trail Polymarket by about a minute. data.fetched_at says when Sona took the copy, and data.stale is true when Polymarket could not be reached and this is the last good copy.
Top markets
The active events with the most trading in the last 24 hours, busiest first. limit is 1 to 50, default 20.
curl -s "https://api.sonaintel.com/v1/pm/markets/top?limit=3"An event has event_id, slug, title, volume_24h_usd, volume_total_usd, liquidity_usd, end_date and up to 10 open markets. A market is a question, its label (Polymarket's short name for it within the event, such as a candidate, empty for the main market of a game), its outcomes (the name of each outcome) and outcome_prices, one price from 0 to 1 per outcome in the same order, with Yes first on a Yes or No market.
Large trades
Recent trades worth at least $10,000, newest first. limit is 1 to 100 (default 50). min_usd raises the floor above $10,000, and a high floor can give a short or empty list. Sona keeps the newest 200 trades.
curl -s "https://api.sonaintel.com/v1/pm/trades/large?limit=3"An item has tx, time, wallet (Polymarket's proxy wallet), question, side (BUY or SELL), outcome, size in shares, price per share from 0 to 1 and usd, the size times the price rounded to cents.
Polymarket's live data is not affiliated with Sona.
Other venues
Besides Polymarket, Sona records Kalshi, Polymarket US, Hyperliquid HIP-4 and Levr Bet. The venue query parameter picks one on the top markets, large trades, trader and leaderboard routes. polymarket is the default, so a call without it answers as before. /v1/pm/venues lists the venues, when recording of each started and what it records.
curl -s "https://api.sonaintel.com/v1/pm/venues"| Venue | venue | Top markets | Large trades | Traders and boards | History |
|---|---|---|---|---|---|
| Polymarket | polymarket | Yes | From $10,000 | pnl, volume, skill | No |
| Kalshi | kalshi | Yes | From $10,000, no wallets | No trader ids | Yes |
| Polymarket US | polymarket-us | Yes, ranked by total volume | No | No trader ids | Yes |
| Hyperliquid HIP-4 | hyperliquid | Yes | From $1,000 | pnl, volume, skill | Yes |
| Levr Bet | levr | No | No | pnl, volume | No |
A route that does not serve a venue answers 400 invalid_query. A venue answer is read from what Sona's collector recorded, so it has no block: meta.finality is none and meta.as_of is empty. In place of the Polymarket coverage it carries data.coverage with venue, since, last_ok, mode, wallets, gaps and a note on what is not recorded. There is no data from before since. Venue answers are kept for 30 seconds.
Venue markets and trades
With a venue, a top market is a VenueMarket with market_id, title, status, result, close_time, yes_price, volume_usd, open_interest_usd, volume_24h_usd and as_of. A figure the venue does not report is null, never 0. Polymarket US reports no 24-hour volume, so its list is ranked by total volume.
curl -s "https://api.sonaintel.com/v1/pm/markets/top?venue=kalshi&limit=3"A large trade is a VenueTrade with id, time, market_id, question, side, wallet, size, yes_price and usd. Each venue has its own floor in dollars, $10,000 on Kalshi as on Polymarket and $1,000 on Hyperliquid, whose fills are smaller. min_usd can raise the floor, a value below it answers 400 invalid_query, and data.min_usd says which floor the answer applied. Kalshi publishes no trader ids, so wallet is null, and its side is yes or no, the side the taker paid for. A Hyperliquid side is buy or sell of the Yes coin, in lowercase.
curl -s "https://api.sonaintel.com/v1/pm/trades/large?venue=hyperliquid&limit=3"Venue traders and leaderboards
With venue=hyperliquid the trader route answers a pm_trader with a venue field and the activity, profit and loss and skill of the recorded HIP-4 fills, without the owner, wash check or calibration. With venue=levr it answers a pm_levr_trader with the wallet's leveraged positions: positions, open, won, lost, liquidated, voided, stake, size, leverage, win_rate, liquidation_rate, realized, first_position and last_position. Kalshi and Polymarket US have no trader ids, and a wallet a venue has not recorded answers 404 not_found.
curl -s "https://api.sonaintel.com/v1/pm/leaderboards/pnl?venue=levr&limit=3"Hyperliquid has the pnl, volume and skill boards. Levr Bet has pnl and volume, where volume ranks the size of the positions opened, and skill answers 400 invalid_id.
Market history
/v1/pm/markets/{venue}/{id}/history charts one Kalshi, Polymarket US or Hyperliquid market from what Sona recorded. The id is the market_id of the top markets route. A Hyperliquid id starts with #, which a URL cannot carry, so write it %23.
curl -s "https://api.sonaintel.com/v1/pm/markets/hyperliquid/%23111390/history?limit=3"On Kalshi and Polymarket US a point is a snapshot with the Yes price, the volume, the open interest and the 24-hour volume. Kalshi is snapshotted only for its 500 markets with the most 24-hour volume, so a quieter market has few points or none. On Hyperliquid a point is the last trade price of a 5 minute bucket, and the volume fields are null. Points run oldest first from since (the last 24 hours by default) and are cut to limit, 1 to 1000 and 200 by default. data.market repeats what the venue says about the market, with result set once it has settled. Polymarket and Levr Bet have no history, and a market that was never recorded answers 404 not_found.
Reference pages: Polymarket endpoints.