You can create an API instance without directly providing an access_token by using API.createAsync!
+Please use API.createAsync instead of the default constructor if you don't have at least an API.access_token! +
Please use API.createAsync instead of the default constructor if you don't have at least an API.access_token!
An API object without an access_token
is pretty much useless!
Private
_access_Private
_clientPrivate
_expiresPrivate
_refresh_Private
_refresh_Private
Optional
_refresh_Private
Optional
_refresh_Private
_retryIn seconds, how long should it wait until retrying? (defaults to 2)
-If true, doesn't retry under any circumstances (defaults to false)
-How many retries maximum before throwing an APIError (defaults to 5)
-Should it retry a request upon successfully refreshing the token due to API.refresh_on_401 being true
? (defaults to true)
Upon failing a request and receiving a response, because of which received status code should the request be retried? (defaults to [429])
-Should it retry a request if that request failed because it has been aborted by the API.timeout? (defaults to false)
-Private
_routesUsed by practically every method to interact with the API.server
-Used for getting an API.access_token and using your API.refresh_token
-Private
Optional
_scopesPrivate
_serverPrivate
_timeoutPrivate
_token_Private
Optional
_userPrivate
Optional
_verboseThe key that allows you to talk with the API
-The details of your client, which you've got from https://osu.ppy.sh/home/account/edit#oauth
-The expiration date of your access_token
-If true, upon failing a request due to a 401, it will use the API.refresh_token if it exists (defaults to true)
-If true, the application will silently use the API.refresh_token right before the API.access_token expires, +
The key that allows you to talk with the API
+The details of your client, which you've got from https://osu.ppy.sh/home/account/edit#oauth
+The expiration date of your access_token
+If true, upon failing a request due to a 401, it will use the API.refresh_token if it exists (defaults to true)
+If true, the application will silently use the API.refresh_token right before the API.access_token expires, as determined by API.expires (defaults to true)
-Valid for an unknown amount of time, allows you to get a new token without going through the Authorization Code Grant again! +
Valid for an unknown amount of time, allows you to get a new token without going through the Authorization Code Grant again! Use API.refreshToken to do that
-Configure how this instance should behave when it comes to automatically retrying a request
+Configure how this instance should behave when it comes to automatically retrying a request
In seconds, how long should it wait until retrying? (defaults to 2)
-If true, doesn't retry under any circumstances (defaults to false)
+If true, doesn't retry under any circumstances (defaults to false)
How many retries maximum before throwing an APIError (defaults to 5)
Should it retry a request upon successfully refreshing the token due to API.refresh_on_401 being true
? (defaults to true)
Upon failing a request and receiving a response, because of which received status code should the request be retried? (defaults to [429])
Should it retry a request if that request failed because it has been aborted by the API.timeout? (defaults to false)
-In seconds, how long should it wait until retrying? (defaults to 2)
-If true, doesn't retry under any circumstances (defaults to false)
+In seconds, how long should it wait until retrying? (defaults to 2)
+If true, doesn't retry under any circumstances (defaults to false)
How many retries maximum before throwing an APIError (defaults to 5)
Should it retry a request upon successfully refreshing the token due to API.refresh_on_401 being true
? (defaults to true)
Upon failing a request and receiving a response, because of which received status code should the request be retried? (defaults to [429])
Should it retry a request if that request failed because it has been aborted by the API.timeout? (defaults to false)
-What follows the API.server and preceeds the individual endpoints used by each request
+What follows the API.server and preceeds the individual endpoints used by each request
Used by practically every method to interact with the API.server
Used for getting an API.access_token and using your API.refresh_token
-Used by practically every method to interact with the API.server
+Used by practically every method to interact with the API.server
Used for getting an API.access_token and using your API.refresh_token
-The base url of the server where the requests should land (defaults to https://osu.ppy.sh)
-The maximum amount of seconds requests should take before returning an answer (defaults to 20)
-0 means no maximum, no timeout
-Should always be "Bearer"
-The osu! user id of the user who went through the Authorization Code Grant
-Which events should be logged (defaults to none)
-The base url of the server where the requests should land (defaults to https://osu.ppy.sh)
+The maximum amount of seconds requests should take before returning an answer (defaults to 20)
+Should always be "Bearer"
+The osu! user id of the user who went through the Authorization Code Grant
+Which events should be logged (defaults to none)
+Get a websocket to get WebSocket events from!
Where the "notification websocket/server" is
-(defaults to the API.server's protocol and a maximum of 1 subdomain being replaced by "wss://notify." (so usually wss://notify.ppy.sh
))
Private
getSet most of an api
's properties, like tokens, token_type, scopes, expiration_date
An Object with the client id & secret, grant_type, and stuff that depends of the grant_type
-The api
which will see its properties change
api
, just in case, because in theory it should modify the original object
Private
logThe function that directly communicates with the API! Almost every functions of the API object uses this function!
-The type of request, each endpoint uses a specific one (if it uses multiple, the intent and parameters become different)
+(defaults to the API.server's protocol and a maximum of 1 subdomain being replaced by "wss://notify." (so usuallywss://notify.ppy.sh
))
+The function that directly communicates with the API! Almost every functions of the API object uses this function!
+The type of request, each endpoint uses a specific one (if it uses multiple, the intent and parameters become different)
What comes in the URL after api/
The things to specify in the request, such as the beatmap_id when looking for a beatmap
-Optional
settings: Omit<RequestInit, "body">Additional settings to add to the current settings of the fetch()
request
Optional
settings: Omit<RequestInit, "body">Additional settings to add to the current settings of the fetch()
request
Context given by a prior request
-A Promise with the API's response
-Private
updateYou can use this to specify additional settings for the method you're going to call, such as headers
, an AbortSignal
, and more advanced things!
A Promise with the API's response
+You can use this to specify additional settings for the method you're going to call, such as headers
, an AbortSignal
, and more advanced things!
You may get more info at https://www.npmjs.com/package/node-fetch#fetch-options
A special version of the API
that changes how requests are done
const controller = new AbortController() // this controller can be used to abort any request that uses its signal!
const user = await api.withSettings({signal: controller.signal}).getUser(7276846)
-
-Static
createThe normal way to create an API instance! Make sure to await
it
const controller = new AbortController() // this controller can be used to abort any request that uses its signal!
const user = await api.withSettings({signal: controller.signal}).getUser(7276846)
+
+
+Static
createThe normal way to create an API instance! Make sure to await
it
The ID and the secret of your client, can be found on https://osu.ppy.sh/home/account/edit#new-oauth-application
-Optional
user: { If the instance is supposed to represent a user, use their Authorization Code and the Application Callback URL of your application!
+Optional
user: { If the instance is supposed to represent a user, use their Authorization Code and the Application Callback URL of your application!
The code that appeared as a GET argument when they got redirected to the Application Callback URL (redirect_uri
)
The Application Callback URL; Where the User has been redirected to after saying "okay" to your application doing stuff
-Optional
verbose: "all" | "none" | "errors"Optional
server: stringOptional
timeout: numberIn seconds
+Optional
verbose: "all" | "none" | "errors"Optional
server: stringOptional
timeout: numberA promise with an API instance
-Readonly
getGet extensive beatmap data about whichever beatmap you want!
-Readonly
getGet various data about the difficulty of a beatmap!
-You may want to use api.getBeatmapDifficultyAttributesOsu (or Taiko or whatever) instead for better type safety
-Readonly
getGet various data about the difficulty of a ctb beatmap!
-Readonly
getGet various data about the difficulty of a mania beatmap!
-Readonly
getGet various data about the difficulty of an osu! beatmap!
-Readonly
getGet various data about the difficulty of a taiko beatmap!
-Readonly
getGet data about a Beatmap.Pack using its tag!
-Currently in https://osu.ppy.sh/beatmaps/packs, when hovering a pack, its URL with its tag should be preview by your browser
-Readonly
getGet an Array of up to 100 Beatmap.Packs of a specific type!
-Optional
cursor_string: stringReadonly
getGet the top scores of a beatmap!
-Please check if mods
and type
seem to be supported or not by the API: https://osu.ppy.sh/docs/index.html#get-beatmap-scores
Readonly
getGet the top scores of a beatmap, in the "solo score" format lazer brought with it! +
Readonly
getGet extensive beatmap data about whichever beatmap you want!
+Get extensive beatmap data about whichever beatmap you want!
+Readonly
getGet various data about the difficulty of a beatmap!
+Get various data about the difficulty of a beatmap!
+The Beatmap in question
+Optional
mods: number | string[] | Mod[]Can be a bitset of mods, an array of mod acronyms, or an array of Mods (ignores mod settings) (defaults to No Mod)
+Optional
ruleset: RulesetUseful to specify if the beatmap is a convert (defaults to the ruleset the beatmap was intended for)
+Readonly
getGet various data about the difficulty of a ctb beatmap!
+Readonly
getGet various data about the difficulty of a mania beatmap!
+Readonly
getGet various data about the difficulty of an osu! beatmap!
+Readonly
getGet various data about the difficulty of a taiko beatmap!
+Readonly
getGet data about a Beatmap.Pack using its tag!
+Get data about a Beatmap.Pack using its tag!
+Currently in https://osu.ppy.sh/beatmaps/packs, when hovering a pack, its URL with its tag should be preview by your browser
+Currently in https://osu.ppy.sh/beatmaps/packs, when hovering a pack, its URL with its tag should be preview by your browser
+Readonly
getGet an Array of up to 100 Beatmap.Packs of a specific type!
+Get an Array of up to 100 Beatmap.Packs of a specific type!
+The type of the BeatmapPacks (defaults to standard)
+Optional
cursor_string: stringUse a response's cursor_string
with the same parameters to get the next "page" of results!
Readonly
getGet the top scores of a beatmap!
+Get the top scores of a beatmap!
+Please check if mods
and type
seem to be supported or not by the API: https://osu.ppy.sh/docs/index.html#get-beatmap-scores
Please check if mods
and type
seem to be supported or not by the API: https://osu.ppy.sh/docs/index.html#get-beatmap-scores
Readonly
getGet the top scores of a beatmap, in the "solo score" format lazer brought with it! +More info on GitHub if needed https://github.com/ppy/osu-infrastructure/blob/master/score-submission.md
+Get the top scores of a beatmap, in the "solo score" format lazer brought with it! More info on GitHub if needed https://github.com/ppy/osu-infrastructure/blob/master/score-submission.md
-Please check if mods
and type
seem to be supported or not by the API: https://osu.ppy.sh/docs/index.html#get-beatmap-scores-non-legacy
Readonly
getGet the score on a beatmap made by a specific user (with specific mods and on a specific ruleset if needed)
-An Object with the position of the score according to the specified Mods and Ruleset, and with the score itself
-Readonly
getGet the scores on a beatmap made by a specific user (with the possibility to specify if the scores are on a convert)
-Readonly
getGet extensive beatmap data for up to 50 beatmaps at once!
-Readonly
lookupGet extensive beatmap data about whichever beatmap you want!
-Optional
checksum?: stringOptional
filename?: stringOptional
id?: numberReadonly
getGet extensive beatmapset data about whichever beatmapset you want!
-Readonly
getGet complex data about the posts of a beatmapset's discussion or of a user!
-Optional
from: { Optional
discussion?: number | DiscussionOptional
user?: number | UserOptional
types: ("first" | "reply" | "system")[]Optional
config: Beatmapset.Config(2024-03-11) For months now, the API's documentation says the response is likely to change, so beware
-Relevant posts and info about them
-Readonly
getGet complex data about the votes of a beatmapset's discussions or/and received/given by a specific user!
-Optional
from: { Optional
discussion?: number | DiscussionOptional
vote_Optional
vote_Optional
score: 1 | -1Optional
config: Beatmapset.Config(2024-03-11) For months now, the API's documentation says the response is likely to change, so beware
-Relevant votes and info about them
-Readonly
getGet complex data about the discussion page of any beatmapet that you want!
-Optional
from: { Optional
beatmapset?: number | BeatmapsetOptional
status?: "all" | "ranked" | "qualified" | "disqualified" | "never_qualified"Optional
user?: number | UserOptional
filter: { Optional
only_Optional
types?: ("suggestion" | "problem" | "mapper_note" | "praise" | "hype" | "review")[]Optional
config: Beatmapset.Config(2024-03-11) For months now, the API's documentation says the response is likely to change, so beware
-Relevant discussions and info about them
-Readonly
getGet complex data about the events of a beatmapset and the users involved with them!
-Optional
from: { Optional
beatmapset?: number | BeatmapsetOptional
max_Optional
min_Optional
user?: number | UserOptional
types: ("nominate" | "love" | "remove_from_loved" | "qualify" | "disqualify" | "approve" | "rank" | "kudosu_allow" | "kudosu_deny" | "kudosu_gain" | "kudosu_lost" | "kudosu_recalculate" | "issue_resolve" | "issue_reopen" | "discussion_lock" | "discussion_unlock" | "discussion_delete" | "discussion_restore" | "discussion_post_delete" | "discussion_post_restore" | "nomination_reset" | "nomination_reset_received" | "genre_edit" | "language_edit" | "nsfw_toggle" | "offset_edit" | "tags_edit" | "beatmap_owner_change")[]Optional
config: Beatmapset.Config(2024-03-11) For months now, the API's documentation says the response is likely to change, so beware, -and also there's no documentation for this route in the API, so this is only the result of my interpretation of the website's code lol
-Relevant events and users
-Readonly
lookupGet extensive data about a beatmapset by using a beatmap!
-Readonly
searchSearch for beatmapsets as if you were on the website or on lazer!
-Optional
query: { Optional
categories?: "Any" | "Ranked" | "Qualified" | "Loved" | "Favourites" | "Pending" | "WIP" | "Graveyard" | "My Maps"Filter in sets depending on their status or on their relation with the authorized user (defaults to all that have a leaderboard)
-Optional
cursor_The thing you've got from a previous request to get another page of results!
-Optional
extra?: ("must_have_video" | "must_have_storyboard")[]Should all sets have a video, a storyboard, maybe both at once?
-Optional
general?: ("Recommended difficulty" | "Include converted beatmaps" | "Subscribed mappers" | "Spotlighted beatmaps" | "Featured Artists")[]Various filters to activate
-Optional
genre?: Unspecified | any[any] | Anime | Rock | Pop | Other | Novelty | any[any] | Electronic | Metal | Classical | Folk | JazzSpecify the musical genre of the music of the beatmapsets you're searching for (don't specify to get any genre)
-"Any"/0 actually looks up sets that specifically have the Genre "Any" such as 5947
, it's excluded because it's counter-intuitive
+
Please check if mods
and type
seem to be supported or not by the API: https://osu.ppy.sh/docs/index.html#get-beatmap-scores-non-legacy
Please check if mods
and type
seem to be supported or not by the API: https://osu.ppy.sh/docs/index.html#get-beatmap-scores-non-legacy
Readonly
getGet the score on a beatmap made by a specific user (with specific mods and on a specific ruleset if needed)
+Get the score on a beatmap made by a specific user (with specific mods and on a specific ruleset if needed)
+An Object with the position of the score according to the specified Mods and Ruleset, and with the score itself
+Readonly
getGet the scores on a beatmap made by a specific user (with the possibility to specify if the scores are on a convert)
+Readonly
getGet extensive beatmap data for up to 50 beatmaps at once!
+Get extensive beatmap data for up to 50 beatmaps at once!
+Readonly
lookupGet extensive beatmap data about whichever beatmap you want!
+Get extensive beatmap data about whichever beatmap you want!
+What to specify in order to find the right beatmap
+Optional
checksum?: stringOptional
filename?: stringOptional
id?: numberReadonly
getGet extensive beatmapset data about whichever beatmapset you want!
+Get extensive beatmapset data about whichever beatmapset you want!
+The beatmapset or the id of the beatmapset you're trying to get
+Readonly
getGet complex data about the posts of a beatmapset's discussion or of a user!
+Get complex data about the posts of a beatmapset's discussion or of a user!
+Optional
from: { From where/who are the posts coming from? A specific discussion, a specific user?
+Optional
discussion?: number | DiscussionOptional
user?: number | UserOptional
types: ("first" | "reply" | "system")[]What kind of posts?
+Optional
config: Beatmapset.ConfigHow many results maximum, how to sort them, which page of those, maybe a cursor_string...
+Relevant posts and info about them
+Readonly
getGet complex data about the votes of a beatmapset's discussions or/and received/given by a specific user!
+Get complex data about the votes of a beatmapset's discussions or/and received/given by a specific user!
+Optional
from: { The discussion with the votes, the user who voted, the user who's gotten the votes...
+Optional
discussion?: number | DiscussionOptional
vote_Optional
vote_Optional
score: 1 | -1An upvote (1) or a downvote (-1)
+Optional
config: Beatmapset.ConfigHow many results maximum, how to sort them, which page of those, maybe a cursor_string...
+Relevant votes and info about them
+Readonly
getGet complex data about the discussion page of any beatmapet that you want!
+Get complex data about the discussion page of any beatmapet that you want!
+Optional
from: { From where/who are the discussions coming from? Maybe only qualified sets?
+Optional
beatmapset?: number | BeatmapsetOptional
status?: Optional
user?: number | UserOptional
filter: { Should those discussions only be unresolved problems, for example?
+Optional
only_Optional
types?: (Optional
config: Beatmapset.ConfigHow many results maximum, how to sort them, which page of those, maybe a cursor_string...
+Relevant discussions and info about them
+Readonly
getGet complex data about the events of a beatmapset and the users involved with them!
+Get complex data about the events of a beatmapset and the users involved with them!
+Optional
from: { Which beatmapset, or caused by which user? When?
+Optional
beatmapset?: number | BeatmapsetOptional
max_Optional
min_Optional
user?: number | UserOptional
types: (What kinds of events?
+Optional
config: Beatmapset.ConfigHow many results maximum, how to sort them, which page of those, maybe a cursor_string...
+Relevant events and users
+Readonly
lookupGet extensive data about a beatmapset by using a beatmap!
+Readonly
searchSearch for beatmapsets as if you were on the website or on lazer!
+Search for beatmapsets as if you were on the website or on lazer!
+Optional
query: { All the filters and sorting options that you'd normally find on the website or on lazer
+Optional
categories?: Filter in sets depending on their status or on their relation with the authorized user (defaults to all that have a leaderboard)
+Optional
cursor_The thing you've got from a previous request to get another page of results!
+Optional
extra?: ("must_have_video" | "must_have_storyboard")[]Should all sets have a video, a storyboard, maybe both at once?
+Optional
general?: (Various filters to activate
+Optional
genre?: Specify the musical genre of the music of the beatmapsets you're searching for (don't specify to get any genre)
+Optional
hide_Use this to hide all sets that are marked as explicit
-Optional
keywords?: stringWhat you'd put in the searchbar, like the name of a beatmapset or a mapper!
-Optional
language?: Unspecified | English | Japanese | Chinese | Instrumental | Korean | French | German | Swedish | Spanish | Italian | Russian | Polish | OtherSpecify the spoken language of the music of the beatmapsets you're searching for (don't specify to get any language)
-"Any"/0 actually looks up sets that specifically have the Language "Any" (and no set has that), it's excluded because it's counter-intuitive +
Optional
hide_Use this to hide all sets that are marked as explicit
+Optional
keywords?: stringWhat you'd put in the searchbar, like the name of a beatmapset or a mapper!
+Optional
language?: Specify the spoken language of the music of the beatmapsets you're searching for (don't specify to get any language)
+Optional
mode?: RulesetOnly get sets that have maps that you can play in the ruleset of your choice
-Optional
played?: "Played" | "Unplayed"Does the authorized user with osu!supporter have already played those sets, or have they not played them yet?
-Optional
rank_Does the authorized user with osu!supporter have already achieved certain ranks on those sets?
-Optional
sort?: { Sort by what, in ascending/descending order
-This does not bypass the current osu!supporter requirement for certain filters
-Relevant Beatmapsets that contain Beatmaps, and a cursor_string to allow you to look for more of the same!
-Readonly
getGet details about the version/update/build of something related to osu!
-Readonly
getGet up to 21 versions/updates/builds!
-Optional
stream: stringOptional
range: { Optional
from?: stringThe name of the build
-Optional
to?: string | numberThe name or the id of the build
-Readonly
getAn effective way to get all available streams, as well as their latest version!
-Readonly
lookupGet details about the version/update/build of something related to osu!
-Readonly
createCreate a new announcement!
-From my understanding, this WILL 403 unless the user is kinda special
-The newly created channel!
-Readonly
createCreate/Open/Join a private messages chat channel!
-The newly created channel!
-Readonly
getGet a ChatChannel that you have joined, and the users in it if it is a private channel!
-Will 404 if the user has not joined the channel (use joinChatChannel
for that)
Readonly
getGet a list of all publicly joinable channels!
-Readonly
getGet the recent messages of a specific ChatChannel!
-Readonly
joinJoin a public or multiplayer ChatChannel, allowing you to interact with it!
-Readonly
keepNeeds to be done periodically to reset chat activity timeout
-Optional
since: { Optional
message?: number | MessageOptional
user_Every 30 seconds is a good idea
-A list of recent silences
-Readonly
leaveLeave/Close a public ChatChannel!
-Readonly
markMark a certain channel as read up to a given message!
-Readonly
sendSend a message in a ChatChannel!
-The newly sent ChatMessage!
-Readonly
sendSend a private message to someone!
-You don't need to use createChatPrivateChannel
before sending a message
The message you sent
-Readonly
getGet a specific comment by using its id!
-Readonly
getGet comments that meet any of your requirements!
-Optional
from: { Optional
parent: number | CommentOptional
sort: { Optional
after?: number | CommentOptional
cursor?: null | { Optional
type?: "new" | "top" | "old"Readonly
getGet everything note-worthy that happened on osu! recently!
-Readonly
createCreate a new ForumTopic in the forum of your choice!
-Optional
poll: { Optional
hide_Should the results of the poll be hidden while the voting period is still active? (defaults to false)
+Optional
mode?: RulesetOnly get sets that have maps that you can play in the ruleset of your choice
+Optional
played?: "Played" | "Unplayed"Does the authorized user with osu!supporter have already played those sets, or have they not played them yet?
+Optional
rank_Does the authorized user with osu!supporter have already achieved certain ranks on those sets?
+Optional
sort?: { Sort by what, in ascending/descending order
+Relevant Beatmapsets that contain Beatmaps, and a cursor_string to allow you to look for more of the same!
+Readonly
getGet details about the version/update/build of something related to osu!
+Get details about the version/update/build of something related to osu!
+The name of the thing related to osu!, like lazer
, web
, cuttingedge
, beta40
, stable40
The name of the version! Usually something like 2023.1026.0
for lazer, or 20230326
for stable
Readonly
getGet up to 21 versions/updates/builds!
+Get up to 21 versions/updates/builds!
+Optional
stream: stringOnly get builds from a specific stream
+Optional
range: { Get builds that were released before/after (and including) those builds
+Optional
from?: stringThe name of the build
+Optional
to?: string | numberThe name or the id of the build
+changelog_entries
will have a message
property if markdown
, message_html
property if html
(defaults to both)
Readonly
getAn effective way to get all available streams, as well as their latest version!
+An effective way to get all available streams, as well as their latest version!
+Readonly
lookupGet details about the version/update/build of something related to osu!
+Get details about the version/update/build of something related to osu!
+A stream name like lazer
, a build version like 2023.1026.0
, or the id of a build
changelog_entries
will have a message
property if markdown
, message_html
property if html
(defaults to both)
Readonly
createCreate a new announcement!
+Readonly
createCreate/Open/Join a private messages chat channel!
+Readonly
getGet a ChatChannel that you have joined, and the users in it if it is a private channel!
+Get a ChatChannel that you have joined, and the users in it if it is a private channel!
+Readonly
getGet a list of all publicly joinable channels!
+Readonly
getGet the recent messages of a specific ChatChannel!
+Get the recent messages of a specific ChatChannel!
+The Channel you wanna get the messages from
+The maximum amount of messages you want to get, up to 50! (defaults to 20)
+Optional
since: number | MessageGet the messages sent after this message
+Optional
until: number | MessageGet the messages sent up to but not including this message
+Readonly
joinJoin a public or multiplayer ChatChannel, allowing you to interact with it!
+Join a public or multiplayer ChatChannel, allowing you to interact with it!
+Readonly
keepNeeds to be done periodically to reset chat activity timeout
+Needs to be done periodically to reset chat activity timeout
+Optional
since: { UserSilences that are before that will not be returned!
+Optional
message?: number | MessageOptional
user_A list of recent silences
+Readonly
leaveLeave/Close a public ChatChannel!
+Readonly
markMark a certain channel as read up to a given message!
+Readonly
sendSend a message in a ChatChannel!
+Readonly
sendSend a private message to someone!
+Readonly
getGet a specific comment by using its id!
+Readonly
getGet comments that meet any of your requirements!
+Get comments that meet any of your requirements!
+Optional
from: { From where are the comments coming from? Maybe a beatmapset, but then, which beatmapset?
+Optional
parent: number | CommentThe comments are replying to which comment? Make the id 0 to filter out replies (and only get top level comments)
+Optional
sort: { Should the comments be sorted by votes? Should they be from after a certain date? Maybe you can give a cursor?
+Optional
after?: number | CommentOptional
cursor?: null | { Optional
type?: "new" | "top" | "old"Readonly
getGet everything note-worthy that happened on osu! recently!
+Get everything note-worthy that happened on osu! recently!
+"id_asc" to have the oldest recent event first, "id_desc" to have the newest instead (defaults to id_desc)
+Optional
cursor_string: stringUse a response's cursor_string
with the same parameters to get the next "page" of results, so events
in this instance!
Readonly
createCreate a new ForumTopic in the forum of your choice!
+Create a new ForumTopic in the forum of your choice!
+The id of the forum you're creating your topic in
+The topic's title
+The first post's content/message
+Optional
poll: { If you want to make a poll, specify the parameters of that poll!
+Optional
hide_Should the results of the poll be hidden while the voting period is still active? (defaults to false)
Length of voting period in days, 0 means forever
-Optional
max_The maximum amount of votes per user! (defaults to 1)
+Optional
max_The maximum amount of votes per user! (defaults to 1)
The things the users can vote for
-Optional
vote_Do you allow users to change their vote? (defaults to false)
-Some users may not be allowed to do that, such as newly registered users, so this can 403 even with the right scopes
-An object with the topic you've made, and its first initial post (which uses your text
)
Readonly
editEdit a ForumPost! Note that it can be the initial one of a ForumTopic!
-The edited ForumPost
-Readonly
editEdit the title of a Forum.Topic!
-Use editForumPost
if you wanna edit the post at the top of the topic
The edited ForumTopic
-Readonly
getGet a forum topic, as well as its main post (content) and the posts that were sent in it!
-Optional
config: { Optional
cursor_Use a response's cursor_string
with the same parameters to get the next "page" of results, so posts
in this instance!
Optional
first_The id (or the post itself) of the first post to be returned in posts
(irrelevant if using a cursor_string
)
Optional
limit?: numberHow many posts
maximum, up to 50
Optional
sort?: "id_desc" | "id_asc""id_asc" to have the oldest post at the beginning of the posts
array, "id_desc" to have the newest instead
The oldest post of a topic is the text of a topic
-Readonly
replyMake and send a Forum.Post in a Forum.Topic!
-Replying when the last post was made by the authorized user will likely cause the server to return a 403
-The reply you've made, as a Forum.Post!
-Readonly
searchLook for a user like you would on the website!
-Readonly
searchLook for a wiki page like you would on the website!
-Readonly
getGet data about a lazer multiplayer room (realtime or playlists)!
-Readonly
getGet data about a lazer multiplayer room (realtime or playlists)!
-Optional
query: { Optional
first_Which match should be featured at index 0 of the returned array? Will get one with a similar id if it is unavailable
-You can use this argument differently to get all matches before/after (depending of query.sort
) a certain match,
+
Optional
vote_Do you allow users to change their vote? (defaults to false)
+An object with the topic you've made, and its first initial post (which uses your text
)
Readonly
editEdit a ForumPost! Note that it can be the initial one of a ForumTopic!
+Readonly
editEdit the title of a Forum.Topic!
+Readonly
getGet a forum topic, as well as its main post (content) and the posts that were sent in it!
+Get a forum topic, as well as its main post (content) and the posts that were sent in it!
+An object with the id of the topic in question
+Optional
config: { How many results maximum, how to sort them, etc...
+Optional
cursor_Use a response's cursor_string
with the same parameters to get the next "page" of results, so posts
in this instance!
Optional
first_The id (or the post itself) of the first post to be returned in posts
(irrelevant if using a cursor_string
)
Optional
limit?: numberHow many posts
maximum, up to 50
Optional
sort?: "id_desc" | "id_asc""id_asc" to have the oldest post at the beginning of the posts
array, "id_desc" to have the newest instead
Readonly
replyMake and send a Forum.Post in a Forum.Topic!
+Readonly
searchLook for a user like you would on the website!
+Look for a user like you would on the website!
+What you would put in the searchbar
+You normally get the first 20 results, but if page is 2, you'd get results 21 to 40 instead for example! (defaults to 1)
+Readonly
searchLook for a wiki page like you would on the website!
+Look for a wiki page like you would on the website!
+What you would put in the searchbar
+You normally get the first 50 results, but if page is 2, you'd get results 51 to 100 instead for example! (defaults to 1)
+Readonly
getGet data about a lazer multiplayer room (realtime or playlists)!
+Get data of a multiplayer lobby from the stable (non-lazer) client that have URLs with community/matches
or mp
The id of a match can be found at the end of its URL
+Optional
query: { Filter and limit the amount of events shown
+Optional
after?: number | Multiplayer.Match.EventFilter FOR events AFTER this one
+Optional
before?: number | Multiplayer.Match.EventFilter FOR events BEFORE this one
+Optional
limit?: numberFrom 1 to 101 events (defaults to 100)
+Readonly
getGet data about a lazer multiplayer room (realtime or playlists)!
+Get the info about several matches!
+Optional
query: { The id of the first match of the array, and the sorting and size of said array
+Optional
first_Which match should be featured at index 0 of the returned array? Will get one with a similar id if it is unavailable
+Optional
limit?: numberThe maximum amount of elements returned in the array (defaults to 50)
-Optional
sort?: "id_desc" | "id_asc""id_desc" has the biggest id (most recent start_time) at the beginning of the array, "id_asc" is the opposite (defaults to id_desc)
-Readonly
getGet data about a lazer multiplayer room (realtime or playlists)!
-Optional
cursor_string: stringReadonly
getGet data about a lazer multiplayer room (realtime or playlists)!
-Readonly
getGet data about a lazer multiplayer room (realtime or playlists)!
-Readonly
getGet data about a lazer multiplayer room (realtime or playlists)!
-Readonly
getGet a NewsPost, its content, and the NewsPosts right before and right after it!
-Readonly
getGet all the NewsPosts of a specific year!
-If the specified year is invalid/has no news, it fallbacks to the default year
-Readonly
getGet the replay for a score!
-The correctly encoded content of what would be a replay file (you can just fs.writeFileSync with it!)
-Readonly
getGet ALL legacy spotlights! (2009-2020, somewhat known as charts/ranking charts, available @ https://osu.ppy.sh/rankings/osu/charts)
-The data for newer spotlights (2020-, somewhat known as seasons) can be obtained through getRoom()
-but you can't really get the id of those newer spotlights without going through the website's URLs (https://osu.ppy.sh/seasons/latest) as far as I know :(
Get the backgrounds made and selected for this season or for last season!
+Optional
limit?: numberThe maximum amount of elements returned in the array (defaults to 50)
+Optional
sort?: "id_desc" | "id_asc""id_desc" has the biggest id (most recent start_time) at the beginning of the array, "id_asc" is the opposite (defaults to id_desc)
+Readonly
getGet data about a lazer multiplayer room (realtime or playlists)!
+Get the scores on a specific item of a room!
+An object with the id of the item in question, as well as the id of the room
+How many scores maximum? Defaults to 50, the maximum the API will return
+Sort by scores, ascending or descending? Defaults to descending
+Optional
cursor_string: stringUse a Multiplayer.Scores' params
and cursor_string
to get the next page (scores 51 to 100 for example)
(2024-03-04) This may not work for rooms from before March 5th 2024, use at your own risk +https://github.com/ppy/osu-web/issues/10725
+Readonly
getGet data about a lazer multiplayer room (realtime or playlists)!
+Readonly
getGet data about a lazer multiplayer room (realtime or playlists)!
+Get the room stats of all the users of that room!
+An object with the leaderboard, and the score and position of the authorized user under user_score
Readonly
getGet data about a lazer multiplayer room (realtime or playlists)!
+Get playlists/realtime rooms that are active, that have ended, that the user participated in, that the user made, or just simply any room!
+Whether the multiplayer rooms are in playlist format (like current spotlights) or realtime
+The state of the room, or the relation of the authorized user with the room
+The maximum amount of rooms to return, defaults to 10
+Sort (where most recent is first) by creation date or end date, defaults to the creation date
+Optional
season_id: numberOnly get rooms (playlists) that belong to a specific (modern) Beatmap Spotlights season id
+(so 5
'd be summer 2020's mania rooms, not winter 2022!!)
Readonly
getGet a NewsPost, its content, and the NewsPosts right before and right after it!
+Get a NewsPost, its content, and the NewsPosts right before and right after it!
+Readonly
getGet all the NewsPosts of a specific year!
+Readonly
getGet the replay for a score!
+Readonly
getGet ALL legacy spotlights! (2009-2020, somewhat known as charts/ranking charts, available @ https://osu.ppy.sh/rankings/osu/charts)
+Get ALL legacy spotlights! (2009-2020, somewhat known as charts/ranking charts, available @ https://osu.ppy.sh/rankings/osu/charts)
+The data for newer spotlights (2020-, somewhat known as seasons) can be obtained through getRoom()
+but you can't really get the id of those newer spotlights without going through the website's URLs (https://osu.ppy.sh/seasons/latest) as far as I know :(
The data for newer spotlights (2020-, somewhat known as seasons) can be obtained through getRoom()
+but you can't really get the id of those newer spotlights without going through the website's URLs (https://osu.ppy.sh/seasons/latest) as far as I know :(
Get the backgrounds made and selected for this season or for last season!
When the season ended, and for each background, its URL and its artist
-Readonly
getGet the top countries of a specific ruleset!
-Readonly
getGet the top 50 players who have the most total kudosu!
-Readonly
getGet the rankings of a spotlight from 2009 to 2020 on a specific ruleset!
-Readonly
getGet the top players of the game, with some filters!
-Optional
config: { Optional
country?: stringOnly get players from a specific country, using its ISO 3166-1 alpha-2 country code! (France would be FR
, United States US
)
Optional
filter?: "all" | "friends"What kind of players do you want to see? Keep in mind friends
has no effect if no authorized user
Optional
page?: numberImagine the array you get as a page, it can only have a maximum of 50 players, while 50 others may be on the next one
-Optional
variant?: "4k" | "7k"If type
is performance
and ruleset
is mania, choose between 4k and 7k!
Readonly
getGet user data of each friend of the authorized user
-Readonly
getGet extensive user data about the authorized user
-Readonly
getGet extensive user data about whoever you want!
-Readonly
getGet beatmaps favourited or made by a user!
-Readonly
getGet data about the activity of a user kudosu-wise!
-Readonly
getGet the beatmaps most played by a user!
-Readonly
getGet an array of Events of different type
s that relate to a user's activity during the last 31 days! (or 100 activities, whatever comes first)
Readonly
getGet "notable" scores from a user
-Readonly
getGet user data for up to 50 users at once!
-Readonly
getGet a wiki page!
-Readonly
getGet the top countries of a specific ruleset!
+Readonly
getGet the top 50 players who have the most total kudosu!
+Get the top 50 players who have the most total kudosu!
+Readonly
getGet the rankings of a spotlight from 2009 to 2020 on a specific ruleset!
+Get the rankings of a spotlight from 2009 to 2020 on a specific ruleset!
+Each spotlight has a different ranking (and often maps) depending on the ruleset
+The spotlight in question
+What kind of players do you want to see? Keep in mind friends
has no effect if no authorized user (defaults to all)
Readonly
getGet the top players of the game, with some filters!
+Get the top players of the game, with some filters!
+Self-explanatory, is also known as "Gamemode"
+Rank players by their performance points or by their ranked score?
+Optional
config: { Specify which page, country, filter out non-friends...
+Optional
country?: stringOnly get players from a specific country, using its ISO 3166-1 alpha-2 country code! (France would be FR
, United States US
)
Optional
filter?: "all" | "friends"What kind of players do you want to see? Keep in mind friends
has no effect if no authorized user
Optional
page?: numberImagine the array you get as a page, it can only have a maximum of 50 players, while 50 others may be on the next one
+Optional
variant?: "4k" | "7k"If type
is performance
and ruleset
is mania, choose between 4k and 7k!
Readonly
getGet user data of each friend of the authorized user
+Get user data of each friend of the authorized user
+Readonly
getGet extensive user data about the authorized user
+Get extensive user data about the authorized user
+Readonly
getGet extensive user data about whoever you want!
+Readonly
getGet beatmaps favourited or made by a user!
+Get beatmaps favourited or made by a user!
+Readonly
getGet data about the activity of a user kudosu-wise!
+Get data about the activity of a user kudosu-wise!
+Readonly
getGet the beatmaps most played by a user!
+Readonly
getGet an array of Events of different type
s that relate to a user's activity during the last 31 days! (or 100 activities, whatever comes first)
Get an array of Events of different type
s that relate to a user's activity during the last 31 days! (or 100 activities, whatever comes first)
Readonly
getGet "notable" scores from a user
+Get "notable" scores from a user
+The user who set the scores
+Do you want scores: in the user's top 100, that are top 1 on a beatmap, that have been recently set?
+Optional
ruleset: RulesetThe Ruleset the scores were made in (defaults to user's default Ruleset)
+Do you also want lazer scores and failed scores? (defaults to true for lazer & false for fails)
+Optional
fails?: booleanOptional
lazer?: booleanOptional
config: User.ConfigArray limit & offset
+Readonly
getGet user data for up to 50 users at once!
+Get user data for up to 50 users at once!
+Readonly
getGet a wiki page!
+Get a wiki page!
+What's in the page's URL after https://osu.ppy.sh/wiki/
(so the title, after the subtitle if there is a subtitle)
+(An example for https://osu.ppy.sh/wiki/en/Game_mode/osu!
would be Game_mode/osu!
)
The BCP 47 language (sub)tag lowercase (for example, for a french WikiPage, use "fr") (defaults to en)
+The type of resource that was requested from the server
-The reason why things didn't go as expected
-The method used for this request (like "get", "post", etc...)
-Optional
original_The error that caused the api to throw an APIError in the first place, if there is one
-The filters that were used to specify what resource was wanted
-The server to which the request was sent
-Optional
status_The status code that was returned by the server, if there is one
-The type of resource that was requested from the server
+The reason why things didn't go as expected
+The method used for this request (like "get", "post", etc...)
+Optional
original_The error that caused the api to throw an APIError in the first place, if there is one
+The filters that were used to specify what resource was wanted
+The server to which the request was sent
+Optional
status_The status code that was returned by the server, if there is one
+Created with API.withSettings, this special version of the API specifies additional settings to every request!
-This is not to be used for any purpose other than calling methods; The original ChildAPI.original handles tokens & configuration
-Created with API.withSettings, this special version of the API specifies additional settings to every request!
+This is not to be used for any purpose other than calling methods; The original ChildAPI.original handles tokens & configuration
+The additional settings that are used for every request made by this object
-The API where API.withSettings was used; this ChildAPI
gets everything from it!
The function that directly communicates with the API! Almost every functions of the API object uses this function!
-Rest
...args: [method: "get" | "post" | "put" | "delete", endpoint: string, parameters: { The type of request, each endpoint uses a specific one (if it uses multiple, the intent and parameters become different)
-A Promise with the API's response
-Static
createThe normal way to create an API instance! Make sure to await
it
The additional settings that are used for every request made by this object
+The API where API.withSettings was used; this ChildAPI
gets everything from it!
The function that directly communicates with the API! Almost every functions of the API object uses this function!
+Rest
...args: [method: The type of request, each endpoint uses a specific one (if it uses multiple, the intent and parameters become different)
+A Promise with the API's response
+Static
createThe normal way to create an API instance! Make sure to await
it
The ID and the secret of your client, can be found on https://osu.ppy.sh/home/account/edit#new-oauth-application
-Optional
user: { If the instance is supposed to represent a user, use their Authorization Code and the Application Callback URL of your application!
+Optional
user: { If the instance is supposed to represent a user, use their Authorization Code and the Application Callback URL of your application!
The code that appeared as a GET argument when they got redirected to the Application Callback URL (redirect_uri
)
The Application Callback URL; Where the User has been redirected to after saying "okay" to your application doing stuff
-Optional
verbose: "all" | "none" | "errors"Optional
server: stringOptional
timeout: numberIn seconds
+Optional
verbose: "all" | "none" | "errors"Optional
server: stringOptional
timeout: numberA promise with an API instance
-Readonly
getGet extensive beatmap data about whichever beatmap you want!
-Readonly
getGet various data about the difficulty of a beatmap!
-You may want to use api.getBeatmapDifficultyAttributesOsu (or Taiko or whatever) instead for better type safety
-Readonly
getGet various data about the difficulty of a ctb beatmap!
-Readonly
getGet various data about the difficulty of a mania beatmap!
-Readonly
getGet various data about the difficulty of an osu! beatmap!
-Readonly
getGet various data about the difficulty of a taiko beatmap!
-Readonly
getGet data about a Beatmap.Pack using its tag!
-Currently in https://osu.ppy.sh/beatmaps/packs, when hovering a pack, its URL with its tag should be preview by your browser
-Readonly
getGet an Array of up to 100 Beatmap.Packs of a specific type!
-Optional
cursor_string: stringReadonly
getGet the top scores of a beatmap!
-Please check if mods
and type
seem to be supported or not by the API: https://osu.ppy.sh/docs/index.html#get-beatmap-scores
Readonly
getGet the top scores of a beatmap, in the "solo score" format lazer brought with it! +
Readonly
getGet extensive beatmap data about whichever beatmap you want!
+Get extensive beatmap data about whichever beatmap you want!
+Readonly
getGet various data about the difficulty of a beatmap!
+Get various data about the difficulty of a beatmap!
+The Beatmap in question
+Optional
mods: number | string[] | Mod[]Can be a bitset of mods, an array of mod acronyms, or an array of Mods (ignores mod settings) (defaults to No Mod)
+Optional
ruleset: RulesetUseful to specify if the beatmap is a convert (defaults to the ruleset the beatmap was intended for)
+Readonly
getGet various data about the difficulty of a ctb beatmap!
+Readonly
getGet various data about the difficulty of a mania beatmap!
+Readonly
getGet various data about the difficulty of an osu! beatmap!
+Readonly
getGet various data about the difficulty of a taiko beatmap!
+Readonly
getGet data about a Beatmap.Pack using its tag!
+Get data about a Beatmap.Pack using its tag!
+Currently in https://osu.ppy.sh/beatmaps/packs, when hovering a pack, its URL with its tag should be preview by your browser
+Currently in https://osu.ppy.sh/beatmaps/packs, when hovering a pack, its URL with its tag should be preview by your browser
+Readonly
getGet an Array of up to 100 Beatmap.Packs of a specific type!
+Get an Array of up to 100 Beatmap.Packs of a specific type!
+The type of the BeatmapPacks (defaults to standard)
+Optional
cursor_string: stringUse a response's cursor_string
with the same parameters to get the next "page" of results!
Readonly
getGet the top scores of a beatmap!
+Get the top scores of a beatmap!
+Please check if mods
and type
seem to be supported or not by the API: https://osu.ppy.sh/docs/index.html#get-beatmap-scores
Please check if mods
and type
seem to be supported or not by the API: https://osu.ppy.sh/docs/index.html#get-beatmap-scores
Readonly
getGet the top scores of a beatmap, in the "solo score" format lazer brought with it! More info on GitHub if needed https://github.com/ppy/osu-infrastructure/blob/master/score-submission.md
-Please check if mods
and type
seem to be supported or not by the API: https://osu.ppy.sh/docs/index.html#get-beatmap-scores-non-legacy
Readonly
getGet the score on a beatmap made by a specific user (with specific mods and on a specific ruleset if needed)
-An Object with the position of the score according to the specified Mods and Ruleset, and with the score itself
-Readonly
getGet the scores on a beatmap made by a specific user (with the possibility to specify if the scores are on a convert)
-Readonly
getGet extensive beatmap data for up to 50 beatmaps at once!
-Readonly
lookupGet extensive beatmap data about whichever beatmap you want!
-Optional
checksum?: stringOptional
filename?: stringOptional
id?: numberReadonly
getGet extensive beatmapset data about whichever beatmapset you want!
-Readonly
getGet complex data about the posts of a beatmapset's discussion or of a user!
-Optional
from: { Optional
discussion?: number | DiscussionOptional
user?: number | UserOptional
types: ("first" | "reply" | "system")[]Optional
config: Beatmapset.Config(2024-03-11) For months now, the API's documentation says the response is likely to change, so beware
-Relevant posts and info about them
-Readonly
getGet complex data about the votes of a beatmapset's discussions or/and received/given by a specific user!
-Optional
from: { Optional
discussion?: number | DiscussionOptional
vote_Optional
vote_Optional
score: 1 | -1Optional
config: Beatmapset.Config(2024-03-11) For months now, the API's documentation says the response is likely to change, so beware
-Relevant votes and info about them
-Readonly
getGet complex data about the discussion page of any beatmapet that you want!
-Optional
from: { Optional
beatmapset?: number | BeatmapsetOptional
status?: "all" | "ranked" | "qualified" | "disqualified" | "never_qualified"Optional
user?: number | UserOptional
filter: { Optional
only_Optional
types?: ("suggestion" | "problem" | "mapper_note" | "praise" | "hype" | "review")[]Optional
config: Beatmapset.Config(2024-03-11) For months now, the API's documentation says the response is likely to change, so beware
-Relevant discussions and info about them
-Readonly
getGet complex data about the events of a beatmapset and the users involved with them!
-Optional
from: { Optional
beatmapset?: number | BeatmapsetOptional
max_Optional
min_Optional
user?: number | UserOptional
types: ("nominate" | "love" | "remove_from_loved" | "qualify" | "disqualify" | "approve" | "rank" | "kudosu_allow" | "kudosu_deny" | "kudosu_gain" | "kudosu_lost" | "kudosu_recalculate" | "issue_resolve" | "issue_reopen" | "discussion_lock" | "discussion_unlock" | "discussion_delete" | "discussion_restore" | "discussion_post_delete" | "discussion_post_restore" | "nomination_reset" | "nomination_reset_received" | "genre_edit" | "language_edit" | "nsfw_toggle" | "offset_edit" | "tags_edit" | "beatmap_owner_change")[]Optional
config: Beatmapset.Config(2024-03-11) For months now, the API's documentation says the response is likely to change, so beware, -and also there's no documentation for this route in the API, so this is only the result of my interpretation of the website's code lol
-Relevant events and users
-Readonly
lookupGet extensive data about a beatmapset by using a beatmap!
-Readonly
searchSearch for beatmapsets as if you were on the website or on lazer!
-Optional
query: { Optional
categories?: "Any" | "Ranked" | "Qualified" | "Loved" | "Favourites" | "Pending" | "WIP" | "Graveyard" | "My Maps"Filter in sets depending on their status or on their relation with the authorized user (defaults to all that have a leaderboard)
-Optional
cursor_The thing you've got from a previous request to get another page of results!
-Optional
extra?: ("must_have_video" | "must_have_storyboard")[]Should all sets have a video, a storyboard, maybe both at once?
-Optional
general?: ("Recommended difficulty" | "Include converted beatmaps" | "Subscribed mappers" | "Spotlighted beatmaps" | "Featured Artists")[]Various filters to activate
-Optional
genre?: Unspecified | any[any] | Anime | Rock | Pop | Other | Novelty | any[any] | Electronic | Metal | Classical | Folk | JazzSpecify the musical genre of the music of the beatmapsets you're searching for (don't specify to get any genre)
-"Any"/0 actually looks up sets that specifically have the Genre "Any" such as 5947
, it's excluded because it's counter-intuitive
+
Get the top scores of a beatmap, in the "solo score" format lazer brought with it! +More info on GitHub if needed https://github.com/ppy/osu-infrastructure/blob/master/score-submission.md
+Please check if mods
and type
seem to be supported or not by the API: https://osu.ppy.sh/docs/index.html#get-beatmap-scores-non-legacy
Please check if mods
and type
seem to be supported or not by the API: https://osu.ppy.sh/docs/index.html#get-beatmap-scores-non-legacy
Readonly
getGet the score on a beatmap made by a specific user (with specific mods and on a specific ruleset if needed)
+Get the score on a beatmap made by a specific user (with specific mods and on a specific ruleset if needed)
+An Object with the position of the score according to the specified Mods and Ruleset, and with the score itself
+Readonly
getGet the scores on a beatmap made by a specific user (with the possibility to specify if the scores are on a convert)
+Readonly
getGet extensive beatmap data for up to 50 beatmaps at once!
+Get extensive beatmap data for up to 50 beatmaps at once!
+Readonly
lookupGet extensive beatmap data about whichever beatmap you want!
+Get extensive beatmap data about whichever beatmap you want!
+What to specify in order to find the right beatmap
+Optional
checksum?: stringOptional
filename?: stringOptional
id?: numberReadonly
getGet extensive beatmapset data about whichever beatmapset you want!
+Get extensive beatmapset data about whichever beatmapset you want!
+The beatmapset or the id of the beatmapset you're trying to get
+Readonly
getGet complex data about the posts of a beatmapset's discussion or of a user!
+Get complex data about the posts of a beatmapset's discussion or of a user!
+Optional
from: { From where/who are the posts coming from? A specific discussion, a specific user?
+Optional
discussion?: number | DiscussionOptional
user?: number | UserOptional
types: ("first" | "reply" | "system")[]What kind of posts?
+Optional
config: Beatmapset.ConfigHow many results maximum, how to sort them, which page of those, maybe a cursor_string...
+Relevant posts and info about them
+Readonly
getGet complex data about the votes of a beatmapset's discussions or/and received/given by a specific user!
+Get complex data about the votes of a beatmapset's discussions or/and received/given by a specific user!
+Optional
from: { The discussion with the votes, the user who voted, the user who's gotten the votes...
+Optional
discussion?: number | DiscussionOptional
vote_Optional
vote_Optional
score: 1 | -1An upvote (1) or a downvote (-1)
+Optional
config: Beatmapset.ConfigHow many results maximum, how to sort them, which page of those, maybe a cursor_string...
+Relevant votes and info about them
+Readonly
getGet complex data about the discussion page of any beatmapet that you want!
+Get complex data about the discussion page of any beatmapet that you want!
+Optional
from: { From where/who are the discussions coming from? Maybe only qualified sets?
+Optional
beatmapset?: number | BeatmapsetOptional
status?: Optional
user?: number | UserOptional
filter: { Should those discussions only be unresolved problems, for example?
+Optional
only_Optional
types?: (Optional
config: Beatmapset.ConfigHow many results maximum, how to sort them, which page of those, maybe a cursor_string...
+Relevant discussions and info about them
+Readonly
getGet complex data about the events of a beatmapset and the users involved with them!
+Get complex data about the events of a beatmapset and the users involved with them!
+Optional
from: { Which beatmapset, or caused by which user? When?
+Optional
beatmapset?: number | BeatmapsetOptional
max_Optional
min_Optional
user?: number | UserOptional
types: (What kinds of events?
+Optional
config: Beatmapset.ConfigHow many results maximum, how to sort them, which page of those, maybe a cursor_string...
+Relevant events and users
+Readonly
lookupGet extensive data about a beatmapset by using a beatmap!
+Readonly
searchSearch for beatmapsets as if you were on the website or on lazer!
+Search for beatmapsets as if you were on the website or on lazer!
+Optional
query: { All the filters and sorting options that you'd normally find on the website or on lazer
+Optional
categories?: Filter in sets depending on their status or on their relation with the authorized user (defaults to all that have a leaderboard)
+Optional
cursor_The thing you've got from a previous request to get another page of results!
+Optional
extra?: ("must_have_video" | "must_have_storyboard")[]Should all sets have a video, a storyboard, maybe both at once?
+Optional
general?: (Various filters to activate
+Optional
genre?: Specify the musical genre of the music of the beatmapsets you're searching for (don't specify to get any genre)
+Optional
hide_Use this to hide all sets that are marked as explicit
-Optional
keywords?: stringWhat you'd put in the searchbar, like the name of a beatmapset or a mapper!
-Optional
language?: Unspecified | English | Japanese | Chinese | Instrumental | Korean | French | German | Swedish | Spanish | Italian | Russian | Polish | OtherSpecify the spoken language of the music of the beatmapsets you're searching for (don't specify to get any language)
-"Any"/0 actually looks up sets that specifically have the Language "Any" (and no set has that), it's excluded because it's counter-intuitive +
Optional
hide_Use this to hide all sets that are marked as explicit
+Optional
keywords?: stringWhat you'd put in the searchbar, like the name of a beatmapset or a mapper!
+Optional
language?: Specify the spoken language of the music of the beatmapsets you're searching for (don't specify to get any language)
+Optional
mode?: RulesetOnly get sets that have maps that you can play in the ruleset of your choice
-Optional
played?: "Played" | "Unplayed"Does the authorized user with osu!supporter have already played those sets, or have they not played them yet?
-Optional
rank_Does the authorized user with osu!supporter have already achieved certain ranks on those sets?
-Optional
sort?: { Sort by what, in ascending/descending order
-This does not bypass the current osu!supporter requirement for certain filters
-Relevant Beatmapsets that contain Beatmaps, and a cursor_string to allow you to look for more of the same!
-Readonly
getGet details about the version/update/build of something related to osu!
-Readonly
getGet up to 21 versions/updates/builds!
-Optional
stream: stringOptional
range: { Optional
from?: stringThe name of the build
-Optional
to?: string | numberThe name or the id of the build
-Readonly
getAn effective way to get all available streams, as well as their latest version!
-Readonly
lookupGet details about the version/update/build of something related to osu!
-Readonly
createCreate a new announcement!
-From my understanding, this WILL 403 unless the user is kinda special
-The newly created channel!
-Readonly
createCreate/Open/Join a private messages chat channel!
-The newly created channel!
-Readonly
getGet a ChatChannel that you have joined, and the users in it if it is a private channel!
-Will 404 if the user has not joined the channel (use joinChatChannel
for that)
Readonly
getGet a list of all publicly joinable channels!
-Readonly
getGet the recent messages of a specific ChatChannel!
-Readonly
joinJoin a public or multiplayer ChatChannel, allowing you to interact with it!
-Readonly
keepNeeds to be done periodically to reset chat activity timeout
-Optional
since: { Optional
message?: number | MessageOptional
user_Every 30 seconds is a good idea
-A list of recent silences
-Readonly
leaveLeave/Close a public ChatChannel!
-Readonly
markMark a certain channel as read up to a given message!
-Readonly
sendSend a message in a ChatChannel!
-The newly sent ChatMessage!
-Readonly
sendSend a private message to someone!
-You don't need to use createChatPrivateChannel
before sending a message
The message you sent
-Readonly
getGet a specific comment by using its id!
-Readonly
getGet comments that meet any of your requirements!
-Optional
from: { Optional
parent: number | CommentOptional
sort: { Optional
after?: number | CommentOptional
cursor?: null | { Optional
type?: "new" | "top" | "old"Readonly
getGet everything note-worthy that happened on osu! recently!
-Readonly
createCreate a new ForumTopic in the forum of your choice!
-Optional
poll: { Optional
hide_Should the results of the poll be hidden while the voting period is still active? (defaults to false)
+Optional
mode?: RulesetOnly get sets that have maps that you can play in the ruleset of your choice
+Optional
played?: "Played" | "Unplayed"Does the authorized user with osu!supporter have already played those sets, or have they not played them yet?
+Optional
rank_Does the authorized user with osu!supporter have already achieved certain ranks on those sets?
+Optional
sort?: { Sort by what, in ascending/descending order
+Relevant Beatmapsets that contain Beatmaps, and a cursor_string to allow you to look for more of the same!
+Readonly
getGet details about the version/update/build of something related to osu!
+Get details about the version/update/build of something related to osu!
+The name of the thing related to osu!, like lazer
, web
, cuttingedge
, beta40
, stable40
The name of the version! Usually something like 2023.1026.0
for lazer, or 20230326
for stable
Readonly
getGet up to 21 versions/updates/builds!
+Get up to 21 versions/updates/builds!
+Optional
stream: stringOnly get builds from a specific stream
+Optional
range: { Get builds that were released before/after (and including) those builds
+Optional
from?: stringThe name of the build
+Optional
to?: string | numberThe name or the id of the build
+changelog_entries
will have a message
property if markdown
, message_html
property if html
(defaults to both)
Readonly
getAn effective way to get all available streams, as well as their latest version!
+An effective way to get all available streams, as well as their latest version!
+Readonly
lookupGet details about the version/update/build of something related to osu!
+Get details about the version/update/build of something related to osu!
+A stream name like lazer
, a build version like 2023.1026.0
, or the id of a build
changelog_entries
will have a message
property if markdown
, message_html
property if html
(defaults to both)
Readonly
createCreate a new announcement!
+Readonly
createCreate/Open/Join a private messages chat channel!
+Readonly
getGet a ChatChannel that you have joined, and the users in it if it is a private channel!
+Get a ChatChannel that you have joined, and the users in it if it is a private channel!
+Readonly
getGet a list of all publicly joinable channels!
+Readonly
getGet the recent messages of a specific ChatChannel!
+Get the recent messages of a specific ChatChannel!
+The Channel you wanna get the messages from
+The maximum amount of messages you want to get, up to 50! (defaults to 20)
+Optional
since: number | MessageGet the messages sent after this message
+Optional
until: number | MessageGet the messages sent up to but not including this message
+Readonly
joinJoin a public or multiplayer ChatChannel, allowing you to interact with it!
+Join a public or multiplayer ChatChannel, allowing you to interact with it!
+Readonly
keepNeeds to be done periodically to reset chat activity timeout
+Needs to be done periodically to reset chat activity timeout
+Optional
since: { UserSilences that are before that will not be returned!
+Optional
message?: number | MessageOptional
user_A list of recent silences
+Readonly
leaveLeave/Close a public ChatChannel!
+Readonly
markMark a certain channel as read up to a given message!
+Readonly
sendSend a message in a ChatChannel!
+Readonly
sendSend a private message to someone!
+Readonly
getGet a specific comment by using its id!
+Readonly
getGet comments that meet any of your requirements!
+Get comments that meet any of your requirements!
+Optional
from: { From where are the comments coming from? Maybe a beatmapset, but then, which beatmapset?
+Optional
parent: number | CommentThe comments are replying to which comment? Make the id 0 to filter out replies (and only get top level comments)
+Optional
sort: { Should the comments be sorted by votes? Should they be from after a certain date? Maybe you can give a cursor?
+Optional
after?: number | CommentOptional
cursor?: null | { Optional
type?: "new" | "top" | "old"Readonly
getGet everything note-worthy that happened on osu! recently!
+Get everything note-worthy that happened on osu! recently!
+"id_asc" to have the oldest recent event first, "id_desc" to have the newest instead (defaults to id_desc)
+Optional
cursor_string: stringUse a response's cursor_string
with the same parameters to get the next "page" of results, so events
in this instance!
Readonly
createCreate a new ForumTopic in the forum of your choice!
+Create a new ForumTopic in the forum of your choice!
+The id of the forum you're creating your topic in
+The topic's title
+The first post's content/message
+Optional
poll: { If you want to make a poll, specify the parameters of that poll!
+Optional
hide_Should the results of the poll be hidden while the voting period is still active? (defaults to false)
Length of voting period in days, 0 means forever
-Optional
max_The maximum amount of votes per user! (defaults to 1)
+Optional
max_The maximum amount of votes per user! (defaults to 1)
The things the users can vote for
-Optional
vote_Do you allow users to change their vote? (defaults to false)
-Some users may not be allowed to do that, such as newly registered users, so this can 403 even with the right scopes
-An object with the topic you've made, and its first initial post (which uses your text
)
Readonly
editEdit a ForumPost! Note that it can be the initial one of a ForumTopic!
-The edited ForumPost
-Readonly
editEdit the title of a Forum.Topic!
-Use editForumPost
if you wanna edit the post at the top of the topic
The edited ForumTopic
-Readonly
getGet a forum topic, as well as its main post (content) and the posts that were sent in it!
-Optional
config: { Optional
cursor_Use a response's cursor_string
with the same parameters to get the next "page" of results, so posts
in this instance!
Optional
first_The id (or the post itself) of the first post to be returned in posts
(irrelevant if using a cursor_string
)
Optional
limit?: numberHow many posts
maximum, up to 50
Optional
sort?: "id_desc" | "id_asc""id_asc" to have the oldest post at the beginning of the posts
array, "id_desc" to have the newest instead
The oldest post of a topic is the text of a topic
-Readonly
replyMake and send a Forum.Post in a Forum.Topic!
-Replying when the last post was made by the authorized user will likely cause the server to return a 403
-The reply you've made, as a Forum.Post!
-Readonly
searchLook for a user like you would on the website!
-Readonly
searchLook for a wiki page like you would on the website!
-Readonly
getGet data about a lazer multiplayer room (realtime or playlists)!
-Readonly
getGet data about a lazer multiplayer room (realtime or playlists)!
-Optional
query: { Optional
first_Which match should be featured at index 0 of the returned array? Will get one with a similar id if it is unavailable
-You can use this argument differently to get all matches before/after (depending of query.sort
) a certain match,
+
Optional
vote_Do you allow users to change their vote? (defaults to false)
+An object with the topic you've made, and its first initial post (which uses your text
)
Readonly
editEdit a ForumPost! Note that it can be the initial one of a ForumTopic!
+Readonly
editEdit the title of a Forum.Topic!
+Readonly
getGet a forum topic, as well as its main post (content) and the posts that were sent in it!
+Get a forum topic, as well as its main post (content) and the posts that were sent in it!
+An object with the id of the topic in question
+Optional
config: { How many results maximum, how to sort them, etc...
+Optional
cursor_Use a response's cursor_string
with the same parameters to get the next "page" of results, so posts
in this instance!
Optional
first_The id (or the post itself) of the first post to be returned in posts
(irrelevant if using a cursor_string
)
Optional
limit?: numberHow many posts
maximum, up to 50
Optional
sort?: "id_desc" | "id_asc""id_asc" to have the oldest post at the beginning of the posts
array, "id_desc" to have the newest instead
Readonly
replyMake and send a Forum.Post in a Forum.Topic!
+Readonly
searchLook for a user like you would on the website!
+Look for a user like you would on the website!
+What you would put in the searchbar
+You normally get the first 20 results, but if page is 2, you'd get results 21 to 40 instead for example! (defaults to 1)
+Readonly
searchLook for a wiki page like you would on the website!
+Look for a wiki page like you would on the website!
+What you would put in the searchbar
+You normally get the first 50 results, but if page is 2, you'd get results 51 to 100 instead for example! (defaults to 1)
+Readonly
getGet data about a lazer multiplayer room (realtime or playlists)!
+Get data of a multiplayer lobby from the stable (non-lazer) client that have URLs with community/matches
or mp
The id of a match can be found at the end of its URL
+Optional
query: { Filter and limit the amount of events shown
+Optional
after?: number | Multiplayer.Match.EventFilter FOR events AFTER this one
+Optional
before?: number | Multiplayer.Match.EventFilter FOR events BEFORE this one
+Optional
limit?: numberFrom 1 to 101 events (defaults to 100)
+Readonly
getGet data about a lazer multiplayer room (realtime or playlists)!
+Get the info about several matches!
+Optional
query: { The id of the first match of the array, and the sorting and size of said array
+Optional
first_Which match should be featured at index 0 of the returned array? Will get one with a similar id if it is unavailable
+Optional
limit?: numberThe maximum amount of elements returned in the array (defaults to 50)
-Optional
sort?: "id_desc" | "id_asc""id_desc" has the biggest id (most recent start_time) at the beginning of the array, "id_asc" is the opposite (defaults to id_desc)
-Readonly
getGet data about a lazer multiplayer room (realtime or playlists)!
-Optional
cursor_string: stringReadonly
getGet data about a lazer multiplayer room (realtime or playlists)!
-Readonly
getGet data about a lazer multiplayer room (realtime or playlists)!
-Readonly
getGet data about a lazer multiplayer room (realtime or playlists)!
-Readonly
getGet a NewsPost, its content, and the NewsPosts right before and right after it!
-Readonly
getGet all the NewsPosts of a specific year!
-If the specified year is invalid/has no news, it fallbacks to the default year
-Readonly
getGet the replay for a score!
-The correctly encoded content of what would be a replay file (you can just fs.writeFileSync with it!)
-Readonly
getGet ALL legacy spotlights! (2009-2020, somewhat known as charts/ranking charts, available @ https://osu.ppy.sh/rankings/osu/charts)
-The data for newer spotlights (2020-, somewhat known as seasons) can be obtained through getRoom()
-but you can't really get the id of those newer spotlights without going through the website's URLs (https://osu.ppy.sh/seasons/latest) as far as I know :(
Get the backgrounds made and selected for this season or for last season!
+Optional
limit?: numberThe maximum amount of elements returned in the array (defaults to 50)
+Optional
sort?: "id_desc" | "id_asc""id_desc" has the biggest id (most recent start_time) at the beginning of the array, "id_asc" is the opposite (defaults to id_desc)
+Readonly
getGet data about a lazer multiplayer room (realtime or playlists)!
+Get the scores on a specific item of a room!
+An object with the id of the item in question, as well as the id of the room
+How many scores maximum? Defaults to 50, the maximum the API will return
+Sort by scores, ascending or descending? Defaults to descending
+Optional
cursor_string: stringUse a Multiplayer.Scores' params
and cursor_string
to get the next page (scores 51 to 100 for example)
(2024-03-04) This may not work for rooms from before March 5th 2024, use at your own risk +https://github.com/ppy/osu-web/issues/10725
+Readonly
getGet data about a lazer multiplayer room (realtime or playlists)!
+Readonly
getGet data about a lazer multiplayer room (realtime or playlists)!
+Get the room stats of all the users of that room!
+An object with the leaderboard, and the score and position of the authorized user under user_score
Readonly
getGet data about a lazer multiplayer room (realtime or playlists)!
+Get playlists/realtime rooms that are active, that have ended, that the user participated in, that the user made, or just simply any room!
+Whether the multiplayer rooms are in playlist format (like current spotlights) or realtime
+The state of the room, or the relation of the authorized user with the room
+The maximum amount of rooms to return, defaults to 10
+Sort (where most recent is first) by creation date or end date, defaults to the creation date
+Optional
season_id: numberOnly get rooms (playlists) that belong to a specific (modern) Beatmap Spotlights season id
+(so 5
'd be summer 2020's mania rooms, not winter 2022!!)
Readonly
getGet a NewsPost, its content, and the NewsPosts right before and right after it!
+Get a NewsPost, its content, and the NewsPosts right before and right after it!
+Readonly
getGet all the NewsPosts of a specific year!
+Readonly
getGet the replay for a score!
+Readonly
getGet ALL legacy spotlights! (2009-2020, somewhat known as charts/ranking charts, available @ https://osu.ppy.sh/rankings/osu/charts)
+Get ALL legacy spotlights! (2009-2020, somewhat known as charts/ranking charts, available @ https://osu.ppy.sh/rankings/osu/charts)
+The data for newer spotlights (2020-, somewhat known as seasons) can be obtained through getRoom()
+but you can't really get the id of those newer spotlights without going through the website's URLs (https://osu.ppy.sh/seasons/latest) as far as I know :(
The data for newer spotlights (2020-, somewhat known as seasons) can be obtained through getRoom()
+but you can't really get the id of those newer spotlights without going through the website's URLs (https://osu.ppy.sh/seasons/latest) as far as I know :(
Get the backgrounds made and selected for this season or for last season!
When the season ended, and for each background, its URL and its artist
-Readonly
getGet the top countries of a specific ruleset!
-Readonly
getGet the top 50 players who have the most total kudosu!
-Readonly
getGet the rankings of a spotlight from 2009 to 2020 on a specific ruleset!
-Readonly
getGet the top players of the game, with some filters!
-Optional
config: { Optional
country?: stringOnly get players from a specific country, using its ISO 3166-1 alpha-2 country code! (France would be FR
, United States US
)
Optional
filter?: "all" | "friends"What kind of players do you want to see? Keep in mind friends
has no effect if no authorized user
Optional
page?: numberImagine the array you get as a page, it can only have a maximum of 50 players, while 50 others may be on the next one
-Optional
variant?: "4k" | "7k"If type
is performance
and ruleset
is mania, choose between 4k and 7k!
Readonly
getGet user data of each friend of the authorized user
-Readonly
getGet extensive user data about the authorized user
-Readonly
getGet extensive user data about whoever you want!
-Readonly
getGet beatmaps favourited or made by a user!
-Readonly
getGet data about the activity of a user kudosu-wise!
-Readonly
getGet the beatmaps most played by a user!
-Readonly
getGet an array of Events of different type
s that relate to a user's activity during the last 31 days! (or 100 activities, whatever comes first)
Readonly
getGet "notable" scores from a user
-Readonly
getGet user data for up to 50 users at once!
-Readonly
getGet a wiki page!
-Readonly
getGet the top countries of a specific ruleset!
+Readonly
getGet the top 50 players who have the most total kudosu!
+Get the top 50 players who have the most total kudosu!
+Readonly
getGet the rankings of a spotlight from 2009 to 2020 on a specific ruleset!
+Get the rankings of a spotlight from 2009 to 2020 on a specific ruleset!
+Each spotlight has a different ranking (and often maps) depending on the ruleset
+The spotlight in question
+What kind of players do you want to see? Keep in mind friends
has no effect if no authorized user (defaults to all)
Readonly
getGet the top players of the game, with some filters!
+Get the top players of the game, with some filters!
+Self-explanatory, is also known as "Gamemode"
+Rank players by their performance points or by their ranked score?
+Optional
config: { Specify which page, country, filter out non-friends...
+Optional
country?: stringOnly get players from a specific country, using its ISO 3166-1 alpha-2 country code! (France would be FR
, United States US
)
Optional
filter?: "all" | "friends"What kind of players do you want to see? Keep in mind friends
has no effect if no authorized user
Optional
page?: numberImagine the array you get as a page, it can only have a maximum of 50 players, while 50 others may be on the next one
+Optional
variant?: "4k" | "7k"If type
is performance
and ruleset
is mania, choose between 4k and 7k!
Readonly
getGet user data of each friend of the authorized user
+Get user data of each friend of the authorized user
+Readonly
getGet extensive user data about the authorized user
+Get extensive user data about the authorized user
+Readonly
getGet extensive user data about whoever you want!
+Readonly
getGet beatmaps favourited or made by a user!
+Get beatmaps favourited or made by a user!
+Readonly
getGet data about the activity of a user kudosu-wise!
+Get data about the activity of a user kudosu-wise!
+Readonly
getGet the beatmaps most played by a user!
+Readonly
getGet an array of Events of different type
s that relate to a user's activity during the last 31 days! (or 100 activities, whatever comes first)
Get an array of Events of different type
s that relate to a user's activity during the last 31 days! (or 100 activities, whatever comes first)
Readonly
getGet "notable" scores from a user
+Get "notable" scores from a user
+The user who set the scores
+Do you want scores: in the user's top 100, that are top 1 on a beatmap, that have been recently set?
+Optional
ruleset: RulesetThe Ruleset the scores were made in (defaults to user's default Ruleset)
+Do you also want lazer scores and failed scores? (defaults to true for lazer & false for fails)
+Optional
fails?: booleanOptional
lazer?: booleanOptional
config: User.ConfigArray limit & offset
+Readonly
getGet user data for up to 50 users at once!
+Get user data for up to 50 users at once!
+Readonly
getGet a wiki page!
+Get a wiki page!
+What's in the page's URL after https://osu.ppy.sh/wiki/
(so the title, after the subtitle if there is a subtitle)
+(An example for https://osu.ppy.sh/wiki/en/Game_mode/osu!
would be Game_mode/osu!
)
The BCP 47 language (sub)tag lowercase (for example, for a french WikiPage, use "fr") (defaults to en)
+Get various data about the difficulty of a beatmap!
+Get various data about the difficulty of a beatmap!
The Beatmap in question
-Optional
mods: number | string[] | Mod[]Can be a bitset of mods, an array of mod acronyms, or an array of Mods (ignores mod settings) (defaults to No Mod)
-Optional
ruleset: RulesetUseful to specify if the beatmap is a convert (defaults to the ruleset the beatmap was intended for)
-You may want to use api.getBeatmapDifficultyAttributesOsu (or Taiko or whatever) instead for better type safety
-Optional
mods: number | string[] | Mod[]Can be a bitset of mods, an array of mod acronyms, or an array of Mods (ignores mod settings) (defaults to No Mod)
+Optional
ruleset: RulesetUseful to specify if the beatmap is a convert (defaults to the ruleset the beatmap was intended for)
+Get an Array of up to 100 Beatmap.Packs of a specific type!
-The type of the BeatmapPacks (defaults to standard)
-Optional
cursor_string: stringUse a response's cursor_string
with the same parameters to get the next "page" of results!
Get an Array of up to 100 Beatmap.Packs of a specific type!
+The type of the BeatmapPacks (defaults to standard)
+Optional
cursor_string: stringUse a response's cursor_string
with the same parameters to get the next "page" of results!
Get data about a Beatmap.Pack using its tag!
-Currently in https://osu.ppy.sh/beatmaps/packs, when hovering a pack, its URL with its tag should be preview by your browser
-Get data about a Beatmap.Pack using its tag!
+Currently in https://osu.ppy.sh/beatmaps/packs, when hovering a pack, its URL with its tag should be preview by your browser
+Get the scores on a beatmap made by a specific user (with the possibility to specify if the scores are on a convert)
+Optional
config: Beatmap.ConfigSpecify the score's ruleset, prevent a lazer score from being returned (mods
and type
should not be supported)
Get the score on a beatmap made by a specific user (with specific mods and on a specific ruleset if needed)
+Get the score on a beatmap made by a specific user (with specific mods and on a specific ruleset if needed)
The Beatmap the score was made on
The User who made the score
-Optional
config: Beatmap.ConfigSpecify the score's ruleset, the score's mods, prevent a lazer score from being returned (type
should not be supported)
Optional
config: Beatmap.ConfigSpecify the score's ruleset, the score's mods, prevent a lazer score from being returned (type
should not be supported)
An Object with the position of the score according to the specified Mods and Ruleset, and with the score itself
-Get extensive beatmap data for up to 50 beatmaps at once!
-Get extensive beatmap data for up to 50 beatmaps at once!
+Get extensive beatmap data about whichever beatmap you want!
-Get extensive beatmap data about whichever beatmap you want!
+Get the top scores of a beatmap!
+Get the top scores of a beatmap!
Please check if mods
and type
seem to be supported or not by the API: https://osu.ppy.sh/docs/index.html#get-beatmap-scores
Optional
config: Beatmap.ConfigSpecify the score's ruleset, mods, type, prevent a lazer score from being returned
+Please check if mods
and type
seem to be supported or not by the API: https://osu.ppy.sh/docs/index.html#get-beatmap-scores
Get the top scores of a beatmap, in the "solo score" format lazer brought with it! +
Get the top scores of a beatmap, in the "solo score" format lazer brought with it! More info on GitHub if needed https://github.com/ppy/osu-infrastructure/blob/master/score-submission.md
Please check if mods
and type
seem to be supported or not by the API: https://osu.ppy.sh/docs/index.html#get-beatmap-scores-non-legacy
Optional
config: Beatmap.ConfigSpecify the score's ruleset, mods, type (legacy_only
should not be supported)
Please check if mods
and type
seem to be supported or not by the API: https://osu.ppy.sh/docs/index.html#get-beatmap-scores-non-legacy
Get extensive beatmap data about whichever beatmap you want!
+Get extensive beatmap data about whichever beatmap you want!
What to specify in order to find the right beatmap
-Optional
checksum?: stringOptional
filename?: stringOptional
id?: numberOptional
checksum?: stringOptional
filename?: stringOptional
id?: numberGet complex data about the posts of a beatmapset's discussion or of a user!
-Optional
from: { From where/who are the posts coming from? A specific discussion, a specific user?
-Optional
discussion?: number | DiscussionOptional
user?: number | UserOptional
types: ("first" | "reply" | "system")[]What kind of posts?
-Optional
config: Beatmapset.ConfigHow many results maximum, how to sort them, which page of those, maybe a cursor_string...
+Get complex data about the posts of a beatmapset's discussion or of a user!
+Optional
from: { From where/who are the posts coming from? A specific discussion, a specific user?
+Optional
discussion?: number | DiscussionOptional
user?: number | UserOptional
types: ("first" | "reply" | "system")[]What kind of posts?
+Optional
config: Beatmapset.ConfigHow many results maximum, how to sort them, which page of those, maybe a cursor_string...
Relevant posts and info about them
-(2024-03-11) For months now, the API's documentation says the response is likely to change, so beware
-Get complex data about the votes of a beatmapset's discussions or/and received/given by a specific user!
-Optional
from: { The discussion with the votes, the user who voted, the user who's gotten the votes...
-Optional
discussion?: number | DiscussionOptional
vote_Optional
vote_Optional
score: 1 | -1An upvote (1) or a downvote (-1)
-Optional
config: Beatmapset.ConfigHow many results maximum, how to sort them, which page of those, maybe a cursor_string...
+Get complex data about the votes of a beatmapset's discussions or/and received/given by a specific user!
+Optional
from: { The discussion with the votes, the user who voted, the user who's gotten the votes...
+Optional
discussion?: number | DiscussionOptional
vote_Optional
vote_Optional
score: 1 | -1An upvote (1) or a downvote (-1)
+Optional
config: Beatmapset.ConfigHow many results maximum, how to sort them, which page of those, maybe a cursor_string...
Relevant votes and info about them
-(2024-03-11) For months now, the API's documentation says the response is likely to change, so beware
-Get complex data about the discussion page of any beatmapet that you want!
-Optional
from: { From where/who are the discussions coming from? Maybe only qualified sets?
-Optional
beatmapset?: number | BeatmapsetOptional
status?: "all" | "ranked" | "qualified" | "disqualified" | "never_qualified"Optional
user?: number | UserOptional
filter: { Should those discussions only be unresolved problems, for example?
-Optional
only_Optional
types?: ("suggestion" | "problem" | "mapper_note" | "praise" | "hype" | "review")[]Optional
config: Beatmapset.ConfigHow many results maximum, how to sort them, which page of those, maybe a cursor_string...
+Get complex data about the discussion page of any beatmapet that you want!
+Optional
from: { From where/who are the discussions coming from? Maybe only qualified sets?
+Optional
beatmapset?: number | BeatmapsetOptional
status?: Optional
user?: number | UserOptional
filter: { Should those discussions only be unresolved problems, for example?
+Optional
only_Optional
types?: (Optional
config: Beatmapset.ConfigHow many results maximum, how to sort them, which page of those, maybe a cursor_string...
Relevant discussions and info about them
-(2024-03-11) For months now, the API's documentation says the response is likely to change, so beware
-Get complex data about the events of a beatmapset and the users involved with them!
-Optional
from: { Which beatmapset, or caused by which user? When?
-Optional
beatmapset?: number | BeatmapsetOptional
max_Optional
min_Optional
user?: number | UserOptional
types: ("nominate" | "love" | "remove_from_loved" | "qualify" | "disqualify" | "approve" | "rank" | "kudosu_allow" | "kudosu_deny" | "kudosu_gain" | "kudosu_lost" | "kudosu_recalculate" | "issue_resolve" | "issue_reopen" | "discussion_lock" | "discussion_unlock" | "discussion_delete" | "discussion_restore" | "discussion_post_delete" | "discussion_post_restore" | "nomination_reset" | "nomination_reset_received" | "genre_edit" | "language_edit" | "nsfw_toggle" | "offset_edit" | "tags_edit" | "beatmap_owner_change")[]What kinds of events?
-Optional
config: Beatmapset.ConfigHow many results maximum, how to sort them, which page of those, maybe a cursor_string...
+Get complex data about the events of a beatmapset and the users involved with them!
+Optional
from: { Which beatmapset, or caused by which user? When?
+Optional
beatmapset?: number | BeatmapsetOptional
max_Optional
min_Optional
user?: number | UserOptional
types: (What kinds of events?
+Optional
config: Beatmapset.ConfigHow many results maximum, how to sort them, which page of those, maybe a cursor_string...
Relevant events and users
-(2024-03-11) For months now, the API's documentation says the response is likely to change, so beware, -and also there's no documentation for this route in the API, so this is only the result of my interpretation of the website's code lol
-Get extensive beatmapset data about whichever beatmapset you want!
-The beatmapset or the id of the beatmapset you're trying to get
-Get extensive beatmapset data about whichever beatmapset you want!
+The beatmapset or the id of the beatmapset you're trying to get
+Search for beatmapsets as if you were on the website or on lazer!
-Optional
query: { All the filters and sorting options that you'd normally find on the website or on lazer
-Optional
categories?: "Any" | "Ranked" | "Qualified" | "Loved" | "Favourites" | "Pending" | "WIP" | "Graveyard" | "My Maps"Filter in sets depending on their status or on their relation with the authorized user (defaults to all that have a leaderboard)
-Optional
cursor_The thing you've got from a previous request to get another page of results!
-Optional
extra?: ("must_have_video" | "must_have_storyboard")[]Should all sets have a video, a storyboard, maybe both at once?
-Optional
general?: ("Recommended difficulty" | "Include converted beatmaps" | "Subscribed mappers" | "Spotlighted beatmaps" | "Featured Artists")[]Various filters to activate
-Optional
genre?: Unspecified | any[any] | Anime | Rock | Pop | Other | Novelty | any[any] | Electronic | Metal | Classical | Folk | JazzSpecify the musical genre of the music of the beatmapsets you're searching for (don't specify to get any genre)
-"Any"/0 actually looks up sets that specifically have the Genre "Any" such as 5947
, it's excluded because it's counter-intuitive
+
Search for beatmapsets as if you were on the website or on lazer!
+Optional
query: { All the filters and sorting options that you'd normally find on the website or on lazer
+Optional
categories?: Filter in sets depending on their status or on their relation with the authorized user (defaults to all that have a leaderboard)
+Optional
cursor_The thing you've got from a previous request to get another page of results!
+Optional
extra?: ("must_have_video" | "must_have_storyboard")[]Should all sets have a video, a storyboard, maybe both at once?
+Optional
general?: (Various filters to activate
+Optional
genre?: Specify the musical genre of the music of the beatmapsets you're searching for (don't specify to get any genre)
+Optional
hide_Use this to hide all sets that are marked as explicit
-Optional
keywords?: stringWhat you'd put in the searchbar, like the name of a beatmapset or a mapper!
-Optional
language?: Unspecified | English | Japanese | Chinese | Instrumental | Korean | French | German | Swedish | Spanish | Italian | Russian | Polish | OtherSpecify the spoken language of the music of the beatmapsets you're searching for (don't specify to get any language)
-"Any"/0 actually looks up sets that specifically have the Language "Any" (and no set has that), it's excluded because it's counter-intuitive +
Optional
hide_Use this to hide all sets that are marked as explicit
+Optional
keywords?: stringWhat you'd put in the searchbar, like the name of a beatmapset or a mapper!
+Optional
language?: Specify the spoken language of the music of the beatmapsets you're searching for (don't specify to get any language)
+Optional
mode?: RulesetOnly get sets that have maps that you can play in the ruleset of your choice
-Optional
played?: "Played" | "Unplayed"Does the authorized user with osu!supporter have already played those sets, or have they not played them yet?
-Optional
rank_Does the authorized user with osu!supporter have already achieved certain ranks on those sets?
-Optional
sort?: { Sort by what, in ascending/descending order
-Relevant Beatmapsets that contain Beatmaps, and a cursor_string to allow you to look for more of the same!
-This does not bypass the current osu!supporter requirement for certain filters
-Optional
mode?: RulesetOnly get sets that have maps that you can play in the ruleset of your choice
+Optional
played?: "Played" | "Unplayed"Does the authorized user with osu!supporter have already played those sets, or have they not played them yet?
+Optional
rank_Does the authorized user with osu!supporter have already achieved certain ranks on those sets?
+Optional
sort?: { Sort by what, in ascending/descending order
+Relevant Beatmapsets that contain Beatmaps, and a cursor_string to allow you to look for more of the same!
+Get up to 21 versions/updates/builds!
-Optional
stream: stringOnly get builds from a specific stream
-Optional
range: { Get builds that were released before/after (and including) those builds
-Optional
from?: stringThe name of the build
-Optional
to?: string | numberThe name or the id of the build
+Get up to 21 versions/updates/builds!
+Optional
stream: stringOnly get builds from a specific stream
+Optional
range: { Get builds that were released before/after (and including) those builds
+Optional
from?: stringThe name of the build
+Optional
to?: string | numberThe name or the id of the build
changelog_entries
will have a message
property if markdown
, message_html
property if html
(defaults to both)
Get details about the version/update/build of something related to osu!
+Get details about the version/update/build of something related to osu!
The name of the thing related to osu!, like lazer
, web
, cuttingedge
, beta40
, stable40
The name of the version! Usually something like 2023.1026.0
for lazer, or 20230326
for stable
Get details about the version/update/build of something related to osu!
+Get details about the version/update/build of something related to osu!
A stream name like lazer
, a build version like 2023.1026.0
, or the id of a build
changelog_entries
will have a message
property if markdown
, message_html
property if html
(defaults to both)
An effective way to get all available streams, as well as their latest version!
-const names_of_streams = (await api.getChangelogStreams()).map(s => s.name)
-
-An effective way to get all available streams, as well as their latest version!
+Create a new announcement!
-Details of the channel you're creating
+Create/Open/Join a private messages chat channel!
+Get a ChatChannel that you have joined, and the users in it if it is a private channel!
+Get a ChatChannel that you have joined, and the users in it if it is a private channel!
Will 404 if the user has not joined the channel (use joinChatChannel
for that)
Join a public or multiplayer ChatChannel, allowing you to interact with it!
+Join a public or multiplayer ChatChannel, allowing you to interact with it!
Optional
user: number | UserThe user joining the channel (defaults to the presumed authorized user (api.user))
+Optional
user: number | UserThe user leaving/closing the channel (defaults to the presumed authorized user (api.user))
+You're marking this and all the messages before it as read!
+Get the recent messages of a specific ChatChannel!
+Get the recent messages of a specific ChatChannel!
The Channel you wanna get the messages from
The maximum amount of messages you want to get, up to 50! (defaults to 20)
-Optional
since: number | MessageGet the messages sent after this message
-Optional
until: number | MessageGet the messages sent up to but not including this message
-Optional
since: number | MessageGet the messages sent after this message
+Optional
until: number | MessageGet the messages sent up to but not including this message
+Send a private message to someone!
+Send a private message to someone!
The User you wanna send your message to!
The message you wanna send
Is it a command? Like /me dances
(defaults to false)
Optional
uuid: stringA client-side message identifier
+Optional
uuid: stringA client-side message identifier
The message you sent
-Needs to be done periodically to reset chat activity timeout
-Optional
since: { UserSilences that are before that will not be returned!
-Optional
message?: number | MessageOptional
user_A list of recent silences
-Needs to be done periodically to reset chat activity timeout
+Optional
since: { UserSilences that are before that will not be returned!
+Optional
message?: number | MessageOptional
user_A list of recent silences
+Get comments that meet any of your requirements!
-Optional
from: { From where are the comments coming from? Maybe a beatmapset, but then, which beatmapset?
-Optional
parent: number | CommentThe comments are replying to which comment? Make the id 0 to filter out replies (and only get top level comments)
-Optional
sort: { Should the comments be sorted by votes? Should they be from after a certain date? Maybe you can give a cursor?
-Optional
after?: number | CommentOptional
cursor?: null | { Optional
type?: "new" | "top" | "old"Get comments that meet any of your requirements!
+Optional
from: { From where are the comments coming from? Maybe a beatmapset, but then, which beatmapset?
+Optional
parent: number | CommentThe comments are replying to which comment? Make the id 0 to filter out replies (and only get top level comments)
+Optional
sort: { Should the comments be sorted by votes? Should they be from after a certain date? Maybe you can give a cursor?
+Optional
after?: number | CommentOptional
cursor?: null | { Optional
type?: "new" | "top" | "old"Get everything note-worthy that happened on osu! recently!
+Get everything note-worthy that happened on osu! recently!
"id_asc" to have the oldest recent event first, "id_desc" to have the newest instead (defaults to id_desc)
-Optional
cursor_string: stringUse a response's cursor_string
with the same parameters to get the next "page" of results, so events
in this instance!
Optional
cursor_string: stringUse a response's cursor_string
with the same parameters to get the next "page" of results, so events
in this instance!
Create a new ForumTopic in the forum of your choice!
-The id of the forum you're creating your topic in
-The topic's title
-The first post's content/message
-Optional
poll: { If you want to make a poll, specify the parameters of that poll!
-Optional
hide_Should the results of the poll be hidden while the voting period is still active? (defaults to false)
+Create a new ForumTopic in the forum of your choice!
+The id of the forum you're creating your topic in
+The topic's title
+The first post's content/message
+Optional
poll: { If you want to make a poll, specify the parameters of that poll!
+Optional
hide_Should the results of the poll be hidden while the voting period is still active? (defaults to false)
Length of voting period in days, 0 means forever
-Optional
max_The maximum amount of votes per user! (defaults to 1)
+Optional
max_The maximum amount of votes per user! (defaults to 1)
The things the users can vote for
-Optional
vote_Do you allow users to change their vote? (defaults to false)
-An object with the topic you've made, and its first initial post (which uses your text
)
Some users may not be allowed to do that, such as newly registered users, so this can 403 even with the right scopes
-Optional
vote_Do you allow users to change their vote? (defaults to false)
+An object with the topic you've made, and its first initial post (which uses your text
)
Edit the title of a Forum.Topic!
+Make and send a Forum.Post in a Forum.Topic!
-The topic or the id of the topic you're making your reply in
+The reply you've made, as a Forum.Post!
+Get a forum topic, as well as its main post (content) and the posts that were sent in it!
+Get a forum topic, as well as its main post (content) and the posts that were sent in it!
An object with the id of the topic in question
-Optional
config: { How many results maximum, how to sort them, etc...
-Optional
cursor_Use a response's cursor_string
with the same parameters to get the next "page" of results, so posts
in this instance!
Optional
first_The id (or the post itself) of the first post to be returned in posts
(irrelevant if using a cursor_string
)
Optional
limit?: numberHow many posts
maximum, up to 50
Optional
sort?: "id_desc" | "id_asc""id_asc" to have the oldest post at the beginning of the posts
array, "id_desc" to have the newest instead
The oldest post of a topic is the text of a topic
-Optional
config: { How many results maximum, how to sort them, etc...
+Optional
cursor_Use a response's cursor_string
with the same parameters to get the next "page" of results, so posts
in this instance!
Optional
first_The id (or the post itself) of the first post to be returned in posts
(irrelevant if using a cursor_string
)
Optional
limit?: numberHow many posts
maximum, up to 50
Optional
sort?: "id_desc" | "id_asc""id_asc" to have the oldest post at the beginning of the posts
array, "id_desc" to have the newest instead
Look for a user like you would on the website!
+Look for a user like you would on the website!
What you would put in the searchbar
-You normally get the first 20 results, but if page is 2, you'd get results 21 to 40 instead for example! (defaults to 1)
-You normally get the first 20 results, but if page is 2, you'd get results 21 to 40 instead for example! (defaults to 1)
+Look for a wiki page like you would on the website!
+Look for a wiki page like you would on the website!
What you would put in the searchbar
-You normally get the first 50 results, but if page is 2, you'd get results 51 to 100 instead for example! (defaults to 1)
-You normally get the first 50 results, but if page is 2, you'd get results 51 to 100 instead for example! (defaults to 1)
+Get the info about several matches!
-Optional
query: { The id of the first match of the array, and the sorting and size of said array
-Optional
first_Which match should be featured at index 0 of the returned array? Will get one with a similar id if it is unavailable
-You can use this argument differently to get all matches before/after (depending of query.sort
) a certain match,
+
Get the info about several matches!
+Optional
query: { The id of the first match of the array, and the sorting and size of said array
+Optional
first_Which match should be featured at index 0 of the returned array? Will get one with a similar id if it is unavailable
+Optional
limit?: numberThe maximum amount of elements returned in the array (defaults to 50)
-Optional
sort?: "id_desc" | "id_asc""id_desc" has the biggest id (most recent start_time) at the beginning of the array, "id_asc" is the opposite (defaults to id_desc)
-Optional
limit?: numberThe maximum amount of elements returned in the array (defaults to 50)
+Optional
sort?: "id_desc" | "id_asc""id_desc" has the biggest id (most recent start_time) at the beginning of the array, "id_asc" is the opposite (defaults to id_desc)
+Get data of a multiplayer lobby from the stable (non-lazer) client that have URLs with community/matches
or mp
Optional
query: { Filter and limit the amount of events shown
+Optional
after?: number | Multiplayer.Match.EventFilter FOR events AFTER this one
+Optional
before?: number | Multiplayer.Match.EventFilter FOR events BEFORE this one
+Optional
limit?: numberFrom 1 to 101 events (defaults to 100)
+Get the room stats of all the users of that room!
+Get the room stats of all the users of that room!
An object with the leaderboard, and the score and position of the authorized user under user_score
Get the scores on a specific item of a room!
+Get the scores on a specific item of a room!
An object with the id of the item in question, as well as the id of the room
How many scores maximum? Defaults to 50, the maximum the API will return
Sort by scores, ascending or descending? Defaults to descending
-Optional
cursor_string: stringUse a Multiplayer.Scores' params
and cursor_string
to get the next page (scores 51 to 100 for example)
(2024-03-04) This may not work for rooms from before March 5th 2024, use at your own risk +
Optional
cursor_string: stringUse a Multiplayer.Scores' params
and cursor_string
to get the next page (scores 51 to 100 for example)
(2024-03-04) This may not work for rooms from before March 5th 2024, use at your own risk https://github.com/ppy/osu-web/issues/10725
-Get playlists/realtime rooms that are active, that have ended, that the user participated in, that the user made, or just simply any room!
+Get playlists/realtime rooms that are active, that have ended, that the user participated in, that the user made, or just simply any room!
Whether the multiplayer rooms are in playlist format (like current spotlights) or realtime
-The state of the room, or the relation of the authorized user with the room
+The state of the room, or the relation of the authorized user with the room
The maximum amount of rooms to return, defaults to 10
Sort (where most recent is first) by creation date or end date, defaults to the creation date
-Optional
season_id: numberOnly get rooms (playlists) that belong to a specific (modern) Beatmap Spotlights season id
+(so 5
'd be summer 2020's mania rooms, not winter 2022!!)
Get a NewsPost, its content, and the NewsPosts right before and right after it!
+Get a NewsPost, its content, and the NewsPosts right before and right after it!
Get the top 50 players who have the most total kudosu!
-Get the top 50 players who have the most total kudosu!
+Get the rankings of a spotlight from 2009 to 2020 on a specific ruleset!
+Get the rankings of a spotlight from 2009 to 2020 on a specific ruleset!
Each spotlight has a different ranking (and often maps) depending on the ruleset
The spotlight in question
What kind of players do you want to see? Keep in mind friends
has no effect if no authorized user (defaults to all)
Get the top players of the game, with some filters!
+Get the top players of the game, with some filters!
Self-explanatory, is also known as "Gamemode"
Rank players by their performance points or by their ranked score?
-Optional
config: { Specify which page, country, filter out non-friends...
-Optional
country?: stringOnly get players from a specific country, using its ISO 3166-1 alpha-2 country code! (France would be FR
, United States US
)
Optional
filter?: "all" | "friends"What kind of players do you want to see? Keep in mind friends
has no effect if no authorized user
Optional
page?: numberImagine the array you get as a page, it can only have a maximum of 50 players, while 50 others may be on the next one
-Optional
variant?: "4k" | "7k"If type
is performance
and ruleset
is mania, choose between 4k and 7k!
Optional
config: { Specify which page, country, filter out non-friends...
+Optional
country?: stringOnly get players from a specific country, using its ISO 3166-1 alpha-2 country code! (France would be FR
, United States US
)
Optional
filter?: "all" | "friends"What kind of players do you want to see? Keep in mind friends
has no effect if no authorized user
Optional
page?: numberImagine the array you get as a page, it can only have a maximum of 50 players, while 50 others may be on the next one
+Optional
variant?: "4k" | "7k"If type
is performance
and ruleset
is mania, choose between 4k and 7k!
Get ALL legacy spotlights! (2009-2020, somewhat known as charts/ranking charts, available @ https://osu.ppy.sh/rankings/osu/charts)
-The data for newer spotlights (2020-, somewhat known as seasons) can be obtained through getRoom()
-but you can't really get the id of those newer spotlights without going through the website's URLs (https://osu.ppy.sh/seasons/latest) as far as I know :(
Get ALL legacy spotlights! (2009-2020, somewhat known as charts/ranking charts, available @ https://osu.ppy.sh/rankings/osu/charts)
+The data for newer spotlights (2020-, somewhat known as seasons) can be obtained through getRoom()
+but you can't really get the id of those newer spotlights without going through the website's URLs (https://osu.ppy.sh/seasons/latest) as far as I know :(
Get beatmaps favourited or made by a user!
+Get beatmaps favourited or made by a user!
The relation between the user and the beatmaps
+Optional
config: User.ConfigArray limit & offset
+Get user data of each friend of the authorized user
-Get user data of each friend of the authorized user
+Get data about the activity of a user kudosu-wise!
+Get data about the activity of a user kudosu-wise!
Optional
config: User.ConfigArray limit & offset
+Get user data for up to 50 users at once!
+Get user data for up to 50 users at once!
Should the response include variants
, useful to get stats specific to mania 4k/7k for example? (defaults to false)
Get an array of Events of different type
s that relate to a user's activity during the last 31 days! (or 100 activities, whatever comes first)
Get an array of Events of different type
s that relate to a user's activity during the last 31 days! (or 100 activities, whatever comes first)
Optional
config: User.ConfigArray limit & offset
+Get extensive user data about the authorized user
-Get extensive user data about the authorized user
+Get "notable" scores from a user
+Get "notable" scores from a user
The user who set the scores
-Do you want scores: in the user's top 100, that are top 1 on a beatmap, that have been recently set?
-Optional
ruleset: RulesetThe Ruleset the scores were made in (defaults to user's default Ruleset)
+Do you want scores: in the user's top 100, that are top 1 on a beatmap, that have been recently set?
+Optional
ruleset: RulesetThe Ruleset the scores were made in (defaults to user's default Ruleset)
Do you also want lazer scores and failed scores? (defaults to true for lazer & false for fails)
-Optional
fails?: booleanOptional
lazer?: booleanOptional
config: User.ConfigArray limit & offset
-Optional
fails?: booleanOptional
lazer?: booleanOptional
config: User.ConfigArray limit & offset
+Get a wiki page!
-What's in the page's URL after https://osu.ppy.sh/wiki/
(so the title, after the subtitle if there is a subtitle)
+
Get a wiki page!
+What's in the page's URL after https://osu.ppy.sh/wiki/
(so the title, after the subtitle if there is a subtitle)
(An example for https://osu.ppy.sh/wiki/en/Game_mode/osu!
would be Game_mode/osu!
)
The BCP 47 language (sub)tag lowercase (for example, for a french WikiPage, use "fr") (defaults to en)
-Generates a link for users to click on in order to use your application!
+Generates a link for users to click on in order to use your application!
The Client ID, find it at https://osu.ppy.sh/home/account/edit#new-oauth-application
The specified Application Callback URL, aka where the user will be redirected upon clicking the button to authorize
What you want to do with/as the user
-The API server (defaults to https://osu.ppy.sh, leave as is if you don't know exactly what you're doing)
+The API server (defaults to https://osu.ppy.sh, leave as is if you don't know exactly what you're doing)
The link people should click on
-osu-api-v2-js is a JavaScript & TypeScript package that helps you interact with osu!api (v2).
-You can find this package's documentation on osu-v2.taevas.xyz if needed!
-Before installing, if using Node.js, check if you're running version 16 or above:
-node -v # displays your version of node.js
-
+osu-api-v2-js is a JavaScript & TypeScript package that helps you interact with osu!api (v2).
+You can find this package's documentation on osu-v2.taevas.xyz if needed!
+Before installing, if using Node.js, check if you're running version 16 or above:
+node -v # displays your version of node.js
+
+
Then to install the package, use a command from your package manager:
-npm i osu-api-v2-js # if using npm
yarn add osu-api-v2-js # if using yarn
pnpm add osu-api-v2-js # if using pnpm
bun a osu-api-v2-js # if using bun
-
+npm i osu-api-v2-js # if using npm
yarn add osu-api-v2-js # if using yarn
pnpm add osu-api-v2-js # if using pnpm
bun a osu-api-v2-js # if using bun
+
+
You will want to create your own OAuth application: https://osu.ppy.sh/home/account/edit#oauth To use (import) the package in your project and start interacting with the API, you may do something like that:
-// TypeScript
import * as osu from "osu-api-v2-js"
async function logUserTopPlayBeatmap(username: string) {
// It's more convenient to use `osu.API.createAsync()` instead of `new osu.API()` as it doesn't require you to directly provide an access_token!
// In a proper application, you'd use this function as soon as the app starts so you can use that object everywhere
// (or if it acts as a user, you'd use this function at the end of the authorization flow)
const api = await osu.API.createAsync({id: "<client_id>", secret: "<client_secret>"})
const user = await api.getUser(username) // We need to get the id of the user in order to request what we want
const score = (await api.getUserScores(user, "best", osu.Ruleset.osu, {lazer: false}, {limit: 1}))[0] // Specifying the Ruleset is optional
const beatmapDifficulty = await api.getBeatmapDifficultyAttributesOsu(score.beatmap, score.mods) // Specifying the mods so the SR is adapted to them
const x = `${score.beatmapset.artist} - ${score.beatmapset.title} [${score.beatmap.version}]`
const y = `+${score.mods.toString()} (${beatmapDifficulty.star_rating.toFixed(2)}*)`
console.log(`${username}'s top play is on: ${x} ${y}`)
// Doomsday fanboy's top play is on: Yamajet feat. Hiura Masako - Sunglow [Harmony] +DT (8.72*)
}
logUserTopPlayBeatmap("Doomsday fanboy")
-
-A simple guide on how to do extra fancy stuff
-If your application is meant to act on behalf of a user after they've clicked on a button to say they consent to your application identifying them and reading public data on their behalf and some other stuff maybe, then things will work differently
-Let's take it step by step! First, this package comes with generateAuthorizationURL()
, which will generate for you a link so users can click on it and allow your application to do stuff on their behalf
+
// TypeScript
import * as osu from "osu-api-v2-js"
async function logUserTopPlayBeatmap(username: string) {
// It's more convenient to use `osu.API.createAsync()` instead of `new osu.API()` as it doesn't require you to directly provide an access_token!
// In a proper application, you'd use this function as soon as the app starts so you can use that object everywhere
// (or if it acts as a user, you'd use this function at the end of the authorization flow)
const api = await osu.API.createAsync({id: "<client_id>", secret: "<client_secret>"})
const user = await api.getUser(username) // We need to get the id of the user in order to request what we want
const score = (await api.getUserScores(user, "best", osu.Ruleset.osu, {lazer: false}, {limit: 1}))[0] // Specifying the Ruleset is optional
const beatmapDifficulty = await api.getBeatmapDifficultyAttributesOsu(score.beatmap, score.mods) // Specifying the mods so the SR is adapted to them
const x = `${score.beatmapset.artist} - ${score.beatmapset.title} [${score.beatmap.version}]`
const y = `+${score.mods.toString()} (${beatmapDifficulty.star_rating.toFixed(2)}*)`
console.log(`${username}'s top play is on: ${x} ${y}`)
// Doomsday fanboy's top play is on: Yamajet feat. Hiura Masako - Sunglow [Harmony] +DT (8.72*)
}
logUserTopPlayBeatmap("Doomsday fanboy")
+
+
+A simple guide on how to do extra fancy stuff
+If your application is meant to act on behalf of a user after they've clicked on a button to say they consent to your application identifying them and reading public data on their behalf and some other stuff maybe, then things will work differently
+Let's take it step by step! First, this package comes with generateAuthorizationURL()
, which will generate for you a link so users can click on it and allow your application to do stuff on their behalf
This function requires you to specify scopes... well, just know that identify
is always implicitly specified, that public
is almost always implicitly required, and that functions that require other scopes are explicit about it!
Please note: It is the user who ultimately decides which scopes they allow, so you can't assume they allowed all the scopes you specified... +
Please note: It is the user who ultimately decides which scopes they allow, so you can't assume they allowed all the scopes you specified...
Thankfully though, you can check at any time the allowed scopes with the scopes
property of your api
object!
The user clicked your link and authorized your application! ...Now what?
+The user clicked your link and authorized your application! ...Now what?
When a user authorizes your application, they get redirected to your Application Callback URL
with a huge code as a GET parameter (the name of the parameter is code
), and it is this very code that will allow you to proceed with the authorization flow! So make sure that somehow, you retrieve this code!
With this code, you're able to create your api
object:
const api = await osu.API.createAsync({id: "<client_id>", secret: "<client_secret>"}, {code: "<code>", redirect_uri: "<application_callback_url>"})
-
-Congrats on making your api
object! Now you should do something in order to not lose it, or not need a new one in order to request more data!
With this code, you're able to create your api
object:
const api = await osu.API.createAsync({id: "<client_id>", secret: "<client_secret>"}, {code: "<code>", redirect_uri: "<application_callback_url>"})
+
+
+Congrats on making your api
object! Now you should do something in order to not lose it, or not need a new one in order to request more data!
Do note that your api
object has lots of practical properties: user
allows you to know which user it acts on behalf of, expires
allows you to know when your requests with your current access_token
will fail, and refresh_token
is your key to getting a new access_token
without asking the user again!
Although, you should not need to access them often, because your api
object has a function to use that refresh token which you can call at any given time, and by default, the object will call that function on its own right before the expiration date or when a request seems to fail because of the access_token
being invalid! (those are features you can deactivate if needed)
Your refresh_token
can actually also expire at a (purposefully) unknown time, so depending of how your application works, you could use it at some point around the date of expiration, or you could throw away your api
object while waiting for a user to start the authorization flow again
// TypeScript
import * as osu from "osu-api-v2-js"
import promptSync from "prompt-sync"
const prompt = promptSync({sigint: true})
const id = "<client_id>"
const secret = "<client_secret>"
const redirect_uri = "<application_callback_url>"
async function readChat() {
// Somehow get the code so the application can read the messages as your osu! user
const url = osu.generateAuthorizationURL(id, redirect_uri, ["public", "chat.read"]) // "chat.read" is 100% needed in our case
const code = prompt(`Paste the "code" in the URL you're redicted to by accessing: ${url}\n\n`)
const api = await osu.API.createAsync({id, secret}, {code, redirect_uri}, "errors")
// Get a WebSocket object to interact with and get messages from
const socket = api.generateWebSocket()
// Tell the server you want to know whenever there's are chat messages
socket.on("open", () => {
socket.send(osu.WebSocket.Command.chatStart) // osu.WebSocket.Command.chatStart is simply JSON.stringify({event: "chat.start"}) but easier to remember
api.keepChatAlive()
setInterval(() => api.keepChatAlive(), 30 * 1000) // Tell the server every 30 seconds that you're still listening to the incoming messages
})
// Listen for chat messages (and other stuff)
socket.on("message", (m: MessageEvent) => { // Mind you, "message" doesn't mean "chat message" here, it's more like a raw event
const event: osu.WebSocket.Event.Any = JSON.parse(m.toString())
if (event.event === "chat.message.new") { // Filter out things that aren't new chat messages and get type safety
const message = event.data.messages.map((message) => message.content).join(" | ")
const user = event.data.users.map((user) => user.username).join(" | ")
console.log(`${user}: ${message}`)
}
})
}
readChat()
-
-Above is the code I've written to listen to incoming chat messages by using the API's WebSocket!
-Using the WebSocket namespace this package provides, it's relatively easy to send commands (anything under osu.WebSocket.Command
) and you can have 100% type safety with events (anything under osu.Websocket.Event
) simply by checking what the event
property is! With that, anything in the data
property is yours to play with!
This package's functions can be accessed both through the api object and through namespaces! It essentially means that for convenience's sake, there are two ways to do anything:
-// Obtaining a match, assuming an `api` object already exists and everything from the package is imported as `osu`
const match_1 = await api.getMatch(103845156) // through the api object
const match_2 = await osu.Multiplayer.Match.getOne.call(api, 103845156) // through the namespaces
// `match_1` and `match_2` are the same, because they're essentially using the same function!
// The same, but for obtaining multiple lazer updates
const builds_1 = await api.getChangelogBuilds("lazer")
const builds_2 = await osu.Changelog.Build.getMultiple.call(api, "lazer")
// `build_1` and `build_2` are also the same!
-
+// TypeScript
import * as osu from "osu-api-v2-js"
import promptSync from "prompt-sync"
const prompt = promptSync({sigint: true})
const id = "<client_id>"
const secret = "<client_secret>"
const redirect_uri = "<application_callback_url>"
async function readChat() {
// Somehow get the code so the application can read the messages as your osu! user
const url = osu.generateAuthorizationURL(id, redirect_uri, ["public", "chat.read"]) // "chat.read" is 100% needed in our case
const code = prompt(`Paste the "code" in the URL you're redicted to by accessing: ${url}\n\n`)
const api = await osu.API.createAsync({id, secret}, {code, redirect_uri}, "errors")
// Get a WebSocket object to interact with and get messages from
const socket = api.generateWebSocket()
// Tell the server you want to know whenever there's are chat messages
socket.on("open", () => {
socket.send(osu.WebSocket.Command.chatStart) // osu.WebSocket.Command.chatStart is simply JSON.stringify({event: "chat.start"}) but easier to remember
api.keepChatAlive()
setInterval(() => api.keepChatAlive(), 30 * 1000) // Tell the server every 30 seconds that you're still listening to the incoming messages
})
// Listen for chat messages (and other stuff)
socket.on("message", (m: MessageEvent) => { // Mind you, "message" doesn't mean "chat message" here, it's more like a raw event
const event: osu.WebSocket.Event.Any = JSON.parse(m.toString())
if (event.event === "chat.message.new") { // Filter out things that aren't new chat messages and get type safety
const message = event.data.messages.map((message) => message.content).join(" | ")
const user = event.data.users.map((user) => user.username).join(" | ")
console.log(`${user}: ${message}`)
}
})
}
readChat()
+
+
+Above is the code I've written to listen to incoming chat messages by using the API's WebSocket!
+Using the WebSocket namespace this package provides, it's relatively easy to send commands (anything under osu.WebSocket.Command
) and you can have 100% type safety with events (anything under osu.Websocket.Event
) simply by checking what the event
property is! With that, anything in the data
property is yours to play with!
This package's functions can be accessed both through the api object and through namespaces! It essentially means that for convenience's sake, there are two ways to do anything:
+// Obtaining a match, assuming an `api` object already exists and everything from the package is imported as `osu`
const match_1 = await api.getMatch(103845156) // through the api object
const match_2 = await osu.Multiplayer.Match.getOne.call(api, 103845156) // through the namespaces
// `match_1` and `match_2` are the same, because they're essentially using the same function!
// The same, but for obtaining multiple lazer updates
const builds_1 = await api.getChangelogBuilds("lazer")
const builds_2 = await osu.Changelog.Build.getMultiple.call(api, "lazer")
// `build_1` and `build_2` are also the same!
+
+
As you may have noticed, when calling the functions through the namespaces, instead of doing something like getOne()
, we instead do getOne.call()
and use the call() method in order to provide a this
value; the api object!
Of course, using the apply() method would also work, so just do things the way you prefer or the way that is more intuitive to you!
-GET /beatmaps/packs
-> getBeatmapPacks()GET /beatmaps/packs/{pack}
-> getBeatmapPack()GET /beatmaps/lookup
-> lookupBeatmap()GET /beatmaps/{beatmap}/scores/users/{user}
-> getBeatmapUserScore()GET /beatmaps/{beatmap}/scores/users/{user}/all
-> getBeatmapUserScores()GET /beatmaps/{beatmap}/scores
-> getBeatmapScores()GET /beatmaps/{beatmap}/solo-scores
-> getBeatmapSoloScores()GET /beatmaps
-> getBeatmaps()GET /beatmaps/{beatmap}
-> getBeatmap()POST /beatmaps/{beatmap}/attributes
-> getBeatmapDifficultyAttributes()GET /beatmapsets/discussions/posts
-> getBeatmapsetDiscussionPosts()GET /beatmapsets/discussions/votes
-> getBeatmapsetDiscussionVotes()GET /beatmapsets/discussions
-> getBeatmapsetDiscussions()GET /beatmapsets/search
-> searchBeatmapset()GET /beatmapsets/lookup
-> lookupBeatmapset()GET /beatmapsets/{beatmapset}
-> getBeatmapset()GET /beatmapsets/events
-> getBeatmapsetEvents()GET /changelog/{stream}/{build}
-> getChangelogBuild()GET /changelog
-> getChangelogBuilds() / getChangelogStreams() (removing search
, putting builds
behind getChangelogBuilds(), and streams
behind getChangelogStreams())GET /changelog/{changelog}
-> lookupChangelogBuild()POST /chat/ack
-> keepChatAlive()POST /chat/new
-> sendChatPrivateMessage()GET /chat/channels/{channel}/messages
-> getChatMessages()POST /chat/channels/{channel}/messages
-> sendChatMessage()PUT /chat/channels/{channel}/users/{user}
-> joinChatChannel()DELETE /chat/channels/{channel}/users/{user}
-> leaveChatChannel()PUT /chat/channels/{channel}/mark-as-read/{message}
-> markChatChannelAsRead()GET /chat/channels
-> getChatChannels()POST /chat/channels
-> createChatPrivateChannel() / createChatAnnouncementChannel()GET /chat/channels/{channel}
-> getChatChannel() (without users
because channel
would already have this property)GET /comments
-> getComments()GET /comments/{comment}
-> getComment()GET /events
-> getEvents()POST /forums/topics/{topic}/reply
-> replyForumTopic()POST /forums/topics
-> createForumTopic()GET /forums/topics/{topic}
-> getForumTopicAndPosts() (removing search
for simplicity)PUT /forums/topics/{topic}
-> editForumTopicTitle()PUT /forums/posts/{post}
-> editForumPost()GET /search
-> searchUser() / searchWiki()GET /rooms/{room}/playlist/{playlist}/scores
-> getPlaylistItemScores()GET /rooms
-> getRooms()GET /matches
-> getMatches()GET /matches/{match}
-> getMatch()GET /rooms/{room}
-> getRoom()GET /rooms/{room}/leaderboard
-> getRoomLeaderboard()GET /news
-> getNewsPosts() (removing everything except news_sidebar.news_posts
)GET /news/{news}
-> getNewsPost()GET /rankings/kudosu
-> getKudosuRanking()GET /rankings/{mode}/{type}
-> getUserRanking() / getCountryRanking() / getSpotlightRanking()GET /spotlights
-> getSpotlights()GET /me/{mode?}
-> getResourceOwner()GET /users/{user}/kudosu
-> getUserKudosu()GET /users/{user}/scores/{type}
-> getUserScores()GET /users/{user}/beatmapsets/{type}
-> getUserBeatmaps() / getUserMostPlayed()GET /users/{user}/recent_activity
-> getUserRecentActivity()GET /users/{user}/{mode?}
-> getUser()GET /users
-> getUsers()GET /friends
-> getFriends()GET /wiki/{locale}/{path}
-> getWikiPage()GET /seasonal-backgrounds
-> getSeasonalBackgrounds()GET /scores/{score}/download
-> getReplay()GET /beatmaps/packs
-> getBeatmapPacks()GET /beatmaps/packs/{pack}
-> getBeatmapPack()GET /beatmaps/lookup
-> lookupBeatmap()GET /beatmaps/{beatmap}/scores/users/{user}
-> getBeatmapUserScore()GET /beatmaps/{beatmap}/scores/users/{user}/all
-> getBeatmapUserScores()GET /beatmaps/{beatmap}/scores
-> getBeatmapScores()GET /beatmaps/{beatmap}/solo-scores
-> getBeatmapSoloScores()GET /beatmaps
-> getBeatmaps()GET /beatmaps/{beatmap}
-> getBeatmap()POST /beatmaps/{beatmap}/attributes
-> getBeatmapDifficultyAttributes()GET /beatmapsets/discussions/posts
-> getBeatmapsetDiscussionPosts()GET /beatmapsets/discussions/votes
-> getBeatmapsetDiscussionVotes()GET /beatmapsets/discussions
-> getBeatmapsetDiscussions()GET /beatmapsets/search
-> searchBeatmapset()GET /beatmapsets/lookup
-> lookupBeatmapset()GET /beatmapsets/{beatmapset}
-> getBeatmapset()GET /beatmapsets/events
-> getBeatmapsetEvents()GET /changelog/{stream}/{build}
-> getChangelogBuild()GET /changelog
-> getChangelogBuilds() / getChangelogStreams() (removing search
, putting builds
behind getChangelogBuilds(), and streams
behind getChangelogStreams())GET /changelog/{changelog}
-> lookupChangelogBuild()POST /chat/ack
-> keepChatAlive()POST /chat/new
-> sendChatPrivateMessage()GET /chat/channels/{channel}/messages
-> getChatMessages()POST /chat/channels/{channel}/messages
-> sendChatMessage()PUT /chat/channels/{channel}/users/{user}
-> joinChatChannel()DELETE /chat/channels/{channel}/users/{user}
-> leaveChatChannel()PUT /chat/channels/{channel}/mark-as-read/{message}
-> markChatChannelAsRead()GET /chat/channels
-> getChatChannels()POST /chat/channels
-> createChatPrivateChannel() / createChatAnnouncementChannel()GET /chat/channels/{channel}
-> getChatChannel() (without users
because channel
would already have this property)GET /comments
-> getComments()GET /comments/{comment}
-> getComment()GET /events
-> getEvents()POST /forums/topics/{topic}/reply
-> replyForumTopic()POST /forums/topics
-> createForumTopic()GET /forums/topics/{topic}
-> getForumTopicAndPosts() (removing search
for simplicity)PUT /forums/topics/{topic}
-> editForumTopicTitle()PUT /forums/posts/{post}
-> editForumPost()GET /search
-> searchUser() / searchWiki()GET /matches
-> getMatches()GET /matches/{match}
-> getMatch()GET /rooms/{room}/playlist/{playlist}/scores
-> getPlaylistItemScores()GET /rooms
-> getRooms()GET /rooms/{room}
-> getRoom()GET /rooms/{room}/leaderboard
-> getRoomLeaderboard()GET /news
-> getNewsPosts() (removing everything except news_sidebar.news_posts
)GET /news/{news}
-> getNewsPost()GET /rankings/kudosu
-> getKudosuRanking()GET /rankings/{mode}/{type}
-> getUserRanking() / getCountryRanking() / getSpotlightRanking()GET /spotlights
-> getSpotlights()GET /me/{mode?}
-> getResourceOwner()GET /users/{user}/kudosu
-> getUserKudosu()GET /users/{user}/scores/{type}
-> getUserScores()GET /users/{user}/beatmapsets/{type}
-> getUserBeatmaps() / getUserMostPlayed()GET /users/{user}/recent_activity
-> getUserRecentActivity()GET /users/{user}/{mode?}
-> getUser()GET /users
-> getUsers()GET /friends
-> getFriends()GET /wiki/{locale}/{path}
-> getWikiPage()GET /seasonal-backgrounds
-> getSeasonalBackgrounds()GET /scores/{score}/download
-> getReplay()The name of the difficulty, maybe something like "Someone's Insane"
-The name of the difficulty, maybe something like "Someone's Insane"
+An interface to tell the API what kind of scores should be in an array returned by a function
-Please note that some properties will be ignored by certain functions, check this in case of doubt: https://osu.ppy.sh/docs/index.html#beatmaps
-An interface to tell the API what kind of scores should be in an array returned by a function
+Please note that some properties will be ignored by certain functions, check this in case of doubt: https://osu.ppy.sh/docs/index.html#beatmaps
+Optional
legacy_Exclude lazer scores? (defaults to false)
-Optional
modsThe Mods used to make the score, you can simply use ["NM"]
to filter out scores with mods (defaults to any mods, no scores filtered)
Optional
rulesetThe Ruleset used to make the score, useful if it was made on a convert
-Optional
type"Beatmap score ranking type", whatever that means...
-Optional
legacy_Exclude lazer scores? (defaults to false)
+Optional
modsThe Mods used to make the score, you can simply use ["NM"]
to filter out scores with mods (defaults to any mods, no scores filtered)
Optional
rulesetThe Ruleset used to make the score, useful if it was made on a convert
+Optional
type"Beatmap score ranking type", whatever that means...
+Optional
score_API documentation says it exists, my thorough testing says it doesn't, so...
-The name of the difficulty, maybe something like "Someone's Insane"
-The name of the difficulty, maybe something like "Someone's Insane"
+The name of the difficulty, maybe something like "Someone's Insane"
-The name of the difficulty, maybe something like "Someone's Insane"
+The name of the difficulty, maybe something like "Someone's Insane"
-The name of the difficulty, maybe something like "Someone's Insane"
+The name of the difficulty, maybe something like "Someone's Insane"
-The name of the difficulty, maybe something like "Someone's Insane"
+The name of the difficulty, maybe something like "Someone's Insane"
-The name of the difficulty, maybe something like "Someone's Insane"
+Are difficulty reduction mods unable to be used to clear this pack? (is false
if you can use such mods)
Download page; going there with a web browser should start the download of a zip file automatically
-Optional
user_Not there if the application doesn't act as a specific user
+Are difficulty reduction mods unable to be used to clear this pack? (is false
if you can use such mods)
Download page; going there with a web browser should start the download of a zip file automatically
+Optional
user_Not there if the application doesn't act as a specific user
IDs of beatmapsets completed by the user (according to the requirements of the pack)
Whether all beatmapsets are completed by the user or not
-Are difficulty reduction mods unable to be used to clear this pack? (is false
if you can use such mods)
Download page; going there with a web browser should start the download of a zip file automatically
-Optional
user_Not there if the application doesn't act as a specific user
+Are difficulty reduction mods unable to be used to clear this pack? (is false
if you can use such mods)
Download page; going there with a web browser should start the download of a zip file automatically
+Optional
user_Not there if the application doesn't act as a specific user
IDs of beatmapsets completed by the user (according to the requirements of the pack)
Whether all beatmapsets are completed by the user or not
-Playcount
-The name of the difficulty, maybe something like "Someone's Insane"
-The name of the difficulty, maybe something like "Someone's Insane"
+The name of the difficulty, maybe something like "Someone's Insane"
-The name of the difficulty, maybe something like "Someone's Insane"
+The name of the difficulty, maybe something like "Someone's Insane"
-The name of the difficulty, maybe something like "Someone's Insane"
+A string like that where id is the id
of the beatmapset: //b.ppy.sh/preview/58951.mp3
Is it ranked, is it graveyarded, etc
-A title readable by any english-speaking person, so it'd be in romaji if the song's title is in Japanese
-Basically the title is the original language, so with hiragana, katakana and kanji if Japanese
-A string like that where id is the id
of the beatmapset: //b.ppy.sh/preview/58951.mp3
Is it ranked, is it graveyarded, etc
+A title readable by any english-speaking person, so it'd be in romaji if the song's title is in Japanese
+Basically the title is the original language, so with hiragana, katakana and kanji if Japanese
+If the song exists on a featured artist's page, then it has a track_id
https://osu.ppy.sh/beatmaps/artists/tracks/<track_id> redirects to the page of said featured artist
+An interface to tell the API how the returned Array should be like
-An interface to tell the API how the returned Array should be like
+Optional
cursor_A cursor_string provided by a previous request
-Optional
limitThe maximum amount of elements to get
-Optional
pageWhich page of the results to get
-Optional
sort"id_asc" to have the oldest element first, "id_desc" to have the newest instead
-Optional
cursor_A cursor_string provided by a previous request
+Optional
limitThe maximum amount of elements to get
+Optional
pageWhich page of the results to get
+Optional
sort"id_asc" to have the oldest element first, "id_desc" to have the newest instead
+For example, the id of the review this discussion is included in
-For example, the id of the review this discussion is included in
+For example, the id of the review this discussion is included in
-For example, the id of the review this discussion is included in
+"approve" is currently not used, it's here just in case that ever changes +
"approve" is currently not used, it's here just in case that ever changes https://github.com/ppy/osu-web/blob/master/app/Models/BeatmapsetEvent.php
-"approve" is currently not used, it's here just in case that ever changes +https://github.com/ppy/osu-web/blob/master/app/Models/BeatmapsetEvent.php
+An event's comment (unrelated to comments in bundles) can be a lot of things depending of the event type
-An event's comment (unrelated to comments in bundles) can be a lot of things depending of the event type
+An event's comment (unrelated to comments in bundles) can be a lot of things depending of the event type
-An event's comment (unrelated to comments in bundles) can be a lot of things depending of the event type
+An event's comment (unrelated to comments in bundles) can be a lot of things depending of the event type
-An event's comment (unrelated to comments in bundles) can be a lot of things depending of the event type
+An event's comment (unrelated to comments in bundles) can be a lot of things depending of the event type
-An event's comment (unrelated to comments in bundles) can be a lot of things depending of the event type
+An event's comment (unrelated to comments in bundles) can be a lot of things depending of the event type
-An event's comment (unrelated to comments in bundles) can be a lot of things depending of the event type
+An event's comment (unrelated to comments in bundles) can be a lot of things depending of the event type
-An event's comment (unrelated to comments in bundles) can be a lot of things depending of the event type
+An event's comment (unrelated to comments in bundles) can be a lot of things depending of the event type
-An event's comment (unrelated to comments in bundles) can be a lot of things depending of the event type
+An event's comment (unrelated to comments in bundles) can be a lot of things depending of the event type
-An event's comment (unrelated to comments in bundles) can be a lot of things depending of the event type
+An event's comment (unrelated to comments in bundles) can be a lot of things depending of the event type
-An event's comment (unrelated to comments in bundles) can be a lot of things depending of the event type
+An event's comment (unrelated to comments in bundles) can be a lot of things depending of the event type
-An event's comment (unrelated to comments in bundles) can be a lot of things depending of the event type
+An event's comment (unrelated to comments in bundles) can be a lot of things depending of the event type
-An event's comment (unrelated to comments in bundles) can be a lot of things depending of the event type
+An event's comment (unrelated to comments in bundles) can be a lot of things depending of the event type
-An event's comment (unrelated to comments in bundles) can be a lot of things depending of the event type
+An event's comment (unrelated to comments in bundles) can be a lot of things depending of the event type
-An event's comment (unrelated to comments in bundles) can be a lot of things depending of the event type
+"approve" is currently not used, it's here just in case that ever changes +
Optional
beatmapset"approve" is currently not used, it's here just in case that ever changes https://github.com/ppy/osu-web/blob/master/app/Models/BeatmapsetEvent.php
-Optional
discussionOptional
discussion"approve" is currently not used, it's here just in case that ever changes +https://github.com/ppy/osu-web/blob/master/app/Models/BeatmapsetEvent.php
+Optional
beatmapsetOptional
discussion"approve" is currently not used, it's here just in case that ever changes +https://github.com/ppy/osu-web/blob/master/app/Models/BeatmapsetEvent.php
+Optional
beatmapsetOptional
discussion"approve" is currently not used, it's here just in case that ever changes +https://github.com/ppy/osu-web/blob/master/app/Models/BeatmapsetEvent.php
+Optional
discussion"approve" is currently not used, it's here just in case that ever changes +https://github.com/ppy/osu-web/blob/master/app/Models/BeatmapsetEvent.php
+"approve" is currently not used, it's here just in case that ever changes +https://github.com/ppy/osu-web/blob/master/app/Models/BeatmapsetEvent.php
+"approve" is currently not used, it's here just in case that ever changes +https://github.com/ppy/osu-web/blob/master/app/Models/BeatmapsetEvent.php
+"approve" is currently not used, it's here just in case that ever changes +https://github.com/ppy/osu-web/blob/master/app/Models/BeatmapsetEvent.php
+"approve" is currently not used, it's here just in case that ever changes +https://github.com/ppy/osu-web/blob/master/app/Models/BeatmapsetEvent.php
+Optional
discussion"approve" is currently not used, it's here just in case that ever changes +https://github.com/ppy/osu-web/blob/master/app/Models/BeatmapsetEvent.php
+"approve" is currently not used, it's here just in case that ever changes +https://github.com/ppy/osu-web/blob/master/app/Models/BeatmapsetEvent.php
+"approve" is currently not used, it's here just in case that ever changes +https://github.com/ppy/osu-web/blob/master/app/Models/BeatmapsetEvent.php
+"approve" is currently not used, it's here just in case that ever changes +https://github.com/ppy/osu-web/blob/master/app/Models/BeatmapsetEvent.php
+"approve" is currently not used, it's here just in case that ever changes +https://github.com/ppy/osu-web/blob/master/app/Models/BeatmapsetEvent.php
+"approve" is currently not used, it's here just in case that ever changes +https://github.com/ppy/osu-web/blob/master/app/Models/BeatmapsetEvent.php
+"approve" is currently not used, it's here just in case that ever changes +https://github.com/ppy/osu-web/blob/master/app/Models/BeatmapsetEvent.php
+"approve" is currently not used, it's here just in case that ever changes +
"approve" is currently not used, it's here just in case that ever changes https://github.com/ppy/osu-web/blob/master/app/Models/BeatmapsetEvent.php
-Optional
beatmapset"approve" is currently not used, it's here just in case that ever changes +https://github.com/ppy/osu-web/blob/master/app/Models/BeatmapsetEvent.php
+Optional
discussionOptional
discussion"approve" is currently not used, it's here just in case that ever changes +https://github.com/ppy/osu-web/blob/master/app/Models/BeatmapsetEvent.php
+So it's false
if you can download it
Required nominations
-A string like that where id is the id
of the beatmapset: //b.ppy.sh/preview/58951.mp3
Is it ranked, is it graveyarded, etc
-A title readable by any english-speaking person, so it'd be in romaji if the song's title is in Japanese
-Basically the title is the original language, so with hiragana, katakana and kanji if Japanese
-So it's false
if you can download it
Required nominations
+A string like that where id is the id
of the beatmapset: //b.ppy.sh/preview/58951.mp3
Is it ranked, is it graveyarded, etc
+A title readable by any english-speaking person, so it'd be in romaji if the song's title is in Japanese
+Basically the title is the original language, so with hiragana, katakana and kanji if Japanese
+If the song exists on a featured artist's page, then it has a track_id
https://osu.ppy.sh/beatmaps/artists/tracks/<track_id> redirects to the page of said featured artist
+So it's false
if you can download it
The different beatmaps/difficulties this beatmapset has
-The different beatmaps made for osu!, but converted to the other Rulesets
-In HTML
-Optional
has_Only exists if authorized user
-Required nominations
-A string like that where id is the id
of the beatmapset: //b.ppy.sh/preview/58951.mp3
Is it ranked, is it graveyarded, etc
-A title readable by any english-speaking person, so it'd be in romaji if the song's title is in Japanese
-Basically the title is the original language, so with hiragana, katakana and kanji if Japanese
-So it's false
if you can download it
The different beatmaps/difficulties this beatmapset has
+The different beatmaps made for osu!, but converted to the other Rulesets
+In HTML
+Optional
has_Only exists if authorized user
+Required nominations
+A string like that where id is the id
of the beatmapset: //b.ppy.sh/preview/58951.mp3
Is it ranked, is it graveyarded, etc
+A title readable by any english-speaking person, so it'd be in romaji if the song's title is in Japanese
+Basically the title is the original language, so with hiragana, katakana and kanji if Japanese
+If the song exists on a featured artist's page, then it has a track_id
https://osu.ppy.sh/beatmaps/artists/tracks/<track_id> redirects to the page of said featured artist
+So it's false
if you can download it
Required nominations
-A string like that where id is the id
of the beatmapset: //b.ppy.sh/preview/58951.mp3
Is it ranked, is it graveyarded, etc
-A title readable by any english-speaking person, so it'd be in romaji if the song's title is in Japanese
-Basically the title is the original language, so with hiragana, katakana and kanji if Japanese
-So it's false
if you can download it
Required nominations
+A string like that where id is the id
of the beatmapset: //b.ppy.sh/preview/58951.mp3
Is it ranked, is it graveyarded, etc
+A title readable by any english-speaking person, so it'd be in romaji if the song's title is in Japanese
+Basically the title is the original language, so with hiragana, katakana and kanji if Japanese
+If the song exists on a featured artist's page, then it has a track_id
https://osu.ppy.sh/beatmaps/artists/tracks/<track_id> redirects to the page of said featured artist
+So it's false
if you can download it
Required nominations
-A string like that where id is the id
of the beatmapset: //b.ppy.sh/preview/58951.mp3
Is it ranked, is it graveyarded, etc
-A title readable by any english-speaking person, so it'd be in romaji if the song's title is in Japanese
-Basically the title is the original language, so with hiragana, katakana and kanji if Japanese
-So it's false
if you can download it
Required nominations
+A string like that where id is the id
of the beatmapset: //b.ppy.sh/preview/58951.mp3
Is it ranked, is it graveyarded, etc
+A title readable by any english-speaking person, so it'd be in romaji if the song's title is in Japanese
+Basically the title is the original language, so with hiragana, katakana and kanji if Japanese
+If the song exists on a featured artist's page, then it has a track_id
https://osu.ppy.sh/beatmaps/artists/tracks/<track_id> redirects to the page of said featured artist
+A string like that where id is the id
of the beatmapset: //b.ppy.sh/preview/58951.mp3
Is it ranked, is it graveyarded, etc
-A title readable by any english-speaking person, so it'd be in romaji if the song's title is in Japanese
-Basically the title is the original language, so with hiragana, katakana and kanji if Japanese
-A string like that where id is the id
of the beatmapset: //b.ppy.sh/preview/58951.mp3
Is it ranked, is it graveyarded, etc
+A title readable by any english-speaking person, so it'd be in romaji if the song's title is in Japanese
+Basically the title is the original language, so with hiragana, katakana and kanji if Japanese
+If the song exists on a featured artist's page, then it has a track_id
https://osu.ppy.sh/beatmaps/artists/tracks/<track_id> redirects to the page of said featured artist
+A string like that where id is the id
of the beatmapset: //b.ppy.sh/preview/58951.mp3
Is it ranked, is it graveyarded, etc
-A title readable by any english-speaking person, so it'd be in romaji if the song's title is in Japanese
-Basically the title is the original language, so with hiragana, katakana and kanji if Japanese
-A string like that where id is the id
of the beatmapset: //b.ppy.sh/preview/58951.mp3
Is it ranked, is it graveyarded, etc
+A title readable by any english-speaking person, so it'd be in romaji if the song's title is in Japanese
+Basically the title is the original language, so with hiragana, katakana and kanji if Japanese
+If the song exists on a featured artist's page, then it has a track_id
https://osu.ppy.sh/beatmaps/artists/tracks/<track_id> redirects to the page of said featured artist
+How many users are playing on this version of the game? (if web, should be 0)
-The name of the version
-If a video is showcased on the changelog
-The ID of a Youtube video is whatever comes after /watch?v=
in its url
How many users are playing on this version of the game? (if web, should be 0)
+The name of the version
+If a video is showcased on the changelog
+Can be January 1st 1970!
-Optional
github_Doesn't exist if no github user is associated with the person who's credited with the change
-Optional
message?: null | stringEntry message in Markdown format, embedded HTML is allowed
-Exists only if Markdown was requested, may still be null if there is no message
-Optional
message_Entry message in HTML format
-Exists only if HTML was requested, may still be null if there is no message
-How many users are playing on this version of the game? (if web, should be 0)
-The name of the version
-If a video is showcased on the changelog
-The ID of a Youtube video is whatever comes after /watch?v=
in its url
Optional
github_Doesn't exist if no github user is associated with the person who's credited with the change
+Optional
message?: null | stringEntry message in Markdown format, embedded HTML is allowed
+Optional
message_Entry message in HTML format
+How many users are playing on this version of the game? (if web, should be 0)
+The name of the version
+If a video is showcased on the changelog
+How many users are playing on this version of the game? (if web, should be 0)
-The name of the version
-If a video is showcased on the changelog
-The ID of a Youtube video is whatever comes after /watch?v=
in its url
How many users are playing on this version of the game? (if web, should be 0)
+The name of the version
+If a video is showcased on the changelog
+Can be January 1st 1970!
-Optional
github_Doesn't exist if no github user is associated with the person who's credited with the change
-Optional
message?: null | stringEntry message in Markdown format, embedded HTML is allowed
-Exists only if Markdown was requested, may still be null if there is no message
-Optional
message_Entry message in HTML format
-Exists only if HTML was requested, may still be null if there is no message
-How many users are playing on this version of the game? (if web, should be 0)
-The name of the version
-If a video is showcased on the changelog
-The ID of a Youtube video is whatever comes after /watch?v=
in its url
Optional
github_Doesn't exist if no github user is associated with the person who's credited with the change
+Optional
message?: null | stringEntry message in Markdown format, embedded HTML is allowed
+Optional
message_Entry message in HTML format
+How many users are playing on this version of the game? (if web, should be 0)
+The name of the version
+If a video is showcased on the changelog
+Stable would be Stable
, Lazer would be Lazer
Stable would be stable40
, Lazer would be lazer
Stable would be Stable
, Lazer would be Lazer
Stable would be stable40
, Lazer would be lazer
How many users are playing on this?
-Should be 0 if web
-API.sendChatPrivateMessage / +
API.sendChatPrivateMessage / +
The reason why messages can't be sent in this channel
-Is null if messages can be sent
-Is null if no message has been read (I think)
-The ids of the users that are in the channel
-Is empty for public channels
-The ids of the users that are in the channel
+API.sendChatPrivateMessage / +
API.sendChatPrivateMessage / API.sendChatMessage / API.getChatMessages
-Like "action", "markdown", "plain"
-Optional
uuid"build" means changelog, like pretty much everywhere in the API
-I think it's the name used by the person who made the comment before a migration to a new comment system in 2018 or before?
-Optional
messageYes comments may not have this property, yes this is stupid
-Optional
message_Yes comments may not have this property, yes this is stupid
-Is null if the author of the comment from the old comment system has no associated osu! user, presumably
-"build" means changelog, like pretty much everywhere in the API
+I think it's the name used by the person who made the comment before a migration to a new comment system in 2018 or before?
+Optional
messageYes comments may not have this property, yes this is stupid
+Optional
message_Yes comments may not have this property, yes this is stupid
+The string explains why the authorized user cannot post a new comment in this specific context, it's null if they can
-If there is simply no authorized user, this'll be a string such as "Please sign in to proceed."
+The string explains why the authorized user cannot post a new comment in this specific context, it's null if they can
+Like MAPPER
-This is an original property of the package that lets you know how many CommentableMeta
s that only consist of a title
of "Deleted Item" got removed
This DOES COUNT the one that is always there, see https://github.com/ppy/osu-web/issues/11077
-This is an original property of the package that lets you know how many CommentableMeta
s that only consist of a title
of "Deleted Item" got removed
This DOES COUNT the one that is always there, see https://github.com/ppy/osu-web/issues/11077
+The string explains why the authorized user cannot post a new comment in this specific context, it's null if they can
-If there is simply no authorized user, this'll be a string such as "Please sign in to proceed."
+The string explains why the authorized user cannot post a new comment in this specific context, it's null if they can
+Like MAPPER
-This is an original property of the package that lets you know how many CommentableMeta
s that only consist of a title
of "Deleted Item" got removed
This DOES COUNT the one that is always there, see https://github.com/ppy/osu-web/issues/11077
-This is an original property of the package that lets you know how many CommentableMeta
s that only consist of a title
of "Deleted Item" got removed
This DOES COUNT the one that is always there, see https://github.com/ppy/osu-web/issues/11077
+May contain HTML (like have the text between )
-If the achievement is for a specific mode only (such as pass a 2* beatmap in taiko)
-If the achievement is for a specific mode only (such as pass a 2* beatmap in taiko)
+The position achieved, like 14
-The grade, like "S"
-What goes after the website's URL, so for example, it could be the /u/7276846
of https://osu.ppy.sh/u/7276846
(or users
instead of u
)
What goes after the website's URL, so for example, it could be the /u/7276846
of https://osu.ppy.sh/u/7276846
(or users
instead of u
)
API.replyForumTopic / API.createForumTopic / API.getForumTopicAndPosts / API.editForumPost
-Post content in HTML format
+Post content in HTML format
Post content in BBCode format
-API.createForumTopic / API.getForumTopicAndPosts / API.editForumTopicTitle
-Can be in the future
-Optional
text?: stringIf detail.type
is other
, this exists and will be the name of the room
Optional
game?: { If detail.type
is other
, then this should exist!
Optional
text?: stringIf detail.type
is other
, this exists and will be the name of the room
Optional
gameIf detail.type
is other
, then this should exist!
Optional
current_Only exists if authorized user
+Optional
current_Only exists if the authorized user has played
In a format where 96.40%
would be 0.9640
(with some numbers after the zero)
How many (completed (I think)) attempts on each item? Empty array if the multiplayer room is the realtime kind
-In a format where 96.40%
would be 0.9640
(likely with some numbers after the zero)
In a format where 96.40%
would be 0.9640
(likely with some numbers after the zero)
Should be null if the room isn't the realtime multiplayer kind
-Should be null if the room isn't the realtime multiplayer kind
-Will be null if there is no next page
-How many scores there are across all pages, not necessarily scores.length
Will be null if not an authorized user or if the authorized user has no score
-Link to view the file on GitHub
-Link to the first image in the document
-Filename without the extension, used in URLs
-Link to view the file on GitHub
+Link to the first image in the document
+Filename without the extension, used in URLs
+With HTML
-Link to view the file on GitHub
-Link to the first image in the document
-Filename without the extension, used in URLs
-With HTML
+Link to view the file on GitHub
+Link to the first image in the document
+Filename without the extension, used in URLs
+The number of the next page, is null if no more results are available
-Same as country.code
The country's ISO 3166-1 alpha-2 code! (France would be FR
, United States US
)
Total amount of elements available across all pages, not on this specific page! Maximum of 10000
-The number of the next page, is null if no more results are available
+Same as country.code
The country's ISO 3166-1 alpha-2 code! (France would be FR
, United States US
)
Total amount of elements available across all pages, not on this specific page! Maximum of 10000
+The number of the next page, is null if no more results are available
-Total amount of elements available across all pages, not on this specific page! Maximum of 10000
-In a format where 96.40%
would be 0.9640
(likely with some numbers after the zero)
Is null when Beatmap is Loved (for example)
-Also known as a grade, for example this is X
(SS) if accuracy
is 1
(100.00%)
Can this score's replay be downloaded from the website?
-The ID of the user who made the score
-In a format where 96.40%
would be 0.9640
(likely with some numbers after the zero)
Also known as a grade, for example this is X
(SS) if accuracy
is 1
(100.00%)
Can this score's replay be downloaded from the website?
+The ID of the user who made the score
+The version of Score without lazer-related stuff, used almost everywhere!
-The version of Score without lazer-related stuff, used almost everywhere!
+In a format where 96.40%
would be 0.9640
(likely with some numbers after the zero)
Is null when Beatmap is Loved (for example)
-Also known as a grade, for example this is X
(SS) if accuracy
is 1
(100.00%)
Can this score's replay be downloaded from the website?
-Is null if the score's gamemode is Taiko
-The ID of the user who made the score
-In a format where 96.40%
would be 0.9640
(likely with some numbers after the zero)
Also known as a grade, for example this is X
(SS) if accuracy
is 1
(100.00%)
Can this score's replay be downloaded from the website?
+The ID of the user who made the score
+In a format where 96.40%
would be 0.9640
(and no number afterwards)
Also known as a grade, for example this is X
(SS) if accuracy
is 1
(100.00%)
Can this score's replay be downloaded from the website?
-The ID of the user who made the score
-In a format where 96.40%
would be 0.9640
(and no number afterwards)
Also known as a grade, for example this is X
(SS) if accuracy
is 1
(100.00%)
Can this score's replay be downloaded from the website?
+The ID of the user who made the score
+Scores called "solo-scores" are more relevant to lazer stuff, it's the opposite of legacy
-Scores called "solo-scores" are more relevant to lazer stuff, it's the opposite of legacy
+In a format where 96.40%
would be 0.9640
(likely with some numbers after the zero)
Is null if the score has not been set on lazer
-Optional
maximum_Is null when Beatmap is Loved (for example)
-Also known as a grade, for example this is X
(SS) if accuracy
is 1
(100.00%)
Can this score's replay be downloaded from the website?
-The ID of the user who made the score
-In a format where 96.40%
would be 0.9640
(likely with some numbers after the zero)
Optional
maximum_Also known as a grade, for example this is X
(SS) if accuracy
is 1
(100.00%)
Can this score's replay be downloaded from the website?
+The ID of the user who made the score
+All of its properties are optional because instead of being 0, the property actually disappears instead
-All of its properties are optional because instead of being 0, the property actually disappears instead
+Optional
greatOptional
ignore_Optional
ignore_Optional
large_Optional
large_Optional
legacy_Exclusively for the maximum_statistics
of solo-scores that were not set on lazer
Optional
mehOptional
missOptional
okOptional
small_Optional
small_Optional
small_Optional
greatOptional
ignore_Optional
ignore_Optional
large_Optional
large_Optional
legacy_Exclusively for the maximum_statistics
of solo-scores that were not set on lazer
Optional
mehOptional
missOptional
okOptional
small_Optional
small_Optional
small_The version of Score without lazer-related stuff, used almost everywhere!
-The version of Score without lazer-related stuff, used almost everywhere!
+In a format where 96.40%
would be 0.9640
(likely with some numbers after the zero)
Is null when Beatmap is Loved (for example)
-Also known as a grade, for example this is X
(SS) if accuracy
is 1
(100.00%)
Can this score's replay be downloaded from the website?
-Is null if the score's gamemode is Taiko
-The ID of the user who made the score
-In a format where 96.40%
would be 0.9640
(likely with some numbers after the zero)
Also known as a grade, for example this is X
(SS) if accuracy
is 1
(100.00%)
Can this score's replay be downloaded from the website?
+The ID of the user who made the score
+In a format where 96.40%
would be 0.9640
(likely with some numbers after the zero)
Is null when Beatmap is Loved (for example)
-Also known as a grade, for example this is X
(SS) if accuracy
is 1
(100.00%)
Can this score's replay be downloaded from the website?
-Is null if the score's gamemode is Taiko
-The ID of the user who made the score
-In a format where 96.40%
would be 0.9640
(likely with some numbers after the zero)
Also known as a grade, for example this is X
(SS) if accuracy
is 1
(100.00%)
Can this score's replay be downloaded from the website?
+The ID of the user who made the score
+The version of Score without lazer-related stuff, used almost everywhere!
-The version of Score without lazer-related stuff, used almost everywhere!
+In a format where 96.40%
would be 0.9640
(likely with some numbers after the zero)
Is null when Beatmap is Loved (for example)
-Also known as a grade, for example this is X
(SS) if accuracy
is 1
(100.00%)
Can this score's replay be downloaded from the website?
-Is null if the score's gamemode is Taiko
-The ID of the user who made the score
-In a format where 96.40%
would be 0.9640
(likely with some numbers after the zero)
Also known as a grade, for example this is X
(SS) if accuracy
is 1
(100.00%)
Can this score's replay be downloaded from the website?
+The ID of the user who made the score
+In a format where 96.40%
would be 0.9640
(likely with some numbers after the zero)
Is null when Beatmap is Loved (for example)
-Also known as a grade, for example this is X
(SS) if accuracy
is 1
(100.00%)
Can this score's replay be downloaded from the website?
-Is null if the score's gamemode is Taiko
-The ID of the user who made the score
-Optional
weightOnly if type
is set to best
on API.getUserScores
In a format where 96.40%
would be 0.9640
(likely with some numbers after the zero)
Also known as a grade, for example this is X
(SS) if accuracy
is 1
(100.00%)
Can this score's replay be downloaded from the website?
+The ID of the user who made the score
+Optional
weightOnly if type
is set to best
on API.getUserScores
Pretty sure this is only true
when the spotlight has different beatmaps for each ruleset
Pretty sure this is only true
when the spotlight has different beatmaps for each ruleset
An interface to tell the API how the returned Array should be like
-An interface to tell the API how the returned Array should be like
+Optional
limitThe maximum amount of elements returned in the array
-The server could send less than the limit because it deliberately limits itself; Putting this at 1000 doesn't mean you'll even get close to 200
-Optional
offsetHow many elements that would be at the top of the returned array get skipped (while still filling the array up to the limit)
-Basically the text with the BBCode
-Specific to the Ruleset (playmode
)
Basically the text with the BBCode
+Specific to the Ruleset (playmode
)
Basically the text with the BBCode
-Specific to the Ruleset (playmode
)
Optional
fruits?: User.StatisticsOptional
mania?: User.StatisticsOptional
osu?: User.StatisticsOptional
taiko?: User.StatisticsBasically the text with the BBCode
+Specific to the Ruleset (playmode
)
Optional
variantsExists only if include_variant_statistics
was ever specified to be true in a request
Accuracy in the normal format, where 96.56% would be 96.56
Hasn't become inactive in the rankings
-Accuracy in the normal format, where 96.56% would be 96.56
Hasn't become inactive in the rankings
+Accuracy in the normal format, where 96.56% would be 96.56
Hasn't become inactive in the rankings
-Accuracy in the normal format, where 96.56% would be 96.56
Hasn't become inactive in the rankings
+Accuracy in the normal format, where 96.56% would be 96.56
Hasn't become inactive in the rankings
-Accuracy in the normal format, where 96.56% would be 96.56
Hasn't become inactive in the rankings
+Optional
fruits?: User.StatisticsOptional
mania?: User.StatisticsOptional
osu?: User.StatisticsOptional
taiko?: User.StatisticsOptional
variantsExists only if include_variant_statistics
was ever specified to be true in a request
Lowercase BCP 47 language (sub)tag (for example, en
for english)
It's what should be after https://osu.ppy.sh/wiki/{locale}/
Think of it as the title of the parent wiki page
-If the title
in the path
(assuming it's in it (very unlikely if locale
is not en
)) is after a slash (/), this is what is before the slash
Lowercase BCP 47 language (sub)tag (for example, en
for english)
It's what should be after https://osu.ppy.sh/wiki/{locale}/
Think of it as the title of the parent wiki page
+Unrelated to comments in bundles!
-Those are used as properties by Events, they're not events themselves
-Those are used as properties by Events, they're not events themselves
+Use any of those with socket.send()
to send a command to the WebSocket!
`socket.send(osu.WebSocket.Command.chatStart)`
-
-Those are what you'll get from WebSocket's MessageEvent
s!
Those are what you'll get from WebSocket's MessageEvent
s!
Everything here is great to use with the WebSocket you can get with API.generateWebSocket!
-Everything here is great to use with the WebSocket you can get with API.generateWebSocket!
+This includes everything in this namespace, except BeatmapPlaycount
This includes everything in this namespace, except BeatmapPlaycount
Optional
settings?: { Scopes determine what the API instance can do as a user! +
Scopes determine what the API instance can do as a user! https://osu.ppy.sh/docs/index.html#scopes
-"identify" is always implicity provided, "public" is implicitly needed for almost everything!! -The need for the "public" scope is only made explicit when the function can't be used unless the application acts as as a user (non-guest)
-That's the type of JSON.parse(m.toString())
where m
is a WebSocket's MessageEvent
!
That's the type of JSON.parse(m.toString())
where m
is a WebSocket's MessageEvent
!
Const
Const
Const
Const
You can create an API instance without directly providing an access_token by using API.createAsync!
-