Professional execution, position, and P&L tooling, wired to every venue you trade.
# pip install rivermarkets. Ed25519-signed, sub-account aware. from rivermarkets import RiverMarkets client = RiverMarkets(key_id=KEY_ID, private_key=PRIV) # Same call, every market. order = client.orders.create_order( subaccount_id="macro-book", river_id=4552150, # KXFEDDECISION-26JUN-C25 order_type="LIMIT", time_in_force="GTC", buy_flag=True, price=0.27, qty=100, ) print(f"resting → {order.river_order_id}")
from rivermarkets import RiverMarkets from rivermarkets.types import IcebergOrderParams client = RiverMarkets(key_id=KEY_ID, private_key=PRIV) order = client.complex_orders.create_complex_order( subaccount_id="macro-book", river_id=4552150, iceberg_order_params=IcebergOrderParams( buy_flag=True, total_qty=1_000, displayed_qty=50, # show 50 at a time limit_price=0.42, post_only=True, # maker-only on every tranche ), )
from rivermarkets import AsyncRiverMarkets client = AsyncRiverMarkets(key_id=KEY_ID, private_key=PRIV) async with client.realtime.orderbooks([6003721, 8927]) as stream: async for msg in stream: if msg.type in ("snapshot", "update"): print(msg.river_id, msg.data["best_bid_price"], msg.data["best_ask_price"]) elif msg.type == "error": print(msg.code, msg.message)
Sign locally, place anywhere. REST + WebSockets, sync and async. Integrate once, not per venue.
river_ids, our standardized numeric identifier for every contract on every venue.One river_id per contract, across every venue.rivermarkets package. Sync and async clients, fully typed. More languages on request.rivermarkets. Sync + async, fully typed. More languages on request.Live on Kalshi, Polymarket, and Polymarket US. Novig and Rothera in integration.
Execution, routing, settlement, P&L, handled across every venue.
Book a 30-minute demo.