# Google Play Scraper & ASO Rank Tracker: Keywords, Charts (`s_actors/google-play-scraper`) Actor

Track where apps rank on Google Play for any keyword and country, get ASO keyword ideas, monitor top charts, and scrape app details and reviews. Only-changes mode reports ranking moves and new reviews since the last run.

- **URL**: https://apify.com/s\_actors/google-play-scraper.md
- **Developed by:** [Superior Actors](https://apify.com/s_actors) (community)
- **Categories:** Developer tools, SEO tools, Automation
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 1 bookmarks
- **User rating**: 5.00 out of 5 stars

## Pricing

Pay per event

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.

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 Scraper & ASO Rank Tracker

Track **where your app ranks on Google Play** for every keyword and country, find **ASO keyword ideas** straight from the Play Store search box, and monitor **top charts**. The same Actor also scrapes **app details** and **reviews**, so one tool covers keyword research, rank tracking, competitor analysis and review monitoring.

Schedule it daily with **Only report changes** and get just the moves: apps that went up or down, entered or dropped out of the results, and new reviews since the last run.

Export as **JSON, CSV, Excel or HTML**, or use it as a **Google Play API**. No browser, no Google account, no API key.

#### How it works

1. Choose what to do: **Keyword rankings**, **Keyword suggestions**, **Top charts**, **App details** or **Reviews**
2. Enter keywords (for rankings and suggestions) and your app plus competitors, e.g. `com.duolingo` or a Play Store link
3. Add countries: `us`, `gb`, `de`, `in`, `br`... (rankings differ by country)
4. Optional: switch on **Only report changes** and schedule the task daily

#### Why this Actor

| | |
|---|---|
| 📈 **Keyword rank tracking** | Position of your app and competitors in Google Play search, per keyword and country |
| 🔑 **Keyword research** | Play Store search suggestions for any seed, with A-Z expansion for long-tail keywords |
| 🏆 **Top charts** | Top free, paid and grossing, any of 51 categories, any country, up to 200 positions |
| 🔔 **Only changes** | Scheduled runs return only ranking moves, apps entering or leaving, and new reviews |
| 📱 **App details** | Rating, rating histogram, exact installs, price, developer contacts, chart badge, update date |
| 💬 **Reviews** | Newest, most relevant or by rating, with developer replies and app version |
| 🌍 **Any country and language** | One run can cover many keywords × many countries |
| 💰 **Cheaper than ASO tools** | Pay per check instead of a monthly ASO subscription |

#### Use cases

- **ASO rank tracking**: daily positions of your app for your target keywords in every market
- **Competitor tracking**: see which competitors outrank you, and when they move
- **Keyword research**: find what users type in the Play Store before you write your listing
- **Market research**: top charts by category and country, new apps entering the charts
- **Review monitoring**: get new reviews of your app or competitors every day, with ratings and replies
- **AI agents**: give your assistant live Google Play data through the Apify MCP server

#### Keyword rankings

One row per keyword, country and app. Example: language apps for two keywords in two countries.

| Keyword | Country | Duolingo | Babbel | Busuu |
|---|---|---|---|---|
| language learning | us | 1 | 2 | 6 |
| language learning | de | 1 | 3 | 6 |
| learn spanish | us | 1 | 6 | 12 |
| learn spanish | de | 3 | 9 | 10 |

| Field | Description |
|---|---|
| `keyword`, `country`, `language` | The search |
| `position` | Place in Google Play search results (1-30), empty if the app is not in the results |
| `inResults`, `isTrackedApp` | Found in results; one of your listed apps |
| `appId`, `title`, `developer`, `rating`, `installs`, `category`, `price`, `free` | The app as shown in results |
| `resultsCount` | How many apps Google shows for this keyword (fewer = less competition) |
| `searchUrl`, `url` | The search and the app on Google Play |

With apps listed, you get one row per tracked app (`onlyTrackedApps`). Leave the apps empty, or switch that option off, to get the whole top 30 for each keyword.

#### Keyword suggestions

One row per keyword idea. Example for the seed `photo editor` (US): `photo editor free`, `photo editor app`, `photo editor ai`, `photo editor and collage maker`, `photo editor background change`, `photo editor blur`... With **Expand suggestions A-Z** one seed gave 126 keywords.

| Field | Description |
|---|---|
| `seed`, `keyword`, `rank` | Your seed, the suggested keyword and its order |
| `suggestedFor` | The query that produced it, e.g. `photo editor b` |
| `searchUrl` | The keyword's search results on Google Play |

#### Top charts

One row per app and position. Example, US, September 2026:

| Chart | Category | # | App | Developer |
|---|---|---|---|---|
| Top free | All apps | 1 | Muse from Meta | Meta Platforms, Inc. |
| Top free | All apps | 3 | ChatGPT | OpenAI |
| Top grossing | All apps | 1 | Google One | Google LLC |
| Top grossing | Puzzle games | 2 | Royal Match | Dream Games, Ltd. |

Fields: `chart` (`top_free`, `top_paid`, `top_grossing`), `chartCategory`, `country`, `position`, `chartSize` and the app fields above.

Category IDs: `APPLICATION` (all apps), `GAME` (all games), `ART_AND_DESIGN`, `AUTO_AND_VEHICLES`, `BEAUTY`, `BOOKS_AND_REFERENCE`, `BUSINESS`, `COMICS`, `COMMUNICATION`, `DATING`, `EDUCATION`, `ENTERTAINMENT`, `EVENTS`, `FINANCE`, `FOOD_AND_DRINK`, `HEALTH_AND_FITNESS`, `HOUSE_AND_HOME`, `LIBRARIES_AND_DEMO`, `LIFESTYLE`, `MAPS_AND_NAVIGATION`, `MEDICAL`, `MUSIC_AND_AUDIO`, `NEWS_AND_MAGAZINES`, `PARENTING`, `PERSONALIZATION`, `PHOTOGRAPHY`, `PRODUCTIVITY`, `SHOPPING`, `SOCIAL`, `SPORTS`, `TOOLS`, `TRAVEL_AND_LOCAL`, `VIDEO_PLAYERS`, `WEATHER`, and games: `GAME_ACTION`, `GAME_ADVENTURE`, `GAME_ARCADE`, `GAME_BOARD`, `GAME_CARD`, `GAME_CASINO`, `GAME_CASUAL`, `GAME_EDUCATIONAL`, `GAME_MUSIC`, `GAME_PUZZLE`, `GAME_RACING`, `GAME_ROLE_PLAYING`, `GAME_SIMULATION`, `GAME_SPORTS`, `GAME_STRATEGY`, `GAME_TRIVIA`, `GAME_WORD`.

#### Only report changes (monitoring)

Switch on **Only report changes** and schedule the task. The first run saves the positions (rows marked `new`); every later run returns only what changed:

| Field | Description |
|---|---|
| `change` | `up`, `down`, `entered` (appeared in results or chart), `dropped_out`, `new` (first run) |
| `position`, `previousPosition` | Now and at the last run |
| `positionChange` | Places gained (positive) or lost (negative) |

Example of a daily chart alert:

| App | Change | Was | Now | Moved |
|---|---|---|---|---|
| Duolingo | up | 6 | 1 | +5 |
| ParentSquare | down | 1 | 6 | -5 |

Set **Minimum position change** to ignore small moves. In reviews mode, monitoring returns only reviews newer than the last run. Use a different **Monitor name** for each scheduled task.

#### App details

| Field | Description |
|---|---|
| `title`, `appId`, `category`, `categoryId`, `url` | The app |
| `rating`, `ratingsCount`, `reviewsCount`, `ratingHistogram` | e.g. `4.73`, `49,101,876` ratings, stars 1-5 counts |
| `installs`, `minInstalls`, `realInstalls` | `500,000,000+` and the exact number, e.g. `969,191,177` |
| `price`, `currency`, `free`, `inAppPurchases`, `containsAds` | e.g. `0`, `USD`, `$0.99 - $239.99 per item` |
| `chartBadge` | e.g. `#1 top free education` |
| `developer`, `developerId`, `developerWebsite`, `developerEmail`, `developerAddress`, `developerPhone` | Developer and contacts |
| `released`, `releasedAt`, `updatedAt`, `recentChanges` | Dates and "What's new" |
| `shortDescription`, `description`, `icon`, `headerImage`, `screenshots`, `video`, `privacyPolicy` | Listing content |
| `contentRating`, `contentRatingNotes` | e.g. `Everyone`, `Users Interact, In-App Purchases` |
| `similarApps` | App IDs of similar apps |

#### Reviews

| Field | Description |
|---|---|
| `reviewId`, `userName`, `userImage` | The review and its author |
| `score`, `text`, `at` | Stars 1-5, text and date |
| `thumbsUp`, `appVersion` | "Helpful" votes and the app version reviewed |
| `replyText`, `repliedAt` | Developer reply, if any |

#### Pricing

Pay per result, no subscription:

| Event | Price |
|---|---|
| Run start | $0.003 |
| Keyword ranking check (1 keyword × 1 country, top 30) | $0.002 |
| Keyword suggestion query (up to 10 ideas) | $0.0005 |
| Top chart (1 chart × category × country, up to 200 apps) | $0.003 |
| App details | $0.001 per app |
| Review | $0.10 per 1,000 |

Examples:

| Task | Cost |
|---|---|
| 20 keywords × 3 countries, checked daily for 30 days | ~$3.70 per month |
| Keyword research: 5 seeds with A-Z expansion (~600 ideas) | ~$0.07 |
| Top 200 free and grossing in 10 categories, 1 country | ~$0.06 |
| 10,000 reviews | ~$1.00 |

#### Ready-made tasks

Open one, change the inputs, and run or schedule it:

- [Google Play ASO Keyword Rank Tracker: You vs Competitors](https://apify.com/s_actors/google-play-scraper/examples/aso-keyword-rank-tracker)
- [Google Play Keyword Research: ASO Keyword Ideas](https://apify.com/s_actors/google-play-scraper/examples/google-play-keyword-research)
- [Top 30 Apps for Any Keyword on Google Play](https://apify.com/s_actors/google-play-scraper/examples/top-apps-for-any-keyword)
- [Google Play Keyword Rankings in 10 Countries](https://apify.com/s_actors/google-play-scraper/examples/google-play-rankings-by-country)
- [Google Play Ranking Alerts: Daily Keyword Position Changes](https://apify.com/s_actors/google-play-scraper/examples/google-play-ranking-drop-alerts)
- [Google Play Top Charts by Country: Free, Paid, Grossing](https://apify.com/s_actors/google-play-scraper/examples/google-play-top-charts)
- [Top Grossing Mobile Games on Google Play by Genre](https://apify.com/s_actors/google-play-scraper/examples/top-grossing-mobile-games)
- [New Apps Entering Google Play Top Charts: Daily Alerts](https://apify.com/s_actors/google-play-scraper/examples/new-apps-in-top-charts)
- [Where Your App Ranks in Its Google Play Category Chart](https://apify.com/s_actors/google-play-scraper/examples/app-category-rankings)
- [Google Play Reviews Scraper with Developer Replies](https://apify.com/s_actors/google-play-scraper/examples/google-play-reviews-scraper)

#### Input example

```json
{
    "mode": "keyword_rankings",
    "keywords": ["language learning", "learn spanish"],
    "appIds": ["com.duolingo", "com.babbel.mobile.android.en"],
    "countries": ["us", "de"],
    "onlyChanges": true,
    "monitorName": "language-apps"
}
```

#### Tips

- **App ID** is the `id=` part of the Play Store link: `play.google.com/store/apps/details?id=com.duolingo` → `com.duolingo`. Links work too.
- Google Play web search shows **30 results** per keyword; positions beyond 30 are reported as not ranked.
- Rankings are personalised by country and language: set both to match your market.
- For daily tracking, create a task per project, switch on **Only report changes** and add a schedule. Send results to email, Slack or [Google Sheets](https://apify.com/s_actors/google-sheets-import-export) with integrations.
- iPhone too: [App Store Scraper & ASO](https://apify.com/s_actors/app-store-scraper) finds every keyword an iOS app ranks for, with the same rank tracking and monitoring.

#### Use with the API and AI agents

Run it via the [Apify API](https://docs.apify.com/api/v2) from Python, Node.js or any HTTP client, or connect it to Claude, ChatGPT and other AI agents through the [Apify MCP server](https://mcp.apify.com): "Where does my app com.example rank for 'budget planner' in the US and UK?"

#### Is it legal?

The Actor collects only public data shown on Google Play to any visitor, without logging in. Reviews contain user names chosen by their authors; if you store or process them, make sure you comply with GDPR and other applicable laws.

# Actor input Schema

## `mode` (type: `string`):

Keyword rankings: where apps rank in Google Play search for each keyword and country (ASO rank tracking). Keyword suggestions: keyword ideas from the Play Store search box. Top charts: top free, paid and grossing apps by category and country. App details: full app pages. Reviews: user reviews with developer replies.

## `keywords` (type: `array`):

Keyword rankings: the search terms to check, one per line. Keyword suggestions: seed keywords to expand.

## `appIds` (type: `array`):

Package names (com.duolingo) or Play Store links. Keyword rankings and top charts: your app and competitors to track (leave empty to get every ranked app). App details and reviews: the apps to scrape.

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

Two-letter country codes, one per line: us, gb, de, in, br... Rankings, charts and prices differ by country. Default: us.

## `language` (type: `string`):

Play Store language code (en, de, es, pt-BR, ru...). Affects titles, descriptions, suggestions and which reviews you get.

## `onlyTrackedApps` (type: `boolean`):

With apps listed above, keyword rankings and top charts return one row per tracked app (its position, or empty if not ranked). Turn off to get every ranked app with a tracked flag.

## `expandSuggestions` (type: `boolean`):

Keyword suggestions: also ask for "seed a", "seed b" ... "seed z" to find long-tail keywords (27 queries per seed instead of 1).

## `chartCollections` (type: `array`):

Top charts mode: which charts to get.

## `chartCategories` (type: `array`):

Top charts mode: category IDs, one per line. APPLICATION = all apps, GAME = all games, or e.g. EDUCATION, FINANCE, GAME\_PUZZLE. Full list: APPLICATION, GAME, ART\_AND\_DESIGN, AUTO\_AND\_VEHICLES, BEAUTY, BOOKS\_AND\_REFERENCE, BUSINESS, COMICS, COMMUNICATION, DATING, EDUCATION, ENTERTAINMENT, EVENTS, FINANCE, FOOD\_AND\_DRINK, HEALTH\_AND\_FITNESS, HOUSE\_AND\_HOME, LIBRARIES\_AND\_DEMO, LIFESTYLE, MAPS\_AND\_NAVIGATION, MEDICAL, MUSIC\_AND\_AUDIO, NEWS\_AND\_MAGAZINES, PARENTING, PERSONALIZATION, PHOTOGRAPHY, PRODUCTIVITY, SHOPPING, SOCIAL, SPORTS, TOOLS, TRAVEL\_AND\_LOCAL, VIDEO\_PLAYERS, WEATHER, GAME\_ACTION, GAME\_ADVENTURE, GAME\_ARCADE, GAME\_BOARD, GAME\_CARD, GAME\_CASINO, GAME\_CASUAL, GAME\_EDUCATIONAL, GAME\_MUSIC, GAME\_PUZZLE, GAME\_RACING, GAME\_ROLE\_PLAYING, GAME\_SIMULATION, GAME\_SPORTS, GAME\_STRATEGY, GAME\_TRIVIA, GAME\_WORD.

## `chartSize` (type: `integer`):

Top charts mode: how many positions to get (up to 200).

## `maxReviewsPerApp` (type: `integer`):

Reviews mode: how many reviews to get for each app and country.

## `reviewSort` (type: `string`):

Reviews mode: order of the reviews. With "Only report changes" reviews are always newest first.

## `onlyChanges` (type: `boolean`):

For scheduled runs. The first run saves positions (or the latest review); later runs return only apps that moved up or down, entered or dropped out of the results or chart, and only new reviews. No noise, just the changes.

## `minPositionChange` (type: `integer`):

Report a ranking move only if the app moved at least this many places.

## `monitorName` (type: `string`):

Separate monitors keep separate memory. Use a different name for each scheduled task.

## `maxConcurrency` (type: `integer`):

How many requests run at the same time.

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

Requests go direct first; the proxy is used only when Google refuses a direct request.

## Actor input object example

```json
{
  "mode": "keyword_rankings",
  "keywords": [
    "language learning",
    "learn spanish"
  ],
  "appIds": [
    "com.duolingo",
    "com.babbel.mobile.android.en"
  ],
  "countries": [
    "us"
  ],
  "language": "en",
  "onlyTrackedApps": true,
  "expandSuggestions": false,
  "chartCollections": [
    "top_free"
  ],
  "chartCategories": [
    "APPLICATION"
  ],
  "chartSize": 100,
  "maxReviewsPerApp": 100,
  "reviewSort": "newest",
  "onlyChanges": false,
  "minPositionChange": 1,
  "monitorName": "default",
  "maxConcurrency": 5,
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}
```

# Actor output Schema

## `rankings` (type: `string`):

One row per keyword, country and app: position in Google Play search.

## `suggestions` (type: `string`):

Keyword ideas from Play Store search suggestions.

## `charts` (type: `string`):

Top free, paid or grossing apps by position.

## `changes` (type: `string`):

Only ranking moves, apps entering or dropping out (monitoring).

## `apps` (type: `string`):

Full app details: ratings, installs, developer, price.

## `reviews` (type: `string`):

User reviews with developer replies.

## `all` (type: `string`):

Every field of every row.

# 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 = {
    "keywords": [
        "language learning",
        "learn spanish"
    ],
    "appIds": [
        "com.duolingo",
        "com.babbel.mobile.android.en"
    ],
    "countries": [
        "us"
    ],
    "chartCategories": [
        "APPLICATION"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("s_actors/google-play-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 = {
    "keywords": [
        "language learning",
        "learn spanish",
    ],
    "appIds": [
        "com.duolingo",
        "com.babbel.mobile.android.en",
    ],
    "countries": ["us"],
    "chartCategories": ["APPLICATION"],
}

# Run the Actor and wait for it to finish
run = client.actor("s_actors/google-play-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 '{
  "keywords": [
    "language learning",
    "learn spanish"
  ],
  "appIds": [
    "com.duolingo",
    "com.babbel.mobile.android.en"
  ],
  "countries": [
    "us"
  ],
  "chartCategories": [
    "APPLICATION"
  ]
}' |
apify call s_actors/google-play-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,s_actors/google-play-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/g4muU4XcbX8iuwcnc/builds/jH6bmzTfOiHVgA2Ca/openapi.json
