FlashScore Odds Scraper
Pricing
from $5.50 / 1,000 odds line fetcheds
FlashScore Odds Scraper
Fetch live betting odds for a FlashScore match by matchId, bookmaker, bet type, and bet scope, including opening line and movement. No login or API key needed. Derived from romy/flashscore-all-in-one-api as a focused odds-only spin-off for odds-comparison and closing-line tracking.
What does FlashScore Odds Scraper do?
FlashScore Odds Scraper takes one or more { matchId, bookmakerId, betType, betScope } queries and pushes the betting odds for that market, one dataset row per query.
It talks directly to the same internal GraphQL persisted-query API the official FlashScore Android app uses (global.ds.lsapp.eu), reverse-engineered by live Frida SSL-pinning bypass + mitmproxy capture against a real device (x-fsign is a static header value, confirmed identical across ~960 captured requests — no login, no per-request signing). This is the odds slice of FlashScore All-in-One API, split out as its own focused Actor.
Why use FlashScore Odds Scraper?
- Batch odds lookups — pass many
{ matchId, bookmakerId, betType, betScope }queries at once, fetched in parallel - Real bookmaker odds, including opening line + last movement — each market returns current value, opening value, and the direction it moved
- No account needed — every read request works fully anonymously
- Use cases: odds-comparison tools, closing-line-value tracking, betting research, market-movement analysis
Input
| Field | Type | Description |
|---|---|---|
queries | array | Required. Each item: { matchId, bookmakerId, betType, betScope }. matchId is a FlashScore match/event id (from flashscore-all-in-one-api or a FlashScore URL). |
bookmakerId, betType, and betScope are genuinely required upstream parameters — FlashScore's odds API has no default market. Only bookmakerId: 16, betType: "HOME_DRAW_AWAY", betScope: "FULL_TIME" is confirmed live (bookmaker 16 = bet365; this exact combo is the parent Actor's own documented example call). Other bookmaker ids and bet type/scope values exist upstream but were not individually enumerated — discover them either by running the parent Actor's /matches or /matches/:id endpoints and inspecting a match page on flashscore.com for the bookmaker/market names it offers, or by your own capture.
Example:
{"queries": [{ "matchId": "OvnzmiZQ", "bookmakerId": 16, "betType": "HOME_DRAW_AWAY", "betScope": "FULL_TIME" }]}
Output
One dataset row per query. Real output from a live run (Monaco vs Marseille, Ligue 1, bookmaker 16/bet365):
{"matchId": "OvnzmiZQ","bookmakerId": 16,"betType": "HOME_DRAW_AWAY","betScope": "FULL_TIME","odds": {"data": {"findLiveOddsForBookmaker": {"eventOddsOverview": {"bookmakerId": 16,"type": "HOME_DRAW_AWAY","home": { "value": "1.0", "opening": "2.2", "change": { "type": "DOWN", "previous": "2.2" } },"draw": { "value": "51.0", "opening": "3.5", "change": { "type": "UP", "previous": "3.5" } },"away": { "value": "451.0", "opening": "3.2", "change": { "type": "UP", "previous": "3.2" } }}}}}}
Known limitations
- Only
bookmakerId: 16/betType: "HOME_DRAW_AWAY"/betScope: "FULL_TIME"is confirmed against live traffic — other combinations are expected to work (the upstream query accepts them as plain parameters) but were not individually captured. - During a smoke test, odds for matches still hours from kickoff came back with a
nulleventOddsOverviewfor several markets — odds for a given bookmaker/market only populate once FlashScore actually has a live quote for it (typically once the match is in progress or has finished); an empty result for a not-yet-started match is expected upstream behavior, not a bug in this Actor. - Every other FlashScore endpoint (match detail, lineups, stats, standings, results, fixtures, news, search) is out of scope here — see flashscore-all-in-one-api or its other spin-off Actors.
Pricing
Pay-per-result. One odds-line event is charged per query processed (one query = one odds market/bookmaker line), starting at $0.007 on the Free plan. See the Actor's Pricing tab for tier rates.