PhotonOdds API
An odds API with the math already done.
Fair value, sharp comparison, and arbitrage returned as response fields — not an exercise left to the integrator. REST API, real-time cursor stream, and live WebSocket push — webhooks on the roadmap.
Request → Response
$ 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 }] }}The differentiator
Fair value and arbitrage as response fields — not an exercise left to the integrator.
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 opportunity 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"
}
}Core data
The numbers and coverage that power your integration.
<500ms
latency
50+
bookmakers
7,500
req/hr on paid plans
Coverage
50+ bookmakers across sharp and soft types.
Football (soccer), tennis, and basketball are always covered. Full sport list varies per bookmaker.
Schema
Normalized odds data with bookmakers typed as sharp or soft.
Every response carries metadata for cursor pagination, rate-limit status, and server time.
Cursor pagination
Use meta.cursor and meta.has_more to page through large result sets. Limit up to 100 per page.
Rate limits
Exceed your limit? The API returns 429 with error.retry_after in seconds. Back off and retry.
Movement & streaming
Real-time updates now, WebSocket push live.
/odds/changes
Cursor-based streaming endpoint. Poll for the latest odds movements, new signals, and line changes in near-real-time.
/ws/odds
Push-based odds streaming — subscribe to real-time board updates over a persistent connection, no polling required. One active socket per API key.
Webhooks
Push alerts to your endpoint when specific conditions trigger — EV thresholds, steam moves, or arbitrage windows.
Plans
Pricing scales with bookmaker coverage.
Start free, scale when you're ready — most teams land on Growth.
| Plan | Price | Streaming | Bookmakers | |
|---|---|---|---|---|
Free | €0/mo50 req/hr | REST only | 1 | Start freeNo card required |
Starter | €79/mo7,500 req/hr | €158/mo REST + WebSocket | 5 | Add WebSocket |
GrowthRecommended | €149/mo7,500 req/hr | €298/mo REST + WebSocket | 10 | Add WebSocket |
Pro | €199/mo7,500 req/hr | €398/mo REST + WebSocket | 15 | Add WebSocket |
Outgrown the tiers? Enterprise
Need more throughput? Outgrown Pro? Enterprise throughput is handled by a custom plan.
Questions, answered
Straight answers to the questions skeptics actually ask.
The edge is in the math, the caveats are on the table. Here's what a sharp bettor wants to know before paying.
Billing, trials & cancellationInclude your API key in the X-API-Key header on every request. You can generate and manage keys self-serve from your account dashboard after signing up.
The Free tier gives you access to 1 bookmaker at 50 requests per hour. If you exceed your rate limit, the API returns a 429 status with an error.retry_after field in seconds — back off and retry after that window.
Both. Every /events/{id}/summary response includes fair_odds, fair_prob, vs_fair, and vs_sharp deltas so you know when the market is mispriced. The /arbitrage endpoint scans across books and surfaces opportunities with profit_pct, leg details, and recommended stake splits.
Football (soccer), tennis, and basketball are always covered. Beyond that, availability varies per bookmaker — each bookmaker carries its own sport roster. The /sports and /bookmakers endpoints give you the live list. We aggregate 50+ bookmakers across sharp and soft types.
WebSocket is available now on the StarterWS, GrowthWS, and ProWS tiers — the WebSocket variant of each paid plan at 2× the base price. Subscribe to /ws/odds for push-based odds updates, one active socket per API key. Webhooks are not available yet and remain on the roadmap; today's real-time REST option is the GET /odds/changes cursor stream.
Yes, all paid plans include commercial use rights. You can cancel anytime from your account dashboard — access continues until the end of your current billing period. See our Terms of Service for full details.
Get early access before the API opens up.
Join the waitlist and we will email you as soon as the API opens for sign-ups.