NAV
bash javascript

Introduction

Welcome to the documentation for osu!api v2. You can use this API to get information on various circles and those who click them.

Note that while we endeavour to keep this documentation up to date, consider it a work-in-progress and note that it will likely contain errors.

If you notice any errors in the documentation or encounter problems using the API, please check for (or create if necessary) issues on GitHub. Alternatively, you can ask in #osu-web on the development discord.

Code examples are provided in the dark area to the right, you can use the tabs at the top of the page to switch between bash and javascript samples.

If you use Postman, you can download a collection here.

Terms of Use

Use the API for good. Don't overdo it. If in doubt, ask before (ab)using :). this section may expand as necessary.

Current rate limit is set at an insanely high 1200 requests per minute, with burst capability of up to 200 beyond that. If you require more, you probably fall into the above category of abuse. If you are doing more than 60 requests a minute, you should probably give peppy a yell.

Endpoint

Base URL

The base URL is: https://osu.ppy.sh/api/[version]/

API Versions

This is combined with the base endpoint to determine where requests should be sent.

Version Status
v2 current (not yet public, consider unstable and expect breaking changes)
v1 legacy api provided by the old site, will be deprecated soon

Authentication

osu!api uses OAuth2 to grant access to the API. More information about applications you have registered and granted permissions to can be found here.

The API supports the following grant types:

Before you can use the osu!api, you will need to

  1. have registered an OAuth Application.
  2. acquire an access token by either:
    • authorizing users for your application;
    • requesting Client Credentials token.

Registering an OAuth application

Before you can get an OAuth token, you will need to register an OAuth application on your account settings page

To register an OAuth application you will need to provide the:

Name Description
Application Name This is the name that will be visible to users of your application. The name of your application cannot be changed.
Application Callback URL The URL in your application where users will be sent after authorization.

The Application Callback URL is required when for using Authorization Codes. This may be left blank if you are only using Client Credentials Grants.

Your new OAuth application will have a Client ID and Client Secret; the Client Secret is like a password for your OAuth application, it should be kept private and do not share it with anyone else.

Authorization Code Grant

The flow to authorize users for your application is:

  1. Requesting authorization from users
  2. Users are redirected back to your site
  3. Your application accesses the API with the user's access token

Request authorization from a user

To obtain an access token, you must first get an authorization code that is created when a user grants permissions to your application. To request permission from the user, they should be redirected to:

GET https://osu.ppy.sh/oauth/authorize

Parameters

Name Type Description
client_id number The Client ID you received when you registered
redirect_uri string The URL in your application where users will be sent after authorization. This must match the registered Application Callback URL exactly.
response_type string This should always be code when requesting authorization.
scope string A space-delimited string of scopes.
state string Data that will be returned when a temporary code is issued. It can be used to provide a token for protecting against cross-site request forgery attacks.

User is redirected back to your site

If the user accepts your request, they will be redirected back to your site with a temporary single-use code contained in the URL parameter. If a state value was provided in the previous request, it will be returned here.

Exchange this code for an access token:

fetch("https://osu.ppy.sh/oauth/token", {
    method: 'post',
    headers: {
      'Accept': 'application/json',
      'Content-Type': 'application/json'
    },
    body: JSON.stringify({
        "grant_type": "authorization_code",
        "client_id": 1,
        "client_secret": "secret",
        "redirect_uri": "https://notarealaddress.local/oauth/osu",
        "code": "code"
    })
})
.then(response => {
    return response.json();
});

POST https://osu.ppy.sh/oauth/token

Parameters

Name Type Description
client_id number The client ID of your application.
client_secret string The client secret of your application.
code string The code you received.
grant_type string This must always be authorization_code
redirect_uri string The URL in your application where users will be sent after authorization.
{
    "token_type": "Bearer",
    "expires_in": 86400,
    "access_token": "verylongstring",
    "refresh_token": "anotherlongstring",
}

Successful requests will be issued an access token:

Name Type Description
token_type string The type of token, this should always be Bearer.
expires_in number The number of seconds the token will be valid for.
access_token string The access token.
refresh_token string The refresh token.

Client Credentials Grant

The client credential flow provides a way for developers to get access tokens that do not have associated user permissions; as such, these tokens are considered as guest users.

Example for requesting Client Credentials token:

fetch("https://osu.ppy.sh/oauth/token", {
    method: 'post',
    headers: {
      'Accept': 'application/json',
      'Content-Type': 'application/json'
    },
    body: JSON.stringify({
        "grant_type": "client_credentials",
        "client_id": 1,
        "client_secret": "secret",
        "scope": "public"
    })
})
.then(response => {
    return response.json();
});

POST https://osu.ppy.sh/oauth/token

Parameters

Name Type Description
client_id number The Client ID you received when you registered
client_secret string The client secret of your application.
grant_type string This must always be client_credentials
scope string Must be public; other scopes have no meaningful effect.
{
    "token_type": "Bearer",
    "expires_in": 86400,
    "access_token": "verylongstring",
}

Successful requests will be issued an access token:

Name Type Description
token_type string The type of token, this should always be Bearer.
expires_in number The number of seconds the token will be valid for.
access_token string The access token.

Using the access token to access the API

With the access token, you can make requests to osu!api on behalf of a user.

The token should be included in the header of requests to the API.

Authorization: Bearer {{token}}

# With shell, you can just pass the correct header with each request
curl "https://osu.ppy.sh/api/[version]/[endpoint]"
  -H "Authorization: Bearer {{token}}"
// This javascript example uses fetch()
fetch("https://osu.ppy.sh/api/[version]/[endpoint]", {
    headers: {
      Authorization: 'Bearer {{token}}'
    }
});

Make sure to replace {{token}} with your OAuth2 token.

Scopes

The following scopes are currently supported:

Name Description
identify Allows reading of the public profile of the authorizing user (/me).
friends.read Allows reading of the authorizing user's friend list.
public Allows reading of publicly available data on behalf of the authorizing user.

identify is the default scope for the Authorization Code Grant and always implicitly provided. The Client Credentials Grant does not currently have any default scopes.

Managing OAuth applications

Your account settings page will show your registered OAuth applications, and all the OAuth applications you have granted permissions to.

Reset Client Secret

You can generate a new Client Secret by choosing to "Reset client secret", however, this will disable all access tokens issued for the application.

Changelog

For a full list of changes, see the Changelog on the site.

Breaking Changes

2020-09-08

2020-08-28

2020-05-01

2020-02-18

2019-10-09

2019-07-18

Chat

Create New PM

curl -X POST "https://osu.ppy.sh/api/v2/chat/new" \
    -H "Authorization: Bearer {{token}}" \
    -H "Content-Type: application/json" \
    -d '{"target_id":12,"message":"culpa","is_action":false}'
const url = new URL("https://osu.ppy.sh/api/v2/chat/new");

let headers = {
    "Authorization": "Bearer {{token}}"
    "Content-Type": "application/json",
    "Accept": "application/json",
}

let body = {
    "target_id": 12,
    "message": "culpa",
    "is_action": false
}

fetch(url, {
    method: "POST",
    headers: headers,
    body: body
})
.then(response => response.json())
.then(json => console.log(json));

Example response (200):

null

Requires authentication

This endpoint allows you to create a new PM channel.

HTTP Request

POST /chat/new

Body Parameters

Parameter Type Status Description
target_id integer required user_id of user to start PM with
message string required message to send
is_action boolean required whether the message is an action

Response Format

Field Type
new_channel_id channel_id of newly created ChatChannel
presence array of ChatChannel
message the sent ChatMessage

Get Updates

curl -X GET -G "https://osu.ppy.sh/api/v2/chat/updates?since=culpa&channel_id=culpa&limit=12" \
    -H "Authorization: Bearer {{token}}"
const url = new URL("https://osu.ppy.sh/api/v2/chat/updates");

let params = {
    "since": "culpa",
    "channel_id": "culpa",
    "limit": "12",
};
Object.keys(params).forEach(key => url.searchParams.append(key, params[key]));

let headers = {
    "Authorization": "Bearer {{token}}"
    "Accept": "application/json",
    "Content-Type": "application/json",
}

fetch(url, {
    method: "GET",
    headers: headers,
})
.then(response => response.json())
.then(json => console.log(json));

Example response (200):

{
    "presence": [
        {
            "channel_id": 5,
            "name": "#osu",
            "description": "The official osu! channel (english only).",
            "type": "public",
            "last_read_id": 9150005005,
            "last_message_id": 9150005005
        },
        {
            "channel_id": 12345,
            "type": "PM",
            "name": "peppy",
            "icon": "https:\/\/a.ppy.sh\/2?1519081077.png",
            "users": [
                2,
                102
            ],
            "last_read_id": 9150001235,
            "last_message_id": 9150001234
        }
    ],
    "messages": [
        {
            "message_id": 9150005004,
            "sender_id": 2,
            "channel_id": 5,
            "timestamp": "2018-07-06T06:33:34+00:00",
            "content": "i am a lazerface",
            "is_action": 0,
            "sender": {
                "id": 2,
                "username": "peppy",
                "profile_colour": "#3366FF",
                "avatar_url": "https:\/\/a.ppy.sh\/2?1519081077.png",
                "country_code": "AU",
                "is_active": true,
                "is_bot": false,
                "is_online": true,
                "is_supporter": true
            }
        },
        {
            "message_id": 9150005005,
            "sender_id": 102,
            "channel_id": 5,
            "timestamp": "2018-07-06T06:33:42+00:00",
            "content": "uh ok then",
            "is_action": 0,
            "sender": {
                "id": 102,
                "username": "nekodex",
                "profile_colour": "#333333",
                "avatar_url": "https:\/\/a.ppy.sh\/102?1500537068",
                "country_code": "AU",
                "is_active": true,
                "is_bot": false,
                "is_online": true,
                "is_supporter": true
            }
        }
    ]
}

Requires authentication

This endpoint returns new messages since the given message_id along with updated channel 'presence' data.

HTTP Request

GET /chat/updates

Query Parameters

Parameter Status Description
since required The message_id of the last message to retrieve messages since
channel_id optional If provided, will only return messages for the given channel
limit optional number of messages to return (max of 50)

Response Format

Field Type
presence array of ChatChannel
messages array of ChatMessage

Get Channel Messages

curl -X GET -G "https://osu.ppy.sh/api/v2/chat/channels/1/messages?limit=12&since=culpa&until=culpa" \
    -H "Authorization: Bearer {{token}}"
const url = new URL("https://osu.ppy.sh/api/v2/chat/channels/1/messages");

let params = {
    "limit": "12",
    "since": "culpa",
    "until": "culpa",
};
Object.keys(params).forEach(key => url.searchParams.append(key, params[key]));

let headers = {
    "Authorization": "Bearer {{token}}"
    "Accept": "application/json",
    "Content-Type": "application/json",
}

fetch(url, {
    method: "GET",
    headers: headers,
})
.then(response => response.json())
.then(json => console.log(json));

Example response (200):

[
    {
        "message_id": 9150005004,
        "sender_id": 2,
        "channel_id": 5,
        "timestamp": "2018-07-06T06:33:34+00:00",
        "content": "i am a lazerface",
        "is_action": 0,
        "sender": {
            "id": 2,
            "username": "peppy",
            "profile_colour": "#3366FF",
            "avatar_url": "https:\/\/a.ppy.sh\/2?1519081077.png",
            "country_code": "AU",
            "is_active": true,
            "is_bot": false,
            "is_online": true,
            "is_supporter": true
        }
    },
    {
        "message_id": 9150005005,
        "sender_id": 102,
        "channel_id": 5,
        "timestamp": "2018-07-06T06:33:42+00:00",
        "content": "uh ok then",
        "is_action": 0,
        "sender": {
            "id": 102,
            "username": "nekodex",
            "profile_colour": "#333333",
            "avatar_url": "https:\/\/a.ppy.sh\/102?1500537068",
            "country_code": "AU",
            "is_active": true,
            "is_bot": false,
            "is_online": true,
            "is_supporter": true
        }
    }
]

Requires authentication

This endpoint returns the chat messages for a specific channel.

HTTP Request

GET /chat/channels/{channel}/messages

URL Parameters

Parameter Status Description
channel_id required The ID of the channel to retrieve messages for

Query Parameters

Parameter Status Description
limit optional number of messages to return (max of 50)
since optional messages after the specified message id will be returned
until optional messages up to but not including the specified message id will be returned

Response Format

Returns an array of ChatMessage

Send Message to Channel

curl -X POST "https://osu.ppy.sh/api/v2/chat/channels/1/messages?channel_id=culpa" \
    -H "Authorization: Bearer {{token}}" \
    -H "Content-Type: application/json" \
    -d '{"message":"culpa","is_action":false}'
const url = new URL("https://osu.ppy.sh/api/v2/chat/channels/1/messages");

let params = {
    "channel_id": "culpa",
};
Object.keys(params).forEach(key => url.searchParams.append(key, params[key]));

let headers = {
    "Authorization": "Bearer {{token}}"
    "Content-Type": "application/json",
    "Accept": "application/json",
}

let body = {
    "message": "culpa",
    "is_action": false
}

fetch(url, {
    method: "POST",
    headers: headers,
    body: body
})
.then(response => response.json())
.then(json => console.log(json));

Example response (200):

{
    "message_id": 9150005004,
    "sender_id": 2,
    "channel_id": 5,
    "timestamp": "2018-07-06T06:33:34+00:00",
    "content": "i am a lazerface",
    "is_action": 0,
    "sender": {
        "id": 2,
        "username": "peppy",
        "profile_colour": "#3366FF",
        "avatar_url": "https:\/\/a.ppy.sh\/2?1519081077.png",
        "country_code": "AU",
        "is_active": true,
        "is_bot": false,
        "is_online": true,
        "is_supporter": true
    }
}

Requires authentication

This endpoint returns the chat messages for a specific channel.

HTTP Request

POST /chat/channels/{channel}/messages

Body Parameters

Parameter Type Status Description
message string required message to send
is_action boolean required whether the message is an action

Query Parameters

Parameter Status Description
channel_id required The channel_id of the channel to send message to

Response Format

The sent ChatMessage

Join Channel

curl -X PUT "https://osu.ppy.sh/api/v2/chat/channels/1/users/1" \
    -H "Authorization: Bearer {{token}}"
const url = new URL("https://osu.ppy.sh/api/v2/chat/channels/1/users/1");

let headers = {
    "Authorization": "Bearer {{token}}"
    "Accept": "application/json",
    "Content-Type": "application/json",
}

fetch(url, {
    method: "PUT",
    headers: headers,
})
.then(response => response.json())
.then(json => console.log(json));

Example response (200):

{
    "channel_id": 5,
    "name": "#osu",
    "description": "The official osu! channel (english only).",
    "type": "public"
}

Requires authentication

This endpoint allows you to join a public channel.

HTTP Request

PUT /chat/channels/{channel}/users/{user}

Response Format

Returns the joined ChatChannel.

Leave Channel

curl -X DELETE "https://osu.ppy.sh/api/v2/chat/channels/1/users/1" \
    -H "Authorization: Bearer {{token}}"
const url = new URL("https://osu.ppy.sh/api/v2/chat/channels/1/users/1");

let headers = {
    "Authorization": "Bearer {{token}}"
    "Accept": "application/json",
    "Content-Type": "application/json",
}

fetch(url, {
    method: "DELETE",
    headers: headers,
})
.then(response => response.json())
.then(json => console.log(json));

Example response (204):

{}

Requires authentication

This endpoint allows you to leave a public channel.

HTTP Request

DELETE /chat/channels/{channel}/users/{user}

Response Format

empty response

Mark Channel as Read

curl -X PUT "https://osu.ppy.sh/api/v2/chat/channels/1/mark-as-read/1?channel_id=culpa&message_id=culpa" \
    -H "Authorization: Bearer {{token}}"
const url = new URL("https://osu.ppy.sh/api/v2/chat/channels/1/mark-as-read/1");

let params = {
    "channel_id": "culpa",
    "message_id": "culpa",
};
Object.keys(params).forEach(key => url.searchParams.append(key, params[key]));

let headers = {
    "Authorization": "Bearer {{token}}"
    "Accept": "application/json",
    "Content-Type": "application/json",
}

fetch(url, {
    method: "PUT",
    headers: headers,
})
.then(response => response.json())
.then(json => console.log(json));

Example response (204):

{}

Requires authentication

This endpoint marks the channel as having being read up to the given message_id.

HTTP Request

PUT /chat/channels/{channel}/mark-as-read/{message}

Query Parameters

Parameter Status Description
channel_id required The channel_id of the channel to mark as read
message_id required The message_id of the message to mark as read up to

Response Format

empty response

Get Channel List

curl -X GET -G "https://osu.ppy.sh/api/v2/chat/channels" \
    -H "Authorization: Bearer {{token}}"
const url = new URL("https://osu.ppy.sh/api/v2/chat/channels");

let headers = {
    "Authorization": "Bearer {{token}}"
    "Accept": "application/json",
    "Content-Type": "application/json",
}

fetch(url, {
    method: "GET",
    headers: headers,
})
.then(response => response.json())
.then(json => console.log(json));

Example response (200):

[
    {
        "channel_id": 5,
        "name": "#osu",
        "description": "The official osu! channel (english only).",
        "type": "public"
    }
]

Requires authentication

This endpoint returns a list of all joinable public channels.

HTTP Request

GET /chat/channels

Response Format

Returns an array of ChatChannel

Create Channel

curl -X POST "https://osu.ppy.sh/api/v2/chat/channels" \
    -H "Authorization: Bearer {{token}}" \
    -H "Content-Type: application/json" \
    -d '{"type":"culpa","target_id":12}'
const url = new URL("https://osu.ppy.sh/api/v2/chat/channels");

let headers = {
    "Authorization": "Bearer {{token}}"
    "Content-Type": "application/json",
    "Accept": "application/json",
}

let body = {
    "type": "culpa",
    "target_id": 12
}

fetch(url, {
    method: "POST",
    headers: headers,
    body: body
})
.then(response => response.json())
.then(json => console.log(json));

Example response (200):

{
    "channel_id": 1,
    "name": "#pm_1-2",
    "description": "",
    "type": "PM",
    "recent_messages": [
        {
            "message_id": 1,
            "sender_id": 1,
            "channel_id": 1,
            "timestamp": "2020-01-01T00:00:00+00:00",
            "content": "Happy new year",
            "is_action": false
        }
    ]
}

Requires authentication

This endpoint creates a new channel if doesn't exist and joins it. Currently only for rejoining existing PM channels which the user has left.

HTTP Request

POST /chat/channels

Body Parameters

Parameter Type Status Description
type string required channel type (currently only supports "PM")
target_id integer optional target user id for type PM

Response Format

Returns ChatChannel with recent_messages attribute. Note that if there's no existing PM channel, most of the fields will be blank. In that case, send a message instead to create the channel.

Comments

Get Comments

curl -X GET -G "https://osu.ppy.sh/api/v2/comments?commentable_type=culpa&commentable_id=culpa&cursor=culpa&parent_id=culpa&sort=culpa" \
    -H "Authorization: Bearer {{token}}"
const url = new URL("https://osu.ppy.sh/api/v2/comments");

let params = {
    "commentable_type": "culpa",
    "commentable_id": "culpa",
    "cursor": "culpa",
    "parent_id": "culpa",
    "sort": "culpa",
};
Object.keys(params).forEach(key => url.searchParams.append(key, params[key]));

let headers = {
    "Authorization": "Bearer {{token}}"
    "Accept": "application/json",
    "Content-Type": "application/json",
}

fetch(url, {
    method: "GET",
    headers: headers,
})
.then(response => response.json())
.then(json => console.log(json));

Example response (422):

{
    "error": ""
}

Requires authentication

Returns a list comments and their replies up to 2 levels deep.

HTTP Request

GET /comments

Query Parameters

Parameter Status Description
commentable_type optional The type of resource to get comments for.
commentable_id optional The id of the resource to get comments for.
cursor optional Pagination option. See CommentSort for detail. The format follows Cursor except it's not currently included in the response.
parent_id optional Limit to comments which are reply to the specified id. Specify 0 to get top level comments.
sort optional Sort option as defined in CommentSort. Defaults to new for guests and user-specified default when authenticated.

Response Format

Returns CommentBundle.

pinned_comments is only included when commentable_type and commentable_id are specified.

Post a new comment

curl -X POST "https://osu.ppy.sh/api/v2/comments?comment%5Bcommentable_id%5D=culpa&comment%5Bcommentable_type%5D=culpa&comment%5Bmessage%5D=culpa&comment%5Bparent_id%5D=culpa" \
    -H "Authorization: Bearer {{token}}"
const url = new URL("https://osu.ppy.sh/api/v2/comments");

let params = {
    "comment.commentable_id": "culpa",
    "comment.commentable_type": "culpa",
    "comment.message": "culpa",
    "comment.parent_id": "culpa",
};
Object.keys(params).forEach(key => url.searchParams.append(key, params[key]));

let headers = {
    "Authorization": "Bearer {{token}}"
    "Accept": "application/json",
    "Content-Type": "application/json",
}

fetch(url, {
    method: "POST",
    headers: headers,
})
.then(response => response.json())
.then(json => console.log(json));

Requires authentication

Posts a new comment to a comment thread.

HTTP Request

POST /comments

Query Parameters

Parameter Status Description
comment.commentable_id optional Resource ID the comment thread is attached to
comment.commentable_type optional Resource type the comment thread is attached to
comment.message optional Text of the comment
comment.parent_id optional The id of the comment to reply to, null if not a reply

Response Format

Returns CommentBundle

Get a Comment

curl -X GET -G "https://osu.ppy.sh/api/v2/comments/1" \
    -H "Authorization: Bearer {{token}}"
const url = new URL("https://osu.ppy.sh/api/v2/comments/1");

let headers = {
    "Authorization": "Bearer {{token}}"
    "Accept": "application/json",
    "Content-Type": "application/json",
}

fetch(url, {
    method: "GET",
    headers: headers,
})
.then(response => response.json())
.then(json => console.log(json));

Example response (200):

{
    "comments": [
        {
            "id": 1,
            "parent_id": null,
            "user_id": 2,
            "pinned": false,
            "replies_count": 5,
            "votes_count": 5,
            "commentable_type": "news_post",
            "commentable_id": 409,
            "legacy_name": null,
            "created_at": "2018-09-11T08:45:49+00:00",
            "updated_at": "2020-11-04T22:08:10+00:00",
            "deleted_at": null,
            "edited_at": null,
            "edited_by_id": null,
            "message": "first... well kind of",
            "message_html": "<div class='osu-md osu-md--comment'><p class=\"osu-md__paragraph\">first... well kind of<\/p>\n<\/div>"
        }
    ],
    "has_more": false,
    "has_more_id": 1,
    "included_comments": [
        {
            "id": 1235036,
            "parent_id": 1,
            "user_id": 18230139,
            "pinned": false,
            "replies_count": 0,
            "votes_count": 0,
            "commentable_type": "news_post",
            "commentable_id": 409,
            "legacy_name": null,
            "created_at": "2020-09-13T15:57:38+00:00",
            "updated_at": "2020-09-13T15:57:38+00:00",
            "deleted_at": null,
            "edited_at": null,
            "edited_by_id": null,
            "message": "coolio",
            "message_html": "<div class='osu-md osu-md--comment'><p class=\"osu-md__paragraph\">coolio<\/p>\n<\/div>"
        },
        {
            "id": 1098904,
            "parent_id": 1,
            "user_id": 13094046,
            "pinned": false,
            "replies_count": 0,
            "votes_count": 0,
            "commentable_type": "news_post",
            "commentable_id": 409,
            "legacy_name": null,
            "created_at": "2020-05-13T03:20:00+00:00",
            "updated_at": "2020-05-13T03:20:00+00:00",
            "deleted_at": null,
            "edited_at": null,
            "edited_by_id": null,
            "message": "is it first comment?",
            "message_html": "<div class='osu-md osu-md--comment'><p class=\"osu-md__paragraph\">is it first comment?<\/p>\n<\/div>"
        },
        {
            "id": 729728,
            "parent_id": 1,
            "user_id": 8218806,
            "pinned": false,
            "replies_count": 0,
            "votes_count": 0,
            "commentable_type": "news_post",
            "commentable_id": 409,
            "legacy_name": null,
            "created_at": "2018-10-23T11:49:51+00:00",
            "updated_at": "2018-10-23T11:49:51+00:00",
            "deleted_at": null,
            "edited_at": null,
            "edited_by_id": null,
            "message": "test",
            "message_html": "<div class='osu-md osu-md--comment'><p class=\"osu-md__paragraph\">test<\/p>\n<\/div>"
        },
        {
            "id": 43743,
            "parent_id": 1,
            "user_id": 3027421,
            "pinned": false,
            "replies_count": 0,
            "votes_count": 0,
            "commentable_type": "news_post",
            "commentable_id": 409,
            "legacy_name": null,
            "created_at": "2018-09-11T08:57:18+00:00",
            "updated_at": "2018-09-11T08:57:18+00:00",
            "deleted_at": null,
            "edited_at": null,
            "edited_by_id": null,
            "message": "Comment without disqus? What kind of sorcery is this ",
            "message_html": "<div class='osu-md osu-md--comment'><p class=\"osu-md__paragraph\">Comment without disqus? What kind of sorcery is this<\/p>\n<\/div>"
        },
        {
            "id": 17686,
            "parent_id": 1,
            "user_id": 2,
            "pinned": false,
            "replies_count": 1,
            "votes_count": 1,
            "commentable_type": "news_post",
            "commentable_id": 409,
            "legacy_name": null,
            "created_at": "2018-09-11T08:50:55+00:00",
            "updated_at": "2019-01-31T17:25:50+00:00",
            "deleted_at": null,
            "edited_at": null,
            "edited_by_id": null,
            "message": ":)",
            "message_html": "<div class='osu-md osu-md--comment'><p class=\"osu-md__paragraph\">:)<\/p>\n<\/div>"
        },
        {
            "id": 34354,
            "parent_id": 17686,
            "user_id": 2,
            "pinned": false,
            "replies_count": 4,
            "votes_count": 1,
            "commentable_type": "news_post",
            "commentable_id": 409,
            "legacy_name": null,
            "created_at": "2018-09-11T08:54:57+00:00",
            "updated_at": "2019-01-31T17:25:50+00:00",
            "deleted_at": null,
            "edited_at": null,
            "edited_by_id": null,
            "message": "goodbye disqus!",
            "message_html": "<div class='osu-md osu-md--comment'><p class=\"osu-md__paragraph\">goodbye disqus!<\/p>\n<\/div>"
        }
    ],
    "pinned_comments": [],
    "user_votes": [],
    "user_follow": false,
    "users": [
        {
            "avatar_url": "https:\/\/a.ppy.sh\/2?1537409912.jpeg",
            "country_code": "AU",
            "default_group": "default",
            "id": 2,
            "is_active": true,
            "is_bot": false,
            "is_online": false,
            "is_supporter": true,
            "last_visit": "2020-11-25T10:21:00+00:00",
            "pm_friends_only": false,
            "profile_colour": "#3366FF",
            "username": "peppy"
        },
        {
            "avatar_url": "https:\/\/a.ppy.sh\/3027421?1605895879.jpeg",
            "country_code": "ID",
            "default_group": "bng",
            "id": 3027421,
            "is_active": true,
            "is_bot": false,
            "is_online": false,
            "is_supporter": false,
            "last_visit": null,
            "pm_friends_only": false,
            "profile_colour": "#6B3FA0",
            "username": "Arzenvald"
        },
        {
            "avatar_url": "https:\/\/a.ppy.sh\/8218806?1531747763.jpeg",
            "country_code": "UA",
            "default_group": "default",
            "id": 8218806,
            "is_active": true,
            "is_bot": false,
            "is_online": false,
            "is_supporter": false,
            "last_visit": "2020-11-23T14:24:40+00:00",
            "pm_friends_only": false,
            "profile_colour": null,
            "username": "Dem0n"
        },
        {
            "avatar_url": "https:\/\/a.ppy.sh\/13094046?1598244696.jpeg",
            "country_code": "KR",
            "default_group": "default",
            "id": 13094046,
            "is_active": true,
            "is_bot": false,
            "is_online": false,
            "is_supporter": false,
            "last_visit": "2020-11-22T12:13:43+00:00",
            "pm_friends_only": false,
            "profile_colour": null,
            "username": "BlackSoftCow"
        },
        {
            "avatar_url": "https:\/\/a.ppy.sh\/18230139?1605995504.jpeg",
            "country_code": "US",
            "default_group": "default",
            "id": 18230139,
            "is_active": true,
            "is_bot": false,
            "is_online": false,
            "is_supporter": true,
            "last_visit": "2020-11-25T05:04:14+00:00",
            "pm_friends_only": false,
            "profile_colour": null,
            "username": "-embed-"
        }
    ],
    "sort": "new",
    "cursor": {
        "created_at": "2018-09-11T08:45:49.000000Z",
        "id": 1
    },
    "commentable_meta": [
        {
            "id": 409,
            "type": "news_post",
            "title": "Project Loved: Week of September 9th",
            "url": "https:\/\/osu.ppy.sh\/home\/news\/2018-09-10-project-loved-week-of-september-9th",
            "owner_id": null,
            "owner_title": null
        },
        {
            "title": "Deleted Item"
        }
    ]
}

Requires authentication

Gets a comment and its replies up to 2 levels deep.

HTTP Request

GET /comments/{comment}

Response Format

Returns CommentBundle

Edit Comment

curl -X PUT "https://osu.ppy.sh/api/v2/comments/1?comment%5Bmessage%5D=culpa" \
    -H "Authorization: Bearer {{token}}"
const url = new URL("https://osu.ppy.sh/api/v2/comments/1");

let params = {
    "comment.message": "culpa",
};
Object.keys(params).forEach(key => url.searchParams.append(key, params[key]));

let headers = {
    "Authorization": "Bearer {{token}}"
    "Accept": "application/json",
    "Content-Type": "application/json",
}

fetch(url, {
    method: "PUT",
    headers: headers,
})
.then(response => response.json())
.then(json => console.log(json));

Requires authentication

Edit an existing comment.

HTTP Request

PUT /comments/{comment}

PATCH /comments/{comment}

Query Parameters

Parameter Status Description
comment.message optional New text of the comment

Response Format

Returns CommentBundle

Delete Comment

curl -X DELETE "https://osu.ppy.sh/api/v2/comments/1" \
    -H "Authorization: Bearer {{token}}"
const url = new URL("https://osu.ppy.sh/api/v2/comments/1");

let headers = {
    "Authorization": "Bearer {{token}}"
    "Accept": "application/json",
    "Content-Type": "application/json",
}

fetch(url, {
    method: "DELETE",
    headers: headers,
})
.then(response => response.json())
.then(json => console.log(json));

Requires authentication

Deletes the specified comment.

HTTP Request

DELETE /comments/{comment}

Response Format

Returns CommentBundle

Add Comment vote

curl -X POST "https://osu.ppy.sh/api/v2/comments/1/vote" \
    -H "Authorization: Bearer {{token}}"
const url = new URL("https://osu.ppy.sh/api/v2/comments/1/vote");

let headers = {
    "Authorization": "Bearer {{token}}"
    "Accept": "application/json",
    "Content-Type": "application/json",
}

fetch(url, {
    method: "POST",
    headers: headers,
})
.then(response => response.json())
.then(json => console.log(json));

Requires authentication

Upvotes a comment.

HTTP Request

POST /comments/{comment}/vote

Response Format

Returns CommentBundle

Remove Comment vote

curl -X DELETE "https://osu.ppy.sh/api/v2/comments/1/vote" \
    -H "Authorization: Bearer {{token}}"
const url = new URL("https://osu.ppy.sh/api/v2/comments/1/vote");

let headers = {
    "Authorization": "Bearer {{token}}"
    "Accept": "application/json",
    "Content-Type": "application/json",
}

fetch(url, {
    method: "DELETE",
    headers: headers,
})
.then(response => response.json())
.then(json => console.log(json));

Requires authentication

Un-upvotes a comment.

HTTP Request

DELETE /comments/{comment}/vote

Response Format

Returns CommentBundle

Multiplayer

Get User High Score

curl -X GET -G "https://osu.ppy.sh/api/v2/rooms/culpa/playlist/culpa/scores/users/culpa" \
    -H "Authorization: Bearer {{token}}"
const url = new URL("https://osu.ppy.sh/api/v2/rooms/culpa/playlist/culpa/scores/users/culpa");

let headers = {
    "Authorization": "Bearer {{token}}"
    "Accept": "application/json",
    "Content-Type": "application/json",
}

fetch(url, {
    method: "GET",
    headers: headers,
})
.then(response => response.json())
.then(json => console.log(json));

Example response (401):

{
    "authentication": "basic"
}

Requires authentication

HTTP Request

GET /rooms/{room}/playlist/{playlist}/scores/users/{user}

URL Parameters

Parameter Status Description
room required Id of the room.
playlist required Id of the playlist item.
user required User id.

Get Scores

curl -X GET -G "https://osu.ppy.sh/api/v2/rooms/culpa/playlist/culpa/scores?limit=culpa&sort=culpa&cursor=culpa" \
    -H "Authorization: Bearer {{token}}"
const url = new URL("https://osu.ppy.sh/api/v2/rooms/culpa/playlist/culpa/scores");

let params = {
    "limit": "culpa",
    "sort": "culpa",
    "cursor": "culpa",
};
Object.keys(params).forEach(key => url.searchParams.append(key, params[key]));

let headers = {
    "Authorization": "Bearer {{token}}"
    "Accept": "application/json",
    "Content-Type": "application/json",
}

fetch(url, {
    method: "GET",
    headers: headers,
})
.then(response => response.json())
.then(json => console.log(json));

Example response (401):

{
    "authentication": "basic"
}

Requires authentication

HTTP Request

GET /rooms/{room}/playlist/{playlist}/scores

URL Parameters

Parameter Status Description
room required Id of the room.
playlist required Id of the playlist item.

Query Parameters

Parameter Status Description
limit optional Number of scores to be returned.
sort optional MultiplayerScoresSort parameter.
cursor optional MultiplayerScoresCursor parameter.

Get a Score

curl -X GET -G "https://osu.ppy.sh/api/v2/rooms/culpa/playlist/culpa/scores/culpa" \
    -H "Authorization: Bearer {{token}}"
const url = new URL("https://osu.ppy.sh/api/v2/rooms/culpa/playlist/culpa/scores/culpa");

let headers = {
    "Authorization": "Bearer {{token}}"
    "Accept": "application/json",
    "Content-Type": "application/json",
}

fetch(url, {
    method: "GET",
    headers: headers,
})
.then(response => response.json())
.then(json => console.log(json));

Example response (401):

{
    "authentication": "basic"
}

Requires authentication

HTTP Request

GET /rooms/{room}/playlist/{playlist}/scores/{score}

URL Parameters

Parameter Status Description
room required Id of the room.
playlist required Id of the playlist item.
score required Id of the score.

Notification

Get Notifications

curl -X GET -G "https://osu.ppy.sh/api/v2/notifications?max_id=culpa" \
    -H "Authorization: Bearer {{token}}"
const url = new URL("https://osu.ppy.sh/api/v2/notifications");

let params = {
    "max_id": "culpa",
};
Object.keys(params).forEach(key => url.searchParams.append(key, params[key]));

let headers = {
    "Authorization": "Bearer {{token}}"
    "Accept": "application/json",
    "Content-Type": "application/json",
}

fetch(url, {
    method: "GET",
    headers: headers,
})
.then(response => response.json())
.then(json => console.log(json));

Example response (200):

{
    "has_more": true,
    "notifications": [
        {
            "id": 1,
            "name": "forum_topic_reply",
            "created_at": "2019-04-24T07:12:43+00:00",
            "object_type": "forum_topic",
            "object_id": 1,
            "source_user_id": 1,
            "is_read": false,
            "details": {
                "title": "A topic",
                "post_id": 2,
                "username": "User",
                "cover_url": "https:\/\/..."
            }
        }
    ],
    "unread_count": 100,
    "notification_endpoint": "wss:\/\/notify.ppy.sh"
}

Requires authentication

This endpoint returns a list of the user's unread notifications. Sorted descending by id with limit of 50.

HTTP Request

GET /notifications

Query Parameters

Parameter Status Description
max_id optional Maximum id fetched. Can be used to load earlier notifications. Defaults to no limit (fetch latest notifications)

Response Format

Returns an object containing Notification and other related attributes.

Field Type
has_more boolean whether or not there are more notifications
notifications array of Notification
unread_count total unread notifications
notification_endpoint url to connect to websocket server

Mark Notifications as Read

curl -X POST "https://osu.ppy.sh/api/v2/notifications/mark-read" \
    -H "Authorization: Bearer {{token}}" \
    -H "Content-Type: application/json" \
    -d '{"ids":"[1, 2, 3]"}'
const url = new URL("https://osu.ppy.sh/api/v2/notifications/mark-read");

let headers = {
    "Authorization": "Bearer {{token}}"
    "Content-Type": "application/json",
    "Accept": "application/json",
}

let body = {
    "ids": "[1, 2, 3]"
}

fetch(url, {
    method: "POST",
    headers: headers,
    body: body
})
.then(response => response.json())
.then(json => console.log(json));

Example response (204):

{}

Requires authentication

This endpoint allows you to mark notifications read.

HTTP Request

POST /notifications/mark-read

Body Parameters

Parameter Type Status Description
ids integer[] required id of notifications to be marked as read

Response Format

empty response

OAuth Tokens

Revoke current token

curl -X DELETE "https://osu.ppy.sh/api/v2/oauth/tokens/current" \
    -H "Authorization: Bearer {{token}}"
const url = new URL("https://osu.ppy.sh/api/v2/oauth/tokens/current");

let headers = {
    "Authorization": "Bearer {{token}}"
    "Accept": "application/json",
    "Content-Type": "application/json",
}

fetch(url, {
    method: "DELETE",
    headers: headers,
})
.then(response => response.json())
.then(json => console.log(json));

Example response (204):

{}

Requires authentication

Revokes currently authenticated token.

HTTP Request

DELETE /oauth/tokens/current

Ranking

Get Ranking

curl -X GET -G "https://osu.ppy.sh/api/v2/rankings/mania/performance?country=JP&filter=all&variant=4k" 
const url = new URL("https://osu.ppy.sh/api/v2/rankings/mania/performance");

let params = {
    "country": "JP",
    "filter": "all",
    "variant": "4k",
};
Object.keys(params).forEach(key => url.searchParams.append(key, params[key]));

let headers = {
    "Accept": "application/json",
    "Content-Type": "application/json",
}

fetch(url, {
    method: "GET",
    headers: headers,
})
.then(response => response.json())
.then(json => console.log(json));

Example response (401):

{
    "authentication": "basic"
}

Gets the current ranking for the specified type and game mode.

HTTP Request

GET /rankings/{mode}/{type}

URL Parameters

Parameter Status Description
mode required GameMode.
type required RankingType.

Query Parameters

Parameter Status Description
country optional Filter ranking by country code. Only available for type of performance.
cursor optional Cursor.
filter optional Either all (default) or friends.
spotlight optional The id of the spotlight if type is charts. Ranking for latest spotlight will be returned if not specified.
variant optional Filter ranking to specified mode variant. For mode of mania, it's either 4k or 7k. Only available for type of performance.

Response Format

Returns Rankings

Get Spotlights

curl -X GET -G "https://osu.ppy.sh/api/v2/spotlights" \
    -H "Authorization: Bearer {{token}}"
const url = new URL("https://osu.ppy.sh/api/v2/spotlights");

let headers = {
    "Authorization": "Bearer {{token}}"
    "Accept": "application/json",
    "Content-Type": "application/json",
}

fetch(url, {
    method: "GET",
    headers: headers,
})
.then(response => response.json())
.then(json => console.log(json));

Example response (401):

{
    "authentication": "basic"
}

Requires authentication

Gets the list of spotlights.

HTTP Request

GET /spotlights

Response Format

Returns Spotlights

Undocumented

api/v2/beatmapsets/events

curl -X GET -G "https://osu.ppy.sh/api/v2/beatmapsets/events" 
const url = new URL("https://osu.ppy.sh/api/v2/beatmapsets/events");

let headers = {
    "Accept": "application/json",
    "Content-Type": "application/json",
}

fetch(url, {
    method: "GET",
    headers: headers,
})
.then(response => response.json())
.then(json => console.log(json));

Example response (401):

{
    "authentication": "basic"
}

HTTP Request

GET /beatmapsets/events

api/v2/beatmapsets/{beatmapset}/favourites

curl -X POST "https://osu.ppy.sh/api/v2/beatmapsets/1/favourites" 
const url = new URL("https://osu.ppy.sh/api/v2/beatmapsets/1/favourites");

let headers = {
    "Accept": "application/json",
    "Content-Type": "application/json",
}

fetch(url, {
    method: "POST",
    headers: headers,
})
.then(response => response.json())
.then(json => console.log(json));

HTTP Request

POST /beatmapsets/{beatmapset}/favourites

api/v2/chat/presence

curl -X GET -G "https://osu.ppy.sh/api/v2/chat/presence" 
const url = new URL("https://osu.ppy.sh/api/v2/chat/presence");

let headers = {
    "Accept": "application/json",
    "Content-Type": "application/json",
}

fetch(url, {
    method: "GET",
    headers: headers,
})
.then(response => response.json())
.then(json => console.log(json));

Example response (401):

{
    "authentication": "basic"
}

HTTP Request

GET /chat/presence

api/v2/changelog/{stream}/{build}

curl -X GET -G "https://osu.ppy.sh/api/v2/changelog/1/1" 
const url = new URL("https://osu.ppy.sh/api/v2/changelog/1/1");

let headers = {
    "Accept": "application/json",
    "Content-Type": "application/json",
}

fetch(url, {
    method: "GET",
    headers: headers,
})
.then(response => response.json())
.then(json => console.log(json));

Example response (404):

{
    "error": null
}

HTTP Request

GET /changelog/{stream}/{build}

api/v2/changelog

curl -X GET -G "https://osu.ppy.sh/api/v2/changelog" 
const url = new URL("https://osu.ppy.sh/api/v2/changelog");

let headers = {
    "Accept": "application/json",
    "Content-Type": "application/json",
}

fetch(url, {
    method: "GET",
    headers: headers,
})
.then(response => response.json())
.then(json => console.log(json));

Example response (200):

{
    "streams": [
        {
            "id": 5,
            "name": "stable40",
            "display_name": "Stable",
            "is_featured": true,
            "latest_build": {
                "id": 5472,
                "version": "20201110",
                "display_version": "20201110",
                "users": 21649,
                "created_at": "2020-11-09T15:07:17+00:00",
                "update_stream": {
                    "id": 5,
                    "name": "stable40",
                    "display_name": "Stable",
                    "is_featured": true
                }
            },
            "user_count": 21883
        },
        {
            "id": 1,
            "name": "stable",
            "display_name": "Stable Fallback",
            "is_featured": false,
            "latest_build": {
                "id": 3808,
                "version": "20160403.6",
                "display_version": "20160403.6",
                "users": 12,
                "created_at": "2016-04-03T12:03:55+00:00",
                "update_stream": {
                    "id": 1,
                    "name": "stable",
                    "display_name": "Stable Fallback",
                    "is_featured": false
                }
            },
            "user_count": 12
        },
        {
            "id": 6,
            "name": "beta40",
            "display_name": "Beta",
            "is_featured": false,
            "latest_build": {
                "id": 5464,
                "version": "20201105",
                "display_version": "20201105",
                "users": 185,
                "created_at": "2020-11-05T04:08:18+00:00",
                "update_stream": {
                    "id": 6,
                    "name": "beta40",
                    "display_name": "Beta",
                    "is_featured": false
                }
            },
            "user_count": 185
        },
        {
            "id": 3,
            "name": "cuttingedge",
            "display_name": "Cutting Edge",
            "is_featured": false,
            "latest_build": {
                "id": 5492,
                "version": "20201124",
                "display_version": "20201124",
                "users": 441,
                "created_at": "2020-11-23T15:19:14+00:00",
                "update_stream": {
                    "id": 3,
                    "name": "cuttingedge",
                    "display_name": "Cutting Edge",
                    "is_featured": false
                }
            },
            "user_count": 450
        },
        {
            "id": 7,
            "name": "lazer",
            "display_name": "Lazer",
            "is_featured": false,
            "latest_build": {
                "id": 5484,
                "version": "2020.1121.0",
                "display_version": "2020.1121.0",
                "users": 0,
                "created_at": "2020-11-20T16:13:10+00:00",
                "update_stream": {
                    "id": 7,
                    "name": "lazer",
                    "display_name": "Lazer",
                    "is_featured": false
                }
            },
            "user_count": 0
        },
        {
            "id": 8,
            "name": "web",
            "display_name": "Web",
            "is_featured": false,
            "latest_build": {
                "id": 5491,
                "version": "2020.1122.0",
                "display_version": "2020.1122.0",
                "users": 0,
                "created_at": "2020-11-22T07:34:26+00:00",
                "update_stream": {
                    "id": 8,
                    "name": "web",
                    "display_name": "Web",
                    "is_featured": false
                }
            },
            "user_count": 0
        }
    ],
    "builds": [
        {
            "id": 5492,
            "version": "20201124",
            "display_version": "20201124",
            "users": 441,
            "created_at": "2020-11-23T15:19:14+00:00",
            "update_stream": {
                "id": 3,
                "name": "cuttingedge",
                "display_name": "Cutting Edge",
                "is_featured": false
            },
            "changelog_entries": [
                {
                    "id": null,
                    "repository": null,
                    "github_pull_request_id": null,
                    "github_url": null,
                    "url": null,
                    "type": "fix",
                    "category": "Misc",
                    "title": "Bump MaxMind.GeoIP2 from 3.3.0 to 4.0.0",
                    "message_html": null,
                    "major": false,
                    "created_at": "2020-11-19T05:20:55+00:00",
                    "github_user": {
                        "id": null,
                        "display_name": "BanchoBot",
                        "github_url": null,
                        "osu_username": "BanchoBot",
                        "user_id": 3,
                        "user_url": "https:\/\/osu.ppy.sh\/users\/3"
                    }
                },
                {
                    "id": null,
                    "repository": null,
                    "github_pull_request_id": null,
                    "github_url": null,
                    "url": null,
                    "type": "add",
                    "category": "Web",
                    "title": "Add conditionals for new Mappers' Guild packs (5-6) and new Beatmap Challenge Packs (7-9)",
                    "message_html": null,
                    "major": false,
                    "created_at": "2020-11-20T04:12:02+00:00",
                    "github_user": {
                        "id": null,
                        "display_name": "Ephemeral",
                        "github_url": null,
                        "osu_username": "Ephemeral",
                        "user_id": 102335,
                        "user_url": "https:\/\/osu.ppy.sh\/users\/102335"
                    }
                },
                {
                    "id": null,
                    "repository": null,
                    "github_pull_request_id": null,
                    "github_url": null,
                    "url": null,
                    "type": "fix",
                    "category": "Web",
                    "title": "Update Camellia II medal to appropriate challenge parameters",
                    "message_html": null,
                    "major": false,
                    "created_at": "2020-11-20T05:22:32+00:00",
                    "github_user": {
                        "id": null,
                        "display_name": "Ephemeral",
                        "github_url": null,
                        "osu_username": "Ephemeral",
                        "user_id": 102335,
                        "user_url": "https:\/\/osu.ppy.sh\/users\/102335"
                    }
                },
                {
                    "id": null,
                    "repository": null,
                    "github_pull_request_id": null,
                    "github_url": null,
                    "url": null,
                    "type": "fix",
                    "category": "Misc",
                    "title": "Bump MaxMind.GeoIP2 from 4.0.0 to 4.0.1",
                    "message_html": null,
                    "major": false,
                    "created_at": "2020-11-20T08:02:34+00:00",
                    "github_user": {
                        "id": null,
                        "display_name": "BanchoBot",
                        "github_url": null,
                        "osu_username": "BanchoBot",
                        "user_id": 3,
                        "user_url": "https:\/\/osu.ppy.sh\/users\/3"
                    }
                }
            ]
        },
        {
            "id": 5491,
            "version": "2020.1122.0",
            "display_version": "2020.1122.0",
            "users": 0,
            "created_at": "2020-11-22T07:34:26+00:00",
            "update_stream": {
                "id": 8,
                "name": "web",
                "display_name": "Web",
                "is_featured": false
            },
            "changelog_entries": [
                {
                    "id": 9891,
                    "repository": "ppy\/osu-wiki",
                    "github_pull_request_id": 4508,
                    "github_url": "https:\/\/github.com\/ppy\/osu-wiki\/pull\/4508",
                    "url": null,
                    "type": "add",
                    "category": "Wiki",
                    "title": "Add new featured artist I love you Orchestra news post",
                    "message_html": null,
                    "major": false,
                    "created_at": "2020-11-21T10:10:39+00:00",
                    "github_user": {
                        "id": 27,
                        "display_name": "pishifat",
                        "github_url": "https:\/\/github.com\/pishifat",
                        "osu_username": null,
                        "user_id": null,
                        "user_url": null
                    }
                },
                {
                    "id": 9893,
                    "repository": "ppy\/osu-wiki",
                    "github_pull_request_id": 4255,
                    "github_url": "https:\/\/github.com\/ppy\/osu-wiki\/pull\/4255",
                    "url": null,
                    "type": "fix",
                    "category": "Wiki",
                    "title": "[ID] Rework and Update FAQ",
                    "message_html": null,
                    "major": false,
                    "created_at": "2020-11-21T15:19:12+00:00",
                    "github_user": {
                        "id": 323,
                        "display_name": "Nivalyx",
                        "github_url": "https:\/\/github.com\/Nivalyx",
                        "osu_username": null,
                        "user_id": null,
                        "user_url": null
                    }
                },
                {
                    "id": 9894,
                    "repository": "ppy\/osu-wiki",
                    "github_pull_request_id": 4507,
                    "github_url": "https:\/\/github.com\/ppy\/osu-wiki\/pull\/4507",
                    "url": null,
                    "type": "fix",
                    "category": "Wiki",
                    "title": "[PT-BR] Fix two typos in Abuse",
                    "message_html": null,
                    "major": false,
                    "created_at": "2020-11-21T17:37:14+00:00",
                    "github_user": {
                        "id": 249,
                        "display_name": "pimpG",
                        "github_url": "https:\/\/github.com\/pimpG",
                        "osu_username": null,
                        "user_id": null,
                        "user_url": null
                    }
                },
                {
                    "id": 9896,
                    "repository": "ppy\/osu-wiki",
                    "github_pull_request_id": 4498,
                    "github_url": "https:\/\/github.com\/ppy\/osu-wiki\/pull\/4498",
                    "url": null,
                    "type": "fix",
                    "category": "Wiki",
                    "title": "[PT-BR] Update Rules",
                    "message_html": null,
                    "major": false,
                    "created_at": "2020-11-21T22:30:53+00:00",
                    "github_user": {
                        "id": 303,
                        "display_name": "Flantsune",
                        "github_url": "https:\/\/github.com\/Flantsune",
                        "osu_username": null,
                        "user_id": null,
                        "user_url": null
                    }
                },
                {
                    "id": 9897,
                    "repository": "ppy\/osu-web",
                    "github_pull_request_id": 6899,
                    "github_url": "https:\/\/github.com\/ppy\/osu-web\/pull\/6899",
                    "url": null,
                    "type": "fix",
                    "category": "Misc",
                    "title": "Remove ids query type filter",
                    "message_html": null,
                    "major": false,
                    "created_at": "2020-11-22T07:29:59+00:00",
                    "github_user": {
                        "id": 1,
                        "display_name": "notbakaneko",
                        "github_url": "https:\/\/github.com\/notbakaneko",
                        "osu_username": "notbakaneko",
                        "user_id": 10751776,
                        "user_url": "https:\/\/osu.ppy.sh\/users\/10751776"
                    }
                }
            ]
        },
        {
            "id": 5490,
            "version": "2020.1121.0",
            "display_version": "2020.1121.0",
            "users": 0,
            "created_at": "2020-11-21T04:49:48+00:00",
            "update_stream": {
                "id": 8,
                "name": "web",
                "display_name": "Web",
                "is_featured": false
            },
            "changelog_entries": [
                {
                    "id": 9888,
                    "repository": "ppy\/osu-wiki",
                    "github_pull_request_id": 4501,
                    "github_url": "https:\/\/github.com\/ppy\/osu-wiki\/pull\/4501",
                    "url": null,
                    "type": "fix",
                    "category": "Wiki",
                    "title": "[PT-BR] Translate Abuse article",
                    "message_html": null,
                    "major": false,
                    "created_at": "2020-11-20T21:27:25+00:00",
                    "github_user": {
                        "id": 303,
                        "display_name": "Flantsune",
                        "github_url": "https:\/\/github.com\/Flantsune",
                        "osu_username": null,
                        "user_id": null,
                        "user_url": null
                    }
                },
                {
                    "id": 9889,
                    "repository": "ppy\/osu-wiki",
                    "github_pull_request_id": 4496,
                    "github_url": "https:\/\/github.com\/ppy\/osu-wiki\/pull\/4496",
                    "url": null,
                    "type": "fix",
                    "category": "Wiki",
                    "title": "[TH] Update Rules",
                    "message_html": null,
                    "major": false,
                    "created_at": "2020-11-21T01:54:11+00:00",
                    "github_user": {
                        "id": 430,
                        "display_name": "Trigonoculus",
                        "github_url": "https:\/\/github.com\/Trigonoculus",
                        "osu_username": null,
                        "user_id": null,
                        "user_url": null
                    }
                },
                {
                    "id": 9890,
                    "repository": "ppy\/osu-wiki",
                    "github_pull_request_id": 4393,
                    "github_url": "https:\/\/github.com\/ppy\/osu-wiki\/pull\/4393",
                    "url": null,
                    "type": "fix",
                    "category": "Wiki",
                    "title": "[FR] Update Do you really want to ask peppy?",
                    "message_html": null,
                    "major": false,
                    "created_at": "2020-11-21T01:58:10+00:00",
                    "github_user": {
                        "id": 214,
                        "display_name": "UltayJr",
                        "github_url": "https:\/\/github.com\/UltayJr",
                        "osu_username": null,
                        "user_id": null,
                        "user_url": null
                    }
                }
            ]
        },
        {
            "id": 5484,
            "version": "2020.1121.0",
            "display_version": "2020.1121.0",
            "users": 0,
            "created_at": "2020-11-20T16:13:10+00:00",
            "update_stream": {
                "id": 7,
                "name": "lazer",
                "display_name": "Lazer",
                "is_featured": false
            },
            "changelog_entries": [
                {
                    "id": 9799,
                    "repository": "ppy\/osu",
                    "github_pull_request_id": 10840,
                    "github_url": "https:\/\/github.com\/ppy\/osu\/pull\/10840",
                    "url": null,
                    "type": "add",
                    "category": "Reliability",
                    "title": "Add null checks to unguarded resolved-as-possibly-null fields",
                    "message_html": null,
                    "major": false,
                    "created_at": "2020-11-15T04:15:33+00:00",
                    "github_user": {
                        "id": 218,
                        "display_name": "bdach",
                        "github_url": "https:\/\/github.com\/bdach",
                        "osu_username": null,
                        "user_id": null,
                        "user_url": null
                    }
                },
                {
                    "id": 9802,
                    "repository": "ppy\/osu",
                    "github_pull_request_id": 10841,
                    "github_url": "https:\/\/github.com\/ppy\/osu\/pull\/10841",
                    "url": null,
                    "type": "add",
                    "category": "UI",
                    "title": "Add support for previewing tracks on spectator screen",
                    "message_html": null,
                    "major": false,
                    "created_at": "2020-11-15T16:09:37+00:00",
                    "github_user": {
                        "id": 218,
                        "display_name": "bdach",
                        "github_url": "https:\/\/github.com\/bdach",
                        "osu_username": null,
                        "user_id": null,
                        "user_url": null
                    }
                },
                {
                    "id": 9808,
                    "repository": "ppy\/osu-framework",
                    "github_pull_request_id": 3998,
                    "github_url": "https:\/\/github.com\/ppy\/osu-framework\/pull\/3998",
                    "url": null,
                    "type": "fix",
                    "category": "Tooling",
                    "title": "Update tools to allow InspectCode to run in non-Windows environment",
                    "message_html": null,
                    "major": false,
                    "created_at": "2020-11-16T02:55:42+00:00",
                    "github_user": {
                        "id": 26,
                        "display_name": "ekrctb",
                        "github_url": "https:\/\/github.com\/ekrctb",
                        "osu_username": null,
                        "user_id": null,
                        "user_url": null
                    }
                },
                {
                    "id": 9809,
                    "repository": "ppy\/osu",
                    "github_pull_request_id": 10850,
                    "github_url": "https:\/\/github.com\/ppy\/osu\/pull\/10850",
                    "url": null,
                    "type": "fix",
                    "category": "Editor",
                    "title": "Clamp selection movement instead of refusing to move on playfield borders",
                    "message_html": null,
                    "major": false,
                    "created_at": "2020-11-16T03:46:48+00:00",
                    "github_user": {
                        "id": 429,
                        "display_name": "nbvdkamp",
                        "github_url": "https:\/\/github.com\/nbvdkamp",
                        "osu_username": null,
                        "user_id": null,
                        "user_url": null
                    }
                },
                {
                    "id": 9810,
                    "repository": "ppy\/osu-framework",
                    "github_pull_request_id": 4002,
                    "github_url": "https:\/\/github.com\/ppy\/osu-framework\/pull\/4002",
                    "url": null,
                    "type": "fix",
                    "category": "Tooling",
                    "title": "Update tools to allow InspectCode to run in non-Windows environment",
                    "message_html": null,
                    "major": false,
                    "created_at": "2020-11-16T05:32:04+00:00",
                    "github_user": {
                        "id": 26,
                        "display_name": "ekrctb",
                        "github_url": "https:\/\/github.com\/ekrctb",
                        "osu_username": null,
                        "user_id": null,
                        "user_url": null
                    }
                },
                {
                    "id": 9811,
                    "repository": "ppy\/osu",
                    "github_pull_request_id": 10856,
                    "github_url": "https:\/\/github.com\/ppy\/osu\/pull\/10856",
                    "url": null,
                    "type": "fix",
                    "category": "Ruleset API",
                    "title": "Clear DrawableHitObject transforms on return to pool",
                    "message_html": null,
                    "major": false,
                    "created_at": "2020-11-16T05:40:38+00:00",
                    "github_user": {
                        "id": 218,
                        "display_name": "bdach",
                        "github_url": "https:\/\/github.com\/bdach",
                        "osu_username": null,
                        "user_id": null,
                        "user_url": null
                    }
                },
                {
                    "id": 9812,
                    "repository": "ppy\/osu",
                    "github_pull_request_id": 10838,
                    "github_url": "https:\/\/github.com\/ppy\/osu\/pull\/10838",
                    "url": null,
                    "type": "fix",
                    "category": "Editor",
                    "title": "Fix crash on shift+right-click deleting objects",
                    "message_html": null,
                    "major": false,
                    "created_at": "2020-11-16T05:42:52+00:00",
                    "github_user": {
                        "id": 429,
                        "display_name": "nbvdkamp",
                        "github_url": "https:\/\/github.com\/nbvdkamp",
                        "osu_username": null,
                        "user_id": null,
                        "user_url": null
                    }
                },
                {
                    "id": 9813,
                    "repository": "ppy\/osu",
                    "github_pull_request_id": 10853,
                    "github_url": "https:\/\/github.com\/ppy\/osu\/pull\/10853",
                    "url": null,
                    "type": "fix",
                    "category": "Gameplay",
                    "title": "Fully cover bidirectional legacy mod conversions",
                    "message_html": null,
                    "major": false,
                    "created_at": "2020-11-16T06:22:05+00:00",
                    "github_user": {
                        "id": 218,
                        "display_name": "bdach",
                        "github_url": "https:\/\/github.com\/bdach",
                        "osu_username": null,
                        "user_id": null,
                        "user_url": null
                    }
                },
                {
                    "id": 9814,
                    "repository": "ppy\/osu",
                    "github_pull_request_id": 10830,
                    "github_url": "https:\/\/github.com\/ppy\/osu\/pull\/10830",
                    "url": null,
                    "type": "fix",
                    "category": "Code Quality",
                    "title": "Make tournament strings more consistent",
                    "message_html": null,
                    "major": false,
                    "created_at": "2020-11-16T07:20:49+00:00",
                    "github_user": {
                        "id": 9,
                        "display_name": "Joehuu",
                        "github_url": "https:\/\/github.com\/Joehuu",
                        "osu_username": null,
                        "user_id": null,
                        "user_url": null
                    }
                },
                {
                    "id": 9815,
                    "repository": "ppy\/osu",
                    "github_pull_request_id": 10860,
                    "github_url": "https:\/\/github.com\/ppy\/osu\/pull\/10860",
                    "url": null,
                    "type": "fix",
                    "category": "Tooling",
                    "title": "Use `dotnet tool` for InspectCode build script",
                    "message_html": null,
                    "major": false,
                    "created_at": "2020-11-16T07:25:01+00:00",
                    "github_user": {
                        "id": 26,
                        "display_name": "ekrctb",
                        "github_url": "https:\/\/github.com\/ekrctb",
                        "osu_username": null,
                        "user_id": null,
                        "user_url": null
                    }
                },
                {
                    "id": 9818,
                    "repository": "ppy\/osu",
                    "github_pull_request_id": 10844,
                    "github_url": "https:\/\/github.com\/ppy\/osu\/pull\/10844",
                    "url": null,
                    "type": "fix",
                    "category": "Gameplay (osu!)",
                    "title": "Fix rotation tracker state not being reset on drawable spinner re-use",
                    "message_html": null,
                    "major": false,
                    "created_at": "2020-11-16T08:10:40+00:00",
                    "github_user": {
                        "id": 218,
                        "display_name": "bdach",
                        "github_url": "https:\/\/github.com\/bdach",
                        "osu_username": null,
                        "user_id": null,
                        "user_url": null
                    }
                },
                {
                    "id": 9820,
                    "repository": "ppy\/osu",
                    "github_pull_request_id": 10862,
                    "github_url": "https:\/\/github.com\/ppy\/osu\/pull\/10862",
                    "url": null,
                    "type": "fix",
                    "category": "Reliability",
                    "title": "Move skin deletion logic to OsuGameBase to promote thread safety",
                    "message_html": null,
                    "major": false,
                    "created_at": "2020-11-16T09:41:46+00:00",
                    "github_user": {
                        "id": 3,
                        "display_name": "peppy",
                        "github_url": "https:\/\/github.com\/peppy",
                        "osu_username": "peppy",
                        "user_id": 2,
                        "user_url": "https:\/\/osu.ppy.sh\/users\/2"
                    }
                },
                {
                    "id": 9821,
                    "repository": "ppy\/osu",
                    "github_pull_request_id": 10865,
                    "github_url": "https:\/\/github.com\/ppy\/osu\/pull\/10865",
                    "url": null,
                    "type": "fix",
                    "category": "Tooling",
                    "title": "Remove `--no-restore` from VSCode tasks",
                    "message_html": null,
                    "major": false,
                    "created_at": "2020-11-16T11:08:10+00:00",
                    "github_user": {
                        "id": 26,
                        "display_name": "ekrctb",
                        "github_url": "https:\/\/github.com\/ekrctb",
                        "osu_username": null,
                        "user_id": null,
                        "user_url": null
                    }
                },
                {
                    "id": 9822,
                    "repository": "ppy\/osu-framework",
                    "github_pull_request_id": 4003,
                    "github_url": "https:\/\/github.com\/ppy\/osu-framework\/pull\/4003",
                    "url": null,
                    "type": "fix",
                    "category": "Tooling",
                    "title": "Remove `--no-restore` from VSCode build tasks",
                    "message_html": null,
                    "major": false,
                    "created_at": "2020-11-16T11:21:50+00:00",
                    "github_user": {
                        "id": 26,
                        "display_name": "ekrctb",
                        "github_url": "https:\/\/github.com\/ekrctb",
                        "osu_username": null,
                        "user_id": null,
                        "user_url": null
                    }
                },
                {
                    "id": 9823,
                    "repository": "ppy\/osu-framework",
                    "github_pull_request_id": 3994,
                    "github_url": "https:\/\/github.com\/ppy\/osu-framework\/pull\/3994",
                    "url": null,
                    "type": "fix",
                    "category": "Code Quality",
                    "title": "Remove IWindow inheritance of IGameWindow",
                    "message_html": null,
                    "major": false,
                    "created_at": "2020-11-16T12:22:08+00:00",
                    "github_user": {
                        "id": 3,
                        "display_name": "peppy",
                        "github_url": "https:\/\/github.com\/peppy",
                        "osu_username": "peppy",
                        "user_id": 2,
                        "user_url": "https:\/\/osu.ppy.sh\/users\/2"
                    }
                },
                {
                    "id": 9824,
                    "repository": "ppy\/osu-framework",
                    "github_pull_request_id": 3995,
                    "github_url": "https:\/\/github.com\/ppy\/osu-framework\/pull\/3995",
                    "url": null,
                    "type": "fix",
                    "category": "Code Quality",
                    "title": "Tidy up some aspects on OsuTKWindow",
                    "message_html": null,
                    "major": false,
                    "created_at": "2020-11-16T12:56:31+00:00",
                    "github_user": {
                        "id": 3,
                        "display_name": "peppy",
                        "github_url": "https:\/\/github.com\/peppy",
                        "osu_username": "peppy",
                        "user_id": 2,
                        "user_url": "https:\/\/osu.ppy.sh\/users\/2"
                    }
                },
                {
                    "id": 9827,
                    "repository": "ppy\/osu",
                    "github_pull_request_id": 10873,
                    "github_url": "https:\/\/github.com\/ppy\/osu\/pull\/10873",
                    "url": null,
                    "type": "fix",
                    "category": "Ruleset API",
                    "title": "Remove ability to pool DHOs in parent playfields",
                    "message_html": null,
                    "major": false,
                    "created_at": "2020-11-16T16:55:14+00:00",
                    "github_user": {
                        "id": 5,
                        "display_name": "smoogipoo",
                        "github_url": "https:\/\/github.com\/smoogipoo",
                        "osu_username": "smoogipoo",
                        "user_id": 1040328,
                        "user_url": "https:\/\/osu.ppy.sh\/users\/1040328"
                    }
                },
                {
                    "id": 9828,
                    "repository": "ppy\/osu",
                    "github_pull_request_id": 10871,
                    "github_url": "https:\/\/github.com\/ppy\/osu\/pull\/10871",
                    "url": null,
                    "type": "fix",
                    "category": "Gameplay (osu!)",
                    "title": "Fix slider ball tint not working",
                    "message_html": null,
                    "major": false,
                    "created_at": "2020-11-16T16:58:34+00:00",
                    "github_user": {
                        "id": 5,
                        "display_name": "smoogipoo",
                        "github_url": "https:\/\/github.com\/smoogipoo",
                        "osu_username": "smoogipoo",
                        "user_id": 1040328,
                        "user_url": "https:\/\/osu.ppy.sh\/users\/1040328"
                    }
                },
                {
                    "id": 9829,
                    "repository": "ppy\/osu",
                    "github_pull_request_id": 10868,
                    "github_url": "https:\/\/github.com\/ppy\/osu\/pull\/10868",
                    "url": null,
                    "type": "add",
                    "category": "Ruleset API",
                    "title": "Add back removed InitialLifetimeOffset usage in DrawableHitObject",
                    "message_html": null,
                    "major": false,
                    "created_at": "2020-11-16T18:30:16+00:00",
                    "github_user": {
                        "id": 5,
                        "display_name": "smoogipoo",
                        "github_url": "https:\/\/github.com\/smoogipoo",
                        "osu_username": "smoogipoo",
                        "user_id": 1040328,
                        "user_url": "https:\/\/osu.ppy.sh\/users\/1040328"
                    }
                },
                {
                    "id": 9833,
                    "repository": "ppy\/osu",
                    "github_pull_request_id": 10867,
                    "github_url": "https:\/\/github.com\/ppy\/osu\/pull\/10867",
                    "url": null,
                    "type": "fix",
                    "category": "Online",
                    "title": "Refactor user caching to improve readability and fix threadsafety issues",
                    "message_html": null,
                    "major": false,
                    "created_at": "2020-11-17T05:20:46+00:00",
                    "github_user": {
                        "id": 5,
                        "display_name": "smoogipoo",
                        "github_url": "https:\/\/github.com\/smoogipoo",
                        "osu_username": "smoogipoo",
                        "user_id": 1040328,
                        "user_url": "https:\/\/osu.ppy.sh\/users\/1040328"
                    }
                },
                {
                    "id": 9834,
                    "repository": "ppy\/osu",
                    "github_pull_request_id": 10831,
                    "github_url": "https:\/\/github.com\/ppy\/osu\/pull\/10831",
                    "url": null,
                    "type": "add",
                    "category": "Gameplay (osu!mania)",
                    "title": "Add back fade effect to legacy hold notes",
                    "message_html": null,
                    "major": false,
                    "created_at": "2020-11-17T06:27:11+00:00",
                    "github_user": {
                        "id": 218,
                        "display_name": "bdach",
                        "github_url": "https:\/\/github.com\/bdach",
                        "osu_username": null,
                        "user_id": null,
                        "user_url": null
                    }
                },
                {
                    "id": 9837,
                    "repository": "ppy\/osu",
                    "github_pull_request_id": 10881,
                    "github_url": "https:\/\/github.com\/ppy\/osu\/pull\/10881",
                    "url": null,
                    "type": "fix",
                    "category": "Testing",
                    "title": "Fix TestSceneFruitObjects not displaying anything",
                    "message_html": null,
                    "major": false,
                    "created_at": "2020-11-17T15:13:27+00:00",
                    "github_user": {
                        "id": 26,
                        "display_name": "ekrctb",
                        "github_url": "https:\/\/github.com\/ekrctb",
                        "osu_username": null,
                        "user_id": null,
                        "user_url": null
                    }
                },
                {
                    "id": 9841,
                    "repository": "ppy\/osu-framework",
                    "github_pull_request_id": 4005,
                    "github_url": "https:\/\/github.com\/ppy\/osu-framework\/pull\/4005",
                    "url": null,
                    "type": "fix",
                    "category": "Testing",
                    "title": "Rework DCC class expansion heuristic to reduce failures",
                    "message_html": null,
                    "major": false,
                    "created_at": "2020-11-18T01:29:31+00:00",
                    "github_user": {
                        "id": 5,
                        "display_name": "smoogipoo",
                        "github_url": "https:\/\/github.com\/smoogipoo",
                        "osu_username": "smoogipoo",
                        "user_id": 1040328,
                        "user_url": "https:\/\/osu.ppy.sh\/users\/1040328"
                    }
                },
                {
                    "id": 9846,
                    "repository": "ppy\/osu",
                    "github_pull_request_id": 10884,
                    "github_url": "https:\/\/github.com\/ppy\/osu\/pull\/10884",
                    "url": null,
                    "type": "fix",
                    "category": "Editor",
                    "title": "Tighten osu! ruleset lifetime expiry for past hitobjects",
                    "message_html": null,
                    "major": false,
                    "created_at": "2020-11-18T09:40:20+00:00",
                    "github_user": {
                        "id": 5,
                        "display_name": "smoogipoo",
                        "github_url": "https:\/\/github.com\/smoogipoo",
                        "osu_username": "smoogipoo",
                        "user_id": 1040328,
                        "user_url": "https:\/\/osu.ppy.sh\/users\/1040328"
                    }
                },
                {
                    "id": 9847,
                    "repository": "ppy\/osu",
                    "github_pull_request_id": 10883,
                    "github_url": "https:\/\/github.com\/ppy\/osu\/pull\/10883",
                    "url": null,
                    "type": "fix",
                    "category": "Editor",
                    "title": "Define blueprint order similarly to hitobjects",
                    "message_html": null,
                    "major": false,
                    "created_at": "2020-11-18T09:46:38+00:00",
                    "github_user": {
                        "id": 5,
                        "display_name": "smoogipoo",
                        "github_url": "https:\/\/github.com\/smoogipoo",
                        "osu_username": "smoogipoo",
                        "user_id": 1040328,
                        "user_url": "https:\/\/osu.ppy.sh\/users\/1040328"
                    }
                },
                {
                    "id": 9848,
                    "repository": "ppy\/osu",
                    "github_pull_request_id": 10876,
                    "github_url": "https:\/\/github.com\/ppy\/osu\/pull\/10876",
                    "url": null,
                    "type": "fix",
                    "category": "Editor",
                    "title": "Fix slider control point connections not being updated",
                    "message_html": null,
                    "major": false,
                    "created_at": "2020-11-18T09:54:55+00:00",
                    "github_user": {
                        "id": 429,
                        "display_name": "nbvdkamp",
                        "github_url": "https:\/\/github.com\/nbvdkamp",
                        "osu_username": null,
                        "user_id": null,
                        "user_url": null
                    }
                },
                {
                    "id": 9849,
                    "repository": "ppy\/osu",
                    "github_pull_request_id": 10877,
                    "github_url": "https:\/\/github.com\/ppy\/osu\/pull\/10877",
                    "url": null,
                    "type": "fix",
                    "category": "Gameplay (osu!mania)",
                    "title": "Fix hold note judgements displaying incorrectly",
                    "message_html": null,
                    "major": false,
                    "created_at": "2020-11-18T10:00:15+00:00",
                    "github_user": {
                        "id": 5,
                        "display_name": "smoogipoo",
                        "github_url": "https:\/\/github.com\/smoogipoo",
                        "osu_username": "smoogipoo",
                        "user_id": 1040328,
                        "user_url": "https:\/\/osu.ppy.sh\/users\/1040328"
                    }
                },
                {
                    "id": 9852,
                    "repository": "ppy\/osu",
                    "github_pull_request_id": 10889,
                    "github_url": "https:\/\/github.com\/ppy\/osu\/pull\/10889",
                    "url": null,
                    "type": "fix",
                    "category": "Gameplay",
                    "title": "Fix SkinnableSprite initialising a drawable even when the texture is not available",
                    "message_html": null,
                    "major": false,
                    "created_at": "2020-11-18T12:35:14+00:00",
                    "github_user": {
                        "id": 3,
                        "display_name": "peppy",
                        "github_url": "https:\/\/github.com\/peppy",
                        "osu_username": "peppy",
                        "user_id": 2,
                        "user_url": "https:\/\/osu.ppy.sh\/users\/2"
                    }
                },
                {
                    "id": 9854,
                    "repository": "ppy\/osu-framework",
                    "github_pull_request_id": 4007,
                    "github_url": "https:\/\/github.com\/ppy\/osu-framework\/pull\/4007",
                    "url": null,
                    "type": "fix",
                    "category": "Code Quality",
                    "title": "Remove obsolete property",
                    "message_html": null,
                    "major": false,
                    "created_at": "2020-11-18T14:07:08+00:00",
                    "github_user": {
                        "id": 5,
                        "display_name": "smoogipoo",
                        "github_url": "https:\/\/github.com\/smoogipoo",
                        "osu_username": "smoogipoo",
                        "user_id": 1040328,
                        "user_url": "https:\/\/osu.ppy.sh\/users\/1040328"
                    }
                },
                {
                    "id": 9855,
                    "repository": "ppy\/osu",
                    "github_pull_request_id": 10891,
                    "github_url": "https:\/\/github.com\/ppy\/osu\/pull\/10891",
                    "url": null,
                    "type": "fix",
                    "category": "Code Quality",
                    "title": "Remove obsolete method",
                    "message_html": null,
                    "major": false,
                    "created_at": "2020-11-18T14:07:32+00:00",
                    "github_user": {
                        "id": 5,
                        "display_name": "smoogipoo",
                        "github_url": "https:\/\/github.com\/smoogipoo",
                        "osu_username": "smoogipoo",
                        "user_id": 1040328,
                        "user_url": "https:\/\/osu.ppy.sh\/users\/1040328"
                    }
                },
                {
                    "id": 9856,
                    "repository": "ppy\/osu",
                    "github_pull_request_id": 10878,
                    "github_url": "https:\/\/github.com\/ppy\/osu\/pull\/10878",
                    "url": null,
                    "type": "add",
                    "category": "Gameplay (osu!)",
                    "title": "Add ability for skins to have more control over judgement transforms",
                    "message_html": null,
                    "major": false,
                    "created_at": "2020-11-18T19:33:30+00:00",
                    "github_user": {
                        "id": 3,
                        "display_name": "peppy",
                        "github_url": "https:\/\/github.com\/peppy",
                        "osu_username": "peppy",
                        "user_id": 2,
                        "user_url": "https:\/\/osu.ppy.sh\/users\/2"
                    }
                },
                {
                    "id": 9857,
                    "repository": "ppy\/osu-framework",
                    "github_pull_request_id": 4006,
                    "github_url": "https:\/\/github.com\/ppy\/osu-framework\/pull\/4006",
                    "url": null,
                    "type": "fix",
                    "category": "Testing",
                    "title": "Allow dynamic recompilation to access internal members",
                    "message_html": null,
                    "major": false,
                    "created_at": "2020-11-18T20:07:57+00:00",
                    "github_user": {
                        "id": 5,
                        "display_name": "smoogipoo",
                        "github_url": "https:\/\/github.com\/smoogipoo",
                        "osu_username": "smoogipoo",
                        "user_id": 1040328,
                        "user_url": "https:\/\/osu.ppy.sh\/users\/1040328"
                    }
                },
                {
                    "id": 9860,
                    "repository": "ppy\/osu",
                    "github_pull_request_id": 10872,
                    "github_url": "https:\/\/github.com\/ppy\/osu\/pull\/10872",
                    "url": null,
                    "type": "fix",
                    "category": "Gameplay",
                    "title": "Fix triangles disappearing after a while",
                    "message_html": null,
                    "major": false,
                    "created_at": "2020-11-19T05:11:08+00:00",
                    "github_user": {
                        "id": 5,
                        "display_name": "smoogipoo",
                        "github_url": "https:\/\/github.com\/smoogipoo",
                        "osu_username": "smoogipoo",
                        "user_id": 1040328,
                        "user_url": "https:\/\/osu.ppy.sh\/users\/1040328"
                    }
                },
                {
                    "id": 9863,
                    "repository": "ppy\/osu-framework",
                    "github_pull_request_id": 4010,
                    "github_url": "https:\/\/github.com\/ppy\/osu-framework\/pull\/4010",
                    "url": null,
                    "type": "fix",
                    "category": "Framework",
                    "title": "Update SDl2 native libraries to fix issues on windows and macOS",
                    "message_html": null,
                    "major": false,
                    "created_at": "2020-11-19T12:25:27+00:00",
                    "github_user": {
                        "id": 3,
                        "display_name": "peppy",
                        "github_url": "https:\/\/github.com\/peppy",
                        "osu_username": "peppy",
                        "user_id": 2,
                        "user_url": "https:\/\/osu.ppy.sh\/users\/2"
                    }
                },
                {
                    "id": 9868,
                    "repository": "ppy\/osu",
                    "github_pull_request_id": 10914,
                    "github_url": "https:\/\/github.com\/ppy\/osu\/pull\/10914",
                    "url": null,
                    "type": "fix",
                    "category": "Editor",
                    "title": "Prevent editor from crashing for rulesets with no compose screen implementation",
                    "message_html": null,
                    "major": false,
                    "created_at": "2020-11-20T03:18:44+00:00",
                    "github_user": {
                        "id": 218,
                        "display_name": "bdach",
                        "github_url": "https:\/\/github.com\/bdach",
                        "osu_username": null,
                        "user_id": null,
                        "user_url": null
                    }
                },
                {
                    "id": 9878,
                    "repository": "ppy\/osu",
                    "github_pull_request_id": 10923,
                    "github_url": "https:\/\/github.com\/ppy\/osu\/pull\/10923",
                    "url": null,
                    "type": "fix",
                    "category": "Gameplay (osu!)",
                    "title": "Implement follow point pooling",
                    "message_html": "<div class='changelog-md'><p class=\"changelog-md__paragraph\">Further memory usage reductions!<\/p>\n<\/div>",
                    "major": true,
                    "created_at": "2020-11-20T11:53:21+00:00",
                    "github_user": {
                        "id": 5,
                        "display_name": "smoogipoo",
                        "github_url": "https:\/\/github.com\/smoogipoo",
                        "osu_username": "smoogipoo",
                        "user_id": 1040328,
                        "user_url": "https:\/\/osu.ppy.sh\/users\/1040328"
                    }
                },
                {
                    "id": 9879,
                    "repository": "ppy\/osu",
                    "github_pull_request_id": 10890,
                    "github_url": "https:\/\/github.com\/ppy\/osu\/pull\/10890",
                    "url": null,
                    "type": "fix",
                    "category": "Gameplay (osu!)",
                    "title": "Adjust judgement animations to match stable",
                    "message_html": null,
                    "major": false,
                    "created_at": "2020-11-20T12:47:22+00:00",
                    "github_user": {
                        "id": 3,
                        "display_name": "peppy",
                        "github_url": "https:\/\/github.com\/peppy",
                        "osu_username": "peppy",
                        "user_id": 2,
                        "user_url": "https:\/\/osu.ppy.sh\/users\/2"
                    }
                },
                {
                    "id": 9880,
                    "repository": "ppy\/osu",
                    "github_pull_request_id": 10916,
                    "github_url": "https:\/\/github.com\/ppy\/osu\/pull\/10916",
                    "url": null,
                    "type": "fix",
                    "category": "Editor",
                    "title": "Fix slider right click context menus not being shown outside the valid playfield area",
                    "message_html": null,
                    "major": false,
                    "created_at": "2020-11-20T12:47:45+00:00",
                    "github_user": {
                        "id": 3,
                        "display_name": "peppy",
                        "github_url": "https:\/\/github.com\/peppy",
                        "osu_username": "peppy",
                        "user_id": 2,
                        "user_url": "https:\/\/osu.ppy.sh\/users\/2"
                    }
                },
                {
                    "id": 9881,
                    "repository": "ppy\/osu",
                    "github_pull_request_id": 10917,
                    "github_url": "https:\/\/github.com\/ppy\/osu\/pull\/10917",
                    "url": null,
                    "type": "fix",
                    "category": "Results",
                    "title": "Don't play flair animations \/ sounds when watching autoplay or viewing a result directly",
                    "message_html": null,
                    "major": false,
                    "created_at": "2020-11-20T12:48:11+00:00",
                    "github_user": {
                        "id": 3,
                        "display_name": "peppy",
                        "github_url": "https:\/\/github.com\/peppy",
                        "osu_username": "peppy",
                        "user_id": 2,
                        "user_url": "https:\/\/osu.ppy.sh\/users\/2"
                    }
                },
                {
                    "id": 9882,
                    "repository": "ppy\/osu",
                    "github_pull_request_id": 10921,
                    "github_url": "https:\/\/github.com\/ppy\/osu\/pull\/10921",
                    "url": null,
                    "type": "fix",
                    "category": "Testing",
                    "title": "Refactor TestSceneHitCircle to show judgements",
                    "message_html": null,
                    "major": false,
                    "created_at": "2020-11-20T13:08:28+00:00",
                    "github_user": {
                        "id": 3,
                        "display_name": "peppy",
                        "github_url": "https:\/\/github.com\/peppy",
                        "osu_username": "peppy",
                        "user_id": 2,
                        "user_url": "https:\/\/osu.ppy.sh\/users\/2"
                    }
                },
                {
                    "id": 9883,
                    "repository": "ppy\/osu",
                    "github_pull_request_id": 10919,
                    "github_url": "https:\/\/github.com\/ppy\/osu\/pull\/10919",
                    "url": null,
                    "type": "fix",
                    "category": "Code Quality",
                    "title": "Remove no longer necessary code from OsuPlayfield",
                    "message_html": null,
                    "major": false,
                    "created_at": "2020-11-20T13:18:44+00:00",
                    "github_user": {
                        "id": 3,
                        "display_name": "peppy",
                        "github_url": "https:\/\/github.com\/peppy",
                        "osu_username": "peppy",
                        "user_id": 2,
                        "user_url": "https:\/\/osu.ppy.sh\/users\/2"
                    }
                },
                {
                    "id": 9884,
                    "repository": "ppy\/osu",
                    "github_pull_request_id": 10903,
                    "github_url": "https:\/\/github.com\/ppy\/osu\/pull\/10903",
                    "url": null,
                    "type": "add",
                    "category": "Gameplay (osu!)",
                    "title": "Add ParticleExplosion and use to give legacy skins particle explosions",
                    "message_html": null,
                    "major": true,
                    "created_at": "2020-11-20T13:48:14+00:00",
                    "github_user": {
                        "id": 3,
                        "display_name": "peppy",
                        "github_url": "https:\/\/github.com\/peppy",
                        "osu_username": "peppy",
                        "user_id": 2,
                        "user_url": "https:\/\/osu.ppy.sh\/users\/2"
                    }
                },
                {
                    "id": 9886,
                    "repository": "ppy\/osu-framework",
                    "github_pull_request_id": 4011,
                    "github_url": "https:\/\/github.com\/ppy\/osu-framework\/pull\/4011",
                    "url": null,
                    "type": "fix",
                    "category": "Framework",
                    "title": "Fix crash in FlappyDon sample project",
                    "message_html": null,
                    "major": false,
                    "created_at": "2020-11-20T14:05:44+00:00",
                    "github_user": {
                        "id": 436,
                        "display_name": "OliBomby",
                        "github_url": "https:\/\/github.com\/OliBomby",
                        "osu_username": null,
                        "user_id": null,
                        "user_url": null
                    }
                },
                {
                    "id": 9887,
                    "repository": "ppy\/osu",
                    "github_pull_request_id": 10922,
                    "github_url": "https:\/\/github.com\/ppy\/osu\/pull\/10922",
                    "url": null,
                    "type": "fix",
                    "category": "Gameplay (osu!)",
                    "title": "Ensure legacy skin judgements display in front of hitobjects",
                    "message_html": null,
                    "major": true,
                    "created_at": "2020-11-20T14:20:19+00:00",
                    "github_user": {
                        "id": 3,
                        "display_name": "peppy",
                        "github_url": "https:\/\/github.com\/peppy",
                        "osu_username": "peppy",
                        "user_id": 2,
                        "user_url": "https:\/\/osu.ppy.sh\/users\/2"
                    }
                }
            ]
        },
        {
            "id": 5483,
            "version": "2020.1120.0",
            "display_version": "2020.1120.0",
            "users": 0,
            "created_at": "2020-11-20T03:53:47+00:00",
            "update_stream": {
                "id": 8,
                "name": "web",
                "display_name": "Web",
                "is_featured": false
            },
            "changelog_entries": [
                {
                    "id": 9779,
                    "repository": "ppy\/osu-wiki",
                    "github_pull_request_id": 4447,
                    "github_url": "https:\/\/github.com\/ppy\/osu-wiki\/pull\/4447",
                    "url": null,
                    "type": "add",
                    "category": "Wiki",
                    "title": "Add bug report Q&A to the FAQ",
                    "message_html": null,
                    "major": false,
                    "created_at": "2020-11-13T13:56:15+00:00",
                    "github_user": {
                        "id": 355,
                        "display_name": "paper-toaster",
                        "github_url": "https:\/\/github.com\/paper-toaster",
                        "osu_username": null,
                        "user_id": null,
                        "user_url": null
                    }
                },
                {
                    "id": 9781,
                    "repository": "ppy\/osu-wiki",
                    "github_pull_request_id": 4371,
                    "github_url": "https:\/\/github.com\/ppy\/osu-wiki\/pull\/4371",
                    "url": null,
                    "type": "fix",
                    "category": "Wiki",
                    "title": "[RO] Add Main Page",
                    "message_html": null,
                    "major": false,
                    "created_at": "2020-11-13T17:33:26+00:00",
                    "github_user": {
                        "id": 433,
                        "display_name": "HapppyLlama",
                        "github_url": "https:\/\/github.com\/HapppyLlama",
                        "osu_username": null,
                        "user_id": null,
                        "user_url": null
                    }
                },
                {
                    "id": 9783,
                    "repository": "ppy\/osu-wiki",
                    "github_pull_request_id": 4372,
                    "github_url": "https:\/\/github.com\/ppy\/osu-wiki\/pull\/4372",
                    "url": null,
                    "type": "fix",
                    "category": "Wiki",
                    "title": "[FR] Update Main Page",
                    "message_html": null,
                    "major": false,
                    "created_at": "2020-11-13T19:23:45+00:00",
                    "github_user": {
                        "id": 434,
                        "display_name": "Hickacou",
                        "github_url": "https:\/\/github.com\/Hickacou",
                        "osu_username": null,
                        "user_id": null,
                        "user_url": null
                    }
                },
                {
                    "id": 9788,
                    "repository": "ppy\/osu-wiki",
                    "github_pull_request_id": 4453,
                    "github_url": "https:\/\/github.com\/ppy\/osu-wiki\/pull\/4453",
                    "url": null,
                    "type": "fix",
                    "category": "Wiki",
                    "title": "[ZH] OWC2020 Quarterfinals update",
                    "message_html": null,
                    "major": false,
                    "created_at": "2020-11-13T22:08:50+00:00",
                    "github_user": {
                        "id": 291,
                        "display_name": "Kotoki1337",
                        "github_url": "https:\/\/github.com\/Kotoki1337",
                        "osu_username": null,
                        "user_id": null,
                        "user_url": null
                    }
                },
                {
                    "id": 9791,
                    "repository": "ppy\/osu-wiki",
                    "github_pull_request_id": 4456,
                    "github_url": "https:\/\/github.com\/ppy\/osu-wiki\/pull\/4456",
                    "url": null,
                    "type": "add",
                    "category": "Wiki",
                    "title": "Add New Featured Artist: BLOOD CODE",
                    "message_html": null,
                    "major": false,
                    "created_at": "2020-11-14T09:11:38+00:00",
                    "github_user": {
                        "id": 13,
                        "display_name": "Ephemeralis",
                        "github_url": "https:\/\/github.com\/Ephemeralis",
                        "osu_username": "Ephemeralis",
                        "user_id": 10948742,
                        "user_url": "https:\/\/osu.ppy.sh\/users\/10948742"
                    }
                },
                {
                    "id": 9793,
                    "repository": "ppy\/osu-wiki",
                    "github_pull_request_id": 4454,
                    "github_url": "https:\/\/github.com\/ppy\/osu-wiki\/pull\/4454",
                    "url": null,
                    "type": "fix",
                    "category": "Wiki",
                    "title": "[TH] Fix minor spelling and punctuation mistakes",
                    "message_html": null,
                    "major": false,
                    "created_at": "2020-11-14T18:58:30+00:00",
                    "github_user": {
                        "id": 397,
                        "display_name": "C0NS03L",
                        "github_url": "https:\/\/github.com\/C0NS03L",
                        "osu_username": null,
                        "user_id": null,
                        "user_url": null
                    }
                },
                {
                    "id": 9794,
                    "repository": "ppy\/osu-wiki",
                    "github_pull_request_id": 4458,
                    "github_url": "https:\/\/github.com\/ppy\/osu-wiki\/pull\/4458",
                    "url": null,
                    "type": "fix",
                    "category": "Wiki",
                    "title": "Remove escaping from code syntax in osu! File Formats",
                    "message_html": null,
                    "major": false,
                    "created_at": "2020-11-14T19:04:25+00:00",
                    "github_user": {
                        "id": 320,
                        "display_name": "MasterLogick",
                        "github_url": "https:\/\/github.com\/MasterLogick",
                        "osu_username": null,
                        "user_id": null,
                        "user_url": null
                    }
                },
                {
                    "id": 9795,
                    "repository": "ppy\/osu-wiki",
                    "github_pull_request_id": 4457,
                    "github_url": "https:\/\/github.com\/ppy\/osu-wiki\/pull\/4457",
                    "url": null,
                    "type": "fix",
                    "category": "Wiki",
                    "title": "Update staff log and BN\/GMT group listings",
                    "message_html": null,
                    "major": false,
                    "created_at": "2020-11-14T19:27:19+00:00",
                    "github_user": {
                        "id": 262,
                        "display_name": "zeusminus",
                        "github_url": "https:\/\/github.com\/zeusminus",
                        "osu_username": null,
                        "user_id": null,
                        "user_url": null
                    }
                },
                {
                    "id": 9796,
                    "repository": "ppy\/osu-wiki",
                    "github_pull_request_id": 4452,
                    "github_url": "https:\/\/github.com\/ppy\/osu-wiki\/pull\/4452",
                    "url": null,
                    "type": "fix",
                    "category": "Wiki",
                    "title": "[ID] Add Silence",
                    "message_html": null,
                    "major": false,
                    "created_at": "2020-11-14T19:33:44+00:00",
                    "github_user": {
                        "id": 31,
                        "display_name": "fajar13k",
                        "github_url": "https:\/\/github.com\/fajar13k",
                        "osu_username": null,
                        "user_id": null,
                        "user_url": null
                    }
                },
                {
                    "id": 9797,
                    "repository": "ppy\/osu-wiki",
                    "github_pull_request_id": 4459,
                    "github_url": "https:\/\/github.com\/ppy\/osu-wiki\/pull\/4459",
                    "url": null,
                    "type": "fix",
                    "category": "Wiki",
                    "title": "Remove track from FA newspost",
                    "message_html": null,
                    "major": false,
                    "created_at": "2020-11-15T01:57:35+00:00",
                    "github_user": {
                        "id": 13,
                        "display_name": "Ephemeralis",
                        "github_url": "https:\/\/github.com\/Ephemeralis",
                        "osu_username": "Ephemeralis",
                        "user_id": 10948742,
                        "user_url": "https:\/\/osu.ppy.sh\/users\/10948742"
                    }
                },
                {
                    "id": 9798,
                    "repository": "ppy\/osu-wiki",
                    "github_pull_request_id": 4460,
                    "github_url": "https:\/\/github.com\/ppy\/osu-wiki\/pull\/4460",
                    "url": null,
                    "type": "fix",
                    "category": "Wiki",
                    "title": "Adjust FA metadata",
                    "message_html": null,
                    "major": false,
                    "created_at": "2020-11-15T02:05:41+00:00",
                    "github_user": {
                        "id": 13,
                        "display_name": "Ephemeralis",
                        "github_url": "https:\/\/github.com\/Ephemeralis",
                        "osu_username": "Ephemeralis",
                        "user_id": 10948742,
                        "user_url": "https:\/\/osu.ppy.sh\/users\/10948742"
                    }
                },
                {
                    "id": 9800,
                    "repository": "ppy\/osu-wiki",
                    "github_pull_request_id": 4455,
                    "github_url": "https:\/\/github.com\/ppy\/osu-wiki\/pull\/4455",
                    "url": null,
                    "type": "fix",
                    "category": "Wiki",
                    "title": "[ID] Add upppy",
                    "message_html": null,
                    "major": false,
                    "created_at": "2020-11-15T05:14:08+00:00",
                    "github_user": {
                        "id": 31,
                        "display_name": "fajar13k",
                        "github_url": "https:\/\/github.com\/fajar13k",
                        "osu_username": null,
                        "user_id": null,
                        "user_url": null
                    }
                },
                {
                    "id": 9801,
                    "repository": "ppy\/osu-wiki",
                    "github_pull_request_id": 4465,
                    "github_url": "https:\/\/github.com\/ppy\/osu-wiki\/pull\/4465",
                    "url": null,
                    "type": "add",
                    "category": "Wiki",
                    "title": "Add escaping to a table pipe in ASC\/ZH",
                    "message_html": null,
                    "major": false,
                    "created_at": "2020-11-15T13:30:11+00:00",
                    "github_user": {
                        "id": 37,
                        "display_name": "TPGPL",
                        "github_url": "https:\/\/github.com\/TPGPL",
                        "osu_username": null,
                        "user_id": null,
                        "user_url": null
                    }
                },
                {
                    "id": 9803,
                    "repository": "ppy\/osu-wiki",
                    "github_pull_request_id": 4421,
                    "github_url": "https:\/\/github.com\/ppy\/osu-wiki\/pull\/4421",
                    "url": null,
                    "type": "fix",
                    "category": "Wiki",
                    "title": "[TR] osu!dev Discord server",
                    "message_html": null,
                    "major": false,
                    "created_at": "2020-11-15T19:48:48+00:00",
                    "github_user": {
                        "id": 262,
                        "display_name": "zeusminus",
                        "github_url": "https:\/\/github.com\/zeusminus",
                        "osu_username": null,
                        "user_id": null,
                        "user_url": null
                    }
                },
                {
                    "id": 9804,
                    "repository": "ppy\/osu-wiki",
                    "github_pull_request_id": 4420,
                    "github_url": "https:\/\/github.com\/ppy\/osu-wiki\/pull\/4420",
                    "url": null,
                    "type": "fix",
                    "category": "Wiki",
                    "title": "[TR] Add Performance Points",
                    "message_html": null,
                    "major": false,
                    "created_at": "2020-11-15T19:49:36+00:00",
                    "github_user": {
                        "id": 262,
                        "display_name": "zeusminus",
                        "github_url": "https:\/\/github.com\/zeusminus",
                        "osu_username": null,
                        "user_id": null,
                        "user_url": null
                    }
                },
                {
                    "id": 9805,
                    "repository": "ppy\/osu-wiki",
                    "github_pull_request_id": 4466,
                    "github_url": "https:\/\/github.com\/ppy\/osu-wiki\/pull\/4466",
                    "url": null,
                    "type": "fix",
                    "category": "Wiki",
                    "title": "Remove extra guidelines for lowest difficulties from osu!mania RC",
                    "message_html": null,
                    "major": false,
                    "created_at": "2020-11-15T22:36:11+00:00",
                    "github_user": {
                        "id": 211,
                        "display_name": "Feerum",
                        "github_url": "https:\/\/github.com\/Feerum",
                        "osu_username": null,
                        "user_id": null,
                        "user_url": null
                    }
                },
                {
                    "id": 9806,
                    "repository": "ppy\/osu-wiki",
                    "github_pull_request_id": 4467,
                    "github_url": "https:\/\/github.com\/ppy\/osu-wiki\/pull\/4467",
                    "url": null,
                    "type": "fix",
                    "category": "Wiki",
                    "title": "Update SAS for Round 4",
                    "message_html": null,
                    "major": false,
                    "created_at": "2020-11-16T00:12:54+00:00",
                    "github_user": {
                        "id": 31,
                        "display_name": "fajar13k",
                        "github_url": "https:\/\/github.com\/fajar13k",
                        "osu_username": null,
                        "user_id": null,
                        "user_url": null
                    }
                },
                {
                    "id": 9807,
                    "repository": "ppy\/osu-wiki",
                    "github_pull_request_id": 4468,
                    "github_url": "https:\/\/github.com\/ppy\/osu-wiki\/pull\/4468",
                    "url": null,
                    "type": "fix",
                    "category": "Wiki",
                    "title": "Update GMT\/Alumni listing and Staff log",
                    "message_html": null,
                    "major": false,
                    "created_at": "2020-11-16T01:34:05+00:00",
                    "github_user": {
                        "id": 349,
                        "display_name": "hypercyte",
                        "github_url": "https:\/\/github.com\/hypercyte",
                        "osu_username": null,
                        "user_id": null,
                        "user_url": null
                    }
                },
                {
                    "id": 9816,
                    "repository": "ppy\/osu-wiki",
                    "github_pull_request_id": 4451,
                    "github_url": "https:\/\/github.com\/ppy\/osu-wiki\/pull\/4451",
                    "url": null,
                    "type": "fix",
                    "category": "Wiki",
                    "title": "[ID] Add Discord Rich Presence guide",
                    "message_html": null,
                    "major": false,
                    "created_at": "2020-11-16T08:07:43+00:00",
                    "github_user": {
                        "id": 31,
                        "display_name": "fajar13k",
                        "github_url": "https:\/\/github.com\/fajar13k",
                        "osu_username": null,
                        "user_id": null,
                        "user_url": null
                    }
                },
                {
                    "id": 9817,
                    "repository": "ppy\/osu-wiki",
                    "github_pull_request_id": 4438,
                    "github_url": "https:\/\/github.com\/ppy\/osu-wiki\/pull\/4438",
                    "url": null,
                    "type": "add",
                    "category": "Wiki",
                    "title": "Add Beginners Global Taiko Showdown 2020 article",
                    "message_html": null,
                    "major": false,
                    "created_at": "2020-11-16T08:07:58+00:00",
                    "github_user": {
                        "id": 31,
                        "display_name": "fajar13k",
                        "github_url": "https:\/\/github.com\/fajar13k",
                        "osu_username": null,
                        "user_id": null,
                        "user_url": null
                    }
                },
                {
                    "id": 9819,
                    "repository": "ppy\/osu-wiki",
                    "github_pull_request_id": 4469,
                    "github_url": "https:\/\/github.com\/ppy\/osu-wiki\/pull\/4469",
                    "url": null,
                    "type": "fix",
                    "category": "Wiki",
                    "title": "[ID] Update Users with unique titles",
                    "message_html": null,
                    "major": false,
                    "created_at": "2020-11-16T08:19:38+00:00",
                    "github_user": {
                        "id": 424,
                        "display_name": "hikikuman",
                        "github_url": "https:\/\/github.com\/hikikuman",
                        "osu_username": null,
                        "user_id": null,
                        "user_url": null
                    }
                },
                {
                    "id": 9825,
                    "repository": "ppy\/osu-wiki",
                    "github_pull_request_id": 4471,
                    "github_url": "https:\/\/github.com\/ppy\/osu-wiki\/pull\/4471",
                    "url": null,
                    "type": "fix",
                    "category": "Wiki",
                    "title": "Update Alumni listing and Spotlights managers",
                    "message_html": null,
                    "major": false,
                    "created_at": "2020-11-16T13:19:51+00:00",
                    "github_user": {
                        "id": 262,
                        "display_name": "zeusminus",
                        "github_url": "https:\/\/github.com\/zeusminus",
                        "osu_username": null,
                        "user_id": null,
                        "user_url": null
                    }
                },
                {
                    "id": 9826,
                    "repository": "ppy\/osu-wiki",
                    "github_pull_request_id": 4462,
                    "github_url": "https:\/\/github.com\/ppy\/osu-wiki\/pull\/4462",
                    "url": null,
                    "type": "fix",
                    "category": "Wiki",
                    "title": "[TH] Add meta\/group-info",
                    "message_html": null,
                    "major": false,
                    "created_at": "2020-11-16T13:44:32+00:00",
                    "github_user": {
                        "id": 430,
                        "display_name": "Trigonoculus",
                        "github_url": "https:\/\/github.com\/Trigonoculus",
                        "osu_username": null,
                        "user_id": null,
                        "user_url": null
                    }
                },
                {
                    "id": 9830,
                    "repository": "ppy\/osu-wiki",
                    "github_pull_request_id": 4443,
                    "github_url": "https:\/\/github.com\/ppy\/osu-wiki\/pull\/4443",
                    "url": null,
                    "type": "fix",
                    "category": "Wiki",
                    "title": "Fix formatting in remaining World Cup translations",
                    "message_html": null,
                    "major": false,
                    "created_at": "2020-11-16T19:45:45+00:00",
                    "github_user": {
                        "id": 37,
                        "display_name": "TPGPL",
                        "github_url": "https:\/\/github.com\/TPGPL",
                        "osu_username": null,
                        "user_id": null,
                        "user_url": null
                    }
                },
                {
                    "id": 9831,
                    "repository": "ppy\/osu-wiki",
                    "github_pull_request_id": 4476,
                    "github_url": "https:\/\/github.com\/ppy\/osu-wiki\/pull\/4476",
                    "url": null,
                    "type": "fix",
                    "category": "Wiki",
                    "title": "Remove another defunct track from FA article",
                    "message_html": null,
                    "major": false,
                    "created_at": "2020-11-17T04:00:09+00:00",
                    "github_user": {
                        "id": 13,
                        "display_name": "Ephemeralis",
                        "github_url": "https:\/\/github.com\/Ephemeralis",
                        "osu_username": "Ephemeralis",
                        "user_id": 10948742,
                        "user_url": "https:\/\/osu.ppy.sh\/users\/10948742"
                    }
                },
                {
                    "id": 9832,
                    "repository": "ppy\/osu-wiki",
                    "github_pull_request_id": 4470,
                    "github_url": "https:\/\/github.com\/ppy\/osu-wiki\/pull\/4470",
                    "url": null,
                    "type": "fix",
                    "category": "Wiki",
                    "title": "Correctly update last update date of privacy policy",
                    "message_html": null,
                    "major": false,
                    "created_at": "2020-11-17T04:05:58+00:00",
                    "github_user": {
                        "id": 2,
                        "display_name": "nanaya",
                        "github_url": "https:\/\/github.com\/nanaya",
                        "osu_username": "nanaya",
                        "user_id": 2387883,
                        "user_url": "https:\/\/osu.ppy.sh\/users\/2387883"
                    }
                },
                {
                    "id": 9835,
                    "repository": "ppy\/osu-wiki",
                    "github_pull_request_id": 4479,
                    "github_url": "https:\/\/github.com\/ppy\/osu-wiki\/pull\/4479",
                    "url": null,
                    "type": "fix",
                    "category": "Wiki",
                    "title": "Fix typo in the Game_modifier\/Double_Time article",
                    "message_html": null,
                    "major": false,
                    "created_at": "2020-11-17T08:37:18+00:00",
                    "github_user": {
                        "id": 435,
                        "display_name": "SebbyLaw",
                        "github_url": "https:\/\/github.com\/SebbyLaw",
                        "osu_username": null,
                        "user_id": null,
                        "user_url": null
                    }
                },
                {
                    "id": 9836,
                    "repository": "ppy\/osu-wiki",
                    "github_pull_request_id": 4483,
                    "github_url": "https:\/\/github.com\/ppy\/osu-wiki\/pull\/4483",
                    "url": null,
                    "type": "fix",
                    "category": "Wiki",
                    "title": "OWC2020 Semifinals Update",
                    "message_html": null,
                    "major": false,
                    "created_at": "2020-11-17T14:18:40+00:00",
                    "github_user": {
                        "id": 45,
                        "display_name": "WalterToro",
                        "github_url": "https:\/\/github.com\/WalterToro",
                        "osu_username": null,
                        "user_id": null,
                        "user_url": null
                    }
                },
                {
                    "id": 9838,
                    "repository": "ppy\/osu-wiki",
                    "github_pull_request_id": 4481,
                    "github_url": "https:\/\/github.com\/ppy\/osu-wiki\/pull\/4481",
                    "url": null,
                    "type": "fix",
                    "category": "Wiki",
                    "title": "Update MP7K2 for Group Stage",
                    "message_html": null,
                    "major": false,
                    "created_at": "2020-11-17T21:31:32+00:00",
                    "github_user": {
                        "id": 245,
                        "display_name": "benzerka",
                        "github_url": "https:\/\/github.com\/benzerka",
                        "osu_username": null,
                        "user_id": null,
                        "user_url": null
                    }
                },
                {
                    "id": 9839,
                    "repository": "ppy\/osu-wiki",
                    "github_pull_request_id": 4484,
                    "github_url": "https:\/\/github.com\/ppy\/osu-wiki\/pull\/4484",
                    "url": null,
                    "type": "fix",
                    "category": "Wiki",
                    "title": "Update Alumni listing",
                    "message_html": null,
                    "major": false,
                    "created_at": "2020-11-17T23:55:25+00:00",
                    "github_user": {
                        "id": 249,
                        "display_name": "pimpG",
                        "github_url": "https:\/\/github.com\/pimpG",
                        "osu_username": null,
                        "user_id": null,
                        "user_url": null
                    }
                },
                {
                    "id": 9840,
                    "repository": "ppy\/osu-wiki",
                    "github_pull_request_id": 4486,
                    "github_url": "https:\/\/github.com\/ppy\/osu-wiki\/pull\/4486",
                    "url": null,
                    "type": "fix",
                    "category": "Wiki",
                    "title": "Update BN listing and Staff log",
                    "message_html": null,
                    "major": false,
                    "created_at": "2020-11-18T00:00:00+00:00",
                    "github_user": {
                        "id": 349,
                        "display_name": "hypercyte",
                        "github_url": "https:\/\/github.com\/hypercyte",
                        "osu_username": null,
                        "user_id": null,
                        "user_url": null
                    }
                },
                {
                    "id": 9842,
                    "repository": "ppy\/osu-wiki",
                    "github_pull_request_id": 4488,
                    "github_url": "https:\/\/github.com\/ppy\/osu-wiki\/pull\/4488",
                    "url": null,
                    "type": "fix",
                    "category": "Wiki",
                    "title": "Fix minor typos in Help Centre",
                    "message_html": null,
                    "major": false,
                    "created_at": "2020-11-18T09:17:10+00:00",
                    "github_user": {
                        "id": 430,
                        "display_name": "Trigonoculus",
                        "github_url": "https:\/\/github.com\/Trigonoculus",
                        "osu_username": null,
                        "user_id": null,
                        "user_url": null
                    }
                },
                {
                    "id": 9843,
                    "repository": "ppy\/osu-wiki",
                    "github_pull_request_id": 4477,
                    "github_url": "https:\/\/github.com\/ppy\/osu-wiki\/pull\/4477",
                    "url": null,
                    "type": "fix",
                    "category": "Wiki",
                    "title": "Small update on Relax and Autopilot stubs",
                    "message_html": null,
                    "major": false,
                    "created_at": "2020-11-18T09:18:00+00:00",
                    "github_user": {
                        "id": 355,
                        "display_name": "paper-toaster",
                        "github_url": "https:\/\/github.com\/paper-toaster",
                        "osu_username": null,
                        "user_id": null,
                        "user_url": null
                    }
                },
                {
                    "id": 9845,
                    "repository": "ppy\/osu-wiki",
                    "github_pull_request_id": 4489,
                    "github_url": "https:\/\/github.com\/ppy\/osu-wiki\/pull\/4489",
                    "url": null,
                    "type": "add",
                    "category": "Wiki",
                    "title": "Add New Featured Artist: Lime \/ Kankitsu newspost",
                    "message_html": null,
                    "major": false,
                    "created_at": "2020-11-18T09:34:54+00:00",
                    "github_user": {
                        "id": 13,
                        "display_name": "Ephemeralis",
                        "github_url": "https:\/\/github.com\/Ephemeralis",
                        "osu_username": "Ephemeralis",
                        "user_id": 10948742,
                        "user_url": "https:\/\/osu.ppy.sh\/users\/10948742"
                    }
                },
                {
                    "id": 9850,
                    "repository": "ppy\/osu-web",
                    "github_pull_request_id": 6826,
                    "github_url": "https:\/\/github.com\/ppy\/osu-web\/pull\/6826",
                    "url": null,
                    "type": "add",
                    "category": "Api",
                    "title": "Add API rate limiting and scores endpoint to API",
                    "message_html": null,
                    "major": false,
                    "created_at": "2020-11-18T10:26:40+00:00",
                    "github_user": {
                        "id": 1,
                        "display_name": "notbakaneko",
                        "github_url": "https:\/\/github.com\/notbakaneko",
                        "osu_username": "notbakaneko",
                        "user_id": 10751776,
                        "user_url": "https:\/\/osu.ppy.sh\/users\/10751776"
                    }
                },
                {
                    "id": 9851,
                    "repository": "ppy\/osu-wiki",
                    "github_pull_request_id": 4493,
                    "github_url": "https:\/\/github.com\/ppy\/osu-wiki\/pull\/4493",
                    "url": null,
                    "type": "fix",
                    "category": "Wiki",
                    "title": "Fix typo in Nomination Assessment Team",
                    "message_html": null,
                    "major": false,
                    "created_at": "2020-11-18T11:53:28+00:00",
                    "github_user": {
                        "id": 430,
                        "display_name": "Trigonoculus",
                        "github_url": "https:\/\/github.com\/Trigonoculus",
                        "osu_username": null,
                        "user_id": null,
                        "user_url": null
                    }
                },
                {
                    "id": 9853,
                    "repository": "ppy\/osu-wiki",
                    "github_pull_request_id": 4474,
                    "github_url": "https:\/\/github.com\/ppy\/osu-wiki\/pull\/4474",
                    "url": null,
                    "type": "fix",
                    "category": "Wiki",
                    "title": "[RU] Add disambiguation pages for Mod, NC, NM, and osu!",
                    "message_html": null,
                    "major": false,
                    "created_at": "2020-11-18T14:06:30+00:00",
                    "github_user": {
                        "id": 233,
                        "display_name": "TicClick",
                        "github_url": "https:\/\/github.com\/TicClick",
                        "osu_username": null,
                        "user_id": null,
                        "user_url": null
                    }
                },
                {
                    "id": 9858,
                    "repository": "ppy\/osu-wiki",
                    "github_pull_request_id": 4490,
                    "github_url": "https:\/\/github.com\/ppy\/osu-wiki\/pull\/4490",
                    "url": null,
                    "type": "fix",
                    "category": "Wiki",
                    "title": "[ZH] OWC2020 Semifinals Update",
                    "message_html": null,
                    "major": false,
                    "created_at": "2020-11-19T02:30:52+00:00",
                    "github_user": {
                        "id": 291,
                        "display_name": "Kotoki1337",
                        "github_url": "https:\/\/github.com\/Kotoki1337",
                        "osu_username": null,
                        "user_id": null,
                        "user_url": null
                    }
                },
                {
                    "id": 9859,
                    "repository": "ppy\/osu-wiki",
                    "github_pull_request_id": 4491,
                    "github_url": "https:\/\/github.com\/ppy\/osu-wiki\/pull\/4491",
                    "url": null,
                    "type": "fix",
                    "category": "Wiki",
                    "title": "Update SOL2 for Group Stage",
                    "message_html": null,
                    "major": false,
                    "created_at": "2020-11-19T02:59:36+00:00",
                    "github_user": {
                        "id": 307,
                        "display_name": "ItsMestro",
                        "github_url": "https:\/\/github.com\/ItsMestro",
                        "osu_username": null,
                        "user_id": null,
                        "user_url": null
                    }
                },
                {
                    "id": 9861,
                    "repository": "ppy\/osu-wiki",
                    "github_pull_request_id": 4482,
                    "github_url": "https:\/\/github.com\/ppy\/osu-wiki\/pull\/4482",
                    "url": null,
                    "type": "fix",
                    "category": "Wiki",
                    "title": "Terms of Service & Community Rules Update: Volunteer responsibility, reporting abuse & keeping it clean",
                    "message_html": null,
                    "major": false,
                    "created_at": "2020-11-19T09:43:57+00:00",
                    "github_user": {
                        "id": 13,
                        "display_name": "Ephemeralis",
                        "github_url": "https:\/\/github.com\/Ephemeralis",
                        "osu_username": "Ephemeralis",
                        "user_id": 10948742,
                        "user_url": "https:\/\/osu.ppy.sh\/users\/10948742"
                    }
                },
                {
                    "id": 9862,
                    "repository": "ppy\/osu-wiki",
                    "github_pull_request_id": 4495,
                    "github_url": "https:\/\/github.com\/ppy\/osu-wiki\/pull\/4495",
                    "url": null,
                    "type": "add",
                    "category": "Wiki",
                    "title": "Add news post regarding terms of service change",
                    "message_html": null,
                    "major": false,
                    "created_at": "2020-11-19T09:52:04+00:00",
                    "github_user": {
                        "id": 3,
                        "display_name": "peppy",
                        "github_url": "https:\/\/github.com\/peppy",
                        "osu_username": "peppy",
                        "user_id": 2,
                        "user_url": "https:\/\/osu.ppy.sh\/users\/2"
                    }
                },
                {
                    "id": 9864,
                    "repository": "ppy\/osu-wiki",
                    "github_pull_request_id": 4497,
                    "github_url": "https:\/\/github.com\/ppy\/osu-wiki\/pull\/4497",
                    "url": null,
                    "type": "fix",
                    "category": "Wiki",
                    "title": "OWC2020 Semifinals Reschedule",
                    "message_html": null,
                    "major": false,
                    "created_at": "2020-11-19T12:57:22+00:00",
                    "github_user": {
                        "id": 45,
                        "display_name": "WalterToro",
                        "github_url": "https:\/\/github.com\/WalterToro",
                        "osu_username": null,
                        "user_id": null,
                        "user_url": null
                    }
                },
                {
                    "id": 9865,
                    "repository": "ppy\/osu-web",
                    "github_pull_request_id": 6881,
                    "github_url": "https:\/\/github.com\/ppy\/osu-web\/pull\/6881",
                    "url": null,
                    "type": "fix",
                    "category": "Chat",
                    "title": "Strip newlines in chat message",
                    "message_html": null,
                    "major": false,
                    "created_at": "2020-11-19T13:33:14+00:00",
                    "github_user": {
                        "id": 2,
                        "display_name": "nanaya",
                        "github_url": "https:\/\/github.com\/nanaya",
                        "osu_username": "nanaya",
                        "user_id": 2387883,
                        "user_url": "https:\/\/osu.ppy.sh\/users\/2387883"
                    }
                },
                {
                    "id": 9866,
                    "repository": "ppy\/osu-web",
                    "github_pull_request_id": 6803,
                    "github_url": "https:\/\/github.com\/ppy\/osu-web\/pull\/6803",
                    "url": null,
                    "type": "fix",
                    "category": "Chat",
                    "title": "Show only chat notifications when clicking chat icon",
                    "message_html": null,
                    "major": false,
                    "created_at": "2020-11-19T14:25:56+00:00",
                    "github_user": {
                        "id": 1,
                        "display_name": "notbakaneko",
                        "github_url": "https:\/\/github.com\/notbakaneko",
                        "osu_username": "notbakaneko",
                        "user_id": 10751776,
                        "user_url": "https:\/\/osu.ppy.sh\/users\/10751776"
                    }
                },
                {
                    "id": 9867,
                    "repository": "ppy\/osu-web",
                    "github_pull_request_id": 6887,
                    "github_url": "https:\/\/github.com\/ppy\/osu-web\/pull\/6887",
                    "url": null,
                    "type": "fix",
                    "category": "Ux",
                    "title": "Fix report form button's overlay position",
                    "message_html": null,
                    "major": false,
                    "created_at": "2020-11-20T03:17:05+00:00",
                    "github_user": {
                        "id": 1,
                        "display_name": "notbakaneko",
                        "github_url": "https:\/\/github.com\/notbakaneko",
                        "osu_username": "notbakaneko",
                        "user_id": 10751776,
                        "user_url": "https:\/\/osu.ppy.sh\/users\/10751776"
                    }
                },
                {
                    "id": 9869,
                    "repository": "ppy\/osu-web",
                    "github_pull_request_id": 6889,
                    "github_url": "https:\/\/github.com\/ppy\/osu-web\/pull\/6889",
                    "url": null,
                    "type": "fix",
                    "category": "Localisation",
                    "title": "Update translations from crowdin",
                    "message_html": null,
                    "major": false,
                    "created_at": "2020-11-20T03:48:27+00:00",
                    "github_user": {
                        "id": 3,
                        "display_name": "peppy",
                        "github_url": "https:\/\/github.com\/peppy",
                        "osu_username": "peppy",
                        "user_id": 2,
                        "user_url": "https:\/\/osu.ppy.sh\/users\/2"
                    }
                },
                {
                    "id": 9871,
                    "repository": "ppy\/osu-web",
                    "github_pull_request_id": 6885,
                    "github_url": "https:\/\/github.com\/ppy\/osu-web\/pull\/6885",
                    "url": null,
                    "type": "add",
                    "category": "Forum",
                    "title": "Add button for reporting forum post",
                    "message_html": null,
                    "major": false,
                    "created_at": "2020-11-20T05:12:46+00:00",
                    "github_user": {
                        "id": 2,
                        "display_name": "nanaya",
                        "github_url": "https:\/\/github.com\/nanaya",
                        "osu_username": "nanaya",
                        "user_id": 2387883,
                        "user_url": "https:\/\/osu.ppy.sh\/users\/2387883"
                    }
                },
                {
                    "id": 9872,
                    "repository": "ppy\/osu-web",
                    "github_pull_request_id": 6891,
                    "github_url": "https:\/\/github.com\/ppy\/osu-web\/pull\/6891",
                    "url": null,
                    "type": "fix",
                    "category": "Notifications",
                    "title": "Skip trying to mark notifications as read if no ids were extracted from params",
                    "message_html": null,
                    "major": false,
                    "created_at": "2020-11-20T05:39:38+00:00",
                    "github_user": {
                        "id": 1,
                        "display_name": "notbakaneko",
                        "github_url": "https:\/\/github.com\/notbakaneko",
                        "osu_username": "notbakaneko",
                        "user_id": 10751776,
                        "user_url": "https:\/\/osu.ppy.sh\/users\/10751776"
                    }
                },
                {
                    "id": 9873,
                    "repository": "ppy\/osu-wiki",
                    "github_pull_request_id": 4441,
                    "github_url": "https:\/\/github.com\/ppy\/osu-wiki\/pull\/4441",
                    "url": null,
                    "type": "add",
                    "category": "Wiki",
                    "title": "Add FA\/Mappers Guild updates news post",
                    "message_html": null,
                    "major": false,
                    "created_at": "2020-11-20T06:01:12+00:00",
                    "github_user": {
                        "id": 27,
                        "display_name": "pishifat",
                        "github_url": "https:\/\/github.com\/pishifat",
                        "osu_username": null,
                        "user_id": null,
                        "user_url": null
                    }
                },
                {
                    "id": 9874,
                    "repository": "ppy\/osu-wiki",
                    "github_pull_request_id": 4504,
                    "github_url": "https:\/\/github.com\/ppy\/osu-wiki\/pull\/4504",
                    "url": null,
                    "type": "fix",
                    "category": "Wiki",
                    "title": "[ZH] OWC2020 Semifinals Reschedule",
                    "message_html": null,
                    "major": false,
                    "created_at": "2020-11-20T08:00:16+00:00",
                    "github_user": {
                        "id": 291,
                        "display_name": "Kotoki1337",
                        "github_url": "https:\/\/github.com\/Kotoki1337",
                        "osu_username": null,
                        "user_id": null,
                        "user_url": null
                    }
                },
                {
                    "id": 9875,
                    "repository": "ppy\/osu-wiki",
                    "github_pull_request_id": 4446,
                    "github_url": "https:\/\/github.com\/ppy\/osu-wiki\/pull\/4446",
                    "url": null,
                    "type": "fix",
                    "category": "Wiki",
                    "title": "Cleanup IRC",
                    "message_html": null,
                    "major": false,
                    "created_at": "2020-11-20T09:53:56+00:00",
                    "github_user": {
                        "id": 355,
                        "display_name": "paper-toaster",
                        "github_url": "https:\/\/github.com\/paper-toaster",
                        "osu_username": null,
                        "user_id": null,
                        "user_url": null
                    }
                },
                {
                    "id": 9876,
                    "repository": "ppy\/osu-web",
                    "github_pull_request_id": 6825,
                    "github_url": "https:\/\/github.com\/ppy\/osu-web\/pull\/6825",
                    "url": null,
                    "type": "fix",
                    "category": "Beatmap Listing",
                    "title": "Ensure getting enough beatmap scores for listing",
                    "message_html": null,
                    "major": false,
                    "created_at": "2020-11-20T10:37:33+00:00",
                    "github_user": {
                        "id": 2,
                        "display_name": "nanaya",
                        "github_url": "https:\/\/github.com\/nanaya",
                        "osu_username": "nanaya",
                        "user_id": 2387883,
                        "user_url": "https:\/\/osu.ppy.sh\/users\/2387883"
                    }
                },
                {
                    "id": 9877,
                    "repository": "ppy\/osu-web",
                    "github_pull_request_id": 6892,
                    "github_url": "https:\/\/github.com\/ppy\/osu-web\/pull\/6892",
                    "url": null,
                    "type": "add",
                    "category": "Ux",
                    "title": "Add link for 'report abuse' to help menu",
                    "message_html": null,
                    "major": false,
                    "created_at": "2020-11-20T10:47:25+00:00",
                    "github_user": {
                        "id": 6,
                        "display_name": "nekodex",
                        "github_url": "https:\/\/github.com\/nekodex",
                        "osu_username": "nekodex",
                        "user_id": 102,
                        "user_url": "https:\/\/osu.ppy.sh\/users\/102"
                    }
                },
                {
                    "id": 9885,
                    "repository": "ppy\/osu-wiki",
                    "github_pull_request_id": 4505,
                    "github_url": "https:\/\/github.com\/ppy\/osu-wiki\/pull\/4505",
                    "url": null,
                    "type": "fix",
                    "category": "Wiki",
                    "title": "Update BN\/NAT listing and Staff Log",
                    "message_html": null,
                    "major": false,
                    "created_at": "2020-11-20T13:59:01+00:00",
                    "github_user": {
                        "id": 262,
                        "display_name": "zeusminus",
                        "github_url": "https:\/\/github.com\/zeusminus",
                        "osu_username": null,
                        "user_id": null,
                        "user_url": null
                    }
                }
            ]
        },
        {
            "id": 5482,
            "version": "20201118",
            "display_version": "20201118",
            "users": 9,
            "created_at": "2020-11-18T03:53:14+00:00",
            "update_stream": {
                "id": 3,
                "name": "cuttingedge",
                "display_name": "Cutting Edge",
                "is_featured": false
            },
            "changelog_entries": [
                {
                    "id": null,
                    "repository": null,
                    "github_pull_request_id": null,
                    "github_url": null,
                    "url": null,
                    "type": "add",
                    "category": "Web",
                    "title": "Add ability to limit beatmap pack pass conditions to exclude difficulty reduction mods",
                    "message_html": null,
                    "major": false,
                    "created_at": "2020-11-13T01:09:51+00:00",
                    "github_user": {
                        "id": null,
                        "display_name": "peppy",
                        "github_url": null,
                        "osu_username": "peppy",
                        "user_id": 2,
                        "user_url": "https:\/\/osu.ppy.sh\/users\/2"
                    }
                },
                {
                    "id": null,
                    "repository": null,
                    "github_pull_request_id": null,
                    "github_url": null,
                    "url": null,
                    "type": "fix",
                    "category": "Gameplay",
                    "title": "Fix potential crash when using flashlight mod in multiplayer",
                    "message_html": null,
                    "major": false,
                    "created_at": "2020-11-17T15:26:07+00:00",
                    "github_user": {
                        "id": null,
                        "display_name": "BanchoBot",
                        "github_url": null,
                        "osu_username": "BanchoBot",
                        "user_id": 3,
                        "user_url": "https:\/\/osu.ppy.sh\/users\/3"
                    }
                }
            ]
        },
        {
            "id": 5476,
            "version": "2020.1114.0",
            "display_version": "2020.1114.0",
            "users": 0,
            "created_at": "2020-11-14T09:55:04+00:00",
            "update_stream": {
                "id": 7,
                "name": "lazer",
                "display_name": "Lazer",
                "is_featured": false
            },
            "changelog_entries": [
                {
                    "id": 9698,
                    "repository": "ppy\/osu-framework",
                    "github_pull_request_id": 3986,
                    "github_url": "https:\/\/github.com\/ppy\/osu-framework\/pull\/3986",
                    "url": null,
                    "type": "fix",
                    "category": "Framework",
                    "title": "Update SDLCS and other packages",
                    "message_html": null,
                    "major": false,
                    "created_at": "2020-11-09T13:29:17+00:00",
                    "github_user": {
                        "id": 3,
                        "display_name": "peppy",
                        "github_url": "https:\/\/github.com\/peppy",
                        "osu_username": "peppy",
                        "user_id": 2,
                        "user_url": "https:\/\/osu.ppy.sh\/users\/2"
                    }
                },
                {
                    "id": 9701,
                    "repository": "ppy\/osu-framework",
                    "github_pull_request_id": 3988,
                    "github_url": "https:\/\/github.com\/ppy\/osu-framework\/pull\/3988",
                    "url": null,
                    "type": "fix",
                    "category": "Platform",
                    "title": "Fix touch input not working on mobile devices",
                    "message_html": null,
                    "major": false,
                    "created_at": "2020-11-09T15:59:03+00:00",
                    "github_user": {
                        "id": 3,
                        "display_name": "peppy",
                        "github_url": "https:\/\/github.com\/peppy",
                        "osu_username": "peppy",
                        "user_id": 2,
                        "user_url": "https:\/\/osu.ppy.sh\/users\/2"
                    }
                },
                {
                    "id": 9703,
                    "repository": "ppy\/osu",
                    "github_pull_request_id": 10742,
                    "github_url": "https:\/\/github.com\/ppy\/osu\/pull\/10742",
                    "url": null,
                    "type": "fix",
                    "category": "Gameplay",
                    "title": "Fix ki* textures having an incorrect vertical position",
                    "message_html": null,
                    "major": false,
                    "created_at": "2020-11-10T03:27:41+00:00",
                    "github_user": {
                        "id": 147,
                        "display_name": "Morilli",
                        "github_url": "https:\/\/github.com\/Morilli",
                        "osu_username": null,
                        "user_id": null,
                        "user_url": null
                    }
                },
                {
                    "id": 9704,
                    "repository": "ppy\/osu",
                    "github_pull_request_id": 10759,
                    "github_url": "https:\/\/github.com\/ppy\/osu\/pull\/10759",
                    "url": null,
                    "type": "fix",
                    "category": "UI",
                    "title": "Fix being able to watch yourself by disabling button",
                    "message_html": null,
                    "major": false,
                    "created_at": "2020-11-10T04:10:55+00:00",
                    "github_user": {
                        "id": 9,
                        "display_name": "Joehuu",
                        "github_url": "https:\/\/github.com\/Joehuu",
                        "osu_username": null,
                        "user_id": null,
                        "user_url": null
                    }
                },
                {
                    "id": 9705,
                    "repository": "ppy\/osu",
                    "github_pull_request_id": 10757,
                    "github_url": "https:\/\/github.com\/ppy\/osu\/pull\/10757",
                    "url": null,
                    "type": "fix",
                    "category": "Code Quality",
                    "title": "Simplify input buttons\/keys in tests",
                    "message_html": null,
                    "major": false,
                    "created_at": "2020-11-10T05:03:23+00:00",
                    "github_user": {
                        "id": 9,
                        "display_name": "Joehuu",
                        "github_url": "https:\/\/github.com\/Joehuu",
                        "osu_username": null,
                        "user_id": null,
                        "user_url": null
                    }
                },
                {
                    "id": 9706,
                    "repository": "ppy\/osu",
                    "github_pull_request_id": 10758,
                    "github_url": "https:\/\/github.com\/ppy\/osu\/pull\/10758",
                    "url": null,
                    "type": "fix",
                    "category": "Code Quality",
                    "title": "Replace rankHistory in JsonProperty with rank_history for consistency",
                    "message_html": null,
                    "major": false,
                    "created_at": "2020-11-10T05:05:26+00:00",
                    "github_user": {
                        "id": 429,
                        "display_name": "nbvdkamp",
                        "github_url": "https:\/\/github.com\/nbvdkamp",
                        "osu_username": null,
                        "user_id": null,
                        "user_url": null
                    }
                },
                {
                    "id": 9707,
                    "repository": "ppy\/osu",
                    "github_pull_request_id": 10740,
                    "github_url": "https:\/\/github.com\/ppy\/osu\/pull\/10740",
                    "url": null,
                    "type": "add",
                    "category": "Online",
                    "title": "Add missing rich presence user activities for Multi screens",
                    "message_html": null,
                    "major": false,
                    "created_at": "2020-11-10T05:23:27+00:00",
                    "github_user": {
                        "id": 167,
                        "display_name": "Game4all",
                        "github_url": "https:\/\/github.com\/Game4all",
                        "osu_username": null,
                        "user_id": null,
                        "user_url": null
                    }
                },
                {
                    "id": 9708,
                    "repository": "ppy\/osu",
                    "github_pull_request_id": 10722,
                    "github_url": "https:\/\/github.com\/ppy\/osu\/pull\/10722",
                    "url": null,
                    "type": "fix",
                    "category": "Tooling",
                    "title": "Change VSCode build task args to use - instead of \/",
                    "message_html": null,
                    "major": false,
                    "created_at": "2020-11-10T05:37:00+00:00",
                    "github_user": {
                        "id": 429,
                        "display_name": "nbvdkamp",
                        "github_url": "https:\/\/github.com\/nbvdkamp",
                        "osu_username": null,
                        "user_id": null,
                        "user_url": null
                    }
                },
                {
                    "id": 9709,
                    "repository": "ppy\/osu-framework",
                    "github_pull_request_id": 3991,
                    "github_url": "https:\/\/github.com\/ppy\/osu-framework\/pull\/3991",
                    "url": null,
                    "type": "fix",
                    "category": "Tooling",
                    "title": "Update visual studio code task arguments to use dash instead of slash",
                    "message_html": null,
                    "major": false,
                    "created_at": "2020-11-10T06:43:10+00:00",
                    "github_user": {
                        "id": 3,
                        "display_name": "peppy",
                        "github_url": "https:\/\/github.com\/peppy",
                        "osu_username": "peppy",
                        "user_id": 2,
                        "user_url": "https:\/\/osu.ppy.sh\/users\/2"
                    }
                },
                {
                    "id": 9710,
                    "repository": "ppy\/osu",
                    "github_pull_request_id": 10751,
                    "github_url": "https:\/\/github.com\/ppy\/osu\/pull\/10751",
                    "url": null,
                    "type": "fix",
                    "category": "Reliability",
                    "title": "Fix unsafe list manipulation in BeatmapDifficultyCache",
                    "message_html": null,
                    "major": false,
                    "created_at": "2020-11-10T06:43:22+00:00",
                    "github_user": {
                        "id": 5,
                        "display_name": "smoogipoo",
                        "github_url": "https:\/\/github.com\/smoogipoo",
                        "osu_username": "smoogipoo",
                        "user_id": 1040328,
                        "user_url": "https:\/\/osu.ppy.sh\/users\/1040328"
                    }
                },
                {
                    "id": 9712,
                    "repository": "ppy\/osu",
                    "github_pull_request_id": 10763,
                    "github_url": "https:\/\/github.com\/ppy\/osu\/pull\/10763",
                    "url": null,
                    "type": "fix",
                    "category": "UI",
                    "title": "Force beatmap listing overlay's textbox back on screen when a key is pressed",
                    "message_html": null,
                    "major": false,
                    "created_at": "2020-11-10T08:16:29+00:00",
                    "github_user": {
                        "id": 3,
                        "display_name": "peppy",
                        "github_url": "https:\/\/github.com\/peppy",
                        "osu_username": "peppy",
                        "user_id": 2,
                        "user_url": "https:\/\/osu.ppy.sh\/users\/2"
                    }
                },
                {
                    "id": 9713,
                    "repository": "ppy\/osu",
                    "github_pull_request_id": 10764,
                    "github_url": "https:\/\/github.com\/ppy\/osu\/pull\/10764",
                    "url": null,
                    "type": "fix",
                    "category": "Editor",
                    "title": "Fix editor quick delete being triggerable from left mouse button",
                    "message_html": null,
                    "major": false,
                    "created_at": "2020-11-10T08:42:12+00:00",
                    "github_user": {
                        "id": 3,
                        "display_name": "peppy",
                        "github_url": "https:\/\/github.com\/peppy",
                        "osu_username": "peppy",
                        "user_id": 2,
                        "user_url": "https:\/\/osu.ppy.sh\/users\/2"
                    }
                },
                {
                    "id": 9715,
                    "repository": "ppy\/osu",
                    "github_pull_request_id": 10768,
                    "github_url": "https:\/\/github.com\/ppy\/osu\/pull\/10768",
                    "url": null,
                    "type": "fix",
                    "category": "Gameplay",
                    "title": "Always store standardised score when populating ScoreInfo",
                    "message_html": null,
                    "major": false,
                    "created_at": "2020-11-10T09:12:35+00:00",
                    "github_user": {
                        "id": 218,
                        "display_name": "bdach",
                        "github_url": "https:\/\/github.com\/bdach",
                        "osu_username": null,
                        "user_id": null,
                        "user_url": null
                    }
                },
                {
                    "id": 9716,
                    "repository": "ppy\/osu",
                    "github_pull_request_id": 10769,
                    "github_url": "https:\/\/github.com\/ppy\/osu\/pull\/10769",
                    "url": null,
                    "type": "fix",
                    "category": "UX",
                    "title": "Stop mod select overlay hotkeys handling input when control is pressed",
                    "message_html": null,
                    "major": false,
                    "created_at": "2020-11-10T09:37:15+00:00",
                    "github_user": {
                        "id": 3,
                        "display_name": "peppy",
                        "github_url": "https:\/\/github.com\/peppy",
                        "osu_username": "peppy",
                        "user_id": 2,
                        "user_url": "https:\/\/osu.ppy.sh\/users\/2"
                    }
                },
                {
                    "id": 9717,
                    "repository": "ppy\/osu",
                    "github_pull_request_id": 10767,
                    "github_url": "https:\/\/github.com\/ppy\/osu\/pull\/10767",
                    "url": null,
                    "type": "fix",
                    "category": "Editor",
                    "title": "Fix BlueprintContainer triggering assert when left and right mouse button are pressed together",
                    "message_html": null,
                    "major": false,
                    "created_at": "2020-11-10T09:41:59+00:00",
                    "github_user": {
                        "id": 3,
                        "display_name": "peppy",
                        "github_url": "https:\/\/github.com\/peppy",
                        "osu_username": "peppy",
                        "user_id": 2,
                        "user_url": "https:\/\/osu.ppy.sh\/users\/2"
                    }
                },
                {
                    "id": 9719,
                    "repository": "ppy\/osu-framework",
                    "github_pull_request_id": 3989,
                    "github_url": "https:\/\/github.com\/ppy\/osu-framework\/pull\/3989",
                    "url": null,
                    "type": "fix",
                    "category": "Framework",
                    "title": "Avoid resetting drawable lifetime on PooledDrawables that aren't assigned a pool",
                    "message_html": null,
                    "major": false,
                    "created_at": "2020-11-10T10:06:11+00:00",
                    "github_user": {
                        "id": 5,
                        "display_name": "smoogipoo",
                        "github_url": "https:\/\/github.com\/smoogipoo",
                        "osu_username": "smoogipoo",
                        "user_id": 1040328,
                        "user_url": "https:\/\/osu.ppy.sh\/users\/1040328"
                    }
                },
                {
                    "id": 9721,
                    "repository": "ppy\/osu",
                    "github_pull_request_id": 10760,
                    "github_url": "https:\/\/github.com\/ppy\/osu\/pull\/10760",
                    "url": null,
                    "type": "fix",
                    "category": "UI",
                    "title": "Fix crash and edge cases of user profile graph implementation",
                    "message_html": null,
                    "major": false,
                    "created_at": "2020-11-10T11:56:48+00:00",
                    "github_user": {
                        "id": 3,
                        "display_name": "peppy",
                        "github_url": "https:\/\/github.com\/peppy",
                        "osu_username": "peppy",
                        "user_id": 2,
                        "user_url": "https:\/\/osu.ppy.sh\/users\/2"
                    }
                },
                {
                    "id": 9722,
                    "repository": "ppy\/osu",
                    "github_pull_request_id": 10770,
                    "github_url": "https:\/\/github.com\/ppy\/osu\/pull\/10770",
                    "url": null,
                    "type": "fix",
                    "category": "Storyboard",
                    "title": "Fix crashes if animation sprite path does not match a file",
                    "message_html": null,
                    "major": false,
                    "created_at": "2020-11-10T12:32:19+00:00",
                    "github_user": {
                        "id": 428,
                        "display_name": "cadon0",
                        "github_url": "https:\/\/github.com\/cadon0",
                        "osu_username": null,
                        "user_id": null,
                        "user_url": null
                    }
                },
                {
                    "id": 9726,
                    "repository": "ppy\/osu",
                    "github_pull_request_id": 10782,
                    "github_url": "https:\/\/github.com\/ppy\/osu\/pull\/10782",
                    "url": null,
                    "type": "fix",
                    "category": "Editor",
                    "title": "Temporarily fix crash on deleting control point groups",
                    "message_html": null,
                    "major": false,
                    "created_at": "2020-11-11T00:22:41+00:00",
                    "github_user": {
                        "id": 218,
                        "display_name": "bdach",
                        "github_url": "https:\/\/github.com\/bdach",
                        "osu_username": null,
                        "user_id": null,
                        "user_url": null
                    }
                },
                {
                    "id": 9727,
                    "repository": "ppy\/osu",
                    "github_pull_request_id": 10717,
                    "github_url": "https:\/\/github.com\/ppy\/osu\/pull\/10717",
                    "url": null,
                    "type": "fix",
                    "category": "Ruleset API",
                    "title": "Implement HitObject application for DrawableHitObject",
                    "message_html": null,
                    "major": false,
                    "created_at": "2020-11-11T01:54:25+00:00",
                    "github_user": {
                        "id": 5,
                        "display_name": "smoogipoo",
                        "github_url": "https:\/\/github.com\/smoogipoo",
                        "osu_username": "smoogipoo",
                        "user_id": 1040328,
                        "user_url": "https:\/\/osu.ppy.sh\/users\/1040328"
                    }
                },
                {
                    "id": 9728,
                    "repository": "ppy\/osu",
                    "github_pull_request_id": 10776,
                    "github_url": "https:\/\/github.com\/ppy\/osu\/pull\/10776",
                    "url": null,
                    "type": "fix",
                    "category": "Testing",
                    "title": "Fix possible nullref with non-attached hitobjects",
                    "message_html": null,
                    "major": false,
                    "created_at": "2020-11-11T02:14:58+00:00",
                    "github_user": {
                        "id": 5,
                        "display_name": "smoogipoo",
                        "github_url": "https:\/\/github.com\/smoogipoo",
                        "osu_username": "smoogipoo",
                        "user_id": 1040328,
                        "user_url": "https:\/\/osu.ppy.sh\/users\/1040328"
                    }
                },
                {
                    "id": 9729,
                    "repository": "ppy\/osu",
                    "github_pull_request_id": 10784,
                    "github_url": "https:\/\/github.com\/ppy\/osu\/pull\/10784",
                    "url": null,
                    "type": "fix",
                    "category": "UI",
                    "title": "Fix user profile best performance weighting being out of order",
                    "message_html": null,
                    "major": false,
                    "created_at": "2020-11-11T02:21:43+00:00",
                    "github_user": {
                        "id": 3,
                        "display_name": "peppy",
                        "github_url": "https:\/\/github.com\/peppy",
                        "osu_username": "peppy",
                        "user_id": 2,
                        "user_url": "https:\/\/osu.ppy.sh\/users\/2"
                    }
                },
                {
                    "id": 9730,
                    "repository": "ppy\/osu",
                    "github_pull_request_id": 7762,
                    "github_url": "https:\/\/github.com\/ppy\/osu\/pull\/7762",
                    "url": null,
                    "type": "fix",
                    "category": "UI",
                    "title": "Implement UserHistoryGraph component",
                    "message_html": null,
                    "major": false,
                    "created_at": "2020-11-11T02:35:35+00:00",
                    "github_user": {
                        "id": 144,
                        "display_name": "EVAST9919",
                        "github_url": "https:\/\/github.com\/EVAST9919",
                        "osu_username": null,
                        "user_id": null,
                        "user_url": null
                    }
                },
                {
                    "id": 9731,
                    "repository": "ppy\/osu",
                    "github_pull_request_id": 10790,
                    "github_url": "https:\/\/github.com\/ppy\/osu\/pull\/10790",
                    "url": null,
                    "type": "fix",
                    "category": "Online",
                    "title": "Fix frames potentially getting added to spectator replay in wrong format",
                    "message_html": null,
                    "major": false,
                    "created_at": "2020-11-11T06:02:28+00:00",
                    "github_user": {
                        "id": 3,
                        "display_name": "peppy",
                        "github_url": "https:\/\/github.com\/peppy",
                        "osu_username": "peppy",
                        "user_id": 2,
                        "user_url": "https:\/\/osu.ppy.sh\/users\/2"
                    }
                },
                {
                    "id": 9732,
                    "repository": "ppy\/osu",
                    "github_pull_request_id": 10786,
                    "github_url": "https:\/\/github.com\/ppy\/osu\/pull\/10786",
                    "url": null,
                    "type": "fix",
                    "category": "UI",
                    "title": "Display skin changes via on-screen display overlay",
                    "message_html": null,
                    "major": true,
                    "created_at": "2020-11-11T06:12:20+00:00",
                    "github_user": {
                        "id": 3,
                        "display_name": "peppy",
                        "github_url": "https:\/\/github.com\/peppy",
                        "osu_username": "peppy",
                        "user_id": 2,
                        "user_url": "https:\/\/osu.ppy.sh\/users\/2"
                    }
                },
                {
                    "id": 9733,
                    "repository": "ppy\/osu",
                    "github_pull_request_id": 10787,
                    "github_url": "https:\/\/github.com\/ppy\/osu\/pull\/10787",
                    "url": null,
                    "type": "add",
                    "category": "UI",
                    "title": "Add the ability for the game OSD to display user bindings",
                    "message_html": null,
                    "major": false,
                    "created_at": "2020-11-11T06:44:46+00:00",
                    "github_user": {
                        "id": 3,
                        "display_name": "peppy",
                        "github_url": "https:\/\/github.com\/peppy",
                        "osu_username": "peppy",
                        "user_id": 2,
                        "user_url": "https:\/\/osu.ppy.sh\/users\/2"
                    }
                },
                {
                    "id": 9734,
                    "repository": "ppy\/osu",
                    "github_pull_request_id": 3652,
                    "github_url": "https:\/\/github.com\/ppy\/osu\/pull\/3652",
                    "url": null,
                    "type": "add",
                    "category": "Settings",
                    "title": "Add \"random skin\" option to skin setting dropdown",
                    "message_html": null,
                    "major": false,
                    "created_at": "2020-11-11T06:47:01+00:00",
                    "github_user": {
                        "id": 107,
                        "display_name": "WebFreak001",
                        "github_url": "https:\/\/github.com\/WebFreak001",
                        "osu_username": null,
                        "user_id": null,
                        "user_url": null
                    }
                },
                {
                    "id": 9736,
                    "repository": "ppy\/osu",
                    "github_pull_request_id": 10789,
                    "github_url": "https:\/\/github.com\/ppy\/osu\/pull\/10789",
                    "url": null,
                    "type": "add",
                    "category": "Settings",
                    "title": "Add hotkey to select a new random skin",
                    "message_html": "<div class='changelog-md'><p class=\"changelog-md__paragraph\">Defaults to ctrl-shift-r. Can be customised.<\/p>\n<\/div>",
                    "major": true,
                    "created_at": "2020-11-11T07:25:13+00:00",
                    "github_user": {
                        "id": 3,
                        "display_name": "peppy",
                        "github_url": "https:\/\/github.com\/peppy",
                        "osu_username": "peppy",
                        "user_id": 2,
                        "user_url": "https:\/\/osu.ppy.sh\/users\/2"
                    }
                },
                {
                    "id": 9737,
                    "repository": "ppy\/osu",
                    "github_pull_request_id": 10788,
                    "github_url": "https:\/\/github.com\/ppy\/osu\/pull\/10788",
                    "url": null,
                    "type": "fix",
                    "category": "Gameplay (osu!mania)",
                    "title": "Fix osu!mania crashing after missing some long notes",
                    "message_html": null,
                    "major": false,
                    "created_at": "2020-11-11T07:38:16+00:00",
                    "github_user": {
                        "id": 5,
                        "display_name": "smoogipoo",
                        "github_url": "https:\/\/github.com\/smoogipoo",
                        "osu_username": "smoogipoo",
                        "user_id": 1040328,
                        "user_url": "https:\/\/osu.ppy.sh\/users\/1040328"
                    }
                },
                {
                    "id": 9738,
                    "repository": "ppy\/osu-framework",
                    "github_pull_request_id": 3993,
                    "github_url": "https:\/\/github.com\/ppy\/osu-framework\/pull\/3993",
                    "url": null,
                    "type": "fix",
                    "category": "Framework",
                    "title": "Fix initial application of state not occurring if invalidation not pending",
                    "message_html": null,
                    "major": false,
                    "created_at": "2020-11-11T07:48:52+00:00",
                    "github_user": {
                        "id": 3,
                        "display_name": "peppy",
                        "github_url": "https:\/\/github.com\/peppy",
                        "osu_username": "peppy",
                        "user_id": 2,
                        "user_url": "https:\/\/osu.ppy.sh\/users\/2"
                    }
                },
                {
                    "id": 9739,
                    "repository": "ppy\/osu",
                    "github_pull_request_id": 10792,
                    "github_url": "https:\/\/github.com\/ppy\/osu\/pull\/10792",
                    "url": null,
                    "type": "fix",
                    "category": "Code Quality",
                    "title": "Remove duplicate instantiation of externalLinkOpener",
                    "message_html": null,
                    "major": false,
                    "created_at": "2020-11-11T07:58:35+00:00",
                    "github_user": {
                        "id": 3,
                        "display_name": "peppy",
                        "github_url": "https:\/\/github.com\/peppy",
                        "osu_username": "peppy",
                        "user_id": 2,
                        "user_url": "https:\/\/osu.ppy.sh\/users\/2"
                    }
                },
                {
                    "id": 9741,
                    "repository": "ppy\/osu",
                    "github_pull_request_id": 10775,
                    "github_url": "https:\/\/github.com\/ppy\/osu\/pull\/10775",
                    "url": null,
                    "type": "fix",
                    "category": "Gameplay (osu!taiko)",
                    "title": "Disable kiai hit explosions on legacy skins",
                    "message_html": null,
                    "major": false,
                    "created_at": "2020-11-11T09:06:33+00:00",
                    "github_user": {
                        "id": 218,
                        "display_name": "bdach",
                        "github_url": "https:\/\/github.com\/bdach",
                        "osu_username": null,
                        "user_id": null,
                        "user_url": null
                    }
                },
                {
                    "id": 9745,
                    "repository": "ppy\/osu",
                    "github_pull_request_id": 10796,
                    "github_url": "https:\/\/github.com\/ppy\/osu\/pull\/10796",
                    "url": null,
                    "type": "fix",
                    "category": "Testing",
                    "title": "Fix frame stable playback not being set correctly",
                    "message_html": null,
                    "major": false,
                    "created_at": "2020-11-11T10:54:46+00:00",
                    "github_user": {
                        "id": 5,
                        "display_name": "smoogipoo",
                        "github_url": "https:\/\/github.com\/smoogipoo",
                        "osu_username": "smoogipoo",
                        "user_id": 1040328,
                        "user_url": "https:\/\/osu.ppy.sh\/users\/1040328"
                    }
                },
                {
                    "id": 9749,
                    "repository": "ppy\/osu",
                    "github_pull_request_id": 10800,
                    "github_url": "https:\/\/github.com\/ppy\/osu\/pull\/10800",
                    "url": null,
                    "type": "add",
                    "category": "UI",
                    "title": "Add counter to most played beatmaps section in User Overlay",
                    "message_html": null,
                    "major": false,
                    "created_at": "2020-11-12T00:59:03+00:00",
                    "github_user": {
                        "id": 144,
                        "display_name": "EVAST9919",
                        "github_url": "https:\/\/github.com\/EVAST9919",
                        "osu_username": null,
                        "user_id": null,
                        "user_url": null
                    }
                },
                {
                    "id": 9752,
                    "repository": "ppy\/osu",
                    "github_pull_request_id": 10794,
                    "github_url": "https:\/\/github.com\/ppy\/osu\/pull\/10794",
                    "url": null,
                    "type": "fix",
                    "category": "Gameplay (osu!)",
                    "title": "Fix hitobjects sometimes not fading in completely with HD mod",
                    "message_html": null,
                    "major": false,
                    "created_at": "2020-11-12T08:06:05+00:00",
                    "github_user": {
                        "id": 5,
                        "display_name": "smoogipoo",
                        "github_url": "https:\/\/github.com\/smoogipoo",
                        "osu_username": "smoogipoo",
                        "user_id": 1040328,
                        "user_url": "https:\/\/osu.ppy.sh\/users\/1040328"
                    }
                },
                {
                    "id": 9753,
                    "repository": "ppy\/osu",
                    "github_pull_request_id": 10801,
                    "github_url": "https:\/\/github.com\/ppy\/osu\/pull\/10801",
                    "url": null,
                    "type": "fix",
                    "category": "Storyboard",
                    "title": "Fix storyboard animations of very old beatmaps playing too slow",
                    "message_html": null,
                    "major": false,
                    "created_at": "2020-11-12T10:06:58+00:00",
                    "github_user": {
                        "id": 3,
                        "display_name": "peppy",
                        "github_url": "https:\/\/github.com\/peppy",
                        "osu_username": "peppy",
                        "user_id": 2,
                        "user_url": "https:\/\/osu.ppy.sh\/users\/2"
                    }
                },
                {
                    "id": 9754,
                    "repository": "ppy\/osu-framework",
                    "github_pull_request_id": 3997,
                    "github_url": "https:\/\/github.com\/ppy\/osu-framework\/pull\/3997",
                    "url": null,
                    "type": "fix",
                    "category": "Framework",
                    "title": "Don't log performance issues on non-async lookups if they are cached",
                    "message_html": null,
                    "major": false,
                    "created_at": "2020-11-12T11:05:00+00:00",
                    "github_user": {
                        "id": 3,
                        "display_name": "peppy",
                        "github_url": "https:\/\/github.com\/peppy",
                        "osu_username": "peppy",
                        "user_id": 2,
                        "user_url": "https:\/\/osu.ppy.sh\/users\/2"
                    }
                },
                {
                    "id": 9755,
                    "repository": "ppy\/osu",
                    "github_pull_request_id": 10802,
                    "github_url": "https:\/\/github.com\/ppy\/osu\/pull\/10802",
                    "url": null,
                    "type": "fix",
                    "category": "Testing",
                    "title": "Fix skin fallback test crashing on repeats",
                    "message_html": null,
                    "major": false,
                    "created_at": "2020-11-12T11:15:36+00:00",
                    "github_user": {
                        "id": 5,
                        "display_name": "smoogipoo",
                        "github_url": "https:\/\/github.com\/smoogipoo",
                        "osu_username": "smoogipoo",
                        "user_id": 1040328,
                        "user_url": "https:\/\/osu.ppy.sh\/users\/1040328"
                    }
                },
                {
                    "id": 9758,
                    "repository": "ppy\/osu",
                    "github_pull_request_id": 10793,
                    "github_url": "https:\/\/github.com\/ppy\/osu\/pull\/10793",
                    "url": null,
                    "type": "fix",
                    "category": "UX",
                    "title": "Refactor \"perform from menu\" logic to be aware of dialog prompts",
                    "message_html": null,
                    "major": true,
                    "created_at": "2020-11-12T14:50:09+00:00",
                    "github_user": {
                        "id": 3,
                        "display_name": "peppy",
                        "github_url": "https:\/\/github.com\/peppy",
                        "osu_username": "peppy",
                        "user_id": 2,
                        "user_url": "https:\/\/osu.ppy.sh\/users\/2"
                    }
                },
                {
                    "id": 9759,
                    "repository": "ppy\/osu",
                    "github_pull_request_id": 10799,
                    "github_url": "https:\/\/github.com\/ppy\/osu\/pull\/10799",
                    "url": null,
                    "type": "add",
                    "category": "Testing",
                    "title": "Add test for accuracy heatmap",
                    "message_html": null,
                    "major": false,
                    "created_at": "2020-11-12T15:40:13+00:00",
                    "github_user": {
                        "id": 429,
                        "display_name": "nbvdkamp",
                        "github_url": "https:\/\/github.com\/nbvdkamp",
                        "osu_username": null,
                        "user_id": null,
                        "user_url": null
                    }
                },
                {
                    "id": 9770,
                    "repository": "ppy\/osu",
                    "github_pull_request_id": 10810,
                    "github_url": "https:\/\/github.com\/ppy\/osu\/pull\/10810",
                    "url": null,
                    "type": "fix",
                    "category": "Editor",
                    "title": "Prevent SelectionBox handles from appearing for stacks",
                    "message_html": null,
                    "major": false,
                    "created_at": "2020-11-12T23:29:17+00:00",
                    "github_user": {
                        "id": 429,
                        "display_name": "nbvdkamp",
                        "github_url": "https:\/\/github.com\/nbvdkamp",
                        "osu_username": null,
                        "user_id": null,
                        "user_url": null
                    }
                },
                {
                    "id": 9771,
                    "repository": "ppy\/osu",
                    "github_pull_request_id": 10805,
                    "github_url": "https:\/\/github.com\/ppy\/osu\/pull\/10805",
                    "url": null,
                    "type": "fix",
                    "category": "Gameplay (osu!)",
                    "title": "Fix slider ends not fading out after a rewind with hidden mod",
                    "message_html": null,
                    "major": false,
                    "created_at": "2020-11-13T02:27:16+00:00",
                    "github_user": {
                        "id": 218,
                        "display_name": "bdach",
                        "github_url": "https:\/\/github.com\/bdach",
                        "osu_username": null,
                        "user_id": null,
                        "user_url": null
                    }
                },
                {
                    "id": 9772,
                    "repository": "ppy\/osu-framework",
                    "github_pull_request_id": 3999,
                    "github_url": "https:\/\/github.com\/ppy\/osu-framework\/pull\/3999",
                    "url": null,
                    "type": "add",
                    "category": "Tooling",
                    "title": "Add transform preview to draw visualiser",
                    "message_html": null,
                    "major": false,
                    "created_at": "2020-11-13T05:22:27+00:00",
                    "github_user": {
                        "id": 218,
                        "display_name": "bdach",
                        "github_url": "https:\/\/github.com\/bdach",
                        "osu_username": null,
                        "user_id": null,
                        "user_url": null
                    }
                },
                {
                    "id": 9773,
                    "repository": "ppy\/osu",
                    "github_pull_request_id": 10797,
                    "github_url": "https:\/\/github.com\/ppy\/osu\/pull\/10797",
                    "url": null,
                    "type": "fix",
                    "category": "Ruleset API",
                    "title": "Implement top-level hitobject pooling",
                    "message_html": null,
                    "major": false,
                    "created_at": "2020-11-13T07:52:07+00:00",
                    "github_user": {
                        "id": 5,
                        "display_name": "smoogipoo",
                        "github_url": "https:\/\/github.com\/smoogipoo",
                        "osu_username": "smoogipoo",
                        "user_id": 1040328,
                        "user_url": "https:\/\/osu.ppy.sh\/users\/1040328"
                    }
                },
                {
                    "id": 9776,
                    "repository": "ppy\/osu",
                    "github_pull_request_id": 10803,
                    "github_url": "https:\/\/github.com\/ppy\/osu\/pull\/10803",
                    "url": null,
                    "type": "add",
                    "category": "Ruleset API",
                    "title": "Add nested hitobject pooling",
                    "message_html": null,
                    "major": false,
                    "created_at": "2020-11-13T08:34:11+00:00",
                    "github_user": {
                        "id": 5,
                        "display_name": "smoogipoo",
                        "github_url": "https:\/\/github.com\/smoogipoo",
                        "osu_username": "smoogipoo",
                        "user_id": 1040328,
                        "user_url": "https:\/\/osu.ppy.sh\/users\/1040328"
                    }
                },
                {
                    "id": 9777,
                    "repository": "ppy\/osu",
                    "github_pull_request_id": 10823,
                    "github_url": "https:\/\/github.com\/ppy\/osu\/pull\/10823",
                    "url": null,
                    "type": "add",
                    "category": "Editor",
                    "title": "Add pooling support to the editor",
                    "message_html": null,
                    "major": false,
                    "created_at": "2020-11-13T10:58:47+00:00",
                    "github_user": {
                        "id": 5,
                        "display_name": "smoogipoo",
                        "github_url": "https:\/\/github.com\/smoogipoo",
                        "osu_username": "smoogipoo",
                        "user_id": 1040328,
                        "user_url": "https:\/\/osu.ppy.sh\/users\/1040328"
                    }
                },
                {
                    "id": 9780,
                    "repository": "ppy\/osu",
                    "github_pull_request_id": 10827,
                    "github_url": "https:\/\/github.com\/ppy\/osu\/pull\/10827",
                    "url": null,
                    "type": "fix",
                    "category": "Testing",
                    "title": "Fix broken fail judgement test",
                    "message_html": null,
                    "major": false,
                    "created_at": "2020-11-13T17:25:58+00:00",
                    "github_user": {
                        "id": 5,
                        "display_name": "smoogipoo",
                        "github_url": "https:\/\/github.com\/smoogipoo",
                        "osu_username": "smoogipoo",
                        "user_id": 1040328,
                        "user_url": "https:\/\/osu.ppy.sh\/users\/1040328"
                    }
                },
                {
                    "id": 9782,
                    "repository": "ppy\/osu",
                    "github_pull_request_id": 10820,
                    "github_url": "https:\/\/github.com\/ppy\/osu\/pull\/10820",
                    "url": null,
                    "type": "fix",
                    "category": "UX",
                    "title": "Fix perform from menu not hiding overlays if already on target screen",
                    "message_html": null,
                    "major": false,
                    "created_at": "2020-11-13T18:47:13+00:00",
                    "github_user": {
                        "id": 3,
                        "display_name": "peppy",
                        "github_url": "https:\/\/github.com\/peppy",
                        "osu_username": "peppy",
                        "user_id": 2,
                        "user_url": "https:\/\/osu.ppy.sh\/users\/2"
                    }
                },
                {
                    "id": 9784,
                    "repository": "ppy\/osu",
                    "github_pull_request_id": 10812,
                    "github_url": "https:\/\/github.com\/ppy\/osu\/pull\/10812",
                    "url": null,
                    "type": "fix",
                    "category": "Editor",
                    "title": "Allow spinners to be reversed",
                    "message_html": null,
                    "major": false,
                    "created_at": "2020-11-13T19:25:22+00:00",
                    "github_user": {
                        "id": 429,
                        "display_name": "nbvdkamp",
                        "github_url": "https:\/\/github.com\/nbvdkamp",
                        "osu_username": null,
                        "user_id": null,
                        "user_url": null
                    }
                },
                {
                    "id": 9785,
                    "repository": "ppy\/osu",
                    "github_pull_request_id": 10819,
                    "github_url": "https:\/\/github.com\/ppy\/osu\/pull\/10819",
                    "url": null,
                    "type": "add",
                    "category": "Settings",
                    "title": "Add setting to toggle \"always play first combo break\"",
                    "message_html": null,
                    "major": false,
                    "created_at": "2020-11-13T20:07:06+00:00",
                    "github_user": {
                        "id": 3,
                        "display_name": "peppy",
                        "github_url": "https:\/\/github.com\/peppy",
                        "osu_username": "peppy",
                        "user_id": 2,
                        "user_url": "https:\/\/osu.ppy.sh\/users\/2"
                    }
                },
                {
                    "id": 9786,
                    "repository": "ppy\/osu",
                    "github_pull_request_id": 10817,
                    "github_url": "https:\/\/github.com\/ppy\/osu\/pull\/10817",
                    "url": null,
                    "type": "fix",
                    "category": "Gameplay",
                    "title": "Fix combo break sounds playing during seek",
                    "message_html": null,
                    "major": false,
                    "created_at": "2020-11-13T20:46:03+00:00",
                    "github_user": {
                        "id": 3,
                        "display_name": "peppy",
                        "github_url": "https:\/\/github.com\/peppy",
                        "osu_username": "peppy",
                        "user_id": 2,
                        "user_url": "https:\/\/osu.ppy.sh\/users\/2"
                    }
                },
                {
                    "id": 9787,
                    "repository": "ppy\/osu",
                    "github_pull_request_id": 10818,
                    "github_url": "https:\/\/github.com\/ppy\/osu\/pull\/10818",
                    "url": null,
                    "type": "fix",
                    "category": "Gameplay",
                    "title": "Fix combo break sound not playing a second time after rewinding before it",
                    "message_html": null,
                    "major": false,
                    "created_at": "2020-11-13T21:26:17+00:00",
                    "github_user": {
                        "id": 3,
                        "display_name": "peppy",
                        "github_url": "https:\/\/github.com\/peppy",
                        "osu_username": "peppy",
                        "user_id": 2,
                        "user_url": "https:\/\/osu.ppy.sh\/users\/2"
                    }
                },
                {
                    "id": 9789,
                    "repository": "ppy\/osu",
                    "github_pull_request_id": 10828,
                    "github_url": "https:\/\/github.com\/ppy\/osu\/pull\/10828",
                    "url": null,
                    "type": "fix",
                    "category": "Gameplay (osu!mania)",
                    "title": "Disable pressed\/released hold note logic when rewinding",
                    "message_html": null,
                    "major": false,
                    "created_at": "2020-11-14T01:05:47+00:00",
                    "github_user": {
                        "id": 218,
                        "display_name": "bdach",
                        "github_url": "https:\/\/github.com\/bdach",
                        "osu_username": null,
                        "user_id": null,
                        "user_url": null
                    }
                },
                {
                    "id": 9790,
                    "repository": "ppy\/osu",
                    "github_pull_request_id": 10825,
                    "github_url": "https:\/\/github.com\/ppy\/osu\/pull\/10825",
                    "url": null,
                    "type": "fix",
                    "category": "Ruleset API",
                    "title": "Move hitobject pooling into Playfield",
                    "message_html": null,
                    "major": false,
                    "created_at": "2020-11-14T06:43:23+00:00",
                    "github_user": {
                        "id": 5,
                        "display_name": "smoogipoo",
                        "github_url": "https:\/\/github.com\/smoogipoo",
                        "osu_username": "smoogipoo",
                        "user_id": 1040328,
                        "user_url": "https:\/\/osu.ppy.sh\/users\/1040328"
                    }
                },
                {
                    "id": 9792,
                    "repository": "ppy\/osu",
                    "github_pull_request_id": 10826,
                    "github_url": "https:\/\/github.com\/ppy\/osu\/pull\/10826",
                    "url": null,
                    "type": "fix",
                    "category": "Performance",
                    "title": "Change osu! ruleset to use pooled hitobjects",
                    "message_html": "<div class='changelog-md'><p class=\"changelog-md__paragraph\">Should reduce memory usage during gameplay by a magnitude or more. Note that this needs to be implemented per-ruleset and only supports osu! currently.<\/p>\n<\/div>",
                    "major": true,
                    "created_at": "2020-11-14T09:37:24+00:00",
                    "github_user": {
                        "id": 5,
                        "display_name": "smoogipoo",
                        "github_url": "https:\/\/github.com\/smoogipoo",
                        "osu_username": "smoogipoo",
                        "user_id": 1040328,
                        "user_url": "https:\/\/osu.ppy.sh\/users\/1040328"
                    }
                }
            ]
        },
        {
            "id": 5475,
            "version": "2020.1113.0",
            "display_version": "2020.1113.0",
            "users": 0,
            "created_at": "2020-11-13T12:35:08+00:00",
            "update_stream": {
                "id": 8,
                "name": "web",
                "display_name": "Web",
                "is_featured": false
            },
            "changelog_entries": [
                {
                    "id": 9724,
                    "repository": "ppy\/osu-wiki",
                    "github_pull_request_id": 4435,
                    "github_url": "https:\/\/github.com\/ppy\/osu-wiki\/pull\/4435",
                    "url": null,
                    "type": "fix",
                    "category": "Wiki",
                    "title": "Update information in Chat Console article",
                    "message_html": null,
                    "major": false,
                    "created_at": "2020-11-10T16:37:12+00:00",
                    "github_user": {
                        "id": 397,
                        "display_name": "C0NS03L",
                        "github_url": "https:\/\/github.com\/C0NS03L",
                        "osu_username": null,
                        "user_id": null,
                        "user_url": null
                    }
                },
                {
                    "id": 9725,
                    "repository": "ppy\/osu-wiki",
                    "github_pull_request_id": 4413,
                    "github_url": "https:\/\/github.com\/ppy\/osu-wiki\/pull\/4413",
                    "url": null,
                    "type": "fix",
                    "category": "Wiki",
                    "title": "Recheck unification in TWC, CWC, MWC",
                    "message_html": null,
                    "major": false,
                    "created_at": "2020-11-10T22:52:20+00:00",
                    "github_user": {
                        "id": 31,
                        "display_name": "fajar13k",
                        "github_url": "https:\/\/github.com\/fajar13k",
                        "osu_username": null,
                        "user_id": null,
                        "user_url": null
                    }
                },
                {
                    "id": 9735,
                    "repository": "ppy\/osu-web",
                    "github_pull_request_id": 6863,
                    "github_url": "https:\/\/github.com\/ppy\/osu-web\/pull\/6863",
                    "url": null,
                    "type": "fix",
                    "category": "Store",
                    "title": "Log orders made directly from Shopify",
                    "message_html": null,
                    "major": false,
                    "created_at": "2020-11-11T07:16:34+00:00",
                    "github_user": {
                        "id": 1,
                        "display_name": "notbakaneko",
                        "github_url": "https:\/\/github.com\/notbakaneko",
                        "osu_username": "notbakaneko",
                        "user_id": 10751776,
                        "user_url": "https:\/\/osu.ppy.sh\/users\/10751776"
                    }
                },
                {
                    "id": 9740,
                    "repository": "ppy\/osu-web",
                    "github_pull_request_id": 6867,
                    "github_url": "https:\/\/github.com\/ppy\/osu-web\/pull\/6867",
                    "url": null,
                    "type": "fix",
                    "category": "Reliability",
                    "title": "Reduce potential timing problem on beatmapset nomination",
                    "message_html": null,
                    "major": false,
                    "created_at": "2020-11-11T08:50:24+00:00",
                    "github_user": {
                        "id": 2,
                        "display_name": "nanaya",
                        "github_url": "https:\/\/github.com\/nanaya",
                        "osu_username": "nanaya",
                        "user_id": 2387883,
                        "user_url": "https:\/\/osu.ppy.sh\/users\/2387883"
                    }
                },
                {
                    "id": 9742,
                    "repository": "ppy\/osu-wiki",
                    "github_pull_request_id": 4437,
                    "github_url": "https:\/\/github.com\/ppy\/osu-wiki\/pull\/4437",
                    "url": null,
                    "type": "add",
                    "category": "Wiki",
                    "title": "Add New Featured Artist: Fuki newspost",
                    "message_html": null,
                    "major": false,
                    "created_at": "2020-11-11T09:37:09+00:00",
                    "github_user": {
                        "id": 13,
                        "display_name": "Ephemeralis",
                        "github_url": "https:\/\/github.com\/Ephemeralis",
                        "osu_username": "Ephemeralis",
                        "user_id": 10948742,
                        "user_url": "https:\/\/osu.ppy.sh\/users\/10948742"
                    }
                },
                {
                    "id": 9744,
                    "repository": "ppy\/osu-web",
                    "github_pull_request_id": 6773,
                    "github_url": "https:\/\/github.com\/ppy\/osu-web\/pull\/6773",
                    "url": null,
                    "type": "fix",
                    "category": "Chat",
                    "title": "Updated chat channel selection and loading",
                    "message_html": null,
                    "major": false,
                    "created_at": "2020-11-11T10:37:42+00:00",
                    "github_user": {
                        "id": 1,
                        "display_name": "notbakaneko",
                        "github_url": "https:\/\/github.com\/notbakaneko",
                        "osu_username": "notbakaneko",
                        "user_id": 10751776,
                        "user_url": "https:\/\/osu.ppy.sh\/users\/10751776"
                    }
                },
                {
                    "id": 9746,
                    "repository": "ppy\/osu-web",
                    "github_pull_request_id": 6868,
                    "github_url": "https:\/\/github.com\/ppy\/osu-web\/pull\/6868",
                    "url": null,
                    "type": "fix",
                    "category": "Beatmap Discussions",
                    "title": "Fix blank discussion listing page when there's discussion on deleted beatmapset",
                    "message_html": null,
                    "major": false,
                    "created_at": "2020-11-11T12:10:46+00:00",
                    "github_user": {
                        "id": 2,
                        "display_name": "nanaya",
                        "github_url": "https:\/\/github.com\/nanaya",
                        "osu_username": "nanaya",
                        "user_id": 2387883,
                        "user_url": "https:\/\/osu.ppy.sh\/users\/2387883"
                    }
                },
                {
                    "id": 9747,
                    "repository": "ppy\/osu-wiki",
                    "github_pull_request_id": 4431,
                    "github_url": "https:\/\/github.com\/ppy\/osu-wiki\/pull\/4431",
                    "url": null,
                    "type": "add",
                    "category": "Wiki",
                    "title": "Add Indonesia Convert Cup 2020 wiki article",
                    "message_html": null,
                    "major": false,
                    "created_at": "2020-11-11T13:58:07+00:00",
                    "github_user": {
                        "id": 323,
                        "display_name": "Nivalyx",
                        "github_url": "https:\/\/github.com\/Nivalyx",
                        "osu_username": null,
                        "user_id": null,
                        "user_url": null
                    }
                },
                {
                    "id": 9748,
                    "repository": "ppy\/osu-wiki",
                    "github_pull_request_id": 4440,
                    "github_url": "https:\/\/github.com\/ppy\/osu-wiki\/pull\/4440",
                    "url": null,
                    "type": "fix",
                    "category": "Wiki",
                    "title": "OWC2020: Fix wrong brackets for two matches in schedule",
                    "message_html": null,
                    "major": false,
                    "created_at": "2020-11-11T18:01:16+00:00",
                    "github_user": {
                        "id": 102,
                        "display_name": "ThePooN",
                        "github_url": "https:\/\/github.com\/ThePooN",
                        "osu_username": null,
                        "user_id": null,
                        "user_url": null
                    }
                },
                {
                    "id": 9750,
                    "repository": "ppy\/osu-web",
                    "github_pull_request_id": 6869,
                    "github_url": "https:\/\/github.com\/ppy\/osu-web\/pull\/6869",
                    "url": null,
                    "type": "fix",
                    "category": "Testing",
                    "title": "Update Ubuntu used for Travis",
                    "message_html": null,
                    "major": false,
                    "created_at": "2020-11-12T05:37:11+00:00",
                    "github_user": {
                        "id": 2,
                        "display_name": "nanaya",
                        "github_url": "https:\/\/github.com\/nanaya",
                        "osu_username": "nanaya",
                        "user_id": 2387883,
                        "user_url": "https:\/\/osu.ppy.sh\/users\/2387883"
                    }
                },
                {
                    "id": 9751,
                    "repository": "ppy\/osu-web",
                    "github_pull_request_id": 6667,
                    "github_url": "https:\/\/github.com\/ppy\/osu-web\/pull\/6667",
                    "url": null,
                    "type": "fix",
                    "category": "Beatmap Discussions",
                    "title": "Make backspace and delete behave the same inside of empty nodes (i.e. delete the node)",
                    "message_html": null,
                    "major": false,
                    "created_at": "2020-11-12T06:11:17+00:00",
                    "github_user": {
                        "id": 6,
                        "display_name": "nekodex",
                        "github_url": "https:\/\/github.com\/nekodex",
                        "osu_username": "nekodex",
                        "user_id": 102,
                        "user_url": "https:\/\/osu.ppy.sh\/users\/102"
                    }
                },
                {
                    "id": 9756,
                    "repository": "ppy\/osu-web",
                    "github_pull_request_id": 6870,
                    "github_url": "https:\/\/github.com\/ppy\/osu-web\/pull\/6870",
                    "url": null,
                    "type": "add",
                    "category": "Code Quality",
                    "title": "Add check for php strict comparisons",
                    "message_html": null,
                    "major": false,
                    "created_at": "2020-11-12T11:25:02+00:00",
                    "github_user": {
                        "id": 2,
                        "display_name": "nanaya",
                        "github_url": "https:\/\/github.com\/nanaya",
                        "osu_username": "nanaya",
                        "user_id": 2387883,
                        "user_url": "https:\/\/osu.ppy.sh\/users\/2387883"
                    }
                },
                {
                    "id": 9757,
                    "repository": "ppy\/osu-web",
                    "github_pull_request_id": 6846,
                    "github_url": "https:\/\/github.com\/ppy\/osu-web\/pull\/6846",
                    "url": null,
                    "type": "fix",
                    "category": "Ux",
                    "title": "Increase opaqueness of user-group badges to aid legibility",
                    "message_html": null,
                    "major": false,
                    "created_at": "2020-11-12T13:35:02+00:00",
                    "github_user": {
                        "id": 6,
                        "display_name": "nekodex",
                        "github_url": "https:\/\/github.com\/nekodex",
                        "osu_username": "nekodex",
                        "user_id": 102,
                        "user_url": "https:\/\/osu.ppy.sh\/users\/102"
                    }
                },
                {
                    "id": 9760,
                    "repository": "ppy\/osu-wiki",
                    "github_pull_request_id": 4442,
                    "github_url": "https:\/\/github.com\/ppy\/osu-wiki\/pull\/4442",
                    "url": null,
                    "type": "fix",
                    "category": "Wiki",
                    "title": "OWC2020 Quarterfinals reschedules",
                    "message_html": null,
                    "major": false,
                    "created_at": "2020-11-12T17:50:28+00:00",
                    "github_user": {
                        "id": 45,
                        "display_name": "WalterToro",
                        "github_url": "https:\/\/github.com\/WalterToro",
                        "osu_username": null,
                        "user_id": null,
                        "user_url": null
                    }
                },
                {
                    "id": 9761,
                    "repository": "ppy\/osu-wiki",
                    "github_pull_request_id": 4439,
                    "github_url": "https:\/\/github.com\/ppy\/osu-wiki\/pull\/4439",
                    "url": null,
                    "type": "fix",
                    "category": "Wiki",
                    "title": "[PT-BR] Fix typos in osu!api article",
                    "message_html": null,
                    "major": false,
                    "created_at": "2020-11-12T18:43:14+00:00",
                    "github_user": {
                        "id": 431,
                        "display_name": "brunohpaiva",
                        "github_url": "https:\/\/github.com\/brunohpaiva",
                        "osu_username": null,
                        "user_id": null,
                        "user_url": null
                    }
                },
                {
                    "id": 9762,
                    "repository": "ppy\/osu-wiki",
                    "github_pull_request_id": 4444,
                    "github_url": "https:\/\/github.com\/ppy\/osu-wiki\/pull\/4444",
                    "url": null,
                    "type": "fix",
                    "category": "Wiki",
                    "title": "Update BN listing and Staff log",
                    "message_html": null,
                    "major": false,
                    "created_at": "2020-11-12T19:03:57+00:00",
                    "github_user": {
                        "id": 349,
                        "display_name": "hypercyte",
                        "github_url": "https:\/\/github.com\/hypercyte",
                        "osu_username": null,
                        "user_id": null,
                        "user_url": null
                    }
                },
                {
                    "id": 9763,
                    "repository": "ppy\/osu-wiki",
                    "github_pull_request_id": 4406,
                    "github_url": "https:\/\/github.com\/ppy\/osu-wiki\/pull\/4406",
                    "url": null,
                    "type": "fix",
                    "category": "Wiki",
                    "title": "[TH] Add Tournaments",
                    "message_html": null,
                    "major": false,
                    "created_at": "2020-11-12T19:20:15+00:00",
                    "github_user": {
                        "id": 397,
                        "display_name": "C0NS03L",
                        "github_url": "https:\/\/github.com\/C0NS03L",
                        "osu_username": null,
                        "user_id": null,
                        "user_url": null
                    }
                },
                {
                    "id": 9764,
                    "repository": "ppy\/osu-wiki",
                    "github_pull_request_id": 4415,
                    "github_url": "https:\/\/github.com\/ppy\/osu-wiki\/pull\/4415",
                    "url": null,
                    "type": "fix",
                    "category": "Wiki",
                    "title": "[TH] Remove interpunction from Thai articles",
                    "message_html": null,
                    "major": false,
                    "created_at": "2020-11-12T19:40:27+00:00",
                    "github_user": {
                        "id": 397,
                        "display_name": "C0NS03L",
                        "github_url": "https:\/\/github.com\/C0NS03L",
                        "osu_username": null,
                        "user_id": null,
                        "user_url": null
                    }
                },
                {
                    "id": 9765,
                    "repository": "ppy\/osu-wiki",
                    "github_pull_request_id": 4416,
                    "github_url": "https:\/\/github.com\/ppy\/osu-wiki\/pull\/4416",
                    "url": null,
                    "type": "fix",
                    "category": "Wiki",
                    "title": "[TH] Clean up Modding",
                    "message_html": null,
                    "major": false,
                    "created_at": "2020-11-12T19:42:06+00:00",
                    "github_user": {
                        "id": 430,
                        "display_name": "Trigonoculus",
                        "github_url": "https:\/\/github.com\/Trigonoculus",
                        "osu_username": null,
                        "user_id": null,
                        "user_url": null
                    }
                },
                {
                    "id": 9766,
                    "repository": "ppy\/osu-wiki",
                    "github_pull_request_id": 4432,
                    "github_url": "https:\/\/github.com\/ppy\/osu-wiki\/pull\/4432",
                    "url": null,
                    "type": "fix",
                    "category": "Wiki",
                    "title": "[TH] Clean up and fully translate Chat Console",
                    "message_html": null,
                    "major": false,
                    "created_at": "2020-11-12T19:47:00+00:00",
                    "github_user": {
                        "id": 430,
                        "display_name": "Trigonoculus",
                        "github_url": "https:\/\/github.com\/Trigonoculus",
                        "osu_username": null,
                        "user_id": null,
                        "user_url": null
                    }
                },
                {
                    "id": 9767,
                    "repository": "ppy\/osu-wiki",
                    "github_pull_request_id": 4410,
                    "github_url": "https:\/\/github.com\/ppy\/osu-wiki\/pull\/4410",
                    "url": null,
                    "type": "fix",
                    "category": "Wiki",
                    "title": "[TH] Add Rules",
                    "message_html": null,
                    "major": false,
                    "created_at": "2020-11-12T20:07:53+00:00",
                    "github_user": {
                        "id": 397,
                        "display_name": "C0NS03L",
                        "github_url": "https:\/\/github.com\/C0NS03L",
                        "osu_username": null,
                        "user_id": null,
                        "user_url": null
                    }
                },
                {
                    "id": 9768,
                    "repository": "ppy\/osu-wiki",
                    "github_pull_request_id": 4418,
                    "github_url": "https:\/\/github.com\/ppy\/osu-wiki\/pull\/4418",
                    "url": null,
                    "type": "fix",
                    "category": "Wiki",
                    "title": "[TH] Retranslate and update Handling Foul Play",
                    "message_html": null,
                    "major": false,
                    "created_at": "2020-11-12T20:25:44+00:00",
                    "github_user": {
                        "id": 430,
                        "display_name": "Trigonoculus",
                        "github_url": "https:\/\/github.com\/Trigonoculus",
                        "osu_username": null,
                        "user_id": null,
                        "user_url": null
                    }
                },
                {
                    "id": 9769,
                    "repository": "ppy\/osu-wiki",
                    "github_pull_request_id": 4449,
                    "github_url": "https:\/\/github.com\/ppy\/osu-wiki\/pull\/4449",
                    "url": null,
                    "type": "fix",
                    "category": "Wiki",
                    "title": "Correct Username Spelling in BS Summer 20 Results",
                    "message_html": null,
                    "major": false,
                    "created_at": "2020-11-12T23:23:34+00:00",
                    "github_user": {
                        "id": 432,
                        "display_name": "Bazzadwarf",
                        "github_url": "https:\/\/github.com\/Bazzadwarf",
                        "osu_username": null,
                        "user_id": null,
                        "user_url": null
                    }
                },
                {
                    "id": 9775,
                    "repository": "ppy\/osu-wiki",
                    "github_pull_request_id": 4450,
                    "github_url": "https:\/\/github.com\/ppy\/osu-wiki\/pull\/4450",
                    "url": null,
                    "type": "fix",
                    "category": "Wiki",
                    "title": "[EN] Fix typo on Game modifier page",
                    "message_html": null,
                    "major": false,
                    "created_at": "2020-11-13T08:12:28+00:00",
                    "github_user": {
                        "id": 2,
                        "display_name": "nanaya",
                        "github_url": "https:\/\/github.com\/nanaya",
                        "osu_username": "nanaya",
                        "user_id": 2387883,
                        "user_url": "https:\/\/osu.ppy.sh\/users\/2387883"
                    }
                },
                {
                    "id": 9778,
                    "repository": "ppy\/osu-web",
                    "github_pull_request_id": 6871,
                    "github_url": "https:\/\/github.com\/ppy\/osu-web\/pull\/6871",
                    "url": null,
                    "type": "add",
                    "category": "Misc",
                    "title": "Add \"no difficulty reduction mods\" mode for beatmapset packs",
                    "message_html": null,
                    "major": false,
                    "created_at": "2020-11-13T12:29:59+00:00",
                    "github_user": {
                        "id": 2,
                        "display_name": "nanaya",
                        "github_url": "https:\/\/github.com\/nanaya",
                        "osu_username": "nanaya",
                        "user_id": 2387883,
                        "user_url": "https:\/\/osu.ppy.sh\/users\/2387883"
                    }
                }
            ]
        },
        {
            "id": 5474,
            "version": "2020.1110.0",
            "display_version": "2020.1110.0",
            "users": 0,
            "created_at": "2020-11-10T12:02:32+00:00",
            "update_stream": {
                "id": 8,
                "name": "web",
                "display_name": "Web",
                "is_featured": false
            },
            "changelog_entries": [
                {
                    "id": 9689,
                    "repository": "ppy\/osu-web",
                    "github_pull_request_id": 6862,
                    "github_url": "https:\/\/github.com\/ppy\/osu-web\/pull\/6862",
                    "url": null,
                    "type": "fix",
                    "category": "Performance",
                    "title": "Speed up marking notifications read",
                    "message_html": null,
                    "major": false,
                    "created_at": "2020-11-09T08:52:48+00:00",
                    "github_user": {
                        "id": 2,
                        "display_name": "nanaya",
                        "github_url": "https:\/\/github.com\/nanaya",
                        "osu_username": "nanaya",
                        "user_id": 2387883,
                        "user_url": "https:\/\/osu.ppy.sh\/users\/2387883"
                    }
                },
                {
                    "id": 9690,
                    "repository": "ppy\/osu-wiki",
                    "github_pull_request_id": 4426,
                    "github_url": "https:\/\/github.com\/ppy\/osu-wiki\/pull\/4426",
                    "url": null,
                    "type": "fix",
                    "category": "Wiki",
                    "title": "Conclude Advanced Global Taiko Showdown 2020",
                    "message_html": null,
                    "major": false,
                    "created_at": "2020-11-09T09:00:45+00:00",
                    "github_user": {
                        "id": 31,
                        "display_name": "fajar13k",
                        "github_url": "https:\/\/github.com\/fajar13k",
                        "osu_username": null,
                        "user_id": null,
                        "user_url": null
                    }
                },
                {
                    "id": 9696,
                    "repository": "ppy\/osu-wiki",
                    "github_pull_request_id": 4424,
                    "github_url": "https:\/\/github.com\/ppy\/osu-wiki\/pull\/4424",
                    "url": null,
                    "type": "add",
                    "category": "Wiki",
                    "title": "Add Winter Sports 2020 Fanart Contest newspost",
                    "message_html": null,
                    "major": false,
                    "created_at": "2020-11-09T11:30:12+00:00",
                    "github_user": {
                        "id": 13,
                        "display_name": "Ephemeralis",
                        "github_url": "https:\/\/github.com\/Ephemeralis",
                        "osu_username": "Ephemeralis",
                        "user_id": 10948742,
                        "user_url": "https:\/\/osu.ppy.sh\/users\/10948742"
                    }
                },
                {
                    "id": 9699,
                    "repository": "ppy\/osu-wiki",
                    "github_pull_request_id": 4427,
                    "github_url": "https:\/\/github.com\/ppy\/osu-wiki\/pull\/4427",
                    "url": null,
                    "type": "fix",
                    "category": "Wiki",
                    "title": "OWC2020 Quarterfinals update",
                    "message_html": null,
                    "major": false,
                    "created_at": "2020-11-09T14:02:29+00:00",
                    "github_user": {
                        "id": 45,
                        "display_name": "WalterToro",
                        "github_url": "https:\/\/github.com\/WalterToro",
                        "osu_username": null,
                        "user_id": null,
                        "user_url": null
                    }
                },
                {
                    "id": 9700,
                    "repository": "ppy\/osu-wiki",
                    "github_pull_request_id": 4428,
                    "github_url": "https:\/\/github.com\/ppy\/osu-wiki\/pull\/4428",
                    "url": null,
                    "type": "fix",
                    "category": "Wiki",
                    "title": "OWC2020 Fix broken table",
                    "message_html": null,
                    "major": false,
                    "created_at": "2020-11-09T14:18:30+00:00",
                    "github_user": {
                        "id": 45,
                        "display_name": "WalterToro",
                        "github_url": "https:\/\/github.com\/WalterToro",
                        "osu_username": null,
                        "user_id": null,
                        "user_url": null
                    }
                },
                {
                    "id": 9702,
                    "repository": "ppy\/osu-wiki",
                    "github_pull_request_id": 4429,
                    "github_url": "https:\/\/github.com\/ppy\/osu-wiki\/pull\/4429",
                    "url": null,
                    "type": "fix",
                    "category": "Wiki",
                    "title": "Fix Beatmap Spotlights Autumn schedule",
                    "message_html": null,
                    "major": false,
                    "created_at": "2020-11-09T20:47:38+00:00",
                    "github_user": {
                        "id": 24,
                        "display_name": "cl8n",
                        "github_url": "https:\/\/github.com\/cl8n",
                        "osu_username": null,
                        "user_id": null,
                        "user_url": null
                    }
                },
                {
                    "id": 9711,
                    "repository": "ppy\/osu-wiki",
                    "github_pull_request_id": 4433,
                    "github_url": "https:\/\/github.com\/ppy\/osu-wiki\/pull\/4433",
                    "url": null,
                    "type": "fix",
                    "category": "Wiki",
                    "title": "Minor fixes in Chat Console",
                    "message_html": null,
                    "major": false,
                    "created_at": "2020-11-10T07:34:48+00:00",
                    "github_user": {
                        "id": 430,
                        "display_name": "Trigonoculus",
                        "github_url": "https:\/\/github.com\/Trigonoculus",
                        "osu_username": null,
                        "user_id": null,
                        "user_url": null
                    }
                },
                {
                    "id": 9714,
                    "repository": "ppy\/osu-wiki",
                    "github_pull_request_id": 4434,
                    "github_url": "https:\/\/github.com\/ppy\/osu-wiki\/pull\/4434",
                    "url": null,
                    "type": "fix",
                    "category": "Wiki",
                    "title": "Update MP7K2 for Qualifiers",
                    "message_html": null,
                    "major": false,
                    "created_at": "2020-11-10T08:56:13+00:00",
                    "github_user": {
                        "id": 245,
                        "display_name": "benzerka",
                        "github_url": "https:\/\/github.com\/benzerka",
                        "osu_username": null,
                        "user_id": null,
                        "user_url": null
                    }
                },
                {
                    "id": 9718,
                    "repository": "ppy\/osu-web",
                    "github_pull_request_id": 6864,
                    "github_url": "https:\/\/github.com\/ppy\/osu-web\/pull\/6864",
                    "url": null,
                    "type": "fix",
                    "category": "Code Quality",
                    "title": "Fix exception handler returning wrong type of response to middleware",
                    "message_html": null,
                    "major": false,
                    "created_at": "2020-11-10T10:02:45+00:00",
                    "github_user": {
                        "id": 1,
                        "display_name": "notbakaneko",
                        "github_url": "https:\/\/github.com\/notbakaneko",
                        "osu_username": "notbakaneko",
                        "user_id": 10751776,
                        "user_url": "https:\/\/osu.ppy.sh\/users\/10751776"
                    }
                },
                {
                    "id": 9720,
                    "repository": "ppy\/osu-web",
                    "github_pull_request_id": 6853,
                    "github_url": "https:\/\/github.com\/ppy\/osu-web\/pull\/6853",
                    "url": null,
                    "type": "fix",
                    "category": "Admin",
                    "title": "Correctly handle user group's pending state",
                    "message_html": null,
                    "major": false,
                    "created_at": "2020-11-10T11:47:36+00:00",
                    "github_user": {
                        "id": 2,
                        "display_name": "nanaya",
                        "github_url": "https:\/\/github.com\/nanaya",
                        "osu_username": "nanaya",
                        "user_id": 2387883,
                        "user_url": "https:\/\/osu.ppy.sh\/users\/2387883"
                    }
                }
            ]
        },
        {
            "id": 5473,
            "version": "20201110.1",
            "display_version": "20201110.1",
            "users": 1,
            "created_at": "2020-11-10T06:42:12+00:00",
            "update_stream": {
                "id": 3,
                "name": "cuttingedge",
                "display_name": "Cutting Edge",
                "is_featured": false
            },
            "changelog_entries": [
                {
                    "id": null,
                    "repository": null,
                    "github_pull_request_id": null,
                    "github_url": null,
                    "url": null,
                    "type": "add",
                    "category": "Web",
                    "title": "Add new Featured Artist pack medals",
                    "message_html": null,
                    "major": false,
                    "created_at": "2020-11-10T02:10:48+00:00",
                    "github_user": {
                        "id": null,
                        "display_name": "Ephemeral",
                        "github_url": null,
                        "osu_username": "Ephemeral",
                        "user_id": 102335,
                        "user_url": "https:\/\/osu.ppy.sh\/users\/102335"
                    }
                },
                {
                    "id": null,
                    "repository": null,
                    "github_pull_request_id": null,
                    "github_url": null,
                    "url": null,
                    "type": "fix",
                    "category": "Misc",
                    "title": "Fix combo counter not displaying early enough if frame time is too low",
                    "message_html": null,
                    "major": false,
                    "created_at": "2020-11-10T06:39:22+00:00",
                    "github_user": {
                        "id": null,
                        "display_name": "peppy",
                        "github_url": null,
                        "osu_username": "peppy",
                        "user_id": 2,
                        "user_url": "https:\/\/osu.ppy.sh\/users\/2"
                    }
                }
            ]
        },
        {
            "id": 5472,
            "version": "20201110",
            "display_version": "20201110",
            "users": 21649,
            "created_at": "2020-11-09T15:07:17+00:00",
            "update_stream": {
                "id": 5,
                "name": "stable40",
                "display_name": "Stable",
                "is_featured": true
            },
            "changelog_entries": [
                {
                    "id": null,
                    "repository": null,
                    "github_pull_request_id": null,
                    "github_url": null,
                    "url": null,
                    "type": "fix",
                    "category": "Reliability",
                    "title": "Fix potential crash when cleaning up dynamic sprites",
                    "message_html": null,
                    "major": false,
                    "created_at": "2020-11-03T05:38:49+00:00",
                    "github_user": {
                        "id": null,
                        "display_name": "peppy",
                        "github_url": null,
                        "osu_username": "peppy",
                        "user_id": 2,
                        "user_url": "https:\/\/osu.ppy.sh\/users\/2"
                    }
                },
                {
                    "id": null,
                    "repository": null,
                    "github_pull_request_id": null,
                    "github_url": null,
                    "url": null,
                    "type": "fix",
                    "category": "Song Select",
                    "title": "Fix personal best not displaying for selected mod leaderboard",
                    "message_html": null,
                    "major": false,
                    "created_at": "2020-11-04T01:03:22+00:00",
                    "github_user": {
                        "id": null,
                        "display_name": "peppy",
                        "github_url": null,
                        "osu_username": "peppy",
                        "user_id": 2,
                        "user_url": "https:\/\/osu.ppy.sh\/users\/2"
                    }
                }
            ]
        },
        {
            "id": 5467,
            "version": "2020.1109.0",
            "display_version": "2020.1109.0",
            "users": 0,
            "created_at": "2020-11-09T12:27:19+00:00",
            "update_stream": {
                "id": 7,
                "name": "lazer",
                "display_name": "Lazer",
                "is_featured": false
            },
            "changelog_entries": [
                {
                    "id": 9576,
                    "repository": "ppy\/osu",
                    "github_pull_request_id": 10637,
                    "github_url": "https:\/\/github.com\/ppy\/osu\/pull\/10637",
                    "url": null,
                    "type": "fix",
                    "category": "Reliability",
                    "title": "Fix potential null reference when loading background",
                    "message_html": null,
                    "major": false,
                    "created_at": "2020-10-31T16:36:17+00:00",
                    "github_user": {
                        "id": 3,
                        "display_name": "peppy",
                        "github_url": "https:\/\/github.com\/peppy",
                        "osu_username": "peppy",
                        "user_id": 2,
                        "user_url": "https:\/\/osu.ppy.sh\/users\/2"
                    }
                },
                {
                    "id": 9583,
                    "repository": "ppy\/osu-framework",
                    "github_pull_request_id": 3962,
                    "github_url": "https:\/\/github.com\/ppy\/osu-framework\/pull\/3962",
                    "url": null,
                    "type": "fix",
                    "category": "Testing",
                    "title": "Fix ChildrenOfType thread safety when querying while items are being added",
                    "message_html": null,
                    "major": false,
                    "created_at": "2020-11-01T12:25:53+00:00",
                    "github_user": {
                        "id": 3,
                        "display_name": "peppy",
                        "github_url": "https:\/\/github.com\/peppy",
                        "osu_username": "peppy",
                        "user_id": 2,
                        "user_url": "https:\/\/osu.ppy.sh\/users\/2"
                    }
                },
                {
                    "id": 9584,
                    "repository": "ppy\/osu",
                    "github_pull_request_id": 10634,
                    "github_url": "https:\/\/github.com\/ppy\/osu\/pull\/10634",
                    "url": null,
                    "type": "fix",
                    "category": "Editor",
                    "title": "Fix selection box action tooltips still being visible after object deletion",
                    "message_html": null,
                    "major": false,
                    "created_at": "2020-11-01T14:02:30+00:00",
                    "github_user": {
                        "id": 218,
                        "display_name": "bdach",
                        "github_url": "https:\/\/github.com\/bdach",
                        "osu_username": null,
                        "user_id": null,
                        "user_url": null
                    }
                },
                {
                    "id": 9585,
                    "repository": "ppy\/osu",
                    "github_pull_request_id": 10647,
                    "github_url": "https:\/\/github.com\/ppy\/osu\/pull\/10647",
                    "url": null,
                    "type": "fix",
                    "category": "Reliability",
                    "title": "Ensure LoadOszIntoOsu returns actual imported map",
                    "message_html": null,
                    "major": false,
                    "created_at": "2020-11-01T14:49:34+00:00",
                    "github_user": {
                        "id": 218,
                        "display_name": "bdach",
                        "github_url": "https:\/\/github.com\/bdach",
                        "osu_username": null,
                        "user_id": null,
                        "user_url": null
                    }
                },
                {
                    "id": 9591,
                    "repository": "ppy\/osu",
                    "github_pull_request_id": 10623,
                    "github_url": "https:\/\/github.com\/ppy\/osu\/pull\/10623",
                    "url": null,
                    "type": "fix",
                    "category": "Song Select",
                    "title": "Fix \"bounce\" when metadata container text is empty in song select",
                    "message_html": null,
                    "major": false,
                    "created_at": "2020-11-02T01:45:15+00:00",
                    "github_user": {
                        "id": 428,
                        "display_name": "cadon0",
                        "github_url": "https:\/\/github.com\/cadon0",
                        "osu_username": null,
                        "user_id": null,
                        "user_url": null
                    }
                },
                {
                    "id": 9603,
                    "repository": "ppy\/osu-framework",
                    "github_pull_request_id": 3973,
                    "github_url": "https:\/\/github.com\/ppy\/osu-framework\/pull\/3973",
                    "url": null,
                    "type": "add",
                    "category": "Framework",
                    "title": "Add documentation about project templates",
                    "message_html": null,
                    "major": false,
                    "created_at": "2020-11-02T02:15:15+00:00",
                    "github_user": {
                        "id": 218,
                        "display_name": "bdach",
                        "github_url": "https:\/\/github.com\/bdach",
                        "osu_username": null,
                        "user_id": null,
                        "user_url": null
                    }
                },
                {
                    "id": 9604,
                    "repository": "ppy\/osu",
                    "github_pull_request_id": 10653,
                    "github_url": "https:\/\/github.com\/ppy\/osu\/pull\/10653",
                    "url": null,
                    "type": "fix",
                    "category": "Song Select",
                    "title": "Fix edit beatmap options button not resuming back to song select",
                    "message_html": null,
                    "major": false,
                    "created_at": "2020-11-02T02:18:16+00:00",
                    "github_user": {
                        "id": 9,
                        "display_name": "Joehuu",
                        "github_url": "https:\/\/github.com\/Joehuu",
                        "osu_username": null,
                        "user_id": null,
                        "user_url": null
                    }
                },
                {
                    "id": 9606,
                    "repository": "ppy\/osu",
                    "github_pull_request_id": 10631,
                    "github_url": "https:\/\/github.com\/ppy\/osu\/pull\/10631",
                    "url": null,
                    "type": "fix",
                    "category": "Editor",
                    "title": "Delete all selected objects if shift-clicked on one",
                    "message_html": null,
                    "major": false,
                    "created_at": "2020-11-02T03:04:58+00:00",
                    "github_user": {
                        "id": 218,
                        "display_name": "bdach",
                        "github_url": "https:\/\/github.com\/bdach",
                        "osu_username": null,
                        "user_id": null,
                        "user_url": null
                    }
                },
                {
                    "id": 9607,
                    "repository": "ppy\/osu",
                    "github_pull_request_id": 10606,
                    "github_url": "https:\/\/github.com\/ppy\/osu\/pull\/10606",
                    "url": null,
                    "type": "fix",
                    "category": "Editor",
                    "title": "Fix timeline zoom during drag-select causing unexpected behaviour",
                    "message_html": null,
                    "major": false,
                    "created_at": "2020-11-02T04:04:27+00:00",
                    "github_user": {
                        "id": 414,
                        "display_name": "FamousPig",
                        "github_url": "https:\/\/github.com\/FamousPig",
                        "osu_username": null,
                        "user_id": null,
                        "user_url": null
                    }
                },
                {
                    "id": 9608,
                    "repository": "ppy\/osu",
                    "github_pull_request_id": 10619,
                    "github_url": "https:\/\/github.com\/ppy\/osu\/pull\/10619",
                    "url": null,
                    "type": "fix",
                    "category": "Skinning",
                    "title": "Change sample lookup structure to allow specifications outside of \"Gameplay\" prefix",
                    "message_html": null,
                    "major": false,
                    "created_at": "2020-11-02T04:36:07+00:00",
                    "github_user": {
                        "id": 3,
                        "display_name": "peppy",
                        "github_url": "https:\/\/github.com\/peppy",
                        "osu_username": "peppy",
                        "user_id": 2,
                        "user_url": "https:\/\/osu.ppy.sh\/users\/2"
                    }
                },
                {
                    "id": 9610,
                    "repository": "ppy\/osu",
                    "github_pull_request_id": 10615,
                    "github_url": "https:\/\/github.com\/ppy\/osu\/pull\/10615",
                    "url": null,
                    "type": "add",
                    "category": "Results",
                    "title": "Add applause effect to results screen",
                    "message_html": null,
                    "major": true,
                    "created_at": "2020-11-02T05:26:34+00:00",
                    "github_user": {
                        "id": 3,
                        "display_name": "peppy",
                        "github_url": "https:\/\/github.com\/peppy",
                        "osu_username": "peppy",
                        "user_id": 2,
                        "user_url": "https:\/\/osu.ppy.sh\/users\/2"
                    }
                },
                {
                    "id": 9611,
                    "repository": "ppy\/osu",
                    "github_pull_request_id": 10654,
                    "github_url": "https:\/\/github.com\/ppy\/osu\/pull\/10654",
                    "url": null,
                    "type": "fix",
                    "category": "Editor",
                    "title": "Fix taiko drum not correct handling sample \/ group point changes",
                    "message_html": null,
                    "major": false,
                    "created_at": "2020-11-02T06:26:09+00:00",
                    "github_user": {
                        "id": 3,
                        "display_name": "peppy",
                        "github_url": "https:\/\/github.com\/peppy",
                        "osu_username": "peppy",
                        "user_id": 2,
                        "user_url": "https:\/\/osu.ppy.sh\/users\/2"
                    }
                },
                {
                    "id": 9612,
                    "repository": "ppy\/osu",
                    "github_pull_request_id": 10605,
                    "github_url": "https:\/\/github.com\/ppy\/osu\/pull\/10605",
                    "url": null,
                    "type": "add",
                    "category": "Online",
                    "title": "Add support for spectating other players",
                    "message_html": "<div class='changelog-md'><p class=\"changelog-md__paragraph\">Access from the &quot;dashboard&quot; icon in the toolbar!<\/p>\n<\/div>",
                    "major": true,
                    "created_at": "2020-11-02T06:30:00+00:00",
                    "github_user": {
                        "id": 3,
                        "display_name": "peppy",
                        "github_url": "https:\/\/github.com\/peppy",
                        "osu_username": "peppy",
                        "user_id": 2,
                        "user_url": "https:\/\/osu.ppy.sh\/users\/2"
                    }
                },
                {
                    "id": 9613,
                    "repository": "ppy\/osu",
                    "github_pull_request_id": 10258,
                    "github_url": "https:\/\/github.com\/ppy\/osu\/pull\/10258",
                    "url": null,
                    "type": "add",
                    "category": "Results",
                    "title": "Add dynamic calculation of performance points to local scores",
                    "message_html": null,
                    "major": true,
                    "created_at": "2020-11-02T06:40:56+00:00",
                    "github_user": {
                        "id": 167,
                        "display_name": "Game4all",
                        "github_url": "https:\/\/github.com\/Game4all",
                        "osu_username": null,
                        "user_id": null,
                        "user_url": null
                    }
                },
                {
                    "id": 9614,
                    "repository": "ppy\/osu",
                    "github_pull_request_id": 10640,
                    "github_url": "https:\/\/github.com\/ppy\/osu\/pull\/10640",
                    "url": null,
                    "type": "fix",
                    "category": "UX",
                    "title": "Fix music being paused after retrying & exiting timeshift map",
                    "message_html": null,
                    "major": false,
                    "created_at": "2020-11-02T06:46:20+00:00",
                    "github_user": {
                        "id": 218,
                        "display_name": "bdach",
                        "github_url": "https:\/\/github.com\/bdach",
                        "osu_username": null,
                        "user_id": null,
                        "user_url": null
                    }
                },
                {
                    "id": 9615,
                    "repository": "ppy\/osu",
                    "github_pull_request_id": 10657,
                    "github_url": "https:\/\/github.com\/ppy\/osu\/pull\/10657",
                    "url": null,
                    "type": "fix",
                    "category": "Code Quality",
                    "title": "Rename IsUserPaused -> UserPauseRequested",
                    "message_html": null,
                    "major": false,
                    "created_at": "2020-11-02T07:46:43+00:00",
                    "github_user": {
                        "id": 5,
                        "display_name": "smoogipoo",
                        "github_url": "https:\/\/github.com\/smoogipoo",
                        "osu_username": "smoogipoo",
                        "user_id": 1040328,
                        "user_url": "https:\/\/osu.ppy.sh\/users\/1040328"
                    }
                },
                {
                    "id": 9616,
                    "repository": "ppy\/osu",
                    "github_pull_request_id": 10659,
                    "github_url": "https:\/\/github.com\/ppy\/osu\/pull\/10659",
                    "url": null,
                    "type": "fix",
                    "category": "Editor",
                    "title": "Fix editor seek transform seeking too much",
                    "message_html": null,
                    "major": false,
                    "created_at": "2020-11-02T12:52:14+00:00",
                    "github_user": {
                        "id": 5,
                        "display_name": "smoogipoo",
                        "github_url": "https:\/\/github.com\/smoogipoo",
                        "osu_username": "smoogipoo",
                        "user_id": 1040328,
                        "user_url": "https:\/\/osu.ppy.sh\/users\/1040328"
                    }
                },
                {
                    "id": 9617,
                    "repository": "ppy\/osu",
                    "github_pull_request_id": 10661,
                    "github_url": "https:\/\/github.com\/ppy\/osu\/pull\/10661",
                    "url": null,
                    "type": "fix",
                    "category": "Editor",
                    "title": "Debounce calls to UpdateTernaryStates",
                    "message_html": null,
                    "major": false,
                    "created_at": "2020-11-02T17:00:33+00:00",
                    "github_user": {
                        "id": 3,
                        "display_name": "peppy",
                        "github_url": "https:\/\/github.com\/peppy",
                        "osu_username": "peppy",
                        "user_id": 2,
                        "user_url": "https:\/\/osu.ppy.sh\/users\/2"
                    }
                },
                {
                    "id": 9618,
                    "repository": "ppy\/osu",
                    "github_pull_request_id": 10658,
                    "github_url": "https:\/\/github.com\/ppy\/osu\/pull\/10658",
                    "url": null,
                    "type": "add",
                    "category": "Code Quality",
                    "title": "Add very basic connection status logging for spectator streaming client",
                    "message_html": null,
                    "major": false,
                    "created_at": "2020-11-02T19:59:05+00:00",
                    "github_user": {
                        "id": 3,
                        "display_name": "peppy",
                        "github_url": "https:\/\/github.com\/peppy",
                        "osu_username": "peppy",
                        "user_id": 2,
                        "user_url": "https:\/\/osu.ppy.sh\/users\/2"
                    }
                },
                {
                    "id": 9622,
                    "repository": "ppy\/osu",
                    "github_pull_request_id": 10677,
                    "github_url": "https:\/\/github.com\/ppy\/osu\/pull\/10677",
                    "url": null,
                    "type": "fix",
                    "category": "Gameplay",
                    "title": "Fix osu!catch banana animation not playing due to incorrect lifetimes",
                    "message_html": null,
                    "major": false,
                    "created_at": "2020-11-03T19:24:10+00:00",
                    "github_user": {
                        "id": 3,
                        "display_name": "peppy",
                        "github_url": "https:\/\/github.com\/peppy",
                        "osu_username": "peppy",
                        "user_id": 2,
                        "user_url": "https:\/\/osu.ppy.sh\/users\/2"
                    }
                },
                {
                    "id": 9623,
                    "repository": "ppy\/osu",
                    "github_pull_request_id": 10680,
                    "github_url": "https:\/\/github.com\/ppy\/osu\/pull\/10680",
                    "url": null,
                    "type": "add",
                    "category": "Editor",
                    "title": "Add key bindings for flip and reverse patterns",
                    "message_html": null,
                    "major": false,
                    "created_at": "2020-11-03T20:17:53+00:00",
                    "github_user": {
                        "id": 3,
                        "display_name": "peppy",
                        "github_url": "https:\/\/github.com\/peppy",
                        "osu_username": "peppy",
                        "user_id": 2,
                        "user_url": "https:\/\/osu.ppy.sh\/users\/2"
                    }
                },
                {
                    "id": 9624,
                    "repository": "ppy\/osu",
                    "github_pull_request_id": 10674,
                    "github_url": "https:\/\/github.com\/ppy\/osu\/pull\/10674",
                    "url": null,
                    "type": "fix",
                    "category": "Editor",
                    "title": "Change editor timeline mouse wheel handling to scroll by default (and zoom with alt held)",
                    "message_html": null,
                    "major": true,
                    "created_at": "2020-11-03T22:03:05+00:00",
                    "github_user": {
                        "id": 3,
                        "display_name": "peppy",
                        "github_url": "https:\/\/github.com\/peppy",
                        "osu_username": "peppy",
                        "user_id": 2,
                        "user_url": "https:\/\/osu.ppy.sh\/users\/2"
                    }
                },
                {
                    "id": 9625,
                    "repository": "ppy\/osu",
                    "github_pull_request_id": 10673,
                    "github_url": "https:\/\/github.com\/ppy\/osu\/pull\/10673",
                    "url": null,
                    "type": "add",
                    "category": "Editor",
                    "title": "Add opacity adjustment for waveform editor",
                    "message_html": "<div class='changelog-md'><p class=\"changelog-md__paragraph\">Access from the editor menu bar.<\/p>\n<\/div>",
                    "major": true,
                    "created_at": "2020-11-03T22:42:13+00:00",
                    "github_user": {
                        "id": 3,
                        "display_name": "peppy",
                        "github_url": "https:\/\/github.com\/peppy",
                        "osu_username": "peppy",
                        "user_id": 2,
                        "user_url": "https:\/\/osu.ppy.sh\/users\/2"
                    }
                },
                {
                    "id": 9626,
                    "repository": "ppy\/osu",
                    "github_pull_request_id": 10664,
                    "github_url": "https:\/\/github.com\/ppy\/osu\/pull\/10664",
                    "url": null,
                    "type": "fix",
                    "category": "Gameplay",
                    "title": "Fix osu!catch replay conversion applying left movements to wrong frame",
                    "message_html": null,
                    "major": false,
                    "created_at": "2020-11-03T23:17:19+00:00",
                    "github_user": {
                        "id": 3,
                        "display_name": "peppy",
                        "github_url": "https:\/\/github.com\/peppy",
                        "osu_username": "peppy",
                        "user_id": 2,
                        "user_url": "https:\/\/osu.ppy.sh\/users\/2"
                    }
                },
                {
                    "id": 9628,
                    "repository": "ppy\/osu",
                    "github_pull_request_id": 10678,
                    "github_url": "https:\/\/github.com\/ppy\/osu\/pull\/10678",
                    "url": null,
                    "type": "fix",
                    "category": "Song Select",
                    "title": "Fix LoadComponentAsync calls potentially occuring after beatmap wedge disposal",
                    "message_html": null,
                    "major": false,
                    "created_at": "2020-11-04T04:10:41+00:00",
                    "github_user": {
                        "id": 3,
                        "display_name": "peppy",
                        "github_url": "https:\/\/github.com\/peppy",
                        "osu_username": "peppy",
                        "user_id": 2,
                        "user_url": "https:\/\/osu.ppy.sh\/users\/2"
                    }
                },
                {
                    "id": 9630,
                    "repository": "ppy\/osu",
                    "github_pull_request_id": 10611,
                    "github_url": "https:\/\/github.com\/ppy\/osu\/pull\/10611",
                    "url": null,
                    "type": "add",
                    "category": "Online",
                    "title": "Add \"currently playing\" player listing and spectator UI flow",
                    "message_html": null,
                    "major": false,
                    "created_at": "2020-11-04T05:08:12+00:00",
                    "github_user": {
                        "id": 3,
                        "display_name": "peppy",
                        "github_url": "https:\/\/github.com\/peppy",
                        "osu_username": "peppy",
                        "user_id": 2,
                        "user_url": "https:\/\/osu.ppy.sh\/users\/2"
                    }
                },
                {
                    "id": 9631,
                    "repository": "ppy\/osu",
                    "github_pull_request_id": 10660,
                    "github_url": "https:\/\/github.com\/ppy\/osu\/pull\/10660",
                    "url": null,
                    "type": "fix",
                    "category": "Song Select",
                    "title": "Fix looping mode not being set on first track after entering song select",
                    "message_html": null,
                    "major": false,
                    "created_at": "2020-11-04T05:37:28+00:00",
                    "github_user": {
                        "id": 3,
                        "display_name": "peppy",
                        "github_url": "https:\/\/github.com\/peppy",
                        "osu_username": "peppy",
                        "user_id": 2,
                        "user_url": "https:\/\/osu.ppy.sh\/users\/2"
                    }
                },
                {
                    "id": 9632,
                    "repository": "ppy\/osu",
                    "github_pull_request_id": 10667,
                    "github_url": "https:\/\/github.com\/ppy\/osu\/pull\/10667",
                    "url": null,
                    "type": "fix",
                    "category": "Editor",
                    "title": "Fix editor clock not always remaining stopped when dragging timeline",
                    "message_html": null,
                    "major": false,
                    "created_at": "2020-11-04T06:24:23+00:00",
                    "github_user": {
                        "id": 3,
                        "display_name": "peppy",
                        "github_url": "https:\/\/github.com\/peppy",
                        "osu_username": "peppy",
                        "user_id": 2,
                        "user_url": "https:\/\/osu.ppy.sh\/users\/2"
                    }
                },
                {
                    "id": 9633,
                    "repository": "ppy\/osu",
                    "github_pull_request_id": 10655,
                    "github_url": "https:\/\/github.com\/ppy\/osu\/pull\/10655",
                    "url": null,
                    "type": "fix",
                    "category": "Platform",
                    "title": "Downgrade SignalR package to avoid startup crashes on iOS",
                    "message_html": null,
                    "major": false,
                    "created_at": "2020-11-04T06:47:41+00:00",
                    "github_user": {
                        "id": 3,
                        "display_name": "peppy",
                        "github_url": "https:\/\/github.com\/peppy",
                        "osu_username": "peppy",
                        "user_id": 2,
                        "user_url": "https:\/\/osu.ppy.sh\/users\/2"
                    }
                },
                {
                    "id": 9634,
                    "repository": "ppy\/osu",
                    "github_pull_request_id": 10684,
                    "github_url": "https:\/\/github.com\/ppy\/osu\/pull\/10684",
                    "url": null,
                    "type": "fix",
                    "category": "Platform",
                    "title": "Fix crash on entering the editor on iOS",
                    "message_html": null,
                    "major": false,
                    "created_at": "2020-11-04T08:02:10+00:00",
                    "github_user": {
                        "id": 3,
                        "display_name": "peppy",
                        "github_url": "https:\/\/github.com\/peppy",
                        "osu_username": "peppy",
                        "user_id": 2,
                        "user_url": "https:\/\/osu.ppy.sh\/users\/2"
                    }
                },
                {
                    "id": 9643,
                    "repository": "ppy\/osu",
                    "github_pull_request_id": 10689,
                    "github_url": "https:\/\/github.com\/ppy\/osu\/pull\/10689",
                    "url": null,
                    "type": "fix",
                    "category": "Code Quality",
                    "title": "Use asynchronous load instead of constructor for osu! DrawableHitObjects",
                    "message_html": null,
                    "major": false,
                    "created_at": "2020-11-05T06:09:12+00:00",
                    "github_user": {
                        "id": 5,
                        "display_name": "smoogipoo",
                        "github_url": "https:\/\/github.com\/smoogipoo",
                        "osu_username": "smoogipoo",
                        "user_id": 1040328,
                        "user_url": "https:\/\/osu.ppy.sh\/users\/1040328"
                    }
                },
                {
                    "id": 9644,
                    "repository": "ppy\/osu",
                    "github_pull_request_id": 10691,
                    "github_url": "https:\/\/github.com\/ppy\/osu\/pull\/10691",
                    "url": null,
                    "type": "fix",
                    "category": "Skinning",
                    "title": "Remove AccentColour binding from judgement lighting",
                    "message_html": null,
                    "major": false,
                    "created_at": "2020-11-05T06:37:29+00:00",
                    "github_user": {
                        "id": 5,
                        "display_name": "smoogipoo",
                        "github_url": "https:\/\/github.com\/smoogipoo",
                        "osu_username": "smoogipoo",
                        "user_id": 1040328,
                        "user_url": "https:\/\/osu.ppy.sh\/users\/1040328"
                    }
                },
                {
                    "id": 9645,
                    "repository": "ppy\/osu",
                    "github_pull_request_id": 10690,
                    "github_url": "https:\/\/github.com\/ppy\/osu\/pull\/10690",
                    "url": null,
                    "type": "fix",
                    "category": "Skinning",
                    "title": "Remove stored hitobject references from osu! components",
                    "message_html": null,
                    "major": false,
                    "created_at": "2020-11-05T07:22:14+00:00",
                    "github_user": {
                        "id": 5,
                        "display_name": "smoogipoo",
                        "github_url": "https:\/\/github.com\/smoogipoo",
                        "osu_username": "smoogipoo",
                        "user_id": 1040328,
                        "user_url": "https:\/\/osu.ppy.sh\/users\/1040328"
                    }
                },
                {
                    "id": 9646,
                    "repository": "ppy\/osu",
                    "github_pull_request_id": 10692,
                    "github_url": "https:\/\/github.com\/ppy\/osu\/pull\/10692",
                    "url": null,
                    "type": "fix",
                    "category": "Code Quality",
                    "title": "Make FollowPointRenderer use hitobject models",
                    "message_html": null,
                    "major": false,
                    "created_at": "2020-11-05T07:39:06+00:00",
                    "github_user": {
                        "id": 5,
                        "display_name": "smoogipoo",
                        "github_url": "https:\/\/github.com\/smoogipoo",
                        "osu_username": "smoogipoo",
                        "user_id": 1040328,
                        "user_url": "https:\/\/osu.ppy.sh\/users\/1040328"
                    }
                },
                {
                    "id": 9647,
                    "repository": "ppy\/osu",
                    "github_pull_request_id": 10694,
                    "github_url": "https:\/\/github.com\/ppy\/osu\/pull\/10694",
                    "url": null,
                    "type": "fix",
                    "category": "Gameplay",
                    "title": "Fix paused samples potentially getting stuck in a playing state in rapid toggling",
                    "message_html": null,
                    "major": false,
                    "created_at": "2020-11-05T07:54:26+00:00",
                    "github_user": {
                        "id": 3,
                        "display_name": "peppy",
                        "github_url": "https:\/\/github.com\/peppy",
                        "osu_username": "peppy",
                        "user_id": 2,
                        "user_url": "https:\/\/osu.ppy.sh\/users\/2"
                    }
                },
                {
                    "id": 9648,
                    "repository": "ppy\/osu",
                    "github_pull_request_id": 10696,
                    "github_url": "https:\/\/github.com\/ppy\/osu\/pull\/10696",
                    "url": null,
                    "type": "add",
                    "category": "Code Quality",
                    "title": "Add mod subclass to handle visibility adjusment mods",
                    "message_html": null,
                    "major": false,
                    "created_at": "2020-11-05T09:18:58+00:00",
                    "github_user": {
                        "id": 5,
                        "display_name": "smoogipoo",
                        "github_url": "https:\/\/github.com\/smoogipoo",
                        "osu_username": "smoogipoo",
                        "user_id": 1040328,
                        "user_url": "https:\/\/osu.ppy.sh\/users\/1040328"
                    }
                },
                {
                    "id": 9654,
                    "repository": "ppy\/osu",
                    "github_pull_request_id": 10695,
                    "github_url": "https:\/\/github.com\/ppy\/osu\/pull\/10695",
                    "url": null,
                    "type": "fix",
                    "category": "Testing",
                    "title": "Fix SkinnableTestScene's autosize propagation",
                    "message_html": null,
                    "major": false,
                    "created_at": "2020-11-05T11:48:37+00:00",
                    "github_user": {
                        "id": 3,
                        "display_name": "peppy",
                        "github_url": "https:\/\/github.com\/peppy",
                        "osu_username": "peppy",
                        "user_id": 2,
                        "user_url": "https:\/\/osu.ppy.sh\/users\/2"
                    }
                },
                {
                    "id": 9659,
                    "repository": "ppy\/osu",
                    "github_pull_request_id": 10685,
                    "github_url": "https:\/\/github.com\/ppy\/osu\/pull\/10685",
                    "url": null,
                    "type": "add",
                    "category": "Code Quality",
                    "title": "Add new method handling hit state specifically",
                    "message_html": null,
                    "major": false,
                    "created_at": "2020-11-06T05:33:48+00:00",
                    "github_user": {
                        "id": 3,
                        "display_name": "peppy",
                        "github_url": "https:\/\/github.com\/peppy",
                        "osu_username": "peppy",
                        "user_id": 2,
                        "user_url": "https:\/\/osu.ppy.sh\/users\/2"
                    }
                },
                {
                    "id": 9660,
                    "repository": "ppy\/osu",
                    "github_pull_request_id": 10711,
                    "github_url": "https:\/\/github.com\/ppy\/osu\/pull\/10711",
                    "url": null,
                    "type": "fix",
                    "category": "Code Quality",
                    "title": "Rename cache classes in line with their function (and share a base implementation)",
                    "message_html": null,
                    "major": false,
                    "created_at": "2020-11-06T05:34:47+00:00",
                    "github_user": {
                        "id": 3,
                        "display_name": "peppy",
                        "github_url": "https:\/\/github.com\/peppy",
                        "osu_username": "peppy",
                        "user_id": 2,
                        "user_url": "https:\/\/osu.ppy.sh\/users\/2"
                    }
                },
                {
                    "id": 9661,
                    "repository": "ppy\/osu",
                    "github_pull_request_id": 10710,
                    "github_url": "https:\/\/github.com\/ppy\/osu\/pull\/10710",
                    "url": null,
                    "type": "fix",
                    "category": "Code Quality",
                    "title": "Use int instead of long for user_id fields for now",
                    "message_html": null,
                    "major": false,
                    "created_at": "2020-11-06T05:35:14+00:00",
                    "github_user": {
                        "id": 3,
                        "display_name": "peppy",
                        "github_url": "https:\/\/github.com\/peppy",
                        "osu_username": "peppy",
                        "user_id": 2,
                        "user_url": "https:\/\/osu.ppy.sh\/users\/2"
                    }
                },
                {
                    "id": 9662,
                    "repository": "ppy\/osu",
                    "github_pull_request_id": 10697,
                    "github_url": "https:\/\/github.com\/ppy\/osu\/pull\/10697",
                    "url": null,
                    "type": "add",
                    "category": "Skinning",
                    "title": "Add support for spinner \"glow\" in legacy skins",
                    "message_html": null,
                    "major": true,
                    "created_at": "2020-11-06T06:38:25+00:00",
                    "github_user": {
                        "id": 3,
                        "display_name": "peppy",
                        "github_url": "https:\/\/github.com\/peppy",
                        "osu_username": "peppy",
                        "user_id": 2,
                        "user_url": "https:\/\/osu.ppy.sh\/users\/2"
                    }
                },
                {
                    "id": 9664,
                    "repository": "ppy\/osu",
                    "github_pull_request_id": 10700,
                    "github_url": "https:\/\/github.com\/ppy\/osu\/pull\/10700",
                    "url": null,
                    "type": "add",
                    "category": "Skinning",
                    "title": "Add support for spinner \"spin\" text in legacy skins",
                    "message_html": null,
                    "major": true,
                    "created_at": "2020-11-06T07:13:45+00:00",
                    "github_user": {
                        "id": 3,
                        "display_name": "peppy",
                        "github_url": "https:\/\/github.com\/peppy",
                        "osu_username": "peppy",
                        "user_id": 2,
                        "user_url": "https:\/\/osu.ppy.sh\/users\/2"
                    }
                },
                {
                    "id": 9666,
                    "repository": "ppy\/osu",
                    "github_pull_request_id": 10701,
                    "github_url": "https:\/\/github.com\/ppy\/osu\/pull\/10701",
                    "url": null,
                    "type": "add",
                    "category": "Skinning",
                    "title": "Add support for spinner \"clear\" text in legacy skins",
                    "message_html": null,
                    "major": true,
                    "created_at": "2020-11-06T08:04:54+00:00",
                    "github_user": {
                        "id": 3,
                        "display_name": "peppy",
                        "github_url": "https:\/\/github.com\/peppy",
                        "osu_username": "peppy",
                        "user_id": 2,
                        "user_url": "https:\/\/osu.ppy.sh\/users\/2"
                    }
                },
                {
                    "id": 9668,
                    "repository": "ppy\/osu",
                    "github_pull_request_id": 10676,
                    "github_url": "https:\/\/github.com\/ppy\/osu\/pull\/10676",
                    "url": null,
                    "type": "fix",
                    "category": "Gameplay",
                    "title": "Fix skin changes resulting in incorrectly applied transforms in MainCirclePiece",
                    "message_html": null,
                    "major": false,
                    "created_at": "2020-11-06T12:09:23+00:00",
                    "github_user": {
                        "id": 3,
                        "display_name": "peppy",
                        "github_url": "https:\/\/github.com\/peppy",
                        "osu_username": "peppy",
                        "user_id": 2,
                        "user_url": "https:\/\/osu.ppy.sh\/users\/2"
                    }
                },
                {
                    "id": 9669,
                    "repository": "ppy\/osu",
                    "github_pull_request_id": 10714,
                    "github_url": "https:\/\/github.com\/ppy\/osu\/pull\/10714",
                    "url": null,
                    "type": "fix",
                    "category": "UX",
                    "title": "Never disable pause button on now playing overlay",
                    "message_html": null,
                    "major": false,
                    "created_at": "2020-11-06T12:44:23+00:00",
                    "github_user": {
                        "id": 3,
                        "display_name": "peppy",
                        "github_url": "https:\/\/github.com\/peppy",
                        "osu_username": "peppy",
                        "user_id": 2,
                        "user_url": "https:\/\/osu.ppy.sh\/users\/2"
                    }
                },
                {
                    "id": 9670,
                    "repository": "ppy\/osu",
                    "github_pull_request_id": 10679,
                    "github_url": "https:\/\/github.com\/ppy\/osu\/pull\/10679",
                    "url": null,
                    "type": "add",
                    "category": "Editor",
                    "title": "Add the ability to delete slider control points using shift+right click",
                    "message_html": null,
                    "major": true,
                    "created_at": "2020-11-06T15:05:59+00:00",
                    "github_user": {
                        "id": 3,
                        "display_name": "peppy",
                        "github_url": "https:\/\/github.com\/peppy",
                        "osu_username": "peppy",
                        "user_id": 2,
                        "user_url": "https:\/\/osu.ppy.sh\/users\/2"
                    }
                },
                {
                    "id": 9671,
                    "repository": "ppy\/osu",
                    "github_pull_request_id": 10712,
                    "github_url": "https:\/\/github.com\/ppy\/osu\/pull\/10712",
                    "url": null,
                    "type": "fix",
                    "category": "Code Quality",
                    "title": "Move cache and lookup logic to base MemoryCachingComponent class",
                    "message_html": null,
                    "major": false,
                    "created_at": "2020-11-06T15:06:44+00:00",
                    "github_user": {
                        "id": 3,
                        "display_name": "peppy",
                        "github_url": "https:\/\/github.com\/peppy",
                        "osu_username": "peppy",
                        "user_id": 2,
                        "user_url": "https:\/\/osu.ppy.sh\/users\/2"
                    }
                },
                {
                    "id": 9674,
                    "repository": "ppy\/osu",
                    "github_pull_request_id": 10724,
                    "github_url": "https:\/\/github.com\/ppy\/osu\/pull\/10724",
                    "url": null,
                    "type": "fix",
                    "category": "Editor",
                    "title": "Fix crash when quickdeleting slider that hasn't been selected yet",
                    "message_html": null,
                    "major": false,
                    "created_at": "2020-11-07T10:31:33+00:00",
                    "github_user": {
                        "id": 429,
                        "display_name": "nbvdkamp",
                        "github_url": "https:\/\/github.com\/nbvdkamp",
                        "osu_username": null,
                        "user_id": null,
                        "user_url": null
                    }
                },
                {
                    "id": 9676,
                    "repository": "ppy\/osu-framework",
                    "github_pull_request_id": 3979,
                    "github_url": "https:\/\/github.com\/ppy\/osu-framework\/pull\/3979",
                    "url": null,
                    "type": "fix",
                    "category": "Framework",
                    "title": "Output global statistics to log file when displayed",
                    "message_html": null,
                    "major": false,
                    "created_at": "2020-11-07T15:25:07+00:00",
                    "github_user": {
                        "id": 3,
                        "display_name": "peppy",
                        "github_url": "https:\/\/github.com\/peppy",
                        "osu_username": "peppy",
                        "user_id": 2,
                        "user_url": "https:\/\/osu.ppy.sh\/users\/2"
                    }
                },
                {
                    "id": 9679,
                    "repository": "ppy\/osu",
                    "github_pull_request_id": 10735,
                    "github_url": "https:\/\/github.com\/ppy\/osu\/pull\/10735",
                    "url": null,
                    "type": "fix",
                    "category": "Song Select",
                    "title": "Fix difficulty retrieval for online-sourced beatmaps",
                    "message_html": null,
                    "major": false,
                    "created_at": "2020-11-08T02:19:00+00:00",
                    "github_user": {
                        "id": 218,
                        "display_name": "bdach",
                        "github_url": "https:\/\/github.com\/bdach",
                        "osu_username": null,
                        "user_id": null,
                        "user_url": null
                    }
                },
                {
                    "id": 9680,
                    "repository": "ppy\/osu",
                    "github_pull_request_id": 10732,
                    "github_url": "https:\/\/github.com\/ppy\/osu\/pull\/10732",
                    "url": null,
                    "type": "fix",
                    "category": "Editor",
                    "title": "Fix crash upon exiting the editor without saving from new beatmap",
                    "message_html": null,
                    "major": false,
                    "created_at": "2020-11-08T03:12:25+00:00",
                    "github_user": {
                        "id": 218,
                        "display_name": "bdach",
                        "github_url": "https:\/\/github.com\/bdach",
                        "osu_username": null,
                        "user_id": null,
                        "user_url": null
                    }
                },
                {
                    "id": 9685,
                    "repository": "ppy\/osu-framework",
                    "github_pull_request_id": 3981,
                    "github_url": "https:\/\/github.com\/ppy\/osu-framework\/pull\/3981",
                    "url": null,
                    "type": "add",
                    "category": "Code Quality",
                    "title": "Add OsuTK prefix and drop \"Desktop\" naming where redundant",
                    "message_html": null,
                    "major": false,
                    "created_at": "2020-11-09T05:10:17+00:00",
                    "github_user": {
                        "id": 3,
                        "display_name": "peppy",
                        "github_url": "https:\/\/github.com\/peppy",
                        "osu_username": "peppy",
                        "user_id": 2,
                        "user_url": "https:\/\/osu.ppy.sh\/users\/2"
                    }
                },
                {
                    "id": 9687,
                    "repository": "ppy\/osu-framework",
                    "github_pull_request_id": 3984,
                    "github_url": "https:\/\/github.com\/ppy\/osu-framework\/pull\/3984",
                    "url": null,
                    "type": "fix",
                    "category": "Platform",
                    "title": "Fix SDL drawing window white on first display on windows",
                    "message_html": null,
                    "major": false,
                    "created_at": "2020-11-09T08:29:10+00:00",
                    "github_user": {
                        "id": 3,
                        "display_name": "peppy",
                        "github_url": "https:\/\/github.com\/peppy",
                        "osu_username": "peppy",
                        "user_id": 2,
                        "user_url": "https:\/\/osu.ppy.sh\/users\/2"
                    }
                },
                {
                    "id": 9688,
                    "repository": "ppy\/osu-framework",
                    "github_pull_request_id": 3978,
                    "github_url": "https:\/\/github.com\/ppy\/osu-framework\/pull\/3978",
                    "url": null,
                    "type": "fix",
                    "category": "Framework",
                    "title": "Allow SDL to use existing raw input implementation",
                    "message_html": null,
                    "major": false,
                    "created_at": "2020-11-09T08:48:44+00:00",
                    "github_user": {
                        "id": 3,
                        "display_name": "peppy",
                        "github_url": "https:\/\/github.com\/peppy",
                        "osu_username": "peppy",
                        "user_id": 2,
                        "user_url": "https:\/\/osu.ppy.sh\/users\/2"
                    }
                },
                {
                    "id": 9691,
                    "repository": "ppy\/osu-framework",
                    "github_pull_request_id": 3983,
                    "github_url": "https:\/\/github.com\/ppy\/osu-framework\/pull\/3983",
                    "url": null,
                    "type": "add",
                    "category": "Framework",
                    "title": "Add SDL support to SampleGame",
                    "message_html": null,
                    "major": false,
                    "created_at": "2020-11-09T09:08:57+00:00",
                    "github_user": {
                        "id": 3,
                        "display_name": "peppy",
                        "github_url": "https:\/\/github.com\/peppy",
                        "osu_username": "peppy",
                        "user_id": 2,
                        "user_url": "https:\/\/osu.ppy.sh\/users\/2"
                    }
                },
                {
                    "id": 9692,
                    "repository": "ppy\/osu",
                    "github_pull_request_id": 10730,
                    "github_url": "https:\/\/github.com\/ppy\/osu\/pull\/10730",
                    "url": null,
                    "type": "fix",
                    "category": "Editor",
                    "title": "Fix legacy patcher crash on no objects present",
                    "message_html": null,
                    "major": false,
                    "created_at": "2020-11-09T09:51:00+00:00",
                    "github_user": {
                        "id": 3,
                        "display_name": "peppy",
                        "github_url": "https:\/\/github.com\/peppy",
                        "osu_username": "peppy",
                        "user_id": 2,
                        "user_url": "https:\/\/osu.ppy.sh\/users\/2"
                    }
                },
                {
                    "id": 9693,
                    "repository": "ppy\/osu-framework",
                    "github_pull_request_id": 3977,
                    "github_url": "https:\/\/github.com\/ppy\/osu-framework\/pull\/3977",
                    "url": null,
                    "type": "fix",
                    "category": "Framework",
                    "title": "Expose and define cache storage",
                    "message_html": null,
                    "major": false,
                    "created_at": "2020-11-09T10:19:46+00:00",
                    "github_user": {
                        "id": 3,
                        "display_name": "peppy",
                        "github_url": "https:\/\/github.com\/peppy",
                        "osu_username": "peppy",
                        "user_id": 2,
                        "user_url": "https:\/\/osu.ppy.sh\/users\/2"
                    }
                },
                {
                    "id": 9694,
                    "repository": "ppy\/osu-framework",
                    "github_pull_request_id": 3980,
                    "github_url": "https:\/\/github.com\/ppy\/osu-framework\/pull\/3980",
                    "url": null,
                    "type": "fix",
                    "category": "Performance",
                    "title": "Change audio component invalidation logic to use flag instead of delegate",
                    "message_html": null,
                    "major": false,
                    "created_at": "2020-11-09T10:55:47+00:00",
                    "github_user": {
                        "id": 3,
                        "display_name": "peppy",
                        "github_url": "https:\/\/github.com\/peppy",
                        "osu_username": "peppy",
                        "user_id": 2,
                        "user_url": "https:\/\/osu.ppy.sh\/users\/2"
                    }
                },
                {
                    "id": 9695,
                    "repository": "ppy\/osu",
                    "github_pull_request_id": 10713,
                    "github_url": "https:\/\/github.com\/ppy\/osu\/pull\/10713",
                    "url": null,
                    "type": "add",
                    "category": "Online",
                    "title": "Add user caching \/ lookup component and consume in the currently playing display",
                    "message_html": null,
                    "major": false,
                    "created_at": "2020-11-09T11:20:18+00:00",
                    "github_user": {
                        "id": 3,
                        "display_name": "peppy",
                        "github_url": "https:\/\/github.com\/peppy",
                        "osu_username": "peppy",
                        "user_id": 2,
                        "user_url": "https:\/\/osu.ppy.sh\/users\/2"
                    }
                }
            ]
        },
        {
            "id": 5466,
            "version": "2020.1109.0",
            "display_version": "2020.1109.0",
            "users": 0,
            "created_at": "2020-11-09T03:19:26+00:00",
            "update_stream": {
                "id": 8,
                "name": "web",
                "display_name": "Web",
                "is_featured": false
            },
            "changelog_entries": [
                {
                    "id": 9656,
                    "repository": "ppy\/osu-wiki",
                    "github_pull_request_id": 4405,
                    "github_url": "https:\/\/github.com\/ppy\/osu-wiki\/pull\/4405",
                    "url": null,
                    "type": "fix",
                    "category": "Wiki",
                    "title": "[TH] Revise DYRWTAP, Main Page, Star",
                    "message_html": null,
                    "major": false,
                    "created_at": "2020-11-05T21:11:39+00:00",
                    "github_user": {
                        "id": 397,
                        "display_name": "C0NS03L",
                        "github_url": "https:\/\/github.com\/C0NS03L",
                        "osu_username": null,
                        "user_id": null,
                        "user_url": null
                    }
                },
                {
                    "id": 9657,
                    "repository": "ppy\/osu-wiki",
                    "github_pull_request_id": 3467,
                    "github_url": "https:\/\/github.com\/ppy\/osu-wiki\/pull\/3467",
                    "url": null,
                    "type": "fix",
                    "category": "Wiki",
                    "title": "Update osu!tourney prize requirements",
                    "message_html": null,
                    "major": false,
                    "created_at": "2020-11-06T00:18:52+00:00",
                    "github_user": {
                        "id": 96,
                        "display_name": "Trosk",
                        "github_url": "https:\/\/github.com\/Trosk",
                        "osu_username": null,
                        "user_id": null,
                        "user_url": null
                    }
                },
                {
                    "id": 9658,
                    "repository": "ppy\/osu-web",
                    "github_pull_request_id": 6818,
                    "github_url": "https:\/\/github.com\/ppy\/osu-web\/pull\/6818",
                    "url": null,
                    "type": "add",
                    "category": "Code Quality",
                    "title": "Add lint for operator spacing",
                    "message_html": null,
                    "major": false,
                    "created_at": "2020-11-06T03:14:33+00:00",
                    "github_user": {
                        "id": 1,
                        "display_name": "notbakaneko",
                        "github_url": "https:\/\/github.com\/notbakaneko",
                        "osu_username": "notbakaneko",
                        "user_id": 10751776,
                        "user_url": "https:\/\/osu.ppy.sh\/users\/10751776"
                    }
                },
                {
                    "id": 9663,
                    "repository": "ppy\/osu-web",
                    "github_pull_request_id": 6823,
                    "github_url": "https:\/\/github.com\/ppy\/osu-web\/pull\/6823",
                    "url": null,
                    "type": "fix",
                    "category": "Code Quality",
                    "title": "Restructure multiplayer matches page",
                    "message_html": null,
                    "major": false,
                    "created_at": "2020-11-06T06:59:02+00:00",
                    "github_user": {
                        "id": 2,
                        "display_name": "nanaya",
                        "github_url": "https:\/\/github.com\/nanaya",
                        "osu_username": "nanaya",
                        "user_id": 2387883,
                        "user_url": "https:\/\/osu.ppy.sh\/users\/2387883"
                    }
                },
                {
                    "id": 9665,
                    "repository": "ppy\/osu-web",
                    "github_pull_request_id": 6856,
                    "github_url": "https:\/\/github.com\/ppy\/osu-web\/pull\/6856",
                    "url": null,
                    "type": "fix",
                    "category": "Wiki",
                    "title": "Only show valid languages in wiki language menu",
                    "message_html": null,
                    "major": false,
                    "created_at": "2020-11-06T08:03:01+00:00",
                    "github_user": {
                        "id": 2,
                        "display_name": "nanaya",
                        "github_url": "https:\/\/github.com\/nanaya",
                        "osu_username": "nanaya",
                        "user_id": 2387883,
                        "user_url": "https:\/\/osu.ppy.sh\/users\/2387883"
                    }
                },
                {
                    "id": 9667,
                    "repository": "ppy\/osu-web",
                    "github_pull_request_id": 6815,
                    "github_url": "https:\/\/github.com\/ppy\/osu-web\/pull\/6815",
                    "url": null,
                    "type": "fix",
                    "category": "Api",
                    "title": "OAuth Token Revocation",
                    "message_html": null,
                    "major": false,
                    "created_at": "2020-11-06T09:14:23+00:00",
                    "github_user": {
                        "id": 2,
                        "display_name": "nanaya",
                        "github_url": "https:\/\/github.com\/nanaya",
                        "osu_username": "nanaya",
                        "user_id": 2387883,
                        "user_url": "https:\/\/osu.ppy.sh\/users\/2387883"
                    }
                },
                {
                    "id": 9672,
                    "repository": "ppy\/osu-wiki",
                    "github_pull_request_id": 4411,
                    "github_url": "https:\/\/github.com\/ppy\/osu-wiki\/pull\/4411",
                    "url": null,
                    "type": "fix",
                    "category": "Wiki",
                    "title": "Update BN listing and Staff log",
                    "message_html": null,
                    "major": false,
                    "created_at": "2020-11-06T17:08:00+00:00",
                    "github_user": {
                        "id": 349,
                        "display_name": "hypercyte",
                        "github_url": "https:\/\/github.com\/hypercyte",
                        "osu_username": null,
                        "user_id": null,
                        "user_url": null
                    }
                },
                {
                    "id": 9673,
                    "repository": "ppy\/osu-wiki",
                    "github_pull_request_id": 4414,
                    "github_url": "https:\/\/github.com\/ppy\/osu-wiki\/pull\/4414",
                    "url": null,
                    "type": "fix",
                    "category": "Wiki",
                    "title": "[ZH] Update OWC2020 for Round of 16",
                    "message_html": null,
                    "major": false,
                    "created_at": "2020-11-06T17:11:08+00:00",
                    "github_user": {
                        "id": 291,
                        "display_name": "Kotoki1337",
                        "github_url": "https:\/\/github.com\/Kotoki1337",
                        "osu_username": null,
                        "user_id": null,
                        "user_url": null
                    }
                },
                {
                    "id": 9675,
                    "repository": "ppy\/osu-wiki",
                    "github_pull_request_id": 4417,
                    "github_url": "https:\/\/github.com\/ppy\/osu-wiki\/pull\/4417",
                    "url": null,
                    "type": "fix",
                    "category": "Wiki",
                    "title": "Update reporting from user profile section in Handling Foul Play",
                    "message_html": null,
                    "major": false,
                    "created_at": "2020-11-07T15:24:27+00:00",
                    "github_user": {
                        "id": 430,
                        "display_name": "Trigonoculus",
                        "github_url": "https:\/\/github.com\/Trigonoculus",
                        "osu_username": null,
                        "user_id": null,
                        "user_url": null
                    }
                },
                {
                    "id": 9677,
                    "repository": "ppy\/osu-wiki",
                    "github_pull_request_id": 4419,
                    "github_url": "https:\/\/github.com\/ppy\/osu-wiki\/pull\/4419",
                    "url": null,
                    "type": "add",
                    "category": "Wiki",
                    "title": "Add New Featured Artist: glass beach newspost",
                    "message_html": null,
                    "major": false,
                    "created_at": "2020-11-07T20:52:26+00:00",
                    "github_user": {
                        "id": 13,
                        "display_name": "Ephemeralis",
                        "github_url": "https:\/\/github.com\/Ephemeralis",
                        "osu_username": "Ephemeralis",
                        "user_id": 10948742,
                        "user_url": "https:\/\/osu.ppy.sh\/users\/10948742"
                    }
                },
                {
                    "id": 9678,
                    "repository": "ppy\/osu-wiki",
                    "github_pull_request_id": 4422,
                    "github_url": "https:\/\/github.com\/ppy\/osu-wiki\/pull\/4422",
                    "url": null,
                    "type": "fix",
                    "category": "Wiki",
                    "title": "Update BN listing and Staff log",
                    "message_html": null,
                    "major": false,
                    "created_at": "2020-11-07T21:43:37+00:00",
                    "github_user": {
                        "id": 349,
                        "display_name": "hypercyte",
                        "github_url": "https:\/\/github.com\/hypercyte",
                        "osu_username": null,
                        "user_id": null,
                        "user_url": null
                    }
                },
                {
                    "id": 9681,
                    "repository": "ppy\/osu-wiki",
                    "github_pull_request_id": 4423,
                    "github_url": "https:\/\/github.com\/ppy\/osu-wiki\/pull\/4423",
                    "url": null,
                    "type": "fix",
                    "category": "Wiki",
                    "title": "Update SOL2 for Qualifiers",
                    "message_html": null,
                    "major": false,
                    "created_at": "2020-11-09T03:33:43+00:00",
                    "github_user": {
                        "id": 307,
                        "display_name": "ItsMestro",
                        "github_url": "https:\/\/github.com\/ItsMestro",
                        "osu_username": null,
                        "user_id": null,
                        "user_url": null
                    }
                },
                {
                    "id": 9682,
                    "repository": "ppy\/osu-wiki",
                    "github_pull_request_id": 4412,
                    "github_url": "https:\/\/github.com\/ppy\/osu-wiki\/pull\/4412",
                    "url": null,
                    "type": "fix",
                    "category": "Wiki",
                    "title": "Update SAS for Round 3",
                    "message_html": null,
                    "major": false,
                    "created_at": "2020-11-09T04:09:47+00:00",
                    "github_user": {
                        "id": 31,
                        "display_name": "fajar13k",
                        "github_url": "https:\/\/github.com\/fajar13k",
                        "osu_username": null,
                        "user_id": null,
                        "user_url": null
                    }
                },
                {
                    "id": 9683,
                    "repository": "ppy\/osu-wiki",
                    "github_pull_request_id": 4425,
                    "github_url": "https:\/\/github.com\/ppy\/osu-wiki\/pull\/4425",
                    "url": null,
                    "type": "fix",
                    "category": "Wiki",
                    "title": "Fix languages listing on GitHub",
                    "message_html": null,
                    "major": false,
                    "created_at": "2020-11-09T04:15:07+00:00",
                    "github_user": {
                        "id": 24,
                        "display_name": "cl8n",
                        "github_url": "https:\/\/github.com\/cl8n",
                        "osu_username": null,
                        "user_id": null,
                        "user_url": null
                    }
                },
                {
                    "id": 9684,
                    "repository": "ppy\/osu-web",
                    "github_pull_request_id": 6860,
                    "github_url": "https:\/\/github.com\/ppy\/osu-web\/pull\/6860",
                    "url": null,
                    "type": "fix",
                    "category": "Performance",
                    "title": "Rollback update of laravel and other packages",
                    "message_html": null,
                    "major": false,
                    "created_at": "2020-11-09T04:59:33+00:00",
                    "github_user": {
                        "id": 2,
                        "display_name": "nanaya",
                        "github_url": "https:\/\/github.com\/nanaya",
                        "osu_username": "nanaya",
                        "user_id": 2387883,
                        "user_url": "https:\/\/osu.ppy.sh\/users\/2387883"
                    }
                },
                {
                    "id": 9686,
                    "repository": "ppy\/osu-web",
                    "github_pull_request_id": 6734,
                    "github_url": "https:\/\/github.com\/ppy\/osu-web\/pull\/6734",
                    "url": null,
                    "type": "add",
                    "category": "Settings",
                    "title": "Add total and unread counts to modding watchlist",
                    "message_html": null,
                    "major": false,
                    "created_at": "2020-11-09T05:24:59+00:00",
                    "github_user": {
                        "id": 24,
                        "display_name": "cl8n",
                        "github_url": "https:\/\/github.com\/cl8n",
                        "osu_username": null,
                        "user_id": null,
                        "user_url": null
                    }
                }
            ]
        },
        {
            "id": 5465,
            "version": "2020.1105.0",
            "display_version": "2020.1105.0",
            "users": 0,
            "created_at": "2020-11-05T10:21:30+00:00",
            "update_stream": {
                "id": 8,
                "name": "web",
                "display_name": "Web",
                "is_featured": false
            },
            "changelog_entries": [
                {
                    "id": 9609,
                    "repository": "ppy\/osu-web",
                    "github_pull_request_id": 6819,
                    "github_url": "https:\/\/github.com\/ppy\/osu-web\/pull\/6819",
                    "url": null,
                    "type": "fix",
                    "category": "Design",
                    "title": "Update multiplayer matches \"show more\" link",
                    "message_html": null,
                    "major": false,
                    "created_at": "2020-11-02T04:58:26+00:00",
                    "github_user": {
                        "id": 2,
                        "display_name": "nanaya",
                        "github_url": "https:\/\/github.com\/nanaya",
                        "osu_username": "nanaya",
                        "user_id": 2387883,
                        "user_url": "https:\/\/osu.ppy.sh\/users\/2387883"
                    }
                },
                {
                    "id": 9619,
                    "repository": "ppy\/osu-wiki",
                    "github_pull_request_id": 4401,
                    "github_url": "https:\/\/github.com\/ppy\/osu-wiki\/pull\/4401",
                    "url": null,
                    "type": "add",
                    "category": "Wiki",
                    "title": "Add missing table pipes and fix table padding",
                    "message_html": null,
                    "major": false,
                    "created_at": "2020-11-03T07:37:02+00:00",
                    "github_user": {
                        "id": 37,
                        "display_name": "TPGPL",
                        "github_url": "https:\/\/github.com\/TPGPL",
                        "osu_username": null,
                        "user_id": null,
                        "user_url": null
                    }
                },
                {
                    "id": 9620,
                    "repository": "ppy\/osu-wiki",
                    "github_pull_request_id": 4400,
                    "github_url": "https:\/\/github.com\/ppy\/osu-wiki\/pull\/4400",
                    "url": null,
                    "type": "fix",
                    "category": "Wiki",
                    "title": "Unify the rule style across the wiki",
                    "message_html": null,
                    "major": false,
                    "created_at": "2020-11-03T07:40:53+00:00",
                    "github_user": {
                        "id": 37,
                        "display_name": "TPGPL",
                        "github_url": "https:\/\/github.com\/TPGPL",
                        "osu_username": null,
                        "user_id": null,
                        "user_url": null
                    }
                },
                {
                    "id": 9621,
                    "repository": "ppy\/osu-wiki",
                    "github_pull_request_id": 4402,
                    "github_url": "https:\/\/github.com\/ppy\/osu-wiki\/pull\/4402",
                    "url": null,
                    "type": "fix",
                    "category": "Wiki",
                    "title": "Update BN listing and Staff log",
                    "message_html": null,
                    "major": false,
                    "created_at": "2020-11-03T12:35:18+00:00",
                    "github_user": {
                        "id": 349,
                        "display_name": "hypercyte",
                        "github_url": "https:\/\/github.com\/hypercyte",
                        "osu_username": null,
                        "user_id": null,
                        "user_url": null
                    }
                },
                {
                    "id": 9627,
                    "repository": "ppy\/osu-wiki",
                    "github_pull_request_id": 4403,
                    "github_url": "https:\/\/github.com\/ppy\/osu-wiki\/pull\/4403",
                    "url": null,
                    "type": "fix",
                    "category": "Wiki",
                    "title": "Update hypercyte's NAT responsibilities",
                    "message_html": null,
                    "major": false,
                    "created_at": "2020-11-04T00:00:50+00:00",
                    "github_user": {
                        "id": 349,
                        "display_name": "hypercyte",
                        "github_url": "https:\/\/github.com\/hypercyte",
                        "osu_username": null,
                        "user_id": null,
                        "user_url": null
                    }
                },
                {
                    "id": 9629,
                    "repository": "ppy\/osu-web",
                    "github_pull_request_id": 6801,
                    "github_url": "https:\/\/github.com\/ppy\/osu-web\/pull\/6801",
                    "url": null,
                    "type": "fix",
                    "category": "Browser Issue",
                    "title": "Fix navbar avatar hover border",
                    "message_html": null,
                    "major": false,
                    "created_at": "2020-11-04T04:40:10+00:00",
                    "github_user": {
                        "id": 2,
                        "display_name": "nanaya",
                        "github_url": "https:\/\/github.com\/nanaya",
                        "osu_username": "nanaya",
                        "user_id": 2387883,
                        "user_url": "https:\/\/osu.ppy.sh\/users\/2387883"
                    }
                },
                {
                    "id": 9635,
                    "repository": "ppy\/osu-wiki",
                    "github_pull_request_id": 4407,
                    "github_url": "https:\/\/github.com\/ppy\/osu-wiki\/pull\/4407",
                    "url": null,
                    "type": "add",
                    "category": "Wiki",
                    "title": "Add New Featured Artist: Se-U-Ra newspost",
                    "message_html": null,
                    "major": false,
                    "created_at": "2020-11-04T10:30:56+00:00",
                    "github_user": {
                        "id": 13,
                        "display_name": "Ephemeralis",
                        "github_url": "https:\/\/github.com\/Ephemeralis",
                        "osu_username": "Ephemeralis",
                        "user_id": 10948742,
                        "user_url": "https:\/\/osu.ppy.sh\/users\/10948742"
                    }
                },
                {
                    "id": 9636,
                    "repository": "ppy\/osu-web",
                    "github_pull_request_id": 6843,
                    "github_url": "https:\/\/github.com\/ppy\/osu-web\/pull\/6843",
                    "url": null,
                    "type": "fix",
                    "category": "Localisation",
                    "title": "Adjust language case rules to match expectations",
                    "message_html": null,
                    "major": false,
                    "created_at": "2020-11-04T11:19:26+00:00",
                    "github_user": {
                        "id": 3,
                        "display_name": "peppy",
                        "github_url": "https:\/\/github.com\/peppy",
                        "osu_username": "peppy",
                        "user_id": 2,
                        "user_url": "https:\/\/osu.ppy.sh\/users\/2"
                    }
                },
                {
                    "id": 9637,
                    "repository": "ppy\/osu-wiki",
                    "github_pull_request_id": 4404,
                    "github_url": "https:\/\/github.com\/ppy\/osu-wiki\/pull\/4404",
                    "url": null,
                    "type": "fix",
                    "category": "Wiki",
                    "title": "Update MP7K2 for Qualifiers",
                    "message_html": null,
                    "major": false,
                    "created_at": "2020-11-04T19:39:36+00:00",
                    "github_user": {
                        "id": 245,
                        "display_name": "benzerka",
                        "github_url": "https:\/\/github.com\/benzerka",
                        "osu_username": null,
                        "user_id": null,
                        "user_url": null
                    }
                },
                {
                    "id": 9638,
                    "repository": "ppy\/osu-wiki",
                    "github_pull_request_id": 4349,
                    "github_url": "https:\/\/github.com\/ppy\/osu-wiki\/pull\/4349",
                    "url": null,
                    "type": "fix",
                    "category": "Wiki",
                    "title": "[KO] Add Visual settings, clean up other translations",
                    "message_html": null,
                    "major": false,
                    "created_at": "2020-11-04T22:09:02+00:00",
                    "github_user": {
                        "id": 343,
                        "display_name": "lechenaultia-korea",
                        "github_url": "https:\/\/github.com\/lechenaultia-korea",
                        "osu_username": null,
                        "user_id": null,
                        "user_url": null
                    }
                },
                {
                    "id": 9639,
                    "repository": "ppy\/osu-wiki",
                    "github_pull_request_id": 4408,
                    "github_url": "https:\/\/github.com\/ppy\/osu-wiki\/pull\/4408",
                    "url": null,
                    "type": "fix",
                    "category": "Wiki",
                    "title": "OWC2020 Round of 16 Reschedules",
                    "message_html": null,
                    "major": false,
                    "created_at": "2020-11-05T01:48:03+00:00",
                    "github_user": {
                        "id": 45,
                        "display_name": "WalterToro",
                        "github_url": "https:\/\/github.com\/WalterToro",
                        "osu_username": null,
                        "user_id": null,
                        "user_url": null
                    }
                },
                {
                    "id": 9640,
                    "repository": "ppy\/osu-web",
                    "github_pull_request_id": 6847,
                    "github_url": "https:\/\/github.com\/ppy\/osu-web\/pull\/6847",
                    "url": null,
                    "type": "fix",
                    "category": "Ux",
                    "title": "Prevent username from blocking the clicking of the user-card",
                    "message_html": null,
                    "major": false,
                    "created_at": "2020-11-05T03:18:11+00:00",
                    "github_user": {
                        "id": 6,
                        "display_name": "nekodex",
                        "github_url": "https:\/\/github.com\/nekodex",
                        "osu_username": "nekodex",
                        "user_id": 102,
                        "user_url": "https:\/\/osu.ppy.sh\/users\/102"
                    }
                },
                {
                    "id": 9641,
                    "repository": "ppy\/osu-web",
                    "github_pull_request_id": 6849,
                    "github_url": "https:\/\/github.com\/ppy\/osu-web\/pull\/6849",
                    "url": null,
                    "type": "fix",
                    "category": "Misc",
                    "title": "Fix 'probationary' modifier leaking between user group badges",
                    "message_html": null,
                    "major": false,
                    "created_at": "2020-11-05T03:50:04+00:00",
                    "github_user": {
                        "id": 6,
                        "display_name": "nekodex",
                        "github_url": "https:\/\/github.com\/nekodex",
                        "osu_username": "nekodex",
                        "user_id": 102,
                        "user_url": "https:\/\/osu.ppy.sh\/users\/102"
                    }
                },
                {
                    "id": 9642,
                    "repository": "ppy\/osu-wiki",
                    "github_pull_request_id": 4385,
                    "github_url": "https:\/\/github.com\/ppy\/osu-wiki\/pull\/4385",
                    "url": null,
                    "type": "fix",
                    "category": "Wiki",
                    "title": "[ID] Add Performance Troubleshooting",
                    "message_html": null,
                    "major": false,
                    "created_at": "2020-11-05T05:15:26+00:00",
                    "github_user": {
                        "id": 48,
                        "display_name": "troke12",
                        "github_url": "https:\/\/github.com\/troke12",
                        "osu_username": null,
                        "user_id": null,
                        "user_url": null
                    }
                },
                {
                    "id": 9649,
                    "repository": "ppy\/osu-web",
                    "github_pull_request_id": 6848,
                    "github_url": "https:\/\/github.com\/ppy\/osu-web\/pull\/6848",
                    "url": null,
                    "type": "fix",
                    "category": "Notifications",
                    "title": "Update beatmapset watches on notification",
                    "message_html": null,
                    "major": false,
                    "created_at": "2020-11-05T09:24:48+00:00",
                    "github_user": {
                        "id": 2,
                        "display_name": "nanaya",
                        "github_url": "https:\/\/github.com\/nanaya",
                        "osu_username": "nanaya",
                        "user_id": 2387883,
                        "user_url": "https:\/\/osu.ppy.sh\/users\/2387883"
                    }
                },
                {
                    "id": 9650,
                    "repository": "ppy\/osu-web",
                    "github_pull_request_id": 6762,
                    "github_url": "https:\/\/github.com\/ppy\/osu-web\/pull\/6762",
                    "url": null,
                    "type": "fix",
                    "category": "Notifications",
                    "title": "Allow deleting notifications",
                    "message_html": null,
                    "major": false,
                    "created_at": "2020-11-05T09:56:39+00:00",
                    "github_user": {
                        "id": 2,
                        "display_name": "nanaya",
                        "github_url": "https:\/\/github.com\/nanaya",
                        "osu_username": "nanaya",
                        "user_id": 2387883,
                        "user_url": "https:\/\/osu.ppy.sh\/users\/2387883"
                    }
                },
                {
                    "id": 9651,
                    "repository": "ppy\/osu-web",
                    "github_pull_request_id": 6812,
                    "github_url": "https:\/\/github.com\/ppy\/osu-web\/pull\/6812",
                    "url": null,
                    "type": "fix",
                    "category": "Tooling",
                    "title": "Support composer 2",
                    "message_html": null,
                    "major": false,
                    "created_at": "2020-11-05T10:13:54+00:00",
                    "github_user": {
                        "id": 1,
                        "display_name": "notbakaneko",
                        "github_url": "https:\/\/github.com\/notbakaneko",
                        "osu_username": "notbakaneko",
                        "user_id": 10751776,
                        "user_url": "https:\/\/osu.ppy.sh\/users\/10751776"
                    }
                },
                {
                    "id": 9652,
                    "repository": "ppy\/osu-web",
                    "github_pull_request_id": 6854,
                    "github_url": "https:\/\/github.com\/ppy\/osu-web\/pull\/6854",
                    "url": null,
                    "type": "add",
                    "category": "Api",
                    "title": "Add API endpoint to fetch users by id",
                    "message_html": null,
                    "major": false,
                    "created_at": "2020-11-05T10:46:54+00:00",
                    "github_user": {
                        "id": 2,
                        "display_name": "nanaya",
                        "github_url": "https:\/\/github.com\/nanaya",
                        "osu_username": "nanaya",
                        "user_id": 2387883,
                        "user_url": "https:\/\/osu.ppy.sh\/users\/2387883"
                    }
                },
                {
                    "id": 9653,
                    "repository": "ppy\/osu-web",
                    "github_pull_request_id": 6855,
                    "github_url": "https:\/\/github.com\/ppy\/osu-web\/pull\/6855",
                    "url": null,
                    "type": "fix",
                    "category": "Chat",
                    "title": "Fix empty chat overflow",
                    "message_html": null,
                    "major": false,
                    "created_at": "2020-11-05T10:54:51+00:00",
                    "github_user": {
                        "id": 1,
                        "display_name": "notbakaneko",
                        "github_url": "https:\/\/github.com\/notbakaneko",
                        "osu_username": "notbakaneko",
                        "user_id": 10751776,
                        "user_url": "https:\/\/osu.ppy.sh\/users\/10751776"
                    }
                }
            ]
        },
        {
            "id": 5464,
            "version": "20201105",
            "display_version": "20201105",
            "users": 185,
            "created_at": "2020-11-05T04:08:18+00:00",
            "update_stream": {
                "id": 6,
                "name": "beta40",
                "display_name": "Beta",
                "is_featured": false
            },
            "changelog_entries": [
                {
                    "id": null,
                    "repository": null,
                    "github_pull_request_id": null,
                    "github_url": null,
                    "url": null,
                    "type": "fix",
                    "category": "Reliability",
                    "title": "Fix potential crash when cleaning up dynamic sprites",
                    "message_html": null,
                    "major": false,
                    "created_at": "2020-11-03T05:38:49+00:00",
                    "github_user": {
                        "id": null,
                        "display_name": "peppy",
                        "github_url": null,
                        "osu_username": "peppy",
                        "user_id": 2,
                        "user_url": "https:\/\/osu.ppy.sh\/users\/2"
                    }
                },
                {
                    "id": null,
                    "repository": null,
                    "github_pull_request_id": null,
                    "github_url": null,
                    "url": null,
                    "type": "fix",
                    "category": "Song Select",
                    "title": "Fix personal best not displaying for selected mod leaderboard",
                    "message_html": null,
                    "major": false,
                    "created_at": "2020-11-04T01:03:22+00:00",
                    "github_user": {
                        "id": null,
                        "display_name": "peppy",
                        "github_url": null,
                        "osu_username": "peppy",
                        "user_id": 2,
                        "user_url": "https:\/\/osu.ppy.sh\/users\/2"
                    }
                }
            ]
        },
        {
            "id": 5463,
            "version": "20201104",
            "display_version": "20201104",
            "users": 1,
            "created_at": "2020-11-04T01:13:53+00:00",
            "update_stream": {
                "id": 3,
                "name": "cuttingedge",
                "display_name": "Cutting Edge",
                "is_featured": false
            },
            "changelog_entries": [
                {
                    "id": null,
                    "repository": null,
                    "github_pull_request_id": null,
                    "github_url": null,
                    "url": null,
                    "type": "fix",
                    "category": "Reliability",
                    "title": "Fix potential crash when cleaning up dynamic sprites",
                    "message_html": null,
                    "major": false,
                    "created_at": "2020-11-03T05:38:49+00:00",
                    "github_user": {
                        "id": null,
                        "display_name": "peppy",
                        "github_url": null,
                        "osu_username": "peppy",
                        "user_id": 2,
                        "user_url": "https:\/\/osu.ppy.sh\/users\/2"
                    }
                },
                {
                    "id": null,
                    "repository": null,
                    "github_pull_request_id": null,
                    "github_url": null,
                    "url": null,
                    "type": "fix",
                    "category": "Song Select",
                    "title": "Fix personal best not displaying for selected mod leaderboard",
                    "message_html": null,
                    "major": false,
                    "created_at": "2020-11-04T01:03:22+00:00",
                    "github_user": {
                        "id": null,
                        "display_name": "peppy",
                        "github_url": null,
                        "osu_username": "peppy",
                        "user_id": 2,
                        "user_url": "https:\/\/osu.ppy.sh\/users\/2"
                    }
                }
            ]
        },
        {
            "id": 5462,
            "version": "20201102.5",
            "display_version": "20201102.5",
            "users": 99,
            "created_at": "2020-11-02T12:36:58+00:00",
            "update_stream": {
                "id": 5,
                "name": "stable40",
                "display_name": "Stable",
                "is_featured": true
            },
            "changelog_entries": [
                {
                    "id": null,
                    "repository": null,
                    "github_pull_request_id": null,
                    "github_url": null,
                    "url": null,
                    "type": "fix",
                    "category": "Misc",
                    "title": "Remove all references to lastfm",
                    "message_html": "<div class='changelog-md'><p class=\"changelog-md__paragraph\">She be dead, jim.<\/p>\n<\/div>",
                    "major": false,
                    "created_at": "2020-10-19T16:12:09+00:00",
                    "github_user": {
                        "id": null,
                        "display_name": "peppy",
                        "github_url": null,
                        "osu_username": "peppy",
                        "user_id": 2,
                        "user_url": "https:\/\/osu.ppy.sh\/users\/2"
                    }
                },
                {
                    "id": null,
                    "repository": null,
                    "github_pull_request_id": null,
                    "github_url": null,
                    "url": null,
                    "type": "fix",
                    "category": "Misc",
                    "title": "Fix favourite count on old web not matching",
                    "message_html": null,
                    "major": false,
                    "created_at": "2020-10-27T02:40:09+00:00",
                    "github_user": {
                        "id": null,
                        "display_name": "peppy",
                        "github_url": null,
                        "osu_username": "peppy",
                        "user_id": 2,
                        "user_url": "https:\/\/osu.ppy.sh\/users\/2"
                    }
                },
                {
                    "id": null,
                    "repository": null,
                    "github_pull_request_id": null,
                    "github_url": null,
                    "url": null,
                    "type": "fix",
                    "category": "Misc",
                    "title": "Disable menu snow in tournament mode",
                    "message_html": null,
                    "major": false,
                    "created_at": "2020-10-31T03:53:17+00:00",
                    "github_user": {
                        "id": null,
                        "display_name": "peppy",
                        "github_url": null,
                        "osu_username": "peppy",
                        "user_id": 2,
                        "user_url": "https:\/\/osu.ppy.sh\/users\/2"
                    }
                },
                {
                    "id": null,
                    "repository": null,
                    "github_pull_request_id": null,
                    "github_url": null,
                    "url": null,
                    "type": "fix",
                    "category": "Song Select",
                    "title": "Fix song select \"played\" search filtering being back-to-front",
                    "message_html": "<div class='changelog-md'><p class=\"changelog-md__paragraph\">Typing &quot;played&lt;10&quot; should give beatmaps played in the last 10 days, but it was incorrectly giving &quot;not played in the last 10 days&quot;.<\/p>\n<\/div>",
                    "major": false,
                    "created_at": "2020-11-01T10:01:52+00:00",
                    "github_user": {
                        "id": null,
                        "display_name": "peppy",
                        "github_url": null,
                        "osu_username": "peppy",
                        "user_id": 2,
                        "user_url": "https:\/\/osu.ppy.sh\/users\/2"
                    }
                },
                {
                    "id": null,
                    "repository": null,
                    "github_pull_request_id": null,
                    "github_url": null,
                    "url": null,
                    "type": "fix",
                    "category": "Multiplayer",
                    "title": "Fix Team VS winner display not updating immediately in all cases",
                    "message_html": null,
                    "major": false,
                    "created_at": "2020-11-01T10:31:41+00:00",
                    "github_user": {
                        "id": null,
                        "display_name": "peppy",
                        "github_url": null,
                        "osu_username": "peppy",
                        "user_id": 2,
                        "user_url": "https:\/\/osu.ppy.sh\/users\/2"
                    }
                },
                {
                    "id": null,
                    "repository": null,
                    "github_pull_request_id": null,
                    "github_url": null,
                    "url": null,
                    "type": "fix",
                    "category": "UI",
                    "title": "Fix dropdown entries being selectable during their fade out animation",
                    "message_html": null,
                    "major": false,
                    "created_at": "2020-11-01T11:34:42+00:00",
                    "github_user": {
                        "id": null,
                        "display_name": "peppy",
                        "github_url": null,
                        "osu_username": "peppy",
                        "user_id": 2,
                        "user_url": "https:\/\/osu.ppy.sh\/users\/2"
                    }
                },
                {
                    "id": null,
                    "repository": null,
                    "github_pull_request_id": null,
                    "github_url": null,
                    "url": null,
                    "type": "fix",
                    "category": "Gameplay",
                    "title": "Fix title parsing for beatmaps with brackets in the metadata",
                    "message_html": null,
                    "major": false,
                    "created_at": "2020-11-01T11:53:28+00:00",
                    "github_user": {
                        "id": null,
                        "display_name": "peppy",
                        "github_url": null,
                        "osu_username": "peppy",
                        "user_id": 2,
                        "user_url": "https:\/\/osu.ppy.sh\/users\/2"
                    }
                },
                {
                    "id": null,
                    "repository": null,
                    "github_pull_request_id": null,
                    "github_url": null,
                    "url": null,
                    "type": "fix",
                    "category": "Song Select",
                    "title": "Only update top rank (on beatmap cards) when viewing non-mod ranking",
                    "message_html": "<div class='changelog-md'><p class=\"changelog-md__paragraph\">It was pointed out that viewing a selected mod ranking might update the visible ranks to be not the local user's highest.<\/p>\n<\/div>",
                    "major": false,
                    "created_at": "2020-11-01T12:08:04+00:00",
                    "github_user": {
                        "id": null,
                        "display_name": "peppy",
                        "github_url": null,
                        "osu_username": "peppy",
                        "user_id": 2,
                        "user_url": "https:\/\/osu.ppy.sh\/users\/2"
                    }
                },
                {
                    "id": null,
                    "repository": null,
                    "github_pull_request_id": null,
                    "github_url": null,
                    "url": null,
                    "type": "add",
                    "category": "Misc",
                    "title": "Add m4v extensions to no-video mirror download logic",
                    "message_html": null,
                    "major": false,
                    "created_at": "2020-11-01T14:40:16+00:00",
                    "github_user": {
                        "id": null,
                        "display_name": "peppy",
                        "github_url": null,
                        "osu_username": "peppy",
                        "user_id": 2,
                        "user_url": "https:\/\/osu.ppy.sh\/users\/2"
                    }
                },
                {
                    "id": null,
                    "repository": null,
                    "github_pull_request_id": null,
                    "github_url": null,
                    "url": null,
                    "type": "fix",
                    "category": "Results",
                    "title": "Fix incorrect beatmap accuracy difference being displayed on online statistics for non-osu! modes",
                    "message_html": null,
                    "major": false,
                    "created_at": "2020-11-02T03:32:42+00:00",
                    "github_user": {
                        "id": null,
                        "display_name": "peppy",
                        "github_url": null,
                        "osu_username": "peppy",
                        "user_id": 2,
                        "user_url": "https:\/\/osu.ppy.sh\/users\/2"
                    }
                },
                {
                    "id": null,
                    "repository": null,
                    "github_pull_request_id": null,
                    "github_url": null,
                    "url": null,
                    "type": "fix",
                    "category": "Reliability",
                    "title": "Avoid hard crash when scrolling too fast at results screen",
                    "message_html": null,
                    "major": false,
                    "created_at": "2020-11-02T04:32:52+00:00",
                    "github_user": {
                        "id": null,
                        "display_name": "peppy",
                        "github_url": null,
                        "osu_username": "peppy",
                        "user_id": 2,
                        "user_url": "https:\/\/osu.ppy.sh\/users\/2"
                    }
                },
                {
                    "id": null,
                    "repository": null,
                    "github_pull_request_id": null,
                    "github_url": null,
                    "url": null,
                    "type": "fix",
                    "category": "Gameplay",
                    "title": "Fix autoplay playback being incorrect on linear sliders after retry",
                    "message_html": null,
                    "major": false,
                    "created_at": "2020-11-02T04:47:53+00:00",
                    "github_user": {
                        "id": null,
                        "display_name": "peppy",
                        "github_url": null,
                        "osu_username": "peppy",
                        "user_id": 2,
                        "user_url": "https:\/\/osu.ppy.sh\/users\/2"
                    }
                },
                {
                    "id": null,
                    "repository": null,
                    "github_pull_request_id": null,
                    "github_url": null,
                    "url": null,
                    "type": "fix",
                    "category": "Misc",
                    "title": "Dismantle halloween",
                    "message_html": null,
                    "major": false,
                    "created_at": "2020-11-02T10:06:29+00:00",
                    "github_user": {
                        "id": null,
                        "display_name": "peppy",
                        "github_url": null,
                        "osu_username": "peppy",
                        "user_id": 2,
                        "user_url": "https:\/\/osu.ppy.sh\/users\/2"
                    }
                }
            ]
        },
        {
            "id": 5461,
            "version": "20201102.4",
            "display_version": "20201102.4",
            "users": 1,
            "created_at": "2020-11-02T12:34:44+00:00",
            "update_stream": {
                "id": 6,
                "name": "beta40",
                "display_name": "Beta",
                "is_featured": false
            },
            "changelog_entries": [
                {
                    "id": null,
                    "repository": null,
                    "github_pull_request_id": null,
                    "github_url": null,
                    "url": null,
                    "type": "fix",
                    "category": "Misc",
                    "title": "Actually turn off seasonal mode",
                    "message_html": null,
                    "major": false,
                    "created_at": "2020-11-02T12:28:46+00:00",
                    "github_user": {
                        "id": null,
                        "display_name": "peppy",
                        "github_url": null,
                        "osu_username": "peppy",
                        "user_id": 2,
                        "user_url": "https:\/\/osu.ppy.sh\/users\/2"
                    }
                }
            ]
        },
        {
            "id": 5460,
            "version": "20201102.3",
            "display_version": "20201102.3",
            "users": 1,
            "created_at": "2020-11-02T12:32:20+00:00",
            "update_stream": {
                "id": 3,
                "name": "cuttingedge",
                "display_name": "Cutting Edge",
                "is_featured": false
            },
            "changelog_entries": [
                {
                    "id": null,
                    "repository": null,
                    "github_pull_request_id": null,
                    "github_url": null,
                    "url": null,
                    "type": "fix",
                    "category": "Misc",
                    "title": "Actually turn off seasonal mode",
                    "message_html": null,
                    "major": false,
                    "created_at": "2020-11-02T12:28:46+00:00",
                    "github_user": {
                        "id": null,
                        "display_name": "peppy",
                        "github_url": null,
                        "osu_username": "peppy",
                        "user_id": 2,
                        "user_url": "https:\/\/osu.ppy.sh\/users\/2"
                    }
                }
            ]
        },
        {
            "id": 5459,
            "version": "20201102.2",
            "display_version": "20201102.2",
            "users": 1,
            "created_at": "2020-11-02T12:24:48+00:00",
            "update_stream": {
                "id": 5,
                "name": "stable40",
                "display_name": "Stable",
                "is_featured": true
            },
            "changelog_entries": [
                {
                    "id": null,
                    "repository": null,
                    "github_pull_request_id": null,
                    "github_url": null,
                    "url": null,
                    "type": "fix",
                    "category": "Misc",
                    "title": "Bug fixes and minor improvements",
                    "message_html": null,
                    "major": false,
                    "created_at": "1970-01-01T00:00:00+00:00",
                    "github_user": {
                        "id": null,
                        "display_name": "peppy",
                        "github_url": "https:\/\/github.com\/peppy",
                        "osu_username": null,
                        "user_id": null,
                        "user_url": null
                    }
                }
            ]
        },
        {
            "id": 5458,
            "version": "20201102.1",
            "display_version": "20201102.1",
            "users": 1,
            "created_at": "2020-11-02T11:56:58+00:00",
            "update_stream": {
                "id": 6,
                "name": "beta40",
                "display_name": "Beta",
                "is_featured": false
            },
            "changelog_entries": [
                {
                    "id": null,
                    "repository": null,
                    "github_pull_request_id": null,
                    "github_url": null,
                    "url": null,
                    "type": "fix",
                    "category": "Misc",
                    "title": "Remove all references to lastfm",
                    "message_html": "<div class='changelog-md'><p class=\"changelog-md__paragraph\">She be dead, jim.<\/p>\n<\/div>",
                    "major": false,
                    "created_at": "2020-10-19T16:12:09+00:00",
                    "github_user": {
                        "id": null,
                        "display_name": "peppy",
                        "github_url": null,
                        "osu_username": "peppy",
                        "user_id": 2,
                        "user_url": "https:\/\/osu.ppy.sh\/users\/2"
                    }
                },
                {
                    "id": null,
                    "repository": null,
                    "github_pull_request_id": null,
                    "github_url": null,
                    "url": null,
                    "type": "fix",
                    "category": "Misc",
                    "title": "Fix favourite count on old web not matching",
                    "message_html": null,
                    "major": false,
                    "created_at": "2020-10-27T02:40:09+00:00",
                    "github_user": {
                        "id": null,
                        "display_name": "peppy",
                        "github_url": null,
                        "osu_username": "peppy",
                        "user_id": 2,
                        "user_url": "https:\/\/osu.ppy.sh\/users\/2"
                    }
                },
                {
                    "id": null,
                    "repository": null,
                    "github_pull_request_id": null,
                    "github_url": null,
                    "url": null,
                    "type": "fix",
                    "category": "Misc",
                    "title": "Disable menu snow in tournament mode",
                    "message_html": null,
                    "major": false,
                    "created_at": "2020-10-31T03:53:17+00:00",
                    "github_user": {
                        "id": null,
                        "display_name": "peppy",
                        "github_url": null,
                        "osu_username": "peppy",
                        "user_id": 2,
                        "user_url": "https:\/\/osu.ppy.sh\/users\/2"
                    }
                },
                {
                    "id": null,
                    "repository": null,
                    "github_pull_request_id": null,
                    "github_url": null,
                    "url": null,
                    "type": "fix",
                    "category": "Song Select",
                    "title": "Fix song select \"played\" search filtering being back-to-front",
                    "message_html": "<div class='changelog-md'><p class=\"changelog-md__paragraph\">Typing &quot;played&lt;10&quot; should give beatmaps played in the last 10 days, but it was incorrectly giving &quot;not played in the last 10 days&quot;.<\/p>\n<\/div>",
                    "major": false,
                    "created_at": "2020-11-01T10:01:52+00:00",
                    "github_user": {
                        "id": null,
                        "display_name": "peppy",
                        "github_url": null,
                        "osu_username": "peppy",
                        "user_id": 2,
                        "user_url": "https:\/\/osu.ppy.sh\/users\/2"
                    }
                },
                {
                    "id": null,
                    "repository": null,
                    "github_pull_request_id": null,
                    "github_url": null,
                    "url": null,
                    "type": "fix",
                    "category": "Multiplayer",
                    "title": "Fix Team VS winner display not updating immediately in all cases",
                    "message_html": null,
                    "major": false,
                    "created_at": "2020-11-01T10:31:41+00:00",
                    "github_user": {
                        "id": null,
                        "display_name": "peppy",
                        "github_url": null,
                        "osu_username": "peppy",
                        "user_id": 2,
                        "user_url": "https:\/\/osu.ppy.sh\/users\/2"
                    }
                },
                {
                    "id": null,
                    "repository": null,
                    "github_pull_request_id": null,
                    "github_url": null,
                    "url": null,
                    "type": "fix",
                    "category": "UI",
                    "title": "Fix dropdown entries being selectable during their fade out animation",
                    "message_html": null,
                    "major": false,
                    "created_at": "2020-11-01T11:34:42+00:00",
                    "github_user": {
                        "id": null,
                        "display_name": "peppy",
                        "github_url": null,
                        "osu_username": "peppy",
                        "user_id": 2,
                        "user_url": "https:\/\/osu.ppy.sh\/users\/2"
                    }
                },
                {
                    "id": null,
                    "repository": null,
                    "github_pull_request_id": null,
                    "github_url": null,
                    "url": null,
                    "type": "fix",
                    "category": "Gameplay",
                    "title": "Fix title parsing for beatmaps with brackets in the metadata",
                    "message_html": null,
                    "major": false,
                    "created_at": "2020-11-01T11:53:28+00:00",
                    "github_user": {
                        "id": null,
                        "display_name": "peppy",
                        "github_url": null,
                        "osu_username": "peppy",
                        "user_id": 2,
                        "user_url": "https:\/\/osu.ppy.sh\/users\/2"
                    }
                },
                {
                    "id": null,
                    "repository": null,
                    "github_pull_request_id": null,
                    "github_url": null,
                    "url": null,
                    "type": "fix",
                    "category": "Song Select",
                    "title": "Only update top rank (on beatmap cards) when viewing non-mod ranking",
                    "message_html": "<div class='changelog-md'><p class=\"changelog-md__paragraph\">It was pointed out that viewing a selected mod ranking might update the visible ranks to be not the local user's highest.<\/p>\n<\/div>",
                    "major": false,
                    "created_at": "2020-11-01T12:08:04+00:00",
                    "github_user": {
                        "id": null,
                        "display_name": "peppy",
                        "github_url": null,
                        "osu_username": "peppy",
                        "user_id": 2,
                        "user_url": "https:\/\/osu.ppy.sh\/users\/2"
                    }
                },
                {
                    "id": null,
                    "repository": null,
                    "github_pull_request_id": null,
                    "github_url": null,
                    "url": null,
                    "type": "add",
                    "category": "Misc",
                    "title": "Add m4v extensions to no-video mirror download logic",
                    "message_html": null,
                    "major": false,
                    "created_at": "2020-11-01T14:40:16+00:00",
                    "github_user": {
                        "id": null,
                        "display_name": "peppy",
                        "github_url": null,
                        "osu_username": "peppy",
                        "user_id": 2,
                        "user_url": "https:\/\/osu.ppy.sh\/users\/2"
                    }
                },
                {
                    "id": null,
                    "repository": null,
                    "github_pull_request_id": null,
                    "github_url": null,
                    "url": null,
                    "type": "fix",
                    "category": "Results",
                    "title": "Fix incorrect beatmap accuracy difference being displayed on online statistics for non-osu! modes",
                    "message_html": null,
                    "major": false,
                    "created_at": "2020-11-02T03:32:42+00:00",
                    "github_user": {
                        "id": null,
                        "display_name": "peppy",
                        "github_url": null,
                        "osu_username": "peppy",
                        "user_id": 2,
                        "user_url": "https:\/\/osu.ppy.sh\/users\/2"
                    }
                },
                {
                    "id": null,
                    "repository": null,
                    "github_pull_request_id": null,
                    "github_url": null,
                    "url": null,
                    "type": "fix",
                    "category": "Reliability",
                    "title": "Avoid hard crash when scrolling too fast at results screen",
                    "message_html": null,
                    "major": false,
                    "created_at": "2020-11-02T04:32:52+00:00",
                    "github_user": {
                        "id": null,
                        "display_name": "peppy",
                        "github_url": null,
                        "osu_username": "peppy",
                        "user_id": 2,
                        "user_url": "https:\/\/osu.ppy.sh\/users\/2"
                    }
                },
                {
                    "id": null,
                    "repository": null,
                    "github_pull_request_id": null,
                    "github_url": null,
                    "url": null,
                    "type": "fix",
                    "category": "Gameplay",
                    "title": "Fix autoplay playback being incorrect on linear sliders after retry",
                    "message_html": null,
                    "major": false,
                    "created_at": "2020-11-02T04:47:53+00:00",
                    "github_user": {
                        "id": null,
                        "display_name": "peppy",
                        "github_url": null,
                        "osu_username": "peppy",
                        "user_id": 2,
                        "user_url": "https:\/\/osu.ppy.sh\/users\/2"
                    }
                },
                {
                    "id": null,
                    "repository": null,
                    "github_pull_request_id": null,
                    "github_url": null,
                    "url": null,
                    "type": "fix",
                    "category": "Misc",
                    "title": "Dismantle halloween",
                    "message_html": null,
                    "major": false,
                    "created_at": "2020-11-02T10:06:29+00:00",
                    "github_user": {
                        "id": null,
                        "display_name": "peppy",
                        "github_url": null,
                        "osu_username": "peppy",
                        "user_id": 2,
                        "user_url": "https:\/\/osu.ppy.sh\/users\/2"
                    }
                }
            ]
        }
    ],
    "search": {
        "stream": null,
        "from": null,
        "to": null,
        "max_id": null,
        "limit": 21
    }
}

HTTP Request

GET /changelog

api/v2/changelog/{changelog}

curl -X GET -G "https://osu.ppy.sh/api/v2/changelog/1" 
const url = new URL("https://osu.ppy.sh/api/v2/changelog/1");

let headers = {
    "Accept": "application/json",
    "Content-Type": "application/json",
}

fetch(url, {
    method: "GET",
    headers: headers,
})
.then(response => response.json())
.then(json => console.log(json));

Example response (404):

{
    "error": null
}

HTTP Request

GET /changelog/{changelog}

api/v2/rooms/{mode?}

curl -X GET -G "https://osu.ppy.sh/api/v2/rooms/" 
const url = new URL("https://osu.ppy.sh/api/v2/rooms/");

let headers = {
    "Accept": "application/json",
    "Content-Type": "application/json",
}

fetch(url, {
    method: "GET",
    headers: headers,
})
.then(response => response.json())
.then(json => console.log(json));

Example response (401):

{
    "authentication": "basic"
}

HTTP Request

GET /rooms/{mode?}

api/v2/rooms/{room}/users/{user}

curl -X PUT "https://osu.ppy.sh/api/v2/rooms/1/users/1" 
const url = new URL("https://osu.ppy.sh/api/v2/rooms/1/users/1");

let headers = {
    "Accept": "application/json",
    "Content-Type": "application/json",
}

fetch(url, {
    method: "PUT",
    headers: headers,
})
.then(response => response.json())
.then(json => console.log(json));

HTTP Request

PUT /rooms/{room}/users/{user}

api/v2/rooms/{room}/users/{user}

curl -X DELETE "https://osu.ppy.sh/api/v2/rooms/1/users/1" 
const url = new URL("https://osu.ppy.sh/api/v2/rooms/1/users/1");

let headers = {
    "Accept": "application/json",
    "Content-Type": "application/json",
}

fetch(url, {
    method: "DELETE",
    headers: headers,
})
.then(response => response.json())
.then(json => console.log(json));

HTTP Request

DELETE /rooms/{room}/users/{user}

api/v2/rooms/{room}/leaderboard

curl -X GET -G "https://osu.ppy.sh/api/v2/rooms/1/leaderboard" 
const url = new URL("https://osu.ppy.sh/api/v2/rooms/1/leaderboard");

let headers = {
    "Accept": "application/json",
    "Content-Type": "application/json",
}

fetch(url, {
    method: "GET",
    headers: headers,
})
.then(response => response.json())
.then(json => console.log(json));

Example response (401):

{
    "authentication": "basic"
}

HTTP Request

GET /rooms/{room}/leaderboard

api/v2/rooms/{room}/playlist/{playlist}/scores

curl -X POST "https://osu.ppy.sh/api/v2/rooms/1/playlist/1/scores" 
const url = new URL("https://osu.ppy.sh/api/v2/rooms/1/playlist/1/scores");

let headers = {
    "Accept": "application/json",
    "Content-Type": "application/json",
}

fetch(url, {
    method: "POST",
    headers: headers,
})
.then(response => response.json())
.then(json => console.log(json));

HTTP Request

POST /rooms/{room}/playlist/{playlist}/scores

api/v2/rooms/{room}/playlist/{playlist}/scores/{score}

curl -X PUT "https://osu.ppy.sh/api/v2/rooms/1/playlist/1/scores/1" 
const url = new URL("https://osu.ppy.sh/api/v2/rooms/1/playlist/1/scores/1");

let headers = {
    "Accept": "application/json",
    "Content-Type": "application/json",
}

fetch(url, {
    method: "PUT",
    headers: headers,
})
.then(response => response.json())
.then(json => console.log(json));

HTTP Request

PUT /rooms/{room}/playlist/{playlist}/scores/{score}

PATCH /rooms/{room}/playlist/{playlist}/scores/{score}

api/v2/reports

curl -X POST "https://osu.ppy.sh/api/v2/reports" 
const url = new URL("https://osu.ppy.sh/api/v2/reports");

let headers = {
    "Accept": "application/json",
    "Content-Type": "application/json",
}

fetch(url, {
    method: "POST",
    headers: headers,
})
.then(response => response.json())
.then(json => console.log(json));

HTTP Request

POST /reports

api/v2/rooms

curl -X POST "https://osu.ppy.sh/api/v2/rooms" 
const url = new URL("https://osu.ppy.sh/api/v2/rooms");

let headers = {
    "Accept": "application/json",
    "Content-Type": "application/json",
}

fetch(url, {
    method: "POST",
    headers: headers,
})
.then(response => response.json())
.then(json => console.log(json));

HTTP Request

POST /rooms

api/v2/rooms/{room}

curl -X GET -G "https://osu.ppy.sh/api/v2/rooms/1" 
const url = new URL("https://osu.ppy.sh/api/v2/rooms/1");

let headers = {
    "Accept": "application/json",
    "Content-Type": "application/json",
}

fetch(url, {
    method: "GET",
    headers: headers,
})
.then(response => response.json())
.then(json => console.log(json));

Example response (401):

{
    "authentication": "basic"
}

HTTP Request

GET /rooms/{room}

api/v2/seasonal-backgrounds

curl -X GET -G "https://osu.ppy.sh/api/v2/seasonal-backgrounds" 
const url = new URL("https://osu.ppy.sh/api/v2/seasonal-backgrounds");

let headers = {
    "Accept": "application/json",
    "Content-Type": "application/json",
}

fetch(url, {
    method: "GET",
    headers: headers,
})
.then(response => response.json())
.then(json => console.log(json));

Example response (200):

{
    "ends_at": "2020-11-02T16:00:00+00:00",
    "backgrounds": [
        {
            "url": "https:\/\/assets.ppy.sh\/user-contest-entries\/7416\/01ebdc0ec7b251bc00e4d06edbfa37f8d5ec3a374cf4f2b20fc45a564c7d1bf4_opt.jpg",
            "user": {
                "avatar_url": "https:\/\/a.ppy.sh\/13103233?1605539086.jpeg",
                "country_code": "ID",
                "default_group": "default",
                "id": 13103233,
                "is_active": true,
                "is_bot": false,
                "is_online": false,
                "is_supporter": true,
                "last_visit": "2020-11-25T02:32:00+00:00",
                "pm_friends_only": false,
                "profile_colour": null,
                "username": "Dreamxiety"
            }
        },
        {
            "url": "https:\/\/assets.ppy.sh\/user-contest-entries\/7495\/ae38068688dc41959526f4c9d8420eb254e112cf6f6baf05b1890964e524be07_opt.jpg",
            "user": {
                "avatar_url": "https:\/\/a.ppy.sh\/16877867?1588061983.png",
                "country_code": "MN",
                "default_group": "default",
                "id": 16877867,
                "is_active": true,
                "is_bot": false,
                "is_online": false,
                "is_supporter": true,
                "last_visit": "2020-11-23T14:16:00+00:00",
                "pm_friends_only": true,
                "profile_colour": null,
                "username": "tsuqie"
            }
        },
        {
            "url": "https:\/\/assets.ppy.sh\/user-contest-entries\/7589\/7660461536e472a9e28aec5ce3f500360f125433db2cd33e2287e83a6840d80b_opt.jpg",
            "user": {
                "avatar_url": "https:\/\/a.ppy.sh\/12063010?1602443326.jpeg",
                "country_code": "BR",
                "default_group": "default",
                "id": 12063010,
                "is_active": true,
                "is_bot": false,
                "is_online": false,
                "is_supporter": true,
                "last_visit": "2020-11-25T06:04:43+00:00",
                "pm_friends_only": false,
                "profile_colour": null,
                "username": "CupcakeCrazier"
            }
        },
        {
            "url": "https:\/\/assets.ppy.sh\/user-contest-entries\/7612\/296caa84c85fc737e213e7cb657d5d6019379722cac8dd9d22c9c3de9088fa0a_opt.jpg",
            "user": {
                "avatar_url": "https:\/\/a.ppy.sh\/7266506?1601888983.jpeg",
                "country_code": "BG",
                "default_group": "default",
                "id": 7266506,
                "is_active": true,
                "is_bot": false,
                "is_online": false,
                "is_supporter": true,
                "last_visit": "2020-11-24T16:56:00+00:00",
                "pm_friends_only": false,
                "profile_colour": null,
                "username": "risuuna"
            }
        },
        {
            "url": "https:\/\/assets.ppy.sh\/user-contest-entries\/7639\/4e5656dc28f715cb59a9b037b6349dc99d666bfbefc2b147a9835a56da9c3ae4_opt.jpg",
            "user": {
                "avatar_url": "https:\/\/a.ppy.sh\/4084853?1601269583.jpeg",
                "country_code": "MY",
                "default_group": "default",
                "id": 4084853,
                "is_active": true,
                "is_bot": false,
                "is_online": false,
                "is_supporter": true,
                "last_visit": "2020-11-25T09:13:36+00:00",
                "pm_friends_only": false,
                "profile_colour": null,
                "username": "xxxxxx2800"
            }
        },
        {
            "url": "https:\/\/assets.ppy.sh\/user-contest-entries\/7646\/d5c007abe1d08e4da5465f9cfe3444af32c73c9597c5f28481829a2e7016b318_opt.jpg",
            "user": {
                "avatar_url": "https:\/\/a.ppy.sh\/4840900?1437733825.png",
                "country_code": "NZ",
                "default_group": "default",
                "id": 4840900,
                "is_active": true,
                "is_bot": false,
                "is_online": false,
                "is_supporter": true,
                "last_visit": "2020-11-25T06:14:40+00:00",
                "pm_friends_only": false,
                "profile_colour": null,
                "username": "SJPumpkin"
            }
        },
        {
            "url": "https:\/\/assets.ppy.sh\/user-contest-entries\/7652\/4aee956714520e0dbdbf9a39df167e1afde182427f8f78d3a49d854792e857d5_opt.jpg",
            "user": {
                "avatar_url": "https:\/\/a.ppy.sh\/17165886?1597915619.png",
                "country_code": "PH",
                "default_group": "default",
                "id": 17165886,
                "is_active": true,
                "is_bot": false,
                "is_online": false,
                "is_supporter": true,
                "last_visit": "2020-11-25T06:16:48+00:00",
                "pm_friends_only": false,
                "profile_colour": null,
                "username": "RianneRyan"
            }
        },
        {
            "url": "https:\/\/assets.ppy.sh\/user-contest-entries\/7659\/e2553246a9f264228c7fc9243ec30e93dc5c6d8ef2ebc627afca3d33d6138c22_opt.jpg",
            "user": {
                "avatar_url": "https:\/\/a.ppy.sh\/2667849?1603807035.png",
                "country_code": "RU",
                "default_group": "default",
                "id": 2667849,
                "is_active": true,
                "is_bot": false,
                "is_online": false,
                "is_supporter": true,
                "last_visit": "2020-11-25T10:47:00+00:00",
                "pm_friends_only": false,
                "profile_colour": null,
                "username": "LeeNarie"
            }
        },
        {
            "url": "https:\/\/assets.ppy.sh\/user-contest-entries\/7745\/1cb6563a800005a4395d2839213c574c33e889d0b4b02deb24a62f6229c1b7df_opt.jpg",
            "user": {
                "avatar_url": "https:\/\/a.ppy.sh\/7295733?1538433345.jpeg",
                "country_code": "DE",
                "default_group": "default",
                "id": 7295733,
                "is_active": true,
                "is_bot": false,
                "is_online": false,
                "is_supporter": true,
                "last_visit": null,
                "pm_friends_only": false,
                "profile_colour": null,
                "username": "Sjao"
            }
        },
        {
            "url": "https:\/\/assets.ppy.sh\/user-contest-entries\/7782\/966a64095e9940feb55874e47309c468f380a315e2a533b031dbf0fcdcb72777_opt.jpg",
            "user": {
                "avatar_url": "https:\/\/a.ppy.sh\/7339730?1565668603.jpeg",
                "country_code": "US",
                "default_group": "default",
                "id": 7339730,
                "is_active": true,
                "is_bot": false,
                "is_online": false,
                "is_supporter": true,
                "last_visit": "2020-11-24T15:38:00+00:00",
                "pm_friends_only": false,
                "profile_colour": null,
                "username": "trashvevo"
            }
        },
        {
            "url": "https:\/\/assets.ppy.sh\/user-contest-entries\/7809\/777830f0e8654c10845bf7a7132f73beaabbe9663d227df4814603dc03e8863b_opt.jpg",
            "user": {
                "avatar_url": "https:\/\/a.ppy.sh\/9044692?1581321965.png",
                "country_code": "JP",
                "default_group": "default",
                "id": 9044692,
                "is_active": true,
                "is_bot": false,
                "is_online": false,
                "is_supporter": true,
                "last_visit": "2020-11-25T08:46:00+00:00",
                "pm_friends_only": false,
                "profile_colour": null,
                "username": "HEKUSODASU"
            }
        },
        {
            "url": "https:\/\/assets.ppy.sh\/user-contest-entries\/7810\/7d3626399ece91b45bf39e0d3da0d557eb7af7c74a1401efc3c5aa9ee9c727d3_opt.jpg",
            "user": {
                "avatar_url": "https:\/\/a.ppy.sh\/6841570?1583042106.png",
                "country_code": "US",
                "default_group": "default",
                "id": 6841570,
                "is_active": true,
                "is_bot": false,
                "is_online": false,
                "is_supporter": true,
                "last_visit": "2020-11-13T08:57:36+00:00",
                "pm_friends_only": false,
                "profile_colour": null,
                "username": "D0tz_"
            }
        },
        {
            "url": "https:\/\/assets.ppy.sh\/user-contest-entries\/7850\/5ea19e778f2e5ce46a3373389dbcc2ce5817361d7d603dbca3a87e2181902344_opt.jpg",
            "user": {
                "avatar_url": "https:\/\/a.ppy.sh\/11596939?1602349850.png",
                "country_code": "TR",
                "default_group": "default",
                "id": 11596939,
                "is_active": true,
                "is_bot": false,
                "is_online": false,
                "is_supporter": true,
                "last_visit": "2020-11-24T17:37:34+00:00",
                "pm_friends_only": false,
                "profile_colour": null,
                "username": "Azocat"
            }
        },
        {
            "url": "https:\/\/assets.ppy.sh\/user-contest-entries\/7859\/f40014d357ed52b3fa888a2fe035a9922242df3cd978936f455569c62f52445f_opt.jpg",
            "user": {
                "avatar_url": "https:\/\/a.ppy.sh\/14471273?1601262377.jpeg",
                "country_code": "AU",
                "default_group": "default",
                "id": 14471273,
                "is_active": false,
                "is_bot": false,
                "is_online": false,
                "is_supporter": true,
                "last_visit": "2020-10-17T14:01:00+00:00",
                "pm_friends_only": false,
                "profile_colour": null,
                "username": "Huckle"
            }
        },
        {
            "url": "https:\/\/assets.ppy.sh\/user-contest-entries\/7866\/45d6e0871b5a0783c6ee7ea20a3a5e37ae81b0097dadd2ff49832a3c3cc63184_opt.jpg",
            "user": {
                "avatar_url": "https:\/\/a.ppy.sh\/12694139?1600379997.jpeg",
                "country_code": "CA",
                "default_group": "default",
                "id": 12694139,
                "is_active": true,
                "is_bot": false,
                "is_online": false,
                "is_supporter": true,
                "last_visit": "2020-11-25T05:31:00+00:00",
                "pm_friends_only": false,
                "profile_colour": null,
                "username": "McFriedFries"
            }
        }
    ]
}

HTTP Request

GET /seasonal-backgrounds

api/v2/scores/{mode}/{score}/download

curl -X GET -G "https://osu.ppy.sh/api/v2/scores/1/1/download" 
const url = new URL("https://osu.ppy.sh/api/v2/scores/1/1/download");

let headers = {
    "Accept": "application/json",
    "Content-Type": "application/json",
}

fetch(url, {
    method: "GET",
    headers: headers,
})
.then(response => response.json())
.then(json => console.log(json));

Example response (401):

{
    "authentication": "basic"
}

HTTP Request

GET /scores/{mode}/{score}/download

api/v2/scores/{mode}/{score}

curl -X GET -G "https://osu.ppy.sh/api/v2/scores/1/1" 
const url = new URL("https://osu.ppy.sh/api/v2/scores/1/1");

let headers = {
    "Accept": "application/json",
    "Content-Type": "application/json",
}

fetch(url, {
    method: "GET",
    headers: headers,
})
.then(response => response.json())
.then(json => console.log(json));

Example response (401):

{
    "authentication": "basic"
}

HTTP Request

GET /scores/{mode}/{score}

api/v2/beatmaps/{id}/scores

curl -X GET -G "https://osu.ppy.sh/api/v2/beatmaps/1/scores" 
const url = new URL("https://osu.ppy.sh/api/v2/beatmaps/1/scores");

let headers = {
    "Accept": "application/json",
    "Content-Type": "application/json",
}

fetch(url, {
    method: "GET",
    headers: headers,
})
.then(response => response.json())
.then(json => console.log(json));

Example response (401):

{
    "authentication": "basic"
}

HTTP Request

GET /beatmaps/{id}/scores

api/v2/beatmaps/lookup

curl -X GET -G "https://osu.ppy.sh/api/v2/beatmaps/lookup" 
const url = new URL("https://osu.ppy.sh/api/v2/beatmaps/lookup");

let headers = {
    "Accept": "application/json",
    "Content-Type": "application/json",
}

fetch(url, {
    method: "GET",
    headers: headers,
})
.then(response => response.json())
.then(json => console.log(json));

Example response (401):

{
    "authentication": "basic"
}

HTTP Request

GET /beatmaps/lookup

api/v2/beatmaps/{beatmap}

curl -X GET -G "https://osu.ppy.sh/api/v2/beatmaps/1" 
const url = new URL("https://osu.ppy.sh/api/v2/beatmaps/1");

let headers = {
    "Accept": "application/json",
    "Content-Type": "application/json",
}

fetch(url, {
    method: "GET",
    headers: headers,
})
.then(response => response.json())
.then(json => console.log(json));

Example response (401):

{
    "authentication": "basic"
}

HTTP Request

GET /beatmaps/{beatmap}

api/v2/beatmapsets/search/{filters?}

curl -X GET -G "https://osu.ppy.sh/api/v2/beatmapsets/search/" 
const url = new URL("https://osu.ppy.sh/api/v2/beatmapsets/search/");

let headers = {
    "Accept": "application/json",
    "Content-Type": "application/json",
}

fetch(url, {
    method: "GET",
    headers: headers,
})
.then(response => response.json())
.then(json => console.log(json));

Example response (401):

{
    "authentication": "basic"
}

HTTP Request

GET /beatmapsets/search/{filters?}

api/v2/beatmapsets/lookup

curl -X GET -G "https://osu.ppy.sh/api/v2/beatmapsets/lookup" 
const url = new URL("https://osu.ppy.sh/api/v2/beatmapsets/lookup");

let headers = {
    "Accept": "application/json",
    "Content-Type": "application/json",
}

fetch(url, {
    method: "GET",
    headers: headers,
})
.then(response => response.json())
.then(json => console.log(json));

Example response (401):

{
    "authentication": "basic"
}

HTTP Request

GET /beatmapsets/lookup

api/v2/beatmapsets/{beatmapset}/download

curl -X GET -G "https://osu.ppy.sh/api/v2/beatmapsets/1/download" 
const url = new URL("https://osu.ppy.sh/api/v2/beatmapsets/1/download");

let headers = {
    "Accept": "application/json",
    "Content-Type": "application/json",
}

fetch(url, {
    method: "GET",
    headers: headers,
})
.then(response => response.json())
.then(json => console.log(json));

Example response (401):

{
    "authentication": "basic"
}

HTTP Request

GET /beatmapsets/{beatmapset}/download

api/v2/beatmapsets/{beatmapset}

curl -X GET -G "https://osu.ppy.sh/api/v2/beatmapsets/1" 
const url = new URL("https://osu.ppy.sh/api/v2/beatmapsets/1");

let headers = {
    "Accept": "application/json",
    "Content-Type": "application/json",
}

fetch(url, {
    method: "GET",
    headers: headers,
})
.then(response => response.json())
.then(json => console.log(json));

Example response (401):

{
    "authentication": "basic"
}

HTTP Request

GET /beatmapsets/{beatmapset}

api/v2/friends

curl -X GET -G "https://osu.ppy.sh/api/v2/friends" 
const url = new URL("https://osu.ppy.sh/api/v2/friends");

let headers = {
    "Accept": "application/json",
    "Content-Type": "application/json",
}

fetch(url, {
    method: "GET",
    headers: headers,
})
.then(response => response.json())
.then(json => console.log(json));

Example response (401):

{
    "authentication": "basic"
}

HTTP Request

GET /friends

api/v2/me/download-quota-check

curl -X GET -G "https://osu.ppy.sh/api/v2/me/download-quota-check" 
const url = new URL("https://osu.ppy.sh/api/v2/me/download-quota-check");

let headers = {
    "Accept": "application/json",
    "Content-Type": "application/json",
}

fetch(url, {
    method: "GET",
    headers: headers,
})
.then(response => response.json())
.then(json => console.log(json));

Example response (401):

{
    "authentication": "basic"
}

HTTP Request

GET /me/download-quota-check

api/v2/news

curl -X GET -G "https://osu.ppy.sh/api/v2/news" 
const url = new URL("https://osu.ppy.sh/api/v2/news");

let headers = {
    "Accept": "application/json",
    "Content-Type": "application/json",
}

fetch(url, {
    method: "GET",
    headers: headers,
})
.then(response => response.json())
.then(json => console.log(json));

Example response (200):

{
    "news_posts": [
        {
            "id": 868,
            "author": "pishifat",
            "edit_url": "https:\/\/github.com\/ppy\/osu-wiki\/tree\/master\/news\/2020-11-25-new-featured-artist-orangentle-yu-asahina.md",
            "first_image": "https:\/\/assets.ppy.sh\/artists\/118\/header.jpg?1",
            "published_at": "2020-11-25T09:30:00+00:00",
            "updated_at": "2020-11-25T10:11:59+00:00",
            "slug": "2020-11-25-new-featured-artist-orangentle-yu-asahina",
            "title": "New Featured Artist: orangentle \/ Yu_Asahina",
            "preview": "orangentle \/ Yu_Asahina squeezes in as our newest Featured Artist!"
        },
        {
            "id": 867,
            "author": "Ephemeral",
            "edit_url": "https:\/\/github.com\/ppy\/osu-wiki\/tree\/master\/news\/2020-11-24-winter-sports-fanart-voting.md",
            "first_image": "https:\/\/assets.ppy.sh\/contests\/114\/header.jpg",
            "published_at": "2020-11-24T10:00:00+00:00",
            "updated_at": "2020-11-24T10:16:27+00:00",
            "slug": "2020-11-24-winter-sports-fanart-voting",
            "title": "Winter Sports 2020 Fanart Contest Voting Open!",
            "preview": "A flurry of 137 talented entries are front and center in our latest Fan Art contest, and we need your votes to help decide the winners!"
        },
        {
            "id": 866,
            "author": "pishifat",
            "edit_url": "https:\/\/github.com\/ppy\/osu-wiki\/tree\/master\/news\/2020-11-21-new-featured-artist-i-love-you-orchestra.md",
            "first_image": "https:\/\/assets.ppy.sh\/artists\/117\/header.jpg",
            "published_at": "2020-11-21T10:00:00+00:00",
            "updated_at": "2020-11-21T10:10:44+00:00",
            "slug": "2020-11-21-new-featured-artist-i-love-you-orchestra",
            "title": "New Featured Artist: I love you Orchestra",
            "preview": "Give a heavy welcome to I love you Orchestra, our latest Featured Artist!"
        },
        {
            "id": 865,
            "author": "pishifat and Noffy",
            "edit_url": "https:\/\/github.com\/ppy\/osu-wiki\/tree\/master\/news\/2020-11-20-featured-artist-beatmap-updates-from-the-mappers-guild.md",
            "first_image": "\/help\/wiki\/shared\/news\/banners\/mappersguild.png",
            "published_at": "2020-11-20T06:00:00+00:00",
            "updated_at": "2020-11-20T06:01:15+00:00",
            "slug": "2020-11-20-featured-artist-beatmap-updates-from-the-mappers-guild",
            "title": "Featured Artist Beatmap Updates from the Mappers' Guild",
            "preview": "New beatmap packs! New medals! And new quests! Learn how mapping and Featured Artists collide through the Mappers' Guild."
        },
        {
            "id": 864,
            "author": "peppy",
            "edit_url": "https:\/\/github.com\/ppy\/osu-wiki\/tree\/master\/news\/2020-11-19-better-protecting-players-from-abuse.md",
            "first_image": "https:\/\/osu.ppy.sh\/assets\/images\/news-show-default.78f23cb7.jpg",
            "published_at": "2020-11-19T09:00:00+00:00",
            "updated_at": "2020-11-19T10:17:26+00:00",
            "slug": "2020-11-19-better-protecting-players-from-abuse",
            "title": "Better protecting players from abuse",
            "preview": "Hi everyone, peppy here. We are making some minor changes to the terms of service, so let me explain our motivation and reasoning behind them."
        },
        {
            "id": 863,
            "author": "pishifat",
            "edit_url": "https:\/\/github.com\/ppy\/osu-wiki\/tree\/master\/news\/2020-11-18-new-featured-artist-lime-kankitsu.md",
            "first_image": "https:\/\/assets.ppy.sh\/artists\/116\/header.jpg",
            "published_at": "2020-11-18T09:00:00+00:00",
            "updated_at": "2020-11-18T09:35:00+00:00",
            "slug": "2020-11-18-new-featured-artist-lime-kankitsu",
            "title": "New Featured Artist: Lime \/ Kankitsu",
            "preview": "Lime \/ Kankitsu hops on board as our latest Featured Artist!"
        },
        {
            "id": 862,
            "author": "Ephemeral",
            "edit_url": "https:\/\/github.com\/ppy\/osu-wiki\/tree\/master\/news\/2020-11-14-new-featured-artist-blood-code.md",
            "first_image": "https:\/\/assets.ppy.sh\/artists\/115\/header.jpg",
            "published_at": "2020-11-14T09:00:00+00:00",
            "updated_at": "2020-11-17T04:00:13+00:00",
            "slug": "2020-11-14-new-featured-artist-blood-code",
            "title": "New Featured Artist: BLOOD CODE",
            "preview": "The slammin', sometimes saccharine tunes of BLOOD CODE are the latest addition to our Featured Artist line-up!"
        },
        {
            "id": 861,
            "author": "Ephemeral",
            "edit_url": "https:\/\/github.com\/ppy\/osu-wiki\/tree\/master\/news\/2020-11-11-new-featured-artist-fuki.md",
            "first_image": "https:\/\/assets.ppy.sh\/artists\/114\/header.jpg",
            "published_at": "2020-11-11T09:00:00+00:00",
            "updated_at": "2020-11-11T09:37:12+00:00",
            "slug": "2020-11-11-new-featured-artist-fuki",
            "title": "New Featured Artist: Fuki",
            "preview": "We're proud to welcome Fuki aboard as our latest Featured Artist!"
        },
        {
            "id": 860,
            "author": "Ephemeral",
            "edit_url": "https:\/\/github.com\/ppy\/osu-wiki\/tree\/master\/news\/2020-09-11-winter-sports-2020-fanart-contest.md",
            "first_image": "https:\/\/assets.ppy.sh\/contests\/114\/header.jpg",
            "published_at": "2020-11-09T09:00:00+00:00",
            "updated_at": "2020-11-09T11:30:17+00:00",
            "slug": "2020-09-11-winter-sports-2020-fanart-contest",
            "title": "Winter Sports 2020 Fanart Contest",
            "preview": "Do you like to draw? Do you like winter sports? If the answer to both of those questions is a firm YES, then you're a prime contestant for our last fanart contest of the year!"
        },
        {
            "id": 859,
            "author": "Ephemeral",
            "edit_url": "https:\/\/github.com\/ppy\/osu-wiki\/tree\/master\/news\/2020-11-07-new-featured-artist-glass-beach.md",
            "first_image": "https:\/\/assets.ppy.sh\/artists\/113\/header.jpg",
            "published_at": "2020-11-07T21:00:00+00:00",
            "updated_at": "2020-11-07T20:54:12+00:00",
            "slug": "2020-11-07-new-featured-artist-glass-beach",
            "title": "New Featured Artist: glass beach",
            "preview": "We're off to new musical shores with our latest addition to the Featured Artist lineup, glass beach!"
        },
        {
            "id": 858,
            "author": "Ephemeral",
            "edit_url": "https:\/\/github.com\/ppy\/osu-wiki\/tree\/master\/news\/2020-11-03-new-featured-artist-se-u-ra.md",
            "first_image": "https:\/\/assets.ppy.sh\/artists\/112\/header.jpg",
            "published_at": "2020-11-04T09:00:00+00:00",
            "updated_at": "2020-11-07T14:33:11+00:00",
            "slug": "2020-11-03-new-featured-artist-se-u-ra",
            "title": "New Featured Artist: Se-U-Ra",
            "preview": "We're excited to welcome Se-U-Ra aboard as our latest addition to the Featured Artist line-up!"
        },
        {
            "id": 857,
            "author": "Ephemeral",
            "edit_url": "https:\/\/github.com\/ppy\/osu-wiki\/tree\/master\/news\/2020-10-31-new-featured-artist-dual-alter-world.md",
            "first_image": "https:\/\/assets.ppy.sh\/artists\/111\/header.jpg",
            "published_at": "2020-10-31T09:00:00+00:00",
            "updated_at": "2020-10-31T09:42:20+00:00",
            "slug": "2020-10-31-new-featured-artist-dual-alter-world",
            "title": "New Featured Artist: Dual Alter World",
            "preview": "We're proud to welcome Dual Alter World aboard as our latest Featured Artist!"
        }
    ],
    "search": {
        "cursor": null,
        "limit": 12
    },
    "cursor": {
        "published_at": "2020-10-31T09:00:00.000000Z",
        "id": 857
    }
}

HTTP Request

GET /news

api/v2/news/{news}

curl -X GET -G "https://osu.ppy.sh/api/v2/news/1" 
const url = new URL("https://osu.ppy.sh/api/v2/news/1");

let headers = {
    "Accept": "application/json",
    "Content-Type": "application/json",
}

fetch(url, {
    method: "GET",
    headers: headers,
})
.then(response => response.json())
.then(json => console.log(json));

Example response (404):

{
    "error": ""
}

HTTP Request

GET /news/{news}

Users

Get Own Data

curl -X GET -G "https://osu.ppy.sh/api/v2/me/osu" \
    -H "Authorization: Bearer {{token}}"
const url = new URL("https://osu.ppy.sh/api/v2/me/osu");

let headers = {
    "Authorization": "Bearer {{token}}"
    "Accept": "application/json",
    "Content-Type": "application/json",
}

fetch(url, {
    method: "GET",
    headers: headers,
})
.then(response => response.json())
.then(json => console.log(json));

Example response (200):

"See User object section"

Requires authentication

Similar to Get User but with authenticated user (token owner) as user id.

HTTP Request

GET /me/{mode?}

URL Parameters

Parameter Status Description
mode optional GameMode. User default mode will be used if not specified.

Response format

See Get User.

Get User Kudosu

curl -X GET -G "https://osu.ppy.sh/api/v2/users/1/kudosu?limit=12&offset=1" 
const url = new URL("https://osu.ppy.sh/api/v2/users/1/kudosu");

let params = {
    "limit": "12",
    "offset": "1",
};
Object.keys(params).forEach(key => url.searchParams.append(key, params[key]));

let headers = {
    "Accept": "application/json",
    "Content-Type": "application/json",
}

fetch(url, {
    method: "GET",
    headers: headers,
})
.then(response => response.json())
.then(json => console.log(json));

Example response (200):

[
    {
        "id": 1,
        "other": "attributes..."
    },
    {
        "id": 2,
        "other": "attributes..."
    }
]

Returns kudosu history.

HTTP Request

GET /users/{user}/kudosu

URL Parameters

Parameter Status Description
user required Id of the user.

Query Parameters

Parameter Status Description
limit optional Maximum number of results.
offset optional Result offset for pagination.

Response format

Array of KudosuHistory.

Get User Scores

curl -X GET -G "https://osu.ppy.sh/api/v2/users/1/scores/best?include_fails=0&mode=osu&limit=12&offset=1" 
const url = new URL("https://osu.ppy.sh/api/v2/users/1/scores/best");

let params = {
    "include_fails": "0",
    "mode": "osu",
    "limit": "12",
    "offset": "1",
};
Object.keys(params).forEach(key => url.searchParams.append(key, params[key]));

let headers = {
    "Accept": "application/json",
    "Content-Type": "application/json",
}

fetch(url, {
    method: "GET",
    headers: headers,
})
.then(response => response.json())
.then(json => console.log(json));

Example response (200):

[
    {
        "id": 1,
        "other": "attributes..."
    },
    {
        "id": 2,
        "other": "attributes..."
    }
]

This endpoint returns the scores of specified user.

HTTP Request

GET /users/{user}/scores/{type}

URL Parameters

Parameter Status Description
user required Id of the user.
type required Score type. Must be one of these: best, firsts, recent.

Query Parameters

Parameter Status Description
include_fails optional Only for recent scores, include scores of failed plays. Set to 1 to include them. Defaults to 0.
mode optional GameMode of the scores to be returned. Defaults to the specified user's mode.
limit optional Maximum number of results.
offset optional Result offset for pagination.

Response format

Array of Score. Following attributes are included in the response object when applicable.

Attribute Notes
beatmap
beatmapset
weight Only for type best.
user

Get User Beatmaps

curl -X GET -G "https://osu.ppy.sh/api/v2/users/1/beatmapsets/favourite?limit=12&offset=1" 
const url = new URL("https://osu.ppy.sh/api/v2/users/1/beatmapsets/favourite");

let params = {
    "limit": "12",
    "offset": "1",
};
Object.keys(params).forEach(key => url.searchParams.append(key, params[key]));

let headers = {
    "Accept": "application/json",
    "Content-Type": "application/json",
}

fetch(url, {
    method: "GET",
    headers: headers,
})
.then(response => response.json())
.then(json => console.log(json));

Example response (200):

[
    {
        "id": 1,
        "other": "attributes..."
    },
    {
        "id": 2,
        "other": "attributes..."
    }
]

Returns the beatmaps of specified user.

Type
favourite
graveyard
loved
most_played
ranked_and_approved
unranked

HTTP Request

GET /users/{user}/beatmapsets/{type}

URL Parameters

Parameter Status Description
user required Id of the user.
type required Beatmap type.

Query Parameters

Parameter Status Description
limit optional Maximum number of results.
offset optional Result offset for pagination.

Response format

Array of Beatmapset.

Get User Recent Activity

curl -X GET -G "https://osu.ppy.sh/api/v2/users/1/recent_activity?limit=12&offset=1" 
const url = new URL("https://osu.ppy.sh/api/v2/users/1/recent_activity");

let params = {
    "limit": "12",
    "offset": "1",
};
Object.keys(params).forEach(key => url.searchParams.append(key, params[key]));

let headers = {
    "Accept": "application/json",
    "Content-Type": "application/json",
}

fetch(url, {
    method: "GET",
    headers: headers,
})
.then(response => response.json())
.then(json => console.log(json));

Example response (200):

[
    {
        "id": 1,
        "other": "attributes..."
    },
    {
        "id": 2,
        "other": "attributes..."
    }
]

Returns recent activity.

HTTP Request

GET /users/{user}/recent_activity

URL Parameters

Parameter Status Description
user required Id of the user.

Query Parameters

Parameter Status Description
limit optional Maximum number of results.
offset optional Result offset for pagination.

Response format

Array of Event.

Get User

curl -X GET -G "https://osu.ppy.sh/api/v2/users/1/osu" 
const url = new URL("https://osu.ppy.sh/api/v2/users/1/osu");

let headers = {
    "Accept": "application/json",
    "Content-Type": "application/json",
}

fetch(url, {
    method: "GET",
    headers: headers,
})
.then(response => response.json())
.then(json => console.log(json));

Example response (200):

"See User object section"

This endpoint returns the detail of specified user.

HTTP Request

GET /users/{user}/{mode?}

URL Parameters

Parameter Status Description
user required Id of the user.
mode optional GameMode. User default mode will be used if not specified.

Response format

Returns User object. Following attributes are included in the response object when applicable.

Attribute Notes
account_history
active_tournament_banner
badges
beatmap_playcounts_count
favourite_beatmapset_count
follower_count
graveyard_beatmapset_count
groups
loved_beatmapset_count
monthly_playcounts
page
previous_usernames
rank_history For specified mode.
ranked_and_approved_beatmapset_count
replays_watched_counts
scores_best_count For specified mode.
scores_first_count For specified mode.
scores_recent_count For specified mode.
statistics For specified mode. Inluces rank and variants attributes.
support_level
unranked_beatmapset_count
user_achievements

Get Users

curl -X GET -G "https://osu.ppy.sh/api/v2/users?ids%5B%5D=1" 
const url = new URL("https://osu.ppy.sh/api/v2/users");

let params = {
    "ids[]": "1",
};
Object.keys(params).forEach(key => url.searchParams.append(key, params[key]));

let headers = {
    "Accept": "application/json",
    "Content-Type": "application/json",
}

fetch(url, {
    method: "GET",
    headers: headers,
})
.then(response => response.json())
.then(json => console.log(json));

Example response (200):

{
    "users": [
        {
            "id": 1,
            "other": "attributes..."
        },
        {
            "id": 2,
            "other": "attributes..."
        }
    ]
}

Returns list of users.

HTTP Request

GET /users

Query Parameters

Parameter Status Description
ids[] optional User id to be returned. Specify once for each user id requested. Up to 50 users can be requested at once.

Response format

Field Type Description
users UserCompact[] Includes: country, cover, groups.

Wiki

Get Wiki Page

curl -X GET -G "https://osu.ppy.sh/api/v2/wiki/12" 
const url = new URL("https://osu.ppy.sh/api/v2/wiki/12");

let headers = {
    "Accept": "application/json",
    "Content-Type": "application/json",
}

fetch(url, {
    method: "GET",
    headers: headers,
})
.then(response => response.json())
.then(json => console.log(json));

The wiki article or image data.

HTTP Request

GET /wiki/{page?}

URL Parameters

Parameter Status Description
page optional The path name of the wiki page.

Response Format

Returns WikiPage if the content is a wiki page; a binary blob, otherwise.

Notification Websocket

Connection

wscat -c "{notification_endpoint}"
  -H "Authorization: Bearer {{token}}"

The above command will wait and display new notifications as they arrive

This endpoint allows you to receive notifications without constantly polling the server. Correct notification will be a JSON string with at least event field:

Field Type Description
event string See below

Events:

logout event

Server will disconnect session after sending this event so don't try to reconnect.

Field Type Description
event string logout

new event

New notification. See Notification object for notification types.

Field Type Description
event string new
data Notification

read event

Notification has been read.

Field Type Description
event string read
ids number[] id of Notifications which are read

Object Structures

Beatmap

Represent a beatmap. This extends BeatmapCompact with additional attributes.

Additional attributes:

Field Type Description
accuracy float
ar float
beatmapset_id integer
bpm float
convert boolean
count_circles integer
count_sliders integer
count_spinners integer
cs float
deleted_at Timestamp?
drain float
hit_length integer
is_scoreable boolean
last_updated Timestamp
mode_int integer
passcount integer
playcount integer
ranked integer See Rank status for list of possible values.
status string See Rank status for list of possible values.
total_length integer
url string

BeatmapCompact

Represent a beatmap.

Field Type Description
difficulty_rating float
id integer
mode GameMode
version string

Optional attributes:

Field Type Description
beatmapset Beatmapset|BeatmapsetCompact|null Beatmapset for Beatmap object, BeatmapsetCompact for BeatmapCompact object. null if the beatmap doesn't have associated beatmapset (e.g. deleted).
checksum string?
failtimes Failtimes
max_combo integer

Failtimes

All fields are optional but there's always at least one field returned.

Field Type Description
exit integer[]? Array of length 100.
fail integer[]? Array of length 100.

Beatmapset

Represents a beatmapset. This extends BeatmapsetCompact with additional attributes.

Field Type Description
availability.download_disabled boolean
availability.more_information string?
bpm float
can_be_hyped boolean
creator string Username of the mapper at the time of beatmapset creation.
discussion_enabled boolean
discussion_locked boolean
hype.current integer
hype.required integer
is_scoreable boolean
last_updated Timestamp
legacy_thread_url string?
nominations.current integer
nominations.required integer
ranked integer See Rank status for list of possible values.
ranked_date Timestamp?
source string
storyboard boolean
submitted_date Timestamp?
tags string

The following attributes are always included as well:

Field
has_favourited

BeatmapsetCompact

Represents a beatmapset.

Field Type Description
artist string
artist_unicode string
covers Covers
creator string
favourite_count number
id number
play_count number
preview_url string
source string
status string
title string
title_unicode string
user_id number
video string

Those fields are optional.

Field Type Description
beatmaps Beatmap[]
converts
current_user_attributes
description
discussions
events
genre
has_favourited boolean
language
nominations
ratings
recent_favourites
related_users
user

Covers

Field Type
cover string
cover@2x string
card string
card@2x string
list string
list@2x string
slimcover string
slimcover@2x string

Rank status

The possible values are denoted either as integer or string.

Integer String
-2 graveyard
-1 wip
0 pending
1 ranked
2 approved
3 qualified
4 loved

ChatChannel

{
  "channel_id": 1337,
  "name": "test channel",
  "description": "wheeeee",
  "icon": "/images/layout/avatar-guest@2x.png",
  "type": "GROUP",
  "first_message_id": 10,
  "last_read_id": 9150005005,
  "last_message_id": 9150005005,
  "moderated": false,
  "users": [
    2,
    3,
    102
  ]
}

Represents an individual chat "channel" in the game.

Field Type Description
channel_id number
name string
description string?
icon* string display icon for the channel
type string see channel types below
first_message_id* number? message_id of first message (only returned in presence responses)
last_read_id* number? message_id of last message read (only returned in presence responses)
last_message_id* number? message_id of last known message (only returned in presence responses)
recent_messages ChatMessage[]? up to 50 most recent messages
moderated* boolean user can't send message when the value is true (only returned in presence responses)
users* number[]? array of user_id that are in the channel (not included for PUBLIC channels)

Channel Types

Type Permission Check for Joining/Messaging
PUBLIC
PRIVATE is player in the allowed groups? (channel.allowed_groups)
MULTIPLAYER is player currently in the mp game?
SPECTATOR
TEMPORARY deprecated
PM see below (user_channels)
GROUP is player in channel? (user_channels)

For PMs, two factors are taken into account:

ChatMessage

{
  "message_id": 9150005004,
  "sender_id": 2,
  "channel_id": 5,
  "timestamp": "2018-07-06T06:33:34+00:00",
  "content": "i am a lazerface",
  "is_action": 0,
  "sender": {
    "id": 2,
    "username": "peppy",
    "profile_colour": "#3366FF",
    "avatar_url": "https://a.ppy.sh/2?1519081077.png",
    "country_code": "AU",
    "is_active": true,
    "is_bot": false,
    "is_online": true,
    "is_supporter": true
  }
}

Represents an individual Message within a ChatChannel.

Field Type Description
message_id number unique identifier for message
sender_id number user_id of the sender
channel_id number channel_id of where the message was sent
timestamp string when the message was sent, ISO-8601
content string message content
is_action boolean was this an action? i.e. /me dances
sender UserCompact embeded UserCompact object to save additional api lookups

Comment

{
  "commentable_id": 407,
  "commentable_type": "news_post",
  "created_at": "2019-09-05T06:31:20+00:00",
  "deleted_at": null,
  "edited_at": null,
  "edited_by_id": null,
  "id": 276,
  "legacy_name": null,
  "message": "yes",
  "message_html": "<div class='osu-md-default'><p class=\"osu-md-default__paragraph\">yes</p>\n</div>",
  "parent_id": null,
  "pinned": true,
  "replies_count": 0,
  "updated_at": "2019-09-05T06:31:20+00:00",
  "user_id": 1,
  "votes_count": 0
}

Represents an single comment.

Field Type Description
commentable_id number ID of the object the comment is attached to
commentable_type string type of object the comment is attached to
created_at string ISO 8601 date
deleted_at string? ISO 8601 date if the comment was deleted; null, otherwise
edited_at string? ISO 8601 date if the comment was edited; null, otherwise
edited_by_id number? user id of the user that edited the post; null, otherwise
id number the ID of the comment
legacy_name string? username displayed on legacy comments
message string? markdown of the comment's content
message_html string? html version of the comment's content
parent_id number? ID of the comment's parent
pinned boolean Pin status of the comment
replies_count number number of replies to the comment
updated_at string ISO 8601 date
user_id number user ID of the poster
votes_count number number of votes

CommentBundle

{
  "commentable_meta": [
    {
      "id": 407,
      "title": "Clicking circles linked to increased performance",
      "type": "news_post",
      "url": "https://osu.ppy.sh/home"
    }
  ],
  "comments": [
    {
      "commentable_id": 407,
      "commentable_type": "news_post",
      "created_at": "2019-09-05T06:31:20+00:00",
      "deleted_at": null,
      "edited_at": null,
      "edited_by_id": null,
      "id": 276,
      "legacy_name": null,
      "message": "yes",
      "message_html": "<div class='osu-md-default'><p class=\"osu-md-default__paragraph\">yes</p>\n</div>",
      "parent_id": null,
      "replies_count": 0,
      "updated_at": "2019-09-05T06:31:20+00:00",
      "user_id": 1,
      "votes_count": 1337
    },
    {
      "commentable_id": 407,
      "commentable_type": "news_post",
      "created_at": "2019-09-05T07:31:20+00:00",
      "deleted_at": null,
      "edited_at": null,
      "edited_by_id": null,
      "id": 277,
      "legacy_name": null,
      "message": "absolutely",
      "message_html": "<div class='osu-md-default'><p class=\"osu-md-default__paragraph\">absolutely</p>\n</div>",
      "parent_id": null,
      "replies_count": 0,
      "updated_at": "2019-09-05T07:31:20+00:00",
      "user_id": 2,
      "votes_count": 1337
    }
  ],
  "has_more": true,
  "has_more_id": 276,
  "included_comments": [],
  "pinned_comments": [],
  "sort": "new",
  "user_follow": false,
  "user_votes": [277],
  "users": [
    {
      "avatar_url": "https://a.ppy.sh/2?1519081077.png",
      "country_code": "AU",
      "default_group": "pippi",
      "id": 1,
      "is_active": true,
      "is_bot": false,
      "is_online": true,
      "is_supporter": true,
      "last_visit": "2025-09-05T08:35:00+00:00",
      "pm_friends_only": false,
      "profile_colour": null,
      "username": "pippi"
    },
    {
      "avatar_url": "https://a.ppy.sh/2?1519081077.png",
      "country_code": "AU",
      "default_group": "yuzu",
      "id": 2,
      "is_active": true,
      "is_bot": false,
      "is_online": false,
      "is_supporter": true,
      "last_visit": "2025-09-04T09:28:00+00:00",
      "pm_friends_only": false,
      "profile_colour": null,
      "username": "yuzu"
     }
  ]
}

Comments and related data.

Field Type Description
commentable_meta CommentableMeta[] ID of the object the comment is attached to
comments Comment[] Array of comments ordered according to sort;
has_more boolean If there are more comments or replies available
has_more_id number?
included_comments Comment[] Related comments; e.g. parent comments and nested replies
pinned_comments Comment[]? Pinned comments
sort string one of the CommentSort types
top_level_count number? Number of comments at the top level. Not returned for replies.
total number? Total number of comments. Not retuned for replies.
user_follow boolean is the current user watching the comment thread?
user_votes number[] IDs of the comments in the bundle the current user has upvoted
users UserCompact[] array of users related to the comments

CommentSort

Available sort types are new, old, top.

Type Sort Fields
new created_at (descending), id (descending)
old created_at (ascending), id (ascending)
top votes_count (descending), created_at (descending), id (descending)

Building cursor for comments listing

The returned response will be for comments after the specified sort fields.

For example, use last loaded comment for the fields value to load more comments. Also make sure to use same sort and parent_id values.

CommentableMeta

{
  "id": 407,
  "title": "Clicking circles linked to increased performance",
  "type": "news_post",
  "url": "https://osu.ppy.sh/home/"
}

Metadata of the object that a comment is attached to.

Field Type Description
id number the ID of the object
title string display title
type string the type of the object
url string url of the object

Cursor

{
  "_id": 5,
  "_score": 36.234
}
// query string: cursor[_id]=5&cursor[_score]=36.234
{
  "page": 2,
}
// query string: cursor[page]=2

A structure included in some API responses containing the parameters to get the next set of results.

The values of the cursor should be provided to next request of the same endpoint to get the next set of results.

If there are no more results available, a cursor with a value of null is returned: "cursor": null.

Event

The object has different attributes depending on its type. Following are attributes available to all types.

Field Type Description
created_at Timestamp
id number
type Event.Type

Additional objects

Beatmap

Field Type
title string
url string

Beatmapset

Field Type
title string
url string

User

Field Type Description
username string
url string
previousUsername string? Only for usernameChange event.

Available Types

achievement

When user obtained an achievement.

Field Type
achievement Achievement
user Event.User

beatmapPlaycount

When a beatmap has been played for certain number of times.

Field Type
beatmap Event.Beatmap
count number

beatmapsetApprove

When a beatmapset changes state.

Field Type Description
approval string ranked, approved, qualified, loved.
beatmapset Event.Beatmapset
user Event.User Beatmapset owner.

beatmapsetDelete

When a beatmapset is deleted.

Field Type
beatmapset Event.Beatmapset

beatmapsetRevive

When a beatmapset in graveyard state is updated.

Field Type Description
beatmapset Event.Beatmapset
user Event.User Beatmapset owner.

beatmapsetUpdate

When a beatmapset is updated.

Field Type Description
beatmapset Event.Beatmapset
user Event.User Beatmapset owner.

beatmapsetUpload

When a new beatmapset is uploaded.

Field Type Description
beatmapset Event.Beatmapset
user Event.User Beatmapset owner.

rank

When a user achieves a certain rank on a beatmap.

Field Type Description
scoreRank string (FIXME)
rank number
mode GameMode
beatmap Event.Beatmap
user Event.User

rankLost

When a user loses first place to another user.

Field Type
mode GameMode
beatmap Event.Beatmap
user Event.User

userSupportAgain

When a user supports osu! for the second and onwards.

Field Type
user Event.User

userSupportFirst

When a user becomes a supporter for the first time.

Field Type
user Event.User

userSupportGift

When a user is gifted a supporter tag by another user.

Field Type Description
user Event.User Recipient user.

usernameChange

When a user changes their username.

Field Type Description
user Event.User Includes previousUsername.

GameMode

Available game modes:

Name Descriprion
fruits osu!catch
mania osu!mania
osu osu!standard
taiko osu!taiko

Group

This object isn't returned by any endpoints yet, it is here purely as a reference for UserGroup

Field Type Description
id number
identifier string Unique string to identify the group.
is_probationary string Whether members of this group are considered probationary.
has_playmodes boolean If this group associates GameModes with a user's membership, e.g. BN/NAT members
name string
short_name string Short name of the group for display.
description string
colour string

KudosuHistory

Field Type Description
id number
action string Either give, reset, or revoke.
amount number
model string Object type which the exchange happened on (forum_post, etc).
created_at Timestamp
giver Giver? Simple detail of the user who started the exchange.
post Post Simple detail of the object for display.

Giver

Field Type
url string
username string

Post

Field Type Description
url string? Url of the object.
title string Title of the object. It'll be "[deleted beatmap]" for deleted beatmaps.

MultiplayerScore

Score data.

Field Type Description
id number
user_id number
room_id number
playlist_item_id number
beatmap_id number
rank rank
total_score number
accuracy number
max_combo number
mods Mod[]
statistics Statistics
passed bool
position number?
scores_around MultiplayerScoresAround? Scores around the specified score.
user User

MultiplayerScores

An object which contains scores and related data for fetching next page of the result.

Field Type Description
cursor MultiplayerScoresCursor To be used to fetch the next page.
params object To be used to fetch the next page.
scores MultiplayerScore[]
total number? Index only. Total scores of the specified playlist item.
user_score MultiplayerScore? Index only. Score of the accessing user if exists.

To fetch the next page, make request to scores index with relevant room and playlist, with parameters which consists of:

For example, given a response which params contains

Key Value
sort score_asc
limit 10

and cursor of

Key Value
score_id 1
total_score 10

then the parameters would be

Field Value
sort score_asc
limit 10
cursor[score_id] 1
cursor[total_score] 10

and thus the query string is sort=score_asc&limit=10&cursor[score_id]=1&cursor[total_score]=10.

MultiplayerScoresAround

Field Type Description
higher MultiplayerScores
lower MultiplayerScores

MultiplayerScoresCursor

An object which contains pointer for fetching further results of a request. It depends on the sort option.

Field Type Description
score_id number Last score id of current result (score_asc, score_desc).
total_score number Last score's total score of current result (score_asc, score_desc).

MultiplayerScoresSort

Sort option for multiplayer scores index.

Name Descriprion
score_asc Sort by scores, ascending.
score_desc Sort by scores, descending.

Notification

{
  "id": 1,
  "name": "channel_message",
  "created_at": "2019-04-24T07:12:43+00:00",
  "object_type": "channel",
  "object_id": 1,
  "source_user_id": 1,
  "is_read": true,
  "details": {
    "username": "someone",
    ...
  }
}

Represents a notification object.

Field Type Description
id number
name string Name of the event
created_at string ISO 8601 date
object_type string
object_id number
source_user_id number?
is_read boolean
details object message_id of last known message (only returned in presence responses)

Event Names

Name Description
beatmapset_discussion_lock Discussion on beatmap has been locked
beatmapset_discussion_post_new New discussion post on beatmap
beatmapset_discussion_unlock Discussion on beatmap has been unlocked
beatmapset_disqualify Beatmap was disqualified
beatmapset_love Beatmap was promoted to loved
beatmapset_nominate Beatmap was nominated
beatmapset_qualify Beatmap has gained enough nominations and entered the ranking queue
beatmapset_remove_from_loved Beatmap was removed from Loved
beatmapset_reset_nominations Nomination of beatmap was reset
channel_message Someone sent chat message
forum_topic_reply Someone replied on forum topic

beatmapset_discussion_lock

Field Type Description
object_id number Beatmapset id
object_type string beatmapset
source_user_id number User who locked discussion

Details object:

Field Type Description
cover_url string Beatmap cover
title string Beatmap title
username string Username of source_user_id

beatmapset_discussion_post_new

Field Type Description
object_id number Beatmapset id
object_type string beatmapset
source_user_id number Poster of the discussion

Details object:

Field Type Description
title string Beatmap title
cover_url string Beatmap cover
discussion_id number
post_id number
beatmap_id number? null if posted to general all
username string Username of source_user_id

beatmapset_discussion_unlock

Field Type Description
object_id number Beatmapset id
object_type string beatmapset
source_user_id number User who unlocked discussion

Details object:

Field Type Description
title string Beatmap title
cover_url string Beatmap cover
username string Username of source_user_id

beatmapset_disqualify

Field Type Description
object_id number Beatmapset id
object_type string beatmapset
source_user_id number User who disqualified beatmapset

Details object:

Field Type Description
title string Beatmap title
cover_url string Beatmap cover
username string Username of source_user_id

beatmapset_love

Field Type Description
object_id number Beatmapset id
object_type string beatmapset
source_user_id number User who promoted beatmapset to loved

Details object:

Field Type Description
title string Beatmap title
cover_url string Beatmap cover
username string Username of source_user_id

beatmapset_nominate

Field Type Description
object_id number Beatmapset id
object_type string beatmapset
source_user_id number User who nominated beatmapset

Details object:

Field Type Description
title string Beatmap title
cover_url string Beatmap cover
username string Username of source_user_id

beatmapset_qualify

Field Type Description
object_id number Beatmapset id
object_type string beatmapset
source_user_id number User whom beatmapset nomination triggered qualification

Details object:

Field Type Description
title string Beatmap title
cover_url string Beatmap cover
username string Username of source_user_id

beatmapset_remove_from_loved

Field Type Description
object_id number Beatmapset id
object_type string beatmapset
source_user_id number User who removed beatmapset from Loved

Details object:

Field Type Description
title string Beatmap title
cover_url string Beatmap cover
username string Username of source_user_id

beatmapset_reset_nominations

Field Type Description
object_id number Beatmapset id
object_type string beatmapset
source_user_id number User who triggered nomination reset

Details object:

Field Type Description
title string Beatmap title
cover_url string Beatmap cover
username string Username of source_user_id

channel_message

Field Type Description
object_id number Channel id
object_type string channel
source_user_id number User who posted message

Details object:

Field Type Description
title string Up to 36 characters of the message (ends with ... when exceeding 36 characters)
cover_url string Avatar of source_user_id
username string Username of source_user_id

forum_topic_reply

Field Type Description
object_id number Topic id
object_type string forum_topic
source_user_id number User who posted message

Details object:

Field Type Description
title string Title of the replied topic
cover_url string Topic cover
post_id number Post id
username string? Username of source_user_id

RankingType

Available ranking types:

Name Descriprion
charts Spotlight
country Country
performance Performance
score Score

Rankings

{
  "cursor": {

  },
  "ranking": [
    {
      "grade_counts": {
          "a": 3,
          "s": 2,
          "sh": 6,
          "ss": 2,
          "ssh": 3
      },
      "hit_accuracy": 92.19,
      "is_ranked": true,
      "level": {
          "current": 30,
          "progress": 0
      },
      "maximum_combo": 3948,
      "play_count": 228050,
      "play_time": null,
      "pp": 990,
      "pp_rank": 87468,
      "ranked_score": 1502995536,
      "replays_watched_by_others": 0,
      "total_hits": 5856573,
      "total_score": 2104193750,
      "user": {
          "avatar_url": "/images/layout/avatar-guest.png",
          "country": {
              "code": "GF",
              "name": "French Guiana"
          },
          "country_code": "GF",
          "cover": {
              "custom_url": null,
              "id": "3",
              "url": "http://osuweb.test/images/headers/profile-covers/c3.jpg"
          },
          "default_group": "default",
          "id": 458402,
          "is_active": false,
          "is_bot": false,
          "is_online": false,
          "is_supporter": true,
          "last_visit": "2017-02-22T11:07:10+00:00",
          "pm_friends_only": false,
          "profile_colour": null,
          "username": "serdman"
      }
    }
  ],
  "total": 100
}
Field Type Description
beatmapsets Beatmapset[]? The list of beatmaps in the requested spotlight for the given mode; only available if type is charts
cursor Cursor A cursor
ranking UserStatistics[] Score details ordered by rank in descending order.
spotlight Spotlight? Spotlight details; only available if type is charts
total number An approximate count of ranks available

Score

Field Type Description
id
best_id
user_id
accuracy
mods
score
max_combo
perfect
statistics.count_50
statistics.count_100
statistics.count_300
statistics.count_geki
statistics.count_katu
statistics.count_miss
pp
rank
created_at
mode
mode_int
replay

Optional attributes:

Field Type Description
beatmap
beatmapset
rank_country
rank_global
weight
user
match

Spotlight

{
  "end_date": "2019-03-22T00:00:00+00:00",
  "id": 1,
  "mode_specific": false,
  "name": "Best spinning circles 2019",
  "start_date": "2019-02-22T00:00:00+00:00",
  "type": "yearly",
}

The details of a spotlight.

Field Type Description
end_date DateTime The end date of the spotlight.
id number The ID of this spotlight.
mode_specific number If the spotlight has different mades specific to each GameMode.
participant_count number? The number of users participating in this spotlight. This is only shown when viewing a single spotlight.
name number The name of the spotlight.
start_date DateTime The starting date of the spotlight.
type string The type of spotlight.

Spotlights

{
  "spotlights": [
    {
      "end_date": "2019-03-22T00:00:00+00:00",
      "id": 1,
      "mode_specific": false,
      "name": "Best spinning circles 2019",
      "start_date": "2019-02-22T00:00:00+00:00",
      "type": "yearly",
    },
    {
      "end_date": "2019-03-22T00:00:00+00:00",
      "id": 2,
      "mode_specific": true,
      "name": "Ultimate fruit collector February 2019",
      "start_date": "2019-02-22T00:00:00+00:00",
      "type": "monthly",
    }
  ],
}
Field Type Description
spotlights Spotlight[] An array of spotlights

Timestamp

  "2020-01-01T00:00:00+00:00"

Timestamp string in ISO 8601 format.

User

{
  "avatar_url": "https://a.ppy.sh/1?1501234567.jpeg",
  "country_code": "AU",
  "default_group": "default",
  "id": 1,
  "is_active": true,
  "is_bot": false,
  "is_online": false,
  "is_supporter": true,
  "last_visit": "2020-01-01T00:00:00+00:00",
  "pm_friends_only": false,
  "profile_colour": "#000000",
  "username": "osuuser",
  "cover_url": "https://assets.ppy.sh/user-profile-covers/1/0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef.jpeg",
  "discord": "osuuser#1337",
  "has_supported": true,
  "interests": null,
  "join_date": "2010-01-01T00:00:00+00:00",
  "kudosu": {
    "total": 20,
    "available": 10
  },
  "location": null,
  "max_blocks": 50,
  "max_friends": 500,
  "occupation": null,
  "playmode": "osu",
  "playstyle": [
    "mouse",
    "touch"
  ],
  "post_count": 100,
  "profile_order": [
    "me",
    "recent_activity",
    "beatmaps",
    "historical",
    "kudosu",
    "top_ranks",
    "medals"
  ],
  "skype": null,
  "title": null,
  "twitter": "osuuser",
  "website": "https://osu.ppy.sh",
  "country": {
    "code": "AU",
    "name": "Australia"
  },
  "cover": {
    "custom_url": "https://assets.ppy.sh/user-profile-covers/1/0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef.jpeg",
    "url": "https://assets.ppy.sh/user-profile-covers/1/0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef.jpeg",
    "id": null
  },
  "account_history": [],
  "active_tournament_banner": [],
  "badges": [
    {
      "awarded_at": "2015-01-01T00:00:00+00:00",
      "description": "Test badge",
      "image_url": "https://assets.ppy.sh/profile-badges/test.png",
      "url": ""
    }
  ],
  "favourite_beatmapset_count": 10,
  "follower_count": 100,
  "graveyard_beatmapset_count": 10,
  "groups": [
    {
      "id": 1,
      "identifier": "gmt",
      "name": "gmt",
      "short_name": "GMT",
      "description": "",
      "colour": "#FF0000"
    }
  ],
  "loved_beatmapset_count": 0,
  "monthly_playcounts": [
    {
      "start_date": "2019-11-01",
      "count": 100
    },
    {
      "start_date": "2019-12-01",
      "count": 150
    },
    {
      "start_date": "2020-01-01",
      "count": 20
    }
  ],
  "page": {
    "html": "<div class='bbcode bbcode--profile-page'><center>Hello</center></div>",
    "raw": "[centre]Hello[/centre]"
  },
  "previous_usernames": [],
  "ranked_and_approved_beatmapset_count": 10,
  "replays_watched_counts": [
    {
      "start_date": "2019-11-01",
      "count": 10
    },
    {
      "start_date": "2019-12-01",
      "count": 12
    },
    {
      "start_date": "2020-01-01",
      "count": 1
    }
  ],
  "scores_first_count": 0,
  "statistics": {
    "level": {
      "current": 60,
      "progress": 55
    },
    "pp": 100,
    "pp_rank": 2000,
    "ranked_score": 2000000,
    "hit_accuracy": 90.5,
    "play_count": 1000,
    "play_time": 100000,
    "total_score": 3000000,
    "total_hits": 6000,
    "maximum_combo": 500,
    "replays_watched_by_others": 270,
    "is_ranked": true,
    "grade_counts": {
      "ss": 10,
      "ssh": 5,
      "s": 50,
      "sh": 0,
      "a": 40
    },
    "rank": {
      "global": 15000,
      "country": 30000
    }
  },
  "support_level": 3,
  "unranked_beatmapset_count": 0,
  "user_achievements": [
    {
      "achieved_at": "2020-01-01T00:00:00+00:00",
      "achievement_id": 1
    }
  ],
  "rank_history": {
    "mode": "osu",
    "data": [
      16200,
      15500,
      15000
    ]
  }
}

Represents a User. Extends UserCompact object with additional attributes.

Field Type Description
cover_url string url of profile cover
discord string?
has_supported boolean whether or not ever being a supporter in the past
interests string?
join_date Timestamp
kudosu.available number
kudosu.total number
location string?
max_blocks number maximum number of users allowed to be blocked
max_friends number maximum number of friends allowed to be added
occupation string?
playmode GameMode
playstyle string[] Device choices of the user.
post_count number number of forum posts
profile_order ProfilePage[] ordered array of sections in user profile page
skype string?
title string? user-specific title
twitter string?
website string?

In addition, following attributes are always included:

Attribute
country
cover
is_admin
is_bng
is_full_bn
is_gmt
is_limited_bn
is_moderator
is_nat
is_restricted
is_silenced

ProfilePage

Section
me
recent_activity
beatmaps
historical
kudosu
top_ranks
medals

UserCompact

{
  "id": 2,
  "username": "peppy",
  "profile_colour": "#3366FF",
  "avatar_url": "https://a.ppy.sh/2?1519081077.png",
  "country_code": "AU",
  "is_active": true,
  "is_bot": false,
  "is_online": true,
  "is_supporter": true
}

Mainly used for embedding in certain responses to save additional api lookups.

Field Type Description
avatar_url string url of user's avatar
country_code string two-letter code representing user's country
default_group string Identifier of the default Group the user belongs to.
id number unique identifier for user
is_active boolean has this account been active in the last x months?
is_bot boolean is this a bot account?
is_online boolean is the user currently online? (either on lazer or the new website)
is_supporter boolean does this user have supporter?
last_visit Timestamp? last access time. null if the user hides online presence
pm_friends_only boolean whether or not the user allows PM from other than friends
profile_colour string colour of username/profile highlight, hex code (e.g. #333333)
username string user's display name

Optional attributes

Following are attributes which may be additionally included in the response. Relevant endpoints should list them if applicable.

Field Type
account_history UserAccountHistory[]
active_tournament_banner UserCompact.ProfileBanner
badges UserBadge[]
beatmap_playcounts_count number
blocks
country
cover
current_mode_rank
favourite_beatmapset_count number
follower_count number
friends
graveyard_beatmapset_count number
groups UserGroup[]
is_admin boolean
is_bng boolean
is_full_bn boolean
is_gmt boolean
is_limited_bn boolean
is_moderator boolean
is_nat boolean
is_restricted boolean
is_silenced boolean
loved_beatmapset_count number
monthly_playcounts UserMonthlyPlaycount[]
page
previous_usernames
ranked_and_approved_beatmapset_count
replays_watched_counts
scores_best_count number
scores_first_count number
scores_recent_count number
statistics
support_level
unranked_beatmapset_count
unread_pm_count
user_achievements
user_preferences
rank_history

ProfileBanner

Field Type Description
id number
tournament_id number
image string

UserAccountHistory

Field Type Description
id number
type string note, restriction, or silence.
timestamp Timestamp
length number In seconds.

UserBadge

Field Type Description
awarded_at Timestamp
description string
image_url string
url string

UserGroup

Describes the Group membership of a User - most of the attributes will be the same as the relevant Group

Field Type Description
id number ID (of Group)
identifier string Unique string to identify the group.
is_probationary boolean Whether members of this group are considered probationary.
name string
short_name string Short name of the group for display.
description string
colour string
playmodes string[]? GameModes which the member is responsible for, e.g. in the case of BN/NAT (only present when has_playmodes is set on Group)

UserStatistics

{
  "grade_counts": {
      "a": 3,
      "s": 2,
      "sh": 6,
      "ss": 2,
      "ssh": 3
  },
  "hit_accuracy": 92.19,
  "is_ranked": true,
  "level": {
      "current": 30,
      "progress": 0
  },
  "maximum_combo": 3948,
  "play_count": 228050,
  "play_time": null,
  "pp": 990,
  "pp_rank": 87468,
  "ranked_score": 1502995536,
  "replays_watched_by_others": 0,
  "total_hits": 5856573,
  "total_score": 2104193750,
  "user": {
      "avatar_url": "https://a.ppy.sh/2?1519081077.png",
      "country": {
          "code": "AU",
          "name": "Australia"
      },
      "country_code": "AU",
      "cover": {
          "custom_url": null,
          "id": "3",
          "url": "https://assets.ppy.sh/user-profile-covers/2/baba245ef60834b769694178f8f6d4f6166c5188c740de084656ad2b80f1eea7.jpeg"
      },
      "default_group": "ppy",
      "id": 2,
      "is_active": false,
      "is_bot": false,
      "is_online": false,
      "is_supporter": true,
      "last_visit": "2019-02-22T11:07:10+00:00",
      "pm_friends_only": false,
      "profile_colour": "#3366FF",
      "username": "peppy"
  }
}

A summary of various gameplay statistics for a User. Specific to a GameMode

Field Type Description
grade_counts.a number Number of A ranked scores.
grade_counts.s number Number of S ranked scores.
grade_counts.sh number Number of Silver S ranked scores.
grade_counts.ss number Number of SS ranked scores.
grade_counts.ssh number Number of Silver SS ranked scores.
hit_accuracy number Hit accuracy percentage
is_ranked boolean Is actively ranked
level.cuurent number Current level.
level.progress number Progress to next level.
maximum_combo number Highest maximum combo.
play_count number Number of maps played.
play_time number Cummulative time played.
pp number Performance points
pp_rank number Current rank according to pp.
ranked_score number Current ranked score.
replays_watched_by_others number Number of replays watched by other users.
total_hits number Total number of hits.
total_score number Total score.
user UserCompact The associated user.

WikiPage

{
    "layout": "markdown_page",
    "locale": "en",
    "markdown": "# osu! (game mode)\n\n![Gameplay of osu!](/wiki/shared/Interface_osu.jpg \"osu! Interface\")\n\nMarkdownMarkdownTruncated",
    "path": "Game_Modes/osu!",
    "subtitle": "Game Modes",
    "tags": ["tap", "circles"],
    "title": "osu! (game mode)"
}

Represents a wiki article

Field Type Description
layout string The layout type for the page.
locale string All lowercase BCP 47 language tag.
markdown string Markdown content.
path string Path of the article.
subtitle string? The article's subtitle.
tags string[] Associated tags for the article.
title string The article's title.