Skip to content
Sports Apify Actor

FollowScores Scraper for football data.

FollowScores Scraper is a BatScrape Actor on Apify that collects football fixtures, results and team profiles for 11 European competitions. It returns structured JSON: one record per match, or a team’s summary, squad, past results and upcoming fixtures.

Runs in your Apify account. Export JSON or CSV.

  • Fixtures
  • Results
  • Team profiles
  • Squads
FollowScores in action Illustrative demo
01 / INPUT

Set the input

Choose today’s matches. Narrow the run by competition in Apify.

What do you want to fetch? Required
Today’s matches Mode
Competitions All supported leagues
Output format Structured JSON

Example configuration · Run your own search on Apify.

02 / RESULT

Preview a record

Each fixture carries its competition, teams, kickoff and match status.

Premier League England
H Example Home FC
vs
A Example Away FC
Not started

Made-up values · Actual field names · No live request.

03 / EXPORT

Export JSON

Use the structured dataset in your football app or analysis.

dataset-item.json JSON
{
  "fixtureID": "10000001",
  "competitionID": "17",
  "competitionName": "Premier League",
  "countryName": "England",
  "seasonID": "100001",
  "homeTeamID": "1001",
  "homeTeamName": "Example Home FC",
  "awayTeamID": "1002",
  "awayTeamName": "Example Away FC",
  "status": "not_started",
  "startTime": "2026-10-03T14:00:00Z",
  "queryType": "todayMatches",
  "inputSource": "2026-10-03"
}
Download sample JSON

Use it for live scoreboards, fixture and results feeds, fan and fantasy-football apps, match-day roundups, or match and team datasets for analysis. It runs in your Apify account and fetches data directly, without browser automation.

What it collects

  • Today’s matches, with each match’s live status and, once it has kicked off, its score.
  • Results for every day in a date range of up to 31 days.
  • Team profiles: summary, squad, past results and upcoming fixtures.
  • Coverage: Süper Lig, 1. Lig, Premier League, Championship, LaLiga, Serie A, Bundesliga, Ligue 1, Eredivisie, Liga Portugal and the UEFA Europa League — 214 teams.

How it works

FollowScores Scraper fetches football data for 11 top European competitions and pushes it to your dataset as structured JSON. There is no browser automation, no HTML parsing and no proxies to manage. Pick one of three modes with option, and it queues exactly the requests that mode needs, respecting your maxItems cap and pay-per-event budget as it goes.

You pick leagues and teams by name in the input form, not by hunting down internal IDs. Each match reports a live status — not_started, in progress or ended — with scores once available at the time of the run. Run the Actor again, or schedule recurring runs on Apify, to refresh your dataset. One selection returns a team’s full profile, with no extra configuration.

Use cases

  • Sports dashboard builders — scoreboards and results feeds refreshed through repeated or scheduled Actor runs.
  • Fan and fantasy-football apps — team squads, upcoming fixtures and results to power app content.
  • Betting-odds and sports-data researchers — structured match and team datasets for modeling.
  • Content and media sites — automated match-day and weekly results roundups.
  • Data analysts — historical results across a date range for trend and performance analysis.

Competitions and teams

These are the competitions and teams the input form offers, and nothing else can be selected. Pick them by name in the form; through the API, send the ID.

CompetitionCountryIDTeams
Süper Lig Turkey 52 18
1. Lig Turkey 98 20
Premier League England 17 20
Championship England 18 24
LaLiga Spain 8 20
Serie A Italy 23 20
Bundesliga Germany 35 18
Ligue 1 France 34 18
Eredivisie Netherlands 37 18
Liga Portugal Portugal 238 18
UEFA Europa League Europe 679 20
All competitions 214

Teams by competition

Each team with the ID the Actor’s input takes.

