MENU navbar-image

Introduction

PPvR public API

This is a really basic api to provide most of the data that is provided by PPvR.
All API calls are rate limited to 60 requests per minute to ensure that the api is used responsibly. This is the only way I can keep it public.

Base URL

http://localhost

Authenticating requests

This API is not authenticated.

Posts

Posts

Get all posts (paginated, 50 per page)

Example request:
curl --request GET \
    --get "https://ppvr.andrus.io/api/posts" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://ppvr.andrus.io/api/posts"
);

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

fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$url = 'https://ppvr.andrus.io/api/posts';
$response = $client->get(
    $url,
    [
        'headers' => [
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
import requests
import json

url = 'https://ppvr.andrus.io/api/posts'
headers = {
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('GET', url, headers=headers)
response.json()

Example response (200):


{
    "data": [
        {
            "id": "1001lgy",
            "player_id": 10549880,
            "map_artist": "Apocalyptica",
            "map_title": "Reign of Fear",
            "map_diff": "III",
            "author": "kipster15",
            "score": 128,
            "ups": 131,
            "downs": 3,
            "silver": 0,
            "gold": 0,
            "platinum": 0,
            "created_utc": 1672514755,
            "final": 0,
            "created_at": "2022-12-31T19:30:07.000000Z",
            "updated_at": "2023-01-01T19:15:15.000000Z"
        },
        {
            "id": "1001lgy",
            "player_id": 10549880,
            "map_artist": "Apocalyptica",
            "map_title": "Reign of Fear",
            "map_diff": "III",
            "author": "kipster15",
            "score": 128,
            "ups": 131,
            "downs": 3,
            "silver": 0,
            "gold": 0,
            "platinum": 0,
            "created_utc": 1672514755,
            "final": 0,
            "created_at": "2022-12-31T19:30:07.000000Z",
            "updated_at": "2023-01-01T19:15:15.000000Z"
        }
    ],
    "links": {
        "first": "/?page=1",
        "last": "/?page=1",
        "prev": null,
        "next": null
    },
    "meta": {
        "current_page": 1,
        "from": 1,
        "last_page": 1,
        "links": [
            {
                "url": null,
                "label": "« Previous",
                "active": false
            },
            {
                "url": "/?page=1",
                "label": "1",
                "active": true
            },
            {
                "url": null,
                "label": "Next »",
                "active": false
            }
        ],
        "path": "/",
        "per_page": 50,
        "to": 2,
        "total": 2
    }
}
 

Request      

GET api/posts

Headers

Content-Type      

Example: application/json

Accept      

Example: application/json

Post

Get a post by id (same as reddit post id)

Example request:
curl --request GET \
    --get "https://ppvr.andrus.io/api/posts/u3rk97" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://ppvr.andrus.io/api/posts/u3rk97"
);

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

fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$url = 'https://ppvr.andrus.io/api/posts/u3rk97';
$response = $client->get(
    $url,
    [
        'headers' => [
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
import requests
import json

url = 'https://ppvr.andrus.io/api/posts/u3rk97'
headers = {
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('GET', url, headers=headers)
response.json()

Example response (200):


{
    "data": {
        "id": "1001lgy",
        "player_id": 10549880,
        "map_artist": "Apocalyptica",
        "map_title": "Reign of Fear",
        "map_diff": "III",
        "author": "kipster15",
        "score": 128,
        "ups": 131,
        "downs": 3,
        "silver": 0,
        "gold": 0,
        "platinum": 0,
        "created_utc": 1672514755,
        "final": 0,
        "created_at": "2022-12-31T19:30:07.000000Z",
        "updated_at": "2023-01-01T19:15:15.000000Z"
    }
}
 

Request      

GET api/posts/{id}

Headers

Content-Type      

Example: application/json

Accept      

Example: application/json

URL Parameters

id   string   

post id (same as reddit post id) Example: u3rk97

Posts by Player

Get a players' posts by player id (same as osu player id)

Example request:
curl --request GET \
    --get "https://ppvr.andrus.io/api/posts/by-player/124493" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://ppvr.andrus.io/api/posts/by-player/124493"
);

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

fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$url = 'https://ppvr.andrus.io/api/posts/by-player/124493';
$response = $client->get(
    $url,
    [
        'headers' => [
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
import requests
import json

url = 'https://ppvr.andrus.io/api/posts/by-player/124493'
headers = {
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('GET', url, headers=headers)
response.json()

Example response (200):


{
    "data": {
        "id": "1001lgy",
        "player_id": 10549880,
        "map_artist": "Apocalyptica",
        "map_title": "Reign of Fear",
        "map_diff": "III",
        "author": "kipster15",
        "score": 128,
        "ups": 131,
        "downs": 3,
        "silver": 0,
        "gold": 0,
        "platinum": 0,
        "created_utc": 1672514755,
        "final": 0,
        "created_at": "2022-12-31T19:30:07.000000Z",
        "updated_at": "2023-01-01T19:15:15.000000Z"
    }
}
 

Request      

GET api/posts/by-player/{id}

Headers

Content-Type      

Example: application/json

Accept      

Example: application/json

URL Parameters

id   integer   

player id (same as osu player id) Example: 124493

Players

Players

Get all players (paginated, 50 per page)

Example request:
curl --request GET \
    --get "https://ppvr.andrus.io/api/players" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://ppvr.andrus.io/api/players"
);

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

fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$url = 'https://ppvr.andrus.io/api/players';
$response = $client->get(
    $url,
    [
        'headers' => [
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
import requests
import json

url = 'https://ppvr.andrus.io/api/players'
headers = {
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('GET', url, headers=headers)
response.json()

Example response (200):


{
    "data": [
        {
            "id": 2,
            "name": "peppy",
            "score": 9540,
            "created_at": "2018-09-10T23:34:06.000000Z",
            "updated_at": "2024-08-01T21:51:04.000000Z"
        },
        {
            "id": 2,
            "name": "peppy",
            "score": 9540,
            "created_at": "2018-09-10T23:34:06.000000Z",
            "updated_at": "2024-08-01T21:51:04.000000Z"
        }
    ],
    "links": {
        "first": "/?page=1",
        "last": "/?page=1",
        "prev": null,
        "next": null
    },
    "meta": {
        "current_page": 1,
        "from": 1,
        "last_page": 1,
        "links": [
            {
                "url": null,
                "label": "« Previous",
                "active": false
            },
            {
                "url": "/?page=1",
                "label": "1",
                "active": true
            },
            {
                "url": null,
                "label": "Next »",
                "active": false
            }
        ],
        "path": "/",
        "per_page": 50,
        "to": 2,
        "total": 2
    }
}
 

Request      

GET api/players

Headers

Content-Type      

Example: application/json

Accept      

Example: application/json

Player

Get a player by id (same as osu player id)

Example request:
curl --request GET \
    --get "https://ppvr.andrus.io/api/players/124493" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://ppvr.andrus.io/api/players/124493"
);

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

fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$url = 'https://ppvr.andrus.io/api/players/124493';
$response = $client->get(
    $url,
    [
        'headers' => [
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
import requests
import json

url = 'https://ppvr.andrus.io/api/players/124493'
headers = {
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('GET', url, headers=headers)
response.json()

Example response (200):


{
    "data": {
        "id": 2,
        "name": "peppy",
        "score": 9540,
        "created_at": "2018-09-10T23:34:06.000000Z",
        "updated_at": "2024-08-01T21:51:04.000000Z"
    }
}
 

Request      

GET api/players/{id}

Headers

Content-Type      

Example: application/json

Accept      

Example: application/json

URL Parameters

id   integer   

player id (same as osu player id) Example: 124493

Ranks

Ranks

Get the rank history for a player

Example request:
curl --request GET \
    --get "https://ppvr.andrus.io/api/ranks/124493" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://ppvr.andrus.io/api/ranks/124493"
);

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

fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$url = 'https://ppvr.andrus.io/api/ranks/124493';
$response = $client->get(
    $url,
    [
        'headers' => [
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
import requests
import json

url = 'https://ppvr.andrus.io/api/ranks/124493'
headers = {
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('GET', url, headers=headers)
response.json()

Example response (200):


{
    "data": [
        {
            "id": 4620143,
            "player_id": 7562902,
            "rank": 1,
            "created_at": "2024-09-12T03:00:39.000000Z",
            "updated_at": "2024-09-12T03:00:39.000000Z"
        },
        {
            "id": 4620143,
            "player_id": 7562902,
            "rank": 1,
            "created_at": "2024-09-12T03:00:39.000000Z",
            "updated_at": "2024-09-12T03:00:39.000000Z"
        }
    ]
}
 

Request      

GET api/ranks/{playerId}

Headers

Content-Type      

Example: application/json

Accept      

Example: application/json

URL Parameters

playerId   integer   

player id (same as osu player id) Example: 124493