> ## Documentation Index
> Fetch the complete documentation index at: https://docs.probsights.com/llms.txt
> Use this file to discover all available pages before exploring further.

# Cross-venue arbitrage

> Find fee-adjusted Kalshi ↔ Polymarket arbitrage opportunities.

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`.

## Request

```
https://api.probsights.com/arbitrage/current
```

### Query parameters

<ParamField query="min_net_cents" type="number" default="0">
  Minimum net profit after fees, in cents.
</ParamField>

<ParamField query="interval_code" type="string">
  `5m`, `15m`, `1h`, `24h`, or `1w`. Omit for all supported intervals.
</ParamField>

<ParamField query="orderbook" type="boolean" default="false">
  When `true`, attach top ask levels per leg under `orderbook`.
</ParamField>

<ParamField query="max_staleness_seconds" type="integer" default="30">
  Drop pairs when either snapshot is older than this.
</ParamField>

<ParamField query="window_tolerance_seconds" type="integer" default="60">
  Max start/end time skew when pairing windows.
</ParamField>

<ParamField query="limit" type="integer" default="50">
  Max opportunities returned (1–100).
</ParamField>

## Response

Returns a JSON **array** of opportunity objects.

<ResponseField name="event_id" type="string">
  Matched event identifier.
</ResponseField>

<ResponseField name="interval_code" type="string">
  Interval for the window when applicable.
</ResponseField>

<ResponseField name="buy_yes_market" type="string">
  Venue to buy YES (`kalshi` or `polymarket`).
</ResponseField>

<ResponseField name="buy_no_market" type="string">
  Venue to buy NO.
</ResponseField>

<ResponseField name="gross_cents" type="number">
  Gross edge in cents before fees.
</ResponseField>

<ResponseField name="fee_cents" type="number">
  Estimated taker fees in cents.
</ResponseField>

<ResponseField name="net_cents" type="number">
  Net edge after fees in cents.
</ResponseField>

<ResponseField name="roi_percent" type="number">
  Return on capital for the paired legs.
</ResponseField>

## Examples

### 15-minute opportunities with min edge

<CodeGroup>
  ```bash cURL theme={null}
  curl -H "X-API-Key: YOUR_API_KEY" \
    "https://api.probsights.com/arbitrage/current?min_net_cents=0.5&interval_code=15m&limit=20"
  ```

  ```python Python theme={null}
  import requests

  response = requests.get(
      "https://api.probsights.com/arbitrage/current",
      headers={"X-API-Key": "YOUR_API_KEY"},
      params={"min_net_cents": 0.5, "interval_code": "15m", "limit": 20},
  )
  opps = response.json()
  ```
</CodeGroup>

## 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` |