Süper Lig: 18 teams
  • Alanyaspor 6362
  • Amedspor 225940
  • Basaksehir 3086
  • Besiktas 3050
  • Corum 77629
  • Erzurumspor 55603
  • Eyupspor 7040
  • Fenerbahce 3052
  • Galatasaray 3061
  • Gaziantep 5138
  • Genclerbirligi 7802
  • Goztepe 3054
  • Kasimpasa 6063
  • Kocaelispor 3065
  • Konyaspor 3085
  • Rizespor 3064
  • Samsunspor 3053
  • Trabzonspor 3051
1. Lig: 20 teams
  • Antalyaspor 3056
  • Bandirmaspor 44320
  • Batman Petrolspor 3099
  • Bodrum 216876
  • Boluspor 6414
  • Bursaspor 3055
  • Erokspor 365676
  • Igdir 3088
  • Istanbulspor 3066
  • Karagumruk 4954
  • Kayserispor 3072
  • Keçiörengücü 6366
  • Manisa FK 216878
  • Mardin 1969 Spor 497134
  • Muglaspor 7034
  • Pendikspor 7032
  • Sariyer 4952
  • Sivasspor 3076
  • Umraniyespor 55625
  • Vanspor FK 24750
Premier League: 20 teams
  • Arsenal 42
  • Aston Villa 40
  • Bournemouth 60
  • Brentford 50
  • Brighton 30
  • Chelsea 38
  • Coventry 11
  • Crystal Palace 7
  • Everton 48
  • Fulham 43
  • Hull 96
  • Ipswich 32
  • Leeds 34
  • Liverpool 44
  • Man City 17
  • Man United 35
  • Newcastle 39
  • Nottingham Forest 14
  • Sunderland 41
  • Tottenham 33
Championship: 24 teams
  • Birmingham 9
  • Blackburn 46
  • Bolton 5
  • Bristol City 58
  • Burnley 6
  • Cardiff 61
  • Charlton 47
  • Derby 27
  • Lincoln City 92
  • Middlesbrough 36
  • Millwall 25
  • Norwich 263
  • Portsmouth 2
  • Preston 21
  • QPR 1
  • Sheff Utd 15
  • Southampton 45
  • Stoke City 29
  • Swansea 74
  • Watford 24
  • West Brom 8
  • West Ham 37
  • Wolves 3
  • Wrexham 64
LaLiga: 20 teams
  • Alaves 2885
  • Athletic Bilbao 2825
  • Atletico Madrid 2836
  • Barcelona 2817
  • Celta Vigo 2821
  • Deportivo 2832
  • Elche 2846
  • Espanyol 2814
  • Getafe 2859
  • Levante 2849
  • Malaga 2830
  • Osasuna 2820
  • Racing Santander 2835
  • Rayo Vallecano 2818
  • Real Betis 2816
  • Real Madrid 2829
  • Real Sociedad 2824
  • Sevilla 2833
  • Valencia 2828
  • Villarreal 2819
Serie A: 20 teams
  • AC Milan 2692
  • Atalanta 2686
  • Bologna 2685
  • Cagliari 2719
  • Como 2704
  • Fiorentina 2693
  • Frosinone 2801
  • Genoa 2713
  • Inter 2697
  • Juventus 2687
  • Lazio 2699
  • Lecce 2689
  • Monza 2729
  • Napoli 2714
  • Parma 2690
  • Roma 2702
  • Sassuolo 2793
  • Torino 2696
  • Udinese 2695
  • Venezia 2688
Bundesliga: 18 teams
  • Augsburg 2600
  • Bayern Munich 2672
  • Borussia Dortmund 2673
  • Elversberg 2598
  • FC Koln 2671
  • Frankfurt 2674
  • Freiburg 2538
  • HSV 2676
  • Hoffenheim 2569
  • Leipzig 36360
  • Leverkusen 2681
  • M'gladbach 2527
  • Mainz 2556
  • Paderborn 07 2561
  • Schalke 2530
  • Stuttgart 2677
  • Union Berlin 2547
  • Werder Bremen 2534
