形式 Data shape
What's in derived.json — the single artifact every component reads — and what we compute on top of it. Schema first, then the formulas behind each metric.
Dataset at a glance
What's actually in the cache. The dashboard reads from the six-basho window; the longitudinal viz reaches back to the start of the modern (six-basho-a-year) era in 1958.
- 67 years covered Nov 1958 - May 2026
- 406 honbasho every Makuuchi tournament since 1958
- 113,157 bouts Makuuchi bout records, day-by-day
- 608 active rikishi across all six divisions today
- 42 sekitori current Makuuchi top-division roster
- 82 kimarite official winning techniques
What's in derived.json
Tournaments
The most recently started or upcoming basho. Drives the live banner, the status chip in the basho list, and the yusho race strip.
Example value
{
"id": "202605",
"startDate": "2026-05-10T00:00:00Z",
"endDate": "2026-05-24T00:00:00Z",
"status": "completed",
"yusho": [
{
"division": "Makuuchi",
"rikishiId": 12,
"shikonaEn": "Wakatakakage"
},
{
"division": "Juryo",
"rikishiId": 8865,
"shikonaEn": "Kazuma"
},
{
"division": "Makushita",
"rikishiId": 8951,
"shikonaEn": "Ikarigata"
},
{
"division": "Sandanme",
"rikishiId": 9103,
"shikonaEn": "Asahifuji"
},
{
"division": "Jonidan",
"rikishiId": 9109,
"shikonaEn": "Shosei"
},
{
"division": "Jonokuchi",
"rikishiId": 9121,
"shikonaEn": "Hakugetsuro"
}
],
"sansho": [
{
"type": "Kanto-sho",
"rikishiId": 8857,
"shikonaEn": "Yoshinofuji",
"shikonaJp": "義ノ富士 直哉"
},
{
"type": "Kanto-sho",
"rikishiId": 3,
"shikonaEn": "Hakunofuji",
"shikonaJp": "伯乃富士 哲也"
},
{
"type": "Gino-sho",
"rikishiId": 12,
"shikonaEn": "Wakatakakage",
"shikonaJp": "若隆景 渥"
}
]
} The last 6 honbasho (Jan/Mar/May/Jul/Sep/Nov) in reverse chronological order. Powers the "Last 6 bashos" summary grid and coverage windows.
Example value
[
{
"id": "202605",
"startDate": "2026-05-10T00:00:00Z",
"endDate": "2026-05-24T00:00:00Z",
"status": "completed",
"yusho": [
{
"division": "Makuuchi",
"rikishiId": 12,
"shikonaEn": "Wakatakakage"
},
{
"division": "Juryo",
"rikishiId": 8865,
"shikonaEn": "Kazuma"
},
{
"division": "Makushita",
"rikishiId": 8951,
"shikonaEn": "Ikarigata"
},
{
"division": "Sandanme",
"rikishiId": 9103,
"shikonaEn": "Asahifuji"
},
{
"division": "Jonidan",
"rikishiId": 9109,
"shikonaEn": "Shosei"
},
{
"division": "Jonokuchi",
"rikishiId": 9121,
"shikonaEn": "Hakugetsuro"
}
],
"sansho": [
{
"type": "Kanto-sho",
"rikishiId": 8857,
"shikonaEn": "Yoshinofuji",
"shikonaJp": "義ノ富士 直哉"
},
{
"type": "Kanto-sho",
"rikishiId": 3,
"shikonaEn": "Hakunofuji",
"shikonaJp": "伯乃富士 哲也"
},
{
"type": "Gino-sho",
"rikishiId": 12,
"shikonaEn": "Wakatakakage",
"shikonaJp": "若隆景 渥"
}
]
}
// ... 5 more
] One entry per basho in the window (up to 6). Each entry holds every Makuuchi rikishi's full 15-day record with opponent and kimarite per day. Drives the basho board, sankey, yusho race, and kimarite analyses.
Example value
{
"bashoId": "202507",
"division": "Makuuchi",
"entries": [
{
"rikishiId": 19,
"shikonaEn": "Hoshoryu",
"shikonaJp": "豊昇龍 智勝",
"rank": "Yokozuna 1 East",
"rankFamily": "Yokozuna",
"rankNumber": 1,
"side": "East",
"rankValue": 101,
"record": [
{
"day": 1,
"result": "win",
"opponentId": 44,
"opponentEn": "Takayasu",
"kimarite": "sotogake",
"opponentJp": "高安"
},
{
"day": 2,
"result": "loss",
"opponentId": 13,
"opponentEn": "Wakamotoharu",
"kimarite": "yorikiri",
"opponentJp": "若元春"
},
{
"day": 3,
"result": "loss",
"opponentId": 8854,
"opponentEn": "Aonishiki",
"kimarite": "watashikomi",
"opponentJp": "安青錦"
}
// ... 12 more days
],
"wins": 1,
"losses": 3,
"absences": 10
}
]
} People
Current Makuuchi roster (42 rikishi), enriched with computed age, years active, and merged photo data (Wikipedia or JSA). Powers the athletes section, origin map, and body distribution. (The full photo cache covers a much wider corpus — 1,095 active + historical Makuuchi rikishi — but it's read directly by per-rikishi profile pages and the directory; only the current-Makuuchi slice flows into derived.json.)
Example value
[
{
"id": 19,
"shikonaEn": "Hoshoryu",
"shikonaJp": "豊昇龍 智勝",
"currentRank": "Yokozuna 1 East",
"rankFamily": "Yokozuna",
"rankNumber": 1,
"side": "East",
"heya": "Tatsunami",
"birthDate": "1999-05-22T00:00:00Z",
"shusshin": "Mongolia, Ulaanbaatar",
"shusshinRegion": "Mongolia",
"shusshinCountry": "Mongolia",
"height": 188,
"weight": 148,
"debut": "201711",
"ageYears": 27,
"yearsActive": 8.583333333333334,
"photo": {
"thumbnail": "https://upload.wikimedia.org/wikipedia/commons/thumb/c/...",
"original": "https://upload.wikimedia.org/wikipedia/commons/thumb/c/...",
"pageUrl": "https://en.wikipedia.org/wiki/H%C5%8Dsh%C5%8Dry%C5%AB_Tomokatsu",
"credit": "Wikipedia / CC BY-SA"
},
"careerContext": {
"yushoAllTimeRank": 13,
"yushoAllTimeRankSuffix": "13th",
"winPctRankPercentile": 0.407,
"winPctRankPercentileBucket": "bottom-half",
"isYoungestYokozunaInYears": 18
}
}
// ... 41 more
] Career statistics per sekitori keyed by numeric id. Reaches back to each wrestler's professional debut - not bounded by our 6-basho window. Drives the leaders leaderboard and career win % calculation.
Example value
{
"8854": {
"totalMatches": 177,
"totalWins": 135,
"totalLosses": 42,
"yusho": 4,
"basho": 16,
"sansho": {
"Gino_sho": 3,
"Kanto_sho": 2,
"Shukun_sho": 1
}
}
} Per stable with at least one active Makuuchi member. Aggregated from the full 621-rikishi roster. Powers the stables bar chart (section 13).
Example value
[
{
"name": "Isegahama",
"sekitoriCount": 4,
"activeTotal": 32,
"makuuchi": 4,
"sanyaku": 1,
"careerYushoSum": 10,
"lastBashoWins": 35,
"lastBashoLosses": 24,
"topRank": "Sekiwake 1 East",
"careerContext": {
"allTimeYushoCount": 21,
"allTimeYushoRank": 7
}
}
// ... 26 more
] Places
Hometown region counts across the Makuuchi roster. Japanese prefectures are stripped of -ken/-fu/-to/-do suffixes; non-Japan entries use the country name as region. Powers the origins map (section 14).
Example value
[
{
"region": "Mongolia",
"country": "Mongolia",
"count": 7
},
{
"region": "Chiba",
"country": "Japan",
"count": 4
},
{
"region": "Saitama",
"country": "Japan",
"count": 3
}
// ... 20 more
] Cohorts
All 6 divisions with current active rikishi count. Computed across the full 621-rikishi roster. Powers the division overview in section 11.
Example value
[
{
"name": "Makuuchi",
"count": 42,
"isFocus": true
},
{
"name": "Juryo",
"count": 28,
"isFocus": false
},
{
"name": "Makushita",
"count": 119,
"isFocus": false
},
{
"name": "Sandanme",
"count": 160,
"isFocus": false
},
{
"name": "Jonidan",
"count": 204,
"isFocus": false
},
{
"name": "Jonokuchi",
"count": 55,
"isFocus": false
}
] Per-division weight distribution summary + individual scatter points. Quartiles are computed via linear interpolation. Powers the body distribution scatter (section 15).
Example value
{
"division": "Makuuchi",
"count": 42,
"min": 121,
"max": 197,
"median": 160,
"mean": 157.35714285714286,
"p25": 141.75,
"p75": 170.75,
"points": [
{
"id": 2,
"shikonaEn": "Asanoyama",
"shikonaJp": "朝乃山 広暉",
"weight": 170,
"height": 188
},
{
"id": 3,
"shikonaEn": "Hakunofuji",
"shikonaJp": "伯乃富士 哲也",
"weight": 161,
"height": 181
}
// ... 40 more
],
"heaviest": {
"id": 74,
"shikonaEn": "Atamifuji",
"weight": 197
},
"lightest": {
"id": 615,
"shikonaEn": "Fujinokawa",
"weight": 121
}
} Outcomes
Total frequency of each winning technique across all bouts in the 6-basho window, sorted descending. Powers the kimarite frequency bar in section 17.
Example value
[
{
"kimarite": "yorikiri",
"count": 438
},
{
"kimarite": "oshidashi",
"count": 431
},
{
"kimarite": "hatakikomi",
"count": 168
}
// ... 42 more
] Kimarite breakdown grouped by the winner's rank tier (Yokozuna through Maegashira), with family rollups (force/push/throw/thrust/leg). Powers the sunburst (section 18) and moves-by-rank chart (section 19).
Example value
[
{
"tier": "Yokozuna",
"totalWins": 90,
"distinctKimarite": 21,
"kimarite": [
{
"name": "yorikiri",
"count": 24,
"family": "force",
"pct": 26.666666666666668
},
{
"name": "oshidashi",
"count": 16,
"family": "push",
"pct": 17.77777777777778
},
{
"name": "yoritaoshi",
"count": 9,
"family": "force",
"pct": 10
}
// ... 18 more
],
"familyTotals": [
{
"family": "force",
"count": 33,
"pct": 36.666666666666664
},
{
"family": "push",
"count": 23,
"pct": 25.555555555555554
},
{
"family": "thrust",
"count": 15,
"pct": 16.666666666666664
},
{
"family": "throw",
"count": 14,
"pct": 15.555555555555555
},
{
"family": "leg",
"count": 4,
"pct": 4.444444444444445
},
{
"family": "other",
"count": 1,
"pct": 1.1111111111111112
}
]
}
// ... 4 more tiers
] Top 12 active Makuuchi sekitori by yusho count, career wins, and career win percentage (gated to ≥100 matches to avoid small-sample noise). Powers the leaders section (section 16).
Example value
{
"yusho": [
{
"id": 22,
"shikonaEn": "Abi",
"count": 8
},
{
"id": 15,
"shikonaEn": "Ryuden",
"count": 7
}
// ... 10 more
],
"wins": [
{
"id": 14,
"shikonaEn": "Tamawashi",
"wins": 897
},
{
"id": 44,
"shikonaEn": "Takayasu",
"wins": 819
}
// ... 10 more
],
"winPct": [
{
"id": 8854,
"shikonaEn": "Aonishiki",
"pct": 76.27118644067797,
"matches": 177
},
{
"id": 8850,
"shikonaEn": "Onosato",
"pct": 74.07407407407408,
"matches": 243
}
// ... 10 more
]
} What's in the dataset
sumo-api.com exposes more endpoints than we currently pull from. Here's where things stand.
| Endpoint | We use | What it covers |
|---|---|---|
/api/rikishis | Yes | Full 621-rikishi roster across all six divisions |
/api/rikishi/<id>/stats | Yes | Career W/L, yusho count, sansho counts per rikishi |
/api/basho/<YYYYMM> | Partial | Tournament metadata + yusho winners. Special-prize (sansho) winners are in the raw data but not surfaced yet. |
/api/basho/<YYYYMM>/banzuke/<Division> | Partial | Full 15-day per-bout records. Opponent IDs are cached but not exposed in derived data. |
/api/rikishi/<id>/matches | No | Paginated career bout history with opponent, rank, and kimarite per match |
/api/rikishi/<id1>/matches/<id2> | No | Head-to-head record between any two rikishi, with kimarite breakdown |
/api/basho/<YYYYMM>/torikumi/<Division>/<day> | No | Day-of matchup cards for any tournament day, including live-day scheduling |
/api/kimarite/<technique> | No | All historical bouts decided by a given technique (back to 1958, up to 175K records for yorikiri) |
What we could add without new API access
- Head-to-head matrices - career W/L between any two rikishi. The opponent IDs are already in the raw cache for all 406 bashos; the h2h endpoint provides win-technique breakdowns on top.
- Sansho (special prize) winners per basho - outstanding performance, fighting spirit, and technique prizes are cached in every basho file but not shown on the site.
- Live-day matchup board - today's scheduled bouts during a basho, sourced from the torikumi endpoint.
- Per-technique historical drilldowns - how often each kimarite has been used per decade and which rank tiers favor it, drawing on 67 years of bout records.
- Opponent-quality-adjusted leaderboards - win rate weighted by the rank of opponents faced, enabled once opponentID is lifted into derived data.
Toshiyori-kabu data
Toshiyori-kabu records come solely from Japanese Wikipedia (年寄名跡 as the seed list + per-kabu institution articles for lineage). sumo-api has no kabu data; English Wikipedia mostly doesn't either.
Holders in lineage tables (in kanji) are matched against our roster - currently-active
oyakata via ja-wiki furigana → Hepburn romanization → bio.shikonaEn, historical holders
via direct kanji → bio.shikonaJp match. The kanji path mostly fails for pre-1958 holders
(they're not in our roster); the romaji path resolves 99 of
the 1554 matchable entries (6%).
Of 1554 match attempts: 6% exact, 0% via manual override
in data/kabu-overrides.json, 94% unmatched (rendered as plain
kanji on the lineage timeline). Unmatched is the expected steady state for any holder
who retired before 1958 - they're outside our roster.
Each current holder also gets a third-stage enrichment: a separate fetch of the holder's own ja-wiki article pulls their JSA role (Chairman, Director, Auditor, Committee Member, Chief; 88/104 resolved) and stable-master status (the heya they run as shisho; 20/104 confirmed). These are surfaced on the per-kabu page and bidirectionally on /rikishi and /heya entries.
One profile per kabu slug, built at deploy time from data/raw/kabu/list.json (seed rows + holder enrichment) + data/raw/kabu/<slug>.json (per-kabu lineage scraped from ja-Wikipedia). matchSource is "exact", "override", or absent (unmatched). decadeSpan is { firstYear, lastYear } across all dated holders; null when no year data is available. lineageDepth + lineageYears drive the /kabu directory's depth heatmap and per-card metrics.
What we compute, and how
Tournament outcomes
- Wins / losses / absences per basho
- Walk each rikishi's
record[]array (15 entries).win+fusen-wincount as wins;loss+fusen-lossas losses;absentas absences. Empty results (future days in a live basho) are ignored. - Banzuke outcome buckets (Sankey, section 09)
- For each Makuuchi entry in the most recently completed basho:
- Yusho - the per-division winner (single entry)
- Strong kachi-koshi - 10+ wins, 0 absences
- Kachi-koshi - 8-9 wins, 0 absences
- Make-koshi - 5-7 wins, 0 absences
- Bad make-koshi - ≤4 wins, 0 absences
- Kyūjō - any absences
- Banzuke pyramid - rank slot view (03)
- Group the current Makuuchi banzuke by
(rankFamily, rankNumber). Each slot has up to one East and one West holder. Empty East/West slots show as "vacant" - useful for explaining why "Yokozuna 2" doesn't exist when there are only 2 yokozuna.
Career math
- Career win %
totalWins / totalMatchesfrom sumo-api stats. Gates the leaderboard to wrestlers with ≥100 matches to avoid misleading small-sample noise.
Kimarite classification
- Family classification (kimarite)
- Each of the 82 official kimarite is mapped to one of:
force·push·thrust·throw·leg·lose·other. Mapping is inscripts/build-data.tsand mirrored in three components (Kimarite.astro, Moves.astro, KimariteSunburst.astro). Rare/novel kimarite default tootheruntil added. - Belt-game vs striking (Moves by rank, section 19)
- "Belt-game" =
force + throwfamily share. "Striking" =push + thrustfamily share. The implication: belt-game requires a clinch at the mawashi; striking happens at distance.
Aggregations
- Origin parsing
- The first comma-separated part of
shusshinis stripped of-ken / -fu / -to / -do(the four Japanese administrative suffixes for prefectures). Result is checked against the 47-prefecture allowlist. Match → Japan; otherwise → foreign country (uses the field as-is). - Stable aggregations (13 / Stables)
- Across the full 621-rikishi roster: count active wrestlers per heya, count Makuuchi members, count sanyaku-rank holders, sum career yusho across the active Makuuchi roster, and sum the most recently completed basho's W/L for each stable's Makuuchi cohort.
- Weight distribution (15 / Bodies)
- Quartiles (p25/p50/p75) computed via linear interpolation. Mean is plain arithmetic. All 619 active rikishi (619/621 = 99.7% have weight data; 2 missing weight excluded). Heaviest/lightest annotations are picked per division.