Trades

GET /flow/v1/trades · channel: trades · trades:read
Soon

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_action is what the aggressive side did to position_hash. On a binary venue that reports the side the taker ended up long, a print is a buy of that side when it is a linked position — and a sell of 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_usd is 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_block marks a print the venue flagged as a negotiated, off-book block.
  • trader_id is the venue's public identity for the trader where one exists (a wallet) and null where the venue publishes none.
Rolling out venue by venue. Prints appear for a venue once its trade feed is switched on. A venue that does not publish its trades will never appear here. Signals built from prints — whale_trade, trade_burst, flow_imbalance and others — ride signals:read on the Signals feed; this page is the raw tape.
GET/flow/v1/trades

Prints, 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.

NameInTypeRequiredDescription
contest_idquerystringnoOne contest. This or position_hash is required
position_hashquerystringnoOne position (6-part hash, as on depth and signals)
partnerquerystringnoOne venue, by partner id or name
sincequerystringnoISO-8601. Default one hour ago; at most 7 days back
untilquerystringnoISO-8601, exclusive
min_notional_usdquerystringnoOnly prints at least this large
limitqueryintegernoMax 1000
Try it
GET/flow/v1/trades?limit=100

One 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

Response.data
[
  {
    "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.

Subscribe
{ "action": "subscribe", "channel": "trades",
  "contest_ids": ["ct_abc"], "min_notional_usd": 500 }
Event
{ "type": "trades", "contest_id": "ct_abc",
  "trades": [ /* the same shape GET /flow/v1/trades returns */ ],
  "timestamp": "2026-10-05T01:21:05.012Z" }