Transfermarkt APItransfermarkt.it ↗
Access Serie A team market values, squad rosters, and player career stats from Transfermarkt. Goals, assists, cards, minutes, and more across seasons.
What is the Transfermarkt API?
This API exposes three endpoints covering Serie A data from Transfermarkt, including team market valuations by season, full squad player listings, and per-player career statistics broken down by season and competition. The get_player_career_stats endpoint returns up to a full career's worth of matches played, goals, assists, yellow and red cards, and minutes — all keyed to a Transfermarkt numeric player ID discoverable via get_serie_a_players.
curl -X GET 'https://api.parse.bot/scraper/a2a79966-9580-40ab-9d74-b3a9c82996ee/get_team_market_values?end_year=2025&start_year=2025' \ -H 'X-API-Key: $PARSE_API_KEY'
Typed, relational, agent-ready
A generated client with real types, enums, and the links between objects — the structure a flat JSON response can't carry. Autocompletes in your editor and reads cleanly to coding agents.
- Fully typed · autocompletes
- Objects link to objects
- Typed errors & pagination
Typed Python client. Set up the SDK in your uv project, then pull this API’s typed client:
uv add parse-sdk uv run parse init uv run parse add --marketplace transfermarkt-it-api
uv run parse add --marketplace pulls a pinned snapshot of this canonical API — it won’t change underneath you. To customize it, subscribe and swap to your own copy.
"""Transfermarkt Serie A: team valuations and player career statistics."""
from parse_apis.transfermarkt_api import Transfermarkt, PlayerNotFound
client = Transfermarkt()
# List current season team market values
for team in client.leagues.teams(start_year=2025, end_year=2025, limit=5):
print(team.name, team.market_value)
# Find a player from the current roster
player = client.leagues.players(season="2025", max_teams=1, limit=1).first()
if player:
print(player.name, player.id, player.slug)
# Drill into career statistics
try:
detail = player.career_stats()
for stat in detail.career_stats[:3]:
print(stat.season, stat.competition, stat.matches, stat.goals, stat.assists)
except PlayerNotFound as exc:
print(f"Player not found: {exc}")
print("exercised: leagues.teams / leagues.players / player.career_stats")
Retrieve market values for all teams in Serie A for a specified season range. Returns team names, IDs, and market values as formatted on Transfermarkt (e.g., '741,85 mln €'). Each season year in the range produces one page fetch, so wide ranges are slow.
| Param | Type | Description |
|---|---|---|
| end_year | integer | Ending season year (e.g., 2025 for 2025/26 season) |
| start_year | integer | Starting season year (e.g., 2024 for 2024/25 season) |
{
"type": "object",
"fields": {
"items": "array of objects each containing season, team_id, team_name, and market_value"
},
"sample": {
"data": {
"items": [
{
"season": "2025/2026",
"team_id": "46",
"team_name": "Inter",
"market_value": "646,70 mln €"
},
{
"season": "2025/2026",
"team_id": "506",
"team_name": "Juventus FC",
"market_value": "499,70 mln €"
}
]
},
"status": "success"
}
}About the Transfermarkt API
Team Market Values and Squad Rosters
The get_team_market_values endpoint accepts a start_year and end_year to retrieve Serie A team valuations across multiple seasons. Each result contains team_id, team_name, season, and market_value as Transfermarkt formats it (e.g., '741,85 mln €'). Note that each season year in the requested range triggers a separate fetch, so wide ranges — say, 2015 to 2025 — will be noticeably slow. Request narrow ranges when latency matters.
The get_serie_a_players endpoint lists all players across Serie A team rosters for a given season. Each record includes player_id, player_slug, name, profile_url, and team_url. Because the endpoint iterates through each team's roster page, response time scales with the number of teams processed. The optional max_teams parameter (e.g., 1–3) lets you retrieve a partial result set quickly, which is useful when you only need a few squads or are looking up a specific club.
Player Career Statistics
The get_player_career_stats endpoint takes a required player_id — a Transfermarkt numeric ID such as '406625' for Lautaro Martínez — and returns a data object containing player_id and a career_stats array. Each element in career_stats aggregates performance for one season/competition/club combination, covering matches played, goals, assists, yellow cards, red cards, and minutes played. The optional player_slug parameter (e.g., 'lautaro-martinez') is accepted but not used in the current implementation, so only player_id is needed.
Coverage Scope
All three endpoints are scoped to Serie A on the transfermarkt.it domain. Team market values and player rosters are season-dependent via the season or start_year/end_year inputs. Career stats cover a player's full history across all competitions and clubs Transfermarkt tracks, not just Serie A appearances. Data freshness reflects the current state of Transfermarkt's public pages at the time of each request.
The Transfermarkt API is a managed, monitored endpoint for transfermarkt.it — not a raw scraper you maintain. Every endpoint is automatically health-checked on a schedule, and when transfermarkt.it changes and a check fails, the API is automatically queued for repair and re-verified. It is built to keep working as the site underneath it changes.
This isn't an official transfermarkt.it API — it's an independent, maintained REST wrapper over public data. Where the source has no official API (or only a limited one), Parse gives you a stable contract over a source that never promised one, and keeps it current. Need a new endpoint or field? You can revise it yourself in plain English and the agent rebuilds it against the live site in minutes — contributing the change back to the shared API is free.
Will this API break when the source site changes?+
Is this an official API from the source site?+
Can I fix or extend this API myself if I need a new endpoint or field?+
What happens if I call an endpoint that has an issue?+
- Track how Serie A club market values have shifted over multiple transfer windows using
get_team_market_valueswith multi-year ranges. - Build a Serie A player database by collecting
player_id,name, andprofile_urlfromget_serie_a_playersfor a given season. - Compare goal and assist tallies across seasons for a specific player using the
career_statsarray fromget_player_career_stats. - Analyze disciplinary trends by extracting yellow and red card counts from career statistics grouped by competition.
- Identify playing time patterns by inspecting minutes played per season across different clubs in a player's career.
- Audit squad value changes between seasons for financial or fantasy sports models using formatted market value strings.
- Cross-reference a player's Transfermarkt ID from roster data with career stats to build per-club performance profiles.
| Tier | Price | Credits/month | Rate limit |
|---|---|---|---|
| Free | $0/mo | 100 | 5 req/min |
| Hobby | $30/mo | 1,000 | 20 req/min |
| Developer | $100/mo | 5,000 | 100 req/min |
One credit = one API call regardless of which marketplace API you call. Exceeding the rate limit returns a 429 response. Authenticate with the X-API-Key header.
Does Transfermarkt have an official developer API?+
What does `get_player_career_stats` return, and how granular is it?+
career_stats array where each entry corresponds to one season/competition/club combination. Fields include matches played, goals, assists, yellow cards, red cards, and minutes played. The data spans a player's full career history across all competitions Transfermarkt tracks, not just Serie A.Does `get_team_market_values` return individual player valuations within a squad?+
market_value per team per season, along with team_id, team_name, and season. Individual player market value data is not currently exposed. You can fork this API on Parse and revise it to add an endpoint that fetches per-player valuations from squad pages.Is player transfer history — fees, clubs, and dates — available through these endpoints?+
Why are responses slow when requesting multiple seasons or many teams?+
get_team_market_values performs one fetch per season year in the requested range, so a 10-year span requires 10 sequential fetches. get_serie_a_players iterates through each team's roster page; with 20 Serie A clubs, that is at least 20 fetches. Use narrow year ranges and the max_teams parameter to reduce latency when you only need partial data.