Some links on this page are affiliate links: if you buy through them we may earn a commission, at no extra cost to you.
There is no clearly documented public Transfermarkt API established by the sources available here. A Transfermarkt forum answer dated May 14, 2020 said, “Hi, we sadly don’t have an API, which is publicly available.” That is a historical statement, not proof that availability has not changed. More importantly, Transfermarkt’s terms prohibit automated access and copying through bots, spiders, screen scraping, or other automated processes. Unless you have written permission or a licensed data source that authorizes your use, do not automate collection from the site.
If you are authorized to work with the data, build a controlled pipeline: acquire it through the permitted source, validate and normalize it, then serve only the fields your application needs through an API such as FastAPI. The community projects described below can help explain the available data surfaces and engineering patterns, but they are not official API contracts or permission to scrape.
Does Transfermarkt have a public API?
The cited Transfermarkt forum answer from May 14, 2020 said no publicly available API existed at that time. Because that answer is historical, check current official documentation or contact Transfermarkt before relying on it as a statement about present availability. The community tools covered in this article wrap web pages or use undocumented endpoints; they should not be treated as sanctioned or stable APIs.
Quick wins for a faster PC:
Repair Windows errors before they cause bigger problemsFix Now →Fix the driver behind crashes, sound loss and screen glitchesFind Drivers →Clear out junk files and repair common Windows errorsFree Scan →The first decision is not which Python package to install. It is whether you are permitted to collect and use the data at all. Transfermarkt’s terms state: “The User is not permitted to access or copy the Digital Content using bots, spiders, screen scraping or other automated processes.” The terms also prohibit use of digital content for AI training and reserve text-and-data-mining uses under German law. Read the current terms and obtain appropriate written permission or licensing before automating access.
#1 Best Overall
- No permission or licensed feed: stop before automating requests. Use a source whose license permits your intended collection, storage, display, and redistribution.
- Written authorization: follow its exact scope, rate limits, attribution requirements, retention rules, and redistribution conditions. Authorization for one purpose does not automatically permit another.
- Need visual records only: a screenshot captures how a page looks; it does not provide structured player, transfer, or market-value data.
Choose an authorized data route before writing a scraper
For production use, compare a licensed football-data API, a directly authorized integration, and an open-source scraper only after establishing the applicable permissions. The dimensions below are the ones to verify with the provider or rights holder; no universal rates, coverage, or service guarantees are established here.
| Route | Permission and redistribution | Contract stability | Maintenance and operations |
|---|---|---|---|
| Licensed football-data API | Confirm the license, allowed use, retention, attribution, and redistribution rights in the provider’s agreement. | Check documented schemas, versioning, coverage, and deprecation policy with the provider. | Provider handles source acquisition; your team still handles integration, validation, and service monitoring. |
| Direct authorized integration | Use only within the written authorization’s scope. | Agree on endpoint, schema, and change notification expectations directly. | You own client reliability, storage, normalization, monitoring, and downstream API operations. |
| Community scraper or wrapper | Open-source code does not grant rights to automate access to the source or redistribute its content. | Unofficial endpoints and page structures can change or be blocked. | You own parsing, retries, null monitoring, and breakage response; some endpoint checks may be blocked by bot protection. |
Ask specifically about competition and player coverage, historical depth, update latency, identity matching, throughput limits, and whether you may redistribute derived or raw records. Do not infer these rights or service characteristics from a project’s README.
What community Transfermarkt projects show
FastAPI wrapper
The felipeall/transfermarkt-api project presents a FastAPI REST service built by scraping Transfermarkt pages. Its README describes local and Docker execution and optional rate limiting; the documented default example is 2 requests per 3 seconds. That is a project setting, not a Transfermarkt allowance, safety threshold, or recommended rate. The project’s existence does not override site terms.
Recursive football-data crawler
The dcaribou project describes crawlers for confederations, competitions, countries, clubs, national teams, players, appearances, tournament editions, games, and game lineups. It emits JSON objects to standard output. This illustrates how broad a crawl can become: a request for a few players can expand into competitions, seasons, matches, and appearance records. Keep any authorized job scoped to the specific entities and seasons you are permitted to process.
Market-value and transfer-history endpoints
A community dataset acquisition script names two CE endpoints: https://www.transfermarkt.com/ceapi/marketValueDevelopment/graph/{player_id} for market-value development and https://www.transfermarkt.co.uk/ceapi/transferHistory/list/{player_id} for transfer history. These are implementation details observed in a community project, not documented official API contracts. Their existence does not establish current availability, permission, completeness, or stability. Do not call them without authorization.
Build a compliant acquisition-to-API pipeline
If your organization has a permitted source, keep collection separate from the API your application exposes. A practical architecture is:
- Acquisition: retrieve records only through the licensed feed or authorized integration. Record source, scope, and retrieval time.
- Validation and retry handling: distinguish temporary transport failures from valid empty results; track null or malformed responses instead of silently accepting them.
- Raw storage: retain permitted source payloads separately from prepared data so authorized reprocessing is possible.
- Normalization: map source-specific records into stable internal entities and preserve source identifiers.
- API layer: return only fields required by clients, with pagination and explicit data freshness metadata where appropriate.
- Monitoring: alert on HTTP errors, schema changes, unexpected null rates, delayed updates, and mismatches between raw and normalized record counts.
The transfermarkt-datasets project documents a similar separation between raw assets and prepared data, using dbt and DuckDB in its preparation workflow. That is a useful architectural pattern, not an endorsement of unauthorized acquisition.
Keep provenance in the schema
At minimum, preserve the source entity ID, source URL when permitted, season or competition edition, retrieval timestamp, and parser or mapping version. For transfer and market-value records, also keep the subject player ID and the source’s event date or effective date separately from your own retrieval time. These fields make it possible to explain where a record came from and to diagnose changes without pretending your API is the source of truth.
Expose authorized records with FastAPI
The following small application serves normalized records already in your possession. It does not fetch or scrape Transfermarkt. It uses illustrative records, so replace the sample store and fields with the schema and rights granted by your data provider. Save as main.py, install FastAPI and Uvicorn, then run the commands below.
python -m pip install fastapi uvicorn
uvicorn main:app --reload
main.py:
from fastapi import FastAPI, HTTPException, Query
from pydantic import BaseModel
from typing import Optional
app = FastAPI(title="Authorized Football Data API", version="1.0.0")
class Player(BaseModel):
source_id: str
name: str
club: Optional[str] = None
season: Optional[str] = None
retrieved_at: str
# Replace with a database populated only through an authorized source.
players = [
Player(source_id="example-001", name="Sample Player", club="Example FC",
season="2025/26", retrieved_at="2026-09-29T00:00:00Z")
]
@app.get("/health")
def health():
return {"status": "ok"}
@app.get("/players", response_model=list[Player])
def list_players(
q: Optional[str] = Query(default=None, min_length=1),
season: Optional[str] = None,
limit: int = Query(default=50, ge=1, le=100),
offset: int = Query(default=0, ge=0),
):
rows = players
if q:
rows = [p for p in rows if q.casefold() in p.name.casefold()]
if season:
rows = [p for p in rows if p.season == season]
return rows[offset:offset + limit]
@app.get("/players/{source_id}", response_model=Player)
def get_player(source_id: str):
for player in players:
if player.source_id == source_id:
return player
raise HTTPException(status_code=404, detail="Player not found")
Try the API locally with curl "http://127.0.0.1:8000/players?q=Sample&limit=10&offset=0". FastAPI also provides interactive API documentation at /docs for this local application. In a real service, put persistent storage behind these routes, validate and authorize requests, and avoid exposing fields your license does not allow you to redistribute.
Designing resources for football data
Community API examples include club information, club search, leagues, club transfer history, league information and clubs, player profiles, player search, and player transfer history. Treat those as examples of useful resource boundaries, not fixed route names. A clean internal API might separate players, clubs, competitions, matches, appearances, and transfers, while keeping provider-specific identifiers and mappings behind the API layer.
The Tool Desk
Outbyte Driver Updater FREEFix the driver behind crashes, sound loss and screen glitchesFind Drivers →Outbyte PC Repair FREEClear out junk files and repair common Windows errorsFree Scan →Use pagination for list routes rather than returning an entire competition or transfer history in one response. Define whether search is exact or partial, how missing values are represented, and whether a field is current, historical, or provider-reported. If you expose market values, retain the source effective date and avoid presenting a stale value as current.
Retries, pacing, and reliability for authorized collection
Community code offers examples of defensive engineering, not permission or guaranteed settings. One dataset acquisition script uses a descriptive User-Agent, retries transient failures up to three times, and rejects a run if the null-response rate exceeds 20%. Those values belong to that script; they are not Transfermarkt requirements and are not universal defaults.
For an authorized integration, use the limits specified by the source owner. Retry only transient failures, with bounded exponential backoff and jitter; do not repeatedly retry access denials, bot checks, or policy blocks. Record response status, latency, retry count, and parsing outcome. A successful HTTP response can still contain an error page or changed markup, so validate the expected structure before accepting a record.
Build a circuit breaker or pause mechanism for repeated failures. Alert on a sudden rise in empty results, schema validation failures, or missing entity identifiers. If a page or endpoint changes, disable affected acquisition jobs rather than repeatedly requesting the source while debugging. For any licensed provider, use its documented retry and quota behavior instead of copying another project’s configuration.
Outdated Drivers Are Slowing You Down
One free scan finds every outdated or missing driver and matches the right update for your exact hardware.Free scan · exact hardware matchWindows Errors? Fix Them Before They Spread
Repair common Windows errors and clear accumulated junk for a smoother, more stable PC - no reinstall needed.Free scan · no reinstallCommon errors and what to do
- HTTP 403, CAPTCHA, or bot-check page: this may indicate blocked automated access. Stop the affected job and check authorization and the source owner’s instructions; do not try proxy rotation or evasion as a workaround.
- HTTP 404 or an empty response: the identifier may be wrong, the record may be unavailable, or an undocumented endpoint may have changed. Verify the ID through your authorized source and log the result as missing rather than inventing a record.
- JSON parsing error or unexpected HTML: the response may be an error page or the upstream format may have changed. Preserve the response only if your rights permit it, inspect validation logs, and pause processing until the schema is understood.
- Repeated timeouts: use the provider’s published timeout and retry guidance, bound retries, and monitor latency. Do not increase request volume to compensate for a failing source.
- FastAPI returns an empty list: check the query spelling, season filter, pagination offset, and whether the authorized ingestion job populated the store. An empty response is not evidence that an upstream player does not exist.
- Clients see stale or inconsistent values: expose retrieval and source-effective timestamps, then compare the normalized record with the permitted raw input. Review whether the issue is a delayed source update, a mapping bug, or duplicate entity identity.
Or skip the browser setup
ScreenshotNeo is a screenshot API and MCP server, not a Transfermarkt data API: it returns a visual capture, not structured player or transfer records. If your need is a page image or PDF and you are authorized to capture the page, a single GET request can produce it. See the ScreenshotNeo API documentation for request options.
Best Value
curl -G "https://api.screenshotneo.com/v1/shot" -d access_key=YOUR_API_KEY --data-urlencode url=https://www.transfermarkt.com/ -o shot.webp
ScreenshotNeo accepts cookie or consent banners like a visitor and removes more than 60 known consent platforms, newsletter popups, and chat widgets before capture; each step can be turned off. Bot checks, blank pages, timeouts, failed loads, and cache hits are not billed, and responses indicate the page verdict and billing status in headers. Its MCP server includes tools for AI agents, including take_screenshot, get_page_info, and capture_pdf. The Free plan includes 1,000 shots per month with no card; paid plans start at $5 for 3,000 shots. These are screenshot features, not a substitute for licensed structured data. Sign up for ScreenshotNeo’s free plan.
Cost, throughput, and maintenance considerations
Do not estimate operating cost from a scraper’s request count alone. Include the licensed data fee, authorized quota, retries, storage and transformation, API hosting, monitoring, and the engineering time needed when schemas or source behavior change. The community rate-limit example of 2 requests per 3 seconds is a project default, not a generally safe or permitted throughput figure. Use only the limit granted by your source.
For reliability, consider the upstream data feed and your own API as separate services. Cache normalized data according to the freshness your use case and license permit; return a clear update timestamp; and monitor both acquisition and serving. A healthy FastAPI process cannot compensate for a blocked, changed, or delayed upstream source.
Recommended Free Tools
Frequently Asked Questions
Can I use a community scraper if I only collect a few players?
The terms cited here prohibit automated access and copying; a smaller collection does not itself create permission. Obtain authorization or use a source licensed for your intended use.
Can ScreenshotNeo replace a Transfermarkt data API?
No. It captures a page as an image or PDF; it does not return structured player, transfer, or market-value records.
Are the CE market-value and transfer-history URLs official API endpoints?
The cited project uses those URLs, but the available evidence does not establish them as official or stable API contracts.
Quick Recap
Product prices and availability are accurate as of the date/time indicated and are subject to change. Any price and availability information displayed on Amazon at the time of purchase will apply.
Do these 3 things before closing this tab:
1Clear out junk files and repair common Windows errors2Fix the driver behind crashes, sound loss and screen glitches3Repair Windows errors before they cause bigger problems

