# Playstore Reviews Scraper (`scrapers-hub/playstore-reviews-scraper`) Actor

Google Play Store Reviews scraper to extract publicly available app reviews, ratings, reviewer names, review dates, developer responses, and app metadata 📱⭐ Perfect for sentiment analysis, app research, competitor analysis, and customer feedback insights.

- **URL**: https://apify.com/scrapers-hub/playstore-reviews-scraper.md
- **Developed by:** [Scrapers Hub](https://apify.com/scrapers-hub) (community)
- **Categories:** Developer tools, Automation, Other
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $1.99 / 1,000 results

This Actor is paid per event and usage. You are charged both the fixed price for specific events and for Apify platform usage.

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

## 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/docs.md):

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

In Python projects, use official [Python client library](https://docs.apify.com/api/client/python/docs.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/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

### What does Google Play Store Reviews Scraper do?

**Google Play Store Reviews Scraper** extracts user reviews from [Google Play Store](https://play.google.com) for any Android app — without the official API. Provide one or more app URLs or package IDs and get back structured review data including rating, content, date, thumbs-up count, and app version, all saved to an Apify dataset.

### Why scrape Google Play Store reviews?

User reviews are a goldmine of product intelligence. Businesses use them to track sentiment, benchmark competitors, identify feature requests, and respond to user feedback at scale. The official Google Play Developer API only returns reviews for apps you own — this Actor has no such restriction.

Key features:
- Scrape reviews for **any public Android app** — yours or a competitor's
- Filter by **star rating** (1–5) to focus on praise or complaints
- Sort by **newest**, **most relevant**, or **by rating**
- Supports **multiple apps** in a single run
- Uses **residential proxies** by default to avoid rate limiting
- **Live data push** — results appear in your dataset as they are scraped, not only at the end
- Built-in **3× retry** with exponential backoff on failed requests

### What data can Google Play Store Reviews Scraper extract?

| Field | Type | Description |
|-------|------|-------------|
| `reviewId` | String | Unique review identifier |
| `userName` | String | Display name of the reviewer |
| `userImage` | String | URL of the reviewer's profile picture |
| `score` | Integer | Star rating (1–5) |
| `content` | String | Full review text |
| `thumbsUpCount` | Integer | Number of helpful votes |
| `appVersion` | String | App version installed at time of review |
| `at` | String | ISO 8601 timestamp of the review |
| `appId` | String | App package ID (e.g. `com.whatsapp`) |
| `appUrl` | String | Direct URL to the app on Play Store |
| `language` | String | Language code used for the request |
| `country` | String | Country code used for the request |
| `sort` | String | Sort order used (NEWEST / RELEVANT / RATING) |
| `retrievedAt` | String | ISO 8601 timestamp when the review was scraped |

### How to scrape Google Play Store reviews

1. **Open the Actor** — Go to the Input tab in Apify Console.
2. **Add app URLs or IDs** — Paste full Play Store URLs like `https://play.google.com/store/apps/details?id=com.whatsapp`, or just the package ID like `com.spotify.music`.
3. **Set max reviews** — Choose how many reviews to collect per app (default: 500).
4. **Configure filters** — Optionally filter by star rating and set language/country.
5. **Run the Actor** — Click Start and watch reviews populate your dataset in real time.
6. **Download results** — Export as JSON, CSV, Excel, or XML from the Dataset tab.

### How much will it cost to scrape Google Play Store reviews?

This Actor uses Apify's compute units plus residential proxy bandwidth. A typical run collecting 500 reviews per app costs a fraction of a cent in compute. Residential proxy usage is metered separately based on data transferred. You can estimate costs in the Apify Console pricing calculator.

### Input

See the **Input** tab in Apify Console for the full configuration form. Key fields:

- **App URLs or IDs** — One or more Play Store URLs or package IDs (required)
- **Max Reviews Per App** — Cap the number of reviews per app (default: 500)
- **Language** — Two-letter language code, e.g. `en`, `de`, `fr` (default: `en`)
- **Country** — Two-letter country code, e.g. `us`, `gb`, `in` (default: `us`)
- **Sort Order** — `NEWEST`, `RELEVANT`, or `RATING` (default: `NEWEST`)
- **Rating Filter** — Optionally restrict to 1–5 star reviews only
- **Proxy Configuration** — Defaults to Apify residential proxies (recommended)

### Output

Results are saved to the default Apify **Dataset** and can be downloaded in JSON, CSV, HTML, or Excel format.

Example output item:

```json
{
  "reviewId": "gp:AOqpTOFmzGRgvCM9...",
  "userName": "Jane Smith",
  "userImage": "https://play-lh.googleusercontent.com/...",
  "score": 5,
  "content": "Absolutely love this app! Works flawlessly.",
  "thumbsUpCount": 42,
  "appVersion": "2.24.10.78",
  "at": "2024-10-15T08:23:11Z",
  "appId": "com.whatsapp",
  "appUrl": "https://play.google.com/store/apps/details?id=com.whatsapp",
  "language": "en",
  "country": "us",
  "sort": "NEWEST",
  "retrievedAt": "2024-10-16T12:00:00.000000Z"
}
````

### Tips

- **Language and country** affect which reviews are returned — use `en`/`us` for the broadest English results.
- For **sentiment analysis**, run two separate jobs: one with `ratingFilter: "1"` and one with `ratingFilter: "5"`.
- Scraping **competitors' reviews** is a common use case — just paste their Play Store URL.
- If you hit empty results, try switching the sort order to `RELEVANT`.

### FAQ, Disclaimers, and Support

**Is scraping Google Play Store reviews legal?**

> Our Actors are ethical and do not extract any private user data, such as email addresses, gender, or location. They only extract what the user has chosen to share publicly. We therefore believe that our Actors, when used for ethical purposes by Apify users, are safe. However, you should be aware that your results could contain personal data. Personal data is protected by the GDPR in the European Union and by other regulations around the world. You should not scrape personal data unless you have a legitimate reason to do so. If you're unsure whether your reason is legitimate, consult your lawyers.

**Why am I getting no results?**

Check that the package ID is correct and the app is publicly available in the selected country. Try setting `reviewsSort` to `RELEVANT` as some apps may have fewer newest reviews indexed.

**Can I scrape reviews in other languages?**

Yes — set `language` to any two-letter ISO code (e.g. `de` for German, `ja` for Japanese) and `country` accordingly.

**How do I access results programmatically?**

Use the **API tab** in Apify Console to get a dataset endpoint URL. You can integrate it with Zapier, Make, or any HTTP client.

For bugs or feature requests, use the **Issues** tab on this Actor's page.

# Actor input Schema

## `appUrls` (type: `array`):

List of Google Play Store app URLs or package IDs to scrape reviews from.

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

Maximum number of reviews to collect per app.

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

Two-letter language code for reviews (e.g. en, de, fr, es, pt).

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

Two-letter country code for reviews (e.g. us, gb, de, br, in).

## `reviewsSort` (type: `string`):

Sort order for reviews.

## `ratingFilter` (type: `string`):

Only return reviews with this star rating. Leave empty to return all ratings.

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

Proxy settings. Residential proxies are recommended to avoid rate limiting.

## Actor input object example

```json
{
  "appUrls": [
    "https://play.google.com/store/apps/details?id=com.whatsapp",
    "com.spotify.music"
  ],
  "maxReviewsPerApp": 500,
  "language": "en",
  "country": "us",
  "reviewsSort": "NEWEST",
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ]
  }
}
```

# 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 = {
    "appUrls": [
        "https://play.google.com/store/apps/details?id=com.whatsapp",
        "com.spotify.music"
    ],
    "maxReviewsPerApp": 500,
    "language": "en",
    "country": "us",
    "reviewsSort": "NEWEST",
    "proxyConfiguration": {
        "useApifyProxy": true,
        "apifyProxyGroups": [
            "RESIDENTIAL"
        ]
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("scrapers-hub/playstore-reviews-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 = {
    "appUrls": [
        "https://play.google.com/store/apps/details?id=com.whatsapp",
        "com.spotify.music",
    ],
    "maxReviewsPerApp": 500,
    "language": "en",
    "country": "us",
    "reviewsSort": "NEWEST",
    "proxyConfiguration": {
        "useApifyProxy": True,
        "apifyProxyGroups": ["RESIDENTIAL"],
    },
}

# Run the Actor and wait for it to finish
run = client.actor("scrapers-hub/playstore-reviews-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 '{
  "appUrls": [
    "https://play.google.com/store/apps/details?id=com.whatsapp",
    "com.spotify.music"
  ],
  "maxReviewsPerApp": 500,
  "language": "en",
  "country": "us",
  "reviewsSort": "NEWEST",
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ]
  }
}' |
apify call scrapers-hub/playstore-reviews-scraper --silent --output-dataset

```

## MCP server setup

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

```

## OpenAPI specification

```json
{
    "openapi": "3.0.1",
    "info": {
        "title": "Playstore Reviews Scraper",
        "description": "Google Play Store Reviews scraper to extract publicly available app reviews, ratings, reviewer names, review dates, developer responses, and app metadata 📱⭐ Perfect for sentiment analysis, app research, competitor analysis, and customer feedback insights.",
        "version": "0.0",
        "x-build-id": "z5D4dSEril1gt05iA"
    },
    "servers": [
        {
            "url": "https://api.apify.com/v2"
        }
    ],
    "paths": {
        "/acts/scrapers-hub~playstore-reviews-scraper/run-sync-get-dataset-items": {
            "post": {
                "operationId": "run-sync-get-dataset-items-scrapers-hub-playstore-reviews-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/scrapers-hub~playstore-reviews-scraper/runs": {
            "post": {
                "operationId": "runs-sync-scrapers-hub-playstore-reviews-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/scrapers-hub~playstore-reviews-scraper/run-sync": {
            "post": {
                "operationId": "run-sync-scrapers-hub-playstore-reviews-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",
                "required": [
                    "appUrls"
                ],
                "properties": {
                    "appUrls": {
                        "title": "App URLs or IDs",
                        "type": "array",
                        "description": "List of Google Play Store app URLs or package IDs to scrape reviews from.",
                        "items": {
                            "type": "string"
                        }
                    },
                    "maxReviewsPerApp": {
                        "title": "Max Reviews Per App",
                        "minimum": 1,
                        "maximum": 50000,
                        "type": "integer",
                        "description": "Maximum number of reviews to collect per app.",
                        "default": 500
                    },
                    "language": {
                        "title": "Language",
                        "type": "string",
                        "description": "Two-letter language code for reviews (e.g. en, de, fr, es, pt).",
                        "default": "en"
                    },
                    "country": {
                        "title": "Country",
                        "type": "string",
                        "description": "Two-letter country code for reviews (e.g. us, gb, de, br, in).",
                        "default": "us"
                    },
                    "reviewsSort": {
                        "title": "Sort Order",
                        "enum": [
                            "NEWEST",
                            "RELEVANT",
                            "RATING"
                        ],
                        "type": "string",
                        "description": "Sort order for reviews.",
                        "default": "NEWEST"
                    },
                    "ratingFilter": {
                        "title": "Rating Filter",
                        "enum": [
                            "1",
                            "2",
                            "3",
                            "4",
                            "5"
                        ],
                        "type": "string",
                        "description": "Only return reviews with this star rating. Leave empty to return all ratings."
                    },
                    "proxyConfiguration": {
                        "title": "Proxy Configuration",
                        "type": "object",
                        "description": "Proxy settings. Residential proxies are recommended to avoid rate limiting."
                    }
                }
            },
            "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
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }
}
```
