Transfermarkt Scraper - Players, Clubs & Market Values avatar

Transfermarkt Scraper - Players, Clubs & Market Values

Pricing

from $1.00 / 1,000 results

Go to Apify Store
Transfermarkt Scraper - Players, Clubs & Market Values

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

SolidCode

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

2 days ago

Last modified

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/topabloesen and get paginated transfer rows. The output dataset auto-routes by recordType.
  • Auto-detects the page type from the URL β€” mix player, club, competition, and transfer-record URLs in the same startUrls array. 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 includeAchievements to get the player's full trophy cabinet (league titles, cups, individual awards) and includeInjuries to get every injury absence with type, start/end date, duration in days, and games missed.
  • Nested expansion of leagues into squads β€” flip includeCompetitionClubs and includeClubSquad to 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 language to 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 totalMarketValueEur across 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 formerClubsNote with transferHistory to 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

ParameterTypeDefaultDescription
startUrlsstring[][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.
recordTypeselectAuto-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

ParameterTypeDefaultDescription
maxResultsinteger1000Maximum 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.
languageselectEnglish (.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.

ParameterTypeDefaultDescription
includeMarketValueHistorybooleantrueFull historical market-value timeline per player (date, value, age, club at the time).
includeTransferHistorybooleantrueEvery transfer in the player's career with date, from-club, to-club, fee, and market value at the time.
includeAchievementsbooleanfalseTrophies and titles (league titles, cups, individual awards).
includeInjuriesbooleanfalseInjury 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.

ParameterTypeDefaultDescription
includeClubSquadbooleanfalseFor club URLs, also fetch a full profile for every player on the squad β€” not just the club summary row.
includeCompetitionClubsbooleanfalseFor 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

FieldTypeDescription
recordTypestringAlways "player"
sourceUrlstringThe Transfermarkt URL this row came from
idnumberTransfermarkt player ID
namestringDisplay name
shortNamestringShort display name
displayNamestringLong display name
artistNamestringStage name (used for Brazilian players like "PelΓ©")
portraitUrlstringHeadshot image URL
relativeUrlstringPath on transfermarkt.com

Player β€” Biography

FieldTypeDescription
agenumberCurrent age in years
dateOfBirthstringISO date of birth
dateOfDeathstringISO date of death (if applicable)
placeOfBirthstringCity of birth
countryOfBirthIdnumberTransfermarkt country ID
genderstringGender
passportNamestringName as on passport
nationalityIdnumberPrimary nationality (Transfermarkt country ID)
secondNationalityIdnumberSecond nationality if dual

Player β€” Physical & Position

FieldTypeDescription
heightMetersnumberHeight in metres
preferredFootIdnumberRight / left / both
positionGroupnumberGroup ID (Attack, Midfield, Defence, Goalkeeper)
positionGroupNamestringGroup label
positionIdnumberSpecific position (e.g. Centre-Forward)
firstSidePositionIdnumberSecondary position
secondSidePositionIdnumberTertiary position
outfitterIdnumberBoot sponsor

Player β€” Club & Contract

FieldTypeDescription
currentClubIdnumberCurrent club's Transfermarkt ID
currentClubJoinedDatestringWhen they joined the current club
currentClubContractUntilstringContract expiry at the current club
contractUntilstringOverall contract end date
lastContractRenewalstringDate of the most recent renewal
isCaptainbooleanCaptain flag
nationalTeamCountryIdnumberNational team country
formerClubsNotestringFree-text former-clubs note
consultantAgencyIdnumberAgency representing the player

Player β€” Market Value

FieldTypeDescription
marketValueobject{ value, currency, compact, determined } β€” current market value in EUR
previousMarketValueobjectPrevious valuation snapshot
marketValueHistoryobject[]Full history [{ seasonId, clubId, age, value, currency, compact, determined }] β€” only when includeMarketValueHistory is on
currentMarketValueSnapshotobjectLatest snapshot from the history endpoint

Player β€” Transfer History, Achievements, Injuries

FieldTypeDescription
transferHistoryobject[]All career transfers [{ id, date, seasonId, fromClubId, toClubId, fromCompetitionId, toCompetitionId, fee, marketValue, age, type, typeName, feeDescription, contractUntilDate }]
mostRecentTransferobjectSingle most recent transfer entry
achievementsobject[]Trophies [{ title, group }] β€” only when includeAchievements is on
absencesobject[]All absences (injuries + national-team call-ups)
injuriesobject[]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" }
}
FieldTypeDescription
recordTypestringAlways "club"
sourceUrlstringThe Transfermarkt URL this row came from
idnumberTransfermarkt club ID
namestringFull club name
shortNamestringShort club name
abbreviationstringThree-letter abbreviation
identifierstringURL slug
isNationalTeambooleanTrue for national teams
isSpecialClubbooleanFlag for academy / B teams
crestUrlstringCrest image URL
relativeUrlstringPath on transfermarkt.com
countryIdnumberTransfermarkt country ID
primaryCompetitionIdstringPrimary league code (e.g. GB1)
addressStreetstringStreet address
addressCitystringCity
addressPostcodestringPostcode
addressCountryIdnumberCountry ID of the registered address
squadSizenumberNumber of senior squad players
squadAverageAgenumberMean age of the squad
squadMarketValueTotalobjectTotal squad market value { value, currency, compact }
squadMarketValueAverageobjectAverage per-player market value
squadAcquisitionValueobjectSum 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" }
}
FieldTypeDescription
recordTypestringAlways "competition"
sourceUrlstringThe Transfermarkt URL this row came from
idstringCompetition code (e.g. GB1, ES1, IT1, L1, FR1)
namestringCompetition full name
shortNamestringShort name
identifierstringURL slug
relativeUrlstringPath on transfermarkt.com
logoUrlstringCompetition logo URL
typeIdnumberLeague / cup / international type ID
currentSeasonIdnumberNumeric season ID (e.g. 2025)
currentSeasonstringSeason label (e.g. 25/26)
countryIdnumberHost-country Transfermarkt ID
confederationIdnumberUEFA / CONMEBOL / etc. ID
associationIdnumberFootball association ID
tiernumberLeague tier (1 = top flight)
gameDayCountnumberMatch days in a season
isOngoingbooleanTrue if the season is in progress
isTournamentbooleanTrue for knockout tournaments
totalMarketValueobjectAggregate 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
}
FieldTypeDescription
recordTypestringAlways "transfer"
rankstringPosition in the transfer-records list
playerIdstringTransfermarkt player ID
playerNamestringPlayer name as displayed
positionstringPlaying position
seasonstringSeason label (e.g. 17/18)
joinedClubIdstringDestination club's Transfermarkt ID
joinedClubNamestringDestination club name
joinedCompetitionCodestringDestination league code (e.g. FR1)
joinedCompetitionNamestringDestination league name
feeTextstringRaw Transfermarkt fee string (e.g. €180.00m, ablΓΆsefrei)
feeEurnumberFee normalized to integer EUR (0 for free transfers, null when unknown)

Tips for Best Results

  • Mix record types in one run. startUrls can 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 maxResults before flipping nested toggles. A single competition URL with includeCompetitionClubs and includeClubSquad both on can produce 500–700 player rows. Cap your spend by setting maxResults to the figure you actually need.
  • Use competition codes you already know. Premier League is GB1, La Liga is ES1, Serie A is IT1, Bundesliga is L1, Ligue 1 is FR1. Paste the URL ending in those codes to skip search.
  • Switch language to localize labels. Picking German (.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 includeCompetitionClubs with includeClubSquad to 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 on currentClubId and primaryCompetitionId.
  • 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=GB1 returns 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.

ResultsTotal 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

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.