# App Store Reviews Scraper: Every Storefront, One Table (`deriverge/app-store-reviews-scraper`) Actor

Scrape Apple App Store reviews for any app and every country storefront: star rating, title, text, app version, date and helpful votes. Filter by stars and date, get only new reviews since your last run. Export JSON, CSV or Excel, API and schedules.

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

## Pricing

from $0.05 / 1,000 review returneds

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

Scrape Apple App Store reviews for any iPhone or iPad app from every country storefront: star rating, title, review text, date and the developer's reply, in one clean table. Give it App Store links or app IDs, and schedule it to get only new reviews every day.

You pay only for reviews returned, from $0.05 per 1,000, with no start fee. The $5 of monthly credit in Apify's Free plan covers about 50,000 reviews, so you can try it for free.

### Why use App Store Reviews Scraper?

- **Thousands of reviews per storefront.** The actor reads the reviews the App Store website shows, page after page, not just the 500 of Apple's old review feed. Read `us`, `gb`, `de`, `jp` or any of the 175 storefronts in one run, with the storefront on every row.
- **Developer replies included.** Each review carries the developer's reply with its date, when there is one.
- **The support queue, filtered.** `maxRating: 2` returns only complaints, and `reviewedAfter` cuts the archive off at a date. Filtered reviews are free.
- **Only new reviews, on a schedule.** With `newOnly`, each run returns just the reviews that appeared since the last one.
- **No browser, no proxies to set up, no login.** Reviews come from the same public source the App Store website uses.

### What data does App Store Reviews Scraper extract?

| Field | What it contains |
|---|---|
| `rating` | Star rating, 1 to 5 |
| `title` | The review title |
| `text` | The review text |
| `author` | The public nickname shown with the review |
| `createdAt` | When the review was posted (UTC) |
| `developerReply` | The developer's reply with `text` and `repliedAt`, or `null` |
| `country` | The storefront the review was read from |
| `appId` | Numeric App Store ID |
| `appName` | App name |
| `reviewId` | App Store review ID |
| `key` | Stable key for deduplication across runs |
| `url` | Link to the app's reviews on the App Store |

The App Store does not publish the app version or helpful votes with each review, so `version` and `helpfulVotes` are `null` on App Store rows. With **Add a row with the app details**, each app also gets one row with the developer, category, price, average rating, rating count and version.

### Who uses App Store Reviews Scraper?

- **App developers and product managers:** read what users say about each release, per country, and catch a bad update the day it ships.
- **Support teams:** pull only low-rated reviews without a reply into a queue, every morning.
- **App store optimization agencies:** track competitors' ratings and complaints across markets.
- **Researchers and data scientists:** build sentiment and topic datasets from real user feedback.

### How much does it cost to scrape App Store reviews?

You pay per result. There is no start fee and no charge for compute time or proxies.

| | Free plan | Starter | Scale | Business |
|---|---|---|---|---|
| 1,000 reviews | $0.10 | $0.08 | $0.065 | $0.05 |
| App details row, per 1,000 apps (optional) | $2.00 | $1.60 | $1.30 | $1.00 |

For example, a batch of 10,000 reviews costs $1.00 on the Free plan and $0.50 on the Business plan. The $5 of monthly credit in Apify's Free plan covers about 50,000 reviews.

Reviews removed by your filters and reviews already returned in new-only mode are never charged.

### How to scrape App Store reviews

1. Click **Try for free** (or **Start** if you are signed in) to open the actor in Apify Console.
2. In **Apps**, add App Store links such as `https://apps.apple.com/us/app/spotify-music-and-podcasts/id324684580` or numeric app IDs.
3. In **Storefronts**, pick the countries to read.
4. Optionally filter by rating or date, and choose the sort order.
5. Click **Start**. Rows appear in the **Output** tab within seconds.
6. Download the results as JSON, CSV, Excel or HTML, or read them through the API.

### Input example

```json
{
  "apps": [
    "https://apps.apple.com/us/app/spotify-music-and-podcasts/id324684580",
    "570060128"
  ],
  "countries": [
    "us",
    "gb",
    "de"
  ],
  "sort": "mostRecent",
  "maxReviewsPerApp": 200,
  "maxRating": 3
}
```

### Output example

A real row from a run in September 2026. In the **Output** tab the **Overview** view shows the same data as a table.

```json
{
  "key": "app-store:324684580:us:14593461931",
  "type": "review",
  "source": "app-store",
  "appId": "324684580",
  "appName": "Spotify: Music and Podcasts",
  "country": "us",
  "reviewId": "14593461931",
  "rating": 1,
  "title": "Remove new album art feature",
  "text": "I love this app. I use it every day and can’t live without it. That being said, please give an option to disable the new full screen album art feature. It’s unnecessary and makes using the UI obnoxious if you accidentally tap on the screen. Thanks",
  "author": "TDL1996",
  "version": null,
  "createdAt": "2026-09-25T23:24:47.000Z",
  "helpfulVotes": null,
  "developerReply": {
    "text": "Hi! Thank you for sharing your thoughts with us. This will only be our app icon for a short period of time. Make sure your app is updated to ensure that you revert the icon back once we turn it off.",
    "repliedAt": "2026-06-07T16:14:57.000Z"
  },
  "criteria": [],
  "url": "https://apps.apple.com/us/app/id324684580?see-all=reviews"
}
```

