# Transfermarkt Scraper (`kawsar/transfermarkt-scraper`) Actor

Transfermarkt scraper that fetches football data from any Transfermarkt page and returns structured JSON records. Handles player achievements, league tables, and injury lists in a single run.

- **URL**: https://apify.com/kawsar/transfermarkt-scraper.md
- **Developed by:** [Kawsar](https://apify.com/kawsar) (community)
- **Categories:** Automation, Developer tools, Other
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, NaN bookmarks
- **User rating**: No ratings yet

## Pricing

from $4.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.
Since this Actor supports Apify Store discounts, the price gets lower the higher subscription plan you have.

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

## What's an Apify Actor?

Actors are a software tools running on the Apify platform, for all kinds of web data extraction and automation use cases.
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.

In JavaScript/TypeScript projects, use official [JavaScript/TypeScript client](https://docs.apify.com/api/client/js.md):

```bash
npm install apify-client
```

In Python projects, use official [Python client library](https://docs.apify.com/api/client/python.md):

```bash
pip install apify-client
```

In shell scripts, use [Apify CLI](https://docs.apify.com/cli/docs.md):

````bash
# MacOS / Linux
curl -fsSL https://apify.com/install-cli.sh | bash
# Windows
irm https://apify.com/install-cli.ps1 | iex
```bash

In AI frameworks, you might use the [Apify MCP server](https://docs.apify.com/platform/integrations/mcp.md).

If your project is in a different language, use 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: Extract Football Data from Any Transfermarkt Page

Give it a Transfermarkt URL and it returns structured data. League tables come back as full standings with goals and points. Player profiles return every trophy by competition and season. Injury list pages pull every current injury with expected return dates. It works across any competition and any player on the site. Page type is read from the URL automatically, so you can mix all three types in one batch without any setup.

### Use cases

- **Football data analysis**: pull league standings across multiple seasons and feed them into a spreadsheet, notebook, or dashboard
- **Sports journalism**: grab the current injury list for any competition before writing match previews
- **Player scouting**: build a complete trophy history for any player, broken down by competition and season
- **Fantasy football research**: check injury statuses and expected return dates across all clubs in a competition
- **Data pipelines**: push records into Google Sheets, databases, or BI tools using Apify integrations
- **Historical records**: snapshot league tables for past seasons by changing the season ID in the URL

### What data does this actor collect?

Output fields vary by URL type. Each row is one record.

**League table records include:**
- Club position in the standings
- Club name
- Matches played, won, drawn, and lost
- Goals for and against
- Total points

**Player achievement records include:**
- Competition category (e.g. Champions League, La Liga)
- Season year the trophy was won (e.g. 2014/15)

**Injury list records include:**
- Player name and club
- Injury type or description
- Date the injury was reported
- Expected return-to-play date

### Input

| Parameter | Type | Default | Description |
|-----------|------|---------|-------------|
| `urls` | string[] | required | One or more Transfermarkt URLs to scrape, one per line. You can mix page types in a single run. |
| `maxItems` | integer | 20 | Maximum total records to return across all URLs. Set to 0 for no limit. Useful for cost control on large batch runs. |
| `requestDelayMs` | integer | 1000 | Milliseconds to wait between consecutive page requests. Increase if you encounter rate limiting. Minimum recommended: 500ms. |
| `proxyConfiguration` | object | Residential (US) | Proxy settings. Residential US proxies are required for Transfermarkt. Datacenter IPs are blocked by the site's bot protection. |

#### Supported URL types

The actor reads the URL path to figure out page type. No separate settings required.

| URL pattern | Page type | Data returned |
|-------------|-----------|---------------|
| `/<player>/erfolge/spieler/<id>` | Player achievements | Trophies and honours by category and season year |
| `/<competition>/verletztespieler/wettbewerb/<id>` | Injury list | Current injuries with expected return dates |
| `/<competition>/tabelle/wettbewerb/<id>` | League table | Full standings with stats per club |
| `/<competition>/startseite/wettbewerb/<id>` | Competition overview | Club list via generic table extraction |
| `/<player>/leistungsdaten/spieler/<id>` | Player stats | Performance data via generic table extraction |
| `/<player>/transfers/spieler/<id>` | Transfer history | Transfer records via generic table extraction |
| `/<player>/transferhistorie/spieler/<id>` | Transfer history detail | Full transfer history via generic table extraction |
| Any other Transfermarkt URL | Generic | Any table found on the page, with headers as field names |

#### Competition IDs reference

Common competition IDs for building URLs:

| Competition | ID | Example league table URL |
|-------------|-----|--------------------------|
| Premier League | GB1 | `https://www.transfermarkt.com/premier-league/tabelle/wettbewerb/GB1` |
| Bundesliga | L1 | `https://www.transfermarkt.com/bundesliga/tabelle/wettbewerb/L1` |
| La Liga | ES1 | `https://www.transfermarkt.com/laliga/tabelle/wettbewerb/ES1` |
| Serie A | IT1 | `https://www.transfermarkt.com/serie-a/tabelle/wettbewerb/IT1` |
| Ligue 1 | FR1 | `https://www.transfermarkt.com/ligue-1/tabelle/wettbewerb/FR1` |
| Champions League | CL | `https://www.transfermarkt.com/champions-league/tabelle/wettbewerb/CL` |
| Europa League | EL | `https://www.transfermarkt.com/europa-league/tabelle/wettbewerb/EL` |
| MLS | MLS1 | `https://www.transfermarkt.com/major-league-soccer/tabelle/wettbewerb/MLS1` |

To target a specific season, add `/saison_id/<year>` to the URL. The year is the starting year of the season, so `saison_id/2023` is the 2023/24 season.

### Example inputs

#### Premier League standings for the 2023/24 season

```json
{
    "urls": [
        "https://www.transfermarkt.com/premier-league/tabelle/wettbewerb/GB1/saison_id/2023"
    ],
    "maxItems": 20,
    "proxyConfiguration": { "useApifyProxy": true, "apifyProxyGroups": ["RESIDENTIAL"], "apifyProxyCountry": "US" }
}
````

#### Player achievements for Lionel Messi

```json
{
    "urls": [
        "https://www.transfermarkt.com/lionel-messi/erfolge/spieler/28003"
    ],
    "maxItems": 0,
    "proxyConfiguration": { "useApifyProxy": true, "apifyProxyGroups": ["RESIDENTIAL"], "apifyProxyCountry": "US" }
}
```

#### Current injury list for the Premier League

```json
{
    "urls": [
        "https://www.transfermarkt.com/premier-league/verletztespieler/wettbewerb/GB1"
    ],
    "maxItems": 50,
    "proxyConfiguration": { "useApifyProxy": true, "apifyProxyGroups": ["RESIDENTIAL"], "apifyProxyCountry": "US" }
}
```

#### Batch run mixing all three page types

```json
{
    "urls": [
        "https://www.transfermarkt.com/premier-league/tabelle/wettbewerb/GB1/saison_id/2023",
        "https://www.transfermarkt.com/premier-league/verletztespieler/wettbewerb/GB1",
        "https://www.transfermarkt.com/lionel-messi/erfolge/spieler/28003",
        "https://www.transfermarkt.com/bundesliga/tabelle/wettbewerb/L1/saison_id/2023",
        "https://www.transfermarkt.com/laliga/verletztespieler/wettbewerb/ES1"
    ],
    "maxItems": 500,
    "requestDelayMs": 1500,
    "proxyConfiguration": { "useApifyProxy": true, "apifyProxyGroups": ["RESIDENTIAL"], "apifyProxyCountry": "US" }
}
```

#### Multiple seasons for historical comparison

```json
{
    "urls": [
        "https://www.transfermarkt.com/premier-league/tabelle/wettbewerb/GB1/saison_id/2021",
        "https://www.transfermarkt.com/premier-league/tabelle/wettbewerb/GB1/saison_id/2022",
        "https://www.transfermarkt.com/premier-league/tabelle/wettbewerb/GB1/saison_id/2023"
    ],
    "maxItems": 0,
    "requestDelayMs": 1500,
    "proxyConfiguration": { "useApifyProxy": true, "apifyProxyGroups": ["RESIDENTIAL"], "apifyProxyCountry": "US" }
}
```

#### Injury lists across multiple top leagues

```json
{
    "urls": [
        "https://www.transfermarkt.com/premier-league/verletztespieler/wettbewerb/GB1",
        "https://www.transfermarkt.com/bundesliga/verletztespieler/wettbewerb/L1",
        "https://www.transfermarkt.com/laliga/verletztespieler/wettbewerb/ES1",
        "https://www.transfermarkt.com/serie-a/verletztespieler/wettbewerb/IT1"
    ],
    "maxItems": 200,
    "requestDelayMs": 2000,
    "proxyConfiguration": { "useApifyProxy": true, "apifyProxyGroups": ["RESIDENTIAL"], "apifyProxyCountry": "US" }
}
```

#### Trophy history for multiple players

```json
{
    "urls": [
        "https://www.transfermarkt.com/lionel-messi/erfolge/spieler/28003",
        "https://www.transfermarkt.com/cristiano-ronaldo/erfolge/spieler/8198",
        "https://www.transfermarkt.com/kylian-mbappe/erfolge/spieler/342229"
    ],
    "maxItems": 0,
    "requestDelayMs": 1500,
    "proxyConfiguration": { "useApifyProxy": true, "apifyProxyGroups": ["RESIDENTIAL"], "apifyProxyCountry": "US" }
}
```

### Output

The actor stores results in a dataset. Each record is one row: one standings entry, one trophy, or one injured player.

#### League table record

```json
{
    "position": "1",
    "club": "Manchester City",
    "played": "38",
    "won": "28",
    "drawn": "5",
    "lost": "5",
    "goals": "96:52",
    "points": "89",
    "sourceUrl": "https://www.transfermarkt.com/premier-league/tabelle/wettbewerb/GB1/saison_id/2023",
    "scrapedAt": "2025-04-26T10:14:33.001Z"
}
```

#### Player achievement record

```json
{
    "category": "Champions League",
    "achievement": "2014/15",
    "sourceUrl": "https://www.transfermarkt.com/lionel-messi/erfolge/spieler/28003",
    "scrapedAt": "2025-04-26T10:14:35.211Z"
}
```

#### Injury list record

```json
{
    "player": "Bukayo Saka",
    "club": "Arsenal FC",
    "injury": "Hamstring injury",
    "since": "Jan 1, 2025",
    "expectedReturn": "Feb 15, 2025",
    "sourceUrl": "https://www.transfermarkt.com/premier-league/verletztespieler/wettbewerb/GB1",
    "scrapedAt": "2025-04-26T10:14:37.422Z"
}
```

#### Output field reference

| Field | Type | Page type | Description |
|-------|------|-----------|-------------|
| `position` | string | League table | Club position in the standings |
| `club` | string | League table, Injury list | Club name |
| `played` | string | League table | Matches played |
| `won` | string | League table | Matches won |
| `drawn` | string | League table | Matches drawn |
| `lost` | string | League table | Matches lost |
| `goals` | string | League table | Goals for and against, e.g. "96:52" |
| `points` | string | League table | Total points |
| `category` | string | Achievements | Competition name, e.g. "Champions League" |
| `achievement` | string | Achievements | Season year the trophy was won, e.g. "2014/15" |
| `player` | string | Injury list | Player name |
| `injury` | string | Injury list | Injury type or description |
| `since` | string | Injury list | Date the injury was reported |
| `expectedReturn` | string | Injury list | Expected return-to-play date |
| `pageType` | string | All (generic) | Detected page type identifier |
| `sourceUrl` | string | All | URL the record was scraped from |
| `scrapedAt` | string | All | ISO 8601 timestamp of when the record was scraped |

### How it works

1. Reads all URLs from `urls`, deduplicates them, and works through them in order.
2. For each URL, checks the path segment to identify page type: `/erfolge/`, `/tabelle/`, `/verletztespieler/`, or one of several others.
3. Fetches the page with a Chrome browser fingerprint to get past Transfermarkt's bot protection.
4. Parses the HTML with the right parser for that type. Unknown types go to a generic extractor that reads column names off the page headers.
5. Pushes records to the dataset as they come in, not batched at the end.
6. Waits `requestDelayMs` between pages.
7. Stops when `maxItems` is hit, if set.

### Limits

Pages run one at a time, in sequence. No parallelism, which means large batch runs take longer, but they're also less likely to trip rate limits.

Each URL returns however many records are on that page. A 20-club league table gives you 20 rows. A player with 50 trophies gives you 50 records. The only cap is `maxItems`, which counts across the whole run.

For big batches, set `requestDelayMs` to at least 1500ms and use `maxItems` to keep costs predictable.

### Proxy configuration

Residential US proxies are required. Transfermarkt blocks datacenter IPs outright at the bot protection layer, which means datacenter proxies return 403 every time. The proxy picker defaults to Residential (US) automatically.

If you're seeing 403 errors in the run log, check:

- Proxy is set to Apify Proxy, Residential group, US location
- You're not on datacenter or no-proxy mode

### FAQ

**What page types does this actor support?**

Three have dedicated parsers: player achievements (`/erfolge/`), league tables (`/tabelle/`), and injury lists (`/verletztespieler/`). Any other Transfermarkt page with a data table goes to a generic extractor that reads column names off the page headers. That picks up player stats, transfer history, squad pages, market values, and fixtures without any extra configuration.

**Can I scrape multiple leagues, players, and injury lists in one run?**

Yes. Add everything to `urls`, one per line. Types can be mixed freely. Each URL runs in sequence with the configured delay between them.

**What does `maxItems` do exactly?**

It stops the run once that many total records have been pushed across all URLs. If you set `maxItems: 100` and the first league table has 90 rows, only 10 more records from the next URL go through before the actor exits. Set it to 0 for no cap.

**How do I find the URL for a specific season?**

Open Transfermarkt, go to the competition, switch to table view, pick the season from the dropdown, and copy the URL from the address bar. The `saison_id` segment is what changes between seasons. `saison_id/2023` is the 2023/24 season.

**Why do I get HTTP 403 errors?**

Transfermarkt blocks datacenter IPs outright. Switch to Residential proxies with US location. Datacenter proxies won't work on this site.

**What happens if a page returns no data?**

If the actor can't find a table on a page (changed structure, blocked request, or just no data there), it logs a warning and skips that URL. Nothing gets pushed for it, but the rest of the run continues normally.

**Can I scrape player stats or transfer history?**

Yes. Both URL types are recognized and go to the generic extractor. Field names come from the column headers on the page, so whatever Transfermarkt labels those columns is what you get in the output.

**Can I get a player's market value history?**

Yes. Find the market value page for the player on Transfermarkt (`/marktwertverlauf/`), copy the URL, and add it to `urls`. The generic extractor picks up the table automatically.

### Integrations

The actor works with [Apify integrations](https://apify.com/integrations). Push results to Google Sheets, trigger a Zapier or Make workflow when a run finishes, or stream records into your own database. [Webhooks](https://docs.apify.com/integrations/webhooks) let you automate downstream steps the moment a run completes, like updating a live dashboard after each scrape or getting notified when new injuries appear before a match weekend.

### You might also find these useful

Other actors from the same collection:

| Actor | What it does |
|-------|-------------|
| [Affordable Zillow Search](https://apify.com/kawsar/affordable-zillow-search) | Searches Zillow for affordable listings using flexible filters, good for price-range hunting across US markets |
| [Affordable Zillow Details Scraper](https://apify.com/kawsar/affordable-zillow-details-scraper) | Pulls full property details from Zillow listing pages including price history, tax records, and home facts |
| [Zillow Price & Tax History Scraper](https://apify.com/kawsar/zillow-price-tax-history-scraper) | Extracts historical price changes and property tax records from Zillow for any address |
| [Realtor Search](https://apify.com/kawsar/realtor-search) | Scrapes Realtor.com search results with filters for price, beds, baths, and property type |
| [Realtor Auto Suggestion](https://apify.com/kawsar/realtor-auto-suggestion) | Fetches location auto-suggestions from Realtor.com, useful for building location lookup tools |
| [Redfin Details Scraper](https://apify.com/kawsar/redfin-details-scraper) | Pulls detailed listing data from Redfin including price, features, and agent info |
| [Rightmove Scraper](https://apify.com/kawsar/rightmove-scraper) | Scrapes UK property listings from Rightmove, covers rentals and sales across Great Britain |
| [Foreclosed Properties List + Emails](https://apify.com/kawsar/foreclosed-properties-list-emails) | Finds foreclosed properties and extracts associated contact emails for outreach |
| [New Construction Properties + Emails](https://apify.com/kawsar/new-construction-properties-list-emails) | Collects new construction listings and pulls contact email addresses for builders and agents |
| [Price Reduced Properties Email List](https://apify.com/kawsar/price-reduced-properties-email-list) | Identifies properties with recent price cuts and gathers contact emails for follow-up |
| [Auction Properties List + Email](https://apify.com/kawsar/auction-properties-list-with-email) | Lists properties going to auction and extracts contact information for each |
| [Pet Friendly Rental Properties List](https://apify.com/kawsar/pet-friendly-rental-properties-list) | Finds pet-friendly rental listings across platforms, filtered by location and price |
| [Remote Investor 3D Homes List](https://apify.com/kawsar/remote-investor-3d-homes-list) | Collects listings with 3D virtual tours, ideal for remote buyers and out-of-state investors |
| [Market Velocity Tracker](https://apify.com/kawsar/market-velocity-tracker) | Tracks how fast properties are moving in a given market, useful for gauging supply and demand |

# Actor input Schema

## `urls` (type: `array`):

List of Transfermarkt URLs to scrape in one run. Enter one URL per line. You can mix page types (achievements, league tables, injury lists) freely.

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

Maximum total records to return across all URLs. Set to 0 for no limit. Useful for cost control on large batch runs.

## `requestDelayMs` (type: `integer`):

Milliseconds to wait between consecutive page requests. Increase if you encounter rate limiting. Minimum recommended: 500ms.

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

Proxy to use for requests. Transfermarkt requires Residential proxies — datacenter IPs are blocked by the site's bot protection. US location is recommended for English-language results.

## Actor input object example

```json
{
  "urls": [
    "https://www.transfermarkt.com/premier-league/tabelle/wettbewerb/GB1",
    "https://www.transfermarkt.com/lionel-messi/erfolge/spieler/28003"
  ],
  "maxItems": 20,
  "requestDelayMs": 1000,
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ],
    "apifyProxyCountry": "US"
  }
}
```

# 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 = {
    "urls": [
        "https://www.transfermarkt.com/premier-league/tabelle/wettbewerb/GB1",
        "https://www.transfermarkt.com/lionel-messi/erfolge/spieler/28003"
    ],
    "proxyConfiguration": {
        "useApifyProxy": true,
        "apifyProxyGroups": [
            "RESIDENTIAL"
        ],
        "apifyProxyCountry": "US"
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("kawsar/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 = {
    "urls": [
        "https://www.transfermarkt.com/premier-league/tabelle/wettbewerb/GB1",
        "https://www.transfermarkt.com/lionel-messi/erfolge/spieler/28003",
    ],
    "proxyConfiguration": {
        "useApifyProxy": True,
        "apifyProxyGroups": ["RESIDENTIAL"],
        "apifyProxyCountry": "US",
    },
}

# Run the Actor and wait for it to finish
run = client.actor("kawsar/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 '{
  "urls": [
    "https://www.transfermarkt.com/premier-league/tabelle/wettbewerb/GB1",
    "https://www.transfermarkt.com/lionel-messi/erfolge/spieler/28003"
  ],
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ],
    "apifyProxyCountry": "US"
  }
}' |
apify call kawsar/transfermarkt-scraper --silent --output-dataset

```

## MCP server setup

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

```

## OpenAPI specification

```json
{
    "openapi": "3.0.1",
    "info": {
        "title": "Transfermarkt Scraper",
        "description": "Transfermarkt scraper that fetches football data from any Transfermarkt page and returns structured JSON records. Handles player achievements, league tables, and injury lists in a single run.",
        "version": "0.0",
        "x-build-id": "NY4Znk9nDFecdR88R"
    },
    "servers": [
        {
            "url": "https://api.apify.com/v2"
        }
    ],
    "paths": {
        "/acts/kawsar~transfermarkt-scraper/run-sync-get-dataset-items": {
            "post": {
                "operationId": "run-sync-get-dataset-items-kawsar-transfermarkt-scraper",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor, waits for its completion, and returns Actor's dataset items in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK"
                    }
                }
            }
        },
        "/acts/kawsar~transfermarkt-scraper/runs": {
            "post": {
                "operationId": "runs-sync-kawsar-transfermarkt-scraper",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor and returns information about the initiated run in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/runsResponseSchema"
                                }
                            }
                        }
                    }
                }
            }
        },
        "/acts/kawsar~transfermarkt-scraper/run-sync": {
            "post": {
                "operationId": "run-sync-kawsar-transfermarkt-scraper",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor, waits for completion, and returns the OUTPUT from Key-value store in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK"
                    }
                }
            }
        }
    },
    "components": {
        "schemas": {
            "inputSchema": {
                "type": "object",
                "required": [
                    "urls"
                ],
                "properties": {
                    "urls": {
                        "title": "Multiple Transfermarkt URLs",
                        "type": "array",
                        "description": "List of Transfermarkt URLs to scrape in one run. Enter one URL per line. You can mix page types (achievements, league tables, injury lists) freely.",
                        "items": {
                            "type": "string"
                        }
                    },
                    "maxItems": {
                        "title": "Max items",
                        "minimum": 0,
                        "maximum": 10000,
                        "type": "integer",
                        "description": "Maximum total records to return across all URLs. Set to 0 for no limit. Useful for cost control on large batch runs.",
                        "default": 20
                    },
                    "requestDelayMs": {
                        "title": "Delay between requests (ms)",
                        "minimum": 0,
                        "maximum": 30000,
                        "type": "integer",
                        "description": "Milliseconds to wait between consecutive page requests. Increase if you encounter rate limiting. Minimum recommended: 500ms.",
                        "default": 1000
                    },
                    "proxyConfiguration": {
                        "title": "Proxy configuration",
                        "type": "object",
                        "description": "Proxy to use for requests. Transfermarkt requires Residential proxies — datacenter IPs are blocked by the site's bot protection. US location is recommended for English-language results."
                    }
                }
            },
            "runsResponseSchema": {
                "type": "object",
                "properties": {
                    "data": {
                        "type": "object",
                        "properties": {
                            "id": {
                                "type": "string"
                            },
                            "actId": {
                                "type": "string"
                            },
                            "userId": {
                                "type": "string"
                            },
                            "startedAt": {
                                "type": "string",
                                "format": "date-time",
                                "example": "2025-01-08T00:00:00.000Z"
                            },
                            "finishedAt": {
                                "type": "string",
                                "format": "date-time",
                                "example": "2025-01-08T00:00:00.000Z"
                            },
                            "status": {
                                "type": "string",
                                "example": "READY"
                            },
                            "meta": {
                                "type": "object",
                                "properties": {
                                    "origin": {
                                        "type": "string",
                                        "example": "API"
                                    },
                                    "userAgent": {
                                        "type": "string"
                                    }
                                }
                            },
                            "stats": {
                                "type": "object",
                                "properties": {
                                    "inputBodyLen": {
                                        "type": "integer",
                                        "example": 2000
                                    },
                                    "rebootCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "restartCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "resurrectCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "computeUnits": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            },
                            "options": {
                                "type": "object",
                                "properties": {
                                    "build": {
                                        "type": "string",
                                        "example": "latest"
                                    },
                                    "timeoutSecs": {
                                        "type": "integer",
                                        "example": 300
                                    },
                                    "memoryMbytes": {
                                        "type": "integer",
                                        "example": 1024
                                    },
                                    "diskMbytes": {
                                        "type": "integer",
                                        "example": 2048
                                    }
                                }
                            },
                            "buildId": {
                                "type": "string"
                            },
                            "defaultKeyValueStoreId": {
                                "type": "string"
                            },
                            "defaultDatasetId": {
                                "type": "string"
                            },
                            "defaultRequestQueueId": {
                                "type": "string"
                            },
                            "buildNumber": {
                                "type": "string",
                                "example": "1.0.0"
                            },
                            "containerUrl": {
                                "type": "string"
                            },
                            "usage": {
                                "type": "object",
                                "properties": {
                                    "ACTOR_COMPUTE_UNITS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_WRITES": {
                                        "type": "integer",
                                        "example": 1
                                    },
                                    "KEY_VALUE_STORE_LISTS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_INTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_EXTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_SERPS": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            },
                            "usageTotalUsd": {
                                "type": "number",
                                "example": 0.00005
                            },
                            "usageUsd": {
                                "type": "object",
                                "properties": {
                                    "ACTOR_COMPUTE_UNITS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_WRITES": {
                                        "type": "number",
                                        "example": 0.00005
                                    },
                                    "KEY_VALUE_STORE_LISTS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_INTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_EXTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_SERPS": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }
}
```
