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

ComputedEdge
$ 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.

GETLive

/odds/changes

Cursor-based streaming endpoint. Poll for the latest odds movements, new signals, and line changes in near-real-time.

WSLive

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

WHSoon

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.

Free

0/mo

50 req/hr

Bookmakers
1
Streaming
REST only
Start freeNo card required

Starter

79/mo

7,500 req/hr

Bookmakers
5
Streaming
€158/mo REST + WebSocket
Add WebSocket

GrowthRecommended

149/mo

7,500 req/hr

Bookmakers
10
Streaming
€298/mo REST + WebSocket
Add WebSocket

Pro

199/mo

7,500 req/hr

Bookmakers
15
Streaming
€398/mo REST + WebSocket
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 & cancellation

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