Flashscore Odds Movement & Closing Line Tracker avatar

Flashscore Odds Movement & Closing Line Tracker

Pricing

from $1.70 / 1,000 odds movements

Go to Apify Store
Flashscore Odds Movement & Closing Line Tracker

Flashscore Odds Movement & Closing Line Tracker

Track betting line movement on Flashscore. Run it on a schedule: each run snapshots pre-match odds from 100+ bookmakers and returns only the prices that moved, with previous, current and opening odds, plus closing lines at kick-off. 1X2, totals, handicaps, 21 sports.

Pricing

from $1.70 / 1,000 odds movements

Rating

0.0

(0)

Developer

Elena Vance

Elena Vance

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

a day ago

Last modified

Share

Track how betting odds move on Flashscore's odds comparison — 1X2, moneyline, over/under, Asian handicap and more, from 100+ bookmakers across countries — and capture every line's closing price at kick-off. Football, tennis, basketball, hockey and 17 more sports.

Flashscore shows only two prices per outcome: the opening one and the current one. Nothing in between is kept anywhere. This Actor builds that history for you: run it on a schedule, and each run compares the bookmakers' prices with the previous run and returns only the lines that moved — previous price, new price, change in percent, and the opening price for context.

You pay for movement, not for polling: a run where nothing moved returns nothing and costs only the start fee.

No API key, no login, no proxy, no browser. Export to JSON, CSV, Excel or pull it from the API.


How it works

  1. Every run lists the upcoming matches in your leagues (starting within horizonHours), reads every bookmaker's prices, and compares each line with what it last reported for it.
  2. A line that moved becomes one row: changeType: moved, with homePreviousOdds → homeOdds and so on. A main over/under line moving from 2.5 to 2.75 goals is a movement too (previousLine → line).
  3. A line seen for the first time — on the tracker's first run, or when a match enters the horizon — becomes one first-seen row with its current and opening price: the baseline later movements are measured from.
  4. After kick-off, the next run writes every tracked line's closing price (recordType: closing). Flashscore freezes pre-match odds at kick-off, so this is the exact closing line, not an approximation from the last snapshot.

The tracker remembers prices between runs in a named key-value store, flashscore-odds-tracker-{trackerName}. Runs with the same trackerName share it; give each schedule its own name.

Quick start: schedule it

  1. Fill the input — for example the Premier League, GB bookmakers:

    {
    "trackerName": "premier-league",
    "leagues": ["ENGLAND: Premier League"],
    "horizonHours": 48,
    "bookmakerCountries": ["GB"],
    "markets": ["HOME_DRAW_AWAY", "OVER_UNDER", "ASIAN_HANDICAP"],
    "historyDatasetName": "odds-history-epl"
    }
  2. Save it as a task, then open Schedules → Create new, add the task, and pick an interval. Every 15 minutes (*/15 * * * *) catches most moves; every 5 minutes before big matches catches steam; hourly is plenty for early-week markets.

  3. Set historyDatasetName so every run appends to one continuous dataset instead of scattering rows across one dataset per run.

The schedule interval is the tracker's time resolution: a move is timestamped between previousObservedAt and observedAt.

What you get

Real, unedited output — Betway moving on Uzbekistan U23 v Japan U23, 44 minutes before kick-off:

FieldValue
recordType / changeTypemovement / moved
eventId / eventUrlS2o8i9BD / https://www.flashscore.com/match/S2o8i9BD/
tournament / startTimeASIA: Asian Games - Play Offs / 2026-09-30T10:30:00Z
homeName / awayNameUzbekistan U23 / Japan U23
bookmakerName / bookmakerId / bookmakerCountryBetway / 26 / GB
market / periodHOME_DRAW_AWAY / FULL_TIME
homeOpeningOdds → homePreviousOdds → homeOdds4.2 → 6.0 → 5.5
drawOpeningOdds → drawPreviousOdds → drawOdds3.4 → 3.75 → 3.75
awayOpeningOdds → awayPreviousOdds → awayOdds1.75 → 1.5 → 1.53
maxChangePercent / shortenedOutcome-8.33 / home
margin / previousMargin0.1021 / 0.1
previousObservedAt / observedAt / minutesToStart2026-09-30T09:42:29Z / 2026-09-30T09:45:22Z / 44
outcomes[{"name":"home","odds":5.5,"previousOdds":6,"change":-0.5,"changePercent":-8.33,"openingOdds":4.2,"active":true}, …]

