List OHLCV
OHLCV bars in the YES price, labelled with where the prices came from.
Self-hosted. Served by synpath serve on your own machine or host, which must be running. Nothing on this page runs on Synpath's servers.
Read price_source on every bar before using it. trade means executions. bid_ask_mid means nothing traded in that period and the bar is the book's midpoint. sampled_mid means the venue publishes no candles at all and these were bucketed from price samples; those carry volume: null, because null is not zero.
Kalshi accepts 1m, 1h and 1d only and refuses anything else rather than rounding to a period you did not ask for.
To read a long history, pass since, then pass each next_cursor as cursor until it is null. Each page takes about a second.
How far back: Kalshi bars start at the market's open, for settled markets too; a window longer than Kalshi's 5,000 bars per request is fetched in several requests and joined. Polymarket bars are built from its trade tape and reach as far back as List trades does. Polymarket US daily bars start at the market's listing.
Path parameters
| Name | Type | Description |
|---|---|---|
venue | string | Venue id: kalshi, polymarket or polymarket_us. |
market_id | string | A Synpath id (kalshi:KXFOO-25, polymarket:2252244) or this venue's own id. Another venue's id is refused. |
Query parameters
| Name | Type | Description |
|---|---|---|
timeframe | stringdefault 1h | Bar length: 1m, 5m, 1h, 1d, per venue. |
since | integer | Milliseconds since epoch. With it, bars are read forward from here and the first limit are returned. Without it, the newest limit bars. |
until | integer | Milliseconds since epoch. |
limit | integerdefault 100 | Rows per page, up to 1000. |
cursor | string | next_cursor from the previous page of a read with since. |
Response
A page of candles. With since, next_cursor continues after the last bar; it is null on the last page, and always null without since.
import synpath
client = synpath.Client()
candles = client.fetch_ohlcv("polymarket:2252244", timeframe="1h", limit=24)
for c in candles:
print(c.datetime, c.open, c.close, c.price_source){
"data": [
{
"timestamp": 1789383600000,
"datetime": "2026-09-14T11:00:00Z",
"open": 0.11,
"high": 0.11,
"low": 0.11,
"close": 0.11,
"volume": null,
"trade_count": null,
"price_source": "bid_ask_mid",
"bid_close": 0.1,
"ask_close": 0.12,
"info": {
"...": "the venue's payload"
}
},
{
"timestamp": 1789408800000,
"datetime": "2026-09-14T18:00:00Z",
"open": 0.11,
"high": 0.11,
"low": 0.11,
"close": 0.11,
"volume": null,
"trade_count": null,
"price_source": "bid_ask_mid",
"bid_close": 0.1,
"ask_close": 0.12,
"info": {
"...": "the venue's payload"
}
}
],
"next_cursor": null,
"count": 2
}
