# Transfermarkt Scraper — Player Market Values & Transfers (`studio-amba/transfermarkt-scraper`) Actor

Scrape football player profiles, market values, transfer history, and career stats from Transfermarkt.de by player or club name. No login, uses the site's own public data endpoints.

- **URL**: https://apify.com/studio-amba/transfermarkt-scraper.md
- **Developed by:** [Studio Amba](https://apify.com/studio-amba) (community)
- **Categories:** Other
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $5.00 / 1,000 result scrapeds

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.

Learn more: https://docs.apify.com/platform/actors/running/actors-in-store#pay-per-event

## What's an Apify Actor?

Actors are web data automations that power AI and operations. They run on the Apify platform to scrape websites, process data, connect APIs, and automate workflows.
In Batch mode, an Actor accepts a well-defined JSON input, performs an action which can take anything from a few seconds to a few hours,
and optionally produces a well-defined JSON output, datasets with results, or files in key-value store.
In Standby mode, an Actor provides a web server which can be used as a website, API, or an MCP server.
Actors are written with capital "A".

## How to integrate an Actor?

If asked about integration, you help developers integrate Actors into their projects.
You adapt to their stack and deliver integrations that are safe, well-documented, and production-ready.
The best way to integrate Actors is as follows.

- **AI agents and MCP clients** — the [Apify MCP server](https://docs.apify.com/integrations/mcp.md) at `https://mcp.apify.com` (remote, streamable HTTP, OAuth on first use).
- **Agentic workflows and local Actor development** — [Agent Skills](https://apify.com/.well-known/agent-skills/index.json) with the [Apify CLI](https://docs.apify.com/cli/docs.md): `npm install -g apify-cli`, then `apify login`.
- **JavaScript/TypeScript projects** — the official [JS/TS client](https://docs.apify.com/api/client/js/docs.md): `npm install apify-client`.
- **Python projects** — the official [Python client](https://docs.apify.com/api/client/python/docs.md): `pip install apify-client`.
- **Any other language** — the [REST API](https://docs.apify.com/api/v2.md).

For usage examples, see the [API](#api) section below.

For more details, see Apify documentation as [Markdown index](https://docs.apify.com/llms.txt) and [Markdown full-text](https://docs.apify.com/llms-full.txt).

# README

## Transfermarkt Scraper

Scrape football player profiles, current market values, full transfer
history, and historical market value curves from Transfermarkt.de by
searching a player name or passing direct profile URLs.

### Why use this actor?

Transfermarkt is the reference database for football transfer values —
agents, analysts, betting/fantasy tools, and sports media all pull from it
manually today. This actor turns a player name (or a list of player URLs)
into structured JSON: current club, market value, position, age, contract
expiry, agent, and the player's entire transfer and market-value-over-time
history in one call. No login, no scraping the page by hand.

### How to scrape Transfermarkt data

1. Set `searchQuery` to a player's name (e.g. `"Erling Haaland"`), or pass
   one or more player profile URLs in `startUrls`.
2. Set `maxResults` to cap how many matching players get scraped.
3. Run the actor. Each result is one player: current club and league,
   numeric market value in EUR, bio (age, nationality, height, foot,
   contract expiry, agent), full transfer history, and the full market
   value history curve.
4. Export the dataset as JSON, CSV, or Excel from the Apify Console, or
   pull it via the API.

Search matches on player name in any language Transfermarkt indexes —
partial names work too (`"Bellingham"` returns every Bellingham in the
database, not just the famous one, so use a full name for a single exact
match).

### Input

| Field | Type | Required | Description |
|-------|------|----------|--------------|
| `searchQuery` | String | No | Player name to search for. Default: `"Jude Bellingham"` so `{}` input still returns data. |
| `startUrls` | Array | No | Direct Transfermarkt player profile URLs, used instead of or alongside a search query. |
| `maxResults` | Integer | No | Maximum number of players to return (default: 20, max: 500). |
| `proxyConfiguration` | Object | No | Apify proxy settings. Residential is the default; Transfermarkt has no bot-wall so datacenter proxies work fine too. |

### Output

Each result is one player:

| Field | Type | Example |
|-------|------|---------|
| `name` | String | `"Jude Bellingham"` |
| `playerId` | String | `"581678"` |
| `url` | String | Transfermarkt profile URL |
| `currentClub` | String | `"Real Madrid"` |
| `currentClubUrl` | String | Club page URL |
| `league` | String | `"LaLiga"` |
| `marketValue` | Number | `160000000` (EUR, numeric) |
| `marketValueFormatted` | String | `"160,00 Mio. €"` |
| `marketValueLastUpdate` | String | `"22.07.2026"` |
| `position` | String | `"Mittelfeld - Offensives Mittelfeld"` |
| `dateOfBirth` | String | `"2003-06-29"` (ISO 8601) |
| `age` | Number | `23` |
| `placeOfBirth` | String | `"Stourbridge"` |
| `nationality` | Array | `["England", "Irland"]` |
| `height` | Number | `1.86` (metres) |
| `foot` | String | `"rechts"` |
| `joinedClubDate` | String | `"2023-07-01"` |
| `contractUntil` | String | `"2029-06-30"` |
| `agent` | String | `"Familienangehörige"` |
| `kitSupplier` | String | `"adidas"` |
| `transferHistory` | Array | Full career transfer list (date, season, from/to club, fee, market value at transfer) |
| `marketValueHistory` | Array | Full market value curve (date, numeric EUR value, club, age at that point) |
| `scrapedAt` | String | ISO 8601 timestamp |

### Example output

Real output from a live run (`searchQuery: "Jude Bellingham"`):

```json
{
    "name": "Jude Bellingham",
    "playerId": "581678",
    "url": "https://www.transfermarkt.de/jude-bellingham/profil/spieler/581678",
    "currentClub": "Real Madrid",
    "currentClubUrl": "https://www.transfermarkt.de/real-madrid/startseite/verein/418",
    "league": "LaLiga",
    "marketValue": 160000000,
    "marketValueCurrency": "EUR",
    "marketValueFormatted": "160,00 Mio. €",
    "marketValueLastUpdate": "22.07.2026",
    "position": "Mittelfeld - Offensives Mittelfeld",
    "dateOfBirth": "2003-06-29",
    "age": 23,
    "placeOfBirth": "Stourbridge",
    "nationality": ["England", "Irland"],
    "height": 1.86,
    "foot": "rechts",
    "joinedClubDate": "2023-07-01",
    "contractUntil": "2029-06-30",
    "agent": "Familienangehörige",
    "kitSupplier": "adidas",
    "transferHistory": [
        {
            "date": "2023-07-01",
            "season": "23/24",
            "fromClub": "Bor. Dortmund",
            "toClub": "Real Madrid",
            "fee": "127,00 Mio. €",
            "marketValueAtTransfer": "120,00 Mio. €",
            "upcoming": false
        }
    ],
    "marketValueHistory": [
        {
            "date": "2019-10-17",
            "value": 2500000,
            "club": "Birmingham City",
            "age": "16"
        }
    ],
    "scrapedAt": "2026-07-31T09:12:27.470Z"
}
```

### Cost estimate

This actor makes 1-3 lightweight HTTP requests per player (profile page +
two small JSON API calls, run in parallel) — no browser rendering. At the
PREMIUM pricing tier ($0.005 per result + $0.01 per run), scraping 1,000
players costs roughly **$5.01** in platform fees plus your Apify compute
usage, which is minimal since every request is plain HTTP/Cheerio.

### Limitations

- Data is scraped from the public Transfermarkt.de site and may change
  without notice if Transfermarkt changes its markup or its internal JSON
  API paths.
- `marketValue` and `transferHistory` are empty for players who never had
  a market value assigned (common for amateur, youth, or semi-professional
  players who share a name with well-known pros — use a full name in
  `searchQuery` or a direct `startUrls` link for an exact match).
- Squad/roster listing by club is not yet supported as a dedicated input
  mode in this version — club rosters are visible on Transfermarkt club
  pages and are a natural follow-up if there's demand; today the actor is
  player-search and player-URL driven.
- Bio field labels are in German (Transfermarkt.de's native language) —
  values are copied as-is (e.g. `foot: "rechts"` means right-footed),
  since translating them risks losing precision on positions and roles.
- Respect Transfermarkt's terms of service and use the data responsibly.

### Need this data on a schedule, or a custom version?

We run this scraper as a managed service for businesses: scheduled runs,
deduplication, delta detection, and delivery to your inbox, Google Sheets,
or API — maintenance included. We can also build a custom version with your
exact fields and filters, or combine multiple sources into one feed.

See [studioamba.dev/services](https://studioamba.dev/services/) or email
<hello@studioamba.dev> for a free data sample.
We maintain 300+ European web scrapers and answer within one business day.

### Related Scrapers

- [Arbeitsagentur Scraper](https://apify.com/studioamba/arbeitsagentur-scraper) — German job listings via a public JSON API, same search-by-keyword pattern.
- [AutoScout24 Scraper](https://apify.com/studioamba/autoscout24-scraper) — European vehicle listings with pricing and specs.
- [KBO Enrichment](https://apify.com/studioamba/kbo-enrichment) — Belgian company registry lookup and enrichment by name or number.

# Actor input Schema

## `searchQuery` (type: `string`):

Player name to search for (any language works — Transfermarkt matches on names). Examples: 'Jude Bellingham', 'Erling Haaland', 'Kylian Mbappé'.

## `startUrls` (type: `array`):

Optional: direct Transfermarkt player profile URLs to scrape instead of (or in addition to) a search query, e.g. https://www.transfermarkt.de/jude-bellingham/profil/spieler/581678

## `maxResults` (type: `integer`):

Maximum number of players to return.

## `proxyConfiguration` (type: `object`):

Proxy settings. Transfermarkt has no bot-wall (confirmed by recon), so datacenter or residential both work — residential is the default for reliability on repeat runs.

## Actor input object example

```json
{
  "searchQuery": "Jude Bellingham",
  "maxResults": 20,
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ]
  }
}
```

# Actor output Schema

## `results` (type: `string`):

No description

# API

You can run this Actor programmatically using our API. Below are code examples in JavaScript, Python, and CLI, as well as the OpenAPI specification and MCP server setup.

## JavaScript example

```javascript
import { ApifyClient } from 'apify-client';

// Initialize the ApifyClient with your Apify API token
// Replace the '<YOUR_API_TOKEN>' with your token
const client = new ApifyClient({
    token: '<YOUR_API_TOKEN>',
});

// Prepare Actor input
const input = {
    "searchQuery": "Jude Bellingham",
    "maxResults": 20,
    "proxyConfiguration": {
        "useApifyProxy": true,
        "apifyProxyGroups": [
            "RESIDENTIAL"
        ]
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("studio-amba/transfermarkt-scraper").call(input);

// Fetch and print Actor results from the run's dataset (if any)
console.log('Results from dataset');
console.log(`💾 Check your data here: https://console.apify.com/storage/datasets/${run.defaultDatasetId}`);
const { items } = await client.dataset(run.defaultDatasetId).listItems();
items.forEach((item) => {
    console.dir(item);
});

// 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/js/docs

```

## Python example

```python
from apify_client import ApifyClient

# Initialize the ApifyClient with your Apify API token
# Replace '<YOUR_API_TOKEN>' with your token.
client = ApifyClient("<YOUR_API_TOKEN>")

# Prepare the Actor input
run_input = {
    "searchQuery": "Jude Bellingham",
    "maxResults": 20,
    "proxyConfiguration": {
        "useApifyProxy": True,
        "apifyProxyGroups": ["RESIDENTIAL"],
    },
}

# Run the Actor and wait for it to finish
run = client.actor("studio-amba/transfermarkt-scraper").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print("💾 Check your data here: https://console.apify.com/storage/datasets/" + run["defaultDatasetId"])
for item in client.dataset(run["defaultDatasetId"]).iterate_items():
    print(item)

# 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/python/docs/quick-start

```

## CLI example

```bash
echo '{
  "searchQuery": "Jude Bellingham",
  "maxResults": 20,
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ]
  }
}' |
apify call studio-amba/transfermarkt-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "command": "npx",
            "args": [
                "mcp-remote",
                "https://mcp.apify.com/?tools=studio-amba/transfermarkt-scraper",
                "--header",
                "Authorization: Bearer <YOUR_API_TOKEN>"
            ]
        }
    }
}

```

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/acts/Y5MyGS2UEgrzyKJUx/builds/qgNwRpnpIyNmnylIm/openapi.json
