Transfermarkt Player Market Values & Latest Transfers avatar

Transfermarkt Player Market Values & Latest Transfers

Pricing

from $0.70 / 1,000 player scrapeds

Go to Apify Store
Transfermarkt Player Market Values & Latest Transfers

Transfermarkt Player Market Values & Latest Transfers

Transfermarkt player market values for any competition (Premier League, LaLiga, Bundesliga, Serie A, Ligue 1 and more) or the latest transfers feed. One flat row per player: name, club, position, age, nationality, market value in EUR; for transfers the clubs left and joined, fee and date.

Pricing

from $0.70 / 1,000 player scrapeds

Rating

0.0

(0)

Developer

Superslow Sloth

Superslow Sloth

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

18 hours ago

Last modified

Share

Read Transfermarkt's football market values for any competition (Premier League, LaLiga, Bundesliga, Serie A, Ligue 1 and every other league it ranks), or its latest transfers feed, and get one flat row per player: name, profile link, club, position, age, nationality, the market value as a number in euro and as Transfermarkt writes it, and for transfers the club left, the club joined, the transfer date and the fee. Run it on a schedule and diff on player_id to watch valuations move or new transfers land.

No account, no API key, no login, no browser. One plain page request returns 25 players.

Input

FieldNotes
modemarket-values (default) reads each competition's top market-value table. latest-transfers reads the latest-transfers feed in its detailed view.
competitionsCompetition codes, one per line, for market-values: GB1 Premier League, ES1 LaLiga, L1 Bundesliga, IT1 Serie A, FR1 Ligue 1, and any other Transfermarkt code (the last part of a competition page's address, .../wettbewerb/GB1). Ignored by latest-transfers.
maxItemsPlayers to return per competition (or for the feed). Default and maximum 100. 25 per page.
proxyConfigurationApify proxy by default.

Output

One row per player. Both modes return the same columns, so a dataset loads into one table; the columns that belong to the other mode are null.

FieldNotes
mode, player_id, name, url, image_urlTransfermarkt's numeric player id (the number after /spieler/; stable, diff on it), the name, the absolute profile link and the portrait.
position, age, nationality, nationalitiesAs shown. nationality is the first flag (Transfermarkt lists the primary one first); nationalities is every flag.
market_value_eurThe market value as a whole number of euro: €120.00m is 120000000, €500k is 500000. Null when Transfermarkt shows - or anything that is not a euro amount, never 0.
market_value_rawThe same cell as Transfermarkt writes it (€120.00m, €500k, -).
competition_code, competition, season, rankMarket-values mode: the code asked for, the competition name and season from the page title (Premier League, 26/27), and the position in the market-value ranking (1 = highest; players on the same value share a rank, as Transfermarkt shows it: 1, 2, 2, 2, 2, 6).
club, club_id, club_urlMarket-values mode: the player's club in the table.
transfer_id, transfer_dateTransfers mode: Transfermarkt's id for the move (with player_id it identifies the row; a player can move twice) and the date as YYYY-MM-DD. The date can be in the future: the feed lists agreed moves that take effect later.
from_club, from_club_id, from_club_url, from_league, from_league_country, from_league_codeTransfers mode: the club left and its league. A destination such as Retired comes as a name with no id, link or league (all null).
to_club, to_club_id, to_club_url, to_league, to_league_country, to_league_codeTransfers mode: the club joined, same shape.
fee_eur, fee_raw, fee_kindTransfers mode: the fee. fee_raw is the cell as shown. fee_kind is fee (an amount; fee_eur is set), free (free transfer), loan (loan transfer), unknown (Transfermarkt shows ?), other (text this actor does not know; read fee_raw), or null (-). fee_eur is null for everything but an amount: a free transfer has no fee to measure, and it is not written as 0.

Honest nulls

A field Transfermarkt did not send is null, never 0 or "". market_value_eur is null for a player shown with -; the page's own string stays in market_value_raw. A row that is not a player row (no profile link) is not returned, and the log says how many were dropped.

Pricing

Pay per event:

  • $0.002 per run (actor-start), charged only after your input is validated, so a run that fails on bad input costs nothing.
  • $0.00035 per player row written (player-scraped), i.e. $0.35 per 1,000 players, in both modes.

For comparison, the other Transfermarkt scrapers on the Store charged between $0.0005 and $0.0023 per player when this actor was priced (2026-10-13).

How it fetches

Two kinds of plain HTTP request, no browser, through a Chrome TLS fingerprint (curl_cffi):

  1. Market values: https://www.transfermarkt.com/x/marktwerte/wettbewerb/<CODE> and .../page/<n>. The rows are read from the page's table.items.
  2. Latest transfers: https://www.transfermarkt.com/transfers/neuestetransfers/statistik in the detailed view (plus=1) with the market-value floor lowered to 0 (minMarktwert=0), &page=<n> for later pages.

Things worth knowing, all measured on 2026-10-13:

  • A competition has 4 pages of 25: you get the top 100 by market value. The Premier League, LaLiga, Bundesliga, Serie A and Ligue 1 each end at page 4. That is a limit of Transfermarkt's table, not of this actor. Players outside the top 100 of a competition are not reachable from this table.
  • Pages past the end are not errors. Transfermarkt answers page 5 or 99 with HTTP 200, a title that says "Page 5" and the rows of page 4. The actor reads the last page from the page's pagination and never asks past it, and a repeated page is detected rather than returned twice.
  • The transfers feed is short: about 70 rows. At the time of testing the detailed feed had 3 pages (25 + 25 + 21). Pages 4 to 1000 repeat page 3.
  • The feed's plain address ignores ?page=. .../neuestetransfers/statistik?page=2 returns the same 20 rows as page 1 (HTTP 200, titled "Page 2"), with no market value or date column. The paging that works is the detailed view with the market-value floor at 0, which is what the actor requests; it therefore returns every transfer in the feed rather than only those of players valued at EUR 500,000 or more.
  • Bot checks. From a datacenter address Transfermarkt answered about two requests in five with an AWS WAF challenge (HTTP 202, window.gokuProps), interleaved with normal pages and constant over 45 minutes. The actor treats a 202, 403, 429, 5xx, or a 200 without the table as a refusal of that exit address and retries from a fresh one. An unknown competition code is a different case (Transfermarkt redirects to its competitions index): it fails that code only, with no retry and no charge.
  • Not offered. Filters (season, position, club, age) and player profile pages (career history, contract end) are not read.