{
  "openapi": "3.0.1",
  "info": {
    "title": "Transfermarkt Scraper - Players, Squads & Market Values",
    "description": "Scrape Transfermarkt: football players with market value as a number in EUR, contract expiry, position, age, nationality, shirt number and the club they joined from, plus club squads and league tables. 31 leagues from the Premier League to MLS, Brazil and Saudi Arabia.",
    "version": "0.1",
    "x-build-id": "LBtK9nSq30vGPMkIV"
  },
  "servers": [
    {
      "url": "https://api.apify.com/v2"
    }
  ],
  "paths": {
    "/acts/scrapesage~transfermarkt-scraper/run-sync-get-dataset-items": {
      "post": {
        "operationId": "run-sync-get-dataset-items-scrapesage-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/scrapesage~transfermarkt-scraper/runs": {
      "post": {
        "operationId": "runs-sync-scrapesage-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/scrapesage~transfermarkt-scraper/run-sync": {
      "post": {
        "operationId": "run-sync-scrapesage-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",
        "properties": {
          "competitions": {
            "title": "Competitions to scrape",
            "type": "array",
            "description": "Pick one or more leagues. Every club in the league is read, and then each club's squad - so one competition yields the whole league's players in a single run. All 31 codes were verified live against Transfermarkt on 2026-08-31.",
            "items": {
              "type": "string",
              "enum": [
                "GB1",
                "ES1",
                "L1",
                "IT1",
                "FR1",
                "NL1",
                "PO1",
                "TR1",
                "BE1",
                "GR1",
                "A1",
                "C1",
                "DK1",
                "SC1",
                "MLS1",
                "BRA1",
                "JAP1",
                "SA1",
                "RU1",
                "UKR1",
                "PL1",
                "SER1",
                "NO1",
                "SE1",
                "MEX1",
                "IND1",
                "GB2",
                "ES2",
                "L2",
                "IT2",
                "FR2"
              ],
              "enumTitles": [
                "Premier League (GB1)",
                "LaLiga (ES1)",
                "Bundesliga (L1)",
                "Serie A (IT1)",
                "Ligue 1 (FR1)",
                "Eredivisie (NL1)",
                "Liga Portugal (PO1)",
                "Süper Lig (TR1)",
                "Jupiler Pro League (BE1)",
                "Super League 1 (GR1)",
                "Bundesliga (A1)",
                "Super League (C1)",
                "Superliga (DK1)",
                "Scottish Premiership (SC1)",
                "Major League Soccer (MLS1)",
                "Campeonato Brasileiro Série A (BRA1)",
                "J1 League (JAP1)",
                "Saudi Pro League (SA1)",
                "Premier Liga (RU1)",
                "Premier Liga (UKR1)",
                "PKO BP Ekstraklasa (PL1)",
                "Super liga Srbije (SER1)",
                "Eliteserien (NO1)",
                "Allsvenskan (SE1)",
                "Liga MX Clausura (MEX1)",
                "Indian Super League (IND1)",
                "Championship (GB2)",
                "LaLiga2 (ES2)",
                "2. Bundesliga (L2)",
                "Serie B (IT2)",
                "Ligue 2 (FR2)"
              ]
            }
          },
          "startUrls": {
            "title": "Transfermarkt URLs (competition, club or player)",
            "type": "array",
            "description": "Paste Transfermarkt URLs straight from your browser. A competition URL reads every club, a club URL reads that squad, and a player URL reads that full profile. You can type them, upload a file, or link a remote text file.",
            "items": {
              "type": "object",
              "required": [
                "url"
              ],
              "properties": {
                "url": {
                  "type": "string",
                  "title": "URL of a web page",
                  "format": "uri"
                }
              }
            }
          },
          "urlsFromFile": {
            "title": "...or paste / link a file of URLs",
            "type": "string",
            "description": "A block of Transfermarkt URLs, one per line - or a single link to a .txt / .csv file, a Google Sheet or a Drive file containing them. Blank lines, # comments and duplicates are handled."
          },
          "searchQueries": {
            "title": "Player names to search",
            "type": "array",
            "description": "Look players up by name, for example <code>haaland</code> or <code>bellingham</code>. Each match is returned as a full profile record.",
            "items": {
              "type": "string"
            }
          },
          "recordType": {
            "title": "Output: players or clubs",
            "enum": [
              "players",
              "clubs"
            ],
            "type": "string",
            "description": "<b>Players</b> (default) returns one row per player, read from each club's squad table. <b>Clubs</b> returns one row per club with squad size, average age, foreign-player count and total market value - a whole league in 20 rows.",
            "default": "players"
          },
          "positionGroups": {
            "title": "Position groups",
            "type": "array",
            "description": "Keep only players in these position groups. Every player also carries the exact position (Centre-Back, Left Winger...) in `position`.",
            "items": {
              "type": "string",
              "enum": [
                "Goalkeeper",
                "Defender",
                "Midfield",
                "Attack"
              ],
              "enumTitles": [
                "Goalkeeper",
                "Defender",
                "Midfield",
                "Attack"
              ]
            }
          },
          "nationalities": {
            "title": "Nationalities",
            "type": "array",
            "description": "Keep only players holding one of these nationalities, matched on the country name as Transfermarkt writes it, for example <code>Brazil</code>, <code>England</code>, <code>Argentina</code>. Dual nationals match on either.",
            "items": {
              "type": "string"
            }
          },
          "minMarketValue": {
            "title": "Minimum market value (EUR)",
            "minimum": 0,
            "type": "integer",
            "description": "Keep only players valued at or above this figure, in euros. <code>50000000</code> is 50 million. Players with no published value are dropped when this is set."
          },
          "maxMarketValue": {
            "title": "Maximum market value (EUR)",
            "minimum": 0,
            "type": "integer",
            "description": "Keep only players at or below this figure, in euros - the way to find affordable targets."
          },
          "minAge": {
            "title": "Minimum age",
            "minimum": 14,
            "maximum": 50,
            "type": "integer",
            "description": "Keep only players at least this old."
          },
          "maxAge": {
            "title": "Maximum age",
            "minimum": 14,
            "maximum": 50,
            "type": "integer",
            "description": "Keep only players no older than this - the standard filter for a wonderkid or academy-prospect list."
          },
          "contractExpiresBefore": {
            "title": "Contract expires before",
            "type": "string",
            "description": "Keep only players whose contract ends on or before this date (YYYY-MM-DD). The single most useful filter for recruitment: players entering their final year are the ones who move."
          },
          "playerNameQuery": {
            "title": "Player name contains",
            "type": "string",
            "description": "Keep only players whose name contains this text (case-insensitive)."
          },
          "clubNameQuery": {
            "title": "Club name contains",
            "type": "string",
            "description": "Keep only players at clubs whose name contains this text (case-insensitive)."
          },
          "enrichPlayerProfiles": {
            "title": "Fetch each player's full profile page",
            "type": "boolean",
            "description": "Off by default. The squad table already gives name, position, age, nationality, contract expiry, market value, shirt number, photo and transfer-in details. Turn this on to add date and place of birth, height, preferred foot, agent, outfitter and the market-value update date - one extra request and one extra event per player.",
            "default": false
          },
          "maxProfileRecords": {
            "title": "Maximum profiles to fetch",
            "minimum": 0,
            "type": "integer",
            "description": "A ceiling on how many player pages are fetched when the option above is on, so a whole-league sweep cannot become a large bill by accident.",
            "default": 100
          },
          "maxClubsPerCompetition": {
            "title": "Maximum clubs per competition",
            "minimum": 1,
            "type": "integer",
            "description": "How many clubs of each league to read squads for. Most top leagues have 18-20 clubs, so the default covers a full league.",
            "default": 30
          },
          "maxResults": {
            "title": "Maximum records to return",
            "minimum": 1,
            "type": "integer",
            "description": "Stops the run once this many records have been collected. A full Premier League squad sweep is roughly 600 players.",
            "default": 200
          },
          "monitorMode": {
            "title": "Monitor mode - only records new since the last run",
            "type": "boolean",
            "description": "Remembers every record already returned under this monitor key and emits only new ones, tagged monitorEvent: \"new\". Pair it with a Schedule to watch a league for new signings.",
            "default": false
          },
          "monitorKey": {
            "title": "Monitor key",
            "type": "string",
            "description": "Names the memory used by monitor mode. Use a different key per saved watch so separate monitors never share state.",
            "default": "default"
          },
          "proxyConfiguration": {
            "title": "Proxy configuration",
            "type": "object",
            "description": "<b>Residential is required.</b> Transfermarkt answers datacenter IP addresses with a challenge page on every URL, so a datacenter proxy returns no data at all. The default below is correct - change it only to use your own residential provider.",
            "default": {
              "useApifyProxy": true,
              "apifyProxyGroups": [
                "RESIDENTIAL"
              ]
            }
          }
        }
      },
      "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
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}