### Get only new reviews every day

Turn on **Return only reviews new since the last run** (`newOnly`), give the run a **Watch name** or save it as a task, and schedule it daily. Each run compares with the previous snapshot and returns only reviews that appeared since. You pay for the new rows only.

### Tips and limitations

- Big apps have tens of thousands of reviews in a single storefront; use **Maximum reviews per app** and **Reviewed on or after** to take what you need.
- Some storefronts return no reviews for an app that has plenty elsewhere. That is not an error and costs nothing.
- `sort: "mostRecent"` is what a monitor needs; `"mostHelpful"` matches what the store shows first.

### Integrations and API

Connect the actor to **Make**, **Zapier**, **n8n**, **Google Sheets**, **Slack** or any webhook, or call it from your own code. With the Python client:

```python
from apify_client import ApifyClient

client = ApifyClient("<YOUR_API_TOKEN>")
run = client.actor("deriverge/app-store-reviews-scraper").call(run_input={"apps": ["324684580"], "countries": ["us", "gb"], "maxReviewsPerApp": 100})
for review in client.dataset(run["defaultDatasetId"]).iterate_items():
    print(review["rating"], review["title"])
```

The **API** tab on this page has the same call for Node.js and cURL, and AI agents can run the actor through the Apify MCP server.

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

The actor reads reviews that the App Store publishes to anyone, and identifies reviewers only by the public nickname shown with the review. It collects no contact details. If you republish reviews, check the store's terms and the laws that apply to you.

### FAQ

#### How many reviews can I get?

Thousands per storefront: the actor pages through reviews 20 at a time, like the App Store website. Reading several storefronts multiplies that.

#### Where do I find the app ID?

In the App Store link: `.../id324684580` means the ID is `324684580`. You can also paste the whole link.

#### Can I get Google Play reviews too?

Yes, with our Google Play Reviews Scraper, or both stores in one table with App Reviews Scraper (links below).

#### Do I need proxies or an API key?

No.

### Related scrapers

- [Google Play Reviews Scraper](https://apify.com/deriverge/google-play-reviews-scraper): reviews with developer replies, any country

### Support and feedback

Missing a field or found something that does not work? Open an issue in the **Issues** tab and it will be answered, usually within a day. If the actor saves you time, a short review helps other people find it.

# Actor input Schema

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

One entry per app: an App Store link or the numeric id, for example 324684580. Google Play inputs are skipped and listed in the run summary; the two-store actor covers those.

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

Two-letter country codes of the storefronts to read, for example us, gb, de, jp. Each storefront has its own reviews, so more storefronts means more reviews. Leave empty for the US storefront.

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

Most recent is what a monitoring task wants. Most helpful is what the store shows first.

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

Cap per app across all storefronts in the run.

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

Keep only reviews with at least this many stars. Filtered reviews are never charged.

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

Keep only reviews with at most this many stars. Set 1 or 2 to read complaints only.

## `reviewedAfter` (type: `string`):

Drop reviews older than this date. Filtered reviews are never charged.

## `withDeveloperReply` (type: `string`):

The App Store feed does not publish developer replies, so this filter is only meaningful on Google Play; here every review counts as having no reply.

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

Adds one row per app with the developer, category, price, average rating, rating count and version. Charged as its own event.

## `newOnly` (type: `boolean`):

Keeps a snapshot per watch name (or per saved task) and returns only reviews that were not there before, plus reviews that received a developer reply since. Schedule it daily and you have a review alert that bills only for what is new.

## `watchName` (type: `string`):

Name of the snapshot used by the new-only mode, for example "our-apps". Runs from a saved task get a snapshot automatically even without a name.

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

Hard cap on returned rows across all apps in the run.

## Actor input object example

```json
{
  "apps": [
    "https://apps.apple.com/us/app/spotify-music-and-podcasts/id324684580"
  ],
  "countries": [
    "us",
    "gb"
  ],
  "sort": "mostRecent",
  "maxReviewsPerApp": 50,
  "withDeveloperReply": "any",
  "includeAppDetails": false,
  "newOnly": false,
  "maxItems": 5000
}
```

# Actor output Schema

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

One row per review with the rating, the text, the app version, the date, the helpful votes and the developer reply, in one schema for both stores.

## `changes` (type: `string`):

Reviews that appeared and reviews that received a developer reply, compared with the previous snapshot of the same watch name or task.

## `summary` (type: `string`):

Per-app counts, skipped inputs with reasons, how many reviews each filter dropped, and totals.

# 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"
    ],
    "countries": [
        "us",
        "gb"
    ],
    "maxReviewsPerApp": 50
};

// Run the Actor and wait for it to finish
const run = await client.actor("deriverge/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"],
    "countries": [
        "us",
        "gb",
    ],
    "maxReviewsPerApp": 50,
}

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

```

## MCP server setup

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