@@ -27,8 +27,11 @@ Auth required throughout.
2727| ` quotes.get(quote_id) ` | ` GET /communications/quotes/{quote_id} ` |
2828| ` quotes.create(...) ` | ` POST /communications/quotes ` |
2929| ` quotes.delete(quote_id) ` | ` DELETE /communications/quotes/{quote_id} ` |
30- | ` quotes.accept(quote_id, *, accepted_side) ` | ` POST /communications/quotes/{quote_id}/accept ` |
31- | ` quotes.confirm(quote_id) ` | ` POST /communications/quotes/{quote_id}/confirm ` |
30+ | ` quotes.accept(quote_id, *, accepted_side) ` | ` PUT /communications/quotes/{quote_id}/accept ` |
31+ | ` quotes.confirm(quote_id) ` | ` PUT /communications/quotes/{quote_id}/confirm ` |
32+ | ` block_trade_proposals.list(...) ` / ` block_trade_proposals.list_all(...) ` | ` GET /communications/block-trade-proposals ` |
33+ | ` block_trade_proposals.create(...) ` | ` POST /communications/block-trade-proposals ` |
34+ | ` block_trade_proposals.accept(block_trade_proposal_id, *, subtrader_id=None, subaccount=None) ` | ` POST /communications/block-trade-proposals/{id}/accept ` |
3235
3336` get_id() ` returns your ` participant_id ` — the value you'll pass as
3437` quote_creator_user_id ` / ` rfq_creator_user_id ` when filtering lists. It stays
@@ -114,6 +117,26 @@ for rfq in client.communications.rfqs.list_all(user_filter="self"):
114117server-side shorthands like ` "organization" ` in the future without an SDK
115118upgrade.
116119
120+ ## Filtering quotes by time (v4.1.0)
121+
122+ ` quotes.list() ` / ` quotes.list_all() ` accept ` min_ts ` and ` max_ts ` (Unix
123+ seconds, ` int ` ) to bound results by the quote's last-updated timestamp. They
124+ compose with the required user-id filter:
125+
126+ ``` python
127+ import time
128+
129+ # Quotes you made that were updated in the last hour.
130+ for q in client.communications.quotes.list_all(
131+ user_filter = " self" ,
132+ min_ts = int (time.time()) - 3600 ,
133+ ):
134+ print (q.quote_id, q.updated_ts)
135+ ```
136+
137+ ` min_ts ` / ` max_ts ` are also accepted by the deprecated ` list_quotes ` /
138+ ` list_all_quotes ` forwarders.
139+
117140## Post-only quotes
118141
119142` quotes.create() ` accepts ` post_only=True ` (added in v2.1.0) to ensure your
@@ -148,6 +171,44 @@ client.communications.quotes.create(
148171` open ` , ` accepted ` , ` confirmed ` , ` canceled ` . Status filtering accepts these
149172literal strings.
150173
174+ ## Block trade proposals (v4.1.0)
175+
176+ ` client.communications.block_trade_proposals ` backs the
177+ ` /communications/block-trade-proposals ` API (OpenAPI 3.21.0) — a bilateral
178+ negotiated trade that both the buyer and seller must accept before it settles.
179+
180+ ``` python
181+ # Propose a block trade. The proposer names both sides explicitly.
182+ resp = client.communications.block_trade_proposals.create(
183+ buyer_user_id = " user_abc" ,
184+ seller_user_id = " user_xyz" ,
185+ market_ticker = " KXPRES-24-DJT" ,
186+ price_centi_cents = 5600 , # plain int, centi-cents (NOT a _dollars price)
187+ centicount = 50_000 , # plain int, centicounts (NOT a _fp count)
188+ maker_side = " yes" ,
189+ expiration_ts = " 2026-07-01T00:00:00Z" ,
190+ )
191+ proposal_id = resp.block_trade_proposal_id
192+
193+ # List open proposals on a market.
194+ for proposal in client.communications.block_trade_proposals.list_all(
195+ market_ticker = " KXPRES-24-DJT" , status = " open"
196+ ):
197+ print (proposal.id, proposal.buyer_accepted, proposal.seller_accepted)
198+
199+ # Accept (the counterparty side). The body is optional — pass subtrader_id
200+ # or subaccount only if you trade through a sub-trader / subaccount.
201+ client.communications.block_trade_proposals.accept(proposal_id)
202+ ```
203+
204+ !!! info "Prices are centi-cents, counts are centicounts — plain integers"
205+ Unlike the rest of the SDK, ` BlockTradeProposal.price_centi_cents ` and
206+ ` .centicount ` (and the matching ` create() ` kwargs) are ** plain ` int ` s** in
207+ centi-cents and centicounts respectively — they are * not*
208+ ` FixedPointDollars ` / ` _fp ` wire fields, so no ` Decimal ` conversion or
209+ ` _dollars ` / ` _fp ` aliasing applies. ` price_centi_cents ` and ` centicount `
210+ must each be ` >= 1 ` .
211+
151212## Migrating from v2.x
152213
153214| v2.x (deprecated) | v3.0.0 (canonical) |
@@ -181,6 +242,10 @@ literal strings.
181242 options:
182243 heading_level: 3
183244
245+ ::: kalshi.resources.communications.BlockTradeProposalsResource
246+ options:
247+ heading_level: 3
248+
184249::: kalshi.resources.communications.AsyncCommunicationsResource
185250 options:
186251 heading_level: 3
@@ -192,3 +257,7 @@ literal strings.
192257::: kalshi.resources.communications.AsyncQuotesResource
193258 options:
194259 heading_level: 3
260+
261+ ::: kalshi.resources.communications.AsyncBlockTradeProposalsResource
262+ options:
263+ heading_level: 3
0 commit comments