API
You do not need a key to use these endpoints. They return the same data the site uses, as JSON. 2 of them (/api/search and /api/gameinfo) ask the PlayStation Store when a game is not already saved; the rest read only from the site's own database.
Base URL: https://ps-store-db.live. All parameters are query string
unless marked as a JSON body. No header is needed.
Version 1
Every figure the site's pages show, read from the last saved charts. None of these send a request to the PlayStation Store. Each answer carries saved_at, the time of the save it reads, and a link to the matching page. Rate limit: 60 requests a minute per visitor. Responses are cached for 5 minutes.
| Endpoint | Returns |
|---|---|
GET /api/v1/stores | The 55 tracked stores with their 2 letter codes, by region |
GET /api/v1/charts/{store}?depth=25 | A store's best seller chart: rank, game, rating, reviews and price, up to the top 100 |
GET /api/v1/number-ones | The number 1 in every store today, grouped by game, with the longest streak |
GET /api/v1/search?q= | Games by name, with the id the other endpoints take |
GET /api/v1/games/{id} | 1 game: release date, rating, launch label with its proof, and its rank in every store |
GET /api/v1/games/{id}/rank-history?stores=US,JP | Daily best rank per store from 100 days before release to 100 days after, top 100 only |
GET /api/v1/top-rated/{list} | A top rated list: best, most-reviewed, new, hidden-gems, on-sale, all-time or most-reviewed-all-time |
GET /api/v1/most-anticipated | Best selling games not released yet, ranked by the same points as the best sellers chart |
GET /api/v1/preorders/{store} | 1 store's own preorder chart on the latest day saved |
GET /api/v1/top-downloads/{region} | Sony's latest monthly top downloads for us, eu, asia or japan, from the PlayStation Blog |
GET /api/v1/movers | The biggest 1 day climbs and falls in the top 50 of the 20 featured stores |
GET /api/v1/publishers | Every publisher with games charting and top 100 places today |
GET /api/v1/publishers/{slug} | A publisher's top 100 places, share, regions, labels, games and official sales figures |
A game id, list or store that does not exist returns 404 with a message naming the valid values.
MCP server
The same data as tools for AI assistants, at https://ps-store-db.live/mcp (Streamable HTTP, no key). In Claude, add it under Settings, Connectors, Add custom connector. In Claude Code: claude mcp add --transport http ps-store-db https://ps-store-db.live/mcp.
Tools: list_stores, get_chart, get_number_ones, search_games, get_game, get_rank_history, get_top_rated, get_most_anticipated, get_movers, list_publishers and get_publisher. All are read only.
Older endpoints
Chart data (cached)
These read the last saved charts and never send a request to the PlayStation Store.
Both accept a stores parameter: a comma separated list of region keys
(US,GB,JP), or one of the named sets below.
GET /api/topten
Each tracked store's top 25 best sellers.
GET /api/topten?stores=US,JP
{
"results": {
"US": [
{ "rank": 1, "id": "...", "name": "...", "cover": "...", "price": "$59.99", ... }
]
},
"note": null
}
GET /api/top100
The full Top 100 browse grid, same shape as above.
GET /api/top100?stores=plato
Named store sets
plato: 10 stores (US, JP, GB, FR, ES, PT, DE, BR, KR, IN)ww: 69 stores (JP, KR, US, GB, FR, DE, HK, AU, TW, AR, AT, BH, BE, BO, BR, BG, CA, CL, CO, CR, HR, CY, CZ, DK, EC, SV, FI, GR, GT, HN, HU, IS, IN, ID, IE, IL, IT, KW, LB, LU, MY, MT, MX, NL, NZ, NI, NO, OM, PA, PY, PE, PL, PT, QA, RO, SA, SG, SI, SK, ZA, ES, SE, CH, TH, TR, UA, AE, UY, CN)asia: 9 stores (SG, ID, JP, KR, IN, TW, TH, MY, HK)eu: 28 stores (AT, BE, BG, HR, CY, CZ, DK, FI, FR, DE, HU, IS, IE, IT, LU, MT, NO, PL, PT, RO, SI, SK, ES, SE, CH, NL, GB, UA)am: 16 stores (AR, BO, BR, CA, CL, CO, CR, EC, SV, HN, MX, NI, PA, PE, US, UY)ameo: 12 stores (NZ, AU, BH, IL, KW, LB, OM, QA, ZA, TR, AE, AR)
Search and lookup (live)
These ask store.playstation.com when the answer is not already in the site's own index, so each visitor has a rate limit, and all requests to the store share 1 overall limit that pauses them if the store starts refusing. When that happens a response can come back empty instead of failing. See status for current collection health.
GET /api/search
Rate limit: 60 requests a minute per visitor. It searches the site's own index first, with no
request to the store, and only uses the PlayStation Store search when nothing is found. A result
from the index has no price, because prices differ by store and the index holds names.
GET /api/search?q=persona&store=US
{ "results": [ { "id": "...", "name": "...", "cover": "...", "price": "..." } ] }
GET /api/gameinfo
Rate limit: 30 requests a minute per visitor. Returns 404 if the id is not found. Like search, it
reads the saved record first: a saved response has everything except price and sets
"cached": true. A game never seen before is fetched from the store, and that
response includes the price and leaves out the field.
A game's release_date comes with release_date_precision: "day",
"month" (the store gave only the month, written as its last day) or "year"
(the store gave only the year, so the date is just "2027"). A month or year only date
has no days_until_release. On Most anticipated and the preorder charts,
release_month holds "Dec 2026" for a month and "2027" for a year.
When that month or year has passed and the game has no ratings yet, so it is not out,
release_date is null with precision "to_be_confirmed", and the charts send
"date_to_be_confirmed": true.
GET /api/gameinfo?id=10008789&store=US
{ "id": "10008789", "name": "...", "cover": "...", "rating": ..., "release_date": "...",
"cached": true, ... }
Status
GET /api/refresh-status
{ "regions": { "US": { "last_success": ..., "last_error": null } }, "auto_refresh": true }
GET /api/stores
Every tracked region, its metadata, and the named sets above, in one call.
GET /api/health
{ "status": "ok", "time": "2026-08-31T12:00:00+00:00" }
There is no versioning, and the responses can change, because the site itself uses the same endpoints. If you rely on it for a project, get in touch through the contact page and I will try to give notice before a change.