# App Store Reviews Scraper - No 500-Review Limit, Apps & Charts (`esoterik/app-store-reviews-scraper`) Actor

Scrape Apple App Store reviews with no 500-review limit, with filters and developer replies. Also app details with rating breakdown, keyword search, top charts and developer apps.

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

## Pricing

from $0.30 / 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 - No 500-Review Limit, Apps & Charts

Scrape Apple App Store reviews without the usual 500-review limit, and without a login or API key. The same Actor also gets app details, search results, top charts and developer apps.

Results download as JSON, CSV or Excel, or through the Apify API.

### Features

#### Reviews

- Reviews for any iOS or Mac app, by App Store URL, app ID or bundle ID
- Several apps and several countries in one run
- **No 500-review limit** with *Deep reviews* turned on. Apple's public feed stops at 500 per country
- Developer replies included with deep reviews
- App version and vote counts included with the standard feed
- Four sort orders: most recent, most helpful, most favorable, most critical
- Filter by date, star rating and keywords. You pay only for reviews that match
- Only-new-reviews mode: schedule the Actor and get just the reviews posted since the previous run

#### App details

- About 45 fields per app: name, developer, price, rating, version, release notes, description, genres, size, languages, icon, screenshots
- Star-rating breakdown: how many 1, 2, 3, 4 and 5 star ratings
- Subtitle and current chart position
- Last 25 versions with release notes
- Privacy labels
- Whether the app has in-app purchases
- Separate data for each country's store

#### Search

- Search by keyword, several keywords per run
- Up to 200 apps per keyword
- Ranking position for each result

#### Top charts

- Six charts: top free, top paid, top grossing, new, new free, new paid
- Filter by 24 categories
- iPhone or iPad for the three top charts
- Up to 100 apps per chart and country

#### Developer apps

- Every app a developer has published, by developer URL or ID

### How to scrape App Store reviews

1. Click **Try for free** and open the Actor in Apify Console. A free Apify account is enough to start.
2. Leave **Mode** on *Reviews of apps*.
3. Paste one or more apps into **Apps**. Open the app's page on apps.apple.com and copy the URL, or use the number after `id` in that URL.
4. Add the **Countries** you want, for example `us` and `gb`.
5. Set **Max reviews per app and country**. For more than 500 reviews per country, turn on **Deep reviews**.
6. Optional: narrow the results with a date, a star range or keywords.
7. Click **Start**. When the run finishes, open the **Output** tab and export the reviews as JSON, CSV or Excel.

For app details, search, charts or developer apps, pick that mode in step 2 and fill in its section of the form. To run it automatically, save your input as a task and add a schedule. To run it from code, see the **API** tab for ready-made examples in JavaScript, Python and cURL.

### Pricing

Pay per result, with no monthly rental.

| You get | Price |
|---|---|
| 1,000 reviews | $0.30 |
| 1,000 search or chart rows | $1.00 |
| 1,000 app detail records | $2.00 |

Reviews that your filters reject, and apps that are not found, are not charged.

### Input

Pick a **mode**, then fill in the matching fields.

#### Reviews

```json
{
    "mode": "reviews",
    "apps": ["https://apps.apple.com/us/app/instagram/id389801252"],
    "countries": ["us", "gb"],
    "maxReviewsPerApp": 1000,
    "deepReviews": true,
    "reviewSort": "recent",
    "reviewsSince": "2026-01-01",
    "maxRating": 2,
    "reviewKeywords": ["crash", "login"]
}
```

| Field | Meaning |
|---|---|
| `apps` | App Store URLs, numeric app IDs or bundle IDs |
| `countries` | Two-letter store codes, for example `us`, `de`, `jp` |
| `maxReviewsPerApp` | Limit per app and country. `0` means no limit |
| `deepReviews` | `false`: Apple's public feed, up to 500 reviews per country, with app version and vote counts. `true`: no limit, with developer replies, without app version and vote counts |
| `reviewSort` | `recent`, `helpful`, `favorable` or `critical`. The last two always use deep reviews |
| `reviewsSince` | Only reviews on or after this date |
| `minRating`, `maxRating` | Star range, 1 to 5 |
| `reviewKeywords` | Keep reviews containing at least one of these words |
| `onlyNewReviews` | Return only reviews newer than the newest one seen in the previous run |