The usual outcomes have fixed columns — home, draw, away, over, under, yes, no, each as …Odds, …PreviousOdds and …OpeningOdds — so a spreadsheet or SQL table needs no JSON unpicking. Every outcome, including correct scores, is also in outcomes with its own change.

Row types

recordTypechangeTypeMeaning
movementfirst-seenFirst sighting of a line: current price next to the opening price
movementmovedA price (or the main line itself) changed since it was last reported
movementsuspended / reactivatedThe bookmaker pulled or restored the line
closingclosingThe closing price after kick-off, next to the last price the tracker saw and the opening price

Closing lines and CLV

Closing rows carry the closing price (homeOdds…), the opening price (homeOpeningOdds…) and the tracker's last pre-kick-off observation (homePreviousOdds…). Join them with your bets on eventId + bookmakerId + market + line to measure closing-line value. closingSource is flashscore when the closing price was read after kick-off (the normal case) and last-snapshot if that read failed.

Handicaps are always from the home side

line: -1.5 on an Asian handicap row means the home side gives 1.5. Flashscore quotes each side from its own view; this Actor pairs them, so every handicap row is a complete two-way book. Tennis set and game lines are kept apart by lineType (SETS / GAMES).

Input

FieldDefaultWhat it does
trackerNamedefaultNames the tracker's memory. One name per schedule.
sportsfootballSports to follow.
leaguesallCompetition names (ENGLAND: Premier League) or Flashscore league URLs. Strongly recommended.
matchIds—Follow specific matches (id or URL) until kick-off instead of leagues.
horizonHours24Follow matches starting within this many hours (max 168).
bookmakerCountriesGBBookmaker countries; several are merged, each bookmaker once. US-NJ, CA-ON for per-state markets.
bookmakersallOnly these bookmakers (part of the name or id).
markets1X2, moneyline, over/under, Asian handicapMarkets to track.
periodsFULL_TIMEFIRST_HALF, FIRST_SET, …
linesmainMain line only, or every line.
minChangePercent0Report a line only once a price has moved this much since it was last reported. Small drifts add up.
emitFirstSeentrueReport first sightings (the baseline).
emitClosingLinestrueWrite closing lines after kick-off.
historyDatasetName—Also append every row to this named dataset.
maxMatches50Matches per run, soonest first (matches without odds don't count).
maxItems5000Charged rows per run. Anything over it is carried to the next run, not lost.

Pricing

Pay per event — you pay only for what is reported:

EventPrice
Price movement or first sighting (odds-movement)$2.00 per 1,000 rows
Closing line (closing-line)$1.00 per 1,000 rows
Run start$0.00005 per run

A row is a whole bookmaker line — all three 1X2 prices, or both sides of a total — not a single price. Unchanged lines are free. What a schedule costs depends on how many lines you follow and how much they move. As a guide, one Premier League round (10 matches, GB bookmakers, 1X2 + over/under + Asian handicap, main lines) is about 800 lines:

  • First sightings: ~800 rows once per round ≈ $1.60.
  • Movement: typically 2–10 % of lines move per 15-minute run, more in the last hours before kick-off ≈ $0.03–0.16 per run.
  • Closing lines: ~800 rows per round ≈ $0.80.

Set minChangePercent (for example 2) to report only meaningful moves, and maxItems and the run's maximum charge to cap any single run.

FAQ

Why is the first run bigger than the rest? It reports every line once as first-seen, with its opening price — the baseline. Later runs report only changes. Turn off emitFirstSeen to skip the baseline.

What if two scheduled runs overlap? The second one sees the first holding the tracker's lock and exits immediately without charging for data. A lock left by a crashed run expires after 45 minutes.

What if a run hits my maximum charge? It stops gracefully. Movements it could not report are kept and reported by the next run, measured from the last price you actually received.

Does it track in-play odds? No. Flashscore's odds comparison is pre-match; at kick-off the prices freeze, which is what makes the closing line exact.

Can I get history from before I started? Only the opening price, which every row carries. Flashscore keeps no history in between, which is why this tracker exists — start it early in the week.

Postponed matches? They are dropped without a closing line. A delayed kick-off is followed until the match actually starts.

How do I reset a tracker? Use a new trackerName, or delete the key-value store flashscore-odds-tracker-{name} in Storage.

This Actor is not affiliated with Flashscore or Livesport. It reads publicly available odds; check that your use complies with the site's terms and your local gambling regulations.


Ready-made examples

Open one, press Try for free, and change the input to your own:

More Flashscore Actors

Same data source, same flat rows and pay-per-result pricing: