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.
| Competition | Country | ID | Teams |
|---|---|---|---|
| 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”) orteamInfo(“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.
-
dateRangeFromdateRangeTo— Start and end dates, both required fordateRange. 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 forteamInfo. 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.0or 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:resultsorteam:upcoming. -
inputSource— The date or team ID that was queried. -
fixtureIDseasonID— Match and season IDs. -
competitionIDcompetitionNamecountryName— The league and its country. -
homeTeamIDhomeTeamNameawayTeamIDawayTeamName— Both teams. -
statusstartTime—not_started, in progress orended, with score fields once a match has kicked off; kickoff in ISO 8601. -
teamIDteamFullNameteamName— On a team summary, the team’s ID, full name and short name. -
noResults—truewhen a query came back empty. The item then carries onlyqueryTypeandinputSource.
{
"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"
} {
"teamID": "1001",
"teamFullName": "Example Home Football Club",
"teamName": "Example Home FC",
"countryName": "England",
"queryType": "team:summary",
"inputSource": "1001"
} {
"noResults": true,
"queryType": "team:results",
"inputSource": "1001"
} Field reference
Every documented key of a dataset item, with its JSON type.
| Field | Type | Meaning |
|---|---|---|
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
- Open the Actor on Apify, listed as “Followscores Scraper”, and sign in. You need an Apify account.
- Fill in the Input tab, then click Start.
- 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
noResultsitem, 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
maxItemsor 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 bothdateRangeFromanddateRangeToare set. Both are required. - For
teamInfo, that at least one team is picked inteams.
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,dateRangeLeaguesordateRangeTeamsto reduce stored items. FordateRange, this doesn’t reduce the per-day query charge. - Keep date ranges as short as you need: every extra day is another query.
- Set
maxItemsto 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.
Related reading
- What to check before budgeting an Actor run — Understand the questions behind a scraping budget: the Actor’s current pricing, your input limits, sample output, and the effect of retries or incomplete runs.
- Planning predictable output for our Apify Actors — How we’re approaching output schemas for BatScrape: explicit fields, example records, and clear change notes before consumers build on a dataset.
- Planning a scraper around the data you need — A practical starting checklist for a scraping task: define the records, inspect a sample, identify useful fields, and make the output easy to validate.
- How to use BatScrape Actors on Apify — Run an Actor in Apify Console or through the API, export its dataset, schedule runs and pass results to automation tools.
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.