# App Reviews Scraper (Google Play & App Store) (`native_emblem/app-reviews-scraper`) Actor

Scrape app reviews & metadata from Google Play and the Apple App Store in one run. Proxyless, fast, clean JSON — ratings, review text, dates, versions, developer replies.

- **URL**: https://apify.com/native\_emblem/app-reviews-scraper.md
- **Developed by:** [Magpie](https://apify.com/native_emblem) (community)
- **Categories:** SEO tools, Developer tools, E-commerce
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $0.15 / 1,000 reviews

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/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.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

## App Reviews Scraper — Google Play & Apple App Store in one run

Scrape **app reviews and app metadata from both major app stores with one
actor**. Give it any app — a Google Play package name (`com.whatsapp`), an
Apple app id (`310633997`), or just paste a store URL — and get back clean,
structured records: rating, review text, author, date, helpful votes, app
version, and developer replies (Google Play).

No login. No proxies. No brittle HTML parsing — this reads the stores'
**official public data endpoints**, so it's fast and doesn't break.

> **Benchmark:** ✅ 250 Google Play reviews in **0.6 s** (full pagination) · 🍎 120 App Store reviews in 1.9 s · 🧩 **100% field completeness** on rating, date & author · 🌍 any country & language · 💬 developer replies included (Google Play)

Perfect for **review monitoring & alerting, ASO / app-store optimization,
sentiment analysis & AI pipelines, competitor research, churn insight, and
support-issue mining**.

---

### ✨ Why this scraper

- **Both stores, one actor.** Every other actor does Google Play *or* the App Store. This one does both — same input, same unified output shape. One integration instead of two.
- **App metadata included.** One record per app with title, developer, category, price, average rating, and total rating count — for free, alongside the reviews.
- **Unlimited Google Play pagination.** Follows continuation tokens as deep as you ask (250, 5,000, 100,000 reviews — your call).
- **Multi-storefront App Store.** Apple's feed caps at ~500 recent reviews per country — so pull `us`, `gb`, `de`, `au`... in one run and get more.
- **Developer replies** (Google Play) with reply date — great for support-quality analysis.
- **Fair billing.** Priced per record returned. Apps that don't exist or return nothing are never billed — guaranteed in code.

### 📥 Input

| Field | Type | Description |
|---|---|---|
| `apps` | string[] | Google Play packages (`com.whatsapp`), Apple ids (`310633997`), or store URLs — mix freely. |
| `maxReviewsPerApp` | integer | Reviews per app (default 200). Play: unlimited depth. App Store: ~500/storefront. |
| `sort` | enum | `newest` (both stores), `relevance` (Play), `helpful` (App Store). |
| `includeAppDetails` | boolean | Push one metadata record per app (default on). |
| `language` | string | Google Play language, e.g. `en`, `de`. |
| `country` | string | Play country & default App Store storefront, e.g. `us`. |
| `appleCountries` | string[] | Extra App Store storefronts for more reviews. |
| `maxItems` | integer | Overall record cap. 0 = unlimited. |
| `concurrency` | integer | Apps processed in parallel (1–8). |

#### Example input

```json
{
  "apps": ["com.spotify.music", "https://apps.apple.com/us/app/spotify/id324684580"],
  "maxReviewsPerApp": 1000,
  "sort": "newest",
  "appleCountries": ["gb", "de"]
}
````

### 📤 Output

One record per review:

```json
{
  "store": "google-play",
  "appId": "com.whatsapp",
  "reviewId": "486d897d-f369-4873-80b9-99b858950b56",
  "userName": "Jane D.",
  "userAvatar": "https://play-lh.googleusercontent.com/...",
  "rating": 5,
  "title": null,
  "text": "Excellent app, use it daily",
  "date": "2026-07-11T15:19:17.000Z",
  "thumbsUp": 12,
  "appVersion": "2.26.26.73",
  "replyText": "Thanks for the feedback!",
  "replyDate": "2026-07-12T09:00:00.000Z",
  "scrapedAt": "2026-07-12T13:00:00.000Z"
}
```

And one metadata record per app (when `includeAppDetails` is on):

```json
{
  "store": "app-store",
  "type": "app",
  "appId": "310633997",
  "bundleId": "net.whatsapp.WhatsApp",
  "title": "WhatsApp Messenger",
  "developer": "WhatsApp Inc.",
  "genre": "Social Networking",
  "rating": 4.69,
  "ratingCount": 18234412,
  "version": "26.26.73",
  "price": 0,
  "url": "https://apps.apple.com/us/app/whatsapp-messenger/id310633997"
}
```

Export as **JSON, CSV, Excel** or pull via the **Apify API**. Schedule daily
runs to track review velocity and rating trends over time.

### ❓ FAQ

**How many reviews can I get per app?**
Google Play: as many as exist — pagination is unlimited. App Store: Apple's
public feed exposes the ~500 most recent reviews per storefront; add more
storefronts via `appleCountries` to multiply that.

**Where do I find the app id?**
It's in the store URL. Google Play: `play.google.com/store/apps/details?id=`**`com.whatsapp`**.
App Store: `apps.apple.com/us/app/whatsapp-messenger/id`**`310633997`**. Or just paste the whole URL.

**Do I need proxies?**
No. Both endpoints are public and the actor runs proxyless — no proxy cost.

**Are developer replies included?**
Yes for Google Play (text + date). Apple's public feed doesn't expose replies.

**Which languages / countries are supported?**
All of them — set `language` and `country` for Google Play, and any list of
App Store storefronts.

**Is this legal?**
It collects only public review data that anyone can see in the app stores —
no personal accounts, no login. Review your own use case as usual.

### 🔧 Integrations

Works with everything on Apify: **Google Sheets, Zapier, Make, n8n, Airbyte,
webhooks**, or the [Apify API](https://docs.apify.com/api/v2). Pipe fresh
reviews into Slack alerts, dashboards, or an LLM sentiment pipeline.

### 🏷️ Keywords

app reviews scraper, google play reviews api, app store reviews api, aso tool,
app review monitoring, play store scraper, itunes reviews, app rating tracker,
mobile app reviews export, review sentiment analysis data

# Actor input Schema

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

One entry per app. Accepts Google Play package names (`com.whatsapp`), Apple app ids (`310633997`), or full store URLs from either store.

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

How many reviews to fetch per app. Google Play paginates without limit; the App Store RSS feed caps at ~500 recent reviews per storefront (add more storefronts below to get more).

## `sort` (type: `string`):

`newest` works on both stores. `relevance` applies to Google Play, `helpful` to the App Store (each falls back to newest on the other store).

## `includeAppDetails` (type: `boolean`):

Also push one metadata record per app (title, developer, rating, rating count, genre, price...).

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

Google Play interface language (hl), e.g. `en`, `de`, `es`.

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

Google Play country (gl) and default App Store storefront, e.g. `us`, `gb`, `de`.

## `appleCountries` (type: `array`):

Additional App Store country codes to pull reviews from (each storefront exposes up to ~500 recent reviews). Example: \["gb", "de", "au"].

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

Stop after this many records across all apps. 0 = unlimited.

## `concurrency` (type: `integer`):

How many apps to process in parallel (1–8).

## Actor input object example

```json
{
  "apps": [
    "com.spotify.music",
    "https://apps.apple.com/us/app/whatsapp-messenger/id310633997"
  ],
  "maxReviewsPerApp": 200,
  "sort": "newest",
  "includeAppDetails": true,
  "language": "en",
  "country": "us",
  "appleCountries": [
    "gb",
    "de",
    "au"
  ],
  "maxItems": 0,
  "concurrency": 4
}
```

# Actor output Schema

## `overview` (type: `string`):

One record per review across all requested apps (plus one metadata record per app when enabled).

# 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 = {
    "apps": [
        "com.whatsapp",
        "310633997"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("native_emblem/app-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 = { "apps": [
        "com.whatsapp",
        "310633997",
    ] }

# Run the Actor and wait for it to finish
run = client.actor("native_emblem/app-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 '{
  "apps": [
    "com.whatsapp",
    "310633997"
  ]
}' |
apify call native_emblem/app-reviews-scraper --silent --output-dataset

```

## MCP server setup

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

```

## OpenAPI specification

```json
{
    "openapi": "3.0.1",
    "info": {
        "title": "App Reviews Scraper (Google Play & App Store)",
        "description": "Scrape app reviews & metadata from Google Play and the Apple App Store in one run. Proxyless, fast, clean JSON — ratings, review text, dates, versions, developer replies.",
        "version": "0.1",
        "x-build-id": "ZHQfNa3vIjiqctafb"
    },
    "servers": [
        {
            "url": "https://api.apify.com/v2"
        }
    ],
    "paths": {
        "/acts/native_emblem~app-reviews-scraper/run-sync-get-dataset-items": {
            "post": {
                "operationId": "run-sync-get-dataset-items-native_emblem-app-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/native_emblem~app-reviews-scraper/runs": {
            "post": {
                "operationId": "runs-sync-native_emblem-app-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/native_emblem~app-reviews-scraper/run-sync": {
            "post": {
                "operationId": "run-sync-native_emblem-app-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": [
                    "apps"
                ],
                "properties": {
                    "apps": {
                        "title": "Apps",
                        "type": "array",
                        "description": "One entry per app. Accepts Google Play package names (`com.whatsapp`), Apple app ids (`310633997`), or full store URLs from either store.",
                        "items": {
                            "type": "string"
                        }
                    },
                    "maxReviewsPerApp": {
                        "title": "Max reviews per app",
                        "minimum": 1,
                        "type": "integer",
                        "description": "How many reviews to fetch per app. Google Play paginates without limit; the App Store RSS feed caps at ~500 recent reviews per storefront (add more storefronts below to get more).",
                        "default": 200
                    },
                    "sort": {
                        "title": "Sort reviews by",
                        "enum": [
                            "newest",
                            "relevance",
                            "helpful"
                        ],
                        "type": "string",
                        "description": "`newest` works on both stores. `relevance` applies to Google Play, `helpful` to the App Store (each falls back to newest on the other store).",
                        "default": "newest"
                    },
                    "includeAppDetails": {
                        "title": "Include app metadata record",
                        "type": "boolean",
                        "description": "Also push one metadata record per app (title, developer, rating, rating count, genre, price...).",
                        "default": true
                    },
                    "language": {
                        "title": "Language (Google Play)",
                        "type": "string",
                        "description": "Google Play interface language (hl), e.g. `en`, `de`, `es`.",
                        "default": "en"
                    },
                    "country": {
                        "title": "Country / storefront",
                        "type": "string",
                        "description": "Google Play country (gl) and default App Store storefront, e.g. `us`, `gb`, `de`.",
                        "default": "us"
                    },
                    "appleCountries": {
                        "title": "Extra App Store storefronts",
                        "type": "array",
                        "description": "Additional App Store country codes to pull reviews from (each storefront exposes up to ~500 recent reviews). Example: [\"gb\", \"de\", \"au\"].",
                        "items": {
                            "type": "string"
                        }
                    },
                    "maxItems": {
                        "title": "Max records total",
                        "minimum": 0,
                        "type": "integer",
                        "description": "Stop after this many records across all apps. 0 = unlimited.",
                        "default": 0
                    },
                    "concurrency": {
                        "title": "Concurrency",
                        "minimum": 1,
                        "maximum": 8,
                        "type": "integer",
                        "description": "How many apps to process in parallel (1–8).",
                        "default": 4
                    }
                }
            },
            "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
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }
}
```
