免费足球数据 API — 98 个联赛
English44 个国家和地区、98 个联赛的赛果、半场比分、进球时间分布、积分榜和赛程,包括大多数数据源不覆盖的低级别联赛。标准 REST 接口,返回 JSON。不注册也能直接调用。数据每天更新一次(约 UTC 6:00–8:00,即北京时间 14:00–16:00),不是实时比分。
哪些是免费的
1 · 第一次调用(不需要密钥)
# 全部联赛,以及每个联赛可以查询的赛季 curl https://footballcharts-backend.onrender.com/api/v1/leagues/ # 中超 2025 赛季全部赛果 curl "https://footballcharts-backend.onrender.com/api/v1/leagues/china/results/?season=2025"
{
"league": "china",
"season": "2025",
"season_state": "complete",
"count": 240,
"matches": [
{
"date": "2025-02-22",
"time": "11:35:00",
"kickoff_utc": "2025-02-22T11:35:00Z",
"homeTeam": "Chengdu Rongcheng",
"awayTeam": "Wuhan Three Towns",
"score": "1:0",
"ht_result": "0:0",
"first_goal_time": 59,
"first_goal_time_extra": 0,
"goalless": false
}
],
"source_url": "https://www.football-charts.com/leagues/china/super-league?ref=api",
"attribution": "Data by football-charts.com"
}| date / time | 开球日期和时间,UTC |
| kickoff_utc | 开球时间,ISO 8601 格式的 UTC 时间(北京时间 = UTC + 8 小时) |
| homeTeam / awayTeam | 主队 / 客队(英文队名) |
| score | 全场比分,格式 "主:客" |
| ht_result | 半场比分 |
| first_goal_time | 第一个进球的分钟;0:0 的比赛为 null |
| first_goal_time_extra | 数据源以 45+2 形式记录时的补时分钟,否则为 0 |
| goalless | 是否 0:0 |
| season_state | 赛季状态:preseason / in_season / complete |
| source_url | 网站上显示同一数据的页面;引用数据时请附上 |
2 · Python:获取赛果,画出进球时间分布
只需要 requests。完整脚本还会用 matplotlib 画图,并自动选用系统里的中文字体。
import requests
API = "https://footballcharts-backend.onrender.com/api/v1"
HEADERS = {} # 有免费密钥时:{"Authorization": "Bearer fc_你的密钥"}
# 中超 2025 赛季全部赛果(自然年赛制,赛季写作 "2025")
res = requests.get(f"{API}/leagues/china/results/",
params={"season": "2025"}, headers=HEADERS, timeout=30).json()
for m in res["matches"][:3]:
print(m["kickoff_utc"], m["homeTeam"], m["score"], m["awayTeam"],
"半场", m["ht_result"], "首球", m["first_goal_time"], "分钟")
# 进球时间分布:每 15 分钟一段,"45+" 和 "90+" 是补时
gt = requests.get(f"{API}/leagues/china/goal-timing/",
params={"season": "2025"}, headers=HEADERS, timeout=30).json()
print(dict(zip(gt["time_bins"], gt["stats"]["period_totals"])))pip install requests matplotlib,然后 python fc_api_quickstart_zh.py
3 · CSV 样例:中超 2025 赛季与 98 联赛代码对照表
240 场比赛,一行一场,取自开放数据集(CC BY 4.0)。包括开球时间(UTC)、主客队、半场和全场比分,以及每个进球的分钟(all_goal_times,如 "12,47,93")。文件均为 UTF-8 编码并带 BOM,Excel 可以直接打开。
下载 csl_2025_results.csv(中超 2025 赛果) · 下载 leagues_zh_cn.csv(98 个联赛代码与中英文对照表) · 全部 92 个联赛的同格式数据见 开放数据集
4 · 赛季怎么写:跨年制和自然年制
- · 跨年制(秋季开始,次年春季结束)写作
"2025-2026":英超、西甲、德甲、意甲、法甲、沙特联、澳超等。 - · 自然年制(同一年内开始和结束)写作
"2025":中超、韩K联、巴甲、挪超、瑞典超、芬超等。 - · 日职联:2026 年上半年是过渡期的特别赛季(
"2026"),从 2026-27 赛季起改为跨年制("2026-2027")。 - · 写错格式时,API 返回
400 unknown_season,并在提示里给出正确写法。最稳妥的做法是先调用/leagues/,直接使用其中的赛季字符串。
5 · 时间一律为 UTC
API 中所有日期和时间都是 UTC。北京时间比 UTC 早 8 小时:kickoff_utc 为 2025-02-22T11:35:00Z 的比赛,北京时间 19:35 开球。2026 年 10 月 13 日以前,已完赛比赛的 time 字段是数据源的本地时间而不是 UTC,现已更正,并新增了 kickoff_utc 字段。
6 · 错误码
出错时返回 JSON:{"error": {"code": "…", "message": "…"}},message 为英文。
| 400 | unknown_season | 这个联赛没有该赛季,多半是跨年制和自然年制写反了;返回信息里有正确写法 |
| 401 | unknown_key | 密钥无效:检查 Authorization 请求头 |
| 403 | season_gated | 超出免费范围的赛季。如果该赛季在开放数据集中,返回信息会给出免费下载地址 |
| 404 | unknown_league | 联赛代码不存在:先调用 /leagues/ 查询 |
| 429 | anon_rate_limited · anon_daily_limit · rate_limited · daily_limit | 超过每分钟或每天的次数:稍后重试,或注册免费密钥 |
7 · 免费密钥:每天 200 次
只需要邮箱。密钥会立即显示在页面上,同时发送到你的邮箱(没收到请看垃圾邮件文件夹)。调用时加请求头 Authorization: Bearer fc_你的密钥。
免费密钥供个人使用(试用、自己的分析和项目),同一邮箱的所有密钥合计每天 200 次。供他人使用的应用、网站、机器人或频道需要商业版。10 月 26 日之前注册的密钥在 11 月 2 日之前仍为每天 5,000 次。
8 · 全部接口
基础地址:https://footballcharts-backend.onrender.com/api/v1。接口说明也可以直接访问 GET /api/v1/(英文)。
| GET /leagues/ | 全部联赛,以及每个联赛可以查询的赛季 |
| GET /leagues/{league}/results/?season=&team= | 已完赛比赛:全场和半场比分、首个进球时间 |
| GET /leagues/{league}/goal-timing/?season=&team= | 进球时间分布:每 15 分钟一段,含 45+ 和 90+ 补时 |
| GET /leagues/{league}/table/?season=&view= | 积分榜(view = classic | luck | goals) |
| GET /leagues/{league}/fixtures/ | 未来赛程(含模型概率) |
| GET /leagues/{league}/teams/?season= | 按积分榜顺序排列的球队 |
| GET /leagues/{league}/teams/{team}/?season= | 单支球队:赛程赛果、进球时间、统计 |
| GET /leagues/{league}/projection/ | 赛季蒙特卡洛模拟:最终排名的概率分布 |
| GET /matches/{slug}/ | 单场比赛详情 |
| GET /track-record/ | 模型公开预测的结算记录 |
9 · 完整历史(付费)
同一个接口、同样的 JSON,2020 年以来的全部赛季:
- · 个人:€9/月 或 €99/年,每天 5,000 次,个人和研究用途。
- · 商业:€39/月 或 €390/年,每天 25,000 次。供他人使用的应用、网站、机器人或频道(收费或免费)都需要商业版;提供发票和邮件支持,变更提前 30 天通知(仍需注明来源,不得转售原始数据)。
先注册免费密钥;购买后,同一个密钥在一分钟内升级,代码不用改,原来返回 403 的赛季直接可用。付款方式、年付、发票和免费学术申请见价格与购买 →
附录 · MCP 服务器(给 AI 助手和智能体用)
MCP(Model Context Protocol)让支持它的 AI 客户端直接调用上面的数据。托管服务器无需安装、无需密钥:
https://mcp.football-charts.com/mcp # 带免费密钥(每天 200 次): https://mcp.football-charts.com/fc_你的密钥/mcp
{
"mcpServers": {
"football-charts": {
"url": "https://mcp.football-charts.com/mcp"
}
}
}npx -y footballcharts-mcp # 国内网络可用 npmmirror 镜像: npx --registry=https://registry.npmmirror.com -y footballcharts-mcp
curl -s https://mcp.football-charts.com/mcp \
-H 'Content-Type: application/json' \
-H 'Accept: application/json, text/event-stream' \
-d '{"jsonrpc":"2.0","id":1,"method":"tools/list"}'可在 Cherry Studio、Cursor、Cline、VS Code 等支持 MCP 的客户端中添加。所有工具都是只读的,工具说明和返回内容为英文:
| about_football_charts | 数据覆盖范围、赛季格式和免费额度 |
| list_leagues | 全部联赛及可查询的赛季 |
| get_results | 已完赛比赛:全场和半场比分、首个进球时间 |
| get_goal_timing | 每 15 分钟的进球分布(可按球队) |
| get_league_table | 积分榜:积分、胜平负、进失球、近期战绩 |
| get_team | 单支球队:赛程赛果、进球时间、统计 |
| get_fixtures | 未来赛程(含模型概率) |
| get_match | 单场比赛详情 |
| get_season_projection | 赛季蒙特卡洛模拟(每天更新,10,000 次) |
| get_track_record | 模型公开预测的结算记录 |
使用条款:个人和研究用途免费,需注明来源“Data by football-charts.com”(或“数据来源:football-charts.com”),不得转售原始数据。数据仅供统计和研究使用。完整条款见 Terms(英文)。
