{"openapi":"3.1.0","info":{"title":"maishift API","version":"1.0.0","description":"Read-only access to maimai DX song data and players' records on maishift. Every request needs an API key, issued in Settings › Developer.\n\nEach app has a budget of 120 units, refilled at 2 per second and shared by its keys; requests made for a player (/me) draw on a budget of the same size for each player. Each endpoint says what it costs; past the budget, requests get `429` with `Retry-After`."},"servers":[{"url":"https://maimai.shiftpsh.com"}],"security":[{"apiKey":[]}],"components":{"securitySchemes":{"apiKey":{"type":"apiKey","in":"header","name":"X-API-Key"},"oauth2":{"type":"oauth2","description":"Authorization code with PKCE (S256). Exchanging a code or refresh token also needs the app's X-API-Key.","flows":{"authorizationCode":{"authorizationUrl":"https://maimai.shiftpsh.com/oauth/authorize","tokenUrl":"https://maimai.shiftpsh.com/api/oauth/token","refreshUrl":"https://maimai.shiftpsh.com/api/oauth/token","scopes":{"profile":"Who the player is: their id for your app, handle and profile. Always granted.","records":"The player's latest records, whether or not their profile is public.","history":"The player's past syncs, whether or not their past records are public. Includes `records`: the newest sync is the latest records.","playlists":"The player's playlists, private ones included.","offline.access":"A refresh token, so access outlasts the two-hour access token."}}}}},"schemas":{"Error":{"type":"object","required":["error"],"properties":{"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["missing_api_key","invalid_api_key","app_suspended","invalid_token","insufficient_scope","bad_request","not_found","not_public","rate_limited","internal"]},"message":{"type":"string"}}}}}}},"paths":{"/api/v1/songs":{"get":{"operationId":"listSongs","summary":"List songs and charts","description":"Every song currently in the game in a region, with its charts and their constants for the latest version. The list is large and changes at most a few times a day; cache it.\n\nCosts 10 units of the rate limit.","tags":["Songs"],"parameters":[{"name":"region","in":"query","required":false,"description":"`intl` is the international version, `jp` the Japanese one. `na` is the international data as North American cabinets see it: the same data as `intl`, except that plate difficulty follows North American plate rules.","schema":{"default":"intl","type":"string","enum":["intl","jp","na"]}}],"x-rate-limit-cost":10,"responses":{"200":{"description":"OK","headers":{"X-RateLimit-Limit":{"description":"The budget, in units: the app's, or on /me endpoints the player's.","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Units left after this request.","schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"type":"object","properties":{"region":{"type":"string","enum":["intl","jp","na"],"description":"`intl` is the international version, `jp` the Japanese one. `na` is the international data as North American cabinets see it: the same data as `intl`, except that plate difficulty follows North American plate rules."},"version":{"type":"integer","description":"The version whose constants `internalLevel` reports."},"songs":{"type":"array","items":{"type":"object","properties":{"id":{"type":"integer","description":"Song id, per data region."},"title":{"type":"string"},"artist":{"anyOf":[{"type":"string"},{"type":"null"}]},"genre":{"type":"string","enum":["UNKNOWN","POPS_AND_ANIME","NICONICO_AND_VOCALOID","TOUHOU_PROJECT","GAME_AND_VARIETY","MAIMAI","ONGEKI_AND_CHUNITHM"]},"type":{"type":"string","enum":["STANDARD","DX"],"description":"STANDARD and DX versions of a song are separate songs."},"version":{"type":"integer","description":"The version the song was added in; see /v1/versions."},"jacketUrl":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"The jacket image on SEGA's servers. Link to it as is; don't copy or re-host it."},"addedOn":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"The day the song became available in this region (YYYY-MM-DD, JST)."},"titleTranslations":{"type":"object","properties":{"ko":{"type":"string"},"en":{"type":"string"}},"additionalProperties":false,"description":"Korean and English titles, where known."},"naUnavailable":{"type":"boolean","description":"Not selectable on North American cabinets. Always false for `jp`."},"charts":{"type":"array","items":{"type":"object","properties":{"id":{"type":"integer","description":"Chart id. Ids are per data region: the same chart has different ids in `intl` and `jp`."},"difficulty":{"type":"string","enum":["BASIC","ADVANCED","EXPERT","MASTER","RE_MASTER"]},"level":{"type":"string","enum":["1","2","3","4","5","6","7","8","9","10","11","12","13","14","15","7+","8+","9+","10+","11+","12+","13+","14+","15+"],"description":"The level the game displays, e.g. `13+`.","example":"13+"},"internalLevel":{"type":"integer","description":"Chart constant ×10, e.g. `134` for 13.4.","example":134},"internalLevelSource":{"type":"string","enum":["community","maishift","estimated"],"description":"Where `internalLevel` comes from. `community`: published by the community for this version. `maishift`: set or inferred by maishift. `estimated`: no constant is known for this version yet; the value is an estimate from the displayed level and earlier versions."}},"required":["id","difficulty","level","internalLevel","internalLevelSource"],"additionalProperties":false}}},"required":["id","title","artist","genre","type","version","jacketUrl","addedOn","titleTranslations","naUnavailable","charts"],"additionalProperties":false}}},"required":["region","version","songs"],"additionalProperties":false}}}},"400":{"description":"`bad_request`","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"`missing_api_key`, `invalid_api_key`","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"`app_suspended`","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"`rate_limited`","headers":{"X-RateLimit-Limit":{"description":"The budget, in units: the app's, or on /me endpoints the player's.","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Units left after this request.","schema":{"type":"integer"}},"Retry-After":{"description":"Seconds until the request would fit the budget.","schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"`internal`","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/api/v1/versions":{"get":{"operationId":"listVersions","summary":"List versions","description":"The game versions a region has had, with their release dates. Song and record data refer to versions by `id`.\n\nCosts 1 unit of the rate limit.","tags":["Songs"],"parameters":[{"name":"region","in":"query","required":false,"description":"`intl` is the international version, `jp` the Japanese one. `na` is the international data as North American cabinets see it: the same data as `intl`, except that plate difficulty follows North American plate rules.","schema":{"default":"intl","type":"string","enum":["intl","jp","na"]}}],"x-rate-limit-cost":1,"responses":{"200":{"description":"OK","headers":{"X-RateLimit-Limit":{"description":"The budget, in units: the app's, or on /me endpoints the player's.","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Units left after this request.","schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"type":"object","properties":{"region":{"type":"string","enum":["intl","jp","na"],"description":"`intl` is the international version, `jp` the Japanese one. `na` is the international data as North American cabinets see it: the same data as `intl`, except that plate difficulty follows North American plate rules."},"latestVersion":{"type":"integer"},"versions":{"type":"array","items":{"type":"object","properties":{"id":{"type":"integer"},"name":{"type":"string"},"releasedAt":{"anyOf":[{"type":"string","description":"ISO 8601, UTC."},{"type":"null"}]}},"required":["id","name","releasedAt"],"additionalProperties":false},"description":"Oldest first."}},"required":["region","latestVersion","versions"],"additionalProperties":false}}}},"400":{"description":"`bad_request`","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"`missing_api_key`, `invalid_api_key`","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"`app_suspended`","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"`rate_limited`","headers":{"X-RateLimit-Limit":{"description":"The budget, in units: the app's, or on /me endpoints the player's.","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Units left after this request.","schema":{"type":"integer"}},"Retry-After":{"description":"Seconds until the request would fit the budget.","schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"`internal`","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/api/v1/profiles/{handle}":{"get":{"operationId":"getProfile","summary":"Get a public profile","description":"A player's latest profile in a region. Only players who have made their profile public can be read.\n\nCosts 5 units of the rate limit.","tags":["Profiles"],"parameters":[{"name":"handle","in":"path","required":true,"description":"The player's maishift handle, as in maimai.shiftpsh.com/profile/{handle}.","schema":{"type":"string","minLength":1,"maxLength":32}},{"name":"region","in":"query","required":false,"description":"Defaults to the player's home region. `intl`, `jp` or `na`; see /v1/songs.","schema":{"type":"string","enum":["intl","jp","na"]}}],"x-rate-limit-cost":5,"responses":{"200":{"description":"OK","headers":{"X-RateLimit-Limit":{"description":"The budget, in units: the app's, or on /me endpoints the player's.","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Units left after this request.","schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"type":"object","properties":{"handle":{"type":"string","minLength":1,"maxLength":32,"description":"The player's maishift handle, as in maimai.shiftpsh.com/profile/{handle}."},"region":{"type":"string","enum":["intl","jp","na"],"description":"`intl` is the international version, `jp` the Japanese one. `na` is the international data as North American cabinets see it: the same data as `intl`, except that plate difficulty follows North American plate rules."},"regions":{"type":"array","items":{"type":"string","enum":["intl","jp","na"],"description":"`intl` is the international version, `jp` the Japanese one. `na` is the international data as North American cabinets see it: the same data as `intl`, except that plate difficulty follows North American plate rules."},"description":"Every region the player has records in. `na` appears, beside `intl`, when it's the region in use."},"profile":{"type":"object","properties":{"name":{"type":"string","description":"In-game name."},"rating":{"type":"integer"},"iconUrl":{"type":"string"},"title":{"type":"object","properties":{"text":{"type":"string"},"tier":{"type":"string","enum":["NORMAL","BRONZE","SILVER","GOLD","RAINBOW"],"description":"The title plate's color."}},"required":["text","tier"],"additionalProperties":false},"classRank":{"type":"string","enum":["B5","B4","B3","B2","B1","A5","A4","A3","A2","A1","S5","S4","S3","S2","S1","SS5","SS4","SS3","SS2","SS1","SSS5","SSS4","SSS3","SSS2","SSS1","LEGEND"],"description":"Class (クラス), lowest first: `B5` … `B1`, `A5` … `A1`, `S5` … `S1`, `SS5` … `SS1`, `SSS5` … `SSS1`, `LEGEND`."},"courseRank":{"anyOf":[{"type":"string","enum":["NONE","DAN_1","DAN_2","DAN_3","DAN_4","DAN_5","DAN_6","DAN_7","DAN_8","DAN_9","DAN_10","SHIN_DAN_1","SHIN_DAN_2","SHIN_DAN_3","SHIN_DAN_4","SHIN_DAN_5","SHIN_DAN_6","SHIN_DAN_7","SHIN_DAN_8","SHIN_DAN_9","SHIN_DAN_10","SHIN_KAIDEN","URA_KAIDEN"]},{"type":"null"}],"description":"段位 from the dan courses, lowest first: `NONE` (none yet; 初心者), `DAN_1` … `DAN_10` (初段 … 十段), `SHIN_DAN_1` … `SHIN_DAN_10` (真初段 … 真十段), `SHIN_KAIDEN` (真皆伝), `URA_KAIDEN` (裏皆伝). Null for a rank the game added after this list."},"stars":{"type":"integer"},"playCount":{"anyOf":[{"type":"object","properties":{"total":{"type":"integer"},"current":{"type":"integer"}},"required":["total","current"],"additionalProperties":false},{"type":"null"}],"description":"`current` is plays in the current version."},"friendCode":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Null unless the player has chosen to show their friend code on their profile."},"syncedAt":{"type":"string","description":"ISO 8601, UTC."}},"required":["name","rating","iconUrl","title","classRank","courseRank","stars","playCount","friendCode","syncedAt"],"additionalProperties":false}},"required":["handle","region","regions","profile"],"additionalProperties":false}}}},"400":{"description":"`bad_request`","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"`missing_api_key`, `invalid_api_key`","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"`app_suspended`, `not_public`","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"`not_found`","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"`rate_limited`","headers":{"X-RateLimit-Limit":{"description":"The budget, in units: the app's, or on /me endpoints the player's.","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Units left after this request.","schema":{"type":"integer"}},"Retry-After":{"description":"Seconds until the request would fit the budget.","schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"`internal`","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/api/v1/profiles/{handle}/records":{"get":{"operationId":"getRecords","summary":"Get a player's latest records","description":"Every chart the player has played, from their latest sync in a region, with ratings for the current version. For earlier syncs, see the snapshot endpoints.\n\nCosts 10 units of the rate limit.","tags":["Profiles"],"parameters":[{"name":"handle","in":"path","required":true,"description":"The player's maishift handle, as in maimai.shiftpsh.com/profile/{handle}.","schema":{"type":"string","minLength":1,"maxLength":32}},{"name":"region","in":"query","required":false,"description":"Defaults to the player's home region. `intl`, `jp` or `na`; see /v1/songs.","schema":{"type":"string","enum":["intl","jp","na"]}}],"x-rate-limit-cost":10,"responses":{"200":{"description":"OK","headers":{"X-RateLimit-Limit":{"description":"The budget, in units: the app's, or on /me endpoints the player's.","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Units left after this request.","schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"type":"object","properties":{"handle":{"type":"string","minLength":1,"maxLength":32,"description":"The player's maishift handle, as in maimai.shiftpsh.com/profile/{handle}."},"region":{"type":"string","enum":["intl","jp","na"],"description":"`intl` is the international version, `jp` the Japanese one. `na` is the international data as North American cabinets see it: the same data as `intl`, except that plate difficulty follows North American plate rules."},"version":{"type":"integer","description":"The version ratings are computed for."},"syncedAt":{"type":"string","description":"ISO 8601, UTC."},"records":{"type":"array","items":{"type":"object","properties":{"chartId":{"type":"integer","description":"Chart id. Ids are per data region: the same chart has different ids in `intl` and `jp`."},"title":{"type":"string"},"type":{"type":"string","enum":["STANDARD","DX"]},"difficulty":{"type":"string","enum":["BASIC","ADVANCED","EXPERT","MASTER","RE_MASTER"]},"level":{"type":"string","enum":["1","2","3","4","5","6","7","8","9","10","11","12","13","14","15","7+","8+","9+","10+","11+","12+","13+","14+","15+"],"description":"The level the game displays, e.g. `13+`.","example":"13+"},"internalLevel":{"type":"integer","description":"Chart constant ×10, e.g. `134` for 13.4.","example":134},"achievement":{"type":"integer","description":"Achievement ×10000, e.g. `1005000` for 100.5000%.","example":1005000},"combo":{"type":"string","enum":["PLAYED","FULL_COMBO","FULL_COMBO_PLUS","ALL_PERFECT","ALL_PERFECT_PLUS"]},"sync":{"type":"string","enum":["PLAYED","SYNC_PLAY","FULL_SYNC","FULL_SYNC_PLUS","FULL_SYNC_DX","FULL_SYNC_DX_PLUS"]},"dxScore":{"type":"integer"},"dxScoreMax":{"type":"integer"},"rating":{"type":"integer","description":"The rating this record is worth at `version`."},"ratingAccurate":{"type":"boolean","description":"False when `internalLevel` is estimated."}},"required":["chartId","title","type","difficulty","level","internalLevel","achievement","combo","sync","dxScore","dxScoreMax","rating","ratingAccurate"],"additionalProperties":false},"description":"Played charts only."},"best":{"type":"object","properties":{"new":{"type":"array","items":{"type":"integer","description":"Chart id. Ids are per data region: the same chart has different ids in `intl` and `jp`."}},"old":{"type":"array","items":{"type":"integer","description":"Chart id. Ids are per data region: the same chart has different ids in `intl` and `jp`."}}},"required":["new","old"],"additionalProperties":false,"description":"The charts counted in the rating: the best 15 from new songs and the best 35 from older ones, highest first."}},"required":["handle","region","version","syncedAt","records","best"],"additionalProperties":false}}}},"400":{"description":"`bad_request`","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"`missing_api_key`, `invalid_api_key`","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"`app_suspended`, `not_public`","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"`not_found`","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"`rate_limited`","headers":{"X-RateLimit-Limit":{"description":"The budget, in units: the app's, or on /me endpoints the player's.","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Units left after this request.","schema":{"type":"integer"}},"Retry-After":{"description":"Seconds until the request would fit the budget.","schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"`internal`","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/api/v1/profiles/{handle}/snapshots":{"get":{"operationId":"listSnapshots","summary":"List a player's past syncs","description":"Every time the player synced in a region, newest first. Only for players who have made their past records public.\n\nCosts 2 units of the rate limit.","tags":["Profiles"],"parameters":[{"name":"handle","in":"path","required":true,"description":"The player's maishift handle, as in maimai.shiftpsh.com/profile/{handle}.","schema":{"type":"string","minLength":1,"maxLength":32}},{"name":"region","in":"query","required":false,"description":"Defaults to the player's home region. `intl`, `jp` or `na`; see /v1/songs.","schema":{"type":"string","enum":["intl","jp","na"]}},{"name":"cursor","in":"query","required":false,"description":"`nextCursor` from the previous page.","schema":{"type":"integer","minimum":1,"maximum":2147483647}},{"name":"limit","in":"query","required":false,"schema":{"default":50,"type":"integer","minimum":1,"maximum":200}}],"x-rate-limit-cost":2,"responses":{"200":{"description":"OK","headers":{"X-RateLimit-Limit":{"description":"The budget, in units: the app's, or on /me endpoints the player's.","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Units left after this request.","schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"type":"object","properties":{"handle":{"type":"string","minLength":1,"maxLength":32,"description":"The player's maishift handle, as in maimai.shiftpsh.com/profile/{handle}."},"region":{"type":"string","enum":["intl","jp","na"],"description":"`intl` is the international version, `jp` the Japanese one. `na` is the international data as North American cabinets see it: the same data as `intl`, except that plate difficulty follows North American plate rules."},"snapshots":{"type":"array","items":{"type":"object","properties":{"id":{"type":"integer"},"syncedAt":{"type":"string","description":"ISO 8601, UTC."},"rating":{"type":"integer"},"version":{"anyOf":[{"type":"integer"},{"type":"null"}],"description":"The version the player was on."}},"required":["id","syncedAt","rating","version"],"additionalProperties":false},"description":"Newest first."},"nextCursor":{"anyOf":[{"type":"integer"},{"type":"null"}],"description":"Pass as `cursor` for the next page; null on the last one."}},"required":["handle","region","snapshots","nextCursor"],"additionalProperties":false}}}},"400":{"description":"`bad_request`","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"`missing_api_key`, `invalid_api_key`","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"`app_suspended`, `not_public`","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"`not_found`","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"`rate_limited`","headers":{"X-RateLimit-Limit":{"description":"The budget, in units: the app's, or on /me endpoints the player's.","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Units left after this request.","schema":{"type":"integer"}},"Retry-After":{"description":"Seconds until the request would fit the budget.","schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"`internal`","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/api/v1/profiles/{handle}/snapshots/{snapshotId}":{"get":{"operationId":"getSnapshot","summary":"Get a player's records at a past sync","description":"The records as they were at one past sync, with ratings computed for the version the player was on then.\n\nCosts 10 units of the rate limit.","tags":["Profiles"],"parameters":[{"name":"handle","in":"path","required":true,"description":"The player's maishift handle, as in maimai.shiftpsh.com/profile/{handle}.","schema":{"type":"string","minLength":1,"maxLength":32}},{"name":"snapshotId","in":"path","required":true,"schema":{"type":"integer","minimum":1,"maximum":2147483647}},{"name":"region","in":"query","required":false,"description":"Defaults to the player's home region. `intl`, `jp` or `na`; see /v1/songs.","schema":{"type":"string","enum":["intl","jp","na"]}}],"x-rate-limit-cost":10,"responses":{"200":{"description":"OK","headers":{"X-RateLimit-Limit":{"description":"The budget, in units: the app's, or on /me endpoints the player's.","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Units left after this request.","schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"type":"object","properties":{"handle":{"type":"string","minLength":1,"maxLength":32,"description":"The player's maishift handle, as in maimai.shiftpsh.com/profile/{handle}."},"region":{"type":"string","enum":["intl","jp","na"],"description":"`intl` is the international version, `jp` the Japanese one. `na` is the international data as North American cabinets see it: the same data as `intl`, except that plate difficulty follows North American plate rules."},"version":{"type":"integer","description":"The version ratings are computed for."},"syncedAt":{"type":"string","description":"ISO 8601, UTC."},"records":{"type":"array","items":{"type":"object","properties":{"chartId":{"type":"integer","description":"Chart id. Ids are per data region: the same chart has different ids in `intl` and `jp`."},"title":{"type":"string"},"type":{"type":"string","enum":["STANDARD","DX"]},"difficulty":{"type":"string","enum":["BASIC","ADVANCED","EXPERT","MASTER","RE_MASTER"]},"level":{"type":"string","enum":["1","2","3","4","5","6","7","8","9","10","11","12","13","14","15","7+","8+","9+","10+","11+","12+","13+","14+","15+"],"description":"The level the game displays, e.g. `13+`.","example":"13+"},"internalLevel":{"type":"integer","description":"Chart constant ×10, e.g. `134` for 13.4.","example":134},"achievement":{"type":"integer","description":"Achievement ×10000, e.g. `1005000` for 100.5000%.","example":1005000},"combo":{"type":"string","enum":["PLAYED","FULL_COMBO","FULL_COMBO_PLUS","ALL_PERFECT","ALL_PERFECT_PLUS"]},"sync":{"type":"string","enum":["PLAYED","SYNC_PLAY","FULL_SYNC","FULL_SYNC_PLUS","FULL_SYNC_DX","FULL_SYNC_DX_PLUS"]},"dxScore":{"type":"integer"},"dxScoreMax":{"type":"integer"},"rating":{"type":"integer","description":"The rating this record is worth at `version`."},"ratingAccurate":{"type":"boolean","description":"False when `internalLevel` is estimated."}},"required":["chartId","title","type","difficulty","level","internalLevel","achievement","combo","sync","dxScore","dxScoreMax","rating","ratingAccurate"],"additionalProperties":false},"description":"Played charts only."},"best":{"type":"object","properties":{"new":{"type":"array","items":{"type":"integer","description":"Chart id. Ids are per data region: the same chart has different ids in `intl` and `jp`."}},"old":{"type":"array","items":{"type":"integer","description":"Chart id. Ids are per data region: the same chart has different ids in `intl` and `jp`."}}},"required":["new","old"],"additionalProperties":false,"description":"The charts counted in the rating: the best 15 from new songs and the best 35 from older ones, highest first."},"snapshotId":{"type":"integer"}},"required":["handle","region","version","syncedAt","records","best","snapshotId"],"additionalProperties":false}}}},"400":{"description":"`bad_request`","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"`missing_api_key`, `invalid_api_key`","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"`app_suspended`, `not_public`","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"`not_found`","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"`rate_limited`","headers":{"X-RateLimit-Limit":{"description":"The budget, in units: the app's, or on /me endpoints the player's.","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Units left after this request.","schema":{"type":"integer"}},"Retry-After":{"description":"Seconds until the request would fit the budget.","schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"`internal`","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/api/v1/playlists/{playlistId}":{"get":{"operationId":"getPlaylist","summary":"Get a public playlist","description":"A playlist its owner has made public, with each chart's level for the current version.\n\nCosts 5 units of the rate limit.","tags":["Playlists"],"parameters":[{"name":"playlistId","in":"path","required":true,"schema":{"type":"integer","minimum":1,"maximum":2147483647}}],"x-rate-limit-cost":5,"responses":{"200":{"description":"OK","headers":{"X-RateLimit-Limit":{"description":"The budget, in units: the app's, or on /me endpoints the player's.","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Units left after this request.","schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"type":"object","properties":{"id":{"type":"integer"},"title":{"type":"string"},"owner":{"type":"object","properties":{"handle":{"type":"string","minLength":1,"maxLength":32,"description":"The player's maishift handle, as in maimai.shiftpsh.com/profile/{handle}."}},"required":["handle"],"additionalProperties":false},"region":{"type":"string","enum":["intl","jp","na"],"description":"`intl` is the international version, `jp` the Japanese one. `na` is the international data as North American cabinets see it: the same data as `intl`, except that plate difficulty follows North American plate rules."},"createdAt":{"type":"string","description":"ISO 8601, UTC."},"updatedAt":{"type":"string","description":"ISO 8601, UTC."},"items":{"type":"array","items":{"type":"object","properties":{"chartId":{"type":"integer","description":"Chart id. Ids are per data region: the same chart has different ids in `intl` and `jp`."},"title":{"type":"string"},"type":{"type":"string","enum":["STANDARD","DX"]},"difficulty":{"type":"string","enum":["BASIC","ADVANCED","EXPERT","MASTER","RE_MASTER"]},"level":{"type":"string","enum":["1","2","3","4","5","6","7","8","9","10","11","12","13","14","15","7+","8+","9+","10+","11+","12+","13+","14+","15+"],"description":"The level the game displays, e.g. `13+`.","example":"13+"},"internalLevel":{"type":"integer","description":"Chart constant ×10, e.g. `134` for 13.4.","example":134},"comment":{"anyOf":[{"type":"string"},{"type":"null"}]}},"required":["chartId","title","type","difficulty","level","internalLevel","comment"],"additionalProperties":false},"description":"In playlist order. Charts since removed from the game are left out."}},"required":["id","title","owner","region","createdAt","updatedAt","items"],"additionalProperties":false}}}},"400":{"description":"`bad_request`","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"`missing_api_key`, `invalid_api_key`","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"`app_suspended`","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"`not_found`","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"`rate_limited`","headers":{"X-RateLimit-Limit":{"description":"The budget, in units: the app's, or on /me endpoints the player's.","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Units left after this request.","schema":{"type":"integer"}},"Retry-After":{"description":"Seconds until the request would fit the budget.","schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"`internal`","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/api/v1/me":{"get":{"operationId":"getMe","summary":"Who authorized your app","description":"The player's id for your app, their handle, and their latest profile in a region. Works before the player has synced anything, as long as no `region` is asked for: with one, a player without records there is a 404.\n\nCosts 5 units of the rate limit.","tags":["Me"],"parameters":[{"name":"region","in":"query","required":false,"description":"Defaults to the player's home region. `intl`, `jp` or `na`; see /v1/songs.","schema":{"type":"string","enum":["intl","jp","na"]}}],"security":[{"apiKey":[],"oauth2":["profile"]}],"x-rate-limit-cost":5,"responses":{"200":{"description":"OK","headers":{"X-RateLimit-Limit":{"description":"The budget, in units: the app's, or on /me endpoints the player's.","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Units left after this request.","schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"type":"object","properties":{"playerId":{"type":"string","description":"How your app knows this player: stable for your app, different in every other app. Store this, not the handle, which the player can change."},"handle":{"anyOf":[{"type":"string","minLength":1,"maxLength":32,"description":"The player's maishift handle, as in maimai.shiftpsh.com/profile/{handle}."},{"type":"null"}],"description":"Null until the player has picked a maishift handle."},"region":{"anyOf":[{"type":"string","enum":["intl","jp","na"],"description":"`intl` is the international version, `jp` the Japanese one. `na` is the international data as North American cabinets see it: the same data as `intl`, except that plate difficulty follows North American plate rules."},{"type":"null"}],"description":"The region `profile` is from; null with no records yet."},"regions":{"type":"array","items":{"type":"string","enum":["intl","jp","na"],"description":"`intl` is the international version, `jp` the Japanese one. `na` is the international data as North American cabinets see it: the same data as `intl`, except that plate difficulty follows North American plate rules."},"description":"Every region the player has records in. `na` appears, beside `intl`, when it's the region in use."},"profile":{"anyOf":[{"type":"object","properties":{"name":{"type":"string","description":"In-game name."},"rating":{"type":"integer"},"iconUrl":{"type":"string"},"title":{"type":"object","properties":{"text":{"type":"string"},"tier":{"type":"string","enum":["NORMAL","BRONZE","SILVER","GOLD","RAINBOW"],"description":"The title plate's color."}},"required":["text","tier"],"additionalProperties":false},"classRank":{"type":"string","enum":["B5","B4","B3","B2","B1","A5","A4","A3","A2","A1","S5","S4","S3","S2","S1","SS5","SS4","SS3","SS2","SS1","SSS5","SSS4","SSS3","SSS2","SSS1","LEGEND"],"description":"Class (クラス), lowest first: `B5` … `B1`, `A5` … `A1`, `S5` … `S1`, `SS5` … `SS1`, `SSS5` … `SSS1`, `LEGEND`."},"courseRank":{"anyOf":[{"type":"string","enum":["NONE","DAN_1","DAN_2","DAN_3","DAN_4","DAN_5","DAN_6","DAN_7","DAN_8","DAN_9","DAN_10","SHIN_DAN_1","SHIN_DAN_2","SHIN_DAN_3","SHIN_DAN_4","SHIN_DAN_5","SHIN_DAN_6","SHIN_DAN_7","SHIN_DAN_8","SHIN_DAN_9","SHIN_DAN_10","SHIN_KAIDEN","URA_KAIDEN"]},{"type":"null"}],"description":"段位 from the dan courses, lowest first: `NONE` (none yet; 初心者), `DAN_1` … `DAN_10` (初段 … 十段), `SHIN_DAN_1` … `SHIN_DAN_10` (真初段 … 真十段), `SHIN_KAIDEN` (真皆伝), `URA_KAIDEN` (裏皆伝). Null for a rank the game added after this list."},"stars":{"type":"integer"},"playCount":{"anyOf":[{"type":"object","properties":{"total":{"type":"integer"},"current":{"type":"integer"}},"required":["total","current"],"additionalProperties":false},{"type":"null"}],"description":"`current` is plays in the current version."},"friendCode":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Null unless the player has chosen to show their friend code on their profile."},"syncedAt":{"type":"string","description":"ISO 8601, UTC."}},"required":["name","rating","iconUrl","title","classRank","courseRank","stars","playCount","friendCode","syncedAt"],"additionalProperties":false},{"type":"null"}]}},"required":["playerId","handle","region","regions","profile"],"additionalProperties":false}}}},"400":{"description":"`bad_request`","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"`missing_api_key`, `invalid_api_key`, `invalid_token`","headers":{"WWW-Authenticate":{"description":"RFC 6750: `Bearer scope=\"…\"` when no token was sent, `Bearer error=\"invalid_token\"` for a bad one, or `Bearer error=\"insufficient_scope\", scope=\"…\"` naming the scope needed.","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"`app_suspended`, `insufficient_scope`","headers":{"WWW-Authenticate":{"description":"RFC 6750: `Bearer scope=\"…\"` when no token was sent, `Bearer error=\"invalid_token\"` for a bad one, or `Bearer error=\"insufficient_scope\", scope=\"…\"` naming the scope needed.","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"`not_found`","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"`rate_limited`","headers":{"X-RateLimit-Limit":{"description":"The budget, in units: the app's, or on /me endpoints the player's.","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Units left after this request.","schema":{"type":"integer"}},"Retry-After":{"description":"Seconds until the request would fit the budget.","schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"`internal`","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/api/v1/me/records":{"get":{"operationId":"getMyRecords","summary":"The player's latest records","description":"As /v1/profiles/{handle}/records, whether or not the profile is public.\n\nCosts 10 units of the rate limit.","tags":["Me"],"parameters":[{"name":"region","in":"query","required":false,"description":"Defaults to the player's home region. `intl`, `jp` or `na`; see /v1/songs.","schema":{"type":"string","enum":["intl","jp","na"]}}],"security":[{"apiKey":[],"oauth2":["records"]}],"x-rate-limit-cost":10,"responses":{"200":{"description":"OK","headers":{"X-RateLimit-Limit":{"description":"The budget, in units: the app's, or on /me endpoints the player's.","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Units left after this request.","schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"type":"object","properties":{"handle":{"anyOf":[{"type":"string","minLength":1,"maxLength":32,"description":"The player's maishift handle, as in maimai.shiftpsh.com/profile/{handle}."},{"type":"null"}],"description":"Null until the player has picked a maishift handle."},"region":{"type":"string","enum":["intl","jp","na"],"description":"`intl` is the international version, `jp` the Japanese one. `na` is the international data as North American cabinets see it: the same data as `intl`, except that plate difficulty follows North American plate rules."},"version":{"type":"integer","description":"The version ratings are computed for."},"syncedAt":{"type":"string","description":"ISO 8601, UTC."},"records":{"type":"array","items":{"type":"object","properties":{"chartId":{"type":"integer","description":"Chart id. Ids are per data region: the same chart has different ids in `intl` and `jp`."},"title":{"type":"string"},"type":{"type":"string","enum":["STANDARD","DX"]},"difficulty":{"type":"string","enum":["BASIC","ADVANCED","EXPERT","MASTER","RE_MASTER"]},"level":{"type":"string","enum":["1","2","3","4","5","6","7","8","9","10","11","12","13","14","15","7+","8+","9+","10+","11+","12+","13+","14+","15+"],"description":"The level the game displays, e.g. `13+`.","example":"13+"},"internalLevel":{"type":"integer","description":"Chart constant ×10, e.g. `134` for 13.4.","example":134},"achievement":{"type":"integer","description":"Achievement ×10000, e.g. `1005000` for 100.5000%.","example":1005000},"combo":{"type":"string","enum":["PLAYED","FULL_COMBO","FULL_COMBO_PLUS","ALL_PERFECT","ALL_PERFECT_PLUS"]},"sync":{"type":"string","enum":["PLAYED","SYNC_PLAY","FULL_SYNC","FULL_SYNC_PLUS","FULL_SYNC_DX","FULL_SYNC_DX_PLUS"]},"dxScore":{"type":"integer"},"dxScoreMax":{"type":"integer"},"rating":{"type":"integer","description":"The rating this record is worth at `version`."},"ratingAccurate":{"type":"boolean","description":"False when `internalLevel` is estimated."}},"required":["chartId","title","type","difficulty","level","internalLevel","achievement","combo","sync","dxScore","dxScoreMax","rating","ratingAccurate"],"additionalProperties":false},"description":"Played charts only."},"best":{"type":"object","properties":{"new":{"type":"array","items":{"type":"integer","description":"Chart id. Ids are per data region: the same chart has different ids in `intl` and `jp`."}},"old":{"type":"array","items":{"type":"integer","description":"Chart id. Ids are per data region: the same chart has different ids in `intl` and `jp`."}}},"required":["new","old"],"additionalProperties":false,"description":"The charts counted in the rating: the best 15 from new songs and the best 35 from older ones, highest first."}},"required":["handle","region","version","syncedAt","records","best"],"additionalProperties":false}}}},"400":{"description":"`bad_request`","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"`missing_api_key`, `invalid_api_key`, `invalid_token`","headers":{"WWW-Authenticate":{"description":"RFC 6750: `Bearer scope=\"…\"` when no token was sent, `Bearer error=\"invalid_token\"` for a bad one, or `Bearer error=\"insufficient_scope\", scope=\"…\"` naming the scope needed.","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"`app_suspended`, `insufficient_scope`","headers":{"WWW-Authenticate":{"description":"RFC 6750: `Bearer scope=\"…\"` when no token was sent, `Bearer error=\"invalid_token\"` for a bad one, or `Bearer error=\"insufficient_scope\", scope=\"…\"` naming the scope needed.","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"`not_found`","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"`rate_limited`","headers":{"X-RateLimit-Limit":{"description":"The budget, in units: the app's, or on /me endpoints the player's.","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Units left after this request.","schema":{"type":"integer"}},"Retry-After":{"description":"Seconds until the request would fit the budget.","schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"`internal`","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/api/v1/me/snapshots":{"get":{"operationId":"listMySnapshots","summary":"The player's past syncs","description":"As /v1/profiles/{handle}/snapshots, whether or not past records are public.\n\nCosts 2 units of the rate limit.","tags":["Me"],"parameters":[{"name":"region","in":"query","required":false,"description":"Defaults to the player's home region. `intl`, `jp` or `na`; see /v1/songs.","schema":{"type":"string","enum":["intl","jp","na"]}},{"name":"cursor","in":"query","required":false,"description":"`nextCursor` from the previous page.","schema":{"type":"integer","minimum":1,"maximum":2147483647}},{"name":"limit","in":"query","required":false,"schema":{"default":50,"type":"integer","minimum":1,"maximum":200}}],"security":[{"apiKey":[],"oauth2":["history"]}],"x-rate-limit-cost":2,"responses":{"200":{"description":"OK","headers":{"X-RateLimit-Limit":{"description":"The budget, in units: the app's, or on /me endpoints the player's.","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Units left after this request.","schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"type":"object","properties":{"handle":{"anyOf":[{"type":"string","minLength":1,"maxLength":32,"description":"The player's maishift handle, as in maimai.shiftpsh.com/profile/{handle}."},{"type":"null"}],"description":"Null until the player has picked a maishift handle."},"region":{"type":"string","enum":["intl","jp","na"],"description":"`intl` is the international version, `jp` the Japanese one. `na` is the international data as North American cabinets see it: the same data as `intl`, except that plate difficulty follows North American plate rules."},"snapshots":{"type":"array","items":{"type":"object","properties":{"id":{"type":"integer"},"syncedAt":{"type":"string","description":"ISO 8601, UTC."},"rating":{"type":"integer"},"version":{"anyOf":[{"type":"integer"},{"type":"null"}],"description":"The version the player was on."}},"required":["id","syncedAt","rating","version"],"additionalProperties":false},"description":"Newest first."},"nextCursor":{"anyOf":[{"type":"integer"},{"type":"null"}],"description":"Pass as `cursor` for the next page; null on the last one."}},"required":["handle","region","snapshots","nextCursor"],"additionalProperties":false}}}},"400":{"description":"`bad_request`","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"`missing_api_key`, `invalid_api_key`, `invalid_token`","headers":{"WWW-Authenticate":{"description":"RFC 6750: `Bearer scope=\"…\"` when no token was sent, `Bearer error=\"invalid_token\"` for a bad one, or `Bearer error=\"insufficient_scope\", scope=\"…\"` naming the scope needed.","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"`app_suspended`, `insufficient_scope`","headers":{"WWW-Authenticate":{"description":"RFC 6750: `Bearer scope=\"…\"` when no token was sent, `Bearer error=\"invalid_token\"` for a bad one, or `Bearer error=\"insufficient_scope\", scope=\"…\"` naming the scope needed.","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"`not_found`","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"`rate_limited`","headers":{"X-RateLimit-Limit":{"description":"The budget, in units: the app's, or on /me endpoints the player's.","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Units left after this request.","schema":{"type":"integer"}},"Retry-After":{"description":"Seconds until the request would fit the budget.","schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"`internal`","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/api/v1/me/snapshots/{snapshotId}":{"get":{"operationId":"getMySnapshot","summary":"The player's records at a past sync","description":"As /v1/profiles/{handle}/snapshots/{snapshotId}.\n\nCosts 10 units of the rate limit.","tags":["Me"],"parameters":[{"name":"snapshotId","in":"path","required":true,"schema":{"type":"integer","minimum":1,"maximum":2147483647}},{"name":"region","in":"query","required":false,"description":"Defaults to the player's home region. `intl`, `jp` or `na`; see /v1/songs.","schema":{"type":"string","enum":["intl","jp","na"]}}],"security":[{"apiKey":[],"oauth2":["history"]}],"x-rate-limit-cost":10,"responses":{"200":{"description":"OK","headers":{"X-RateLimit-Limit":{"description":"The budget, in units: the app's, or on /me endpoints the player's.","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Units left after this request.","schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"type":"object","properties":{"handle":{"anyOf":[{"type":"string","minLength":1,"maxLength":32,"description":"The player's maishift handle, as in maimai.shiftpsh.com/profile/{handle}."},{"type":"null"}],"description":"Null until the player has picked a maishift handle."},"region":{"type":"string","enum":["intl","jp","na"],"description":"`intl` is the international version, `jp` the Japanese one. `na` is the international data as North American cabinets see it: the same data as `intl`, except that plate difficulty follows North American plate rules."},"version":{"type":"integer","description":"The version ratings are computed for."},"syncedAt":{"type":"string","description":"ISO 8601, UTC."},"records":{"type":"array","items":{"type":"object","properties":{"chartId":{"type":"integer","description":"Chart id. Ids are per data region: the same chart has different ids in `intl` and `jp`."},"title":{"type":"string"},"type":{"type":"string","enum":["STANDARD","DX"]},"difficulty":{"type":"string","enum":["BASIC","ADVANCED","EXPERT","MASTER","RE_MASTER"]},"level":{"type":"string","enum":["1","2","3","4","5","6","7","8","9","10","11","12","13","14","15","7+","8+","9+","10+","11+","12+","13+","14+","15+"],"description":"The level the game displays, e.g. `13+`.","example":"13+"},"internalLevel":{"type":"integer","description":"Chart constant ×10, e.g. `134` for 13.4.","example":134},"achievement":{"type":"integer","description":"Achievement ×10000, e.g. `1005000` for 100.5000%.","example":1005000},"combo":{"type":"string","enum":["PLAYED","FULL_COMBO","FULL_COMBO_PLUS","ALL_PERFECT","ALL_PERFECT_PLUS"]},"sync":{"type":"string","enum":["PLAYED","SYNC_PLAY","FULL_SYNC","FULL_SYNC_PLUS","FULL_SYNC_DX","FULL_SYNC_DX_PLUS"]},"dxScore":{"type":"integer"},"dxScoreMax":{"type":"integer"},"rating":{"type":"integer","description":"The rating this record is worth at `version`."},"ratingAccurate":{"type":"boolean","description":"False when `internalLevel` is estimated."}},"required":["chartId","title","type","difficulty","level","internalLevel","achievement","combo","sync","dxScore","dxScoreMax","rating","ratingAccurate"],"additionalProperties":false},"description":"Played charts only."},"best":{"type":"object","properties":{"new":{"type":"array","items":{"type":"integer","description":"Chart id. Ids are per data region: the same chart has different ids in `intl` and `jp`."}},"old":{"type":"array","items":{"type":"integer","description":"Chart id. Ids are per data region: the same chart has different ids in `intl` and `jp`."}}},"required":["new","old"],"additionalProperties":false,"description":"The charts counted in the rating: the best 15 from new songs and the best 35 from older ones, highest first."},"snapshotId":{"type":"integer"}},"required":["handle","region","version","syncedAt","records","best","snapshotId"],"additionalProperties":false}}}},"400":{"description":"`bad_request`","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"`missing_api_key`, `invalid_api_key`, `invalid_token`","headers":{"WWW-Authenticate":{"description":"RFC 6750: `Bearer scope=\"…\"` when no token was sent, `Bearer error=\"invalid_token\"` for a bad one, or `Bearer error=\"insufficient_scope\", scope=\"…\"` naming the scope needed.","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"`app_suspended`, `insufficient_scope`","headers":{"WWW-Authenticate":{"description":"RFC 6750: `Bearer scope=\"…\"` when no token was sent, `Bearer error=\"invalid_token\"` for a bad one, or `Bearer error=\"insufficient_scope\", scope=\"…\"` naming the scope needed.","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"`not_found`","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"`rate_limited`","headers":{"X-RateLimit-Limit":{"description":"The budget, in units: the app's, or on /me endpoints the player's.","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Units left after this request.","schema":{"type":"integer"}},"Retry-After":{"description":"Seconds until the request would fit the budget.","schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"`internal`","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/api/v1/me/playlists":{"get":{"operationId":"listMyPlaylists","summary":"The player's playlists","description":"Every playlist the player has made, private ones included.\n\nCosts 2 units of the rate limit.","tags":["Me"],"parameters":[],"security":[{"apiKey":[],"oauth2":["playlists"]}],"x-rate-limit-cost":2,"responses":{"200":{"description":"OK","headers":{"X-RateLimit-Limit":{"description":"The budget, in units: the app's, or on /me endpoints the player's.","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Units left after this request.","schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"type":"object","properties":{"playlists":{"type":"array","items":{"type":"object","properties":{"id":{"type":"integer"},"title":{"type":"string"},"visibility":{"type":"string","enum":["PUBLIC","PRIVATE"]},"itemCount":{"type":"integer"},"createdAt":{"type":"string","description":"ISO 8601, UTC."},"updatedAt":{"type":"string","description":"ISO 8601, UTC."}},"required":["id","title","visibility","itemCount","createdAt","updatedAt"],"additionalProperties":false},"description":"Most recently updated first."}},"required":["playlists"],"additionalProperties":false}}}},"400":{"description":"`bad_request`","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"`missing_api_key`, `invalid_api_key`, `invalid_token`","headers":{"WWW-Authenticate":{"description":"RFC 6750: `Bearer scope=\"…\"` when no token was sent, `Bearer error=\"invalid_token\"` for a bad one, or `Bearer error=\"insufficient_scope\", scope=\"…\"` naming the scope needed.","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"`app_suspended`, `insufficient_scope`","headers":{"WWW-Authenticate":{"description":"RFC 6750: `Bearer scope=\"…\"` when no token was sent, `Bearer error=\"invalid_token\"` for a bad one, or `Bearer error=\"insufficient_scope\", scope=\"…\"` naming the scope needed.","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"`rate_limited`","headers":{"X-RateLimit-Limit":{"description":"The budget, in units: the app's, or on /me endpoints the player's.","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Units left after this request.","schema":{"type":"integer"}},"Retry-After":{"description":"Seconds until the request would fit the budget.","schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"`internal`","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/api/v1/me/playlists/{playlistId}":{"get":{"operationId":"getMyPlaylist","summary":"One of the player's playlists","description":"As /v1/playlists/{playlistId}, private ones included.\n\nCosts 5 units of the rate limit.","tags":["Me"],"parameters":[{"name":"playlistId","in":"path","required":true,"schema":{"type":"integer","minimum":1,"maximum":2147483647}}],"security":[{"apiKey":[],"oauth2":["playlists"]}],"x-rate-limit-cost":5,"responses":{"200":{"description":"OK","headers":{"X-RateLimit-Limit":{"description":"The budget, in units: the app's, or on /me endpoints the player's.","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Units left after this request.","schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"type":"object","properties":{"id":{"type":"integer"},"title":{"type":"string"},"owner":{"type":"object","properties":{"handle":{"anyOf":[{"type":"string","minLength":1,"maxLength":32,"description":"The player's maishift handle, as in maimai.shiftpsh.com/profile/{handle}."},{"type":"null"}],"description":"Null until the player has picked a maishift handle."}},"required":["handle"],"additionalProperties":false},"region":{"type":"string","enum":["intl","jp","na"],"description":"`intl` is the international version, `jp` the Japanese one. `na` is the international data as North American cabinets see it: the same data as `intl`, except that plate difficulty follows North American plate rules."},"createdAt":{"type":"string","description":"ISO 8601, UTC."},"updatedAt":{"type":"string","description":"ISO 8601, UTC."},"items":{"type":"array","items":{"type":"object","properties":{"chartId":{"type":"integer","description":"Chart id. Ids are per data region: the same chart has different ids in `intl` and `jp`."},"title":{"type":"string"},"type":{"type":"string","enum":["STANDARD","DX"]},"difficulty":{"type":"string","enum":["BASIC","ADVANCED","EXPERT","MASTER","RE_MASTER"]},"level":{"type":"string","enum":["1","2","3","4","5","6","7","8","9","10","11","12","13","14","15","7+","8+","9+","10+","11+","12+","13+","14+","15+"],"description":"The level the game displays, e.g. `13+`.","example":"13+"},"internalLevel":{"type":"integer","description":"Chart constant ×10, e.g. `134` for 13.4.","example":134},"comment":{"anyOf":[{"type":"string"},{"type":"null"}]}},"required":["chartId","title","type","difficulty","level","internalLevel","comment"],"additionalProperties":false},"description":"In playlist order. Charts since removed from the game are left out."},"visibility":{"type":"string","enum":["PUBLIC","PRIVATE"]}},"required":["id","title","owner","region","createdAt","updatedAt","items","visibility"],"additionalProperties":false}}}},"400":{"description":"`bad_request`","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"`missing_api_key`, `invalid_api_key`, `invalid_token`","headers":{"WWW-Authenticate":{"description":"RFC 6750: `Bearer scope=\"…\"` when no token was sent, `Bearer error=\"invalid_token\"` for a bad one, or `Bearer error=\"insufficient_scope\", scope=\"…\"` naming the scope needed.","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"`app_suspended`, `insufficient_scope`","headers":{"WWW-Authenticate":{"description":"RFC 6750: `Bearer scope=\"…\"` when no token was sent, `Bearer error=\"invalid_token\"` for a bad one, or `Bearer error=\"insufficient_scope\", scope=\"…\"` naming the scope needed.","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"`not_found`","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"`rate_limited`","headers":{"X-RateLimit-Limit":{"description":"The budget, in units: the app's, or on /me endpoints the player's.","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Units left after this request.","schema":{"type":"integer"}},"Retry-After":{"description":"Seconds until the request would fit the budget.","schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"`internal`","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/api/v1/stats/ratings":{"get":{"operationId":"getRatingStats","summary":"Rating distribution","description":"How ratings are spread among active players: median, top-percentile thresholds, a histogram, and how rating splits between new and old songs.\n\nCosts 6 units of the rate limit.","tags":["Statistics"],"parameters":[{"name":"region","in":"query","required":false,"description":"`intl` is the international version, `jp` the Japanese one. `na` is the international data as North American cabinets see it: the same data as `intl`, except that plate difficulty follows North American plate rules.","schema":{"default":"intl","type":"string","enum":["intl","jp","na"]}}],"x-rate-limit-cost":6,"responses":{"200":{"description":"OK","headers":{"X-RateLimit-Limit":{"description":"The budget, in units: the app's, or on /me endpoints the player's.","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Units left after this request.","schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"type":"object","properties":{"region":{"type":"string","enum":["intl","jp","na"],"description":"`intl` is the international version, `jp` the Japanese one. `na` is the international data as North American cabinets see it: the same data as `intl`, except that plate difficulty follows North American plate rules."},"computedAt":{"type":"string","description":"When the figures were computed. Statistics are recomputed on a schedule, not per request."},"version":{"type":"integer"},"activeDays":{"type":"integer","description":"Players count as active if they synced within this many days."},"activePlayers":{"type":"integer"},"syncsLast7Days":{"type":"integer"},"maxPossibleRating":{"type":"integer","description":"The highest rating reachable in the current version."},"median":{"anyOf":[{"type":"integer"},{"type":"null"}]},"topPercentiles":{"type":"array","items":{"type":"object","properties":{"percent":{"type":"number"},"players":{"type":"integer"},"rating":{"anyOf":[{"type":"integer"},{"type":"null"}],"description":"The lowest rating within the top `percent`. Null when that's fewer than 5 players."}},"required":["percent","players","rating"],"additionalProperties":false},"description":"Rating thresholds for the top 75%, 50%, … 1%."},"histogram":{"type":"object","properties":{"width":{"type":"integer"},"bands":{"type":"array","items":{"type":"object","properties":{"from":{"type":"integer"},"to":{"type":"integer"},"players":{"anyOf":[{"type":"integer"},{"type":"null"}]},"suppressed":{"type":"boolean","description":"True when the group has fewer than 5 players. Its figures are then null: at that size they would describe particular players. A safeguard on each figure, not a guarantee across them; see the guide."}},"required":["from","to","players","suppressed"],"additionalProperties":false}}},"required":["width","bands"],"additionalProperties":false},"poolSplit":{"type":"array","items":{"type":"object","properties":{"from":{"type":"integer"},"to":{"type":"integer"},"players":{"type":"integer"},"suppressed":{"type":"boolean","description":"True when the group has fewer than 5 players. Its figures are then null: at that size they would describe particular players. A safeguard on each figure, not a guarantee across them; see the guide."},"newMedian":{"anyOf":[{"type":"number"},{"type":"null"}]},"oldMedian":{"anyOf":[{"type":"number"},{"type":"null"}]},"newLevel":{"anyOf":[{"type":"number"},{"type":"null"}]},"oldLevel":{"anyOf":[{"type":"number"},{"type":"null"}]}},"required":["from","to","players","suppressed","newMedian","oldMedian","newLevel","oldLevel"],"additionalProperties":false},"description":"How rating splits between the best 15 new-song charts and the best 35 older ones, by rating band, over players synced in the last 14 days. `newLevel`/`oldLevel`: the chart constant whose SSS+ is worth each pool's per-chart average, e.g. `13.81`. Unlike `internalLevel` elsewhere, not ×10: it is an average, not a chart's constant."}},"required":["region","computedAt","version","activeDays","activePlayers","syncsLast7Days","maxPossibleRating","median","topPercentiles","histogram","poolSplit"],"additionalProperties":false}}}},"400":{"description":"`bad_request`","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"`missing_api_key`, `invalid_api_key`","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"`app_suspended`","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"`not_found`","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"`rate_limited`","headers":{"X-RateLimit-Limit":{"description":"The budget, in units: the app's, or on /me endpoints the player's.","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Units left after this request.","schema":{"type":"integer"}},"Retry-After":{"description":"Seconds until the request would fit the budget.","schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"`internal`","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/api/v1/stats/options":{"get":{"operationId":"getOptionStats","summary":"Game option usage","description":"Which in-game options players use (note speed, judgement display, sounds, …), overall and by rating group.\n\nCosts 6 units of the rate limit.","tags":["Statistics"],"parameters":[{"name":"region","in":"query","required":false,"description":"`intl` is the international version, `jp` the Japanese one. `na` is the international data as North American cabinets see it: the same data as `intl`, except that plate difficulty follows North American plate rules.","schema":{"default":"intl","type":"string","enum":["intl","jp","na"]}}],"x-rate-limit-cost":6,"responses":{"200":{"description":"OK","headers":{"X-RateLimit-Limit":{"description":"The budget, in units: the app's, or on /me endpoints the player's.","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Units left after this request.","schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"type":"object","properties":{"region":{"type":"string","enum":["intl","jp","na"],"description":"`intl` is the international version, `jp` the Japanese one. `na` is the international data as North American cabinets see it: the same data as `intl`, except that plate difficulty follows North American plate rules."},"computedAt":{"type":"string","description":"When the figures were computed. Statistics are recomputed on a schedule, not per request."},"groups":{"type":"array","items":{"type":"object","properties":{"group":{"type":"string","enum":["13","14","15","16","all","lt13"],"description":"Rating group: `all`, below 13000 (`lt13`), or the thousand it starts at (`13` = 13000–13999, …)."},"players":{"type":"integer"},"suppressed":{"type":"boolean","description":"True when the group has fewer than 5 players. Its figures are then null: at that size they would describe particular players. A safeguard on each figure, not a guarantee across them; see the guide."},"options":{"anyOf":[{"type":"object","propertyNames":{"type":"string","enum":["noteSpeed","dispJudge","tapDesign","outlineDesign","starType","tapSe","breakSe","slideSe","exSe"]},"additionalProperties":{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{"type":"integer"}}},{"type":"null"}],"description":"Players per setting, by option (`noteSpeed`, `dispJudge`, …), each player's latest options within 90 days."},"pairs":{"anyOf":[{"type":"object","propertyNames":{"type":"string","enum":["speed","timing"]},"additionalProperties":{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{"type":"integer"}},"required":["speed","timing"]},{"type":"null"}],"description":"Options counted together: `speed` (note|touch speed) and `timing` (adjust|judge timing), keyed `x|y`."}},"required":["group","players","suppressed","options","pairs"],"additionalProperties":false}}},"required":["region","computedAt","groups"],"additionalProperties":false}}}},"400":{"description":"`bad_request`","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"`missing_api_key`, `invalid_api_key`","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"`app_suspended`","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"`not_found`","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"`rate_limited`","headers":{"X-RateLimit-Limit":{"description":"The budget, in units: the app's, or on /me endpoints the player's.","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Units left after this request.","schema":{"type":"integer"}},"Retry-After":{"description":"Seconds until the request would fit the budget.","schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"`internal`","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/api/v1/stats/plates":{"get":{"operationId":"getPlateStats","summary":"Plate statistics","description":"How many players hold each type of version plate by rating band, and how close to the maximum rating players were when they first got each plate.\n\nCosts 6 units of the rate limit.","tags":["Statistics"],"parameters":[{"name":"region","in":"query","required":false,"description":"`intl` is the international version, `jp` the Japanese one. `na` is the international data as North American cabinets see it: the same data as `intl`, except that plate difficulty follows North American plate rules.","schema":{"default":"intl","type":"string","enum":["intl","jp","na"]}}],"x-rate-limit-cost":6,"responses":{"200":{"description":"OK","headers":{"X-RateLimit-Limit":{"description":"The budget, in units: the app's, or on /me endpoints the player's.","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Units left after this request.","schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"type":"object","properties":{"region":{"type":"string","enum":["intl","jp","na"],"description":"`intl` is the international version, `jp` the Japanese one. `na` is the international data as North American cabinets see it: the same data as `intl`, except that plate difficulty follows North American plate rules."},"computedAt":{"type":"string","description":"When the figures were computed. Statistics are recomputed on a schedule, not per request."},"bands":{"type":"array","items":{"type":"object","properties":{"from":{"type":"integer"},"to":{"type":"integer"},"players":{"type":"integer"},"suppressed":{"type":"boolean","description":"True when the group has fewer than 5 players. Its figures are then null: at that size they would describe particular players. A safeguard on each figure, not a guarantee across them; see the guide."},"byType":{"anyOf":[{"type":"object","propertyNames":{"type":"string","enum":["覇者","舞舞","神","将","極"]},"additionalProperties":{"type":"object","properties":{"holders":{"type":"integer"},"heldMedian":{"type":"number","description":"Median plates of this type among holders."}},"required":["holders","heldMedian"],"additionalProperties":false},"required":["覇者","舞舞","神","将","極"]},{"type":"null"}]}},"required":["from","to","players","suppressed","byType"],"additionalProperties":false},"description":"Version plates held by active players, by rating band."},"firstGaps":{"type":"array","items":{"type":"object","properties":{"plateId":{"type":"integer"},"version":{"type":"integer","description":"The version the plate is for."},"type":{"type":"string","enum":["覇者","舞舞","神","将","極"]},"players":{"type":"integer"},"suppressed":{"type":"boolean","description":"True when the group has fewer than 5 players. Its figures are then null: at that size they would describe particular players. A safeguard on each figure, not a guarantee across them; see the guide."},"percentiles":{"anyOf":[{"type":"object","properties":{"p10":{"type":"number"},"p25":{"type":"number"},"p50":{"type":"number"},"p75":{"type":"number"},"p90":{"type":"number"}},"required":["p10","p25","p50","p75","p90"],"additionalProperties":false},{"type":"null"}]}},"required":["plateId","version","type","players","suppressed","percentiles"],"additionalProperties":false},"description":"How far below the maximum possible rating (`maxRating`) players were on the day they first got each plate."},"maxRating":{"type":"integer"}},"required":["region","computedAt","bands","firstGaps","maxRating"],"additionalProperties":false}}}},"400":{"description":"`bad_request`","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"`missing_api_key`, `invalid_api_key`","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"`app_suspended`","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"`not_found`","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"`rate_limited`","headers":{"X-RateLimit-Limit":{"description":"The budget, in units: the app's, or on /me endpoints the player's.","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Units left after this request.","schema":{"type":"integer"}},"Retry-After":{"description":"Seconds until the request would fit the budget.","schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"`internal`","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/api/v1/stats/plate-difficulty":{"get":{"operationId":"getPlateDifficulty","summary":"How hard each version plate is","description":"For players in one rating band, an estimate of how many plays each version plate takes (覇者 excluded), from how often those players meet each of its charts. The same model as the tier list on the stats page. Charts below 11.0 don't count, and 11.x and 12.x count partly.\n\nCosts 30 units of the rate limit.","tags":["Statistics"],"parameters":[{"name":"region","in":"query","required":false,"description":"`intl` is the international version, `jp` the Japanese one. `na` is the international data as North American cabinets see it: the same data as `intl`, except that plate difficulty follows North American plate rules.","schema":{"default":"intl","type":"string","enum":["intl","jp","na"]}},{"name":"rating","in":"query","required":false,"description":"A rating band as `from-to`, lower bound included: 13000–13500, 13500–14000, then 250 wide up to 17000.","schema":{"default":"15000-15250","type":"string","enum":["13000-13500","13500-14000","14000-14250","14250-14500","14500-14750","14750-15000","15000-15250","15250-15500","15500-15750","15750-16000","16000-16250","16250-16500","16500-16750","16750-17000"]}}],"x-rate-limit-cost":30,"responses":{"200":{"description":"OK","headers":{"X-RateLimit-Limit":{"description":"The budget, in units: the app's, or on /me endpoints the player's.","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Units left after this request.","schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"type":"object","properties":{"region":{"type":"string","enum":["intl","jp","na"],"description":"`intl` is the international version, `jp` the Japanese one. `na` is the international data as North American cabinets see it: the same data as `intl`, except that plate difficulty follows North American plate rules."},"version":{"type":"integer"},"band":{"type":"object","properties":{"from":{"type":"integer"},"to":{"type":"integer"}},"required":["from","to"],"additionalProperties":false},"plates":{"type":"array","items":{"type":"object","properties":{"plateId":{"type":"integer"},"prefix":{"type":"string","description":"The version's kanji, e.g. `真`."},"charts":{"type":"integer"},"fsd":{"anyOf":[{"type":"object","properties":{"value":{"anyOf":[{"type":"number"},{"type":"null"}],"description":"log₂ of the expected plays the plate takes, minus 1: each +1 doubles them. Null when no player in the band has met every chart yet (`unreachable`) or the version has no such plate."},"unreachable":{"type":"boolean"}},"required":["value","unreachable"],"additionalProperties":false},{"type":"null"}],"description":"Null when the version has no plate of this type."},"ap":{"anyOf":[{"type":"object","properties":{"value":{"anyOf":[{"type":"number"},{"type":"null"}],"description":"log₂ of the expected plays the plate takes, minus 1: each +1 doubles them. Null when no player in the band has met every chart yet (`unreachable`) or the version has no such plate."},"unreachable":{"type":"boolean"}},"required":["value","unreachable"],"additionalProperties":false},{"type":"null"}],"description":"Null when the version has no plate of this type."},"sss":{"anyOf":[{"type":"object","properties":{"value":{"anyOf":[{"type":"number"},{"type":"null"}],"description":"log₂ of the expected plays the plate takes, minus 1: each +1 doubles them. Null when no player in the band has met every chart yet (`unreachable`) or the version has no such plate."},"unreachable":{"type":"boolean"}},"required":["value","unreachable"],"additionalProperties":false},{"type":"null"}],"description":"Null when the version has no plate of this type."},"fc":{"anyOf":[{"type":"object","properties":{"value":{"anyOf":[{"type":"number"},{"type":"null"}],"description":"log₂ of the expected plays the plate takes, minus 1: each +1 doubles them. Null when no player in the band has met every chart yet (`unreachable`) or the version has no such plate."},"unreachable":{"type":"boolean"}},"required":["value","unreachable"],"additionalProperties":false},{"type":"null"}],"description":"Null when the version has no plate of this type."}},"required":["plateId","prefix","charts","fsd","ap","sss","fc"],"additionalProperties":false}}},"required":["region","version","band","plates"],"additionalProperties":false}}}},"400":{"description":"`bad_request`","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"`missing_api_key`, `invalid_api_key`","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"`app_suspended`","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"`rate_limited`","headers":{"X-RateLimit-Limit":{"description":"The budget, in units: the app's, or on /me endpoints the player's.","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Units left after this request.","schema":{"type":"integer"}},"Retry-After":{"description":"Seconds until the request would fit the budget.","schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"`internal`","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/api/v1/charts/{chartId}/distribution":{"get":{"operationId":"getChartDistribution","summary":"Achievement distribution for a chart","description":"How players in each rating band have scored on one chart: counts per achievement band and combo. Each player counts with their latest sync within 90 days.\n\nCosts 6 units of the rate limit.","tags":["Statistics"],"parameters":[{"name":"chartId","in":"path","required":true,"schema":{"type":"integer","minimum":1,"maximum":2147483647}}],"x-rate-limit-cost":6,"responses":{"200":{"description":"OK","headers":{"X-RateLimit-Limit":{"description":"The budget, in units: the app's, or on /me endpoints the player's.","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Units left after this request.","schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"type":"object","properties":{"chartId":{"type":"integer"},"region":{"type":"string","enum":["intl","jp","na"],"description":"`intl` is the international version, `jp` the Japanese one. `na` is the international data as North American cabinets see it: the same data as `intl`, except that plate difficulty follows North American plate rules."},"computedAt":{"type":"string","description":"When the figures were computed. Statistics are recomputed on a schedule, not per request."},"coarse":{"type":"array","items":{"type":"object","properties":{"from":{"type":"integer"},"to":{"type":"integer"},"players":{"type":"integer","description":"Players in this rating band with a counted score."},"suppressed":{"type":"boolean","description":"True when the group has fewer than 5 players. Its figures are then null: at that size they would describe particular players. A safeguard on each figure, not a guarantee across them; see the guide."},"counts":{"anyOf":[{"type":"object","properties":{"LT_94":{"type":"integer"},"AAA":{"type":"integer"},"S":{"type":"integer"},"S_PLUS":{"type":"integer"},"SS":{"type":"integer"},"SS_PLUS":{"type":"integer"},"SSS":{"type":"integer"},"SSS_PLUS_WITHOUT_AP":{"type":"integer"},"ALL_PERFECT_PLUS":{"type":"integer"},"FULL_COMBO":{"type":"integer"},"FULL_COMBO_PLUS":{"type":"integer"},"ALL_PERFECT":{"type":"integer"}},"required":["LT_94","AAA","S","S_PLUS","SS","SS_PLUS","SSS","SSS_PLUS_WITHOUT_AP","ALL_PERFECT_PLUS","FULL_COMBO","FULL_COMBO_PLUS","ALL_PERFECT"],"additionalProperties":false,"description":"Scores per band of achievement: `LT_94` below 94%, `AAA` 94–97, `S` 97–98, `S_PLUS` 98–99, `SS` 99–99.5, `SS_PLUS` 99.5–100, `SSS` 100–100.5, `SSS_PLUS_WITHOUT_AP` 100.5 and up without an AP, `ALL_PERFECT_PLUS` 101. `FULL_COMBO`, `FULL_COMBO_PLUS` and `ALL_PERFECT` count each combo exactly, not cumulatively, alongside the score bands. Scores below 60% aren't counted. An AP (not AP+) from 100.5% up is in no score band: it shows only under `ALL_PERFECT`, so the score bands can add up to slightly less than the scores counted."},{"type":"null"}]}},"required":["from","to","players","suppressed","counts"],"additionalProperties":false},"description":"Rating bands 13000–13500, 13500–14000, then 250 wide up to 17000."},"fine":{"type":"array","items":{"type":"object","properties":{"from":{"type":"integer"},"to":{"type":"integer"},"players":{"type":"integer","description":"Players in this rating band with a counted score."},"suppressed":{"type":"boolean","description":"True when the group has fewer than 5 players. Its figures are then null: at that size they would describe particular players. A safeguard on each figure, not a guarantee across them; see the guide."},"counts":{"anyOf":[{"type":"object","properties":{"LT_94":{"type":"integer"},"AAA":{"type":"integer"},"S":{"type":"integer"},"S_PLUS":{"type":"integer"},"SS":{"type":"integer"},"SS_PLUS":{"type":"integer"},"SSS":{"type":"integer"},"SSS_PLUS_WITHOUT_AP":{"type":"integer"},"ALL_PERFECT_PLUS":{"type":"integer"},"FULL_COMBO":{"type":"integer"},"FULL_COMBO_PLUS":{"type":"integer"},"ALL_PERFECT":{"type":"integer"}},"required":["LT_94","AAA","S","S_PLUS","SS","SS_PLUS","SSS","SSS_PLUS_WITHOUT_AP","ALL_PERFECT_PLUS","FULL_COMBO","FULL_COMBO_PLUS","ALL_PERFECT"],"additionalProperties":false,"description":"Scores per band of achievement: `LT_94` below 94%, `AAA` 94–97, `S` 97–98, `S_PLUS` 98–99, `SS` 99–99.5, `SS_PLUS` 99.5–100, `SSS` 100–100.5, `SSS_PLUS_WITHOUT_AP` 100.5 and up without an AP, `ALL_PERFECT_PLUS` 101. `FULL_COMBO`, `FULL_COMBO_PLUS` and `ALL_PERFECT` count each combo exactly, not cumulatively, alongside the score bands. Scores below 60% aren't counted. An AP (not AP+) from 100.5% up is in no score band: it shows only under `ALL_PERFECT`, so the score bands can add up to slightly less than the scores counted."},{"type":"null"}]}},"required":["from","to","players","suppressed","counts"],"additionalProperties":false},"description":"50-wide bands from 16000 to 17000."}},"required":["chartId","region","computedAt","coarse","fine"],"additionalProperties":false}}}},"400":{"description":"`bad_request`","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"`missing_api_key`, `invalid_api_key`","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"`app_suspended`","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"`not_found`","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"`rate_limited`","headers":{"X-RateLimit-Limit":{"description":"The budget, in units: the app's, or on /me endpoints the player's.","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Units left after this request.","schema":{"type":"integer"}},"Retry-After":{"description":"Seconds until the request would fit the budget.","schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"`internal`","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/api/v1/stats/levels/{internalLevel}":{"get":{"operationId":"getLevelDistribution","summary":"Achievement distribution for a chart constant","description":"The chart distribution summed over every chart with this constant in a region.\n\nCosts 6 units of the rate limit.","tags":["Statistics"],"parameters":[{"name":"internalLevel","in":"path","required":true,"description":"Chart constant ×10, e.g. `134` for 13.4.","schema":{"type":"integer","minimum":10,"maximum":150}},{"name":"region","in":"query","required":false,"description":"`intl` is the international version, `jp` the Japanese one. `na` is the international data as North American cabinets see it: the same data as `intl`, except that plate difficulty follows North American plate rules.","schema":{"default":"intl","type":"string","enum":["intl","jp","na"]}}],"x-rate-limit-cost":6,"responses":{"200":{"description":"OK","headers":{"X-RateLimit-Limit":{"description":"The budget, in units: the app's, or on /me endpoints the player's.","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Units left after this request.","schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"type":"object","properties":{"internalLevel":{"type":"integer"},"region":{"type":"string","enum":["intl","jp","na"],"description":"`intl` is the international version, `jp` the Japanese one. `na` is the international data as North American cabinets see it: the same data as `intl`, except that plate difficulty follows North American plate rules."},"computedAt":{"type":"string","description":"When the figures were computed. Statistics are recomputed on a schedule, not per request."},"coarse":{"type":"array","items":{"type":"object","properties":{"from":{"type":"integer"},"to":{"type":"integer"},"players":{"anyOf":[{"type":"integer"},{"type":"null"}],"description":"Players in this rating band with a counted score on any chart of this constant. Null for a band counted before this figure was kept; such a band is suppressed."},"suppressed":{"type":"boolean","description":"True when the group has fewer than 5 players. Its figures are then null: at that size they would describe particular players. A safeguard on each figure, not a guarantee across them; see the guide."},"counts":{"anyOf":[{"type":"object","properties":{"LT_94":{"type":"integer"},"AAA":{"type":"integer"},"S":{"type":"integer"},"S_PLUS":{"type":"integer"},"SS":{"type":"integer"},"SS_PLUS":{"type":"integer"},"SSS":{"type":"integer"},"SSS_PLUS_WITHOUT_AP":{"type":"integer"},"ALL_PERFECT_PLUS":{"type":"integer"},"FULL_COMBO":{"type":"integer"},"FULL_COMBO_PLUS":{"type":"integer"},"ALL_PERFECT":{"type":"integer"}},"required":["LT_94","AAA","S","S_PLUS","SS","SS_PLUS","SSS","SSS_PLUS_WITHOUT_AP","ALL_PERFECT_PLUS","FULL_COMBO","FULL_COMBO_PLUS","ALL_PERFECT"],"additionalProperties":false,"description":"Scores per band of achievement: `LT_94` below 94%, `AAA` 94–97, `S` 97–98, `S_PLUS` 98–99, `SS` 99–99.5, `SS_PLUS` 99.5–100, `SSS` 100–100.5, `SSS_PLUS_WITHOUT_AP` 100.5 and up without an AP, `ALL_PERFECT_PLUS` 101. `FULL_COMBO`, `FULL_COMBO_PLUS` and `ALL_PERFECT` count each combo exactly, not cumulatively, alongside the score bands. Scores below 60% aren't counted. An AP (not AP+) from 100.5% up is in no score band: it shows only under `ALL_PERFECT`, so the score bands can add up to slightly less than the scores counted."},{"type":"null"}]},"scores":{"type":"integer","description":"Scores counted: one per player per chart, so a player with three charts of this constant counts three times. The score bands in `counts` add up to this (less APs from 100.5% up; see `counts`), not to `players`."}},"required":["from","to","players","suppressed","counts","scores"],"additionalProperties":false},"description":"Rating bands 13000–13500, 13500–14000, then 250 wide up to 17000."},"fine":{"type":"array","items":{"type":"object","properties":{"from":{"type":"integer"},"to":{"type":"integer"},"players":{"anyOf":[{"type":"integer"},{"type":"null"}],"description":"Players in this rating band with a counted score on any chart of this constant. Null for a band counted before this figure was kept; such a band is suppressed."},"suppressed":{"type":"boolean","description":"True when the group has fewer than 5 players. Its figures are then null: at that size they would describe particular players. A safeguard on each figure, not a guarantee across them; see the guide."},"counts":{"anyOf":[{"type":"object","properties":{"LT_94":{"type":"integer"},"AAA":{"type":"integer"},"S":{"type":"integer"},"S_PLUS":{"type":"integer"},"SS":{"type":"integer"},"SS_PLUS":{"type":"integer"},"SSS":{"type":"integer"},"SSS_PLUS_WITHOUT_AP":{"type":"integer"},"ALL_PERFECT_PLUS":{"type":"integer"},"FULL_COMBO":{"type":"integer"},"FULL_COMBO_PLUS":{"type":"integer"},"ALL_PERFECT":{"type":"integer"}},"required":["LT_94","AAA","S","S_PLUS","SS","SS_PLUS","SSS","SSS_PLUS_WITHOUT_AP","ALL_PERFECT_PLUS","FULL_COMBO","FULL_COMBO_PLUS","ALL_PERFECT"],"additionalProperties":false,"description":"Scores per band of achievement: `LT_94` below 94%, `AAA` 94–97, `S` 97–98, `S_PLUS` 98–99, `SS` 99–99.5, `SS_PLUS` 99.5–100, `SSS` 100–100.5, `SSS_PLUS_WITHOUT_AP` 100.5 and up without an AP, `ALL_PERFECT_PLUS` 101. `FULL_COMBO`, `FULL_COMBO_PLUS` and `ALL_PERFECT` count each combo exactly, not cumulatively, alongside the score bands. Scores below 60% aren't counted. An AP (not AP+) from 100.5% up is in no score band: it shows only under `ALL_PERFECT`, so the score bands can add up to slightly less than the scores counted."},{"type":"null"}]},"scores":{"type":"integer","description":"Scores counted: one per player per chart, so a player with three charts of this constant counts three times. The score bands in `counts` add up to this (less APs from 100.5% up; see `counts`), not to `players`."}},"required":["from","to","players","suppressed","counts","scores"],"additionalProperties":false},"description":"50-wide bands from 16000 to 17000."}},"required":["internalLevel","region","computedAt","coarse","fine"],"additionalProperties":false}}}},"400":{"description":"`bad_request`","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"`missing_api_key`, `invalid_api_key`","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"`app_suspended`","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"`not_found`","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"`rate_limited`","headers":{"X-RateLimit-Limit":{"description":"The budget, in units: the app's, or on /me endpoints the player's.","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Units left after this request.","schema":{"type":"integer"}},"Retry-After":{"description":"Seconds until the request would fit the budget.","schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"`internal`","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/api/v1/stats/level-charts":{"get":{"operationId":"getLevelCharts","summary":"Achievement distribution for every chart of a level","description":"Each chart of one level, for one rating band: the per-chart distribution, side by side. Give the level as `level` (displayed) or `internalLevel` (constant), and the rating band.\n\nCosts 15 units of the rate limit.","tags":["Statistics"],"parameters":[{"name":"region","in":"query","required":false,"description":"`intl` is the international version, `jp` the Japanese one. `na` is the international data as North American cabinets see it: the same data as `intl`, except that plate difficulty follows North American plate rules.","schema":{"default":"intl","type":"string","enum":["intl","jp","na"]}},{"name":"level","in":"query","required":false,"description":"The level the game displays, e.g. `13+`.","schema":{"type":"string","enum":["1","2","3","4","5","6","7","8","9","10","11","12","13","14","15","7+","8+","9+","10+","11+","12+","13+","14+","15+"],"example":"13+"}},{"name":"internalLevel","in":"query","required":false,"description":"Chart constant ×10, e.g. `134` for 13.4.","schema":{"type":"integer","minimum":10,"maximum":150}},{"name":"rating","in":"query","required":true,"description":"A rating band as `from-to`, lower bound included: 13000–13500, 13500–14000, then 250 wide up to 17000, or 50 wide from 16000 to 17000.","schema":{"type":"string","enum":["13000-13500","13500-14000","14000-14250","14250-14500","14500-14750","14750-15000","15000-15250","15250-15500","15500-15750","15750-16000","16000-16250","16250-16500","16500-16750","16750-17000","16000-16050","16050-16100","16100-16150","16150-16200","16200-16250","16250-16300","16300-16350","16350-16400","16400-16450","16450-16500","16500-16550","16550-16600","16600-16650","16650-16700","16700-16750","16750-16800","16800-16850","16850-16900","16900-16950","16950-17000"]}}],"x-rate-limit-cost":15,"responses":{"200":{"description":"OK","headers":{"X-RateLimit-Limit":{"description":"The budget, in units: the app's, or on /me endpoints the player's.","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Units left after this request.","schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"type":"object","properties":{"region":{"type":"string","enum":["intl","jp","na"],"description":"`intl` is the international version, `jp` the Japanese one. `na` is the international data as North American cabinets see it: the same data as `intl`, except that plate difficulty follows North American plate rules."},"band":{"type":"object","properties":{"from":{"type":"integer"},"to":{"type":"integer"}},"required":["from","to"],"additionalProperties":false},"charts":{"type":"array","items":{"type":"object","properties":{"players":{"type":"integer","description":"Players in this rating band with a counted score."},"suppressed":{"type":"boolean","description":"True when the group has fewer than 5 players. Its figures are then null: at that size they would describe particular players. A safeguard on each figure, not a guarantee across them; see the guide."},"counts":{"anyOf":[{"type":"object","properties":{"LT_94":{"type":"integer"},"AAA":{"type":"integer"},"S":{"type":"integer"},"S_PLUS":{"type":"integer"},"SS":{"type":"integer"},"SS_PLUS":{"type":"integer"},"SSS":{"type":"integer"},"SSS_PLUS_WITHOUT_AP":{"type":"integer"},"ALL_PERFECT_PLUS":{"type":"integer"},"FULL_COMBO":{"type":"integer"},"FULL_COMBO_PLUS":{"type":"integer"},"ALL_PERFECT":{"type":"integer"}},"required":["LT_94","AAA","S","S_PLUS","SS","SS_PLUS","SSS","SSS_PLUS_WITHOUT_AP","ALL_PERFECT_PLUS","FULL_COMBO","FULL_COMBO_PLUS","ALL_PERFECT"],"additionalProperties":false,"description":"Scores per band of achievement: `LT_94` below 94%, `AAA` 94–97, `S` 97–98, `S_PLUS` 98–99, `SS` 99–99.5, `SS_PLUS` 99.5–100, `SSS` 100–100.5, `SSS_PLUS_WITHOUT_AP` 100.5 and up without an AP, `ALL_PERFECT_PLUS` 101. `FULL_COMBO`, `FULL_COMBO_PLUS` and `ALL_PERFECT` count each combo exactly, not cumulatively, alongside the score bands. Scores below 60% aren't counted. An AP (not AP+) from 100.5% up is in no score band: it shows only under `ALL_PERFECT`, so the score bands can add up to slightly less than the scores counted."},{"type":"null"}]},"chartId":{"type":"integer"}},"required":["players","suppressed","counts","chartId"],"additionalProperties":false}}},"required":["region","band","charts"],"additionalProperties":false}}}},"400":{"description":"`bad_request`","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"`missing_api_key`, `invalid_api_key`","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"`app_suspended`","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"`not_found`","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"`rate_limited`","headers":{"X-RateLimit-Limit":{"description":"The budget, in units: the app's, or on /me endpoints the player's.","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Units left after this request.","schema":{"type":"integer"}},"Retry-After":{"description":"Seconds until the request would fit the budget.","schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"`internal`","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/api/v1/stats/clear-ratios":{"get":{"operationId":"getClearRatios","summary":"Clear ratios by progress on a level","description":"Players are grouped by how much of a level they have cleared to a criterion (bands of 20%). For one band, this gives each chart's clear count among the band's players: which charts players at that stage tend to have done.\n\nCosts 15 units of the rate limit.","tags":["Statistics"],"parameters":[{"name":"region","in":"query","required":false,"description":"`intl` is the international version, `jp` the Japanese one. `na` is the international data as North American cabinets see it: the same data as `intl`, except that plate difficulty follows North American plate rules.","schema":{"default":"intl","type":"string","enum":["intl","jp","na"]}},{"name":"level","in":"query","required":true,"description":"The level the game displays, e.g. `13+`.","schema":{"type":"string","enum":["1","2","3","4","5","6","7","8","9","10","11","12","13","14","15","7+","8+","9+","10+","11+","12+","13+","14+","15+"],"example":"13+"}},{"name":"criterion","in":"query","required":true,"description":"What counts as cleared: `PLAYED` (60% or more), an achievement rank (`AAA`…`SSS_PLUS`), or a combo (`FULL_COMBO`…`ALL_PERFECT_PLUS`, cumulative).","schema":{"type":"string","enum":["PLAYED","AAA","S","S_PLUS","SS","SS_PLUS","SSS","SSS_PLUS","FULL_COMBO","FULL_COMBO_PLUS","ALL_PERFECT","ALL_PERFECT_PLUS"]}},{"name":"band","in":"query","required":true,"description":"0 = cleared 0–20% of the level, … 4 = 80–100%.","schema":{"type":"integer","minimum":0,"maximum":4}}],"x-rate-limit-cost":15,"responses":{"200":{"description":"OK","headers":{"X-RateLimit-Limit":{"description":"The budget, in units: the app's, or on /me endpoints the player's.","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Units left after this request.","schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"type":"object","properties":{"region":{"type":"string","enum":["intl","jp","na"],"description":"`intl` is the international version, `jp` the Japanese one. `na` is the international data as North American cabinets see it: the same data as `intl`, except that plate difficulty follows North American plate rules."},"level":{"type":"string","enum":["1","2","3","4","5","6","7","8","9","10","11","12","13","14","15","7+","8+","9+","10+","11+","12+","13+","14+","15+"],"description":"The level the game displays, e.g. `13+`.","example":"13+"},"criterion":{"type":"string","enum":["PLAYED","AAA","S","S_PLUS","SS","SS_PLUS","SSS","SSS_PLUS","FULL_COMBO","FULL_COMBO_PLUS","ALL_PERFECT","ALL_PERFECT_PLUS"]},"band":{"type":"integer"},"computedAt":{"type":"string","description":"When the figures were computed. Statistics are recomputed on a schedule, not per request."},"bands":{"type":"array","items":{"type":"object","properties":{"band":{"type":"integer"},"players":{"type":"integer"}},"required":["band","players"],"additionalProperties":false},"description":"Players in each band. Band `n` holds players who have cleared 20n%–20(n+1)% of the level's charts to the criterion."},"players":{"type":"integer"},"suppressed":{"type":"boolean","description":"True when the group has fewer than 5 players. Its figures are then null: at that size they would describe particular players. A safeguard on each figure, not a guarantee across them; see the guide."},"charts":{"type":"array","items":{"type":"object","properties":{"chartId":{"type":"integer"},"played":{"type":"integer"},"suppressed":{"type":"boolean","description":"True when the group has fewer than 5 players. Its figures are then null: at that size they would describe particular players. A safeguard on each figure, not a guarantee across them; see the guide."},"cleared":{"anyOf":[{"type":"integer"},{"type":"null"}]}},"required":["chartId","played","suppressed","cleared"],"additionalProperties":false},"description":"Per chart: how many of the band's players have played it, and how many cleared it to the criterion. Empty when the band is suppressed."}},"required":["region","level","criterion","band","computedAt","bands","players","suppressed","charts"],"additionalProperties":false}}}},"400":{"description":"`bad_request`","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"`missing_api_key`, `invalid_api_key`","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"`app_suspended`","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"`not_found`","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"`rate_limited`","headers":{"X-RateLimit-Limit":{"description":"The budget, in units: the app's, or on /me endpoints the player's.","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Units left after this request.","schema":{"type":"integer"}},"Retry-After":{"description":"Seconds until the request would fit the budget.","schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"`internal`","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}}}}