Ligue 1: 18 teams
  • Angers 1684
  • Auxerre 1646
  • Brest 1715
  • Le Havre 1662
  • Le Mans 1672
  • Lens 1648
  • Lille 1643
  • Lorient 1656
  • Lyon 1649
  • Marseille 1641
  • Monaco 1653
  • Nice 1661
  • PSG 1644
  • Paris 6070
  • Rennes 1658
  • Strasbourg 1659
  • Toulouse 1681
  • Troyes 1652
Eredivisie: 18 teams
  • ADO 2966
  • AZ Alkmaar 2950
  • Ajax 2953
  • Cambuur 2970
  • Excelsior 2967
  • Feyenoord 2959
  • Fortuna Sittard 2957
  • GA Eagles 2979
  • Groningen 2951
  • Heerenveen 2964
  • NEC Nijmegen 2962
  • PSV 2952
  • Sparta Rotterdam 2960
  • Telstar 2972
  • Twente 2955
  • Utrecht 2948
  • Willem II 2961
  • Zwolle 2971
Liga Portugal: 18 teams
  • Academico Viseu 3022
  • Alverca 3012
  • Arouca 25777
  • Benfica 3006
  • Braga 2999
  • Casa Pia 36365
  • Estoril 4500
  • Estrela 744135
  • Famalicao 49531
  • Gil Vicente 3010
  • Maritimo 3007
  • Moreirense 3014
  • Nacional 3013
  • Porto 3002
  • Rio Ave 3036
  • Santa Clara 3011
  • Sporting CP 3001
  • Vitoria SC 3009
UEFA Europa League: 20 teams
  • Anderlecht 2900
  • Ararat-Armenia 364472
  • Celje 2413
  • Celtic 2352
  • Dinamo Zagreb 2032
  • Ferencvarosi 1925
  • H. Be'er Sheva 5202
  • Jagiellonia Bialystok 7691
  • Lech Poznan 3121
  • Levski Sofia 3273
  • Lillestrom 664
  • OFI 3241
  • Olympiacos 3245
  • Omonia 3395
  • Salzburg 2046
  • Sparta Praha 2218
  • Sturm Graz 2051
  • Torreense 25787
  • USG 4860
  • Viktoria Plzen 4502

Input

Set these in the Actor’s input form on Apify, or send them as JSON through the API.

  • option — The mode, asked in the form as “What do you want to fetch?”: todayMatches (“1. Today’s matches”, the default), dateRange (“2. Results by date range”) or teamInfo (“3. Team info”). Only the fields under the chosen mode are used. The others are ignored, so it’s safe to leave stale values in them.

Option 1: Today’s matches

Every match being played today across all 11 competitions, or narrowed down to specific leagues. Each match reports its live status and, once kicked off, its running score.

  • todayLeagues — Optional league filter, from the 11 competitions. Empty means every league.

Option 2: Results by date range

The same fixture data, but for every day across a range, optionally filtered to specific leagues and teams. A range covers up to 31 days per run, and each day is its own query.

  • dateRangeFrom dateRangeTo — Start and end dates, both required for dateRange. Up to 31 days per run.
  • dateRangeLeagues — Optional league filter. Empty means every league.
  • dateRangeTeams — Optional team filter: only matches involving these teams. Empty means every team.

Option 3: Team info

Pick one or more of the 214 supported teams and get each one’s full profile in one go: summary, squad, past results and upcoming fixtures, with no separate view picker.

  • teams — At least one of the 214 teams, required for teamInfo. Each returns its summary, squad, results and upcoming fixtures.

Every mode

These two apply whichever option runs.

  • maxItems — Maximum dataset items for the whole run. 0 or empty means unlimited. The input form pre-fills 1,000.
  • customMapFunction — Optional JavaScript function that takes each output object and returns a transformed object. It must not be used for filtering. Leave it empty to store items unchanged.

Input tips

Build a live scoreboard

Use todayMatches with no league filter: one query gets every match being played today across all 11 competitions.

Build a results archive

