# Google Play Scraper - Apps, Reviews, Ratings & Search (`eccentric_layout/google-play-scraper`) Actor

Scrape Google Play Store app details, reviews, ratings, and search results without an API key. Export structured JSON/CSV/Excel. Built for ASO, app developers, and market research.

- **URL**: https://apify.com/eccentric\_layout/google-play-scraper.md
- **Developed by:** [Shahryar](https://apify.com/eccentric_layout) (community)
- **Categories:** Developer tools
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, NaN bookmarks
- **User rating**: No ratings yet

## Pricing

Pay per usage

This Actor is paid per platform usage. The Actor is free to use, and you only pay for the Apify platform usage, which gets cheaper the higher subscription plan you have.

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

## What's an Apify Actor?

Actors are a software tools running on the Apify platform, for all kinds of web data extraction and automation use cases.
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.
Actors are written with capital "A".

## 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.
The best way to integrate Actors is as follows.

In JavaScript/TypeScript projects, use official [JavaScript/TypeScript client](https://docs.apify.com/api/client/js.md):

```bash
npm install apify-client
```

In Python projects, use official [Python client library](https://docs.apify.com/api/client/python.md):

```bash
pip install apify-client
```

In shell scripts, use [Apify CLI](https://docs.apify.com/cli/docs.md):

````bash
# MacOS / Linux
curl -fsSL https://apify.com/install-cli.sh | bash
# Windows
irm https://apify.com/install-cli.ps1 | iex
```bash

In AI frameworks, you might use the [Apify MCP server](https://docs.apify.com/platform/integrations/mcp.md).

If your project is in a different language, use the [REST API](https://docs.apify.com/api/v2.md).

For usage examples, see the [API](#api) section below.

For more details, see Apify documentation as [Markdown index](https://docs.apify.com/llms.txt) and [Markdown full-text](https://docs.apify.com/llms-full.txt).


# README

## Google Play Scraper – Apps, Reviews, Ratings & Search

Extract structured data from the **Google Play Store** without an API key: full **app details**, **user reviews**, **ratings**, and **search results** for any keyword or app. Export to JSON, CSV, or Excel, or pull straight from the API.

Built for **app developers, ASO (App Store Optimization) specialists, market researchers, and data teams** who need reliable Google Play data at scale.

### What it does

- 🔎 **Search apps** by keyword and get every matching app.
- 📱 **App details** – complete metadata for any app (by package name / `appId`).
- ⭐ **Reviews** – scrape user reviews with rating, text, date, version, and developer replies.
- 🌍 **Any country & language** – choose the storefront (`country`) and text language (`language`).
- 🧱 **Clean, complete output** – ratings, install counts, genre, version, release date, content rating, IAP info, developer contact, and more.

### Why this scraper

Most Google Play scrapers return thin data or only reviews. This one returns **complete app records** (every search result is enriched with full app details) **and** deep reviews **and** keyword search — in one Actor, with residential-proxy reliability.

### Example input

```json
{
  "searchQueries": ["fitness tracker", "habit app"],
  "appIds": ["com.spotify.music", "com.whatsapp"],
  "maxAppsPerSearch": 50,
  "fullDetails": true,
  "scrapeReviews": true,
  "maxReviewsPerApp": 200,
  "country": "us",
  "language": "en"
}
````

### Example app output

```json
{
  "type": "app",
  "title": "Loop Habit Tracker",
  "appId": "org.isoron.uhabits",
  "developer": "Loop Habits",
  "score": 4.72,
  "ratings": 62458,
  "reviews": 3379,
  "installs": "5,000,000+",
  "genre": "Productivity",
  "version": "2.3.1",
  "released": "Feb 22, 2016",
  "contentRating": "Everyone",
  "developerEmail": "dev@loophabits.org",
  "offersIAP": false,
  "url": "https://play.google.com/store/apps/details?id=org.isoron.uhabits"
}
```

### Example review output

```json
{
  "type": "review",
  "appId": "org.isoron.uhabits",
  "userName": "Jane D.",
  "score": 5,
  "text": "Best habit tracker on Android.",
  "date": "2026-06-06T07:53:00.000Z",
  "thumbsUp": 12,
  "version": "2.3.1"
}
```

### Common use cases

- **ASO & keyword research** – track which apps rank for your target keywords.
- **Review analysis & sentiment** – export thousands of reviews for analysis.
- **Competitor monitoring** – watch ratings, versions, and install growth.
- **Market research** – build datasets of apps by category or keyword.
- **Lead generation** – collect developer contact details from app listings.

### Input reference

| Field | Type | Description |
|---|---|---|
| `searchQueries` | array | Keywords to search on Google Play. |
| `appIds` | array | Specific package names (e.g. `com.whatsapp`). |
| `maxAppsPerSearch` | integer | Max apps returned per query. |
| `fullDetails` | boolean | Enrich each result with complete app details (default `true`). |
| `scrapeReviews` | boolean | Also scrape reviews for every app found. |
| `maxReviewsPerApp` | integer | Max reviews per app. |
| `country` | string | Two-letter storefront country code (default `us`). |
| `language` | string | Two-letter language code (default `en`). |

### FAQ

**How do I scrape Google Play reviews?** Add `appIds` or `searchQueries`, set `scrapeReviews` to `true`, and set `maxReviewsPerApp`.

**Do I need a Google Play API key?** No. This Actor needs no API key or login.

**Can I scrape a whole category or keyword?** Yes — use `searchQueries` to pull all matching apps, then enable reviews if needed.

**Is the data fresh?** Reviews and app details are fetched live from Google Play at run time.

**What about reliability?** Use residential proxies (the default) for stable, large-scale runs.

# Actor input Schema

## `searchQueries` (type: `array`):

Keywords to search on Google Play, e.g. "fitness", "budget tracker". Each query returns matching apps.

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

Specific app package names to scrape full details for, e.g. "com.whatsapp", "com.spotify.music".

## `maxAppsPerSearch` (type: `integer`):

Maximum number of apps to return per search query.

## `fullDetails` (type: `boolean`):

Enrich every search result with complete app details (ratings, installs, genre, version, release date, histogram, etc.). Turn off for faster, cheaper runs that return only basic search fields.

## `scrapeReviews` (type: `boolean`):

If enabled, also scrape reviews for every app found (search results + app IDs).

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

Only used when 'Scrape reviews' is on. Maximum reviews to fetch per app.

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

Two-letter country code for the Google Play storefront (affects availability, price, language).

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

Two-letter language code for text fields (descriptions, reviews).

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

Google Play works well over Apify's datacenter proxy (cheap, default). For very large or sustained runs, switch to Residential to avoid rate limits.

## Actor input object example

```json
{
  "searchQueries": [
    "fitness tracker",
    "habit app"
  ],
  "appIds": [
    "com.whatsapp",
    "com.spotify.music"
  ],
  "maxAppsPerSearch": 50,
  "fullDetails": true,
  "scrapeReviews": false,
  "maxReviewsPerApp": 100,
  "country": "us",
  "language": "en",
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}
```

# 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 = {
    "searchQueries": [
        "fitness tracker"
    ],
    "maxAppsPerSearch": 50,
    "proxyConfiguration": {
        "useApifyProxy": true
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("eccentric_layout/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 = {
    "searchQueries": ["fitness tracker"],
    "maxAppsPerSearch": 50,
    "proxyConfiguration": { "useApifyProxy": True },
}

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

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

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

```

## CLI example

```bash
echo '{
  "searchQueries": [
    "fitness tracker"
  ],
  "maxAppsPerSearch": 50,
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}' |
apify call eccentric_layout/google-play-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "command": "npx",
            "args": [
                "mcp-remote",
                "https://mcp.apify.com/?tools=eccentric_layout/google-play-scraper",
                "--header",
                "Authorization: Bearer <YOUR_API_TOKEN>"
            ]
        }
    }
}

```

## OpenAPI specification

```json
{
    "openapi": "3.0.1",
    "info": {
        "title": "Google Play Scraper - Apps, Reviews, Ratings & Search",
        "description": "Scrape Google Play Store app details, reviews, ratings, and search results without an API key. Export structured JSON/CSV/Excel. Built for ASO, app developers, and market research.",
        "version": "0.1",
        "x-build-id": "Rq1TGNXQV04dz8Kh4"
    },
    "servers": [
        {
            "url": "https://api.apify.com/v2"
        }
    ],
    "paths": {
        "/acts/eccentric_layout~google-play-scraper/run-sync-get-dataset-items": {
            "post": {
                "operationId": "run-sync-get-dataset-items-eccentric_layout-google-play-scraper",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor, waits for its completion, and returns Actor's dataset items in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK"
                    }
                }
            }
        },
        "/acts/eccentric_layout~google-play-scraper/runs": {
            "post": {
                "operationId": "runs-sync-eccentric_layout-google-play-scraper",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor and returns information about the initiated run in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/runsResponseSchema"
                                }
                            }
                        }
                    }
                }
            }
        },
        "/acts/eccentric_layout~google-play-scraper/run-sync": {
            "post": {
                "operationId": "run-sync-eccentric_layout-google-play-scraper",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor, waits for completion, and returns the OUTPUT from Key-value store in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK"
                    }
                }
            }
        }
    },
    "components": {
        "schemas": {
            "inputSchema": {
                "type": "object",
                "properties": {
                    "searchQueries": {
                        "title": "Search queries",
                        "type": "array",
                        "description": "Keywords to search on Google Play, e.g. \"fitness\", \"budget tracker\". Each query returns matching apps.",
                        "items": {
                            "type": "string"
                        }
                    },
                    "appIds": {
                        "title": "App IDs (package names)",
                        "type": "array",
                        "description": "Specific app package names to scrape full details for, e.g. \"com.whatsapp\", \"com.spotify.music\".",
                        "items": {
                            "type": "string"
                        }
                    },
                    "maxAppsPerSearch": {
                        "title": "Max apps per search",
                        "minimum": 1,
                        "type": "integer",
                        "description": "Maximum number of apps to return per search query."
                    },
                    "fullDetails": {
                        "title": "Full app details",
                        "type": "boolean",
                        "description": "Enrich every search result with complete app details (ratings, installs, genre, version, release date, histogram, etc.). Turn off for faster, cheaper runs that return only basic search fields.",
                        "default": true
                    },
                    "scrapeReviews": {
                        "title": "Scrape reviews",
                        "type": "boolean",
                        "description": "If enabled, also scrape reviews for every app found (search results + app IDs).",
                        "default": false
                    },
                    "maxReviewsPerApp": {
                        "title": "Max reviews per app",
                        "minimum": 0,
                        "type": "integer",
                        "description": "Only used when 'Scrape reviews' is on. Maximum reviews to fetch per app.",
                        "default": 100
                    },
                    "country": {
                        "title": "Country",
                        "type": "string",
                        "description": "Two-letter country code for the Google Play storefront (affects availability, price, language).",
                        "default": "us"
                    },
                    "language": {
                        "title": "Language",
                        "type": "string",
                        "description": "Two-letter language code for text fields (descriptions, reviews).",
                        "default": "en"
                    },
                    "proxyConfiguration": {
                        "title": "Proxy configuration",
                        "type": "object",
                        "description": "Google Play works well over Apify's datacenter proxy (cheap, default). For very large or sustained runs, switch to Residential to avoid rate limits.",
                        "default": {
                            "useApifyProxy": true
                        }
                    }
                }
            },
            "runsResponseSchema": {
                "type": "object",
                "properties": {
                    "data": {
                        "type": "object",
                        "properties": {
                            "id": {
                                "type": "string"
                            },
                            "actId": {
                                "type": "string"
                            },
                            "userId": {
                                "type": "string"
                            },
                            "startedAt": {
                                "type": "string",
                                "format": "date-time",
                                "example": "2025-01-08T00:00:00.000Z"
                            },
                            "finishedAt": {
                                "type": "string",
                                "format": "date-time",
                                "example": "2025-01-08T00:00:00.000Z"
                            },
                            "status": {
                                "type": "string",
                                "example": "READY"
                            },
                            "meta": {
                                "type": "object",
                                "properties": {
                                    "origin": {
                                        "type": "string",
                                        "example": "API"
                                    },
                                    "userAgent": {
                                        "type": "string"
                                    }
                                }
                            },
                            "stats": {
                                "type": "object",
                                "properties": {
                                    "inputBodyLen": {
                                        "type": "integer",
                                        "example": 2000
                                    },
                                    "rebootCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "restartCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "resurrectCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "computeUnits": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            },
                            "options": {
                                "type": "object",
                                "properties": {
                                    "build": {
                                        "type": "string",
                                        "example": "latest"
                                    },
                                    "timeoutSecs": {
                                        "type": "integer",
                                        "example": 300
                                    },
                                    "memoryMbytes": {
                                        "type": "integer",
                                        "example": 1024
                                    },
                                    "diskMbytes": {
                                        "type": "integer",
                                        "example": 2048
                                    }
                                }
                            },
                            "buildId": {
                                "type": "string"
                            },
                            "defaultKeyValueStoreId": {
                                "type": "string"
                            },
                            "defaultDatasetId": {
                                "type": "string"
                            },
                            "defaultRequestQueueId": {
                                "type": "string"
                            },
                            "buildNumber": {
                                "type": "string",
                                "example": "1.0.0"
                            },
                            "containerUrl": {
                                "type": "string"
                            },
                            "usage": {
                                "type": "object",
                                "properties": {
                                    "ACTOR_COMPUTE_UNITS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_WRITES": {
                                        "type": "integer",
                                        "example": 1
                                    },
                                    "KEY_VALUE_STORE_LISTS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_INTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_EXTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_SERPS": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            },
                            "usageTotalUsd": {
                                "type": "number",
                                "example": 0.00005
                            },
                            "usageUsd": {
                                "type": "object",
                                "properties": {
                                    "ACTOR_COMPUTE_UNITS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_WRITES": {
                                        "type": "number",
                                        "example": 0.00005
                                    },
                                    "KEY_VALUE_STORE_LISTS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_INTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_EXTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_SERPS": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }
}
```
