Transfermarkt Player Values & Transfers
Pricing
from $1.81 / 1,000 results
Transfermarkt Player Values & Transfers
Football player market values, squads, club valuations and transfers from Transfermarkt. Modes for player, club squad, league clubs and transfer windows, with optional market value history.
Pricing
from $1.81 / 1,000 results
Rating
0.0
(0)
Developer
Scraper Master
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
11 days ago
Last modified
Categories
Share
Turn public Transfermarkt pages into clean, structured rows: player profiles with current and peak market value, full club squads, league club tables, and transfer lists with parsed fees.
The Actor only reads public pages (no login), runs with low concurrency, waits a small random time between requests, retries politely on 429 and 5xx responses, and stops at your maxItems.
Modes
Pick one with the mode input.
1. player
One row per player. Accepts profile URLs or bare numeric IDs. Set includeMarketValueHistory to add the full value timeline.
{"mode": "player","playerUrls": ["https://www.transfermarkt.com/erling-haaland/profil/spieler/418560", "3333"],"includeMarketValueHistory": true,"maxItems": 10}
2. club-squad
One row per squad member of each club for a season. season is the year the season starts (2025 = 2025/26).
{ "mode": "club-squad", "clubUrls": ["https://www.transfermarkt.com/manchester-city/startseite/verein/281", "11"], "season": 2025, "maxItems": 60 }
3. competition-clubs
One row per club in a league table of clubs: squad size, average age, total market value.
{ "mode": "competition-clubs", "competitionIds": ["GB1", "ES1", "L1", "IT1", "FR1"], "season": 2025, "maxItems": 100 }
4. transfers
One row per transfer. Use competitionIds (all clubs of a league, filtered by window) or clubUrls (one club, whole season).
{ "mode": "transfers", "competitionIds": ["GB1"], "season": 2025, "window": "summer", "includeLoans": true, "maxItems": 200 }
Output fields
| Field | Modes | Description |
|---|---|---|
| playerId, name | player, club-squad | Transfermarkt ID and display name |
| shirtNumber, position | player, club-squad | Squad number (when shown) and playing position |
| dateOfBirth, age | player, club-squad | ISO date and age at scrape time |
| placeOfBirth, countryOfBirth | player | Birthplace |
| citizenship | player, club-squad | Array of countries |
| heightCm, foot | player, club-squad | Height in centimetres, preferred foot |
| currentClub, clubId | player, club-squad | Club the player belongs to now |
| joinedDate | player, club-squad | ISO date the player joined the club |
| contractExpires, agent | player | ISO date and agent name, if listed |
| marketValueEur, marketValueText | player, club-squad | Current value as a number and as displayed |
| highestMarketValueEur, highestMarketValueDate | player | Career peak value and when it was set |
| marketValueHistory | player (optional) | Array of {date, valueEur, club} |
| signedFrom, squadClub, squadClubId, season | club-squad | Previous club and the squad the row came from |
| competitionId, clubId, name, squadSize, avgAge, foreigners, avgMarketValueEur, totalMarketValueEur | competition-clubs | League club table |
| playerName, direction, fromClub(Id), toClub(Id), feeText, feeEur, loan, date, window | transfers | Transfer details; feeEur is 0 for free transfers and null when unknown |
| profileUrl, scrapedAt | all player rows | Source link and ISO timestamp |
Failed pages produce a row such as {"error": true, "mode": "...", "url": "...", "errorMessage": "..."} instead of stopping the run. Error rows are not counted against maxItems.
Notes and limitations
- Values are what the site shows, in euros. Amounts like
€1.39bn,€220.00mand€500kare converted to plain numbers. - Squad pages list each player's current club, so a past-season squad can contain players who have since moved on.
- Transfer lists on the site carry no exact date for most moves;
dateis filled only when the page shows one (for example the end date of a loan). - Club-based transfers cannot be split by window and always cover the whole season (
windowis"all"in the output). contractExpiresandagentare only collected inplayermode (they are not on squad pages).- Retired players or players without a club have empty club and value fields.
- Page layouts can change; if a selector stops matching you get an error row rather than wrong data.
- Respect the site's terms and applicable law when using the data.
Pay-per-event
Each result row is charged with the result-item event through the Apify SDK, and the run stops once your maximum charge is reached. Error rows are free.
Local run
npm installmkdir -p storage/key_value_stores/defaultecho '{"mode":"player","maxItems":1}' > storage/key_value_stores/default/INPUT.jsonAPIFY_LOCAL_STORAGE_DIR=./storage node src/main.js