PhotonOdds API

An odds API with the math already done.

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.

Fair value and arbitrage as response fields.

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.

The numbers behind the integration.

<500ms

latency

160

bookmakers

7,500

req/hr on paid plans

Coverage

160 bookmakers across sharp and soft types.Soccer, American football, tennis, and basketball are always covered. Full sport list varies per bookmaker.Explore practical API use cases

Schema

Normalized odds data with bookmakers typed as sharp or soft.List responses carry pagination metadata where applicable; request and bookmaker limits are reported in response headers.Understand the response shapes

Cursor pagination

On paginated routes, follow meta.cursor while meta.has_more is true. Page limits vary by endpoint; bulk odds pages by event.

Rate limits

Past your limit the API returns 429 with error.retry_after in seconds. Back off and retry.Read authentication and rate-limit guidance

Follow every move as it happens.

Poll the cursor stream for fresh moves, or hold a socket open for push. One semantic state per cell, nothing decorative.

GETLive

/odds/changes

Cursor stream of odds moves. Poll for fresh signals and line changes in near real time.

WSLive

/ws/odds

Push board updates over one persistent socket per user, delivered in five-second batches. No polling required.

WHWebhooksPush to your endpoint on EV, steam, or arbitrage triggers. In design now.Roadmap

Plans

Pricing that scales with coverage.

Start free, scale when ready. Most teams land on Growth.

Annual saves about 15% per month, billed yearly.

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
Choose Growth

WebSocket variant at 2x base price. One socket per user.

Free

€0/mo

no card required

  • 1 book to build against
  • 50 req/hr throughput
  • Full schema, fair value included
Start free

Starter

€79/mo

billed monthly

  • 5 books across sharp and soft types
  • 7,500 req/hr throughput
  • Fair value plus arbitrage fields
Choose Starter

WebSocket variant at 2x base price.

Pro

€199/mo

billed monthly

  • 15 books widest pre match set
  • 7,500 req/hr throughput
  • WebSocket variant at 2x base
Choose Pro
Enterprise. Outgrown Pro. Custom throughput on a plan built around your volume.Email info@photonodds.com

API questions

What developers ask before integrating.

Auth, coverage, fair-value fields, streaming versus polling, commercial use. The full reference lives in the docs.

Read the API docs

Send your key in the X-API-Key header on every request. Create and manage keys from your dashboard after sign up.

Start shipping with the best odds data today.

Free API key, no commitment. Pre-match data across 160 bookmakers from day one.