Synpath
Tick-level Data

Get trades

Every recorded trade in a time window, with the intervals the recorder covered.

POST/v1/trades/rangehosted · Synpath API key

Hosted by Synpath. Authentication: Authorization: Bearer <Synpath API key>. Venue coverage: Kalshi.

Returns all trades whose recorder receive time falls in [start_ms, end_ms), oldest first, in the YES price. Each trade carries the venue's execution time where the venue supplied one.

coverage lists the intervals the recorder was listening; an empty result inside an available interval means no trades occurred, while an unavailable interval means nothing is known. Windows are at most one hour, and a window with more trades than limit answers 413 rather than a partial page. next_cursor is always null.

Request body

NameTypeDescription
market_idstringSynpath market id, venue:native.
start_msintegerWindow start, inclusive, Unix milliseconds.
end_msintegerWindow end, exclusive. At most one hour after start_ms.
limitinteger
default 1000
Maximum trades to return, up to 10000. Exceeding it answers 413.

Response fields

NameTypeDescription
metadata.dataset_versionstringProcessed dataset the answer was read from. Pin it when comparing answers.
metadata.time_basisstringrecorder_receive: every timestamp below is the time the recorder received the event.
trades[].price, amount, sideAs on List trades: YES price, contracts, and the taker's side on the YES leg.
trades[].timestampintegerExecution time: the venue's when it supplied one, else the recorder's.
trades[].timestamp_sourcestringvenue or recorder_fallback: where timestamp came from.
trades[].observed_at_msintegerRecorder receive time. The window is filtered on this.
coverage[].start_ms, end_msintegerAn interval of the window.
coverage[].statusstringavailable or unavailable.
coverage[].reasonstringWhy an interval is unavailable.

Response

200 with the trades and the coverage. 413 when the trades exceed limit.

import synpath

trades = synpath.fetch_trades_range("kalshi:KXQUANTUM-30", 1789505999000, 1789509599000)
for t in trades.trades:
    print(t.datetime, t.side, t.price, t.amount, t.timestamp_source)
print([(c.status, c.reason) for c in trades.coverage])
200
{
  "metadata": {
    "dataset_version": "processed-v1-623446e80ca97c2b",
    "time_basis": "recorder_receive",
    "processed_through_ms": 1789725040929
  },
  "market_id": "kalshi:KXQUANTUM-30",
  "start_ms": 1789505999000,
  "end_ms": 1789509599000,
  "trades": [
    {
      "id": "0722fcf3-4e49-8b90-bb6f-5f402b4c5d55",
      "market_id": "kalshi:KXQUANTUM-30",
      "timestamp": 1789509412008,
      "datetime": "2026-09-16T21:56:52.008000Z",
      "price": 0.34,
      "amount": 25,
      "side": "buy",
      "info": {
        "...": "the venue's payload"
      },
      "observed_at_ms": 1789509412141,
      "timestamp_source": "venue"
    }
  ],
  "coverage": [
    {
      "start_ms": 1789505999000,
      "end_ms": 1789509599000,
      "status": "available",
      "reason": null
    }
  ],
  "next_cursor": null
}