Top Charts
curl --request GET \
--url https://scrapebadger.com/v1/google-play/collections/{collection} \
--header 'X-API-Key: <x-api-key>'import requests
url = "https://scrapebadger.com/v1/google-play/collections/{collection}"
headers = {"X-API-Key": "<x-api-key>"}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {'X-API-Key': '<x-api-key>'}};
fetch('https://scrapebadger.com/v1/google-play/collections/{collection}', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://scrapebadger.com/v1/google-play/collections/{collection}",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "GET",
CURLOPT_HTTPHEADER => [
"X-API-Key: <x-api-key>"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"net/http"
"io"
)
func main() {
url := "https://scrapebadger.com/v1/google-play/collections/{collection}"
req, _ := http.NewRequest("GET", url, nil)
req.Header.Add("X-API-Key", "<x-api-key>")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.get("https://scrapebadger.com/v1/google-play/collections/{collection}")
.header("X-API-Key", "<x-api-key>")
.asString();require 'uri'
require 'net/http'
url = URI("https://scrapebadger.com/v1/google-play/collections/{collection}")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Get.new(url)
request["X-API-Key"] = '<x-api-key>'
response = http.request(request)
puts response.read_body{
"query": "<string>",
"url": "<string>",
"result_count": 123,
"apps": [
{}
]
}Endpoints
Top Charts
Google Play top charts — currently unavailable, because Play renders the ranking client-side. Returns 422 (not billed).
GET
/
v1
/
google-play
/
collections
/
{collection}
Top Charts
curl --request GET \
--url https://scrapebadger.com/v1/google-play/collections/{collection} \
--header 'X-API-Key: <x-api-key>'import requests
url = "https://scrapebadger.com/v1/google-play/collections/{collection}"
headers = {"X-API-Key": "<x-api-key>"}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {'X-API-Key': '<x-api-key>'}};
fetch('https://scrapebadger.com/v1/google-play/collections/{collection}', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://scrapebadger.com/v1/google-play/collections/{collection}",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "GET",
CURLOPT_HTTPHEADER => [
"X-API-Key: <x-api-key>"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"net/http"
"io"
)
func main() {
url := "https://scrapebadger.com/v1/google-play/collections/{collection}"
req, _ := http.NewRequest("GET", url, nil)
req.Header.Add("X-API-Key", "<x-api-key>")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.get("https://scrapebadger.com/v1/google-play/collections/{collection}")
.header("X-API-Key", "<x-api-key>")
.asString();require 'uri'
require 'net/http'
url = URI("https://scrapebadger.com/v1/google-play/collections/{collection}")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Get.new(url)
request["X-API-Key"] = '<x-api-key>'
response = http.request(request)
puts response.read_body{
"query": "<string>",
"url": "<string>",
"result_count": 123,
"apps": [
{}
]
}Top charts for a category and country.
The route ships reading the chart cluster the correct way, so it starts
returning data unchanged if Google restores server-side rendering. Returning the
page’s editorial rails instead would charge you for a ranking you did not ask
for and could not distinguish from the real one.
Credits: 5 when it returns data.
This endpoint currently returns
422 for every request, and 422 is not
billed.Google Play no longer server-renders the top-chart ranking. The category page
carries the chart tabs — their ids and labels are in the payload — but the
item list is empty and filled in client-side. That was confirmed across
GAME/US, COMMUNICATION/US and GAME/DE, so it is Play’s rendering model
and not a per-page fluke. The legacy /store/apps/collection/{id} URLs still
answer 200 but serve an empty shell.Use
/categories/{category_id}
for that category’s apps in Play’s own order.422 is not billed.
Authorization
string
required
Your ScrapeBadger API key.
Path Parameters
string
required
topselling_free, topselling_paid or topgrossing. Anything else is
a 400.Query Parameters
string
default:"APPLICATION"
Category to rank within, e.g.
GAME or SOCIAL. Defaults to all apps. See
/categories.string
default:"US"
Play storefront (
gl).string
default:"en"
Play content language (
hl).Response
string
The collection requested.
string
The Play URL the chart was read from.
integer
Apps returned.
AppCard[]
Ranked apps — same shape as
search results, in chart order.
Example
curl "https://scrapebadger.com/v1/google-play/collections/topselling_free?category=GAME&country=US" \
-H "X-API-Key: YOUR_API_KEY"
const res = await fetch(
"https://scrapebadger.com/v1/google-play/collections/topselling_free?" +
new URLSearchParams({ category: "GAME", country: "US" }),
{ headers: { "X-API-Key": process.env.SCRAPEBADGER_API_KEY } },
);
// Currently 422 — fall back to /categories/GAME.
import requests
res = requests.get(
"https://scrapebadger.com/v1/google-play/collections/topselling_free",
headers={"X-API-Key": "YOUR_API_KEY"},
params={"category": "GAME", "country": "US"},
)
# Currently 422 — fall back to /categories/GAME.
Response (current behaviour)
{
"detail": "Google Play renders the topselling_free chart client-side; no server-side ranking is available for category GAME. Use /categories/GAME for that category's apps."
}
Errors
| Status | Meaning |
|---|---|
400 | Unknown collection id. |
422 | Play renders this chart client-side — not billed. Retrying will not help; use /categories/{id}. |
502 | Unexpected upstream failure — not billed. |

