# Google Play Scraper — Apps, Ratings, Installs & Developers (`tagadanar/google-play-scraper`) Actor

Scrape Google Play apps from search terms, package names or developers: rating, histogram, installs, price, in-app purchases, ads, content rating, dates, version, developer email, website and address, description, screenshots and search rank. $0.50 per 1,000 apps + $0.001/run.

- **URL**: https://apify.com/tagadanar/google-play-scraper.md
- **Developed by:** [Tagada Data](https://apify.com/tagadanar) (community)
- **Categories:** Developer tools, Lead generation, E-commerce
- **Security:** Limited permissions
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $0.35 / 1,000 apps

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 Scraper — Apps, Ratings, Installs & Developers

Scrape **Google Play Store apps** with full details in one flat row per app. Start from **search terms**, **package names / app links**, or **developers** (name, numeric id or developer page), in any country and language. No login, no API key, no browser.

### What you get

| Feature | What it means |
|-|-|
| **Search results with rank** | Every app on Google Play's search page for your keyword, in order, with `searchRank` (1 = first result) |
| **Full app details** | Title, rating, ratings and reviews counts, the 1-5 star histogram, installs (text, minimum and the more precise `maxInstalls`), price, currency, free flag, in-app purchase range, contains ads, content rating, release and update dates, version, minimum Android version |
| **Developer contact** | Developer name and id, email, website, legal name, address and phone when the app page shows them, privacy policy link |
| **Media and text** | Short summary, full description, what's new, icon, header image, every screenshot, promo video and its thumbnail |
| **Whole developer catalogues** | Give a developer and get all their apps (up to 500), not just the first 20 the page shows |
| **Named misses** | A package Google Play does not know is named in the run status and never charged |

### How to use it

1. Add **search terms** (e.g. `meditation`, `photo editor`), and/or **apps** (`com.spotify.music` or the `play.google.com/store/apps/details?id=…` link), and/or **developers** (`Spotify AB`, `5700313618786177705`, or the developer page link).
2. Pick the **country** (`us`, `gb`, `de`, `in`, `br`…) and **language** (`en`, `de`, `pt-BR`…). Prices, currency, availability and search results follow the country.
3. Set **max apps per search term** (Google Play's search page holds about 20-30 apps) and **max apps per developer**.
4. Run it, then export to JSON, CSV or Excel, or read it over the API.

### Input example

```json
{
    "searchTerms": ["meditation"],
    "apps": ["com.spotify.music", "https://play.google.com/store/apps/details?id=com.mojang.minecraftpe"],
    "developers": ["Spotify AB"],
    "country": "us",
    "language": "en",
    "maxResultsPerSearch": 10,
    "maxAppsPerDeveloper": 100
}
```

### Output example

```json
{
    "packageName": "com.mojang.minecraftpe",
    "title": "Minecraft: Dream it, Build it!",
    "url": "https://play.google.com/store/apps/details?id=com.mojang.minecraftpe",
    "developer": "Mojang",
    "developerId": "4772240228547998649",
    "developerUrl": "https://play.google.com/store/apps/dev?id=4772240228547998649",
    "developerEmail": "help@minecraft.net",
    "developerWebsite": "http://help.mojang.com",
    "developerLegalName": "Microsoft Corporation",
    "developerAddress": "1 Microsoft Way\nRedmond, WA 98052\nUnited States",
    "developerPhone": "+1 800-642-7676",
    "privacyPolicyUrl": "http://go.microsoft.com/fwlink/?LinkId=521839",
    "genre": "Arcade",
    "genreId": "GAME_ARCADE",
    "rating": 4.3037324,
    "ratingsCount": 5873494,
    "reviewsCount": 635219,
    "histogram": { "1": 628829, "2": 178964, "3": 270729, "4": 495824, "5": 4299132 },
    "installs": "50,000,000+",
    "minInstalls": 50000000,
    "maxInstalls": 99893702,
    "free": false,
    "price": 6.99,
    "currency": "USD",
    "priceText": "$6.99",
    "originalPrice": null,
    "offersInAppPurchases": true,
    "inAppPurchaseRange": "$0.99 - $49.99 per item",
    "containsAds": false,
    "contentRating": "Everyone 10+",
    "contentRatingDescription": "Fantasy Violence",
    "released": "Aug 15, 2011",
    "releasedDate": "2011-08-15",
    "updated": "2026-10-21T17:09:47.000Z",
    "version": "1.26.60.4",
    "minAndroidVersion": "8.0",
    "summary": "Millions of crafters have smashed billions of blocks! Now you can join the fun!",
    "description": "Dive into an open world of building, crafting, and survival…",
    "whatsNew": "What's new in 26.60: Various bug fixes!",
    "icon": "https://play-lh.googleusercontent.com/…",
    "headerImage": "https://play-lh.googleusercontent.com/…",
    "screenshots": ["https://play-lh.googleusercontent.com/…"],
    "video": "https://play.google.com/video/lava/web/player/yt:movie:BLtLrFNRE-E?autoplay=1&embed=play",
    "videoThumbnail": "https://play-lh.googleusercontent.com/…",
    "source": "app",
    "searchTerm": null,
    "searchRank": null,
    "developerQuery": null,
    "country": "us",
    "language": "en",
    "scrapedAt": "2026-10-30T21:40:00.000Z"
}
```

Rows from a search carry `source: "search"`, the `searchTerm` and its `searchRank`; rows from a developer carry `source: "developer"` and the `developerQuery` you gave. An app found by two sources is one row per source (its details page is read once).

#### Field notes

- `version` is `"Varies with device"` when the developer ships per-device builds (Google Play then shows no single version).
- `maxInstalls` is Google Play's own, more precise install figure behind the rounded `installs` label.
- The developer address and phone appear only when the app page shows them.
- Google Play no longer shows the download size on its web pages, so there is no size field.
- Text comes in the `language` you choose. `releasedDate` is parsed when the language is English.

### Pricing

**$0.50 per 1,000 apps** + $0.001 per run, usage included. Store discounts apply: $0.45 Bronze, $0.40 Silver, **$0.35 Gold** per 1,000.

You pay only for app rows delivered. Packages Google Play doesn't know, developers that don't exist, and failed requests are never charged. A run that finds nothing costs the $0.001 start.

### How it works and its limits

- **Search depth:** Google Play's web search shows **one page** of results per term, about 20-30 apps (up to 50 in some countries). It has no "next page", so `maxResultsPerSearch` above that returns what the page holds. The run status says how many apps each search listed.
- **Developers:** the developer page shows 20 apps; the scraper follows Google Play's own "more apps" call for the rest (89 apps for Google LLC in our test), up to `maxAppsPerDeveloper`.
- **Numeric developer ids** (`/store/apps/dev?id=…`) are resolved to the developer's name, then listed in full.
- **Top charts** are not offered: Google Play's chart call answered an error to every request we tried (October 2026).
- Requests go straight to Google Play, then through Apify's shared datacenter pool only if Google refuses. There is no proxy setting to configure.

### Run status

Each run ends with a status message naming what happened to every source:
`DELIVERED` (with the counts), Google Play's own **"No results"** for a term, **packages that answered 404** (named), **developers that don't exist**, and any request that failed (refused, rate-limited, page changed). A run that delivers nothing ends **FAILED** with the reason, unless Google Play proved there was nothing to return. A `RUN_SUMMARY` record in the key-value store lists every source with its outcome.

### Related actors

- [Google Play Reviews Scraper](https://apify.com/tagadanar/google-play-reviews-scraper): the reviews of any Google Play app.
- [App Store & Google Play Keyword Rank Tracker](https://apify.com/tagadanar/app-keyword-rank-tracker): where your apps rank for each keyword, in many countries, with rank changes over time.

### FAQ

**Do I need a Google account or API key?** No. The scraper reads Google Play's public pages.

**Can I get more than 30 results for a keyword?** No: Google Play's web search shows one page per keyword. Use several related keywords, or list whole developers.

**Which countries work?** Any country Google Play serves. A country it does not serve is named in the status.

# Changelog

This Actor's version history is a separate document: https://apify.com/tagadanar/google-play-scraper/changelog.md

# Actor input Schema

## `searchTerms` (type: `array`):

Keywords to search on Google Play (e.g. "meditation", "photo editor"). Each term returns the apps on Google Play's search page, in order, with their full details and searchRank. Google Play's web search shows one page of about 20-30 apps per term. Up to 100 terms per run.

## `apps` (type: `array`):

Google Play package names (com.spotify.music) or app links (https://play.google.com/store/apps/details?id=com.spotify.music). One full-details row each. A package Google Play does not know is named in the run status and not charged. Up to 1,000 per run.

## `developers` (type: `array`):

List every app of a developer: the developer name as shown on Google Play ("Spotify AB"), the numeric developer id (5700313618786177705), or the developer page link. Up to 50 per run.

## `country` (type: `string`):

Two-letter country code of the Google Play storefront (us, gb, de, in, br…). Sets prices, currency, availability and search results.

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

Language of titles, descriptions and search (en, de, fr, pt-BR, ja…).

## `maxResultsPerSearch` (type: `integer`):

How many apps to return per search term, from the top. Google Play's search page holds about 20-30 apps (up to 50 in some countries); you never get more than it shows.

## `maxAppsPerDeveloper` (type: `integer`):

How many apps to return per developer, in Google Play's order.

## Actor input object example

```json
{
  "searchTerms": [
    "meditation"
  ],
  "apps": [
    "com.spotify.music"
  ],
  "country": "us",
  "language": "en",
  "maxResultsPerSearch": 5,
  "maxAppsPerDeveloper": 100
}
```

# Actor output Schema

## `dataset` (type: `string`):

No description

# 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 = {
    "searchTerms": [
        "meditation"
    ],
    "apps": [
        "com.spotify.music"
    ],
    "maxResultsPerSearch": 5
};

// Run the Actor and wait for it to finish
const run = await client.actor("tagadanar/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 = {
    "searchTerms": ["meditation"],
    "apps": ["com.spotify.music"],
    "maxResultsPerSearch": 5,
}

# Run the Actor and wait for it to finish
run = client.actor("tagadanar/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 '{
  "searchTerms": [
    "meditation"
  ],
  "apps": [
    "com.spotify.music"
  ],
  "maxResultsPerSearch": 5
}' |
apify call tagadanar/google-play-scraper --silent --output-dataset

```

## MCP server setup

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