Game records
Game records are snapshots of the official game, collected by Haneoka’s own account pool. Every read is public and needs no key.
Requests use a region, because each one is a separate game server:
| Region | Server |
|---|---|
jp | JP |
tw | TW/HK/MO |
en | EN Regions |
kr | KR |
Regions are different from the jp and intl catalog servers: tw, en and kr all share the Global catalog.
Pending responses
Section titled “Pending responses”Data is read from stored snapshots, so a request never waits on the game. When something has not been collected yet, the API queues it and answers 503:
{ "error": { "kind": "pending", "retryAfter": 30 } }Wait retryAfter seconds, then repeat the same request. Most reads complete within a few minutes.
Current event
Section titled “Current event”The running event, its dates and which boards it has. event is null between events.
/api/v1/game/records/{region}/events/current Event boards
Section titled “Event boards”The total board, or one challenge song’s board, with the top 100 players and their decks.
/api/v1/game/records/{region}/events/{eventId}/total/latest GET /api/v1/game/records/{region}/events/{eventId}/challenges/{challengeId}/latest| Field | Meaning |
|---|---|
rows[].rank, tied | Position, and whether another row shares it |
rows[].scoreExact | Score as a decimal string. Use it for totals past 2^53 |
rows[].profileId | Pass to the player endpoint |
rows[].profileCard | Name card, or null |
rows[].cards | The five deck slots: member and Snapshot IDs with growth |
observedAtMs, stale | When it was collected, and whether it is overdue |
Event point board
Section titled “Event point board”Events that rank points have a third board. Rows carry point and no deck; other events answer 404.
/api/v1/game/records/{region}/events/{eventId}/latest Ranks past the top 100
Section titled “Ranks past the top 100”Read the board 100 ranks at a time. start falls back to its window, maxRank is null until the last rank is seen, and search looks through the top 2000 by player ID. Windows are collected only while an event has a point board.
/api/v1/game/records/{region}/events/{eventId}/points/ranking /api/v1/game/records/{region}/events/{eventId}/points/search Song rankings
Section titled “Song rankings”The top 100 for one song.
/api/v1/game/records/{region}/songs/{musicId}/ranking Arena boards
Section titled “Arena boards”One league’s board, 100 rows at a time. bandId is the league’s band, and start is a rank.
/api/v1/game/records/{region}/arena/seasons/{seasonId}/leagues/{bandId}/ranking Rows match event boards, with point in place of a score.
Players by points
Section titled “Players by points”How many players hold at least each threshold. A cold count answers 202; repeat after Retry-After.
/api/v1/game/records/{region}/arena/seasons/{seasonId}/leagues/{bandId}/population Find a player
Section titled “Find a player”Looks for an in-game ID among the top searchedTo ranks. row is null when they are further down.
/api/v1/game/records/{region}/arena/seasons/{seasonId}/leagues/{bandId}/search Players
Section titled “Players”A public profile by the ID shown in the game.
/api/v1/game/records/{region}/players/{profileId} The first read of a player may answer pending. Records refresh after six hours.
profileCard.pages[].downloadUrl gives a PNG download for each page of the card.
In JavaScript
Section titled “In JavaScript”import { createGameClient } from "https://haneoka.org/tools/api-client.js";
const game = createGameClient({ region: "jp" });const { event } = await game.currentEvent();const board = await game.eventRanking(event.id);for (const row of board.rows.slice(0, 3)) console.log(row.rank, row.name, row.scoreExact);The client also has profile, songRanking, challengeRanking and arenaRanking.