Cross-venue arbitrage
Arbitrage
Cross-venue arbitrage
Find risk-free cross-venue arbitrage opportunities, live from real-time order books.
GET
Cross-venue arbitrage
Find markets where buying YES on one venue and NO on another costs less than 1 dollar combined. The gap is risk-free profit. Prices and order books are live — recomputed continuously from real-time venue WebSocket feeds (Kalshi, Polymarket, Opinion), not a periodic snapshot.
Each venue block includes execution-ready identifiers you can pass directly to the venue’s trading API:
Parameters
Minimum net profit after fees, in cents.
When
true, attaches each leg’s live ask ladder (top 25 levels) under orderbook, so you can size an order without a second call.Deprecated and ignored. The legacy endpoint used it as a staleness window; the live cache is always current, so it has no effect. Accepted only for backwards compatibility.
Example
Response
A JSON array of opportunities, sorted bynet_cents (highest first). An empty array means there are no current opportunities at or above your threshold. net_cents is your per-contract profit after all fees.
The opportunity tells you the trade directly: buy YES on buy_yes_market, buy NO on buy_no_market. yes_leg / no_leg give the exact (market, identifier, book_side) to hit for each side.
gross_cents / fee_cents / net_cents are the top-of-book economics (per contract): net_cents = round((1 − (best_yes_ask + best_no_ask)) × 100) − fees. executable_size and max_profit_dollars are the depth-aware answer to “how much can I actually take, and what’s it worth?” — they walk both legs’ ask ladders together: at each price level they fill the smaller of the two available sizes, add (level_net_after_fees / 100) × size to the profit, and advance until a level pair is no longer profitable after fees (or the ladders run out). So executable_size is the total fillable contracts and max_profit_dollars the summed profit across all profitable levels.
max_profit_dollars is a conservative floor, not a guarantee. It only considers the top 25 levels, so true fillable depth beyond that isn’t counted. Fees are applied per level using the same per-venue rates as net_cents (Kalshi sector taker, Polymarket per-market feeSchedule.rate, Opinion topic rate + floor). It does not model slippage from latency, partial fills, or order-placement minimums — size against executable_size and the attached orderbook, not blindly.- Kalshi —
market_tickeris the ticker accepted by Kalshi’s trade API. - Polymarket —
condition_idis the on-chain condition;yes_token_id/no_token_idare the CLOB token IDs for placing orders. - Opinion —
child_market_idis the categorical child market ID;yes_token_id/no_token_idare the trading-side token IDs.
Prices and order books are real-time; volume and liquidity refresh roughly hourly. Opinion does not expose 24h volume or liquidity, so
volume_24h and liquidity are null for Opinion legs. timestamp is when the opportunity was last recomputed.orderbook is only present when you pass orderbook=true. It carries the top 25 ask levels per leg — ask side only (the price ladder to buy that outcome).