Growth
Most popular€149/mo
billed monthly
- 10 books across sharp and soft types
- 7,500 req/hr throughput
- Fair value plus arbitrage fields
- Cursor stream plus docs and support
WebSocket variant at 2x base price. One socket per user.
PhotonOdds API
Fair value plus arbitrage as response fields. REST plus stream plus WebSocket push.
New to the API? Make your first request.
Request to response
Live fields shown$ curl https://api.photonodds.com/api/v1/events/evt_8f2k/summary \ -H "X-API-Key: pk_live_\u2026" { "data": { "event_id": "evt_8f2k", "markets": [{ "type": "moneyline", "period": "full_time", "line": null, "sharp_line": { "bookmaker": "sharp", "outcomes": [{ "name": "home", "odds": "2.03", "fair_odds": "2.07", "fair_prob": "0.483" }], "margin": "0.021" }, "current_best": [{ "outcome": "home", "odds": "2.10", "bookmaker": "sportsbet", "vs_sharp": "+3.4%", "vs_fair": "+1.4%" }], "bookmaker_count": 23 }] }}Summary payload with fair_odds, fair_prob, vs_fair and vs_sharp computed for you.
Two calls carry the computed edge. The summary prices one event against fair. The arbitrage scan prices books against each other, with stakes attached.
GET /events/{id}/summary
Fair value computed$ curl https://api.photonodds.com/api/v1/events/evt_8f2k/summary \
-H "X-API-Key: pk_live_\u2026"
{
"data": {
"event_id": "evt_8f2k",
"markets": [{
"type": "moneyline",
"period": "full_time",
"line": null,
"sharp_line": {
"bookmaker": "sharp",
"outcomes": [{
"name": "home",
"odds": "2.03",
"fair_odds": "2.07",
"fair_prob": "0.483"
}],
"margin": "0.021"
},
"current_best": [{
"outcome": "home",
"odds": "2.10",
"bookmaker": "sportsbet",
"vs_sharp": "+3.4%",
"vs_fair": "+1.4%"
}],
"bookmaker_count": 23
}]
}
}GET /arbitrage
Cross book scan$ curl "https://api.photonodds.com/api/v1/arbitrage?min_profit=1.5" \
-H "X-API-Key: pk_live_\u2026"
{
"data": [{
"event": {
"sport": "football",
"home": "Bayern",
"away": "Dortmund"
},
"market": "moneyline",
"profit_pct": "2.4",
"legs": [
{ "outcome": "home", "odds": "1.95", "bookmaker": "unibet" },
{ "outcome": "away", "odds": "4.20", "bookmaker": "betmgm" }
],
"stakes": { "home": "68.30", "away": "31.70" },
"staleness_warning": false
}],
"meta": {
"next_scan_at": "2026-06-26T14:32:12Z"
}
}Why it matters. Raw odds leave the math to you. These fields ship the verdict: what is fair, where the price beats it, and how to split the stake.
<500ms
latency
160
bookmakers
7,500
req/hr on paid plans
Coverage
Schema
Cursor pagination
meta.cursor while meta.has_more is true. Page limits vary by endpoint; bulk odds pages by event.Rate limits
429 with error.retry_after in seconds. Back off and retry.Read authentication and rate-limit guidancePoll the cursor stream for fresh moves, or hold a socket open for push. One semantic state per cell, nothing decorative.
/odds/changes
Cursor stream of odds moves. Poll for fresh signals and line changes in near real time.
/ws/odds
Push board updates over one persistent socket per user, delivered in five-second batches. No polling required.
Plans
Start free, scale when ready. Most teams land on Growth.
€149/mo
billed monthly
WebSocket variant at 2x base price. One socket per user.
€0/mo
no card required
€79/mo
billed monthly
WebSocket variant at 2x base price.
€199/mo
billed monthly
API questions
Auth, coverage, fair-value fields, streaming versus polling, commercial use. The full reference lives in the docs.
Read the API docsSend your key in the X-API-Key header on every request. Create and manage keys from your dashboard after sign up.
Free API key, no commitment. Pre-match data across 160 bookmakers from day one.