# App Store Reviews Scraper - iOS Reviews from All Countries (`yakk000/app-store-reviews-scraper`) Actor

Apple App Store reviews for any iOS app from one, several or all ~175 countries in one run: stars, title, text, app version, date, author and helpful votes. Paste a URL, id, bundle id or app name. Star, date and keyword filters. $0.10 per 1,000 reviews.

- **URL**: https://apify.com/yakk000/app-store-reviews-scraper.md
- **Developed by:** [Víctor Carrión](https://apify.com/yakk000) (community)
- **Categories:** Marketing, AI, Developer tools
- **Security:** Limited permissions
- **Stats:** 2 total users, 1 monthly users, 0.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.
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 Scraper: iOS app reviews from every country in one run

**App Store Reviews Scraper** exports Apple App Store reviews for any iOS app as clean JSON, CSV or Excel: star rating, title, review text, app version, date, author and helpful votes. Collect reviews from **one country, a list of countries or all ~175 App Store countries in a single run**, and paste apps the way you have them: an App Store URL, a numeric id, a bundle id or just the app name.

- **$0.10 per 1,000 reviews**, no start fee. Apps not found, countries without reviews and reviews removed by your filters are **free**.
- **All countries at once.** Each App Store country has its own reviews. Turn on *All countries* and get them all, tagged with the country code, without running the Actor 175 times. Real test: **7,429 Duolingo reviews from 173 countries in about one minute**, for $0.74.
- **Up to ~1,000 reviews per country.** Apple's feed gives up to 500 reviews per sort; the *Both* option merges *most recent* and *most helpful* without duplicates.
- **Filters that save money:** star ratings (e.g. only 1-2 star complaints), a start date (`2026-09-01` or `30 days`), keywords in the title or text, and a minimum text length.
- **Official public source.** Apple's public customer-reviews feed and the iTunes Search/Lookup API. No login, no cookies, no proxy needed.

### Who uses it

- **App developers and product managers:** read every complaint after a release, find crash and login issues by keyword, track rating by app version.
- **ASO and app marketing teams:** compare your app with competitors country by country and find the features people ask for.
- **Data and AI teams:** feed reviews into sentiment analysis, topic clustering or an LLM summary. The flat output works straight away in pandas, BigQuery or a vector store.
- **Agencies and analysts:** monitor many apps in many markets with one scheduled run.

### How to use it

1. Add your apps in **Apps**: `https://apps.apple.com/us/app/instagram/id389801252`, `389801252`, `com.spotify.client` or `Duolingo`.
2. Choose **Countries** (`us`, `gb`, `de`, `es`, `jp`...) or switch on **All countries**.
3. Optionally set **Star ratings**, **Reviews since** and **Keywords**.
4. Click **Start** and download the results as JSON, CSV, Excel or HTML, or get them by API.

#### Input example

```json
{
  "apps": ["https://apps.apple.com/us/app/instagram/id389801252", "com.spotify.client", "Duolingo"],
  "countries": ["us", "gb", "de"],
  "sort": "both",
  "maxReviewsPerCountry": 1000,
  "stars": ["1", "2"],
  "since": "90 days",
  "keywords": ["crash", "login"]
}
```

#### Output example

One item per review:

```json
{
  "appId": "389801252",
  "appName": "Instagram",
  "developer": "Instagram, Inc.",
  "country": "us",
  "reviewId": "14764780164",
  "rating": 1,
  "title": "Long press",
  "text": "Bring back long press to pause a video.",
  "appVersion": "454.1",
  "author": "Erin7105",
  "authorUrl": "https://itunes.apple.com/us/reviews/id537013709",
  "date": "2026-11-08T06:59:31Z",
  "helpfulVotes": 0,
  "totalVotes": 0,
  "sortedBy": "mostrecent",
  "appUrl": "https://apps.apple.com/us/app/instagram/id389801252",
  "input": "https://apps.apple.com/us/app/instagram/id389801252",
  "status": "ok",
  "scrapedAt": "2026-11-09T17:37:42Z"
}
```

Apps that can't be resolved return a free item with `"status": "not_found"` and the closest App Store matches, so you can fix the input. The key-value store record **SUMMARY** has, per app, the overall star rating, number of ratings, current version, genre, developer and how many reviews were returned in each country.

### Pricing

Pay per event: **$0.0001 per review returned** ($0.10 per 1,000). No start fee. Not charged: apps not found, countries with no reviews, and reviews dropped by your filters. Apify's free plan includes monthly credit, enough for tens of thousands of reviews at this price. You can set a maximum cost per run in the run options, and the Actor stops cleanly when it is reached.

### Limits you should know

- **Apple caps the public feed at 10 pages of 50 reviews per country and sort**, so up to 500 per sort and ~1,000 with *Both*. Every scraper that uses the public feed has this limit. To get more reviews, add countries: big apps have thousands of reviews across countries.
- Reviews are ordered by date only with *Most recent*. *Reviews since* stops paging early with that sort, which keeps runs fast.
- The feed has no developer replies and no reviewer country beyond the store country.
- The Actor paces its requests (about 150 reviews per second). If Apple rate-limits anyway, it pauses, retries and, if needed, stops and reports `blocked`, keeping and charging only the reviews already saved. It never uses proxies to get around Apple's limits.

### Use it from AI agents, Make, Zapier or code

Run it through the [Apify MCP server](https://mcp.apify.com) from Claude, ChatGPT, Cursor or any MCP client, connect it to Make, Zapier, n8n or Google Sheets, or call it with the Apify API:

```python
from apify_client import ApifyClient

client = ApifyClient("<YOUR_APIFY_TOKEN>")
run = client.actor("Yakk000/app-store-reviews-scraper").call(run_input={
    "apps": ["Duolingo"], "allCountries": True, "stars": ["1", "2"], "since": "30 days"})
for review in client.dataset(run["defaultDatasetId"]).iterate_items():
    print(review["country"], review["rating"], review["title"])
```

Schedule it daily with *Reviews since = 1 day* to get only the new reviews of your apps every morning.

### FAQ

**Can I get more than 500 reviews for one country?** With *Both* sorts you get up to ~1,000. Beyond that, Apple's public feed doesn't go further.

**Does it scrape Google Play?** No, Apple App Store only (iPhone, iPad and Mac apps listed on the App Store).

**Do I need an Apple account or API key?** No.

**Is scraping App Store reviews legal?** The Actor reads public reviews from Apple's public feed. Reviews include public usernames; if you store or process them, follow the data protection rules that apply to you (for example GDPR) and Apple's terms.

**Something is wrong or missing?** Open an issue on the Actor's Issues tab and it will be answered quickly.

# Actor input Schema

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

App Store URLs (https://apps.apple.com/us/app/instagram/id389801252), numeric app ids (389801252), bundle ids (com.spotify.client) or app names (Duolingo). Names are matched with Apple's search in the first country.

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

Two-letter App Store country codes, e.g. us, gb, de, es, fr, jp, br. Each country has its own reviews. Ignored when 'All countries' is on.

## `allCountries` (type: `boolean`):

Collect reviews from every App Store country in one run. Countries with no reviews cost nothing.

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

Apple's feed gives up to 500 reviews per country for each sort. 'Both' merges the two lists without duplicates.

## `maxReviewsPerCountry` (type: `integer`):

Per app and country, after filters. Up to 500 with one sort, up to ~1,000 with 'Both'.

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

Overall cap per app across countries. 0 = no cap.

## `stars` (type: `array`):

Keep only these ratings, e.g. 1 and 2 for complaints. Empty = all.

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

Only reviews on or after this date, e.g. 2026-09-01 or 30 days. With 'Most recent' the run stops paging as soon as it passes this date.

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

Case-insensitive, also inside longer words (crash matches crashes), e.g. crash, login, subscription, refund.

## `minTextLength` (type: `integer`):

Skip very short reviews such as 'Good'. 0 = keep all.

## Actor input object example

```json
{
  "apps": [
    "https://apps.apple.com/us/app/instagram/id389801252",
    "com.spotify.client",
    "Duolingo"
  ],
  "countries": [
    "us"
  ],
  "allCountries": false,
  "sort": "mostRecent",
  "maxReviewsPerCountry": 100,
  "maxReviewsPerApp": 0,
  "minTextLength": 0
}
```

# Actor output Schema

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

No description

## `reviewsJson` (type: `string`):

No description

## `summary` (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/instagram/id389801252",
        "com.spotify.client",
        "Duolingo"
    ],
    "countries": [
        "us"
    ]
};

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

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

```

## MCP server setup

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