# App Store Reviews Scraper: Developer Replies, No 500 Limit (`stratumics/app-store-reviews-scraper`) Actor

Get Apple App Store reviews with star ratings, titles, text, app versions, helpful votes and developer replies, well past Apple's 500-review limit, for any country, plus app ratings.

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

## Pricing

from $0.07 / 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** collects Apple App Store reviews for any iPhone, iPad or Mac app in any country: star rating, title, full text, date, app version, helpful votes, the edited flag and the **developer's reply**. It reads well past Apple's 500-review feed limit and adds an app details record with the average rating, the number of ratings and the star histogram, so it works as an **App Store reviews API** without an Apple developer account.

It reads public reviews only and never logs in.

### What does App Store Reviews Scraper do?

Give it App Store links (`https://apps.apple.com/us/app/instagram/id389801252`) or numeric app ids (`389801252`) and it returns one clean record per review:

- **Reviews**: star rating, title, full text with line breaks, exact date in UTC, the reviewer's public nickname and whether the review was edited.
- **Developer replies**: the reply text and its date, when the developer answered.
- **App version and helpful votes**: the version the reviewer used and how many people found the review helpful.
- **Every country**: each App Store country has its own reviews; pick as many countries as you like and each app is read once per country.
- **Sorting and filters**: newest first, most relevant first or highest rating first, only some star ratings (for example 1 and 2 stars for complaints), and a date cut-off.
- **App details**: one record per app and country with the name, developer, average rating, number of ratings, star histogram, price, category, current version, last update, release date and download size.

### Why use this App Store reviews scraper?

- **No 500-review ceiling.** Apple's public review feed stops at 500 reviews per country, and many scrapers stop with it. This one reads from Apple's full review history: in testing, Apple still served Instagram reviews past number 100,000 in the US store.
- **Developer replies included.** See how a competitor answers complaints, or audit your own support team's answers.
- **Fast.** About 200 reviews per request. 3,000 reviews of one app took 16 seconds on Apify, and 1,200 reviews each from two apps took 19 seconds.
- **Checked against Apple's other sources.** In testing, 1,200 of 1,200 reviews had the same rating, date, title, text, nickname and edited flag in this scraper's main source and in the App Store web app's own API.
- **Monitoring mode.** Turn on "Only new reviews" and schedule the run. Each run returns only reviews you have not received yet, remembered per app and country, so you do not pay twice for the same review (an edited review comes back once, with its new text).
- **Date ranges that stop early.** With "Only reviews newer than" and newest-first sorting, reading stops at the first older review, so you only pay for what is in range.
- **You pay for results only.** Reviews you filter out, apps that are not sold in a country and errors are never charged.
- **Keeps going when Apple is busy.** If Apple's main review endpoint refuses requests, the scraper switches to the App Store web API and then to Apple's review feed, and tells you in the log and run summary.

On top of that you get the Apify platform: scheduled runs, an API, webhooks, run history, and exports to JSON, CSV, Excel and more.

### What data can you extract from the App Store?

| Field | What it holds | Example |
|---|---|---|
| `appId`, `appName` | The app the review belongs to | `389801252`, `Instagram` |
| `country` | App Store country of the review | `us` |
| `reviewId` | Apple's id of the review | `14674817989` |
| `rating` | Stars from 1 to 5 | `1` |
| `title`, `text` | Review headline and full text | `Unable to select location` |
| `date` | Posted or last edited, ISO 8601 in UTC | `2026-10-16T20:30:22.000Z` |
| `version` | App version the reviewer used | `451.0.0` |
| `thumbsUp` | Helpful votes | `12` |
| `isEdited` | The reviewer edited the review | `false` |
| `developerReply` | Reply text and date, or null | `{ "text": "Hi, ...", "date": "..." }` |
| `histogram` (app records) | Number of 1 to 5 star ratings | `{ "1": 26316, ..., "5": 1784057 }` |
| `ratingsCount`, `rating` (app records) | Number of ratings and the average | `1926784`, `4.87` |

Every record has a `type` field: `review` or `app`. App records also carry price, currency, category, current version, update and release dates, size in bytes, age rating, bundle id and icon. The full list of fields, with descriptions, is on the Dataset tab of the output.

### How to scrape App Store reviews

1. Open App Store Reviews Scraper in Apify Console and click **Try for free**.
2. In **Apps**, paste App Store links or numeric app ids, one per line.
3. Optionally enter **Countries** (us, gb, de, jp, ...). Leave it empty to use the country in each link.
4. Set **Max reviews per app and country**. The default is 200. Set 0 to collect only the app details records.
5. Optionally pick a sort order, star ratings, a date cut-off, or turn on monitoring.
6. Click **Start**. When the run finishes, download the data as JSON, CSV or Excel, or read it through the API.

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

