Skip to content

Transfermarkt Scraper

Try for free

Scrape public Transfermarkt player profiles, club squads, and competition tables. Player facts, transfer history, squad lists, and league tables come back as one row per page.

⚽ Transfermarkt Scraper

Turn public Transfermarkt pages into structured football data: player profiles with transfer history, full club squads with market values and contracts, and competition tables. No login and no API key. Result fee: $0.0001 per page, which is $0.10 per 1,000 pages.

✨ Why use Transfermarkt Scraper?

  • 🔓 No login or API key — reads public Transfermarkt pages.
  • 👤 Players, clubs, and competitions — paste a player profile, a club squad, or a competition table.
  • 💶 Market values and contracts — squad rows include age, nationality, contract end, and market value.
  • 🔁 Transfer history — player pages return season, date, clubs, market value, and fee for each move.
  • 🕸️ Follow links — turn on link depth to crawl from a competition to its clubs and players, with pagination control.
  • 🔗 Ready-to-join ids — squad rows carry playerId and profileUrl, and table rows carry clubId and clubUrl.

🎯 Use cases

  • 📊 Scouting and analysis — pull squads with ages, contracts, and market values for comparison.
  • 💹 Market value tracking — snapshot squads on a schedule and watch values change.
  • 🔄 Transfer research — collect a player's transfer history and fees.
  • 🎮 Fantasy and betting models — feed player and club data into your own models.
  • 📰 Journalism and fan sites — build league tables and club pages from public data.

🚀 How to use

  1. Paste Transfermarkt URLs into Start URLs: a player profile, a club squad page, or a competition table.
  2. Set Maximum pages. A squad or a league table counts as one row.
  3. Optionally raise Link depth to follow player, club, and competition links, or Pagination depth to follow numbered pages.
  4. Click Start.
  5. Download the dataset as JSON, CSV, or Excel, or fetch it through the API.

📥 Input

FieldKeyDescription
Start URLsstartUrlsPublic Transfermarkt player, club squad, or competition pages.
Maximum pagesmaxResultsStop after this many dataset rows. Default 10.
Link depthcrawlDepth1 saves the start pages only. Higher values follow player, club, and competition links (1 to 5).
Pagination depthpageDepth1 saves the first page of a paginated list. Higher values follow numbered pages.
Proxy configurationproxyConfigurationDatacenter by default.
{
  "startUrls": [
    { "url": "https://www.transfermarkt.com/fc-vaduz/kader/verein/163" }
  ],
  "maxResults": 10,
  "crawlDepth": 1,
  "pageDepth": 1,
  "proxyConfiguration": {
    "useScrapelyProxy": true,
    "scrapelyProxyGroups": ["DATACENTER"]
  }
}

📤 Output

One row per page. The shape depends on type.

FieldDescription
type, id, name, url, givenUrlPage type (such as player or club), its id, name, and the URL
playersOn a club page: the squad with number, name, position, age, nationality, contract, market value, playerId, profileUrl
clubsOn a competition page: the table rows with clubId and clubUrl
Profile factsOn a player page: date and place of birth, height, citizenship, position, foot, agent, current club, joined, contract expiry
transfersOn a player page: season, date, left, joined, market value, and fee
careerStatsCurrently always empty

Example player item (trimmed):

{
  "givenUrl": "https://www.transfermarkt.com/john-smith/profil/spieler/1",
  "url": "https://www.transfermarkt.com/john-smith/profil/spieler/1",
  "id": "1",
  "type": "player",
  "name": "John Smith",
  "Date of birth/Age": "01/01/1998 (28)",
  "Place of birth": "Springfield",
  "Height": "1,86 m",
  "Citizenship": "Germany",
  "Position": "Goalkeeper",
  "Foot": "right",
  "Current club": "FC Vaduz",
  "Joined": "01/07/2024",
  "Contract expires": "30/06/2029",
  "transfers": [
    {
      "Season": "24/25",
      "Date": "01/07/2024",
      "Left": "Greuther Fürth",
      "Joined": "FC Vaduz",
      "MV": "€200.00k",
      "Fee": "Free Transfer"
    }
  ],
  "careerStats": []
}

A club row holds the squad in players, for example { "#": "1", "Player": ["John Smith", "Goalkeeper"], "Age": "28", "Nat.": "Germany", "Contract": "30/06/2027", "Market value": "€400k", "playerId": "1" }.

💰 Pricing

$0.0001 per page saved ($0.10 per 1,000 pages). Platform usage is billed on top at standard rates: compute $0.30 per GB-hour and datacenter proxy $1 per GB. Because a page can hold a whole squad or table, the platform usage is usually larger than the page fee.

Worked example: scraping one club squad cost about $0.002 in total in our measured run, including the $0.0001 page fee, compute, proxy traffic, and storage.

❓ FAQ

Is it legal to scrape Transfermarkt?

The actor reads only public pages. Check Transfermarkt's terms of use and your local law, especially if you plan to republish data.

Do I need a login or a proxy?

No login. Datacenter proxies are used by default and billed per GB.

How many pages can I scrape?

As many as you set in Maximum pages. A squad or a league table is one row.

What if a field is empty?

An unknown player URL returns a skeleton row with id 0, empty transfers, and empty career stats. Facts that a profile does not list are empty.

Can I schedule it or use the API?

Yes. Use Schedules for recurring snapshots, or call the REST API and read the dataset in any format.

⚠️ Limits

  • Public pages only. Match reports, live scores, and paid data are not covered.
  • careerStats stays empty.
  • Values are text as Transfermarkt prints them, such as €400k and 30/06/2029, not numbers or ISO dates.
  • Link depth above 1 multiplies the number of pages, so keep Maximum pages in mind. A 1,000-page crawl took about 26 minutes in testing.
  • The page fee is tiny, but compute and proxy traffic dominate the cost of a run.

Related actors

G2
4.7/5
Excellent
Trustpilot

The internet is full of data.
Start owning yours.

Scrape.ly gives you the infrastructure, the tooling, and the team to extract, process, and operationalize web data at any scale. Setup takes minutes. The advantage lasts forever.

No credit card. No setup calls.