Why every arb carries an executable size
A price on its own does not tell you how much you can trade at it. A book can show a tempting ask with one contract behind it and nothing underneath. An arb computed on the top of book alone looks great and fills almost none of your size.
So we size every opportunity to the depth that is actually there. The max_stake field is the largest amount both legs can fill at once. The edge_pct is the return left after walking each book down to that size, net of venue fees. Read together, they tell you the trade and how big it can be.
Here is the shape of it on a two-way arb:
{
"edge_pct": 1.83,
"max_stake": 240,
"legs": [
{ "venue": "kalshi", "outcome": "KC", "ask": 0.52, "book_depth_at_ask": 240 },
{ "venue": "polymarket", "outcome": "BUF", "ask": 0.46, "book_depth_at_ask": 310 }
]
}
The Kalshi leg has 240 of depth and the Polymarket leg has 310, so the pair can fill 240 before the cheaper price runs out. The 1.83 percent is what survives after the fees on both sides. If the edge held only for the first contract, max_stake would say so, and you would know to skip it.
This example predates the v2 API and uses field names since renamed; see the quickstart for the current shape.
The full field list is in the Opportunity object reference.
More from the blog
USA vs Belgium: two goals two minutes apart, priced in opposite order
A World Cup equalizer and the goal that answered it two minutes later moved Kalshi and Polymarket in opposite order. The two books did not agree on Belgium's price for about six minutes.
A mispricing between Kalshi and Polymarket lasts about 10 seconds
We measured how long price gaps between Kalshi and Polymarket stay open before the two books converge. Half close within about nine seconds.
Argentina vs Egypt: Kalshi followed Polymarket within seconds
We checked whether the price gaps between Kalshi and Polymarket on Argentina-Egypt were a real trading opportunity. Against the volume moving through that exact market, they were not.