Transfermarkt Scraper - Squads, Market Values, Transfers
Pricing
from $1.20 / 1,000 player, club or transfer row returneds
Transfermarkt Scraper - Squads, Market Values, Transfers
Football data from public Transfermarkt pages: club squads (position, age, nationality, market value, contract end), league club tables with total market value, and transfers with fees. Monitoring mode returns only new transfers and changed values or contracts.
Pricing
from $1.20 / 1,000 player, club or transfer row returneds
Rating
0.0
(0)
Developer
NeverEmpty
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
13 days ago
Last modified
Categories
Share
Unofficial. Reads public Transfermarkt pages only. Not affiliated with, endorsed by or connected to Transfermarkt.
Get football squads, market values, contract end dates and transfers from Transfermarkt as clean rows, and in monitoring mode get only what changed since your last run: new transfers, players whose market value moved, players whose contract end date changed.
Made for agents, scouts, journalists and betting analysts who look at the same clubs every day and do not want to diff 500 rows by hand.
What you can ask for
| Input | You get | Requests |
|---|---|---|
A league (URL or code such as GB1) | One club row per club: squad size, average age, foreigners, average and total market value | 1 |
| A league with "Also read every club's squad" | The club rows plus one player row per player of every club | 1 + 1 per club |
A club (URL or number such as 281) | One player row per squad member: position, shirt number, date of birth, age, nationalities, height, foot, joined, signed from, signing fee, contract end, market value. Plus one transfer row per arrival and departure of the current season | 2 (1 without transfers) |
A player (URL or number such as 418560) | One player row: club, position, contract end, market value | 1 to 2 |
| Latest transfers worldwide | The newest transfers on the site (about 18): player, club left, club joined, fee | 1 |
Market values and fees come as a number in euros (marketValue: 45000000), the text as shown (marketValueText: "€45.00m") and currency: "EUR". The Actor always reads the .com edition, so the format is the same on every run.
Monitoring mode
Turn on monitoringMode and schedule the Actor (for example daily).
- The first run of a league, club or player remembers its state. It returns one free note row per target and no data rows.
- Later runs return only rows that changed, with a
changescolumn and the previous value:new-transfer- a transfer that was not on the page beforemarket-value- withpreviousMarketValuecontract-expiry- withpreviousContractExpiresnew-in-squad- a player who was not in the squad beforetotal-market-value/new-in-league- for club rows of a league
- A target with no change returns one free note row (
no-change-since-last-run) and is charged as onetarget-checkedevent.
The state is kept per target in a named key-value store (transfermarkt-monitoring) in your account. Rows that did not fit in the run's maximum charge are not remembered, so they come back at the next run. Avoid running two monitoring runs for the same target at the same moment.
Input
| Field | What it does |
|---|---|
leagues | League URLs or competition codes (GB1, ES1, L1, IT1, FR1). |
clubs | Club URLs or club numbers (281). |
players | Player URLs or player numbers (418560). |
latestTransfers | true reads the "Latest transfers" page. |
leagueSquads | true also reads the squad of every club of each league. |
includeClubTransfers | true (default) also returns the arrivals and departures of each club. |
maxRows | Stop at this many rows (default 500, at most 5,000). Not used in monitoring mode. |
monitoringMode | true returns only what changed since the last run. |
resetMonitoringState | true forgets the remembered state before the run. |
There is no default league, club or player: a run with none of them returns one free note row and reads nothing.
Example input
{"clubs": ["https://www.transfermarkt.com/manchester-city/startseite/verein/281"],"includeClubTransfers": true,"monitoringMode": true}
Example rows
{"type": "player", "status": "ok", "playerId": "315858", "playerName": "Gianluigi Donnarumma", "position": "Goalkeeper","playerUrl": "https://www.transfermarkt.com/gianluigi-donnarumma/profil/spieler/315858","shirtNumber": "1", "dateOfBirth": "1999-02-25", "age": 27, "nationalities": ["Italy"], "heightCm": 196, "foot": "right","clubId": "281", "clubName": "Manchester City", "season": "26/27", "joinedDate": "2025-09-01","signedFromClubId": "583", "signedFromClub": "Paris Saint-Germain", "signedFee": 30000000,"contractExpires": "2030-06-30", "marketValue": 45000000, "marketValueText": "€45.00m", "currency": "EUR"}
{"type": "transfer", "status": "ok", "transferId": "6558535", "playerId": "648195", "playerName": "Enzo Fernández", "position": "Central Midfield","fromClubId": "631", "fromClub": "Chelsea FC", "fromLeague": "Premier League", "fromCountry": "England","toClubId": "281", "toClub": "Manchester City", "feeText": "€145.00m", "feeType": "fee", "fee": 145000000, "currency": "EUR","direction": "arrival", "season": "26/27", "transferDate": null}
feeType is one of fee, free, loan, loan-fee, end-of-loan, undisclosed (the site shows ?), none (the site shows -) or other. fee is a number only when the site shows an amount (and 0 for a free transfer).
Things to know before you rely on it
- Transfer dates are mostly not available. The transfers page of a club and the latest transfers page do not show a date.
transferDateis filled only for an arrival whose player is in the current squad list with the same previous club (the date is the squad list's "Joined" date). Otherwise it isnull. In monitoring mode,scrapedAtof anew-transferrow tells you when it was first seen. - Player transfer history is not included. A player input returns his current profile row only.
- Club transfers cover the current season as shown on the club's transfers page.
- The latest transfers page is one page of about 18 rows; the site returns the same rows for page 2.
- Leagues need a club table. Cup competitions without a league-style club table come back as a free
unreadablenote row. - No player photos. Image addresses are not returned.
- Market values on Transfermarkt are community estimates, not prices.
Limits and pace
- One request at a time, 2.5 seconds apart, at most 400 requests per run. A 20-club league with squads takes about one minute.
maxRowsis 500 by default and at most 5,000 per run.- If Transfermarkt refuses a request (HTTP 403 or 429), the run stops sending requests and says so in a free note row. It does not retry through other connections.
Rows that are not charged
Every row with type: "note" is free and says why something was not returned: bad-input, not-found (a club, league or player that does not exist), unreadable, blocked, empty, first-check, no-change-since-last-run, limit-reached, budget-reached, not-read.
Pricing
Pay per event: one record-returned event per player, club or transfer row, and one target-checked event for each monitored target that had no change. No start fee.
Fair use
Use the data in line with Transfermarkt's terms and the law that applies to you. This Actor reads only pages that are public without login, at a slow pace.
Thanks for using this Actor
We build these tools for people who run them every day, and we improve them from what users tell us.
- Missing a field, or need another filter? Tell us in the Issues tab. If the data is there, we add it.
- Found a bug or a wrong value? Post the run ID in the Issues tab. Wrong data is the thing we fix first.
If this Actor saved you time, a short review helps other people find it.