# Google Play Top Charts Scraper: Rankings by Country (`glitchbound/google-play-charts-scraper`) Actor

Track Google Play top charts and rankings: Top Free, Top Paid and Top Grossing apps and games in 57 countries and 54 categories, with rank, rating, installs, price and developer. Optional details: exact installs, rating counts, release dates and developer emails. From the Play Store's own charts.

- **URL**: https://apify.com/glitchbound/google-play-charts-scraper.md
- **Developed by:** [Daniel Meshulam](https://apify.com/glitchbound) (community)
- **Categories:** Developer tools, SEO tools, Automation
- **Stats:** 1 total users, 0 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $0.70 / 1,000 chart entries

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.
Since this Actor supports Apify Store discounts, the price gets lower the higher subscription plan you have.

Learn more: https://docs.apify.com/actors/running/actors-in-store.md#pay-per-event

## What's an Apify Actor?

An Actor is a serverless cloud program that runs on the Apify platform. It has two run modes.
In Batch mode, an Actor accepts a well-defined JSON input, performs an action which can take anything from a few seconds to a few hours,
and optionally produces a well-defined JSON output, datasets with results, or files in key-value store.
In Standby mode, an Actor provides a web server which can be used as a website, API, or an MCP server.

Apify vocabulary and the platform model are defined once, in the agent quickstart at https://apify.com/agents.md.

## How to integrate an Actor?

If asked about integration, you help developers integrate Actors into their projects.
You adapt to their stack and deliver integrations that are safe, well-documented, and production-ready.

Do not guess an integration path. Every one of them is in the agent quickstart at https://apify.com/agents.md: the Apify MCP server, Agent Skills with the Apify CLI, the JavaScript and Python clients, the REST API, and the account-free path for an agent with no human to sign in. It also carries the rule on stating cost before the first paid run.

For examples already wired to this Actor's own input schema, see the [API](#api) section below.

Each client library has reference documentation the quickstart does not restate: [JavaScript/TypeScript](https://docs.apify.com/api/client/js/docs.md) (`npm install apify-client`) and [Python](https://docs.apify.com/api/client/python/docs.md) (`pip install apify-client`).

# README

## Google Play Top Charts Scraper: Rankings by Country

Track **Google Play top charts**: Top Free, Top Paid and Top Grossing apps and games, in **57 countries** and **54 categories**, with rank, rating, installs, price, developer and age rating.

Read from the Play Store's own chart data, the same data the Play Store draws its Top charts from. No API key, no login, no Google account.

### What you get per app

One row per charting app:

```json
{
  "rank": 1,
  "country": "US",
  "chart": "top-free",
  "category": "all-apps",
  "appId": "com.openai.chatgpt",
  "title": "ChatGPT",
  "developer": "OpenAI",
  "genre": "Productivity",
  "rating": 4.78,
  "installs": "1,000,000,000+",
  "minInstalls": 1000000000,
  "contentRating": "Teen",
  "price": 0,
  "currency": "USD",
  "isFree": true,
  "inAppPurchases": "$8.00 - $100.00 per item",
  "url": "https://play.google.com/store/apps/details?id=com.openai.chatgpt&gl=us",
  "store": "google-play",
  "chartedAt": "2026-09-15T10:00:00Z"
}
```

| Field | What it is |
|---|---|
| `rank` | position in the chart, 1 is top |
| `country` | the country the chart was read for |
| `chart` | `top-free`, `top-paid` or `top-grossing` |
| `category` | the Play category; `all-apps` and `all-games` are the overall charts |
| `appId` | the package name, stable across runs and countries: the key to join on |
| `title`, `developer`, `genre` | as Google Play shows them |
| `rating` | average stars, 0 to 5 |
| `installs` | the install band exactly as Google prints it, e.g. `10,000,000+` |
| `minInstalls` | the same band as a number, for sorting |
| `contentRating` | age rating in that country |
| `price`, `currency`, `isFree` | 0 for free apps |
| `inAppPurchases` | the in-app purchase price range, when the app sells any |
| `summary` | the listing's description as plain text |
| `icon`, `url` | icon image and the app's Play Store page |
| `chartedAt` | when this ranking was read, so daily runs stack into a rank history |

### Full app details, optional

Turn on `includeDetails` and each charting app's own Play page is read too, adding what the chart itself does not carry:

```json
{
  "ratingCount": 60498356,
  "reviewCount": 66564,
  "ratingHistogram": {"1": 2503569, "2": 673927, "3": 1796945, "4": 5550701, "5": 49973043},
  "exactInstalls": 1567613533,
  "releasedAt": "2023-07-26",
  "updatedAt": "2026-09-11T04:21:47Z",
  "version": "1.2026.251",
  "minAndroidVersion": "7.1",
  "containsAds": true,
  "developerEmail": "support@openai.com",
  "developerWebsite": "https://help.openai.com",
  "developerUrl": "https://play.google.com/store/apps/dev?id=7577165439232992817",
  "privacyPolicyUrl": "https://openai.com/policies/privacy-policy"
}
```

- **Exact installs, not the band**: `exactInstalls` is Google's own count, so two apps both shown as `1,000,000,000+` can be told apart.
- **Developer contact on every row**: the support email and website each developer publishes, for outreach to the publishers climbing a chart.
- **Same price per row.** Pages are read four at a time and each app once per country, so a Top 100 with details takes well under a minute.
- An app with no page in that country gets a `detailsNote` saying so, and still counts as its chart row.

### Compare markets in one run

```json
{
  "countries": ["us", "gb", "de", "jp", "br", "in"],
  "charts": ["top-free", "top-grossing"],
  "categories": ["all-games"],
  "limit": 100
}
```

Twelve charts in one run: the same category across six markets, downloads and revenue side by side.

### Built to be scheduled

A chart is a snapshot; the story is in how it moves. Schedule this daily and every row carries `chartedAt`, so consecutive runs become a rank history with no extra work: who is climbing, who is falling out, who just entered the top 10.

### Pricing

**$1.00 per 1,000 chart entries**, pay per result, lower on higher Apify plans. No subscription and no minimum.

- A chart that could not be read, and an input value that is not recognised, each come back as an **unbilled** error row that says which one and why.
- `maxItems` puts a hard ceiling on the whole run. It stops cleanly there and nothing beyond it is fetched or charged.
- A daily US Top Free chart of 100 apps costs about $3 a month.

### Options

- **Charts**: Top Free, Top Paid, Top Grossing
- **Categories**: 54, from `all-apps` and `all-games` to every games genre, `finance`, `shopping`, `health-and-fitness`, `education` and the rest
- **Countries**: 57, listed below
- **Apps per chart**: up to 200, Google's own ceiling
- **App details**: `includeDetails` adds rating count, exact installs, release and update dates and developer contact to every row

### Countries

United States, United Kingdom, Canada, Australia, India, Germany, France, Spain, Italy, Netherlands, Sweden, Norway, Denmark, Finland, Poland, Portugal, Ireland, Austria, Switzerland, Belgium, Czechia, Romania, Hungary, Greece, Turkey, Saudi Arabia, United Arab Emirates, Egypt, South Africa, Nigeria, Kenya, Brazil, Mexico, Argentina, Colombia, Chile, Peru, Japan, South Korea, Taiwan, Hong Kong, Singapore, Malaysia, Thailand, Vietnam, Philippines, Indonesia, New Zealand, Russia, Ukraine, Kazakhstan, Pakistan, Bangladesh, Sri Lanka, Qatar, Kuwait, Morocco.

**Why a list and not any code.** Google Play answers a country it does not recognise with a different country's chart, not an error. A tool that passes any code through will sooner or later bill you for the wrong market and never say so. Every country here was checked against Google's own answer, and one that came back identical to the unknown-country answer (Israel) was left out rather than guessed at.

### Use cases

- **ASO and competitor tracking**: see the day a rival enters or drops out of your category's chart
- **Market research**: find what is winning in Brazil or Japan before it reaches the US
- **Mobile games**: watch Top Grossing by genre across markets
- **Publisher and investor intelligence**: which developers own a category, and how installs bands move
- **Both stores**: pair it with [App Store Top Charts Scraper](https://apify.com/glitchbound/app-charts-scraper); `store` and a matching row shape make the two join cleanly

### Honest limits

- **Rating count, release date and developer contact come from each app's own page**, so they are there only with `includeDetails` on. For reviews and screenshots use [App Store & Google Play Scraper](https://apify.com/glitchbound/app-store-scraper).
- **Up to 200 apps per chart.** Asking for more returns 200, which is all Google serves.
- **A chart some countries do not have** (a small category in a small market) comes back as an unbilled error row, not as an empty result.

### FAQ

**Do I need a Google account or an API key?** No.

**Is it the real ranking?** Yes. It is the same chart data the Play Store shows, read at the moment of the run and stamped with `chartedAt`.

**How fast is it?** About one second per chart. A run of 50 charts finishes in about a minute. With `includeDetails`, add about a quarter of a second per app.

**Can I get the developer's email?** Yes: turn on `includeDetails` and each row carries `developerEmail` and `developerWebsite`, as the developer publishes them on Google Play.

**Can I get the iOS App Store too?** Yes, with [App Store Top Charts Scraper](https://apify.com/glitchbound/app-charts-scraper), same row shape.

### Use it from an AI agent

This Actor is a ready-made tool for Claude, ChatGPT, Cursor or any other MCP
client, through Apify's MCP server. Add it as a connector at:

```
https://mcp.apify.com?tools=glitchbound/google-play-charts-scraper
```

In Cursor or VS Code the same address goes in `mcp.json`:

```json
{ "mcpServers": { "apify": { "url": "https://mcp.apify.com?tools=glitchbound/google-play-charts-scraper" } } }
```

The first call asks you to sign in to Apify, or takes an API token. From then
on the agent sees this Actor's input fields and calls it directly.

### Feedback

If this saved you time, a review on the Actor's Store page helps other people
find it. If something is missing or wrong, the Issues tab on the same page is
the fastest way to reach me, and it gets read.

# Actor input Schema

## `countries` (type: `array`):

Which Google Play countries to read, 57 verified. Add several to compare the same chart across markets in one run. Only countries whose chart was checked against Google's own answer are offered: Google answers an unknown country with another country's chart, not an error.

## `charts` (type: `array`):

Top Free and Top Paid rank by downloads; Top Grossing ranks by revenue.

## `categories` (type: `array`):

Play categories, 54 of them. all-apps and all-games are the overall charts.

## `limit` (type: `integer`):

How many ranked apps to return per chart. Google serves up to 200.

## `includeDetails` (type: `boolean`):

Also read each charting app's own Play page and add the rating count, review count, star histogram, exact install count, release and last-update dates, version, whether it shows ads, and the developer's email, website and privacy policy. Same price per row; about a quarter of a second more per app. Each app is read once per country, however many charts it is in.

## `maxItems` (type: `integer`):

A hard ceiling on rows for the entire run, across every chart. The run stops cleanly when it is reached and nothing beyond that point is fetched or charged. Leave empty for no ceiling.

## `proxyConfiguration` (type: `object`):

Proxy settings.

## Actor input object example

```json
{
  "countries": [
    "us"
  ],
  "charts": [
    "top-free"
  ],
  "categories": [
    "all-apps"
  ],
  "limit": 100,
  "includeDetails": false,
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}
```

# Actor output Schema

## `results` (type: `string`):

Top Free, Paid and Grossing Google Play chart positions by country and category.

# API

You can run this Actor programmatically using our API. Below are code examples in JavaScript, Python, and CLI, as well as the OpenAPI specification and MCP server setup.

## JavaScript example

```javascript
import { ApifyClient } from 'apify-client';

// Initialize the ApifyClient with your Apify API token
// Replace the '<YOUR_API_TOKEN>' with your token
const client = new ApifyClient({
    token: '<YOUR_API_TOKEN>',
});

// Prepare Actor input
const input = {
    "countries": [
        "us"
    ],
    "charts": [
        "top-free"
    ],
    "categories": [
        "all-apps"
    ],
    "limit": 100
};

// Run the Actor and wait for it to finish
const run = await client.actor("glitchbound/google-play-charts-scraper").call(input);

// Fetch and print Actor results from the run's dataset (if any)
console.log('Results from dataset');
console.log(`💾 Check your data here: https://console.apify.com/storage/datasets/${run.defaultDatasetId}`);
const { items } = await client.dataset(run.defaultDatasetId).listItems();
items.forEach((item) => {
    console.dir(item);
});

// 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/js/docs

```

## Python example

```python
from apify_client import ApifyClient

# Initialize the ApifyClient with your Apify API token
# Replace '<YOUR_API_TOKEN>' with your token.
client = ApifyClient("<YOUR_API_TOKEN>")

# Prepare the Actor input
run_input = {
    "countries": ["us"],
    "charts": ["top-free"],
    "categories": ["all-apps"],
    "limit": 100,
}

# Run the Actor and wait for it to finish
run = client.actor("glitchbound/google-play-charts-scraper").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print(f"💾 Check your data here: https://console.apify.com/storage/datasets/{run.default_dataset_id}")
for item in client.dataset(run.default_dataset_id).iterate_items():
    print(item)

# 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/python/docs/quick-start

```

## CLI example

```bash
echo '{
  "countries": [
    "us"
  ],
  "charts": [
    "top-free"
  ],
  "categories": [
    "all-apps"
  ],
  "limit": 100
}' |
apify call glitchbound/google-play-charts-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,glitchbound/google-play-charts-scraper"
        }
    }
}
```

The hosted server signs you in with OAuth on first connect, so no API token belongs in this config. Clients without OAuth support can send an `Authorization: Bearer <APIFY_API_TOKEN>` header instead, using a token from API & Integrations in Apify Console (https://console.apify.com/settings/integrations).

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/actors/yC8ZiNowcKubjRgeb/builds/5hgVmvMc6OAoIn4Lg/openapi.json
