Trades
Venue prints — trades that actually happened — keyed to the same positions as liquidity. Where a quote says what you could buy, a print says what somebody did buy, at what price and size, and on which venue.
What a trade is
Each print is attributed to the router position the taker took, with the same position_hash that depth and signals use, and the same liquidity_hash as the venue's quote — so a print joins to the quote it hit with no translation.
taker_actionis what the aggressive side did toposition_hash. On a binary venue that reports the side the taker ended up long, a print is abuyof that side when it is a linked position — and asellof the linked complement when only the other side of the market is linked (buying NO at 0.43 is selling YES at 0.57).notional_usdis size × the price of the position the row names, for buys and sells alike — the size that compares across venues (venue contract units differ and are often fractional). It is position value, not the taker's cash.is_blockmarks a print the venue flagged as a negotiated, off-book block.trader_idis the venue's public identity for the trader where one exists (a wallet) andnullwhere the venue publishes none.
whale_trade, trade_burst, flow_imbalance and others — ride signals:read on the Signals feed; this page is the raw tape./flow/v1/tradesPrints, newest first. Either contest_id or position_hash is required, and the window is bounded: since defaults to one hour ago and may reach back at most seven days. Requires trades:read.
| Name | In | Type | Required | Description |
|---|---|---|---|---|
| contest_id | query | string | no | One contest. This or position_hash is required |
| position_hash | query | string | no | One position (6-part hash, as on depth and signals) |
| partner | query | string | no | One venue, by partner id or name |
| since | query | string | no | ISO-8601. Default one hour ago; at most 7 days back |
| until | query | string | no | ISO-8601, exclusive |
| min_notional_usd | query | string | no | Only prints at least this large |
| limit | query | integer | no | Max 1000 |
/flow/v1/trades?limit=100One contest. This or position_hash is required
One position (6-part hash, as on depth and signals)
One venue, by partner id or name
ISO-8601. Default one hour ago; at most 7 days back
ISO-8601, exclusive
Only prints at least this large
Max 1000
[
{
"partner_id": "pg-…",
"partner_name": "Kalshi",
"venue_trade_id": "07252f3d-4119-b0c4-3297-9292f112bfa9",
"venue_market_id": "KXNFLGAME-26OCT04DETCAR-CAR",
"liquidity_hash": "pg-…:ct_abc:mk_ml:side_home:var_0:p_car:tf_full",
"position_hash": "ct_abc:mk_ml:side_home:var_0:p_car:tf_full",
"router_contest_id": "ct_abc",
"router_market_id": "mk_ml",
"taker_action": "buy",
"price": 0.57,
"size_contracts": 45.98,
"notional_usd": 26.21,
"is_block": false,
"trader_id": null,
"trader_id_kind": null,
"executed_at": "2026-10-05T01:21:03.970Z"
}
]
Streaming
Subscribe to the trades channel on the stream with the contests you want. It requires contest_ids (an unfiltered subscription would be every print on every venue) and trades:read + stream:realtime. Each event carries new prints only — it is a delta, never a snapshot.
{ "action": "subscribe", "channel": "trades",
"contest_ids": ["ct_abc"], "min_notional_usd": 500 }
{ "type": "trades", "contest_id": "ct_abc",
"trades": [ /* the same shape GET /flow/v1/trades returns */ ],
"timestamp": "2026-10-05T01:21:05.012Z" }