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

Pull Apple App Store reviews for any iPhone, iPad or Mac app from one country or more than 100 at once, with star, date and keyword filters. Each review includes rating, title, text, app version, helpful votes and optional app stats like overall rating, version and developer.

- **URL**: https://apify.com/datamole/app-store-reviews-scraper.md
- **Developed by:** [DataMole](https://apify.com/datamole) (community)
- **Categories:** E-commerce
- **Security:** Limited permissions
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $10.00 / 1,000 result-items

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

![DataMole](https://raw.githubusercontent.com/YoiderD/datamole-assets/main/banner.png)

## 🍎 App Store Reviews Scraper

> **Collect Apple App Store reviews for any iPhone, iPad or Mac app, from one country or 100+ countries in a single run.** Filter by stars, dates and keywords, and only pay for the reviews you keep.

**App Store Reviews Scraper** pulls customer reviews from the Apple App Store. On the App Store every country has **its own reviews**, so this Actor lets you add as many countries as you want, or turn on **Scrape all countries** to scan 100+ storefronts automatically. In one test run it collected **22,000+ unique reviews for a single app**. Each review comes with rating, title, text, date, app version, reviewer and helpful votes, plus optional app stats: overall rating, rating count, current version, developer, genre, price and release dates.

| 🎯 Who uses it | 💡 What for |
|---|---|
| Product managers, iOS developers, ASO specialists, UX researchers, market analysts, agencies | Complaint and bug mining, competitor research, sentiment analysis, release monitoring, localization feedback, AI training data |

### 📋 What it does

- 🍏 **Any app input.** App IDs (`324684580`), App Store URLs, or bundle IDs (`com.spotify.client`).
- 🔍 **Find apps by keyword.** Type `meditation` and get reviews for the top matching apps.
- 🌍 **Many countries in one run.** Pick countries, or scan all 100+ storefronts for maximum coverage. Duplicates are removed.
- 🔀 **Two sort orders.** Newest, most helpful, or both combined for extra coverage.
- ⭐ **Star filter**, 📅 **date range**, 🔑 **keyword filter** (title and text) and a **minimum length** filter.
- 📊 **App stats on every row.** Rating, rating count, current version rating, developer, genre, price, content rating and release dates.
- 🛡️ **Resilient.** Apple's review feed sometimes returns empty pages or temporary blocks. The Actor retries them automatically so you do not lose reviews.

### ⚙️ Input

| Field | What it does |
|---|---|
| `apps` | App IDs, App Store URLs or bundle IDs. |
| `maxReviewsPerApp` | Limit per app, summed across countries (default 500). |
| `maxItems` | Hard limit for the whole run. |
| `countries` | Two-letter App Store country codes. |
| `allCountries` | Scan 100+ countries automatically. |
| `searchQueries` / `appsPerQuery` | Find apps by keyword. |
| `sort` | `newest`, `most_helpful` or `both`. |
| `ratings` | Star ratings to keep. |
| `dateFrom` / `dateTo` | Date range (YYYY-MM-DD). |
| `keywords` | Keep reviews mentioning any of these words. |
| `minTextLength` | Skip very short reviews. |
| `includeAppDetails` | Add app stats to each review (default on). |

**Example: every 1 and 2 star review of a competitor, worldwide**

```json
{
    "apps": ["https://apps.apple.com/us/app/duolingo-language-lessons/id570060128"],
    "allCountries": true,
    "sort": "both",
    "ratings": ["1", "2"],
    "maxReviewsPerApp": 20000
}
```

**Example: Latin America feedback in the last 30 days**

```json
{
    "apps": ["324684580"],
    "countries": ["mx", "co", "ar", "cl", "pe"],
    "dateFrom": "2026-09-01"
}
```

> ℹ️ **Free Apify plan:** runs return a preview of up to 10 results. Any paid Apify plan unlocks the full results.

### 📊 Output

Real record from a run:

```json
{
    "reviewId": "14603363606",
    "appId": "324684580",
    "appTitle": "Spotify: Music and Podcasts",
    "country": "us",
    "rating": 4,
    "title": "The APP has been wonky lately",
    "text": "Lately the APP freezes when I go between APP on my iPad. Other than that, I enjoy the content.",
    "reviewDate": "2026-09-28T13:23:24.000Z",
    "reviewedVersion": "9.1.86",
    "userName": "Whatamithinkin",
    "userUrl": "https://itunes.apple.com/us/reviews/id292622527",
    "helpfulVotes": 0,
    "totalVotes": 0,
    "appRating": 4.77,
    "appRatingCount": 42333854,
    "appCurrentVersion": "9.1.86",
    "appCurrentVersionDate": "2026-09-23T17:49:27.000Z",
    "appDeveloper": "Spotify",
    "appBundleId": "com.spotify.client",
    "appGenre": "Music",
    "appPrice": 0,
    "appCurrency": "USD",
    "appContentRating": "12+",
    "appUrl": "https://apps.apple.com/us/app/spotify-music-and-podcasts/id324684580",
    "scrapedAt": "2026-09-29T21:43:12.437Z"
}
```

App stats come from the first country in your list.

### ✨ Why this one

- ✅ **Global coverage built in.** One switch scans 100+ countries, where most scrapers only read one.
- ✅ **No lost pages.** Apple's feed randomly returns empty or blocked pages. They are retried instead of silently skipped.
- ✅ **Filters before you pay.** Stars, dates, keywords and length are applied before results are saved.
- ✅ **Keyword discovery.** Start from a market instead of a list of app IDs.
- ✅ **Lightweight.** No browser, low memory, fast.

### ❓ FAQ

**How many reviews can I get per app?** Apple exposes up to about 500 recent and 500 most helpful reviews per country. With `sort: both` and many countries you can collect tens of thousands for popular apps.

**Why do US results look small for some apps?** Apple limits the review feed per country. Add more countries to go further.

**Can I monitor new reviews daily?** Yes. Schedule the Actor with `sort: newest` and `dateFrom` set to yesterday.

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

**Does it include developer responses?** Apple's public review feed does not include them.

**What happens with invalid IDs?** They produce a clear `error` row and the run continues.

### 🔌 Integrations

Works with the Apify API, schedules, webhooks, Google Sheets, Make, Zapier, n8n, Slack and any tool that reads JSON.

### ⚖️ Disclaimer

This Actor collects publicly available data from the Apple App Store. It is not affiliated with or endorsed by Apple. Use the data responsibly and in line with applicable laws and Apple's terms.

# Actor input Schema

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

App Store app IDs (324684580), app URLs (https://apps.apple.com/us/app/spotify/id324684580) or bundle IDs (com.spotify.client).

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

Stop after this many reviews for each app, summed across all countries.

## `maxItems` (type: `integer`):

Hard cap for the whole run. Leave empty for no cap.

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

Two-letter App Store country codes (us, gb, mx, co, br, de...). Each country has its own reviews.

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

Scan 100+ App Store countries automatically. Best way to collect the largest number of reviews for global apps.

## `searchQueries` (type: `array`):

Search the App Store and scrape reviews of the top matching apps (e.g. "meditation").

## `appsPerQuery` (type: `integer`):

How many top search results to take for each keyword.

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

Newest is best for monitoring and date filters. Both combines the two lists for extra coverage.

## `ratings` (type: `array`):

Only keep reviews with these star ratings. Empty = all.

## `dateFrom` (type: `string`):

Only reviews posted on or after this date (YYYY-MM-DD).

## `dateTo` (type: `string`):

Only reviews posted on or before this date (YYYY-MM-DD).

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

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

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

Skip very short reviews.

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

Adds app name, overall rating, rating count, current version, developer, genre, price and release dates to each row.

## `proxyConfiguration` (type: `object`):

Not needed in most cases. Use datacenter proxies if Apple starts rate limiting very large runs.

## Actor input object example

```json
{
  "apps": [
    "324684580"
  ],
  "maxReviewsPerApp": 500,
  "countries": [
    "us"
  ],
  "allCountries": false,
  "appsPerQuery": 5,
  "sort": "newest",
  "minTextLength": 0,
  "includeAppDetails": true
}
```

# 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": [
        "324684580"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("datamole/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": ["324684580"] }

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

```

## MCP server setup

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