Transfermarkt Scraper - Players, Squads & Market Values avatar

Transfermarkt Scraper - Players, Squads & Market Values

Pricing

from $2.20 / 1,000 player records

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

Transfermarkt Scraper - Players, Squads & Market Values

Scrape Transfermarkt: football players with market value as a number in EUR, contract expiry, position, age, nationality, shirt number and the club they joined from, plus club squads and league tables. 31 leagues from the Premier League to MLS, Brazil and Saudi Arabia.

Pricing

from $2.20 / 1,000 player records

Rating

0.0

(0)

Developer

Scrape Sage

Scrape Sage

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

2 days ago

Last modified

Share

Disclaimer: This Actor is an independent tool and is not affiliated with, endorsed by, or sponsored by Transfermarkt GmbH & Co. KG or any of its subsidiaries. All trademarks mentioned are the property of their respective owners. "Transfermarkt" is referenced only to describe the publicly available website this Actor collects data from.

Scrape Transfermarkt, football's reference database for player valuations, into a clean dataset. Every row is one player with the market value as a number in euros, the contract expiry date, exact position, age, nationalities, shirt number, the club they joined from and the fee paid - or, in club mode, one row per club with squad size, average age, foreign-player count and total squad value.

31 competitions verified live, from the Premier League, LaLiga, Bundesliga, Serie A and Ligue 1 to MLS, Brazil's Série A, the Saudi Pro League and the J1 League. Pick a competition and the actor reads every club in it and then every squad - a whole league in one run.

Why this Transfermarkt scraper?

  • Market value as a NUMBER. marketValueEur: 220000000, not "€220.00m". €800k, €45.00m and €13.23bn all become plain integers you can sort, sum and chart - the whole point of scraping Transfermarkt at all. The formatted text is kept too.
  • Contract expiry on every player, so "who is in the final year of their deal" is a one-line filter (contractExpiresBefore) - the single most valuable recruitment query on the site.
  • A league in one run. One competition code reads the league table, then every club's squad. The Premier League is ~600 players from one input.
  • Transfer-in detail free with the squad row: joinedFrom, joinedDate and transferFeeEur come from the squad table, so you get signing history without a request per player.
  • Real pick-lists. Competitions and position groups are dropdowns built from Transfermarkt's own codes - all 31 competition codes were checked against the live site and the ones that no longer resolve were dropped, so a filter cannot silently return the wrong league.
  • Clubs mode turns a league into 20 comparable rows: squad size, average age, foreigners, average and total market value.

Use cases

  • Recruitment & scouting - shortlist by position, age, value band and contract status across a whole league.
  • Market analysis - squad valuations by club and league, valuation inflation over time, wonderkid tracking.
  • Sports media & content - "most valuable XI", "players out of contract in June", "biggest squads in Europe".
  • Fantasy football & modelling - a structured player universe with positions, ages and valuations.
  • Betting & analytics pipelines - squad strength as a numeric feature.

Important: this actor needs a residential proxy

Transfermarkt answers datacenter IP addresses with a challenge page (HTTP 202 and a ~2 KB shell) on every URL, including its homepage. The same plain request from a residential exit returns the full page. proxyConfiguration therefore defaults to Apify Proxy + RESIDENTIAL, which is correct - leave it alone unless you are supplying your own residential provider. If a datacenter proxy is used anyway, the run says so on the run card instead of returning a mysterious empty result.

How to use

  1. Pick one or more competitions - or paste Transfermarkt URLs (competition, club or player), or search player names.
  2. Choose players or clubs output.
  3. Narrow with position group, nationality, market-value band, age band or contract expiry.
  4. Set Maximum records and run.

Input

{
"competitions": ["GB1", "ES1"],
"recordType": "players",
"positionGroups": ["Attack"],
"minMarketValue": 20000000,
"maxAge": 23,
"contractExpiresBefore": "2027-06-30",
"maxResults": 300
}
  • competitions - 31 verified league codes (Premier League GB1, LaLiga ES1, Bundesliga L1, Serie A IT1, Ligue 1 FR1, Eredivisie, Liga Portugal, Süper Lig, MLS, Brasileirão, Saudi Pro League, J1 League, Championship, LaLiga2, 2. Bundesliga, Serie B, Ligue 2 and more).
  • startUrls / urlsFromFile - any Transfermarkt competition, club or player URL. Type them, upload a file, or link a remote .txt / .csv / Google Sheet.
  • searchQueries - player names; each match is returned as a full profile.
  • recordType - players (default) or clubs.
  • positionGroups - Goalkeeper · Defender · Midfield · Attack.
  • nationalities / playerNameQuery / clubNameQuery - text filters applied after the crawl.
  • minMarketValue / maxMarketValue in euros, minAge / maxAge, contractExpiresBefore (YYYY-MM-DD).
  • enrichPlayerProfiles + maxProfileRecords - see below.
  • maxClubsPerCompetition, maxResults, monitorMode / monitorKey, proxyConfiguration.

Tip: run with nothing set and you get a 25-player Premier League sample rather than a full sweep, so an exploratory or agent-issued call is never an expensive surprise.

Output

Four dataset views: Players · Market values · Contracts running down · Clubs.