Use dateRange, and set dateRangeLeagues or dateRangeTeams to narrow it down. Filtering happens after the fetch, so it reduces the items stored but not the per-day query cost.

Research specific clubs

Use teamInfo with exactly the teams you need. Each team costs the same four queries regardless of squad size, so batch every team you’re interested in into one run rather than several small ones. Through the API, pass team IDs; this input asks for Galatasaray:

{
  "option": "teamInfo",
  "teams": [
    "3061"
  ]
}

Output

Each run writes its results to an Apify dataset. Every item carries queryType, the query that produced it, and inputSource, the date or ID that was queried; everything else is the underlying data, untouched. Today’s matches and date-range results store one item per match. Team info items carry fields that vary by view. In Apify Console, the dataset’s Overview shows match rows as Kickoff, League, Home, Away, Status, Query and Input columns, and team info items fill fewer of them.

These are the main fields of an item.

  • queryType — The query behind the item: todayMatches, dateRangeResults, team:summary, team:squad, team:results or team:upcoming.
  • inputSource — The date or team ID that was queried.
  • fixtureID seasonID — Match and season IDs.
  • competitionID competitionName countryName — The league and its country.
  • homeTeamID homeTeamName awayTeamID awayTeamName — Both teams.
  • status startTime — not_started, in progress or ended, with score fields once a match has kicked off; kickoff in ISO 8601.
  • teamID teamFullName teamName — On a team summary, the team’s ID, full name and short name.
  • noResults — true when a query came back empty. The item then carries only queryType and inputSource.
{
  "fixtureID": "10000001",
  "competitionID": "17",
  "competitionName": "Premier League",
  "countryName": "England",
  "seasonID": "100001",
  "homeTeamID": "1001",
  "homeTeamName": "Example Home FC",
  "awayTeamID": "1002",
  "awayTeamName": "Example Away FC",
  "status": "not_started",
  "startTime": "2026-10-03T14:00:00Z",
  "queryType": "todayMatches",
  "inputSource": "2026-10-03"
}
Illustrative record: real field names, made-up values, trimmed.
{
  "teamID": "1001",
  "teamFullName": "Example Home Football Club",
  "teamName": "Example Home FC",
  "countryName": "England",
  "queryType": "team:summary",
  "inputSource": "1001"
}
Illustrative team summary: real field names, made-up values.
{
  "noResults": true,
  "queryType": "team:results",
  "inputSource": "1001"
}
An empty team view is stored like this, not as an error.

Field reference

Every documented key of a dataset item, with its JSON type.

FieldTypeMeaning
queryType string Which query produced the item, e.g. todayMatches, dateRangeResults, team:summary, team:squad, team:results or team:upcoming. Every item has it.
inputSource string The date or team ID that produced the item.
noResults boolean true when the query came back with no data.
fixtureID string The match ID, on today’s matches and date-range results.
competitionID string The league ID.
competitionName string The league name, e.g. “Süper Lig” or “LaLiga”.
countryName string The league’s country. A team summary carries one too.
seasonID string The season ID.
homeTeamID homeTeamName string The home team’s ID and name.
awayTeamID awayTeamName string The away team’s ID and name.
status string The match status: not_started, in progress or ended. Score fields appear once a match has kicked off.
startTime string The kickoff time, in ISO 8601.
teamID teamFullName teamName string On a team summary, the team’s ID, full name and short name. Other team views carry other fields.

How to run it

  1. Open the Actor on Apify, listed as “Followscores Scraper”, and sign in. You need an Apify account.
  2. Fill in the Input tab, then click Start.
  3. When the run finishes, open the Output tab and click Export to download the dataset as JSON, CSV or another format.

Or send the same input to the Apify API. This call runs the Actor and returns its dataset items. Replace $APIFY_TOKEN with the API token from your Apify Console.

curl -X POST \
  "https://api.apify.com/v2/actors/batscrape~followscores-scraper/run-sync-get-dataset-items" \
  -H "Authorization: Bearer $APIFY_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"option":"todayMatches"}'

