Cross-venue arbitrage
curl --request GET \
--url https://api.probsights.com/v1/arbitrage/current \
--header 'X-API-Key: <api-key>'import requests
url = "https://api.probsights.com/v1/arbitrage/current"
headers = {"X-API-Key": "<api-key>"}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {'X-API-Key': '<api-key>'}};
fetch('https://api.probsights.com/v1/arbitrage/current', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));{
"event_id": "<string>",
"interval_code": "<string>",
"buy_yes_market": "<string>",
"buy_no_market": "<string>",
"gross_cents": 123,
"fee_cents": 123,
"net_cents": 123,
"roi_percent": 123
}Arbitrage
Cross-venue arbitrage
Find fee-adjusted Kalshi ↔ Polymarket arbitrage opportunities.
GET
/
v1
/
arbitrage
/
current
Cross-venue arbitrage
curl --request GET \
--url https://api.probsights.com/v1/arbitrage/current \
--header 'X-API-Key: <api-key>'import requests
url = "https://api.probsights.com/v1/arbitrage/current"
headers = {"X-API-Key": "<api-key>"}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {'X-API-Key': '<api-key>'}};
fetch('https://api.probsights.com/v1/arbitrage/current', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));{
"event_id": "<string>",
"interval_code": "<string>",
"buy_yes_market": "<string>",
"buy_no_market": "<string>",
"gross_cents": 123,
"fee_cents": 123,
"net_cents": 123,
"roi_percent": 123
}Cross-exchange BTC interval arbitrage scanner (Kalshi ↔ Polymarket). Returns a
JSON array sorted by
net_cents descending.
Pairs active windows on matching interval_code values (5m, 15m, 1h, 24h,
1w) and returns fee-adjusted edges where buying YES on one venue and NO on the
other costs less than $1.
Scope is BTC interval and matched binary markets. opinion is always null.
Requires a Trader subscription — see Authentication.
Request
https://api.probsights.com/v1/arbitrage/current
Query parameters
number
default:"0"
Minimum net profit after fees, in cents.
string
5m, 15m, 1h, 24h, or 1w. Omit for all supported intervals.boolean
default:"false"
When
true, attach top ask levels per leg under orderbook.integer
default:"30"
Drop pairs when either snapshot is older than this.
integer
default:"60"
Max start/end time skew when pairing windows.
integer
default:"50"
Max opportunities returned (1–100).
Response
Returns a JSON array of opportunity objects.string
Matched event identifier.
string
Interval for the window when applicable.
string
Venue to buy YES (
kalshi or polymarket).string
Venue to buy NO.
number
Gross edge in cents before fees.
number
Estimated taker fees in cents.
number
Net edge after fees in cents.
number
Return on capital for the paired legs.
Examples
15-minute opportunities with min edge
curl -H "X-API-Key: YOUR_API_KEY" \
"https://api.probsights.com/v1/arbitrage/current?min_net_cents=0.5&interval_code=15m&limit=20"
import requests
response = requests.get(
"https://api.probsights.com/v1/arbitrage/current",
headers={"X-API-Key": "YOUR_API_KEY"},
params={"min_net_cents": 0.5, "interval_code": "15m", "limit": 20},
)
opps = response.json()
Fee model
Arb legs are modeled as taker orders (buying at the ask):| Exchange | Formula (1 contract) | Rounding |
|---|---|---|
| Kalshi | 0.07 × price × (1 − price) | Round up to next cent |
| Polymarket (crypto) | 0.07 × price × (1 − price) | Round to 5 dp; min charge 0.00001 |