# App Store Reviews Scraper - Apple iOS Reviews & Ratings (`despottt/app-store-reviews-scraper`) Actor

Export Apple App Store reviews for any iPhone or iPad app from many countries: rating, title, text, author, date and developer reply, plus app details. Paste a link, app ID, bundle ID or name. Star, date and keyword filters and 'only new reviews' monitoring.

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

## Pricing

from $0.10 / 1,000 reviews

This Actor is paid per event and usage. You are charged both the fixed price for specific events and for Apify platform usage.

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: Apple iOS App Reviews, Ratings & Multi-Country Export

**Download Apple App Store reviews for any iPhone or iPad app to JSON, CSV or Excel, from many countries in one run. No login, no API key, no browser.**

Each review has the star rating, title, text, author, date, an "edited" flag and the developer's reply. You can also add the app details (average rating, total ratings, developer, current version) to every row. Filter by stars, date or keyword, and monitor new reviews on a schedule.

### What can this App Store reviews scraper do?

- ✅ **Paste anything:** an App Store link, a numeric app id (`389801252`), a bundle id (`com.spotify.client`) or just an app name (`Duolingo`).
- ✅ **Multi-country:** every country store has its own reviews (`us`, `gb`, `it`, `de`, `fr`, `jp`, …). Up to 10,000 reviews per app and country.
- ✅ **Filters that save money:** stars (for example only 1–2★ complaints), date (`postedWithinDays`, `fromDate`) and whole-word keywords (`crash`, `login`, `price`). You pay only for the reviews you keep.
- ✅ **Review monitoring:** `onlyNew` remembers the newest review per app and country. Schedule it daily and get only new reviews (for example into Slack or Google Sheets).
- ✅ **App details on every row:** name, developer, bundle id, average rating, rating count, current version, genre, price and icon.
- ✅ **REST API (Standby):** `GET /?apps=389801252&countries=us,gb&maxReviewsPerApp=100`.
- ✅ **Developer replies:** see which reviews the developer answered, and what they said.
- ✅ **Fast and cheap:** 500 reviews take about 10–15 seconds.

### Use cases

- **Product feedback and bug triage** after a release (filter by date with `postedWithinDays` or `fromDate`).
- **Competitor research:** what users love and hate about rival apps.
- **Sentiment analysis and LLM summaries** of user feedback.
- **ASO (App Store Optimization)** and keyword research from real review language.
- **Weekly review reports** for clients or stakeholders.

### How to use it

The input is a simple form, no code needed:

1. Add apps to **📱 Apps**, one per line: App Store links, numeric IDs, bundle IDs or app names.
2. Pick one or more **App Store countries** from the dropdown (empty = United States, or the country in the app link), the **Sort** order and **Max reviews per app and country**.
3. Optional, in **🔍 Filters**: **Min stars** / **Max stars** (set Max stars to 2 for complaints only), **Posted in the last … days**, a **Posted on or after** date picker, or **Keywords**.
4. Click **Start** and download the reviews from the *Output* tab, or read them through the API.
5. For monitoring, open **🔔 Monitoring**, turn on **Only new reviews since the last run**, save the input as a Task and add a daily Schedule.

### Input example

```json
{
  "apps": ["https://apps.apple.com/us/app/spotify/id324684580", "com.burbn.instagram"],
  "countries": ["us", "gb", "it"],
  "maxReviewsPerApp": 200,
  "maxRating": 2
}
```

### Output example (one item per review)

```json
{
  "appId": "324684580",
  "country": "us",
  "reviewId": "14723429952",
  "rating": 5,
  "title": "Love it!",
  "text": "I like it you should download it. Music helps me so much.",
  "userName": "Love it😐",
  "userUrl": null,
  "appVersion": null,
  "date": "2026-10-28T22:36:29+00:00",
  "voteSum": null,
  "voteCount": null,
  "isEdited": true,
  "developerResponse": "Hi. Thanks for your feedback. We'd recommend adding it to our 'Ideas Board' over at community.spotify.com. Just head to the Menu > Ideas. Others will then be able to vote or add to the conversation to show their support.",
  "developerResponseDate": "2026-10-15T18:15:59+00:00",
  "reviewUrl": "https://apps.apple.com/us/app/id324684580?see-all=reviews",
  "appName": "Spotify: Music and Podcasts",
  "developer": "Spotify",
  "bundleId": "com.spotify.client",
  "appStoreUrl": "https://apps.apple.com/us/app/spotify-music-and-podcasts/id324684580",
  "appAverageRating": 4.77,
  "appRatingCount": 42839093,
  "appCurrentVersion": "9.1.94",
  "appGenre": "Music",
  "appPrice": 0,
  "appIconUrl": "https://is1-ssl.mzstatic.com/image/thumb/Purple221/v4/8b/f2/6a/8bf26ab9-3ced-cb5c-a2b3-19f65e7f5cc6/AppIcon-0-0-1x_U007epad-0-1-0-0-85-220.png/512x512bb.jpg",
  "error": null,
  "input": "https://apps.apple.com/us/app/spotify-music-and-podcasts/id324684580"
}
```