The scraper uses pay-per-event pricing, so you pay for what you get and nothing else:

| Event | Price |
|---|---|
| Review saved | $0.10 per 1,000 ($0.0001 each) |
| App details record saved | $0.002 each |

Each run also has a start fee of $0.0005, and larger Apify plans pay less per review automatically: $0.09 per 1,000 on Starter, $0.08 on Scale and $0.07 on Business. The **Pricing** tab always shows the current prices.

Worked examples:

- **1,000 reviews of one app in one country, with its app details record**, cost 1,000 × $0.0001 + $0.002 = **about $0.10**.
- **The 5,000 newest reviews of 3 competitor apps in the US and the UK** (30,000 reviews, 6 app records) cost **about $3.01**.
- **A daily monitor** of 5 apps in 2 countries that finds 40 new reviews a day costs about $0.004 a day without app records, or **about $0.14 a month** with the run start fees.

Set **Maximum cost per run** in the run options to cap your spend. The scraper stops cleanly at that amount and keeps everything collected so far; in monitoring mode, the next run picks up the reviews that were left.

### Input

See the **Input** tab for every option. A typical input:

```json
{
    "apps": ["https://apps.apple.com/us/app/instagram/id389801252", "368677368"],
    "countries": ["us", "gb"],
    "maxReviewsPerApp": 500,
    "sort": "newest",
    "stars": ["1", "2"],
    "newerThan": "30 days",
    "includeAppDetails": true
}
```

