---
title: "Confirmed cross-venue arbitrage opportunities (v2)"
method: GET
path: "/v2/arbitrage"
tags: ["data"]
---

# Confirmed cross-venue arbitrage opportunities (v2)

`GET /v2/arbitrage`

Confirmed, engine-fired Opportunities with one exact selected execution leg per outcome. Money
fields name USD/contract units, include venue fees under the disclosed conservative_per_contract model,
and distinguish payout edge from modeled ROI. Every row is rechecked against the current matched market
before serving; stale or malformed rows fail closed. This is not a Market object or /v2/markets filter.

## Query parameters

- `sport` string, nullable
- `limit` integer

## Headers

- `authorization` string

## Response `200`

Successful Response

- ArbitrageResponse
  - `as_of` string, nullable, required — Newest priced_at among returned opportunities; null when empty.
  - `delay_seconds` number, required — Configured REST snapshot delay. Use as_of for actual freshness.
  - `count` integer, required
  - `opportunities` OpportunityResponse[], required
    - `id` string, required — Stable opportunity id for this open arbitrage window.
    - `market_id` string, required — Stable dino_ market id shared with GET /v2/pairs/{id}.
    - `title` string, nullable, required
    - `category` string, required
    - `market_type` string, required
    - `sport` string, nullable
    - `competition` string, nullable
    - `location` string, nullable
    - `asset` string, nullable
    - `indicator` string, nullable
    - `basis` string, nullable
    - `institution` string, nullable
    - `tags` string[], required
    - `start_time` string, nullable, required
    - `edge_pct` number, required — Conservative modeled net profit as percentage points of the $1 payout, after venue fees.
    - `roi_pct` number, required — Conservative modeled net profit divided by max_wager_usd, as a percentage.
    - `fees_included` true, required
    - `fee_model` 'conservative_per_contract', required — Fees are modeled for one contract per selected leg, then scaled to max_contracts; quantity-level venue rounding can make an executed block differ.
    - `cost_per_payout_usd` number, required — Conservative fee-inclusive modeled wager for $1 payout.
    - `max_contracts` number, required — Snapshot executable equal contract count per outcome.
    - `max_wager_usd` number, required — Conservative fee-inclusive capital estimate at max_contracts.
    - `confidence` number, required
    - `detected_at` string, nullable, required — When this arbitrage window first opened.
    - `priced_at` string, nullable, required — When its selected asks and size last changed.
    - `legs` ArbitrageLegResponse[], required
      - `outcome` string, required — Outcome this leg pays $1 on if it resolves true.
      - `venue` 'kalshi' | 'polymarket', required
      - `side` 'yes' | 'no', nullable, required — Kalshi side when the contract requires one; null for a Polymarket outcome token.
      - `ask_usd` number, required — USD paid per contract at the selected best ask.
      - `stake_fraction` number, required — Fraction of total wager allocated to this leg, fees included.
      - `available_contracts` number, required — Contracts available at ask_usd in the observed book.
      - `contract_id` string, required — Exact venue ticker or outcome-token id for execution.
      - `url` string, nullable, required — Venue event URL when a verified public slug is available.

## Other responses

- `401` — Missing or invalid API key
- `402` — Subscription inactive
- `422` — Validation Error
- `429` — Rate limit exceeded
- `503` — Auth admission gate full (transient) — retry shortly, see retry_after

---

[API](https://skmtc.net/dino/apis/dino-markets-api.md) · [All operations](https://skmtc.net/dino/apis/dino-markets-api/llms.txt) · [OpenAPI document](https://skmtc-service-staging.skmtc.workers.dev/v1/apis/dino/dino-markets-api/revisions/8cbe8774824f/schema)
