Odds-API.io Arbitrage Bets API
The Arbitrage Bets API from Odds-API.io — 1 operation(s) for arbitrage bets.
The Arbitrage Bets API from Odds-API.io — 1 operation(s) for arbitrage bets.
Every API here is available over the APIs.io API and to AI agents over MCP.
One button, every client — Claude, Cursor, VS Code and the rest.
https://apis.io/mcp
find_apisBrowse and filter every API in the catalog.get_api_artifactsOne API's artifacts, grouped by type.get_openapiThe primary OpenAPI for this API.find_similar_apisAPIs that look like this one.apis_io_searchSTART HERE — APIs, providers and tags for one query, each with its total.resolveTurn a domain, URL or GitHub org into the provider it belongs to.find_cohortsEvery scored population of providers in the catalog.curl "https://apis.io/api/v1/apis/odds-api-io:odds-api-io-arbitrage-bets-api"
curl "https://apis.io/api/v1/apis?limit=25"
Calls without X-API-Key need no key. Calls with it need a paid plan — get a key.
Free tier, no form to fill in. Signing in shares your email address with us — we store it to create your key and to recognise you if you sign in with another provider. See our Privacy Policy and Terms.
A second provider on the same verified email joins the account you already have.
openapi: 3.2.0
info:
description: 'Odds-API.io is a powerful sports betting odds comparison API, providing real-time data from 450+ bookmakers across 34 sports with near zero latency.
- 450+ bookmakers supported
- 34 sports including Football, Basketball, Tennis, Esports and more
- Real-time odds with close to zero latency
- Pre-match & In-play odds coverage
- 99.9% uptime for reliability'
title: Odds-API.io - Real-Time Sports Betting Odds API (v3)…
contact: {}
version: 3.0.0
servers:
- url: https://api.odds-api.io/v3
tags:
- name: Arbitrage Bets
paths:
/arbitrage-bets:
get:
security:
- ApiKeyAuth: []
description: Returns prematch arbitrage opportunities where every leg uses one of the specified bookmakers, sorted by profit margin (highest first). Opportunities are refreshed every few seconds and removed as soon as the prices move or the match starts. Margins and stakes use prices after exchange fees, and stakes respect the limits bookmakers report, so totalStake can be below 1000. By default only the best combination per event, market and line is returned; set allCombinations=true for every combination.
tags:
- Arbitrage Bets
summary: Get arbitrage betting opportunities
parameters:
- description: API key for authentication
name: apiKey
in: query
required: true
schema:
type: string
- example: '"Bet365,SingBet"'
description: Comma-separated list of bookmakers (e.g. Bet365,SingBet)
name: bookmakers
in: query
required: true
schema:
type: string
- example: football
description: Filter by sport name or slug (e.g. Football or football)
name: sport
in: query
schema:
type: string
- example: england-premier-league
description: Filter by league slug (e.g. england-premier-league). Requires sport to also be set.
name: league
in: query
schema:
type: string
- example: ML,Spread,Totals
description: Comma-separated market names to keep, case-insensitive (max 40)
name: markets
in: query
schema:
type: string
- example: 1.5
description: Minimum profitMargin in percent, between 0 and 100 (e.g. 1.5 for 1.5%)
name: minProfit
in: query
schema:
type: number
minimum: 0
maximum: 100
- example: false
description: Return every bookmaker combination per event, market and line instead of only the best one (default false)
name: allCombinations
in: query
schema:
type: boolean
default: false
- example: 50
description: Maximum number of results (default 50, max 500)
name: limit
in: query
schema:
type: integer
- example: true
description: Include event details
name: includeEventDetails
in: query
schema:
type: boolean
responses:
'200':
description: OK
content:
application/json:
schema:
type: array
items:
$ref: '#/components/schemas/dto.ArbitrageOpportunity'
'400':
description: Bad Request
content:
application/json:
schema:
$ref: '#/components/schemas/controllers.ErrorResponse'
'401':
description: Unauthorized
content:
application/json:
schema:
$ref: '#/components/schemas/controllers.ErrorResponse'
'403':
description: Forbidden
content:
application/json:
schema:
$ref: '#/components/schemas/controllers.ErrorResponse'
'404':
description: Not Found (unknown league for the sport)
content:
application/json:
schema:
$ref: '#/components/schemas/controllers.ErrorResponse'
'500':
description: Internal Server Error
content:
application/json:
schema:
$ref: '#/components/schemas/controllers.ErrorResponse'
operationId: getArbitrageBets
x-operation-id-source: derived
components:
schemas:
dto.ArbitrageOpportunity:
type: object
properties:
event:
description: Only included if includeEventDetails=true
allOf:
- $ref: '#/components/schemas/dto.EventInfo'
eventId:
type: integer
example: 123456
firstSeenAt:
type: string
format: date-time
description: When this combination first appeared
example: '2026-10-20T18:30:02Z'
id:
type: string
description: '{eventId}-{market}[-{hdp}] followed by {bookmaker}-{side} for each leg'
example: 123456-ML-Bet365-home-SingBet-away
impliedProbability:
type: number
description: Sum of 1/odds across the legs, using netOdds where fees apply; below 1 for an arbitrage
example: 0.9758
legs:
type: array
items:
$ref: '#/components/schemas/dto.ArbitrageLeg'
market:
type: object
properties:
name:
type: string
example: Spread
hdp:
type: number
description: Line for Spread and Totals markets; omitted when the market has no line
example: -1.5
optimalStakes:
type: array
items:
$ref: '#/components/schemas/dto.OptimalStake'
profitMargin:
type: number
description: Margin at the quoted prices after exchange fees, as a percentage of totalStake (2.48 means 2.48%)
example: 2.48
totalStake:
type: number
description: 1000, or less when a leg's maxStake caps the split; scale optimalStakes to your bankroll
example: 1000
updatedAt:
type: string
description: Last time the opportunity was confirmed
example: '2026-10-20T18:42:11Z'
dto.EventInfo:
type: object
properties:
away:
type: string
date:
type: string
home:
type: string
league:
type: string
sport:
type: string
dto.ArbitrageLeg:
type: object
properties:
bookmaker:
type: string
example: Bet365
bookmakerFixtureId:
type: string
description: The bookmaker's own event id, when known. Not present on every response.
href:
type: string
description: Link to the event on the bookmaker, or "N/A" when none is known.
example: https://www.bet365.com/...
odds:
type: string
description: Decimal odds
example: '2.08'
netOdds:
type: string
description: Price after exchange fees (for example exchange commission or prediction-market taker fees). Only present when fees apply; profitMargin, impliedProbability and optimalStakes use this price.
example: '2.026'
maxStake:
type: number
description: Stake limit reported by the bookmaker for this price, when known. optimalStakes never exceed it.
example: 250
oddsUpdatedAt:
type: string
format: date-time
description: Last time we wrote this bookmaker price. May be absent.
example: '2026-10-21T09:40:12Z'
side:
type: string
enum:
- home
- away
- draw
- over
- under
example: home
controllers.ErrorResponse:
type: object
properties:
error:
type: string
example: Error message
dto.OptimalStake:
type: object
properties:
bookmaker:
type: string
potentialReturn:
type: number
description: Payout if this leg wins; the same for every leg up to rounding
example: 1024.77
side:
type: string
stake:
type: number
example: 492.68
securitySchemes:
ApiKeyAuth:
type: apiKey
in: query
name: apiKey
description: Your Odds-API.io API key, sent as the apiKey query parameter. Get one at https://odds-api.io/pricing.
x-origin:
- url: https://api.odds-api.io/v3/docs/doc.json
format: swagger
version: '2.0'
converter:
url: https://github.com/mermade/oas-kit
version: 7.0.8