Market Data
Every endpoint on this page is public and needs no authentication. The shapes below are the payload of the response envelope. Endpoints that take a tokenId expect the decimal token ID of one outcome, as listed in the market's tokens array.
Server Time
GET /time returns the server time in Unix seconds as an integer payload. Use it to keep POLY_TIMESTAMP within the 30-second window.
Markets
| Endpoint | Returns |
|---|---|
GET /markets | A page of markets, newest first, including closed and resolved markets. Paginated with nextCursor |
GET /markets/{conditionId} | One market. Returns 404 if no market has that condition ID |
A market object:
{
"conditionId": "0x...",
"questionId": "0x...",
"question": "...",
"description": "...",
"image": "...",
"endDateIso": "2026-12-31T00:00:00Z",
"tokens": [
{ "tokenId": "1234...", "outcome": "YES", "winner": false },
{ "tokenId": "5678...", "outcome": "NO", "winner": false }
],
"minimumOrderSize": 0.01,
"minimumTickSize": 0.01,
"active": true,
"closed": false,
"acceptingOrders": true,
"negRisk": false,
"makerBaseFee": 0,
"takerBaseFee": 0
}active and acceptingOrders are true only while the market is active, and closed is their inverse. The values in the example are illustrative.
Market Parameters
| Endpoint | Response |
|---|---|
GET /tick-size?tokenId= | {"minimumTickSize":<number>} |
GET /neg-risk?tokenId= | {"negRisk":false}. Starzip markets are not negative-risk markets |
GET /fee-rate?tokenId= | {"baseFee":<bps>}, the market's taker fee rate in basis points. Every order must carry this value in feeRateBps. The rate can change, so read it just before you sign |
A tokenId that is not a decimal string returns 400. An unknown token returns 404.
Order Book
| Endpoint | Behavior |
|---|---|
GET /book?tokenId= | The book for one token |
POST /books | Body [{"tokenId":"..."}, ...] with 1 to 500 tokens. Returns an array of books. If any token is unknown, the whole request returns 404. If the requested books hold more than 50,000 price levels in total, it returns 400; ask for fewer tokens |
{
"market": "0x<conditionId>",
"assetId": "<tokenId>",
"timestamp": "1760000000000",
"hash": "<sha1 hex>",
"bids": [ { "price": "0.48", "size": "120" } ],
"asks": [ { "price": "0.52", "size": "80" } ],
"minOrderSize": "1",
"tickSize": "0.01",
"negRisk": false,
"lastTradePrice": "0.5"
}timestampis in Unix milliseconds.- Bids are in ascending price order and asks in descending order, so the best price is the last entry of each list, not the first.
- The book merges orders on both outcomes of the market. A BUY order for the other outcome at price p appears here as an ask at 1 - p, and a SELL order for the other outcome at p appears as a bid at 1 - p. Sizes at the same price are summed.
lastTradePriceis"0.5"until the token has traded.
order books are loading, retry shortly for a short time after the service starts. Retry after a brief wait.Prices
| Endpoint | Response | Notes |
|---|---|---|
GET /price?tokenId=&side= | {"price":"0.48"} | side=BUY returns the best bid. side=SELL returns the best ask. Returns 404 if that side of the book is empty |
GET /midpoint?tokenId= | {"mid":"0.50"} | Needs both a bid and an ask, otherwise 404 |
GET /spread?tokenId= | {"spread":"0.04"} | Needs both a bid and an ask, otherwise 404 |
GET /last-trade-price?tokenId= | {"price":"0.5","side":""} | Before the first trade, price is "0.5" and side is empty |
Price History
GET /prices-history returns the price series of one outcome token, oldest first, for charts and backtests.
| Parameter | Meaning |
|---|---|
market | Required. A token ID, not a condition ID |
interval | One of 1h, 6h, 1d, 1w, 1m, max, all, counted back from now |
startTs, endTs | Unix seconds. Start is inclusive, end is exclusive. Use these or interval, not both |
fidelity | Minutes per point, default 1 |
{ "history": [ { "t": 1760000000, "p": 0.48 }, { "t": 1760000060, "p": 0.49 } ] }- With no interval and no range, the full history is returned.
- A request that would return more than 10,000 points is rejected with 400. Raise fidelity or narrow the range.
Indices
PoR markets resolve on published spending indices. These endpoints return the index definitions, release schedule, and monthly values.
| Endpoint | Returns |
|---|---|
GET /indices | Active indices ordered by code. Optional filters code and country. Each index carries its source agency, latest and next release, and the last 24 months of values |
GET /indices-history?code= | Monthly values of one index, oldest first. Optional from and to as YYYY-MM; the default is the 24 months ending this month |
{
"code": "<index code>",
"history": [
{ "period": "2026-06", "value": "...", "yoy": "...", "release": null }
]
}yoyis the year-over-year change in percent as a decimal string, or empty when there is no value a year earlier.- A release has a
statusofSCHEDULED,RELEASED,DELAYED, orINVALID, withscheduledAtandreleasedAt. /indicesreturns an empty array when no index matches./indices-historyreturns 404 for an unknown code.