*(Real output from a cloud test run on 30 Oct 2026. Long text is shortened.)*

### Pricing

Pay per event, with platform usage included. You pay only for:

- **$0.001 per run start** (one start event per GB of memory; the default 512 MB run counts as one).
- **$0.0001 per review returned**, which is **$0.10 per 1,000 reviews**.

"App not found" rows are free. Example: 5,000 reviews cost about $0.50.

### FAQ

**How many reviews can I get?** Up to **10,000 reviews per app and country**, sorted by most recent or most helpful (the same list the App Store website shows). For more, add countries: English reviews come from `us`, `gb`, `ca`, `au`, `ie`, `nz` and others. For ongoing tracking, use `onlyNew` on a schedule, which builds a full history over time.

**Does it scrape Google Play?** No, this Actor covers the Apple App Store only.

**Is it legal?** Reviews are public, but they include reviewer nicknames. Use the data for analysis, not to contact or profile individual people, and follow the GDPR where it applies.

### Limitations

- Reviews come from the public App Store website (apps.apple.com), the same list you see under *Ratings & Reviews*. Since October 2026 Apple's old RSS reviews feed is often empty, so it is only used as a fallback.
- The website source doesn't include the **app version** the review was written for, **helpful votes**, or the reviewer's profile link, so `appVersion`, `voteSum`, `voteCount` and `userUrl` are `null` (they are filled only when the RSS fallback is used). The current app version is in `appCurrentVersion`. The reviewer's device is not published.
- Maximum **10,000 reviews per app and country** per run.
- Only reviews with text are returned; star-only ratings are counted in `appRatingCount` but have no row.

Issues and feature requests: use the *Issues* tab.

# Actor input Schema

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

One per line: App Store link (<code>https://apps.apple.com/us/app/instagram/id389801252</code>), numeric ID (<code>389801252</code>), bundle ID (<code>com.spotify.client</code>) or app name.

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

Each country has its own reviews; pick several for more. Empty = United States, or the country in the app link.

## `sortBy` (type: `string`):

Most recent is needed for date filters and monitoring.

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

Default 500. Popular apps have thousands of reviews in each country (up to 10,000 per app and country). With star or keyword filters, up to 5× this number is read to find matches.

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

0 = no limit.

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

Lowest star rating to keep (1-5).

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

Tip: set 2 to get only complaints.

## `postedWithinDays` (type: `integer`):

0 = any time.

## `fromDate` (type: `string`):

Only reviews from this date on.

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

Whole words in the title or text, e.g. <code>crash</code>, <code>login</code>, <code>price</code>.

## `onlyNew` (type: `boolean`):

Remember the newest review per app and country; the next run returns only newer ones.

## `stateKey` (type: `string`):

Give each monitor its own name if you run several.

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

App name, developer, bundle ID, average rating, rating count, version, genre, price and icon.

## `includeEmptyApps` (type: `boolean`):

Adds a free row for app/country pairs with no matching reviews.

## Actor input object example

```json
{
  "apps": [
    "https://apps.apple.com/us/app/instagram/id389801252"
  ],
  "countries": [],
  "sortBy": "mostRecent",
  "maxReviewsPerApp": 50,
  "maxItems": 0,
  "minRating": 1,
  "maxRating": 5,
  "postedWithinDays": 0,
  "keywords": [],
  "onlyNew": false,
  "includeAppDetails": true,
  "includeEmptyApps": false
}
```

# Actor output Schema

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

All dataset items produced by the run

# 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": 50
};

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

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

```

## MCP server setup

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