# App Store Reviews Scraper - iOS Reviews, All Countries (`mossgreen_zed/apple-app-store-reviews-multi-country`) Actor

Scrape Apple App Store reviews for any iPhone/iPad app across 50+ countries: rating, title, text, version, date, votes. Up to 1,000 reviews per country (recent + most helpful), filters by stars, keyword and date, new-reviews-only monitoring. $0.20 per 1,000 reviews.

- **URL**: https://apify.com/mossgreen_zed/apple-app-store-reviews-multi-country.md
- **Developed by:** [Joshua Temko](https://apify.com/mossgreen_zed) (community)
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $0.20 / 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: iPhone & iPad App Reviews from 50+ Countries

**Export Apple App Store reviews for any iOS app to JSON, CSV or Excel in seconds.** Paste an App Store URL, app ID, bundle ID or app name and get one clean row per review: star rating, title, full text, app version, date, helpful votes and country, plus the app's average rating and rating count.

Most App Store review scrapers only read one country. Apple stores reviews **per storefront**, so this Actor can sweep **52 storefronts in one run** and combines Apple's "most recent" and "most helpful" feeds to return **up to ~1,000 unique reviews per country**. That's tens of thousands of reviews for popular apps.

It uses Apple's official public customer-reviews feed and the iTunes Search/Lookup API. No login, no browser, no proxies, no API key.

### Who uses it

- **Product managers and UX researchers.** Find the top complaints after each release (filter 1-2 stars and `appVersion`).
- **App marketers and ASO agencies.** Monitor competitor apps' reviews in every market and pull keywords users actually use.
- **Customer support teams.** Pipe new 1-star reviews into Slack every morning with monitoring mode.
- **Data scientists and AI teams.** Build sentiment and topic datasets across languages and countries.
- **Investors and analysts.** Track rating trends and complaint volume for public-company apps.

### Input

| Field | Description |
|---|---|
| `apps` (required) | App Store URLs, numeric IDs (`570060128`), bundle IDs (`com.burbn.instagram`) or app names. |
| `countries` | Storefront codes, default `["us"]`. |
| `allCountries` | Adds the 52 largest storefronts. |
| `sortBy` | `both` (default, most reviews), `mostrecent` or `mosthelpful`. |
| `maxReviewsPerApp`, `maxReviewsPerCountry` | Caps. Default 500 per app. |
| `minRating` / `maxRating` | Star filter, e.g. 1–2 for complaints only. |
| `reviewsWithinDays` | Only recent reviews. |
| `keywords` | Only reviews mentioning e.g. `crash`, `subscription`, `refund`. |
| `onlyNewReviews` | **Monitoring mode**: scheduled runs return and charge only for new reviews. |
| `includeAppDetails`, `includeReviewerName` | Output options. |

```json
{
  "apps": ["https://apps.apple.com/us/app/duolingo-language-lessons/id570060128", "Notion"],
  "countries": ["us", "gb", "de"],
  "sortBy": "both",
  "maxRating": 2,
  "maxReviewsPerApp": 2000
}
```

### Output (one row per review)

Real row from a test run on 2026-10-30:

```json
{
  "reviewId": "14724832112",
  "appId": 570060128,
  "appName": "Duolingo: Learn Languages",
  "country": "de",
  "rating": 5,
  "title": "Gut lernen",
  "text": "Ich lerne durch Duolingo sehr gut",
  "appVersion": "7.146.1",
  "date": "2026-10-29T08:41:54+00:00",
  "userName": "Charly Chips 6",
  "helpfulVotes": 0,
  "totalVotes": 0,
  "foundVia": "mostrecent",
  "appDeveloper": "Duolingo",
  "appBundleId": "com.duolingo.DuolingoMobile",
  "appGenre": "Education",
  "appAverageRating": 4.72,
  "appRatingCount": 5544946,
  "appCurrentVersion": "7.146.1",
  "appUrl": "https://apps.apple.com/us/app/duolingo-language-lessons/id570060128"
}
```

A per-app summary (reviews per country, apps not found) is saved to the `RUN_SUMMARY` record in the run's key-value store.

### Pricing (pay per event)

- **$0.20 per 1,000 reviews** ($0.0002 per review), plus Apify's tiny standard actor-start fee.
- Apps that can't be found cost nothing, and you're never charged for duplicate or filtered-out reviews.
- Example: 1,000 reviews for 10 competitor apps = 10,000 reviews = **$2**.
- Use "Maximum cost per run" in run options to cap spending.

### FAQ

**How many reviews can I get?** Apple's public feed serves the latest 500 reviews per sort order per country. With `sortBy: both` you get up to ~1,000 per country, and with `allCountries` up to ~50,000 per app for very popular apps. For the full lifetime history of one country, schedule the Actor with `onlyNewReviews` and let your dataset grow over time.

**Can I scrape Google Play too?** This Actor is for Apple's App Store (iPhone, iPad, Mac apps listed on the App Store).

**I searched by name and got the wrong app.** Names use the first search result in the first country listed. Paste the App Store URL or ID for an exact match.

**Is it legal?** It reads Apple's public review feed, which Apple publishes for anyone to use. Reviews are public. You can drop reviewer nicknames with `includeReviewerName: false`.

# Actor input Schema

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

One per line: an App Store URL (https://apps.apple.com/us/app/duolingo/id570060128), a numeric app ID (570060128), a bundle ID (com.burbn.instagram) or an app name (top search result is used, so URLs/IDs are more exact).

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

Two-letter App Store country codes, e.g. us, gb, de, fr, jp. Each country has its own reviews.

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

Adds the 52 largest App Store storefronts to your list, to collect as many reviews as possible.

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

Apple returns up to 500 reviews per sort order per country. 'Both' combines Most recent + Most helpful (deduplicated) for up to ~1,000 per country.

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

0 = no limit. You are only charged for reviews returned.

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

0 = no limit (up to ~1,000 per country).

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

Keep reviews with at least this many stars.

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

Set to 2 to get only 1-2 star complaints.

## `reviewsWithinDays` (type: `integer`):

0 = any date.

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

Keep only reviews whose title or text contains one of these words, e.g. crash, price, subscription.

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

Remembers review IDs in a named key-value store so scheduled runs return (and charge for) new reviews only.

## `stateStoreName` (type: `string`):

Named key-value store used by 'Only new reviews'.

## `includeAppDetails` (type: `boolean`):

Developer, bundle ID, genre, average rating, rating count, current version.

## `includeReviewerName` (type: `boolean`):

Turn off to drop the public reviewer nickname and profile link.

## `maxConcurrency` (type: `integer`):

Maximum parallel HTTP requests. The default is polite and fast.

## Actor input object example

```json
{
  "apps": [
    "https://apps.apple.com/us/app/duolingo-language-lessons/id570060128"
  ],
  "countries": [
    "us"
  ],
  "allCountries": false,
  "sortBy": "both",
  "maxReviewsPerApp": 500,
  "maxReviewsPerCountry": 0,
  "minRating": 1,
  "maxRating": 5,
  "reviewsWithinDays": 0,
  "keywords": [],
  "onlyNewReviews": false,
  "stateStoreName": "app-store-reviews-seen",
  "includeAppDetails": true,
  "includeReviewerName": true,
  "maxConcurrency": 8
}
```

# Actor output Schema

## `results` (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/duolingo-language-lessons/id570060128"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("mossgreen_zed/apple-app-store-reviews-multi-country").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/duolingo-language-lessons/id570060128"] }

# Run the Actor and wait for it to finish
run = client.actor("mossgreen_zed/apple-app-store-reviews-multi-country").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/duolingo-language-lessons/id570060128"
  ]
}' |
apify call mossgreen_zed/apple-app-store-reviews-multi-country --silent --output-dataset

```

## MCP server setup

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

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/35vkffXzH1IoGlbOQ/builds/SXYWOAcmqEidG0PVk/openapi.json
