# App Store Reviews Scraper: All Reviews, No 500 Cap (`wulfcare/app-store-reviews-scraper`) Actor

Scrape every Apple App Store review of any app, with no 500 cap: any country, newest/helpful/critical sort, star and date filters, developer replies and app versions. $0.10 per 1,000 reviews, no start fee, errors free.

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

## Pricing

$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

Scrape **every Apple App Store review** of any app, **with no 500 cap**. Apple's RSS feed stops at 500 reviews; this goes back to an app's very first review (WhatsApp in the US: 200,000+).

- **Sort** newest first, most helpful, most favorable or most critical
- **Filter by star rating** (only 1-2 stars, say) and **stop at a date** (only reviews since 2026-09-01, or the last 30 days)
- **Several countries in one run**: any of the 175 App Store countries
- Each review has the stars, title, text, date, whether it was edited, **the developer's reply**, and **the app version the reviewer used** (for the newest 500)
- Apps by **URL, numeric id or bundle id** (`com.spotify.client`)
- **$0.10 per 1,000 reviews**, no start fee, and errors are free

A missing app, a typo or an app that isn't sold in a country **never crashes the run**. You get a free row that says what went wrong, and the other apps carry on.

Need app details, search, top charts or privacy labels too? Use the full [App Store Scraper](https://apify.com/wulfcare/app-store-scraper).

### What people use it for

- **Review monitoring**: run it daily with *Only reviews since: 1 day* and send new 1-2 star reviews to Slack, email or a spreadsheet
- **Sentiment analysis and LLM datasets**: pull tens of thousands of reviews of your app and your competitors' apps into an LLM, a vector store or a BI tool
- **Release QA**: the app version on recent reviews shows which release caused a spike in complaints
- **Complaint mining**: *Most critical* with 1-star only gets every complaint first, and the run stops as soon as it's past them
- **Competitor research and ASO**: what users love and hate about every app in your category, in every market

### How to use it

1. Add apps: App Store URLs, ids like `324684580`, or bundle ids like `com.spotify.client`.
2. Set the **countries** (default `us`). Add several to cover them all in one run.
3. Set **Max reviews per app** (0 = all of them), and optionally a sort, star filter or date.
4. Run it, then download JSON, CSV or Excel, or call the API.

Every column is present on every row (`null` when the App Store has no value), and the columns don't change between runs.

### What you get: one row per review

```json
{
  "appId": "324684580",
  "appTitle": "Spotify: Music and Podcasts",
  "reviewId": "14603418822",
  "score": 2,
  "title": "Keeps pausing",
  "text": "Since the last update the music stops whenever I lock my phone.",
  "date": "2026-09-28T13:39:43Z",
  "isEdited": false,
  "appVersion": "9.1.86",
  "replyText": "Hey! Sorry to hear that. Could you try a clean reinstall? ...",
  "replyDate": "2026-09-28T19:02:11Z",
  "userName": null,
  "appUrl": "https://apps.apple.com/us/app/id324684580",
  "country": "US",
  "language": null,
  "error": null
}
```

Reviewer **nicknames** are optional (off by default). No other reviewer data is collected.

### Pricing

**$0.10 per 1,000 reviews.** There's no start fee and no monthly rental, and **you're never charged for errors**: not-found apps, invalid inputs and failed requests are free rows. With a star filter, you only pay for reviews with those stars.

Set **Max cost per run** in the run options to cap your spend. The run stops cleanly when it gets there, and you keep everything scraped so far.

### Examples

**Every 1- and 2-star review from the last 30 days**

```json
{ "appIds": ["https://apps.apple.com/us/app/id324684580"], "maxReviewsPerApp": 0, "reviewStars": ["1", "2"], "reviewsSince": "30 days" }
```

**New reviews from every English-speaking store, for a daily schedule**

```json
{ "appIds": ["com.yourcompany.app"], "countries": ["us", "gb", "ca", "au", "nz", "ie"], "maxReviewsPerApp": 0, "reviewsSince": "1 day" }
```

**Every review an app has ever had** (Bear: all 1,700+ US reviews back to 2016, in under a minute)

```json
{ "appIds": ["1016366447"], "maxReviewsPerApp": 0 }
```

### Good to know

- **Reviews belong to a country's store.** The US store has the reviews written in the US store, whatever their language. Add more countries to get more reviews.
- **Speed**: about **500-700 reviews a minute** (5,000 reviews in 7-10 minutes, 30,000-40,000 an hour). Apple limits how fast one IP address can page through reviews, so the Actor paces itself just under that limit instead of getting blocked, and spreads requests over Apify Proxy too. Very large pulls (100,000+ reviews) run faster with residential proxy and more parallel connections. The default run timeout is 5 hours; raise it for bigger pulls. If Apple blocks a shared IP for 15 minutes, the app ends with a free error row saying how many reviews were saved, and you only pay for those.
- **App version on reviews**: Apple only publishes it for the newest (and most helpful) 500 reviews of each app per country. Older reviews have `appVersion: null`.
- **Apps not sold in a country** show up as "App not found in the XX App Store". Run again with a country where it's sold.
- **Everything comes from the public App Store website**, as a logged-out visitor sees it. No Apple account is used.
- **Data accuracy:** results are what the source showed at run time, collected from public pages, and can contain errors or change later. Check anything important before you rely on it.

### Other Actors by Wulfcare Data

- [Google Play Reviews Scraper](https://apify.com/wulfcare/google-play-reviews-scraper): every Google Play review, with no cap, at the same price
- [App Store Scraper](https://apify.com/wulfcare/app-store-scraper): reviews plus app details, privacy labels, search, top charts, developer and similar apps
- [Google Play Scraper](https://apify.com/wulfcare/google-play-scraper): the same for Google Play (reviews, app details, data safety, charts)
- [YouTube Transcript Scraper](https://apify.com/wulfcare/youtube-transcript-scraper): transcripts of videos, whole channels, playlists and searches
- [Free YouTube Scraper](https://apify.com/wulfcare/youtube-scraper): YouTube videos, Shorts, channels and searches, free

Found a problem or need a field? Open an issue on the Issues tab.

# Actor input Schema

## `appIds` (type: `array`):

App Store URLs (https://apps.apple.com/us/app/.../id324684580), numeric app ids (324684580) or bundle ids (com.spotify.client). Every review of each app is fetched, up to the limit below.

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

Two-letter App Store country codes (us, gb, de, jp, br, ...). Each country is its own store with its own reviews, prices, charts and search results; add several to cover them all in one run. Every row says which country it came from.

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

0 = every review the App Store has for the app in each country (no 500 cap). With a star filter, this counts only reviews with those stars.

## `reviewsSort` (type: `string`):

Newest first is best for monitoring and date cutoffs. Most critical is the fastest way to get complaints.

## `reviewStars` (type: `array`):

Leave empty for all ratings. You're only charged for reviews with these stars. Tip: with Most critical (or Most favorable) the run stops as soon as it's past the stars you picked.

## `reviewsSince` (type: `string`):

Skip reviews older than this, e.g. 2026-09-01 or "30 days". With Newest first the run stops as soon as it reaches older reviews.

## `includeReviewerNames` (type: `boolean`):

Off by default. The App Store shows a nickname for each reviewer; no other reviewer data is collected.

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

The App Store limits how fast one IP can page through reviews, so requests are spread over the run's own IP and Apify Proxy IPs. Datacenter proxy is plenty.

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

How many IPs requests are spread over (the run's own IP plus proxy sessions). More is faster for very large review pulls.

## Actor input object example

```json
{
  "appIds": [
    "https://apps.apple.com/us/app/spotify-music-and-podcasts/id324684580"
  ],
  "countries": [
    "us"
  ],
  "maxReviewsPerApp": 100,
  "reviewsSort": "newest",
  "includeReviewerNames": false,
  "proxyConfiguration": {
    "useApifyProxy": true
  },
  "maxConcurrency": 6
}
```

# Actor output Schema

## `results` (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 = {
    "appIds": [
        "https://apps.apple.com/us/app/spotify-music-and-podcasts/id324684580"
    ],
    "countries": [
        "us"
    ],
    "maxReviewsPerApp": 100,
    "proxyConfiguration": {
        "useApifyProxy": true
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("wulfcare/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 = {
    "appIds": ["https://apps.apple.com/us/app/spotify-music-and-podcasts/id324684580"],
    "countries": ["us"],
    "maxReviewsPerApp": 100,
    "proxyConfiguration": { "useApifyProxy": True },
}

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

```

## MCP server setup

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