Transfermarkt Scraper - Players, Clubs & Market Values
Pricing
from $1.00 / 1,000 results
Transfermarkt Scraper - Players, Clubs & Market Values
[π° $1.0 / 1K] Scrape football/soccer data from Transfermarkt: player profiles with market value history, club squads, competition tables, and transfer records. Paste any Transfermarkt URL β the scraper detects the page type automatically. Up to 20+ languages supported.
Pricing
from $1.00 / 1,000 results
Rating
0.0
(0)
Developer
SolidCode
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
2 days ago
Last modified
Categories
Share
Transfermarkt Scraper
Pull football data from Transfermarkt at scale β player profiles with market values in EUR, club squads with total and average squad value, competition tables with tier and total league valuation, and paginated transfer-record lists with fee, season, and from/to clubs. Built for scouts, football analysts, sports-media editors, and fantasy-league operators who need a clean structured Transfermarkt dataset across players, clubs, competitions, and transfers in a single run β without stitching four separate scrapers together.
Why This Scraper?
- Four record types in one actor β player, club, competition, and transfer β every competing Transfermarkt scraper on Apify is player-only. Paste a club URL and get the club row; paste a competition URL and get the competition plus its league-table clubs; paste
/statistik/topabloesenand get paginated transfer rows. The output dataset auto-routes byrecordType. - Auto-detects the page type from the URL β mix player, club, competition, and transfer-record URLs in the same
startUrlsarray. The scraper inspects the path (/profil/spieler/,/startseite/verein/,/startseite/wettbewerb/,/transfers/transferrekorde/) and runs the right parser for each. - 13 regional Transfermarkt mirrors β pick from
.com,.us,.de,.world,.es,.fr,.it,.nl,.com.br,.pl,.com.tr,.jp, and.co.uk. Player and club IDs are identical across mirrors, so the scraper rewrites your URLs to the mirror you select β position labels, country names, and competition names come back in the language of that region. - Full market-value history per player β every market-value snapshot Transfermarkt has ever published for a player, with season ID, the club they were at, their age, the compact label ("β¬180.00m"), and the EUR integer ready for charting.
- Career transfer history with fee, market value, and direction β for every transfer in a player's career: date, from-club, to-club, fee in EUR, market value at the time, transfer type (loan / permanent / free), and the "fee description" Transfermarkt prints next to the fee.
- Achievements (trophies) and injury absences as opt-in enrichments β toggle
includeAchievementsto get the player's full trophy cabinet (league titles, cups, individual awards) andincludeInjuriesto get every injury absence with type, start/end date, duration in days, and games missed. - Nested expansion of leagues into squads β flip
includeCompetitionClubsandincludeClubSquadto walk a whole league: one competition URL becomes 18β20 club rows, and each club row expands into 25β35 player profile rows. Fetch the entire Premier League's player base from a single input URL. - Robust EUR fee normalizer β Transfermarkt prints values in five different formats:
β¬222.00m,β¬1.50bn,β¬500Th.,222,00 Mio. β¬,ablΓΆsefrei. We normalize every fee into a plain integer EUR field (feeEur,marketValueEur) alongside the compact display string, so downstream pipelines can sort, filter, and aggregate without parsing currency text.
Use Cases
Player Scouting & Recruitment Analytics
- Pull every player on a competitor club's senior squad with current market value, position, contract end date, and nationality
- Build short-lists of out-of-contract players by filtering on
currentClubContractUntil - Compare market-value trajectories across an entire age cohort using the per-player MV history
Transfer Market Research
- Track all-time top transfer fees in EUR by paginating
/statistik/topabloesen - Monitor inbound and outbound moves for a specific club by following its transfers page
- Quantify how often loans convert to permanent deals across a league season
Fantasy League & Game Analytics
- Seed a fantasy database with the full Premier League player set in one run (competition URL + both expansion toggles)
- Refresh weekly market values and injury absences for every fantasy-eligible player
- Detect emerging-talent price spikes via the market-value history delta
Sports Media & Editorial Pipelines
- Generate match-preview cards with both clubs' squad sizes, average ages, and total values
- Produce localized transfer-window articles by switching
languageto Italian, German, or Brazilian Portuguese - Build a "biggest signings of the season" leaderboard from the transfer-records list
Football Data Science & Modeling
- Train transfer-fee prediction models against the full historical transfer history
- Study career mobility patterns using
transferHistory(date, age, fee, market value at the time) - Benchmark league strength via aggregated
totalMarketValueEuracross competitions
Agency & Player-Representation Workflows
- Watch contract expiries across 50+ leagues by pulling competition pages quarterly
- Track injury history (type, days out, games missed) for risk profiling
- Pair
formerClubsNotewithtransferHistoryto reconstruct a complete player career timeline
Getting Started
Single Player Profile
The simplest possible run β one player, full enrichment defaults (market-value history and transfer history on):
{"startUrls": ["https://www.transfermarkt.com/erling-haaland/profil/spieler/418560"]}
Multiple Players With All Enrichments
Pull four players with every optional sub-resource turned on β achievements and injuries included:
{"startUrls": ["https://www.transfermarkt.com/erling-haaland/profil/spieler/418560","https://www.transfermarkt.com/kylian-mbappe/profil/spieler/342229","https://www.transfermarkt.com/jude-bellingham/profil/spieler/581678","https://www.transfermarkt.com/vinicius-junior/profil/spieler/371998"],"includeMarketValueHistory": true,"includeTransferHistory": true,"includeAchievements": true,"includeInjuries": true}
Whole Premier League β Competition + Clubs
One competition URL expanded into every club on the league table (20 rows total):
{"startUrls": ["https://www.transfermarkt.com/premier-league/startseite/wettbewerb/GB1"],"includeCompetitionClubs": true,"maxResults": 500}
Full League Walk β Competition β Clubs β Squads
One competition URL fans out to ~20 clubs and each club's full squad (~500β700 player rows):
{"startUrls": ["https://www.transfermarkt.com/laliga/startseite/wettbewerb/ES1"],"includeCompetitionClubs": true,"includeClubSquad": true,"language": "es","maxResults": 600}
Top All-Time Transfer Fees
Paginate the global transfer-records page with a row cap:
{"startUrls": ["https://www.transfermarkt.com/statistik/topabloesen"],"recordType": "transfers","maxResults": 250}
Input Reference
What to Scrape
| Parameter | Type | Default | Description |
|---|---|---|---|
startUrls | string[] | [Haaland profile, Manchester City club] | One or more Transfermarkt URLs. Supports player profiles (/profil/spieler/<id>), club squad pages (/startseite/verein/<id>), competitions (/startseite/wettbewerb/<code>), and transfer-records pages (/transfers/transferrekorde/..., /statistik/topabloesen). The scraper detects the page type automatically. |
recordType | select | Auto-detect from URL (recommended) | Optional filter: Auto-detect from URL (recommended), Players only, Clubs only, Competitions only, or Transfer records only. Use auto-detect unless you want to ignore URLs of other types in the input. |
How Much to Scrape
| Parameter | Type | Default | Description |
|---|---|---|---|
maxResults | integer | 1000 | Maximum number of result rows to return across the whole run. For club URLs this caps the number of player rows; for competition URLs it caps club rows; for transfer-list URLs it caps transfer rows. Set to 0 for unlimited. |
language | select | English (.com) | Which Transfermarkt regional mirror to use. Options: English (.com), English (US), German (.de), English (.world), Spanish (.es), French (.fr), Italian (.it), Dutch (.nl), Portuguese - Brazil (.com.br), Polish (.pl), Turkish (.com.tr), Japanese (.jp), English (.co.uk). Affects language of position labels, country names, and competition names. |
Player Enrichments
Optional extras fetched only for player URLs. Each toggle adds one request per player.
| Parameter | Type | Default | Description |
|---|---|---|---|
includeMarketValueHistory | boolean | true | Full historical market-value timeline per player (date, value, age, club at the time). |
includeTransferHistory | boolean | true | Every transfer in the player's career with date, from-club, to-club, fee, and market value at the time. |
includeAchievements | boolean | false | Trophies and titles (league titles, cups, individual awards). |
includeInjuries | boolean | false | Injury history table (injury type, dates, games missed). |
Nested Expansion
Turning these on multiplies result count β a typical first-division squad has 25β35 players and a top-flight league has 18β20 clubs.
| Parameter | Type | Default | Description |
|---|---|---|---|
includeClubSquad | boolean | false | For club URLs, also fetch a full profile for every player on the squad β not just the club summary row. |
includeCompetitionClubs | boolean | false | For competition URLs, also fetch a full club page for every club in the competition. Combine with includeClubSquad to walk an entire league down to player level. |
Output
Every row carries a recordType field β player, club, competition, or transfer β so you can split the dataset cleanly downstream. The Apify dataset viewer ships with one tab per record type out of the box.
Player (recordType: "player")
{"recordType": "player","sourceUrl": "https://www.transfermarkt.com/erling-haaland/profil/spieler/418560","id": 418560,"name": "Erling Haaland","shortName": "E. Haaland","displayName": "Erling Haaland","portraitUrl": "https://img.a.transfermarkt.technology/portrait/header/418560-1709108116.jpg","age": 25,"dateOfBirth": "2000-07-21","placeOfBirth": "Leeds","countryOfBirthId": 189,"nationalityId": 125,"secondNationalityId": null,"heightMeters": 1.95,"preferredFootId": 3,"positionGroup": 1,"positionGroupName": "Attack","positionId": 7,"contractUntil": "2034-06-30","marketValue": { "value": 200000000, "currency": "EUR", "compact": "β¬200.00m" },"currentClubId": 281,"currentClubJoinedDate": "2022-07-01","isCaptain": false,"nationalTeamCountryId": 125}
Player β Core Fields
| Field | Type | Description |
|---|---|---|
recordType | string | Always "player" |
sourceUrl | string | The Transfermarkt URL this row came from |
id | number | Transfermarkt player ID |
name | string | Display name |
shortName | string | Short display name |
displayName | string | Long display name |
artistName | string | Stage name (used for Brazilian players like "PelΓ©") |
portraitUrl | string | Headshot image URL |
relativeUrl | string | Path on transfermarkt.com |
Player β Biography
| Field | Type | Description |
|---|---|---|
age | number | Current age in years |
dateOfBirth | string | ISO date of birth |
dateOfDeath | string | ISO date of death (if applicable) |
placeOfBirth | string | City of birth |
countryOfBirthId | number | Transfermarkt country ID |
gender | string | Gender |
passportName | string | Name as on passport |
nationalityId | number | Primary nationality (Transfermarkt country ID) |
secondNationalityId | number | Second nationality if dual |
Player β Physical & Position
| Field | Type | Description |
|---|---|---|
heightMeters | number | Height in metres |
preferredFootId | number | Right / left / both |
positionGroup | number | Group ID (Attack, Midfield, Defence, Goalkeeper) |
positionGroupName | string | Group label |
positionId | number | Specific position (e.g. Centre-Forward) |
firstSidePositionId | number | Secondary position |
secondSidePositionId | number | Tertiary position |
outfitterId | number | Boot sponsor |
Player β Club & Contract
| Field | Type | Description |
|---|---|---|
currentClubId | number | Current club's Transfermarkt ID |
currentClubJoinedDate | string | When they joined the current club |
currentClubContractUntil | string | Contract expiry at the current club |
contractUntil | string | Overall contract end date |
lastContractRenewal | string | Date of the most recent renewal |
isCaptain | boolean | Captain flag |
nationalTeamCountryId | number | National team country |
formerClubsNote | string | Free-text former-clubs note |
consultantAgencyId | number | Agency representing the player |
Player β Market Value
| Field | Type | Description |
|---|---|---|
marketValue | object | { value, currency, compact, determined } β current market value in EUR |
previousMarketValue | object | Previous valuation snapshot |
marketValueHistory | object[] | Full history [{ seasonId, clubId, age, value, currency, compact, determined }] β only when includeMarketValueHistory is on |
currentMarketValueSnapshot | object | Latest snapshot from the history endpoint |
Player β Transfer History, Achievements, Injuries
| Field | Type | Description |
|---|---|---|
transferHistory | object[] | All career transfers [{ id, date, seasonId, fromClubId, toClubId, fromCompetitionId, toCompetitionId, fee, marketValue, age, type, typeName, feeDescription, contractUntilDate }] |
mostRecentTransfer | object | Single most recent transfer entry |
achievements | object[] | Trophies [{ title, group }] β only when includeAchievements is on |
absences | object[] | All absences (injuries + national-team call-ups) |
injuries | object[] | Absences with the national-team call-ups filtered out [{ absenceId, name, competitionId, seasonId, start, end, missedGamesCount, durationDays }] |
Club (recordType: "club")
{"recordType": "club","sourceUrl": "https://www.transfermarkt.com/manchester-city/startseite/verein/281","id": 281,"name": "Manchester City","shortName": "Man City","abbreviation": "MCI","isNationalTeam": false,"countryId": 189,"primaryCompetitionId": "GB1","crestUrl": "https://tmssl.akamaized.net/images/wappen/head/281.png","addressStreet": "Etihad Campus, Etihad Stadium","addressCity": "Manchester","addressPostcode": "M11 3FF","addressCountryId": 189,"squadSize": 26,"squadAverageAge": 26.4,"squadMarketValueTotal": { "value": 1110000000, "currency": "EUR", "compact": "β¬1.11bn" },"squadMarketValueAverage": { "value": 42700000, "currency": "EUR", "compact": "β¬42.70m" },"squadAcquisitionValue": { "value": 1230000000, "currency": "EUR", "compact": "β¬1.23bn" }}
| Field | Type | Description |
|---|---|---|
recordType | string | Always "club" |
sourceUrl | string | The Transfermarkt URL this row came from |
id | number | Transfermarkt club ID |
name | string | Full club name |
shortName | string | Short club name |
abbreviation | string | Three-letter abbreviation |
identifier | string | URL slug |
isNationalTeam | boolean | True for national teams |
isSpecialClub | boolean | Flag for academy / B teams |
crestUrl | string | Crest image URL |
relativeUrl | string | Path on transfermarkt.com |
countryId | number | Transfermarkt country ID |
primaryCompetitionId | string | Primary league code (e.g. GB1) |
addressStreet | string | Street address |
addressCity | string | City |
addressPostcode | string | Postcode |
addressCountryId | number | Country ID of the registered address |
squadSize | number | Number of senior squad players |
squadAverageAge | number | Mean age of the squad |
squadMarketValueTotal | object | Total squad market value { value, currency, compact } |
squadMarketValueAverage | object | Average per-player market value |
squadAcquisitionValue | object | Sum of fees paid to assemble the squad |
Competition (recordType: "competition")
{"recordType": "competition","sourceUrl": "https://www.transfermarkt.com/premier-league/startseite/wettbewerb/GB1","id": "GB1","name": "Premier League","shortName": "Premier League","identifier": "premier-league","logoUrl": "https://tmssl.akamaized.net/images/logo/header/gb1.png","typeId": 1,"currentSeasonId": 2025,"currentSeason": "25/26","countryId": 189,"confederationId": 6,"tier": 1,"gameDayCount": 38,"isOngoing": true,"isTournament": false,"totalMarketValue": { "value": 11400000000, "currency": "EUR", "compact": "β¬11.40bn" }}
| Field | Type | Description |
|---|---|---|
recordType | string | Always "competition" |
sourceUrl | string | The Transfermarkt URL this row came from |
id | string | Competition code (e.g. GB1, ES1, IT1, L1, FR1) |
name | string | Competition full name |
shortName | string | Short name |
identifier | string | URL slug |
relativeUrl | string | Path on transfermarkt.com |
logoUrl | string | Competition logo URL |
typeId | number | League / cup / international type ID |
currentSeasonId | number | Numeric season ID (e.g. 2025) |
currentSeason | string | Season label (e.g. 25/26) |
countryId | number | Host-country Transfermarkt ID |
confederationId | number | UEFA / CONMEBOL / etc. ID |
associationId | number | Football association ID |
tier | number | League tier (1 = top flight) |
gameDayCount | number | Match days in a season |
isOngoing | boolean | True if the season is in progress |
isTournament | boolean | True for knockout tournaments |
totalMarketValue | object | Aggregate market value of every club in the league { value, currency, compact } |
Transfer (recordType: "transfer")
{"recordType": "transfer","rank": "1","playerId": "342229","playerName": "Kylian MbappΓ©","position": "Centre-Forward","season": "17/18","joinedClubId": "583","joinedClubName": "Paris Saint-Germain","joinedCompetitionCode": "FR1","joinedCompetitionName": "Ligue 1","feeText": "β¬180.00m","feeEur": 180000000}
| Field | Type | Description |
|---|---|---|
recordType | string | Always "transfer" |
rank | string | Position in the transfer-records list |
playerId | string | Transfermarkt player ID |
playerName | string | Player name as displayed |
position | string | Playing position |
season | string | Season label (e.g. 17/18) |
joinedClubId | string | Destination club's Transfermarkt ID |
joinedClubName | string | Destination club name |
joinedCompetitionCode | string | Destination league code (e.g. FR1) |
joinedCompetitionName | string | Destination league name |
feeText | string | Raw Transfermarkt fee string (e.g. β¬180.00m, ablΓΆsefrei) |
feeEur | number | Fee normalized to integer EUR (0 for free transfers, null when unknown) |
Tips for Best Results
- Mix record types in one run.
startUrlscan hold player, club, competition, and transfer-list URLs at the same time β the auto-detector routes each one to the right parser. Pay for one start, get four datasets. - Set
maxResultsbefore flipping nested toggles. A single competition URL withincludeCompetitionClubsandincludeClubSquadboth on can produce 500β700 player rows. Cap your spend by settingmaxResultsto the figure you actually need. - Use competition codes you already know. Premier League is
GB1, La Liga isES1, Serie A isIT1, Bundesliga isL1, Ligue 1 isFR1. Paste the URL ending in those codes to skip search. - Switch
languageto localize labels. PickingGerman (.de)returns position labels like "MittelstΓΌrmer" and country names in German β handy for regional sports-media pipelines. Player and club IDs stay identical across all 13 mirrors. - Combine
includeCompetitionClubswithincludeClubSquadto fetch an entire top-flight league down to every player in one input URL. The output dataset then carries all three record types and joins cleanly oncurrentClubIdandprimaryCompetitionId. - Leave achievements and injuries off unless you need them. Each adds one extra request per player. For a squad-wide refresh of market values, the defaults (MV history + transfer history) already give you the most-requested fields.
- For transfer-records lists, prefer competition-scoped URLs. A URL like
/transfers/transferrekorde/statistik/topabloesen?wettbewerb_id=GB1returns Premier-League-only transfers β much more targeted than the global all-time list.
Pricing
$1.00 per 1,000 results β flat rate, billed per row in the output dataset.
| Results | Total cost |
|---|---|
| 100 | $0.10 |
| 1,000 | $1.00 |
| 10,000 | $10.00 |
| 100,000 | $100.00 |
A "result" is any row in the output dataset β a player, club, competition, or transfer. No compute charges β you only pay per result returned.
Integrations
Export data in JSON, CSV, Excel, XML, or RSS. Connect to 1,500+ apps via:
- Zapier / Make / n8n β Workflow automation
- Google Sheets β Direct spreadsheet export
- Slack / Email β Notifications on new results
- Webhooks β Trigger custom APIs on run completion
- Apify API β Full programmatic access
Legal & Ethical Use
This actor is designed for legitimate football research, scouting, sports analytics, and editorial use against publicly available Transfermarkt pages. Users are responsible for complying with applicable laws and Transfermarkt's terms of service, including attributing Transfermarkt as the data source where appropriate and making reasonable-rate requests. Do not use extracted data for spam, harassment, or any illegal purpose.