Transfermarkt Scraper - Players, Market Values & Transfers
Pricing
from $1.19 / 1,000 player delivereds
Transfermarkt Scraper - Players, Market Values & Transfers
Scrape Transfermarkt players by name search, player links, club squads or whole leagues: market value (current, previous, highest), contract until, agency, position, foot, height, nationality, club, national team and full transfer history with fees. Error rows are free.
Pricing
from $1.19 / 1,000 player delivereds
Rating
0.0
(0)
Developer
Scrapewise Data
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
2 days ago
Last modified
Categories
Share
Transfermarkt Scraper: players, market values, contracts, agencies and transfer history
Transfermarkt Scraper collects football player data from Transfermarkt without an account or cookies. Give it player names, player links, club links or whole competitions (Premier League, LaLiga, Serie A, Bundesliga, Ligue 1, MLS and any other league code) and each player comes back as one clean row: current, previous and highest market value with dates, contract until, last renewal, agency, position, preferred foot, height, nationalities, current club and league, shirt number, national team and the full transfer history with fees.
It is used by scouts and analysts to build player databases, by fantasy and betting tools to follow market values, by journalists to check transfer fees and contracts, and by data teams to feed dashboards and AI models with squad-level data for a whole league in one run.
At a glance
| What | Price |
|---|---|
| Player delivered | US$ 1.40 per 1,000 players (US$ 0.0014 each) |
| Run start | US$ 0.005 per run |
- A full Premier League (20 clubs, around 500 players) with transfer history = about US$ 0.71.
- Error rows and duplicates are never charged.
maxItemsis a hard cap, and a spending limit set on the run stops it cleanly with everything delivered so far. - Transfer history and market value history are included in the same price per player.
Quick start
Search players by name:
{"searchQueries": ["Wirtz", "Yamal"],"maxItems": 20}
Every player of a league, club by club:
{"competitions": ["GB1", "ES1"],"maxItems": 0}
Specific players and squads from links:
{"startUrls": ["https://www.transfermarkt.com/florian-wirtz/profil/spieler/598577","https://www.transfermarkt.com/fc-barcelona/startseite/verein/131"],"includeMarketValueHistory": true}
An empty input runs the example: the first 50 players of the Premier League.
Input
| Field | Type | What it does |
|---|---|---|
searchQueries | list of text | Player names (or club names with searchType: "clubs"), one search each |
searchType | players or clubs | players delivers the matching players; clubs delivers the current squad of each matching club |
competitions | list of codes | Transfermarkt competition codes such as GB1, ES1, IT1, L1, FR1, NL1, PO1, BRA1, MLS1. Every club, then every player |
startUrls | list of links | Player profile links, club links (/verein/<id>) or competition links (/wettbewerb/<code>), any Transfermarkt domain |
includeTransfers | true/false | Adds the full transfer history of each player (default on) |
includeMarketValueHistory | true/false | Adds every market value update with date and club (default off) |
maxItems | number | Hard cap of players for the whole run (default 50, 0 = no cap) |
proxyConfiguration | proxy | Apify datacenter proxy by default |
The competition code is the last part of the competition link on Transfermarkt: for
https://www.transfermarkt.com/premier-league/startseite/wettbewerb/GB1 the code is GB1.
Output
One row per player. Values are in EUR, as Transfermarkt publishes them.
| Field | Description |
|---|---|
playerId, name, shortName, fullName | Transfermarkt id, display name, short name and full name |
url, imageUrl | Profile link and portrait image |
age, dateOfBirth, placeOfBirth, countryOfBirth | Age and birth details (left empty for players under 18) |
isUnder18, dateOfDeath | Minor flag and date of death for former players |
nationalities | One or two nationalities |
position, positionShort, positionGroup | Main position (Centre-Forward, CF) and group |
heightM, preferredFoot, outfitter | Height in metres, left/right/both, boot supplier |
agency, agencyVerified, agencyUrl | Player agency as published on Transfermarkt |
clubId, clubName, clubCountry, clubLeagueId, clubUrl | Current club and its league code |
shirtNumber, isCaptain, joinedClub, clubDebut | Squad details at the current club |
contractUntil, lastContractRenewal | Contract end and last renewal date |
formerClubsNote | Youth clubs noted by Transfermarkt |
nationalTeam, nationalTeamDebut | Senior or youth national team and debut |
marketValue, marketValueCurrency, marketValueDate | Current market value and when it was set |
previousMarketValue, previousMarketValueDate | The value before the latest update |
highestMarketValue, highestMarketValueDate | Career-high value |
marketValueTrend | increased, decreased or unchanged at the last update |
transfers | List of moves: season, date, fromClub, toClub (with ids), fee, feeEur, transferType (transfer, loan, end of loan, free transfer), marketValueAtTransfer, upcoming, url |
transferFeeTotal | Sum of the fees paid for the player, in EUR |
marketValueHistory | With includeMarketValueHistory: date, value, currency, clubId, club |
sourceQuery, scrapedAt | Which input produced the row and when |
Real row from a run on 21 Oct 2026 (transfer and value lists shortened):
{"type": "player","playerId": "598577","name": "Florian Wirtz","url": "https://www.transfermarkt.com/florian-wirtz/profil/spieler/598577","age": 23,"dateOfBirth": "2003-05-03","placeOfBirth": "Pulheim","countryOfBirth": "Germany","nationalities": ["Germany"],"position": "Attacking Midfield","positionShort": "AM","heightM": 1.77,"preferredFoot": "right","outfitter": "adidas","agency": "Relatives","agencyVerified": false,"clubId": "31","clubName": "Liverpool FC","clubCountry": "England","clubLeagueId": "GB1","shirtNumber": 7,"joinedClub": "2025-07-01","contractUntil": "2030-06-30","lastContractRenewal": null,"nationalTeam": "Germany","nationalTeamDebut": "2021-09-02","marketValue": 85000000,"marketValueCurrency": "EUR","marketValueDate": "2026-10-07","previousMarketValue": 100000000,"highestMarketValue": 140000000,"highestMarketValueDate": "2025-06-05","marketValueTrend": "decreased","transfers": [{"season": "20/21", "date": "2020-07-01", "fromClub": "Leverkusen U19", "toClub": "Leverkusen", "fee": null,"transferType": null, "upcoming": false}],"marketValueHistory": [{"date": "2020-07-08", "value": 10000000, "currency": "EUR", "club": "Bayer 04 Leverkusen"}],"sourceQuery": "Florian Wirtz","scrapedAt": "2026-10-21T20:19:04Z"}
A paid transfer looks like this (from the same row):
{"season": "25/26", "date": "2025-07-01", "fromClub": "Leverkusen", "toClub": "Liverpool", "fee": "€125.00m","feeEur": 125000000, "transferType": "transfer", "marketValueAtTransfer": 140000000}
Players under 18
Transfermarkt lists academy players too. For anyone under 18 the row keeps the football data (club, position,
market value, transfers) but leaves age, dateOfBirth, fullName, placeOfBirth and countryOfBirth empty and
sets isUnder18: true.
Errors you may see
Every error is a row with errorCode and is never charged:
| errorCode | Meaning |
|---|---|
INVALID_URL | Not a Transfermarkt player, club or competition link |
INVALID_INPUT | A field has a wrong value (for example an unknown searchType) |
NOT_FOUND | The player, club or competition code does not exist on Transfermarkt |
NO_RESULTS | The name search found nothing; check the spelling or try the last name only |
BLOCKED | Transfermarkt refused every attempt for this input; run it again in a few minutes |
UNEXPECTED | Something else stopped the run; the message says what |
Integrations, scheduling and AI agents
- Schedule a league weekly in Apify schedules to follow market value updates, contract renewals and new transfers during the window.
- Export as JSON, CSV, Excel or XML, or read the dataset from the Apify API.
- Connect it to Make, n8n, Zapier or Google Sheets through Apify integrations.
- AI agents: call it as a tool through the Apify MCP server in Claude, ChatGPT, Cursor or any MCP client, for example "list every LaLiga player whose contract ends in 2027 with a market value above 20 million".
FAQ
Do I need a Transfermarkt account? No. Everything comes from public pages.
How long does a full league take? A 20-club league with transfer history is around 500 players and takes a few
minutes. Turn off includeTransfers for the fastest run.
Which competitions work? Any league or cup that has a /wettbewerb/<code> page on Transfermarkt. The squad is
the club's current squad.
Can I get former players? Yes, by name search or profile link. Retired players show Retired as the club.
Why is agency empty for some players? Transfermarkt has no agency on file for them, or lists the player's
relative instead of a company; the row only carries what the site publishes as the agency.
Is it legal? The Actor reads public pages only and returns no emails or phone numbers. You are responsible for how you use the data under the laws that apply to you.
Something broke or a field is missing? Open an issue on the Actor page; issues are answered within a day.
Limitations
- Squads are the current ones; past seasons are not supported yet.
- Match statistics (goals, minutes, cards) are not collected.
- Market values are in EUR only, as Transfermarkt sets them.
- Manager, referee and agent search results are not collected.
Changelog
- 16 Oct 2026: first version: name search, player, club and competition links, competition codes, transfer history and market value history.