# App Store Reviews Scraper (`extractkit/app-store-reviews-scraper`) Actor

Extract App Store customer reviews and ratings for any iOS app, across all 175 Apple storefronts. Ratings, review text, author, app version and country.

- **URL**: https://apify.com/extractkit/app-store-reviews-scraper.md
- **Developed by:** [Extract Kit](https://apify.com/extractkit) (community)
- **Categories:** Developer tools, SEO tools
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $5.00 / 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 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 — extract iOS app reviews and ratings

Extract **App Store customer reviews** for any iOS app, from any of Apple's **175 country storefronts**. Get the star rating, full review text, review title, author, app version and review date as structured JSON, CSV or Excel.

Built on Apple's own public review feed — no login, no cookies, no proxies required.

### What this App Store review scraper does

- Scrapes **App Store reviews** for one or many apps in a single run
- Collects reviews **per country**, so you can compare sentiment across markets
- Returns **star ratings (1–5)**, review title and body, author name, and the **app version** each review refers to
- Sorts by **most recent** (monitoring) or **most helpful** (research)
- Accepts App Store URLs pasted directly — no need to hunt for the numeric app ID

### Use cases

| You want to | How this helps |
|---|---|
| **Monitor your own app's reviews** | Run daily sorted by most recent, alert on 1-star reviews |
| **Competitor research** | Scrape a rival app's reviews and find what users complain about |
| **Track a release** | `appVersion` on every review shows which build caused a rating drop |
| **International comparison** | Same app, many storefronts — sentiment differs sharply by country |
| **Feed an LLM / sentiment model** | Clean JSON in, no HTML parsing on your side |
| **App Store Optimization (ASO)** | Mine review language for the words real users actually type |

### Input

Paste an App Store URL and go. Everything else has a sensible default.

```json
{
  "appIds": ["https://apps.apple.com/us/app/whatsapp-messenger/id310633997"],
  "countries": ["us", "gb", "ca"],
  "sortBy": "mostRecent",
  "maxReviews": 500,
  "includeAppMetadata": true
}
```

| Field | Type | Default | Description |
|---|---|---|---|
| `appIds` | array | — | App Store URLs or numeric IDs. Required. |
| `countries` | array | `["us"]` | Two-letter storefront codes. |
| `sortBy` | string | `mostRecent` | `mostRecent` or `mostHelpful`. |
| `maxReviews` | integer | `500` | Total across all apps and countries. |
| `includeAppMetadata` | boolean | `false` | Attach the app name to each review. |
| `requestDelayMs` | integer | `200` | Politeness delay between requests. |

### Output

One row per review:

```json
{
  "reviewId": "14425867505",
  "appId": "310633997",
  "appName": "WhatsApp Messenger",
  "country": "us",
  "rating": 1,
  "title": "Account restricted without no reason",
  "body": "My account has been restricted 3 times recently...",
  "author": "karam hindi",
  "authorUrl": "https://itunes.apple.com/us/reviews/id315630315",
  "appVersion": "26.31.74",
  "updatedAt": "2026-08-14T01:23:12-07:00",
  "voteSum": 0,
  "voteCount": 0,
  "reviewUrl": "https://itunes.apple.com/us/review?id=310633997&type=Purple%20Software"
}
```

Export as **JSON, CSV, Excel, XML or HTML** from the dataset, or pull it through the Apify API.

### How many reviews can I get per app?

**Apple caps its public review feed at 500 reviews per app, per country** (10 pages × 50). That is a limit of Apple's feed, not of this Actor.

To get more reviews, **add more countries** rather than raising `maxReviews`. An app with 500 US reviews may have several thousand across `us`, `gb`, `ca`, `au`, `de`, `fr`, `br`, `in` and so on.

### Frequently asked questions

**Does this need a proxy?**
Not usually. Apple's feed is public and unauthenticated, so the Actor runs without proxies by default and keeps your cost down. Apple does occasionally serve an empty response to shared datacenter IPs; the Actor automatically retries once, which clears it in practice.

**Why did a country return zero reviews?**
Usually because that storefront genuinely has none — a small app may only have reviews in its home market. The Actor retries once before believing an empty response, then skips that storefront and carries on. A handful of storefronts can stay empty from datacenter IPs even when they have reviews; if a specific country matters to you, add others alongside it rather than relying on it alone.

**What happens if nothing is found at all?**
The run fails with a clear message instead of quietly finishing with an empty dataset, so you are never left paying for a run that silently returned nothing.

**Can I get reviews older than the 500 most recent?**
Not from Apple's public feed. Nobody can — that data is not exposed. Run the Actor on a schedule to build history going forward.

**Does it work for Mac App Store apps?**
Yes, if the app has a numeric App Store ID and a public review feed.

**Is scraping App Store reviews legal?**
This Actor reads a public, unauthenticated feed that Apple publishes for syndication. It collects no personal data beyond the public display name attached to each review. As always, you are responsible for how you use the output — check GDPR/CCPA obligations if you store it.

**How is it priced?**
Pay per review returned. You are charged only for reviews actually delivered to your dataset, and the run stops cleanly when it reaches your spending limit.

### Limitations

- 500 reviews per app per country — Apple's cap, not ours
- Review text is returned exactly as written, including other languages
- Apple's feed updates with a short delay; brand-new reviews may take a few hours
- `voteSum` / `voteCount` are often `0` — Apple no longer populates them consistently

### Support

Found a bug, need a field that isn't returned, or want a storefront checked? Send a message — questions are answered within 24 hours.

The output schema is stable and versioned: fields are added, never renamed or removed without notice, so anything you build on top of it keeps working.

# Actor input Schema

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

App Store URLs or numeric app IDs. Paste the URL straight from the App Store — for example https://apps.apple.com/us/app/whatsapp-messenger/id310633997 — or just the ID (310633997).

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

Two-letter country codes to collect reviews from. Apple keeps reviews separate per storefront, so add more countries to get more reviews. Note that many apps have reviews in only a handful of countries.

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

mostRecent returns the newest reviews first — best for monitoring. mostHelpful returns the reviews Apple surfaces on the listing — best for research.

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

Total reviews to return across all apps and countries. Apple caps each app at 500 reviews per country, so raise the country list rather than this number if you need more.

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

Look up the app's name and attach it to every review. Costs one extra request per app.

## `requestDelayMs` (type: `integer`):

Politeness delay between requests to Apple. Leave as is unless you are sweeping many countries.

## Actor input object example

```json
{
  "appIds": [
    "310633997"
  ],
  "countries": [
    "us",
    "gb",
    "ca",
    "au"
  ],
  "sortBy": "mostRecent",
  "maxReviews": 500,
  "includeAppMetadata": false,
  "requestDelayMs": 200
}
```

# Actor output Schema

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

All scraped reviews as JSON — rating, title, body, author, country and app version.

## `reviewsCsv` (type: `string`):

The same reviews as a CSV download, for spreadsheet use.

## `runDetails` (type: `string`):

This run in Apify Console, including its log.

# 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 = {
    "appIds": [
        "https://apps.apple.com/us/app/whatsapp-messenger/id310633997"
    ],
    "countries": [
        "us",
        "gb",
        "ca",
        "au"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("extractkit/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 = {
    "appIds": ["https://apps.apple.com/us/app/whatsapp-messenger/id310633997"],
    "countries": [
        "us",
        "gb",
        "ca",
        "au",
    ],
}

# Run the Actor and wait for it to finish
run = client.actor("extractkit/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 '{
  "appIds": [
    "https://apps.apple.com/us/app/whatsapp-messenger/id310633997"
  ],
  "countries": [
    "us",
    "gb",
    "ca",
    "au"
  ]
}' |
apify call extractkit/app-store-reviews-scraper --silent --output-dataset

```

## MCP server setup

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