REST API

API 文件

15 個 RESTful 端點(13 個 CPBL 分析 + 2 個 Infra)。分析 API 唯讀(GET)無需認證; Infra API 走 Bearer auth 保護內部資源(如 Workers AI 額度)。

總覽

17
端點
3
資源群組
GET
唯讀

API 由 Hono on Cloudflare Workers 建置並透過 HTTPS 提供。所有回應均為 JSON。CORS 開放。

Base URL:https://murs-api.yenru.workers.dev

回應格式

/api/games 使用分頁信封:

分頁信封
{
  "items":    [ ... ],
  "total":    370,
  "page":     1,
  "per_page": 50
}

錯誤處理

404 找不到
{ "detail": "Game '20250401001' not found" }
422 驗證錯誤
{ "detail": [{ "loc": ["query", "year"], "msg": "value is not a valid integer" }] }
500 內部錯誤
{ "detail": "Internal Server Error" }

Games

2 個端點
GET/api/cpbl/games列出比賽(分頁)

查詢參數

參數類型預設值描述
yearinteger季節年份
teamstring按球隊代碼篩選
pageinteger1頁碼
per_pageinteger50每頁項目數 (1-200)

範例回應

{
  "items": [{
    "game_id": "20260401001",
    "game_date": "2026-04-01",
    "home_team": "CTBC",
    "away_team": "UNI",
    "home_score": 5,
    "away_score": 3
  }],
  "total": 370, "page": 1, "per_page": 50
}
GET/api/cpbl/games/{game_id}按 ID 取得單一比賽

路徑參數

game_id — 字串,找不到時返回 404

範例回應

{
  "game_id": "20260401001",
  "game_date": "2026-04-01",
  "home_team": "CTBC",
  "away_team": "UNI",
  "home_score": 5, "away_score": 3,
  "venue": "天母棒球場"
}

Players

2 個端點
GET/api/cpbl/players列出所有球員

查詢參數

參數類型預設值描述
teamstring按球隊代碼篩選

範例回應

[{
  "player_id": "P001234",
  "name_zh": "林智勝",
  "team": "CTBC",
  "position": "1B",
  "bats": "R", "throws": "R"
}]
GET/api/cpbl/players/{player_id}按 ID 取得球員

路徑參數

player_id — 字串,找不到時返回 404

範例回應

{
  "player_id": "P001234",
  "name_zh": "林智勝",
  "team": "CTBC",
  "position": "1B"
}

分析

9 個端點
GET/api/cpbl/analysis/lobLOB%投手 LOB% 排行榜

查詢參數

參數類型預設值描述
yearinteger2026賽季年份
min_ipfloat10最低投球局數

範例回應

[{
  "player_id": "cpbl_王維中",
  "player_name": "王維中",
  "team": "味全龍",
  "lob_pct": 0.782, "ip": 156.2,
  "league_avg": 0.702,
  "is_lucky": true, "is_unlucky": false
}]
GET/api/cpbl/analysis/count球數打者球數分組

查詢參數

參數類型預設值描述
yearinteger2026賽季年份
batterstring球員 ID,如 cpbl_林安可

範例回應

{
  "player_id": "cpbl_林安可",
  "total_pa": 520,
  "first_pitch_swing_pct": 0.32,
  "ahead": { "ba": 0.345, "k_pct": 0.12 },
  "behind": { "ba": 0.198, "k_pct": 0.38 },
  "two_strike": { "ba": 0.175, "k_pct": 0.42 }
}
GET/api/cpbl/analysis/fatigue疲勞投手疲勞排行榜

查詢參數

參數類型預設值描述
yearinteger2026賽季年份
min_ipfloat10最低局數

範例回應

[{
  "pitcher_id": "cpbl_徐若熙",
  "team": "中信兄弟",
  "games": 28,
  "total_pitches": 2850,
  "fatigue_threshold_pitch": 75,
  "overall_ba_against": 0.228
}]
GET/api/cpbl/analysis/fatigue/{pitcher_id}疲勞投手疲勞曲線

路徑參數

pitcher_id — 如 cpbl_徐若熙

範例回應

{
  "pitcher_id": "cpbl_徐若熙",
  "buckets": [{
    "pitch_start": 1, "pitch_end": 15,
    "ba_against": 0.195, "k_pct": 0.28,
    "is_fatigue_point": false
  }]
}
GET/api/cpbl/analysis/clutchClutch關鍵時刻排行榜

查詢參數

參數類型預設值描述
yearinteger2026賽季年份
min_painteger10最低打席數

範例回應

[{
  "player_id": "cpbl_林安可",
  "team": "統一7-ELEVEn獅",
  "overall_ba": 0.325,
  "high_li_ba": 0.380,
  "clutch_score": 0.145
}]
GET/api/cpbl/analysis/wrcwRC+wRC+ 排行榜

查詢參數

參數類型預設值描述
yearinteger2026賽季年份

範例回應

[{
  "player_name": "林安可",
  "team": "統一7-ELEVEn獅",
  "avg": 0.325, "obp": 0.401, "slg": 0.535
}]
GET/api/cpbl/analysis/babipBABIPBABIP 分析

查詢參數

參數類型預設值描述
yearinteger2026賽季年份

範例回應

[{
  "player_name": "林安可",
  "babip": 0.342,
  "league_avg": 0.298
}]
GET/api/cpbl/analysis/parkPark球場因子

查詢參數

參數類型預設值描述
yearinteger2026賽季年份

範例回應

[{
  "venue": "天母棒球場",
  "park_factor": 1.12,
  "games": 45
}]
GET/api/cpbl/analysis/splits半季半季分割

查詢參數

參數類型預設值描述
yearinteger2026賽季年份

範例回應

[{
  "player_name": "朱育賢",
  "first_half_avg": 0.248,
  "second_half_avg": 0.341,
  "diff": 0.093
}]

Infra (內部)

2 個端點
GET/api/health服務健康檢查。帶 `?detail=true` 且 Bearer auth 時回傳 4 個 D1 的 latency

查詢參數

參數類型預設值描述
detailbooleanfalse詳細模式需 Bearer

範例回應

{
  "status": "ok",
  "timestamp": "2026-04-18T12:00:00Z"
}
POST/api/ai/embedCloudflare Workers AI bge-m3 embedding(內部 MCP 用,需 Bearer auth)

查詢參數

參數類型預設值描述
textstringBody JSON: 要 embed 的文字(≤24K chars)

範例回應

// POST /api/ai/embed
// Authorization: Bearer <AI_EMBED_SECRET>
{
  "embedding": [0.004, -0.025, ...],  // 1024-dim
  "dims": 1024,
  "model": "@cf/baai/bge-m3"
}