Get trades
Every recorded trade in a time window, with the intervals the recorder covered.
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
| Name | Type | Description |
|---|---|---|
market_id | string | Synpath market id, venue:native. |
start_ms | integer | Window start, inclusive, Unix milliseconds. |
end_ms | integer | Window end, exclusive. At most one hour after start_ms. |
limit | integerdefault 1000 | Maximum trades to return, up to 10000. Exceeding it answers 413. |
Response fields
| Name | Type | Description |
|---|---|---|
metadata.dataset_version | string | Processed dataset the answer was read from. Pin it when comparing answers. |
metadata.time_basis | string | recorder_receive: every timestamp below is the time the recorder received the event. |
trades[].price, amount, side | | As on List trades: YES price, contracts, and the taker's side on the YES leg. |
trades[].timestamp | integer | Execution time: the venue's when it supplied one, else the recorder's. |
trades[].timestamp_source | string | venue or recorder_fallback: where timestamp came from. |
trades[].observed_at_ms | integer | Recorder receive time. The window is filtered on this. |
coverage[].start_ms, end_ms | integer | An interval of the window. |
coverage[].status | string | available or unavailable. |
coverage[].reason | string | Why 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]){
"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
}