{
"recordType": "player",
"playerId": "262749",
"name": "David Raya",
"url": "https://www.transfermarkt.com/david-raya/profil/spieler/262749",
"shirtNumber": 1,
"position": "Goalkeeper",
"positionGroup": "Goalkeeper",
"age": 30,
"nationalities": ["Spain"],
"nationality": "Spain",
"marketValueEur": 30000000,
"marketValueText": "€30.00m",
"contractExpires": "2028-06-30",
"joinedFrom": "Brentford FC",
"joinedDate": "2024-07-01",
"transferFeeEur": 32000000,
"club": "Arsenal FC",
"clubId": "11",
"clubUrl": "https://www.transfermarkt.com/fc-arsenal/startseite/verein/11",
"competition": "Premier League",
"competitionCode": "GB1",
"photo": "https://img.a.transfermarkt.technology/portrait/medium/262749-1780663789.jpg",
"source": "squad"
}

A club row carries name, competition, squadSize, averageAge, foreignPlayers, averageMarketValueEur, totalMarketValueEur, the crest and links to the club and squad pages.

Deep enrichment - enrichPlayerProfiles

The squad table already gives most of what you need. Turn this on to fetch each player's own profile and add date and place of birth, height in metres, preferred foot, agent, outfitter, name in home country and the date the market value was last updated. One extra request and one extra event per player, with maxProfileRecords capping the spend.

What to expect (field coverage)

Measured on a live run (Premier League squads, 2026-08-31):

FieldCoverage
name, club, position, positionGroup, age, nationality, market value, photo, competition100%
contractExpires92-96%
shirtNumber93% (a few squad players carry no number)
joinedFrom / joinedDate / transferFeeEuronly for players whose transfer-in Transfermarkt records - typically recent signings
height, foot, agent, place of birthonly with enrichPlayerProfiles on

A blank market value means Transfermarkt has not valued that player - youth and third-choice keepers mostly - and is returned as null, never as 0.

Monitor mode

Turn on monitorMode and the actor remembers every record already returned under that key and emits only new ones, tagged monitorEvent: "new". Pair it with an Apify Schedule to watch a league for new signings.

How much does it cost to scrape Transfermarkt?

This Actor uses Apify's pay-per-event pricing: you are charged only for the results it delivers, with no monthly rental and no start fee. The events it can charge are:

  • Player record - One Transfermarkt player: name, club and club link, shirt number, exact position and position group, age, nationalities, market value as a number in euros plus the formatted text, contract expiry, the club they joined from with the transfer fee, and a portrait photo.
  • Club record - One club from a league table: name, competition, squad size, average age, foreign-player count, average and total squad market value in euros, crest and links to the club and squad pages.
  • Full player profile - One player's own profile page fetched and merged in, adding date and place of birth, height, preferred foot, agent, outfitter, name in home country and the date the market value was last updated.

The current price of each event is shown on the Pricing tab of this page. Set a maximum total charge on the run if you want a hard cap on spend, and use the input limits to control how much the Actor fetches.

Automate & schedule

Schedules, webhooks, and one-click integrations for Google Sheets, Slack, Airtable, Make and Zapier.

Integrate with any app

JSON, CSV, Excel, XML and RSS through the Dataset API; start it from the API or any client library.

Use with AI assistants (MCP)

Exposed through the Apify MCP server, so Claude, ChatGPT, Cursor and any MCP client can call it as a tool - "list Premier League attackers under 23 worth over €20m whose contract ends by June 2027" becomes one tool call.

Agent-ready: autonomous payments (x402 & Skyfire)

This actor is agent-ready — AI agents can discover it, run it, and pay for it autonomously, with no Apify account and no human in the loop. It uses pay-per-event pricing and limited permissions, so it qualifies for Apify's agentic-payment standards:

  • x402 — an open, HTTP-native payment protocol. Agents pay per run in USDC on the Base network directly through the Apify MCP server — no account, no API key.
  • Skyfire — agent-to-service payments for fully autonomous AI-agent workflows.

Building an AI agent, MCP tool, or autonomous data pipeline? This scraper is ready to plug in and pay as it goes.

More sports & data scrapers from scrapesage

FAQ

Do I need an account or API key? No. This reads only public pages.

Why does my run return nothing? Almost always the proxy. Transfermarkt blocks datacenter IPs with a challenge page; set proxyConfiguration to Apify Proxy with the RESIDENTIAL group. The run card says so explicitly when that is what happened.

How many players can I get in one run? A full Premier League sweep is roughly 600 players across 20 squads. Raise maxResults and maxClubsPerCompetition to cover more, or list several competitions.

Is the market value current? It is whatever Transfermarkt currently publishes. With enrichPlayerProfiles on you also get marketValueUpdated, the date of the last revaluation.

Are the values in euros? Yes. Transfermarkt publishes in EUR and marketValueEur is a plain integer number of euros.

Can I get historical valuations? Not in this actor - it returns the current value plus, on enrichment, the date it was last updated.

Disclaimer

This Actor is an independent tool and is not affiliated with, endorsed by, or sponsored by Transfermarkt GmbH & Co. KG or any of its subsidiaries. All trademarks mentioned are the property of their respective owners.

"Transfermarkt" and any related marks are the property of their respective owners and are used here only in a descriptive, nominative sense - to identify the publicly accessible website from which this Actor collects data. This Actor is not an official Transfermarkt product, is not authorised or certified by Transfermarkt GmbH & Co. KG, and does not distribute Transfermarkt software. It collects only publicly available information; you are responsible for ensuring your use of that data complies with applicable laws, regulations and the terms of the source website.

Need help?

Open an issue on the actor's Issues tab with your input and the run ID and it will be looked at.


This actor collects publicly available football data for research and analysis. It is not affiliated with, endorsed by, or sponsored by Transfermarkt. Transfermarkt is a trademark of its respective owner.