API Contract
All routes live under /v1 and return JSON. Errors use this shape:
{
"error": {
"code": "PLAYER_NOT_FOUND",
"message_key": "errors.playerNotFound",
"request_id": "req_..."
}
}
Implemented Worker route surface:
GET /v1/healthGET /v1/meta/optionsGET /v1/search/players?q=GET /v1/players/:mode/:tenhou_name?range=GET /v1/players/:mode/:tenhou_name/summary?range=GET /v1/players/:mode/:tenhou_name/daily?range=&from=&to=GET /v1/players/:mode/:tenhou_name/games?cursor=&limit=GET /v1/players/:player_idGET /v1/players/:player_id/summary?mode=&range=GET /v1/players/:player_id/daily?mode=&range=&from=&to=GET /v1/players/:player_id/games?mode=&cursor=&limit=GET /v1/games?mode=&range=&room=&q=&from=&to=&cursor=&limit=GET /v1/games/:game_idGET /v1/games/:game_id/replay-linkGET /v1/rankings/:ranking_type?mode=&range=&limit=GET /v1/stats/global?mode=&range=&from=&to=GET /v1/status/coverageGET /v1/status/pipeline
List endpoints cap limit at 100.
Frontend-aligned controls are exposed by /v1/meta/options: modes, ranges, room filters, ranking fields, and locale entry points. Current mode path segments are 4 and 3, matching web routes such as /players/4/:tenhou_name.
/v1/games is the API counterpart to the web match browser. It returns paginated game summaries with seated players, next_cursor, and total, but does not expose mjlog XML bulk-download paths.