Synpath
Historical Market Data

List OHLCV

OHLCV bars in the YES price, labelled with where the prices came from.

GET/venues/{venue}/markets/{market_id}/candlesself-hosted · no auth

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

NameTypeDescription
venuestringVenue id: kalshi, polymarket or polymarket_us.
market_idstringA Synpath id (kalshi:KXFOO-25, polymarket:2252244) or this venue's own id. Another venue's id is refused.

Query parameters

NameTypeDescription
timeframestring
default 1h
Bar length: 1m, 5m, 1h, 1d, per venue.
sinceintegerMilliseconds since epoch. With it, bars are read forward from here and the first limit are returned. Without it, the newest limit bars.
untilintegerMilliseconds since epoch.
limitinteger
default 100
Rows per page, up to 1000.
cursorstringnext_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)
200
{
  "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
}