#### App details

```json
{ "mode": "details", "apps": ["389801252", "com.duckduckgo.mobile.ios"], "countries": ["us"] }
```

Set `extendedDetails` to `false` to skip the rating breakdown, version history and privacy labels.

#### Search

```json
{ "mode": "search", "searchTerms": ["photo editor", "habit tracker"], "countries": ["us"], "maxSearchResults": 50 }
```

Up to 200 apps per search term.

#### Top charts

```json
{ "mode": "charts", "chartType": "top-grossing", "chartCategory": "6014", "countries": ["us", "jp"], "chartLimit": 100 }
```

Charts: `top-free`, `top-paid`, `top-grossing`, `new`, `new-free`, `new-paid`. iPad charts exist for the three top charts. Up to 100 apps per chart.

#### Developer apps

```json
{ "mode": "developer", "developers": ["https://apps.apple.com/us/developer/instagram-inc/id389801255"], "countries": ["us"] }
```

### Output

#### Review

```json
{
    "reviewId": "14621581886",
    "rating": 1,
    "title": "We need Magenta green!!!!!",
    "text": "How could you get rid of such a beautiful filter...",
    "userName": "Reviewerj9",
    "date": "2026-10-03T05:52:01.000Z",
    "isEdited": false,
    "appVersion": null,
    "voteSum": null,
    "voteCount": null,
    "developerResponse": null,
    "developerResponseDate": null,
    "appId": "389801252",
    "appName": "Instagram",
    "appUrl": "https://apps.apple.com/us/app/instagram/id389801252",
    "country": "us",
    "source": "deep",
    "scrapedAt": "2026-10-04T14:13:37.807Z"
}
```

#### App details

About 45 fields per app, including `appId`, `name`, `bundleId`, `url`, `developerName`, `price`, `currency`, `rating`, `ratingCount`, `version`, `releaseDate`, `currentVersionReleaseDate`, `releaseNotes`, `description`, `genres`, `contentRating`, `minimumOsVersion`, `fileSizeBytes`, `languages`, `icon` and `screenshots`.

With extended details you also get:

```json
{
    "subtitle": "Videos, creators & friends",
    "hasInAppPurchases": true,
    "ratingBreakdown": { "1": 1229452, "2": 275504, "3": 697187, "4": 2003706, "5": 25350016 },
    "chartPosition": { "chart": "top-free", "position": 2, "genreId": "6008", "genreName": "Photo & Video" },
    "versionHistory": [{ "version": "449.0.0", "releaseDate": "2026-10-02T22:32:18Z", "releaseNotes": "..." }],
    "privacy": [{ "type": "Data Used to Track You", "dataCategories": ["Contact Info", "Identifiers"], "purposes": [] }]
}
```

#### Search and chart rows

Search rows are full app records plus `searchTerm` and `position`. Chart rows contain `rank`, `chart`, `device`, `country`, `appId`, `name`, `bundleId`, `url`, `developerName`, `category`, `price`, `currency`, `releaseDate`, `icon` and `summary`.

### Monitoring new reviews

1. Set `mode` to `reviews` and turn on `onlyNewReviews`.
2. Save the input as a task and add a schedule, for example daily.
3. Each run returns only reviews posted since the previous run. Send them to Slack, Google Sheets or a webhook with Apify integrations.

The first run returns reviews as usual, up to `maxReviewsPerApp`.

### Limits to know about

- The public review feed holds at most 500 reviews per country and sort order. Use deep reviews for more.
- Deep reviews do not include the app version or vote counts.
- Apple shows only reviews that have text. Star-only ratings appear in `ratingCount` and `ratingBreakdown`, not as reviews.
- Charts go up to 100 apps and search up to 200 apps per term. These are Apple's limits.

### FAQ

**Do I need a proxy?** No. Turn one on in the input only if requests start failing.

**Does it work for Mac apps?** Yes, for reviews and details, using the app's App Store ID.

