Transfermarkt Global Football Player Scraper
Pricing
Pay per event
Transfermarkt Global Football Player Scraper
Scrape global football player profiles from Transfermarkt — career, market value history, transfers, agency, caps, injuries. Discover by player ID, club, competition (Premier League, La Liga, MLS, etc.) or search query.
Pricing
Pay per event
Rating
0.0
(0)
Developer
BowTiedRaccoon
Actor stats
0
Bookmarked
2
Total users
1
Monthly active users
a day ago
Last modified
Categories
Share
Transfermarkt Football Player Scraper
Scrape global football player data from Transfermarkt — full identities, market value history, transfers, agency, national team caps, injuries, and suspensions for 1M+ profiles. Powered by the public Transfermarkt JSON API for clean, structured records and the website itself for discovery.
Transfermarkt Football Player Scraper Features
- Returns 40+ fields per player profile, all flattened into Apify-friendly JSON.
- Discovers players four different ways — direct player IDs, club rosters, competition codes, or free-text search. Pick one.
- Pulls full market value history. That's every quarterly valuation Transfermarkt has ever published for a player, including the all-time peak.
- Captures career arcs from youth clubs through senior transfers, with fees and dates where Transfermarkt has them.
- Splits absences into injuries and suspensions. Yellow cards, red cards, sports-court verdicts — they all land in the right bucket.
- Uses the public Transfermarkt JSON API for enrichment, so the per-player payload is rich and consistent rather than scraped from inconsistent HTML.
- Default datacenter proxies handle the CloudFront WAF on listing pages. Switch to residential if you see HTTP 403s.
Who Uses Transfermarkt Player Data?
- Sports betting and trading firms — Build market value baselines, surface mispricings around transfers and injuries.
- Fantasy football platforms — Power player cards with current clubs, market values, and form context.
- Football agents and scouts — Track career arcs, contract expiries, and agency relationships at scale.
- Sports journalists and analysts — Pull standardised career histories without copy-pasting from individual profile pages.
- Academic researchers — Long-tail labour-economics studies of football transfers, salary trajectories, and migration patterns.
- Club analytics departments — Benchmark squad valuations, monitor competing rosters, scout free agents.
How Transfermarkt Football Player Scraper Works
- Pick a discovery source. Pass player IDs directly, hand it club IDs (e.g. 31 for Liverpool, 69261 for Inter Miami), feed it competition codes (GB1 for Premier League, ES1 for La Liga, MLS1 for MLS), or just type a search query. The scraper picks the highest-priority source you've provided.
- Discovery resolves to player IDs. Club rosters and competition pages get parsed for
/spieler/<id>links. Search queries hit the Transfermarkt schnellsuche endpoint. Direct IDs skip this stage entirely. - Each player gets enriched in parallel — five Transfermarkt API endpoints fan out per player to pull identity, market value history, transfers, national team caps, and absences.
- Records flatten into the dataset. All array fields are primitive strings (Apify schema requirement), club IDs resolve to names via a cached lookup, nationality IDs resolve to country names.
Input
{"playerIds": ["28003", "8198"],"maxItems": 10,"proxyConfiguration": {"useApifyProxy": true}}
| Field | Type | Default | Description |
|---|---|---|---|
searchQuery | string | "" | Free-text search on transfermarkt.com (e.g. "messi", "haaland", "bellingham"). Returns top matches up to maxItems. |
playerIds | array | ["28003", "8198"] | Transfermarkt player IDs (the numeric tail of /spieler/<id> URLs). Highest priority — when set, HTML discovery is skipped. |
clubIds | array | [] | Transfermarkt club IDs (e.g. "69261" for Inter Miami, "31" for Liverpool). Pulls every player from each club's current roster. |
competitionCodes | array | [] | Transfermarkt competition codes — GB1 (Premier League), ES1 (La Liga), IT1 (Serie A), L1 (Bundesliga), FR1 (Ligue 1), MLS1 (MLS), and so on. Pulls every club, then every player. |
maxItems | integer | 10 | Maximum number of player profiles to scrape. Keep low for test runs. |
proxyConfiguration | object | datacenter | Apify datacenter proxies are the default. Switch to RESIDENTIAL only if you see HTTP 403 errors on the HTML pages. |
Discovery priority
If you set multiple sources, the scraper picks one in this order:
playerIdsclubIdscompetitionCodessearchQuery
So if you pass both playerIds and clubIds, the IDs win.
Discovery examples
Scrape an entire Premier League team:
{"clubIds": ["31"],"maxItems": 30}
Scrape the top of the Bundesliga and get the first 100 players the page yields:
{"competitionCodes": ["L1"],"maxItems": 100}
Scrape direct player IDs (fastest, no HTML traffic):
{"playerIds": ["28003", "8198", "418560", "342229"],"maxItems": 4}
Transfermarkt Football Player Scraper Output Fields
{"player_id": "28003","profile_url": "https://www.transfermarkt.com/lionel-messi/profil/spieler/28003","full_name": "Lionel Andrés Messi Cuccitini","display_name": "Lionel Messi","date_of_birth": "1987-06-24","age": 38,"place_of_birth": "Rosario","country_of_birth": "Argentina","nationality": ["Argentina", "Spain"],"gender": "male","position": "Right Winger","position_category": "Striker","foot": "left","height_cm": 170,"current_club": "Inter Miami CF","current_club_id": "69261","current_competition": "Major League Soccer","current_competition_code": "MLS1","shirt_number": 10,"is_captain": true,"contract_until": "2028-12-31","last_contract_renewal": "2025-10-23","market_value_eur": 15000000,"market_value_currency": "EUR","market_value_determined": "2025-12-11","previous_market_value_eur": 18000000,"highest_market_value_eur": 180000000,"highest_market_value_determined": "2018-05-30","market_value_history": ["2017 | FC Barcelona | EUR 180.00M","2023 | Inter Miami CF | EUR 30.00M","2024 | Inter Miami CF | EUR 15.00M"],"agent": "Relatives","agency": "","agency_id": "1207","youth_clubs": ["Grandoli FC (1992-1995)", "Newell's Old Boys (1995-2000)"],"career_history": ["FC Barcelona -> Paris Saint-Germain | 2021-08-10 | Free Transfer | 21/22","Paris Saint-Germain -> Inter Miami CF | 2023-07-15 | Free Transfer | 23/24"],"total_transfer_fees_eur": 0,"international_team": "Argentina","international_caps": 198,"international_goals": 116,"national_team_history": ["Argentina | 198 apps | 116 goals | CURRENT_NATIONAL_PLAYER","Argentina U20 | 18 apps | 14 goals | FORMER_NATIONAL_PLAYER"],"injuries": [],"suspensions": ["2025-07-25 to 2025-07-28 | Suspension through sports court | 1 game"],"photo_url": "https://img.a.transfermarkt.technology/portrait/big/28003-1771694720.jpg","scraped_at": "2026-05-02T15:53:00.000Z"}
| Field | Type | Description |
|---|---|---|
player_id | string | Transfermarkt numeric player ID. |
profile_url | string | Canonical player profile URL on transfermarkt.com. |
full_name | string | Full legal name (passport name from Transfermarkt). |
display_name | string | Common display name. |
short_name | string | Initial-and-surname short form. |
nickname | string | Artist or nickname. Often empty for non-Brazilian players. |
date_of_birth | string | YYYY-MM-DD. |
age | number | Current age in years. |
place_of_birth | string | Birthplace city. |
country_of_birth | string | Birthplace country name. |
nationality | array of strings | Nationality country names. Most players have one; dual nationals get both. |
gender | string | male or female. |
position | string | Primary position (e.g. Right Winger, Centre-Forward, Goalkeeper). |
position_category | string | Broad group — Goalkeeper, Defender, Midfielder, Striker. |
foot | string | Preferred foot — left, right, or both. |
height_cm | number | Height in centimetres. |
current_club | string | Current club name. Empty if retired or without contract. |
current_club_id | string | Current club's Transfermarkt ID. |
current_competition | string | Current league or competition name. |
current_competition_code | string | Current competition's Transfermarkt code (GB1, ES1, MLS1, etc.). |
shirt_number | number | Current shirt number at club. |
is_captain | boolean | Whether the player is the current club captain. |
contract_until | string | Current contract expiry date (YYYY-MM-DD). |
last_contract_renewal | string | Date of last contract renewal. |
market_value_eur | number | Current market value in EUR. |
market_value_currency | string | Always EUR. |
market_value_determined | string | Date the current market value was last set. |
previous_market_value_eur | number | Previous published market value before the most recent update. |
highest_market_value_eur | number | All-time peak market value in EUR. |
highest_market_value_determined | string | Date the all-time peak was set. |
market_value_history | array of strings | `"YYYY |
agent | string | Player's individual agent or consultant. |
agency | string | Player's agency name (e.g. CAA Stellar, Wasserman). |
agency_id | string | Transfermarkt agency ID. |
youth_clubs | array of strings | "Club Name (start-end)" entries. |
career_history | array of strings | Senior club moves: `"from -> to |
total_transfer_fees_eur | number | Sum of disclosed transfer fees across senior career. |
international_team | string | Current senior national team name (or empty if uncapped). |
international_caps | number | Total senior international appearances. |
international_goals | number | Total senior international goals. |
national_team_history | array of strings | All national-team levels with apps, goals, and current/former status. |
injuries | array of strings | `"YYYY-MM-DD to YYYY-MM-DD |
suspensions | array of strings | Same format. Includes red/yellow card suspensions, sports-court rulings, and call-ups. |
photo_url | string | Player portrait URL. |
scraped_at | string | ISO timestamp the record was scraped. |
FAQ
How do I scrape Transfermarkt player data?
Transfermarkt Football Player Scraper accepts four discovery modes — direct player IDs, club IDs, competition codes, or a free-text search query. Pass any one of them in the input, set maxItems, and the scraper handles the rest. Player IDs are the numeric tail of any /spieler/<id> URL; club IDs come from /verein/<id> URLs; competition codes are the short codes Transfermarkt uses internally (GB1, ES1, IT1, L1, FR1, MLS1, etc.).
How much does Transfermarkt Football Player Scraper cost to run?
Transfermarkt Football Player Scraper uses Pay-Per-Event pricing — $0.10 per actor start plus $0.001 per player record returned. A 100-player run costs 20 cents. A 10,000-player crawl costs about $10.
What data can I get from Transfermarkt?
Transfermarkt Football Player Scraper returns 40+ fields per player — full identity (name, date of birth, place of birth, nationalities, gender), physical attributes (height, foot, position), current contract (club, competition, shirt number, captaincy, contract dates), market value (current, previous, all-time peak, plus full history), career arc (youth clubs, senior transfers with fees and dates), national team record (caps, goals per team), and an absence log split into injuries and suspensions.
Does Transfermarkt Football Player Scraper need proxies?
Transfermarkt Football Player Scraper defaults to Apify datacenter proxies, which clear Transfermarkt's CloudFront WAF on the listing pages without trouble. The Transfermarkt JSON API itself has no anti-bot layer. If you see HTTP 403 errors during a large search-query or club-roster crawl, switch to residential.
Can I scrape an entire league or just specific clubs?
Transfermarkt Football Player Scraper handles both. Pass a competition code (e.g. GB1 for Premier League) to walk every club in that league and pull their players. Pass specific club IDs to scope to those clubs only. maxItems caps the total players returned regardless of how many clubs are in scope.
How fresh is Transfermarkt market value data?
Transfermarkt updates market values quarterly (with major refreshes in December and June) and logs transfers in real time during the windows. Each record includes a market_value_determined date so you can see exactly when each valuation was set.
Need More Features?
Open an issue at the OrbTop actor support inbox and we'll consider it for the next release.
Why Use Transfermarkt Football Player Scraper?
- 40+ fields per player — Identity, contract, market value history, full career arc, national caps, agency, injuries, and suspensions all in one record.
- Four discovery modes — Direct IDs, club rosters, league walks, or free-text search. Use whichever fits your workflow.
- Public JSON API enrichment — The hard data (career history, market values, transfers) comes from Transfermarkt's own structured API, not flaky HTML parsing.
- Pay-Per-Event pricing —
$0.001per player record. Run 100 or 100,000, you pay only for what you get.