Transfermarkt Scraper
Pricing
from $4.00 / 1,000 results
Transfermarkt Scraper
Transfermarkt scraper that fetches football data from any Transfermarkt page and returns structured JSON records. Handles player achievements, league tables, and injury lists in a single run.
Pricing
from $4.00 / 1,000 results
Rating
0.0
(0)
Developer
Kawsar
Actor stats
0
Bookmarked
2
Total users
1
Monthly active users
a day ago
Last modified
Categories
Share
Transfermarkt Scraper: Extract Football Data from Any Transfermarkt Page
Give it a Transfermarkt URL and it returns structured data. League tables come back as full standings with goals and points. Player profiles return every trophy by competition and season. Injury list pages pull every current injury with expected return dates. It works across any competition and any player on the site. Page type is read from the URL automatically, so you can mix all three types in one batch without any setup.
Use cases
- Football data analysis: pull league standings across multiple seasons and feed them into a spreadsheet, notebook, or dashboard
- Sports journalism: grab the current injury list for any competition before writing match previews
- Player scouting: build a complete trophy history for any player, broken down by competition and season
- Fantasy football research: check injury statuses and expected return dates across all clubs in a competition
- Data pipelines: push records into Google Sheets, databases, or BI tools using Apify integrations
- Historical records: snapshot league tables for past seasons by changing the season ID in the URL
What data does this actor collect?
Output fields vary by URL type. Each row is one record.
League table records include:
- Club position in the standings
- Club name
- Matches played, won, drawn, and lost
- Goals for and against
- Total points
Player achievement records include:
- Competition category (e.g. Champions League, La Liga)
- Season year the trophy was won (e.g. 2014/15)
Injury list records include:
- Player name and club
- Injury type or description
- Date the injury was reported
- Expected return-to-play date
Input
| Parameter | Type | Default | Description |
|---|---|---|---|
urls | string[] | required | One or more Transfermarkt URLs to scrape, one per line. You can mix page types in a single run. |
maxItems | integer | 20 | Maximum total records to return across all URLs. Set to 0 for no limit. Useful for cost control on large batch runs. |
requestDelayMs | integer | 1000 | Milliseconds to wait between consecutive page requests. Increase if you encounter rate limiting. Minimum recommended: 500ms. |
proxyConfiguration | object | Residential (US) | Proxy settings. Residential US proxies are required for Transfermarkt. Datacenter IPs are blocked by the site's bot protection. |
Supported URL types
The actor reads the URL path to figure out page type. No separate settings required.
| URL pattern | Page type | Data returned |
|---|---|---|
/<player>/erfolge/spieler/<id> | Player achievements | Trophies and honours by category and season year |
/<competition>/verletztespieler/wettbewerb/<id> | Injury list | Current injuries with expected return dates |
/<competition>/tabelle/wettbewerb/<id> | League table | Full standings with stats per club |
/<competition>/startseite/wettbewerb/<id> | Competition overview | Club list via generic table extraction |
/<player>/leistungsdaten/spieler/<id> | Player stats | Performance data via generic table extraction |
/<player>/transfers/spieler/<id> | Transfer history | Transfer records via generic table extraction |
/<player>/transferhistorie/spieler/<id> | Transfer history detail | Full transfer history via generic table extraction |
| Any other Transfermarkt URL | Generic | Any table found on the page, with headers as field names |
Competition IDs reference
Common competition IDs for building URLs:
| Competition | ID | Example league table URL |
|---|---|---|
| Premier League | GB1 | https://www.transfermarkt.com/premier-league/tabelle/wettbewerb/GB1 |
| Bundesliga | L1 | https://www.transfermarkt.com/bundesliga/tabelle/wettbewerb/L1 |
| La Liga | ES1 | https://www.transfermarkt.com/laliga/tabelle/wettbewerb/ES1 |
| Serie A | IT1 | https://www.transfermarkt.com/serie-a/tabelle/wettbewerb/IT1 |
| Ligue 1 | FR1 | https://www.transfermarkt.com/ligue-1/tabelle/wettbewerb/FR1 |
| Champions League | CL | https://www.transfermarkt.com/champions-league/tabelle/wettbewerb/CL |
| Europa League | EL | https://www.transfermarkt.com/europa-league/tabelle/wettbewerb/EL |
| MLS | MLS1 | https://www.transfermarkt.com/major-league-soccer/tabelle/wettbewerb/MLS1 |
To target a specific season, add /saison_id/<year> to the URL. The year is the starting year of the season, so saison_id/2023 is the 2023/24 season.
Example inputs
Premier League standings for the 2023/24 season
{"urls": ["https://www.transfermarkt.com/premier-league/tabelle/wettbewerb/GB1/saison_id/2023"],"maxItems": 20,"proxyConfiguration": { "useApifyProxy": true, "apifyProxyGroups": ["RESIDENTIAL"], "apifyProxyCountry": "US" }}
Player achievements for Lionel Messi
{"urls": ["https://www.transfermarkt.com/lionel-messi/erfolge/spieler/28003"],"maxItems": 0,"proxyConfiguration": { "useApifyProxy": true, "apifyProxyGroups": ["RESIDENTIAL"], "apifyProxyCountry": "US" }}
Current injury list for the Premier League
{"urls": ["https://www.transfermarkt.com/premier-league/verletztespieler/wettbewerb/GB1"],"maxItems": 50,"proxyConfiguration": { "useApifyProxy": true, "apifyProxyGroups": ["RESIDENTIAL"], "apifyProxyCountry": "US" }}
Batch run mixing all three page types
{"urls": ["https://www.transfermarkt.com/premier-league/tabelle/wettbewerb/GB1/saison_id/2023","https://www.transfermarkt.com/premier-league/verletztespieler/wettbewerb/GB1","https://www.transfermarkt.com/lionel-messi/erfolge/spieler/28003","https://www.transfermarkt.com/bundesliga/tabelle/wettbewerb/L1/saison_id/2023","https://www.transfermarkt.com/laliga/verletztespieler/wettbewerb/ES1"],"maxItems": 500,"requestDelayMs": 1500,"proxyConfiguration": { "useApifyProxy": true, "apifyProxyGroups": ["RESIDENTIAL"], "apifyProxyCountry": "US" }}
Multiple seasons for historical comparison
{"urls": ["https://www.transfermarkt.com/premier-league/tabelle/wettbewerb/GB1/saison_id/2021","https://www.transfermarkt.com/premier-league/tabelle/wettbewerb/GB1/saison_id/2022","https://www.transfermarkt.com/premier-league/tabelle/wettbewerb/GB1/saison_id/2023"],"maxItems": 0,"requestDelayMs": 1500,"proxyConfiguration": { "useApifyProxy": true, "apifyProxyGroups": ["RESIDENTIAL"], "apifyProxyCountry": "US" }}
Injury lists across multiple top leagues
{"urls": ["https://www.transfermarkt.com/premier-league/verletztespieler/wettbewerb/GB1","https://www.transfermarkt.com/bundesliga/verletztespieler/wettbewerb/L1","https://www.transfermarkt.com/laliga/verletztespieler/wettbewerb/ES1","https://www.transfermarkt.com/serie-a/verletztespieler/wettbewerb/IT1"],"maxItems": 200,"requestDelayMs": 2000,"proxyConfiguration": { "useApifyProxy": true, "apifyProxyGroups": ["RESIDENTIAL"], "apifyProxyCountry": "US" }}
Trophy history for multiple players
{"urls": ["https://www.transfermarkt.com/lionel-messi/erfolge/spieler/28003","https://www.transfermarkt.com/cristiano-ronaldo/erfolge/spieler/8198","https://www.transfermarkt.com/kylian-mbappe/erfolge/spieler/342229"],"maxItems": 0,"requestDelayMs": 1500,"proxyConfiguration": { "useApifyProxy": true, "apifyProxyGroups": ["RESIDENTIAL"], "apifyProxyCountry": "US" }}
Output
The actor stores results in a dataset. Each record is one row: one standings entry, one trophy, or one injured player.
League table record
{"position": "1","club": "Manchester City","played": "38","won": "28","drawn": "5","lost": "5","goals": "96:52","points": "89","sourceUrl": "https://www.transfermarkt.com/premier-league/tabelle/wettbewerb/GB1/saison_id/2023","scrapedAt": "2025-04-26T10:14:33.001Z"}
Player achievement record
{"category": "Champions League","achievement": "2014/15","sourceUrl": "https://www.transfermarkt.com/lionel-messi/erfolge/spieler/28003","scrapedAt": "2025-04-26T10:14:35.211Z"}
Injury list record
{"player": "Bukayo Saka","club": "Arsenal FC","injury": "Hamstring injury","since": "Jan 1, 2025","expectedReturn": "Feb 15, 2025","sourceUrl": "https://www.transfermarkt.com/premier-league/verletztespieler/wettbewerb/GB1","scrapedAt": "2025-04-26T10:14:37.422Z"}
Output field reference
| Field | Type | Page type | Description |
|---|---|---|---|
position | string | League table | Club position in the standings |
club | string | League table, Injury list | Club name |
played | string | League table | Matches played |
won | string | League table | Matches won |
drawn | string | League table | Matches drawn |
lost | string | League table | Matches lost |
goals | string | League table | Goals for and against, e.g. "96:52" |
points | string | League table | Total points |
category | string | Achievements | Competition name, e.g. "Champions League" |
achievement | string | Achievements | Season year the trophy was won, e.g. "2014/15" |
player | string | Injury list | Player name |
injury | string | Injury list | Injury type or description |
since | string | Injury list | Date the injury was reported |
expectedReturn | string | Injury list | Expected return-to-play date |
pageType | string | All (generic) | Detected page type identifier |
sourceUrl | string | All | URL the record was scraped from |
scrapedAt | string | All | ISO 8601 timestamp of when the record was scraped |
How it works
- Reads all URLs from
urls, deduplicates them, and works through them in order. - For each URL, checks the path segment to identify page type:
/erfolge/,/tabelle/,/verletztespieler/, or one of several others. - Fetches the page with a Chrome browser fingerprint to get past Transfermarkt's bot protection.
- Parses the HTML with the right parser for that type. Unknown types go to a generic extractor that reads column names off the page headers.
- Pushes records to the dataset as they come in, not batched at the end.
- Waits
requestDelayMsbetween pages. - Stops when
maxItemsis hit, if set.
Limits
Pages run one at a time, in sequence. No parallelism, which means large batch runs take longer, but they're also less likely to trip rate limits.
Each URL returns however many records are on that page. A 20-club league table gives you 20 rows. A player with 50 trophies gives you 50 records. The only cap is maxItems, which counts across the whole run.
For big batches, set requestDelayMs to at least 1500ms and use maxItems to keep costs predictable.
Proxy configuration
Residential US proxies are required. Transfermarkt blocks datacenter IPs outright at the bot protection layer, which means datacenter proxies return 403 every time. The proxy picker defaults to Residential (US) automatically.
If you're seeing 403 errors in the run log, check:
- Proxy is set to Apify Proxy, Residential group, US location
- You're not on datacenter or no-proxy mode
FAQ
What page types does this actor support?
Three have dedicated parsers: player achievements (/erfolge/), league tables (/tabelle/), and injury lists (/verletztespieler/). Any other Transfermarkt page with a data table goes to a generic extractor that reads column names off the page headers. That picks up player stats, transfer history, squad pages, market values, and fixtures without any extra configuration.
Can I scrape multiple leagues, players, and injury lists in one run?
Yes. Add everything to urls, one per line. Types can be mixed freely. Each URL runs in sequence with the configured delay between them.
What does maxItems do exactly?
It stops the run once that many total records have been pushed across all URLs. If you set maxItems: 100 and the first league table has 90 rows, only 10 more records from the next URL go through before the actor exits. Set it to 0 for no cap.
How do I find the URL for a specific season?
Open Transfermarkt, go to the competition, switch to table view, pick the season from the dropdown, and copy the URL from the address bar. The saison_id segment is what changes between seasons. saison_id/2023 is the 2023/24 season.
Why do I get HTTP 403 errors?
Transfermarkt blocks datacenter IPs outright. Switch to Residential proxies with US location. Datacenter proxies won't work on this site.
What happens if a page returns no data?
If the actor can't find a table on a page (changed structure, blocked request, or just no data there), it logs a warning and skips that URL. Nothing gets pushed for it, but the rest of the run continues normally.
Can I scrape player stats or transfer history?
Yes. Both URL types are recognized and go to the generic extractor. Field names come from the column headers on the page, so whatever Transfermarkt labels those columns is what you get in the output.
Can I get a player's market value history?
Yes. Find the market value page for the player on Transfermarkt (/marktwertverlauf/), copy the URL, and add it to urls. The generic extractor picks up the table automatically.
Integrations
The actor works with Apify integrations. Push results to Google Sheets, trigger a Zapier or Make workflow when a run finishes, or stream records into your own database. Webhooks let you automate downstream steps the moment a run completes, like updating a live dashboard after each scrape or getting notified when new injuries appear before a match weekend.
You might also find these useful
Other actors from the same collection:
| Actor | What it does |
|---|---|
| Affordable Zillow Search | Searches Zillow for affordable listings using flexible filters, good for price-range hunting across US markets |
| Affordable Zillow Details Scraper | Pulls full property details from Zillow listing pages including price history, tax records, and home facts |
| Zillow Price & Tax History Scraper | Extracts historical price changes and property tax records from Zillow for any address |
| Realtor Search | Scrapes Realtor.com search results with filters for price, beds, baths, and property type |
| Realtor Auto Suggestion | Fetches location auto-suggestions from Realtor.com, useful for building location lookup tools |
| Redfin Details Scraper | Pulls detailed listing data from Redfin including price, features, and agent info |
| Rightmove Scraper | Scrapes UK property listings from Rightmove, covers rentals and sales across Great Britain |
| Foreclosed Properties List + Emails | Finds foreclosed properties and extracts associated contact emails for outreach |
| New Construction Properties + Emails | Collects new construction listings and pulls contact email addresses for builders and agents |
| Price Reduced Properties Email List | Identifies properties with recent price cuts and gathers contact emails for follow-up |
| Auction Properties List + Email | Lists properties going to auction and extracts contact information for each |
| Pet Friendly Rental Properties List | Finds pet-friendly rental listings across platforms, filtered by location and price |
| Remote Investor 3D Homes List | Collects listings with 3D virtual tours, ideal for remote buyers and out-of-state investors |
| Market Velocity Tracker | Tracks how fast properties are moving in a given market, useful for gauging supply and demand |