# Transfermarkt Scraper — API, Market Values & Transfers | $1/1k (`glasswing/transfermarkt-scraper`) Actor

Scrape Transfermarkt player profiles with market value, value history and transfer history, plus club squads, league club lists, search and latest transfers. Players by id, URL or name; any season. No API key, no browser. Export JSON, CSV or Excel.

- **URL**: https://apify.com/glasswing/transfermarkt-scraper.md
- **Developed by:** [Raffy](https://apify.com/glasswing) (community)
- **Categories:** Sports, Developer tools, AI
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $1.00 / 1,000 results

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

Get Transfermarkt football data as clean rows: **player profiles with current market value, highest value, the full dated market-value history and the complete transfer history**, plus club squads, league club lists, search results and the latest transfers. Paste player, club or league links (or just ids, codes or names), press start, and download JSON, CSV or Excel — or call it as a **Transfermarkt API** from your own code, a spreadsheet or an AI agent.

**HTTP only, no browser.** Runs are fast and cheap: the default run returns 5 full player profiles (with both histories) in well under a minute.

### What does this Transfermarkt scraper do?

Each row is one **player**, one **club** or one **transfer**; the `type` column says which, so one dataset can mix them.

- **Full player profiles.** Name, full name, position and secondary positions, date and place of birth, citizenships, height, preferred foot, shirt number, current club and league, joined date, contract expiry and last extension, loan details, agency (companies only), national team with caps and goals, and the portrait.
- **Market values.** Current value in EUR with its date, the highest value ever with its date, and the **market-value history**: every dated valuation with the club and age at the time.
- **Transfer history.** Every move with season, date, from/to club (names and ids), fee as a number and as shown ("loan transfer", "free transfer"), and the market value at the time.
- **Club squads.** One club row (squad size, average age, foreigners, internationals, stadium and capacity, total market value, transfer balance) plus one row per player with age, citizenship, height, foot, joined date, signed-from club and fee, contract end and market value. Any season back to the club's first on Transfermarkt.
- **Leagues and competitions.** Every club of a league (GB1, ES1, L1, IT1, FR1, CL ...) with squad size, average age, foreigners, average and total market value — optionally every club's full squad.
- **Search and latest transfers.** Search players and clubs by name, and read Transfermarkt's latest-transfers list with both clubs, leagues and fees.
- **Every Transfermarkt country site.** Links from transfermarkt.de, .co.uk, .us, .es, .it, .fr and the others work; everything is read from transfermarkt.com in English, so every column has one format.

#### Result status (tri-state output)

| `status` | Meaning | Billed |
|---|---|---|
| `ok` | The player, club or transfer was extracted. | Yes |
| `not_found` | Transfermarkt answered, but there is no such player id, club id or competition code, or the search found nothing. | No |
| `error` | The page could not be read after retries; `error` says why. | No |

### Use cases for Transfermarkt data

- **Scouting and recruitment.** Pull every squad of a league with full profiles, then filter by age, position, contract expiry and market value to build a shortlist.
- **Market-value analytics.** Chart `marketValueHistory` for a set of players, compare value against age, or track which players gained the most since the last window.
- **Transfer research.** Join `transferHistory` fees across players and clubs to study spending, resale value and loan patterns; follow the latest-transfers list during a window.
- **Fantasy football, betting models and apps.** Keep a player database with clubs, positions, contracts and values in sync on a schedule.
- **Journalism and academic research.** Reproducible datasets of squads and values per season, with stable Transfermarkt ids for joining.

### What data you get

#### Every row

| Field | Description |
|---|---|
| `type` | `player`, `club` or `transfer` |
| `source` | `profile` (full player profile), `squad`, `search`, `competition` or `latestTransfers` |
| `name` | Player or club name |
| `url` | Transfermarkt page of the player or club |
| `status`, `error` | Tri-state status and the reason for non-`ok` rows |
| `scrapedAt` | Time of extraction (ISO 8601) |

#### Player rows (`type: player`)

| Field | Description |
|---|---|
| `playerId` | Transfermarkt player id |
| `fullName` | Full name / name in home country as published |
| `position`, `positionGroup`, `otherPositions` | Main position (e.g. Centre-Forward), group (Attack), secondary positions |
| `dateOfBirth`, `age` | YYYY-MM-DD and age |
| `placeOfBirth`, `countryOfBirth` | Birth city and country as listed |
| `citizenship` | Citizenships (array) |
| `heightCm`, `foot`, `shirtNumber` | Height in cm, preferred foot, shirt number |
| `currentClub`, `clubId`, `league`, `leagueCode` | Current club and league |
| `joinedOn`, `contractExpires`, `lastContractExtension`, `contractOption` | Contract dates |
| `onLoanFrom`, `onLoanFromClubId`, `loanContractExpires` | Loan details |
| `agency` | Player agency, only when it is a company |
| `marketValue`, `marketValueCurrency`, `marketValueDate` | Current market value (EUR) and its date |
| `highestMarketValue`, `highestMarketValueDate` | Highest value ever and its date |
| `marketValueHistory` | `[{date, value, currency, club, age}]` |
| `transferHistory` | `[{season, date, fromClub, fromClubId, toClub, toClubId, fee, feeText, marketValue, upcoming}]` |
| `totalTransferFees` | Sum of all fees paid for the player (EUR) |
| `nationalTeam`, `nationalTeamStatus`, `nationalTeamCaps`, `nationalTeamGoals` | National team (current or former), caps and goals |
| `signedFrom`, `signedFromClubId`, `signingFee` | Squad rows: previous club and fee |
| `squadClub`, `squadClubId`, `seasonId` | Squad rows: the squad (club and season) that listed the player; for past seasons `currentClub` is the player's club today |
| `imageUrl` | Portrait |

Full profiles (`source: profile`) carry every field Transfermarkt shows; squad and search rows carry what their tables show.

#### Club rows (`type: club`)

`clubId`, `name`, `league`, `leagueCode`, `season`, `seasonId`, `squadSize`, `averageAge`, `foreigners`, `foreignersShare`, `nationalTeamPlayers`, `stadium`, `stadiumSeats`, `transferBalance`, `totalMarketValue`, `averageMarketValue` (league tables), `country` (search), `imageUrl`.

#### Transfer rows (`type: transfer`)

`playerId`, `name`, `position`, `age`, `citizenship`, `fromClub`, `fromClubId`, `fromLeague`, `fromLeagueCode`, `fromCountry`, `toClub`, `toClubId`, `toLeague`, `toLeagueCode`, `toCountry`, `fee`, `feeText`, `transferId`.

### How to scrape Transfermarkt

1. Click **Try for free** and open the **Input** tab.
2. Fill one or more of: **Transfermarkt URLs**, **Players** (ids, URLs or names), **Clubs** (ids or URLs), **Leagues / competitions** (codes such as `GB1`), **Search**, **Latest transfers**.
3. Optional: pick a **Season**, switch **Full profiles for squad and search players** or **Include club squads** on, and set **Maximum results**.
4. Click **Start**, then open the **Output** tab or export the dataset as JSON, CSV, Excel, XML or HTML.

To automate it, use the **API** tab (Node.js, Python, curl), add a **Schedule**, or connect Google Sheets, Slack, Zapier, Make or a webhook.

#### Transfermarkt API alternative

Transfermarkt has no public API. This Actor gives you one: send the input below to the Apify API and read the dataset. Player ids, club ids and competition codes are the same as in Transfermarkt's own links, so results join cleanly with other Transfermarkt-based data.

### Input

| Field | Type | Default | Description |
|---|---|---|---|
| `startUrls` | array of strings | 5 player profiles | Any Transfermarkt URLs: players, clubs, squads, competitions, search, latest transfers |
| `players` | array of strings | - | Player ids (`418560`), profile URLs or names (`"Lamine Yamal"`; best match) |
| `clubs` | array of strings | - | Club ids (`281`) or URLs |
| `competitions` | array of strings | - | Competition codes (`GB1`, `ES1`, `L1`, `IT1`, `FR1`, `CL` ...) or URLs |
| `query` | string | - | Search players and clubs by name |
| `latestTransfers` | boolean | `false` | Read the latest-transfers list |
| `season` | integer | current | Season start year for clubs and competitions (2025 = 2025/26) |
| `includeMarketValueHistory` | boolean | `true` | Add the dated market-value history to full profiles |
| `includeTransferHistory` | boolean | `true` | Add the transfer history to full profiles |
| `includePlayerProfiles` | boolean | `false` | Turn squad and search players into full profiles |
| `includeSquads` | boolean | `false` | For competitions, also scrape every club's squad |
| `maxItems` | integer | `20` | Stop after this many rows |
| `proxyConfiguration` | object | off | Leave off: the run's own IP is served reliably, while shared proxy IPs get firewall challenges. No residential proxy needed |

Examples:

```json
{ "players": ["Erling Haaland", "342229", "https://www.transfermarkt.de/lamine-yamal/profil/spieler/937958"] }
```

```json
{ "clubs": ["281", "418"], "season": 2025, "maxItems": 60 }
```

```json
{ "competitions": ["GB1", "ES1"], "includeSquads": true, "includePlayerProfiles": true, "maxItems": 1000 }
```

### Output

You can download the dataset as JSON, CSV, Excel, XML or HTML. The first three rows are real rows from platform runs (Haaland's `marketValueHistory` trimmed from 28 to 3 entries and `transferHistory` from 5 to 2); the last row shows what an unknown player id returns:

```json
[
    {
        "url": "https://www.transfermarkt.com/erling-haaland/profil/spieler/418560",
        "status": "ok",
        "scrapedAt": "2026-09-28T02:05:54.953Z",
        "type": "player",
        "source": "profile",
        "playerId": "418560",
        "name": "Erling Haaland",
        "fullName": "Erling Braut Håland",
        "position": "Centre-Forward",
        "positionGroup": "Attack",
        "dateOfBirth": "2000-07-21",
        "age": 26,
        "placeOfBirth": "Leeds",
        "countryOfBirth": "England",
        "citizenship": [
            "Norway"
        ],
        "heightCm": 195,
        "foot": "left",
        "shirtNumber": 9,
        "currentClub": "Manchester City",
        "clubId": "281",
        "league": "Premier League",
        "leagueCode": "GB1",
        "joinedOn": "2022-07-01",
        "contractExpires": "2034-06-30",
        "lastContractExtension": "2025-01-17",
        "marketValue": 220000000,
        "marketValueCurrency": "EUR",
        "marketValueDate": "2026-07-22",
        "highestMarketValue": 220000000,
        "highestMarketValueDate": "2026-07-22",
        "nationalTeam": "Norway",
        "nationalTeamStatus": "current",
        "nationalTeamCaps": 57,
        "nationalTeamGoals": 65,
        "imageUrl": "https://img.a.transfermarkt.technology/portrait/big/418560-1788115885.jpg",
        "marketValueHistory": [
            {
                "date": "2016-12-18",
                "value": 200000,
                "currency": "EUR",
                "club": "Bryne FK",
                "age": 16
            },
            {
                "date": "2026-06-03",
                "value": 200000000,
                "currency": "EUR",
                "club": "Manchester City",
                "age": 25
            },
            {
                "date": "2026-07-22",
                "value": 220000000,
                "currency": "EUR",
                "club": "Manchester City",
                "age": 26
            }
        ],
        "transferHistory": [
            {
                "season": "22/23",
                "date": "2022-07-01",
                "fromClub": "Dortmund",
                "fromClubId": "16",
                "toClub": "Man City",
                "toClubId": "281",
                "fee": 60000000,
                "feeText": "€60.00m",
                "marketValue": 150000000,
                "upcoming": false
            },
            {
                "season": "19/20",
                "date": "2020-01-01",
                "fromClub": "Salzburg",
                "fromClubId": "409",
                "toClub": "Dortmund",
                "toClubId": "16",
                "fee": 20000000,
                "feeText": "€20.00m",
                "marketValue": 45000000,
                "upcoming": false
            }
        ],
        "totalTransferFees": 88100000
    },
    {
        "url": "https://www.transfermarkt.com/fc-bayern-munchen/kader/verein/27/saison_id/2023/plus/1",
        "status": "ok",
        "scrapedAt": "2026-09-28T02:06:45.166Z",
        "type": "club",
        "source": "squad",
        "clubId": "27",
        "name": "Bayern Munich",
        "league": "Bundesliga",
        "leagueCode": "L1",
        "season": "23/24",
        "seasonId": 2023,
        "squadSize": 23,
        "averageAge": 27.4,
        "foreigners": 12,
        "foreignersShare": 52.2,
        "nationalTeamPlayers": 21,
        "stadium": "Allianz Arena",
        "stadiumSeats": 75000,
        "transferBalance": -55200000,
        "totalMarketValue": 1040000000,
        "marketValueCurrency": "EUR",
        "imageUrl": "https://img.a.transfermarkt.technology/wappen/head/27.png"
    },
    {
        "url": "https://www.transfermarkt.com/manuel-neuer/profil/spieler/17259",
        "status": "ok",
        "scrapedAt": "2026-09-28T02:06:45.207Z",
        "type": "player",
        "source": "squad",
        "playerId": "17259",
        "name": "Manuel Neuer",
        "position": "Goalkeeper",
        "dateOfBirth": "1986-03-27",
        "age": 38,
        "citizenship": [
            "Germany"
        ],
        "heightCm": 193,
        "foot": "right",
        "shirtNumber": 1,
        "currentClub": "Bayern Munich",
        "clubId": "27",
        "joinedOn": "2011-07-01",
        "signedFrom": "FC Schalke 04",
        "signedFromClubId": "33",
        "signingFee": 30000000,
        "marketValue": 4000000,
        "marketValueCurrency": "EUR",
        "imageUrl": "https://img.a.transfermarkt.technology/portrait/medium/17259-1762943283.jpg",
        "squadClub": "Bayern Munich",
        "squadClubId": "27",
        "seasonId": 2023
    },
    {
        "url": "https://www.transfermarkt.com/ceapi/marketValueDevelopment/graph/99999999",
        "status": "not_found",
        "error": "HTTP 404: page does not exist",
        "scrapedAt": "2026-09-28T02:04:11.912Z"
    }
]
```

### How much does it cost to scrape Transfermarkt?

Pay per event — platform usage (compute) is included, so these are the only charges:

| Event | Price |
|---|---|
| Actor start | $0.005 per run |
| Result (`status: ok` row) | $0.001 per row |

A full player profile with market-value history and transfer history is **one** result. 1,000 player profiles cost about **$1.00** (plus $0.005 for the run); a 25-player squad with its club row costs $0.026. Rows with status `not_found` or `error` are never billed. Cap spending with **Maximum results** and the run's **Max total charge** option.

### Tips

- Put many players, clubs or leagues into one run: you pay the start fee once.
- A league with **Include club squads** and **Full profiles** on is the quickest way to a complete player database (about 3 requests per player).
- Switch off **Transfer history** if you only need values: it saves one request per player.
- Use ids or codes when you have them; names go through Transfermarkt's search and pick the best match.

### Limitations

- Market values are Transfermarkt's own estimates (in EUR); they are estimates, not transfer fees or valuations by the clubs.
- A name in **Players** takes the best search match — with common names, prefer the id or the profile URL.
- The latest-transfers list is Transfermarkt's own page of 10 x 25 transfers; older transfers are in each player's `transferHistory`.
- Transfermarkt may occasionally slow down very large runs; the Actor paces its requests, backs off and retries, and writes an `error` row (never billed) if a page still cannot be read. Keep Apify Proxy off: Transfermarkt's firewall challenges shared proxy IPs far more often than the run's own IP.
- Individual agents' names, social-media links and family information are never written. For players under 18 the date and place of birth and the full name are left out.
- Results reflect the public site at the time of the run; if Transfermarkt changes its layout, rows come back as `error` and the Actor is updated (report it in the **Issues** tab).

### FAQ

#### Does Transfermarkt have a public API?

No. Transfermarkt does not offer a public API. This Actor reads the public website (logged out) and returns structured rows you can use like an API.

#### Can I get historical market values and past seasons?

Yes. `marketValueHistory` holds every dated valuation of a player, and **Season** gives club squads and league tables for past seasons.

#### Can I use it from an AI agent or MCP client?

Yes. Inputs are plain strings, and every row says what it is (`type`) and whether it is real data (`status`, `error`), so an agent can tell "no such player" apart from "could not read".

#### Why did I get fewer rows than Maximum results?

The clubs, leagues or searches had fewer entries, or the run hit your **Max total charge**. The run log says "Stopping gracefully" when a limit was reached.

#### Is it legal to scrape Transfermarkt?

This Actor reads only publicly available pages, without logging in. Footballers' professional data (clubs, positions, market values, transfers) is public sports information, but you are responsible for how you use it: read the notice below and Transfermarkt's terms of service.

### Legal and data-protection notice

This Actor extracts only data that Transfermarkt publishes publicly about professional football: clubs, squads, positions, contracts, market values and transfers. It does not log in or get around access controls, and it does not extract private contact data, social-media accounts, family information or individual agents' names; for players under 18 it leaves out the date and place of birth and the full name. Your results still contain personal data about public sports figures, which is protected by the GDPR in the European Union and by other laws. Use it only for a legitimate purpose and consult your lawyers if you are unsure. You are responsible for complying with Transfermarkt's terms of service and applicable law.

This Actor is an independent tool. It is not affiliated with, endorsed by or sponsored by Transfermarkt GmbH & Co. KG. All trademarks belong to their respective owners.

# Changelog

This Actor's version history is a separate document: https://apify.com/glasswing/transfermarkt-scraper/changelog.md

# Actor input Schema

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

Any Transfermarkt page, one per line: player profiles (/profil/spieler/...), club pages or squads (/verein/...), competitions (/wettbewerb/...), search results or the latest-transfers list. Links from every country site (.de, .co.uk, .us, .es, .it, .fr ...) work; they are read from transfermarkt.com in English.

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

Transfermarkt player ids (418560), profile URLs, or player names ("Lamine Yamal"). A name is looked up with Transfermarkt's search and the best match is scraped. Each player is one row with the full profile.

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

Transfermarkt club ids (281 = Manchester City) or club URLs. Each club gives one club row (squad size, average age, foreigners, stadium, total market value) plus one row per squad player.

## `competitions` (type: `array`):

Competition codes or URLs: GB1 Premier League, ES1 LaLiga, L1 Bundesliga, IT1 Serie A, FR1 Ligue 1, NL1 Eredivisie, PO1 Liga Portugal, MLS1 MLS, CL Champions League ... Gives one row per club; switch on "Include club squads" for every player too.

## `query` (type: `string`):

Search Transfermarkt by name. Returns the matching players (10 per results page, paged up to Maximum results) and, on the first page, the matching clubs.

## `latestTransfers` (type: `boolean`):

Also scrape Transfermarkt's latest-transfers list (newest first, up to 250 rows): player, clubs, leagues and fee.

## `season` (type: `integer`):

Season for club squads and competitions, as its start year: 2025 = 2025/26. Leave empty for the current season. Player profiles always show today's data.

## `includeMarketValueHistory` (type: `boolean`):

Add each full player profile's dated market-value history (marketValueHistory). Needs no extra request.

## `includeTransferHistory` (type: `boolean`):

Add each full player profile's transfer history (season, date, from/to club, fee). One extra request per player.

## `includePlayerProfiles` (type: `boolean`):

Turn every player found in a club squad or a search into a full profile row (market value history, transfer history, contract, agency, national team) instead of the shorter squad/search row. About 3 requests per player.

## `includeSquads` (type: `boolean`):

For competitions: scrape every club's squad page too (club row with stadium etc. plus one row per player) instead of only the league's club table.

## `maxItems` (type: `integer`):

Stop after this many rows have been saved. Each saved row with status `ok` is one billable result. Keep it small for test runs.

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

Leave off (recommended). The Actor reads Transfermarkt from the run's own IP, which Transfermarkt serves reliably. Apify Proxy's shared datacenter IPs are often answered with a firewall challenge, which only slows the run down with retries. Residential proxies are not needed.

## Actor input object example

```json
{
  "startUrls": [
    "https://www.transfermarkt.com/erling-haaland/profil/spieler/418560",
    "https://www.transfermarkt.com/kylian-mbappe/profil/spieler/342229",
    "https://www.transfermarkt.com/jude-bellingham/profil/spieler/581678",
    "https://www.transfermarkt.com/mohamed-salah/profil/spieler/148455",
    "https://www.transfermarkt.com/jamal-musiala/profil/spieler/580195"
  ],
  "latestTransfers": false,
  "includeMarketValueHistory": true,
  "includeTransferHistory": true,
  "includePlayerProfiles": false,
  "includeSquads": false,
  "maxItems": 20,
  "proxyConfiguration": {
    "useApifyProxy": false
  }
}
```

# 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 = {
    "startUrls": [
        "https://www.transfermarkt.com/erling-haaland/profil/spieler/418560",
        "https://www.transfermarkt.com/kylian-mbappe/profil/spieler/342229",
        "https://www.transfermarkt.com/jude-bellingham/profil/spieler/581678",
        "https://www.transfermarkt.com/mohamed-salah/profil/spieler/148455",
        "https://www.transfermarkt.com/jamal-musiala/profil/spieler/580195"
    ],
    "maxItems": 20,
    "proxyConfiguration": {
        "useApifyProxy": false
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("glasswing/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 = {
    "startUrls": [
        "https://www.transfermarkt.com/erling-haaland/profil/spieler/418560",
        "https://www.transfermarkt.com/kylian-mbappe/profil/spieler/342229",
        "https://www.transfermarkt.com/jude-bellingham/profil/spieler/581678",
        "https://www.transfermarkt.com/mohamed-salah/profil/spieler/148455",
        "https://www.transfermarkt.com/jamal-musiala/profil/spieler/580195",
    ],
    "maxItems": 20,
    "proxyConfiguration": { "useApifyProxy": False },
}

# Run the Actor and wait for it to finish
run = client.actor("glasswing/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 '{
  "startUrls": [
    "https://www.transfermarkt.com/erling-haaland/profil/spieler/418560",
    "https://www.transfermarkt.com/kylian-mbappe/profil/spieler/342229",
    "https://www.transfermarkt.com/jude-bellingham/profil/spieler/581678",
    "https://www.transfermarkt.com/mohamed-salah/profil/spieler/148455",
    "https://www.transfermarkt.com/jamal-musiala/profil/spieler/580195"
  ],
  "maxItems": 20,
  "proxyConfiguration": {
    "useApifyProxy": false
  }
}' |
apify call glasswing/transfermarkt-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,glasswing/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/JXgcjVum6NXsm3oVJ/builds/XB2MeAe4pXwfSRoeE/openapi.json