**Is this legal?** The Actor reads only public App Store data. Reviews contain public user names; make sure your use of them follows the privacy rules that apply to you.

Found a bug or missing a field? Open an issue on the Issues tab.

# Actor input Schema

## `mode` (type: `string`):

What to scrape.

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

App Store URLs, numeric app IDs or bundle IDs. Used in 'reviews' and 'details' modes. Example: https://apps.apple.com/us/app/instagram/id389801252, 389801252 or com.burbn.instagram.

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

Two-letter App Store country codes, for example us, gb, de, jp. Every country is scraped separately in the same run.

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

Maximum number of reviews to return for each app in each country. Set 0 for no limit (only useful with deep reviews).

## `deepReviews` (type: `boolean`):

Off: uses Apple's public review feed, limited to the 500 most recent or most helpful reviews per country, and includes the app version and vote counts. On: no 500-review limit, includes developer replies and the 'favorable' and 'critical' sort orders, but no app version or vote counts.

## `reviewSort` (type: `string`):

'Most favorable' and 'Most critical' always use deep reviews.

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

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

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

Return only reviews with at least this many stars.

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

Return only reviews with at most this many stars. Set to 2 to collect complaints only.

## `reviewKeywords` (type: `array`):

Return only reviews whose title or text contains at least one of these words or phrases (case-insensitive).

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

For scheduled monitoring. The Actor remembers the newest review it saw for each app and country and returns only newer ones on the next run. The first run returns reviews as usual.

## `extendedDetails` (type: `boolean`):

Adds the star-rating breakdown, subtitle, version history, privacy labels, in-app purchase flag and chart position to each app. Used in 'details' mode.

## `searchTerms` (type: `array`):

Keywords to search for in the App Store. Each term is searched in every selected country.

## `maxSearchResults` (type: `integer`):

Maximum number of apps to return for each search term in each country (1-200).

## `chartType` (type: `string`):

Which chart to scrape.

## `chartDevice` (type: `string`):

iPad charts are available for top free, top paid and top grossing.

## `chartCategory` (type: `string`):

Limit the chart to one App Store category.

## `chartLimit` (type: `integer`):

Number of ranked apps to return for each country (1-100).

## `developers` (type: `array`):

App Store developer URLs or numeric developer IDs. Example: https://apps.apple.com/us/developer/instagram-inc/id389801255 or 389801255.

## `language` (type: `string`):

Language for app texts such as descriptions, for example en-US or de-DE. Leave empty to use each country's default.

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

The App Store usually works without a proxy. Turn one on only if runs start failing with blocked requests.

## Actor input object example

```json
{
  "mode": "reviews",
  "apps": [
    "https://apps.apple.com/us/app/instagram/id389801252"
  ],
  "countries": [
    "us"
  ],
  "maxReviewsPerApp": 100,
  "deepReviews": false,
  "reviewSort": "recent",
  "onlyNewReviews": false,
  "extendedDetails": true,
  "searchTerms": [
    "photo editor"
  ],
  "maxSearchResults": 50,
  "chartType": "top-free",
  "chartDevice": "iphone",
  "chartCategory": "all",
  "chartLimit": 100,
  "proxyConfiguration": {
    "useApifyProxy": false
  }
}
```

# Actor output Schema

## `results` (type: `string`):

Reviews, app details, search results or chart rows, one item per row.

# 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"
    ],
    "countries": [
        "us"
    ],
    "maxReviewsPerApp": 100,
    "searchTerms": [
        "photo editor"
    ],
    "proxyConfiguration": {
        "useApifyProxy": false
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("esoterik/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"],
    "countries": ["us"],
    "maxReviewsPerApp": 100,
    "searchTerms": ["photo editor"],
    "proxyConfiguration": { "useApifyProxy": False },
}

# Run the Actor and wait for it to finish
run = client.actor("esoterik/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"
  ],
  "countries": [
    "us"
  ],
  "maxReviewsPerApp": 100,
  "searchTerms": [
    "photo editor"
  ],
  "proxyConfiguration": {
    "useApifyProxy": false
  }
}' |
apify call esoterik/app-store-reviews-scraper --silent --output-dataset

```

## MCP server setup

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