# App Store Reviews Scraper — All 175 Countries, No 500 Cap (`gh0st1k/app-store-reviews-scraper`) Actor

Extract Apple App Store reviews across every storefront. Apple caps each country at 500 reviews; this Actor sweeps all countries to return up to ~87,000 reviews per app.

- **URL**: https://apify.com/gh0st1k/app-store-reviews-scraper.md
- **Developed by:** [Max Khmilethkiy](https://apify.com/gh0st1k) (community)
- **Categories:** Agents, MCP servers, SEO tools
- **Stats:** 1 total users, 0 monthly users, 0.0% runs succeeded, 0 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/actors/running/actors-in-store.md#pay-per-usage

## What's an Apify Actor?

Actors are web data automations that power AI and operations. They run on the Apify platform to scrape websites, process data, connect APIs, and automate workflows.
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.

- **AI agents and MCP clients** — the [Apify MCP server](https://docs.apify.com/integrations/mcp.md) at `https://mcp.apify.com` (remote, streamable HTTP, OAuth on first use).
- **Agentic workflows and local Actor development** — [Agent Skills](https://apify.com/.well-known/agent-skills/index.json) with the [Apify CLI](https://docs.apify.com/cli/docs.md): `npm install -g apify-cli`, then `apify login`.
- **JavaScript/TypeScript projects** — the official [JS/TS client](https://docs.apify.com/api/client/js/docs.md): `npm install apify-client`.
- **Python projects** — the official [Python client](https://docs.apify.com/api/client/python/docs.md): `pip install apify-client`.
- **Any other language** — 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 Store Reviews Scraper — All Storefronts, No 500 Cap

Extract Apple App Store reviews for any app, from **every country storefront**, in one run.

### The problem this solves

Apple's review feed hard-stops at **500 reviews per country** (10 pages × 50). Every other App Store scraper hits that wall and stops, so you get 500 reviews and a partial picture.

This Actor sweeps all ~165 storefronts and merges the results.

**Real benchmark — Facebook (`id284882215`), a single run:**

| | Single-country scraper | This Actor |
|---|---|---|
| Reviews returned | 500 | **21,457** |
| Countries covered | 1 | **74** |
| Oldest review | recent only | **2012** |
| Run time | — | **46 seconds** |

That is **43× more data**, spanning 14 years of review history.

### What you get

One record per review, flat and ready for a spreadsheet, database, or LLM:

```json
{
  "type": "review",
  "reviewId": "14457694417",
  "appId": "284882215",
  "country": "US",
  "rating": 1,
  "title": "The pay",
  "text": "They should pay more!",
  "author": "Lost lady 90",
  "appVersion": "575.0.0",
  "voteSum": 0,
  "voteCount": 0,
  "updatedAt": "2026-08-22T00:00:29-07:00",
  "scrapedAt": "2026-08-23T11:45:49.941Z"
}
```

Plus one `type: "app"` record with name, developer, version, price, overall rating and total rating count.

Results are **de-duplicated by review ID** across storefronts — verified 0 duplicates across 21,457 records.

### Input

| Field | Description |
|---|---|
| `appId` | Numeric ID (`284882215`) or any App Store URL. Both work. |
| `countries` | `["all"]` for maximum coverage, `["default"]` for 51 major markets, `["tier1"]` for the 20 largest, or explicit codes like `["us","gb","de"]`. |
| `sortBy` | `mostRecent` or `mostHelpful`. |
| `maxReviews` | Hard cap across all storefronts. **This is your cost control** — the cap is exact. |
| `maxPagesPerCountry` | 1–10. Lower it for a fast, cheap sample across many countries. |
| `minRating` / `maxRating` | Set both to `1` to pull only 1-star reviews. |
| `sinceDate` | ISO date, e.g. `2026-01-31`. |
| `keywords` | Keep only reviews mentioning these words. |

#### Example: every 1-star review worldwide, this year

```json
{
  "appId": "284882215",
  "countries": ["all"],
  "minRating": 1,
  "maxRating": 1,
  "sinceDate": "2026-01-01"
}
```

#### Example: track one bug across major markets

```json
{
  "appId": "284882215",
  "countries": ["default"],
  "keywords": ["crash", "crashing", "freeze"],
  "sinceDate": "2026-06-01"
}
```

### What people use it for

- **ASO and competitor research** — read what a rival's users complain about in markets you're entering, not just the US.
- **Localization QA** — 1-star reviews cluster by country when a translation or payment method is broken. One storefront's reviews will not show you this.
- **Release monitoring** — filter by `appVersion` to see whether the complaint rate moved after a release.
- **Feeding an LLM** — the flat JSON drops straight into a summarization or clustering pipeline. Ask it what the top 10 complaints are per market.
- **Due diligence** — 14 years of review history is a real signal about an app's trajectory.

### Pricing

**$0.60 per 1,000 reviews**, plus a negligible per-run start fee.

For comparison, the nearest App Store review Actors charge $1.50–$2.00 per 1,000 — and return 500 reviews maximum.

Use `maxReviews` to set a hard ceiling on any run.

### Reliability

This Actor uses Apple's own public RSS and Lookup endpoints. There is **no login, no cookie, no API key, and no anti-bot layer** — which means no proxy costs, no breakage when a site ships a new front end, and no silent failures. It is about as stable as a scraper gets.

Known limits, stated plainly:

- Apple caps each storefront at 500 reviews. This Actor works around that by sweeping many storefronts; it cannot exceed 500 *within* one country.
- Not every app is published in every storefront. In the Facebook benchmark, 74 of 165 storefronts returned data — the rest legitimately have none.
- Review text is returned in whatever language the reviewer wrote. Translation is not included.

### Use it from an AI agent

The Actor is exposed over MCP, so Claude, Cursor, or any MCP client can call it directly:

> "Pull every 1-star review for app 284882215 from the last 3 months across all countries and tell me the top 5 recurring complaints."

### Notes on data

Reviews are public content published by Apple. Author names are the public display names shown on the App Store. If you process this data for users in the EU or UK, that is still personal data under GDPR — have a lawful basis, and do not use it to build contact lists.

# Actor input Schema

## `appId` (type: `string`):

Numeric App Store ID (e.g. 284882215) or any App Store URL. Find it in the app's App Store link after 'id'.

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

Two-letter country codes to scrape. Presets: 'all' (~150 storefronts, maximum coverage), 'default' (51 major markets), 'tier1' (20 largest). Apple caps every storefront at 500 reviews, so more storefronts = more reviews.

## `sortBy` (type: `string`):

'mostRecent' returns the newest reviews. 'mostHelpful' returns the highest-voted, which skews older but surfaces the reviews users actually read.

## `maxReviews` (type: `integer`):

Hard cap on reviews returned across all storefronts. Controls your cost.

## `maxPagesPerCountry` (type: `integer`):

50 reviews per page. Apple hard-stops at page 10, so 10 is the maximum possible. Lower this for a fast, cheap sample across many countries.

## `minRating` (type: `integer`):

Set both min and max to 1 to pull only 1-star reviews — the fastest way to find what users hate.

## `maxRating` (type: `integer`):

Upper bound on star rating. Combine with 'Minimum rating' to isolate a band — e.g. 1 to 2 for detractors, 4 to 5 for promoters.

## `sinceDate` (type: `string`):

ISO date (2026-01-31). Leave empty for all available reviews.

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

Keep only reviews containing at least one of these words (case-insensitive). Useful for tracking a specific bug, feature, or competitor name.

## `includeAppMetadata` (type: `boolean`):

Add one record with app name, developer, version, price and overall rating.

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

How many storefronts to fetch in parallel. Raise for speed, lower if you see throttling.

## Actor input object example

```json
{
  "appId": "https://apps.apple.com/us/app/facebook/id284882215",
  "countries": [
    "default"
  ],
  "sortBy": "mostRecent",
  "maxReviews": 10000,
  "maxPagesPerCountry": 10,
  "minRating": 1,
  "maxRating": 5,
  "keywords": [],
  "includeAppMetadata": true,
  "concurrency": 5
}
```

# Actor output Schema

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

One record per review, plus a single 'app' record with the app's metadata. De-duplicated by review ID across storefronts.

## `summary` (type: `string`):

Totals for the run: reviews returned, storefronts scanned, per-country counts, and whether the maxReviews cap was hit.

# 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 = {
    "appId": "284882215",
    "countries": [
        "default"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("gh0st1k/app-store-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 = {
    "appId": "284882215",
    "countries": ["default"],
}

# Run the Actor and wait for it to finish
run = client.actor("gh0st1k/app-store-reviews-scraper").call(run_input=run_input)

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

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

```

## CLI example

```bash
echo '{
  "appId": "284882215",
  "countries": [
    "default"
  ]
}' |
apify call gh0st1k/app-store-reviews-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,gh0st1k/app-store-reviews-scraper"
        }
    }
}

```

The hosted server signs you in with OAuth on first connect, so no API token belongs in this config. Clients without OAuth support can send an `Authorization: Bearer <APIFY_API_TOKEN>` header instead, using a token from API & Integrations in Apify Console (https://console.apify.com/settings/integrations).

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/actors/QRhZooaEtc3DfTyfQ/builds/eqkyR6HhgrgO6VuIG/openapi.json
