# App Store Reviews Scraper API | Multi-Country, App Version (`happyscrapper/app-store-reviews-scraper`) Actor

Scrape Apple App Store reviews from many countries in one run: up to 1,000 per country, app version on every review, detected language, new reviews only. Clean JSON.

- **URL**: https://apify.com/happyscrapper/app-store-reviews-scraper.md
- **Developed by:** [Happy Scrapper](https://apify.com/happyscrapper) (community)
- **Categories:** Developer tools, Automation, AI
- **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.
Since this Actor supports Apify Store discounts, the price gets lower the higher subscription plan you have.

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 from many countries in one clean format](https://api.apify.com/v2/key-value-stores/BQSjfOQ2i88EMdSPe/records/app-store-reviews-banner.png)

### What is App Store Reviews Scraper API?

It collects **user reviews from the Apple App Store**, for as many apps and **countries** as you need, **in a single
run**, merged and de-duplicated in one clean JSON format.

Every review comes with the **app version** it was written on, the **language it is actually written in** and an
**anonymised author**. Schedule it, and it returns **only the reviews published since the last run**.

👉 Paste an App Store link, pick your countries, press **Start**, and get your first reviews in seconds.

### Why use it

| | This Actor | A typical App Store review scraper |
|---|---|---|
| 🌍 Many countries per run | ✅ merged and de-duplicated | one country per run |
| 📄 Depth per country | ✅ up to about 1,000 reviews | often stops at 450 or 500 |
| 🔢 App version on each review | ✅ every review | varies |
| 🗣️ Language of the text | ✅ detected, not guessed from the country | country only |
| 🔁 Only new reviews since the last run | ✅ built in | rarely built in |
| 🆔 Stable review IDs across runs | ✅ safe to de-duplicate and join | not guaranteed |
| 🔒 Authors anonymised by default | ✅ | usually names in clear |
| ⭐ Filter by stars, pay only for kept reviews | ✅ | varies |

**Why depth matters.** Apple's public feed sometimes serves an empty page from its cache. Many scrapers read it as
"no more reviews" and stop at 450 or 500. This Actor detects it and asks for a fresh page. Measured on Spotify across 5
countries: **4,995 reviews in about 30 seconds**.

**Why the language is detected.** A storefront is not a language: see the review from the German App Store written in
English below. The `language_detected` field reads the text itself.

### What data do you get?

| Field | Example | Notes |
|---|---|---|
| `store` | `apple` | always `apple` here |
| `app_id`, `app_name` | `324684580`, `Spotify: Music and Podcasts` | |
| `country` | `jp` | App Store storefront |
| `language_detected`, `language_confidence` | `ja`, `0.99` | from the text itself, empty under 25 letters |
| `rating` | `1` | 1 to 5 stars |
| `title`, `text` | | |
| `date` | `2026-09-30T11:15:55Z` | UTC |
| `app_version`, `version_confidence` | `9.1.86`, `exact` | as given by Apple |
| `helpful_count` | `3` | |
| `review_id` | `apple:324684580:13470918234` | stable across runs |
| `author_hash` | `a1b2c3d4e5f60718` | stable anonymous ID |
| `author_name` | `null` | only if you turn it on |

The same schema is used by our Google Play and two-store Actors, so you can merge the results without any mapping.

#### Real reviews from a test run

| Country | Stars | Version | Language | Review |
|---|---|---|---|---|
| Japan | ★☆☆☆☆ | 9.1.86 | ja | プレイリスト作成して再生すると聞いたこともないアーティストのおすすめから再生される。 |
| Brazil | ★★★★★ | 9.1.86 | pt | Nao tem como viver nesse mundo sem musica, dito isso, me salvou da depressao! |
| Germany | ★☆☆☆☆ | 9.1.86 | **en** | Can't stream anymore… unbelievable |

### How to use it

1. **Apps**: one per line. An App Store URL (`https://apps.apple.com/us/app/.../id324684580`) or the numeric Apple ID (`324684580`).
2. **App Store countries**: pick as many as you need, out of 175.
3. **Max reviews**: per app and country.
4. **Filter by stars** (optional): for example 1 to 2 for negative reviews only. Max reviews and billing count kept reviews only.
5. **Scheduled tracking** (optional): turn on **Only new reviews since the last run**, give it a **tracking name**, and schedule the Actor daily or weekly.

#### Input example

```json
{
  "apps": ["https://apps.apple.com/us/app/spotify-music-and-podcasts/id324684580"],
  "appleCountries": ["us", "gb", "fr", "de", "jp"],
  "maxReviewsPerApp": 1000,
  "onlyNewReviews": false
}
```

### Don't have the app list? Find apps first

Fill **Search terms** or **Developers** instead of (or together with) **Apps**, and the Actor finds the App Store apps first, then collects their reviews:

- **Search terms**: one keyword per line. For each keyword and country, the top App Store apps (5 by default, up to 200).
- **Developers**: the numeric Apple developer ID (`324684583`) or the developer page URL. The Actor takes up to 20 apps per developer.

Reviews are collected for every app found, so set **Max reviews per app** too. For Google Play, use the Google Play Actor below.

### Use cases

- 📦 **iOS product managers**: see what a release changed, version by version.
- 🔎 **ASO and marketing**: read how users talk about you and your competitors, country by country, in their own words.
- 🎧 **Support and community teams**: get today's 1 and 2-star reviews only.
- 📊 **Analysts and investors**: compare apps of a category across markets with the same fields.
- 🤖 **Data pipelines and AI agents**: a stable schema, stable IDs and new reviews only, ready to feed a database or a model.

### Pricing

**$0.30 per 1,000 reviews** on the free plan, lower on paid Apify plans, down to **$0.15 per 1,000 reviews**. A run that
finds no new review only costs the Actor start. The $5 of monthly credit on Apify's free plan covers **about 16,000
reviews a month**. Set a maximum cost per run in the run options if you want a hard cap.

### Integrations

Run it from the [Apify API](https://docs.apify.com/api/v2), schedule it, send results to Google Sheets, Slack, Zapier,
Make or a webhook, or call it from an AI agent through the Apify MCP server. Export to JSON, CSV, Excel or HTML.

### Need Google Play too?

- [Google Play Reviews Scraper API](https://apify.com/happyscrapper/google-play-reviews-scraper): full history, developer replies, same schema.
- [App Store & Google Play Reviews Scraper API](https://apify.com/happyscrapper/app-store-google-play-reviews): both stores in one run.
- [App Store & Google Play Scraper](https://apify.com/happyscrapper/app-store-google-play-app-details): app details instead of reviews: update date, release notes, ratings, installs, permissions, price per country.

### FAQ

#### Is it legal to scrape App Store reviews?

The Actor only reads reviews that Apple displays publicly, at a moderate pace. Reviewer names are personal data: they
are **replaced by an anonymous hash by default**, and you should only turn names on if you have a legal basis to
process them. You remain responsible for how you use the data. If in doubt, ask a lawyer.

#### How many reviews can I get?

Up to about 1,000 per app and country per run: Apple's public feed gives the 500 most recent and the 500 most helpful.
Schedule it with **Only new reviews** to build a longer history over time.

#### Are developer replies included?

Not on the App Store: Apple's public feed doesn't carry them. Our Google Play Actor does.

#### Why is `language_detected` sometimes empty?

When a review has fewer than 25 letters ("Great app 👍"), the language can't be told reliably, so the field stays empty
rather than wrong.

#### I pasted an Android package and the run failed. Why?

This Actor reads the App Store only. A name like `com.example.app` is an Android package: use our Google Play Actor, or
the two-store Actor for both at once.

#### Something is wrong or missing?

Open an issue on this page. Every report is read.

#### Is this Actor affiliated with Apple?

No. App Store is a trademark of Apple Inc.

# Actor input Schema

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

One app per line: an App Store URL (apps.apple.com/...) or the numeric Apple ID (e.g. 324684580). Find the ID at the end of the App Store URL.

## `searchTerms` (type: `array`):

One keyword per line. The Actor finds the top apps for each keyword on the stores this Actor reads (App Store: by country, Google Play: the first page of results, about 24), then collects their reviews. Use it instead of, or together with, the Apps field.

## `maxAppsPerSearch` (type: `integer`):

How many of the top results to keep for each search term and country. Reviews are collected for each of them, so keep it small and set 'Max reviews per app' too.

## `developers` (type: `array`):

One developer per line. App Store: the numeric Apple developer ID (e.g. 324684583) or the developer page URL. Google Play: the developer page URL (play.google.com/store/apps/developer?id=...) or the developer exactly as in that address. The Actor collects the reviews of their apps.

## `maxAppsPerDeveloper` (type: `integer`):

Upper bound of apps taken from each developer.

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

Apple keeps separate reviews per country storefront. Pick every country you need: results are merged and de-duplicated in one run.

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

Upper bound for each app × country. Apple's public feed gives up to about 1,000 per app and country.

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

Keep only reviews with at least this many stars. Max reviews and billing count kept reviews only.

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

Keep only reviews with at most this many stars. Example: 1 to 2 for negative reviews only.

## `onlyNewReviews` (type: `boolean`):

For scheduled runs: return (and bill) only reviews published after the newest one collected by the previous run with the same tracking name. Uses the most recent sort only.

## `trackingName` (type: `string`):

Keeps separate memories for separate schedules (e.g. one per client or per app portfolio).

## `includeAuthorName` (type: `boolean`):

Off by default: authors are replaced by a stable anonymous hash. Turn on only if you have a legal basis to process reviewers' names.

## Actor input object example

```json
{
  "apps": [
    "https://apps.apple.com/us/app/spotify-music-and-podcasts/id324684580"
  ],
  "maxAppsPerSearch": 5,
  "maxAppsPerDeveloper": 20,
  "appleCountries": [
    "us"
  ],
  "maxReviewsPerApp": 50,
  "minRating": 1,
  "maxRating": 5,
  "onlyNewReviews": false,
  "trackingName": "default",
  "includeAuthorName": false
}
```

# Actor output Schema

## `reviews` (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 = {
    "apps": [
        "https://apps.apple.com/us/app/spotify-music-and-podcasts/id324684580"
    ],
    "appleCountries": [
        "us"
    ],
    "maxReviewsPerApp": 50
};

// Run the Actor and wait for it to finish
const run = await client.actor("happyscrapper/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": ["https://apps.apple.com/us/app/spotify-music-and-podcasts/id324684580"],
    "appleCountries": ["us"],
    "maxReviewsPerApp": 50,
}

# Run the Actor and wait for it to finish
run = client.actor("happyscrapper/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": [
    "https://apps.apple.com/us/app/spotify-music-and-podcasts/id324684580"
  ],
  "appleCountries": [
    "us"
  ],
  "maxReviewsPerApp": 50
}' |
apify call happyscrapper/app-store-reviews-scraper --silent --output-dataset

```

## MCP server setup

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