The call waits up to 300 seconds. For a longer run, start it asynchronously and read the dataset when it finishes. Read the Apify API reference.

New to Apify? See how BatScrape Actors run on Apify. To run it on a schedule, or send results on when a run finishes, see schedules and webhooks.

Pricing

Pay per event. Each run is charged an Actor start event, then a list query for today’s matches, for each day of a date range, and for each of a team’s squad, results and upcoming fixtures, and a single-item query for each team’s summary. Each dataset item stored is charged as well. Every query and item is checked against the run’s charge budget before it’s spent, so a run stops cleanly instead of overspending. See current rates on Apify .

Limitations

  • Only the 11 competitions and 214 teams listed in the input form are covered.
  • A date range covers at most 31 days per run, and each day is a separate query. League and team filters reduce stored items, not those queries.
  • Team info always runs four queries per team: summary, squad, results and upcoming.
  • Team info fields vary by view; inspect a run’s dataset for the full shape. An empty squad, results or upcoming view is stored as a noResults item, not an error.
  • Match items gain score fields once a match has kicked off. The README does not name them, so inspect a run’s dataset for their keys.
  • A run stops when it reaches maxItems or your charge budget.

FAQ

Answers from the Actor’s README on Apify.

Why did a run return few or no results?

Check these first:

  • maxItems: the run stops once it’s reached.
  • The charge budget: a run that can’t afford another dataset item stops cleanly rather than erroring.
  • For dateRange, that both dateRangeFrom and dateRangeTo are set. Both are required.
  • For teamInfo, that at least one team is picked in teams.

Why does team info cost more than I expected?

Team info always queues four queries per team, one for the summary and three list queries for the squad, results and upcoming fixtures, regardless of how much data comes back. That is on top of each run’s Actor start charge.

How do I keep the cost of a run down?

Three settings help:

  • Use todayLeagues, dateRangeLeagues or dateRangeTeams to reduce stored items. For dateRange, this doesn’t reduce the per-day query charge.
  • Keep date ranges as short as you need: every extra day is another query.
  • Set maxItems to a hard cap that matches your budget.

Why is some team data missing?

team:squad, team:results and team:upcoming can legitimately come back empty for a team with no current squad data, no past results yet this season, or no fixtures scheduled. This is stored as { noResults: true, … }, not an error.

Other BatScrape Actors

  • TikTok Shop Scraper — Scrape US TikTok Shop products by keyword or store, and full product pages and buyer reviews from product URLs. Export prices, discounts, ratings, units sold, SKU stock and shipping.
  • Reddit Scraper — Search Reddit posts or comments by keyword across all subreddits. Export titles, text, subreddits, authors, scores and comment counts, sorted by relevance, newest, top or most comments.
  • Threads Scraper — Search Threads by keyword or collect a public account’s latest posts. Export text, authors, engagement, topics, mentions, links and media URLs without a Threads login.
  • Realtor.com Scraper — Scrape Realtor.com for-sale, rental and sold listings by city, ZIP code or URL. Export price, beds, baths, photos, sale and tax history, schools and agents.
  • TikTok Scraper — Search TikTok by keyword and export unique videos with creator profiles, engagement stats, music, hashtags and media URLs. Sort by relevance or likes, filter by date and region.
  • Douyin Scraper — Search Douyin (抖音), also known as TikTok China, by keyword. Export unique posts with creator profiles, engagement stats, music and media URLs.

Every published Actor is on the scrapers hub.

YOUR NEXT DATASET STARTS HERE

Scrape at scale. Build with better data.

Discover our scraping actors on Apify. Configure your source and connect the results to your workflow.

  • Run actors on Apify
  • Export JSON or CSV
FROM SOURCE TO DATASET
Apify 02 / Run

03 / Use your data

JSON Apps & APIs
CSV Sheets & analysis
Ready for your workflow

Your source. Your Apify account. Your data.

Purpose-built actors. One place to start. Explore the scraper collection