# App Store Reviews Scraper – Multi-Country, Search by Name (`siftwright/app-store-reviews-scraper`) Actor

Get Apple App Store reviews for any app: paste a URL, id or just the app's name, pick one or many countries, filter by stars, keyword or date. $0.10 per 1,000 reviews.

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

## Pricing

from $0.10 / 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/actors/running/actors-in-store.md#pay-per-event

## What's an Apify Actor?

An Actor is a serverless cloud program that runs on the Apify platform. It has two run modes.
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.

Apify vocabulary and the platform model are defined once, in the agent quickstart at https://apify.com/agents.md.

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

Do not guess an integration path. Every one of them is in the agent quickstart at https://apify.com/agents.md: the Apify MCP server, Agent Skills with the Apify CLI, the JavaScript and Python clients, the REST API, and the account-free path for an agent with no human to sign in. It also carries the rule on stating cost before the first paid run.

For examples already wired to this Actor's own input schema, see the [API](#api) section below.

Each client library has reference documentation the quickstart does not restate: [JavaScript/TypeScript](https://docs.apify.com/api/client/js/docs.md) (`npm install apify-client`) and [Python](https://docs.apify.com/api/client/python/docs.md) (`pip install apify-client`).

# README

## App Store Reviews Scraper

Get **Apple App Store reviews** for any iPhone/iPad app — star rating, title, full text, author, date and the app version reviewed. Paste an App Store link, an app id, or **just the app's name**, pick one or many countries, and download the results as JSON, CSV or Excel.

**Price: $0.10 per 1,000 reviews ($0.0001 each).** Reviews removed by your filters, duplicates, and apps that can't be found are **never charged**.

![Input used in a real test run: Notion searched by name, 1–2 star reviews only, plus an app that does not exist](https://api.apify.com/v2/key-value-stores/kR3qv3a6ZPzlBCpEH/records/app-store-input.png)
![Real dataset output: 1–2 star Notion reviews with date and app version](https://api.apify.com/v2/key-value-stores/kR3qv3a6ZPzlBCpEH/records/app-store-output.png)
![Real run summary: 60 reviews returned and 60 charged, unknown app skipped for free](https://api.apify.com/v2/key-value-stores/kR3qv3a6ZPzlBCpEH/records/app-store-run.png)

*Screenshots are rendered from a real test run on 2026-09-30 (run input, dataset and run record), not mock-ups.*

### Why use this scraper

| | |
|---|---|
| 💵 **Price** | **$0.10 per 1,000 reviews**, no monthly rental |
| 🔎 **Search by name** | Type `Duolingo` — no need to hunt for the app id |
| 🌍 **Many countries in one run** | Every App Store country has its own reviews; list `us, gb, ca, au, de…` and get them all, de-duplicated |
| ⭐ **Filter before you pay** | By stars (e.g. 1–2 ★ complaints only), keywords, or date — you only pay for what you keep |
| 🔁 **Retries Apple's empty pages** | Apple's public review feed often answers with an empty page even when reviews exist; the scraper retries until it gets the real page instead of silently returning fewer reviews |
| ⚡ **Fast and light** | Plain HTTPS, no browser and no proxy. ~470 reviews from 3 apps in 2 countries took 19 seconds in testing |
| 🤖 **AI-agent ready** | Callable from Claude, ChatGPT & Cursor through Apify's MCP server |

### What you can use it for

- 🐞 **Bug & complaint mining** — pull every 1–2 ★ review mentioning "crash" or "login" after a release.
- 🥊 **Competitor research** — see what users love and hate about competing apps, country by country.
- 📊 **Sentiment dashboards** — feed fresh reviews into a spreadsheet, BI tool or LLM on a schedule.
- 🧪 **Release monitoring** — compare reviews by `appVersionReviewed` to see how a new version landed.

### How to use

1. Click **Try for free**.
2. Add one or more apps (name, App Store link or id) and the countries you care about.
3. Optionally set star, keyword or date filters.
4. Click **Start** and download the results from the **Output** tab.

### Input example

```json
{
  "apps": ["Duolingo", "https://apps.apple.com/us/app/facebook/id284882215"],
  "countries": ["us", "gb"],
  "maxReviewsPerApp": 200,
  "maxRating": 2
}
```

| Field | Description |
|---|---|
| `apps` | App Store URLs, numeric app ids, or app names |
| `countries` | Two-letter App Store country codes (default `us`) |
| `maxReviewsPerApp` | Stop after this many reviews per app, across all countries (default 500) |
| `sortBy` | `mostrecent` (default) or `mosthelpful` |
| `minRating` / `maxRating` | Keep only reviews within this star range |
| `keywords` | Keep only reviews containing at least one of these words |
| `since` | Keep only reviews posted on or after this date |

### Output example

A real row from a test run:

```json
{
  "reviewId": "14607611788",
  "appId": "570060128",
  "appName": "Duolingo: Language Lessons",
  "country": "us",
  "rating": 1,
  "title": "Lightning bolt animation",
  "text": "Please remove the lightning bolt animation from stories, it is very jarring and unhealthy for the eyes.",
  "author": "Language Learner 7",
  "authorUrl": "https://itunes.apple.com/us/reviews/id36789391",
  "appVersionReviewed": "7.142.0",
  "date": "2026-09-29T15:41:58.000Z",
  "helpfulVotes": 0,
  "totalVotes": 0,
  "developer": "Duolingo, Inc",
  "appUrl": "https://apps.apple.com/us/app/duolingo-language-lessons/id570060128"
}
```

A summary of every app (matched name, developer, overall rating, rating count, current version, genre and number of reviews collected) is saved to the run's key-value store as `APPS`.

### Limits you should know about

Apple's public review feed returns **up to 500 reviews per app, per country, per sort order** (the most recent or most helpful ones). To collect more, add more countries. Older reviews beyond that window are not available through this feed. Developer replies are not included in the feed.

### Pricing

Pay-per-event: **$0.0001 per review returned** (= $0.10 per 1,000), plus Apify's standard $0.00005 Actor start fee. Filtered-out reviews, duplicates and apps that can't be found are free. Apify's free plan includes monthly credits, so you can try it at no cost.

### Quick start in Python

```python
from apify_client import ApifyClient

client = ApifyClient("YOUR_APIFY_TOKEN")
run = client.actor("siftwright/app-store-reviews-scraper").call(run_input={
    "apps": ["Duolingo"],
    "countries": ["us", "gb", "ca"],
    "maxRating": 2,
})
## apify-client 3.x (pip install apify-client); on 2.x use run["defaultDatasetId"]
for item in client.dataset(run.default_dataset_id).iterate_items():
    print(item["country"], item["rating"], item["title"])
```

### Use it via API

```bash
curl -X POST "https://api.apify.com/v2/acts/siftwright~app-store-reviews-scraper/run-sync-get-dataset-items?token=YOUR_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"apps":["Duolingo"],"countries":["us"],"maxReviewsPerApp":100}'
```

Works with Python and JavaScript API clients, Make, Zapier, n8n, LangChain and LlamaIndex. **AI agents** (Claude, ChatGPT, Cursor) can call it directly through [Apify's MCP server](https://mcp.apify.com).

### FAQ

**Where does the data come from?** Apple's own public customer-review feed for each App Store country — the same reviews anyone can read on the App Store.

**The app name matched the wrong app.** Name search uses Apple's App Store search and takes the top result. For an exact match, paste the App Store link or app id instead.

**Is it legal?** The scraper only reads publicly available reviews. Make sure your use respects Apple's terms and applicable data-protection law (e.g. GDPR/CCPA), especially if you store reviewer names.

**Something broke or you need a feature?** Open an issue on the **Issues** tab — we respond fast.

# Actor input Schema

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

One per line: an App Store URL (https://apps.apple.com/us/app/.../id570060128), a numeric app id (570060128) or simply the app's name (Duolingo).

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

Two-letter App Store country codes. Every country has its own reviews, so adding more countries returns more reviews (up to 500 per country).

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

Stop after this many reviews per app (across all countries). Apple publishes up to 500 reviews per app per country.

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

Newest first, or most helpful first.

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

Only keep reviews with at least this many stars. Filtered-out reviews are not charged.

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

Only keep reviews with at most this many stars (e.g. 2 for complaints only).

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

Only keep reviews whose title or text contains at least one of these words (case-insensitive).

## `since` (type: `string`):

Only keep reviews posted on or after this date, e.g. 2026-01-01. Works best with the 'Most recent' sort order.

## Actor input object example

```json
{
  "apps": [
    "Duolingo"
  ],
  "countries": [
    "us"
  ],
  "maxReviewsPerApp": 500,
  "sortBy": "mostrecent",
  "minRating": 1,
  "maxRating": 5
}
```

# Actor output Schema

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

One row per App Store review.

# 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": [
        "Duolingo"
    ],
    "countries": [
        "us"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("siftwright/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 = {
    "apps": ["Duolingo"],
    "countries": ["us"],
}

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

```

## MCP server setup

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