Transfermarkt Scraper - Squads, Market Values, Transfers avatar

Transfermarkt Scraper - Squads, Market Values, Transfers

Pricing

from $1.20 / 1,000 player, club or transfer row returneds

Go to Apify Store
Transfermarkt Scraper - Squads, Market Values, Transfers

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

NeverEmpty

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

13 days ago

Last modified

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

InputYou getRequests
A league (URL or code such as GB1)One club row per club: squad size, average age, foreigners, average and total market value1
A league with "Also read every club's squad"The club rows plus one player row per player of every club1 + 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 season2 (1 without transfers)
A player (URL or number such as 418560)One player row: club, position, contract end, market value1 to 2
Latest transfers worldwideThe newest transfers on the site (about 18): player, club left, club joined, fee1

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 changes column and the previous value:
    • new-transfer - a transfer that was not on the page before
    • market-value - with previousMarketValue
    • contract-expiry - with previousContractExpires
    • new-in-squad - a player who was not in the squad before
    • total-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 one target-checked event.

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

FieldWhat it does
leaguesLeague URLs or competition codes (GB1, ES1, L1, IT1, FR1).
clubsClub URLs or club numbers (281).
playersPlayer URLs or player numbers (418560).
latestTransferstrue reads the "Latest transfers" page.
leagueSquadstrue also reads the squad of every club of each league.
includeClubTransferstrue (default) also returns the arrivals and departures of each club.
maxRowsStop at this many rows (default 500, at most 5,000). Not used in monitoring mode.
monitoringModetrue returns only what changed since the last run.
resetMonitoringStatetrue 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. transferDate is 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 is null. In monitoring mode, scrapedAt of a new-transfer row 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 unreadable note 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.
  • maxRows is 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.