# 🚀 Transfermarkt Scraper · 2,500 Free Players/Month (`omkar-cloud/transfermarkt-scraper`) Actor

Transfermarkt Scraper gets you player data ⚡ fast, 🎯 100% accurate and 🔍 ridiculously detailed — profile, market value & history, transfers, season stats & injuries, by player, club squad or scouting filter. 💰 $2 per 1,000 players, no start fee. Scrape your first 2,500 players free every month 🚀

- **URL**: https://apify.com/omkar-cloud/transfermarkt-scraper.md
- **Developed by:** [Omkar Cloud](https://apify.com/omkar-cloud) (community)
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $2.00 / 1,000 player 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/actors/running/actors-in-store.md#pay-per-event

## What's an Apify Actor?

An Actor is a serverless cloud program that runs on the Apify platform. It has two run modes.
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.

Apify vocabulary and the platform model are defined once, in the agent quickstart at https://apify.com/agents.md.

## 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.

Do not guess an integration path. Every one of them is in the agent quickstart at https://apify.com/agents.md: the Apify MCP server, Agent Skills with the Apify CLI, the JavaScript and Python clients, the REST API, and the account-free path for an agent with no human to sign in. It also carries the rule on stating cost before the first paid run.

For examples already wired to this Actor's own input schema, see the [API](#api) section below.

Each client library has reference documentation the quickstart does not restate: [JavaScript/TypeScript](https://docs.apify.com/api/client/js/docs.md) (`npm install apify-client`) and [Python](https://docs.apify.com/api/client/python/docs.md) (`pip install apify-client`).

# README

## Transfermarkt Scraper

Transfermarkt Scraper by Omkar Cloud gets you 🎯 accurate, 🔍 detailed Transfermarkt player data.

Transfermarkt is the reference for what a footballer is worth, and every run reads it live — so you get today's market value, contract, agent and career for a single player, a whole club squad, a name search or a scouting filter, one row per player, and can successfully complete your project.

**$2 per 1,000 players.** And with Apify's free plan you get $5 of credit every month, so your first **2,500 players each month are free**.

This is an excellent Actor made by Omkar Cloud, which is Rated Excellent — [4.7 based on 30 reviews on Trustpilot](https://www.trustpilot.com/review/omkar.cloud).

👉 [**Try Transfermarkt Scraper free**](https://apify.com/omkar-cloud/transfermarkt-scraper) — your first 2,500 players are Free.

### What can I get

- ⚽ **Any player, a whole squad, a name or a scouting filter** — paste player ids or transfermarkt.com URLs, club ids to get every squad member, names to search, or filter by nationality, position, age, market value and contract year; mix them all in one run
- 💰 **Market value on every row** — the current value with the date it was set, the previous one, the all-time peak and the change since the last re-rating
- 🪪 **The full profile** — name, photo, date and place of birth, height, preferred foot, main and side positions, shirt number, current club with joined date and captaincy, loan parent club, agent, outfitter, youth clubs and social links
- 📜 **Contract facts buyers pay for** — contract end, option type, last extension, retirement status, plus caps and international goals for the national side
- 📈 **The whole career on demand** — every market-value re-rating since 2004, every transfer with clubs, dates and fees, season stats per competition, injury history and every title won
- 🧾 **Source context on every row** — the entry as typed, how the player was found (listed, club squad, search, scouting) and the club whose squad listed them

### Why Transfermarkt Scraper

Most other Transfermarkt scrapers fail you in one of four ways:

- 🔗 **URL-only** — you must already know every player; no squad expansion, no name search, no scouting filters
- 🧩 **Low-detail data** — a name and a value, not the contract, the agent, the value history and the career
- 💸 **A start fee on every run** — three of the five biggest charge one, which punishes small runs
- 🪦 **Works today, breaks next month** — nobody maintains it

Transfermarkt Scraper is read live on every run, priced honestly with no start fee, and actively maintained.

### Input

| Field | What it does |
|---|---|
| **Players** | Transfermarkt player ids (`28003`) or transfermarkt.com player URLs, one row each |
| **Clubs (whole squad)** | Club ids (`418`) or club URLs — every squad member becomes a row, tagged with `source_club_id` |
| **Player Names** | Names to search, like `Haaland` — every hit becomes a row |
| **Squad Season** | Season for the club squads, `2025` or `25/26`. Empty = the current squad |
| **Scouting search** | Nationality, position, min/max age, min/max market value, contract end years, competition, free agents only — Transfermarkt caps this at 250 matches |
| **Include Full Career History** | Adds market value history, transfers, season stats, injuries and titles (add-on, $4 per 1,000 in total) |
| **Stats Season / Competition** | Optional scope for the season stats |
| **Max Players** | Cost control for the whole run — 1,000 players = $2 |

### Example: A Full Transfermarkt Player

```json
{
  "source_input": "28003",
  "source_kind": "player",
  "source_club_id": null,
  "id": 28003,
  "name": "Lionel Messi",
  "full_name": "Lionel Andrés Messi Cuccitini",
  "link": "https://www.transfermarkt.com/lionel-messi/profil/spieler/28003",
  "image": "https://img.a.transfermarkt.technology/portrait/big/28003-1771694720.jpg",
  "date_of_birth": "1987-06-24",
  "age": 39,
  "place_of_birth": "Rosario",
  "nationalities": [
    { "id": 9, "name": "Argentina", "code": "ARG" },
    { "id": 157, "name": "Spain", "code": "ESP" }
  ],
  "height_m": 1.7,
  "preferred_foot": "left",
  "position": { "id": 12, "name": "Right Winger", "short_name": "RW", "group": "Striker" },
  "shirt_number": 10,
  "current_club": {
    "id": 69261,
    "name": "Inter Miami CF",
    "link": "https://www.transfermarkt.com/inter-miami-cf/startseite/verein/69261",
    "country": { "id": 184, "name": "United States", "code": "USA" },
    "is_captain": true,
    "joined": "2023-07-15"
  },
  "national_team": { "id": 3437, "name": "Argentina", "is_current": true },
  "caps": 207,
  "international_goals": 125,
  "contract_until": "2028-12-31",
  "last_contract_extension": "2025-10-23",
  "status": "active",
  "market_value": {
    "current": { "amount": 15000000, "currency": "EUR", "updated_at": "2026-06-02" },
    "previous": { "amount": 15000000, "currency": "EUR", "updated_at": "2025-12-11" },
    "highest": { "amount": 180000000, "currency": "EUR", "updated_at": "2018-05-30" },
    "change": { "direction": "unchanged", "amount": 0, "percent": 0.0 }
  },
  "agent": { "id": 1207, "name": "Relatives", "is_verified": false },
  "outfitter": "adidas",
  "youth_clubs": "Grandoli FC (1992-1995), Newell's Old Boys (1995-2000)",

  "market_value_history": [
    { "date": "2004-12-20", "value": { "amount": 3000000, "currency": "EUR" }, "age": 17, "club": { "name": "FC Barcelona B" } },
    { "date": "2018-05-30", "value": { "amount": 180000000, "currency": "EUR" }, "age": 30, "club": { "name": "FC Barcelona" } }
  ],
  "transfers": [
    {
      "id": 3845482,
      "date": "2023-07-15",
      "season": { "id": 2023, "name": "23/24" },
      "from_club": { "id": 583, "name": "Paris SG" },
      "to_club": { "id": 69261, "name": "Inter Miami CF" },
      "market_value": { "amount": 35000000, "currency": "EUR" },
      "fee": { "amount": null, "currency": null, "type": "free" }
    }
  ],
  "total_transfer_fees": { "amount": 255000000, "currency": "EUR" },
  "season_stats_totals": { "appearances": 1120, "goals": 891, "assists": 402, "minutes_played": 92345 },
  "total_titles": 44
}
```

*Trimmed for readability — `market_value_history`, `transfers`, `season_stats`, `injuries` and `titles` carry the full career when **Include Full Career History** is on.*

### Get Started with 2,500 Free Players

1. [Open Transfermarkt Scraper](https://apify.com/omkar-cloud/transfermarkt-scraper) — the form comes pre-filled with Lionel Messi.
2. Add your own players, clubs, names or scouting filters and click **Start**.
3. Download the results as JSON, CSV or Excel 😎.

### Pricing

**$2 per 1,000 players. No start fee.** You pay for the rows you get, nothing else.

| What you scrape | Price |
|---|---|
| Player row — profile, market value, contract, agent, caps | **$0.002** each — $2 per 1,000 |
| Same row with the full career history | **$0.004** each — $4 per 1,000 |
| Actor start | **$0** — most competitors charge one |

Apify's free plan gives you $5 of credit every month, so **2,500 players are free every month** (1,250 with the full career history). A player reached twice in one run — listed and also in a squad — is scraped and billed only once.

### Run It from Code

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

const client = new ApifyClient({ token: 'YOUR_APIFY_TOKEN' });

const run = await client.actor('omkar-cloud/transfermarkt-scraper').call({
    clubs: ['418'],                    // Real Madrid's whole squad
    includeCareerHistory: true,        // market values, transfers, stats, injuries, titles
    maxResults: 30,
});

const { items } = await client.dataset(run.defaultDatasetId).listItems();
console.log(items);
```

```python
from apify_client import ApifyClient

client = ApifyClient("YOUR_APIFY_TOKEN")

run = client.actor("omkar-cloud/transfermarkt-scraper").call(run_input={
    "nationality": "Brazil",           # scouting search
    "position": "Centre-Forward",
    "maxAge": 23,
    "minMarketValue": 10000000,
    "maxResults": 50,
})

for item in client.dataset(run["defaultDatasetId"]).iterate_items():
    print(item["name"], item["market_value"]["current"]["amount"])
```

### FAQ

**Which players can I scrape?**
Any player on Transfermarkt — by id, by URL, by club squad, by name search, or by scouting filter. Retired players work too; their row carries `status: "retired"`.

**What does a run cost?**
$2 per 1,000 players, $4 per 1,000 with the full career history, and no start fee. Set **Max Players** to cap any run.

**How fresh is the data?**
It is read live from Transfermarkt on every run. Market values are exactly what the site shows at that moment.

**Can I scrape a whole league?**
Yes. Put the league's clubs in **Clubs** to get every squad, or use the scouting search with a **Competition** filter.

**Do I need proxies or a Transfermarkt account?**
No. The Actor handles everything.

**What if a player has no data for a block?**
The row is still pushed, with that block `null`. You are charged the same either way.

### Popular Actors by Omkar Cloud

- [**Sofascore Players Scraper**](https://apify.com/omkar-cloud/sofascore-players-scraper) — player profiles with 114 season statistics
- [**Sofascore Scraper**](https://apify.com/omkar-cloud/sofascore-scraper) — live scores, fixtures & results for 26 sports
- [**IMDb Scraper**](https://apify.com/omkar-cloud/imdb-scraper) — titles, ratings, cast & box office
- [**Booking Scraper**](https://apify.com/omkar-cloud/booking-scraper) — hotels with prices, ratings & rooms
- [**Rightmove Scraper**](https://apify.com/omkar-cloud/rightmove-scraper) — UK property listings with prices & agents

### 💬 Have Questions? We Have Answers.

You're a developer — we know how hard completing a project can be. So we offer full support: just message us and we'll reply ✅ with a solution within 1 working day.

[![Message Us on WhatsApp](https://raw.githubusercontent.com/omkarcloud/assets/master/images/whatsapp-us.png)](https://api.whatsapp.com/send?phone=918178804274\&text=I%20need%20help%20with%20using%20the%20Transfermarkt%20Scraper%20Actor.)

[![Ask Us on Email](https://raw.githubusercontent.com/omkarcloud/assets/master/images/ask-on-email.png)](mailto:happy.to.help@omkar.cloud?subject=Help%20with%20Transfermarkt%20Scraper%20Actor\&body=I%20need%20help%20with%20using%20the%20Transfermarkt%20Scraper%20Actor.)

You are important to us — just message us and we will solve your problem ✅ within 1 working day. 🩷 Pinky Promise 🤙!

# Actor input Schema

## `players` (type: `array`):

Transfermarkt player ids like `28003` (Lionel Messi) or pasted transfermarkt.com player URLs like `https://www.transfermarkt.com/lionel-messi/profil/spieler/28003` — the form is auto-detected. Rows carry `source_input` (as typed).

## `clubs` (type: `array`):

Transfermarkt club ids like `418` (Real Madrid) or pasted transfermarkt.com club URLs like `https://www.transfermarkt.com/real-madrid/startseite/verein/418`. Every squad member becomes a row, carrying `source_club_id`.

## `searchQueries` (type: `array`):

Names to search, like `Haaland` or `Jude Bellingham`. Every player the search returns becomes a row, up to Max Players.

## `squadSeason` (type: `string`):

Season for the club squads above — the start year (`2025`) or the season name (`25/26`). Leave empty for the current squad.

## `nationality` (type: `string`):

Country name (`Brazil`), FIFA code (`BRA`) or Transfermarkt country id.

## `position` (type: `string`):

Main position — a name (`Centre-Forward`), a short code (`CF`) or an id from 1 to 14.

## `minAge` (type: `integer`):

Youngest age to include.

## `maxAge` (type: `integer`):

Oldest age to include.

## `minMarketValue` (type: `integer`):

Lowest market value in whole euros, e.g. `20000000` for €20m.

## `maxMarketValue` (type: `integer`):

Highest market value in whole euros.

## `contractExpires` (type: `string`):

Contract end years as a comma list, e.g. `2026,2027` — the classic free-transfer shortlist.

## `competition` (type: `string`):

Limit to one competition — a code like `GB1` (Premier League), `ES1` (LaLiga) or a transfermarkt.com competition URL.

## `isFreeAgent` (type: `boolean`):

Only players without a club right now.

## `includeCareerHistory` (type: `boolean`):

Adds `market_value_history` (every re-rating since 2004), `transfers` (clubs, dates, fees), `season_stats`, `injuries` and `titles` to every row.

## `statsSeason` (type: `string`):

Scope the season stats to one season — `2025` or `25/26`. Leave empty for every season of the career.

## `statsCompetition` (type: `string`):

Scope the season stats to one competition, e.g. `GB1`. Leave empty for all of them.

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

Maximum number of player rows for the whole run, across every player, squad and search. Use this to control your cost (1,000 players = $2, or $4 with the career history).

## Actor input object example

```json
{
  "players": [
    "28003"
  ],
  "clubs": [],
  "searchQueries": [],
  "isFreeAgent": false,
  "includeCareerHistory": false,
  "maxResults": 100
}
```

# 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 = {
    "players": [
        "28003"
    ],
    "clubs": [],
    "searchQueries": [],
    "maxResults": 100
};

// Run the Actor and wait for it to finish
const run = await client.actor("omkar-cloud/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 = {
    "players": ["28003"],
    "clubs": [],
    "searchQueries": [],
    "maxResults": 100,
}

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

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

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

```

## CLI example

```bash
echo '{
  "players": [
    "28003"
  ],
  "clubs": [],
  "searchQueries": [],
  "maxResults": 100
}' |
apify call omkar-cloud/transfermarkt-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,omkar-cloud/transfermarkt-scraper"
        }
    }
}
```

The hosted server signs you in with OAuth on first connect, so no API token belongs in this config. Clients without OAuth support can send an `Authorization: Bearer <APIFY_API_TOKEN>` header instead, using a token from API & Integrations in Apify Console (https://console.apify.com/settings/integrations).

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/actors/nipxfYbqJDtettzAN/builds/vqYnmePGkdVHKEgFl/openapi.json