- **Countries**: two-letter codes. `uk` is read as `gb`. Each country is read separately, and the limit applies to each app in each country.
- **Sort by**: `newest`, `mostRelevant` (Apple's helpfulness order) or `rating` (highest rating first).
- **Only reviews newer than**: a date (`2026-10-01`), an ISO date-time in UTC, or a relative value such as `30 days` or `12 hours`.
- **Monitoring**: turn on **Only new reviews** and give each schedule its own **Monitor name**. The memory is a key-value store in your account named `app-store-reviews-monitor-<name>`.

### Output

You can download the dataset in various formats such as JSON, HTML, CSV, or Excel. Two reviews and an app record from real runs (reviewer names replaced, long texts shortened):

```json
[
    {
        "type": "review",
        "platform": "appStore",
        "appId": "368677368",
        "appName": "Uber: Rides, eats, and more",
        "country": "gb",
        "language": null,
        "reviewId": "2647840635",
        "userName": "reviewer-one",
        "rating": 1,
        "title": "The cleaning fee charge - Proof tab",
        "text": "Uber need to put in place a better system to prove when someone is causing damage during a journey. I had a bitter experience when I realised that I was charged £80 for someone’s misbehaviour resulting in paying the cleaning fee. ...",
        "version": "3.302.10003",
        "date": "2018-06-06T01:21:23.000Z",
        "isEdited": false,
        "thumbsUp": 12,
        "developerReply": {
            "text": "Hi, this certainly sounds like a frustrating experience. We understand how difficult this may have been for you. Let's make sure we follow up with you regarding this issue. ...",
            "date": "2018-06-07T09:47:18.000Z"
        },
        "url": "https://apps.apple.com/gb/app/id368677368?see-all=reviews",
        "scrapedAt": "2026-10-18T02:10:30.757Z"
    },
    {
        "type": "review",
        "platform": "appStore",
        "appId": "389801252",
        "appName": "Instagram",
        "country": "us",
        "language": null,
        "reviewId": "14674817989",
        "userName": "reviewer-two",
        "rating": 5,
        "title": "Number one ☝️",
        "text": "The best love insta 🤟😘",
        "version": "451.0.0",
        "date": "2026-10-16T20:30:22.000Z",
        "isEdited": false,
        "thumbsUp": 0,
        "developerReply": null,
        "url": "https://apps.apple.com/us/app/id389801252?see-all=reviews",
        "scrapedAt": "2026-10-18T02:00:06.487Z"
    },
    {
        "type": "app",
        "platform": "appStore",
        "appId": "368677368",
        "appName": "Uber: Rides, eats, and more",
        "country": "gb",
        "developer": "Uber Technologies, Inc.",
        "developerId": "368677371",
        "rating": 4.86691,
        "ratingsCount": 1926784,
        "histogram": { "1": 26316, "2": 7097, "3": 20572, "4": 88742, "5": 1784057 },
        "price": 0,
        "currency": "GBP",
        "priceText": "Free",
        "genre": "Travel",
        "version": "3.743.10001",
        "updated": "2026-10-12T15:13:28.000Z",
        "released": "2010-05-21T03:11:23.000Z",
        "size": 426281984,
        "contentRating": "4+",
        "url": "https://apps.apple.com/gb/app/uber-rides-eats-and-more/id368677368",
        "scrapedAt": "2026-10-18T02:00:01.242Z"
    }
]
```

Each run also saves a **SUMMARY** record in its key-value store with the status, review count, pages read, the reason reading stopped, and any problem for every app and country.

### Tips for scraping App Store reviews

- **Want complaints only?** Pick 1 and 2 stars. You pay only for the reviews that match.
- **Following a launch?** Sort by newest with "Only reviews newer than" set to the launch date.
- **Comparing markets?** Add several countries. Big markets such as the US, the UK, Germany and Japan have their own, very different reviews.
- **Reviews of the current version**: the `version` field is filled for the newest 500 and the most helpful 500 reviews per country, which is as far as Apple publishes it.
- **Only need ratings?** Set the review limit to 0 and keep app details on: one record per app and country with the star histogram.

### Integrations and API

- **API**: start runs and read results over HTTP from any language. See the **API** tab for ready-made requests.
- **JavaScript**:

```js
import { ApifyClient } from 'apify-client';

const client = new ApifyClient({ token: process.env.APIFY_TOKEN });
const run = await client.actor('stratumics/app-store-reviews-scraper').call({
    apps: ['389801252'],
    countries: ['us'],
    maxReviewsPerApp: 1000,
});
const { items } = await client.dataset(run.defaultDatasetId).listItems();
console.log(items.filter((item) => item.type === 'review' && item.rating <= 2).length);
```

- **Python**:

```python
from apify_client import ApifyClient

client = ApifyClient("<YOUR_APIFY_TOKEN>")
run = client.actor("stratumics/app-store-reviews-scraper").call(
    run_input={"apps": ["389801252"], "countries": ["us", "gb"], "maxReviewsPerApp": 500, "stars": ["1", "2"]}
)
for item in client.dataset(run["defaultDatasetId"]).iterate_items():
    if item["type"] == "review":
        print(item["country"], item["rating"], item["date"], (item["title"] or "")[:60])
```

- **No-code tools**: connect runs to Zapier, Make, n8n, Google Sheets, Slack or your own webhook from the **Integrations** tab, for example to post every new 1-star review of your app into a team channel.
- **AI agents**: add the Actor to any agent or chat app that supports the Model Context Protocol through the Apify MCP server at `https://mcp.apify.com?tools=stratumics/app-store-reviews-scraper`, then ask in plain words, such as "get last month's 1-star reviews of this app in the UK and group them by topic".

### FAQ

#### How many reviews can I get for one app?

As many as Apple shows in that country. Apple's public feed stops at 500, but this scraper reads further back through the full history: tens of thousands of reviews for popular apps (in testing, Apple still served Instagram reviews past number 100,000 in the US). Set the limit as high as you need, up to 100,000 per app and country.

#### Why are app version or helpful votes empty on some reviews?

Apple publishes the app version only for the newest 500 and the most helpful 500 reviews per country, so older reviews and the "highest rating" sort have no version. Helpful votes are filled for every review unless Apple's main review endpoint is unavailable and the scraper falls back to the App Store web API, which does not publish them for older reviews.

#### Do I get developer replies for every country?

Yes for 115 countries, including all large markets, through Apple's main review endpoint. For the remaining smaller App Store countries the scraper reads the App Store web API first, which also has replies. If both are busy, it falls back to Apple's review feed, which has no replies; the log and the run summary say so.

#### Why does a review's date come after the developer's reply?

The date is when the review was posted or last edited. If the reviewer edited it after the developer replied, the review shows the newer date and `isEdited` is true.

#### Does it work for Mac and iPad apps?

Yes. Use the app's App Store link or id; Mac apps work the same way as iPhone and iPad apps (tested with Final Cut Pro).

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

Our Actors are ethical and do not extract any private user data, such as email addresses, gender, or location. They only extract what the user has chosen to share publicly. We therefore believe that our Actors, when used for ethical purposes by Apify users, are safe. However, you should be aware that your results could contain personal data. Personal data is protected by the GDPR in the European Union and by other regulations around the world. You should not scrape personal data unless you have a legitimate reason to do so. If you're unsure whether your reason is legitimate, consult your lawyers.

The only personal data in the output is the public nickname each reviewer chose to show with the review; no profile links or other details are collected. App Store is a trademark of Apple Inc., and this tool is not affiliated with or endorsed by Apple.

#### Something looks wrong. Where do I report it?

Open an issue on the **Issues** tab with the run link and the app. Most problems can be reproduced and fixed quickly.

### Other tools from this developer

### Other tools from Stratum ICS

- [Google Maps Scraper](https://apify.com/stratumics/google-maps-scraper): Get the businesses on Google Maps for any search and area: name, address, phone, website, rating, review count, opening hours, plus emails and social profiles.
- [Google News Scraper](https://apify.com/stratumics/google-news-scraper): Get Google News articles with real publisher URLs (not Google redirects), source, date, image, author and optional full text.
- [Google Play Reviews Scraper](https://apify.com/stratumics/google-play-reviews-scraper): Get Google Play reviews with star ratings, text, app versions, thumbs-up counts, developer replies and feature ratings in any language, plus app details with installs and star histogram.
- [Google Trends Scraper](https://apify.com/stratumics/google-trends-scraper): Get Google Trends data as JSON, CSV or Excel: interest over time, interest by region and city, related queries, and trending searches by country.
- [LinkedIn Jobs Scraper](https://apify.com/stratumics/linkedin-jobs-scraper): Scrape LinkedIn jobs with full descriptions, salary ranges, seniority, job type and applicant counts.
- [Telegram Channel Scraper](https://apify.com/stratumics/telegram-channel-scraper): Get messages from public Telegram channels with views, dates, media, reactions, polls and forwards, plus channel info with exact subscriber counts.
- [Website Contact Scraper](https://apify.com/stratumics/website-contact-scraper): Turn a list of websites into one row per company with verified emails, formatted phone numbers, social profiles (LinkedIn, Facebook, Instagram, X), address and contact page.
- [YouTube Scraper](https://apify.com/stratumics/youtube-scraper): Get YouTube videos from searches, channels, playlists and links with exact views, likes, comment counts, dates and tags, plus channel profiles and comments.

# Actor input Schema

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

App Store apps to scrape. Paste links (https://apps.apple.com/us/app/instagram/id389801252) or numeric app ids (389801252, the number after "id" in the link). One per line.

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

Two-letter App Store country codes such as us, gb, de or jp. Every country has its own reviews, so each app is read once per country. Leave empty to use the country in each app link (the United States for plain ids).

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

The most reviews to collect for each app in each country. Apple's own feed stops at 500; this scraper reads further back, tens of thousands for popular apps. Set 0 to collect only the app details record.

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

Order in which reviews are read. Newest first is the only order that the date cut-off and monitoring can stop on.

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

Keep only reviews with these star ratings, for example 1 and 2 for complaints. Leave empty for all ratings. You only pay for reviews that match.

## `newerThan` (type: `string`):

Keep reviews posted (or last edited) on or after this date. Use a date (2026-10-01), an ISO date-time in UTC (2026-10-01T12:00:00Z), or a relative value such as "30 days" or "12 hours". With newest first, reading stops at the first older review, so you only pay for what is in the range. Leave empty for no limit.

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

Remember the reviews delivered for each app and country and, on later runs, return only reviews you have not received yet. The first run returns the newest reviews up to your limit. Run it on a schedule to follow apps; it always reads newest first.

## `monitorName` (type: `string`):

Name of the memory used by monitoring mode, kept in a key-value store of your account. Runs with the same name share it, so use one name per schedule. Letters, digits and hyphens only.

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

Add one record per app and country with the name, developer, average rating, number of ratings, star histogram, price, genre, current version, last update date and download size.

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

Apple's review pages answer without a proxy, so none is used by default. If Apple starts throttling, the scraper switches to Apify datacenter proxy by itself. Choose a proxy here to use it for every request.

## Actor input object example

```json
{
  "apps": [
    "https://apps.apple.com/us/app/instagram/id389801252",
    "310633997"
  ],
  "countries": [
    "us",
    "gb",
    "ca"
  ],
  "maxReviewsPerApp": 20,
  "sort": "newest",
  "stars": [],
  "newerThan": "",
  "onlyNewReviews": false,
  "monitorName": "default",
  "includeAppDetails": true,
  "proxyConfiguration": {
    "useApifyProxy": false
  }
}
```

# Actor output Schema

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

One record per review and one per app and country, told apart by the type field.

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

Status, review count and any problem for each app and country.

# 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"
    ],
    "maxReviewsPerApp": 20
};

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

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

```

## MCP server setup

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