# App Store Reviews Scraper - iOS Reviews, Ratings & Details (`pipiagent/app-store-reviews-scraper`) Actor

Scrape Apple App Store reviews from many countries in one run: rating, title, text, date and app version. App details and app search included. No login needed.

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

## Pricing

$0.25 / 1,000 results

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

Extract app reviews from the [Apple App Store](https://apps.apple.com), together with app details and app search results. Product teams use it to find out what iPhone and iPad users complain about, marketers use it to watch competitors, and researchers use it to collect review text for sentiment analysis.

- **Many countries in one run.** Apple shows only a limited number of reviews per country. Add a list of countries, or type `all`, and the Actor collects the reviews of every country and removes duplicates.
- **Up to 1,000 reviews per country.** The Actor can read the newest and the most helpful list of each country and merge them.
- **Every review says where it comes from.** The `country` field lets you compare markets.
- **No login and no proxy needed.** Press Start and get data.
- **Low price.** $0.25 per 1,000 results.

### What data can you get?

| Mode | One result is | Main fields |
|---|---|---|
| Reviews | One review | Star rating, title, text, date, app version, helpful votes, user name, country |
| App details | One app in one country | Title, developer, rating, number of ratings, price, category, version, release notes, last update, size, languages, description, screenshots |
| Search | One app | The same fields as app details, plus the position in the search results |

### How to use it

1. Click **Try for free**.
2. Choose a mode in **What to scrape**.
3. Paste App Store links or app ids in **Apps**, or add keywords in **Search keywords**.
4. Add the **Countries** you want.
5. Click **Start**, then download the results as JSON, CSV or Excel.

The app id is the number at the end of an App Store link. In `https://apps.apple.com/us/app/spotify-music-and-podcasts/id324684580` the app id is `324684580`. If you do not know it, run **Search apps by keyword** first.

### Input examples

The newest 500 reviews of an app in the United States:

```json
{
    "mode": "reviews",
    "appIds": ["324684580"],
    "countries": ["us"],
    "maxItems": 500
}
```

As many reviews as possible from five countries:

```json
{
    "mode": "reviews",
    "appIds": ["https://apps.apple.com/us/app/whatsapp-messenger/id310633997"],
    "countries": ["us", "gb", "de", "fr", "jp"],
    "sort": "both",
    "maxItems": 5000
}
```

The newest 100 reviews from every country:

```json
{
    "mode": "reviews",
    "appIds": ["310633997"],
    "countries": ["all"],
    "maxItemsPerCountry": 100,
    "maxItems": 20000
}
```

Details of two apps in three countries:

```json
{
    "mode": "appDetails",
    "appIds": ["324684580", "310633997"],
    "countries": ["us", "de", "jp"]
}
```

Find apps by keyword:

```json
{
    "mode": "search",
    "searchQueries": ["meditation"],
    "countries": ["us"],
    "maxItems": 200
}
```

### Output examples

A review:

```json
{
    "type": "review",
    "reviewId": "14602498196",
    "appId": "324684580",
    "appName": "Spotify: Music and Podcasts",
    "country": "us",
    "userName": "Kayla💅🤍",
    "userUrl": "https://itunes.apple.com/us/reviews/id1767727729",
    "rating": 4,
    "title": "Listen",
    "text": "Love Spotify but hate Spotify premium and the ads!!!!",
    "appVersion": "9.1.86",
    "voteCount": 0,
    "voteSum": 0,
    "postedAt": "2026-09-28T07:48:59Z",
    "sortedBy": "mostRecent",
    "url": "https://apps.apple.com/us/app/id324684580?see-all=reviews",
    "scrapedAt": "2026-09-29T11:43:22Z"
}
```

`voteCount` is the number of people who voted on the review. `voteSum` is the helpful votes minus the not helpful votes.

An app (description, languages and screenshots shortened here):

```json
{
    "type": "app",
    "appId": "324684580",
    "bundleId": "com.spotify.client",
    "url": "https://apps.apple.com/us/app/spotify-music-and-podcasts/id324684580",
    "country": "us",
    "title": "Spotify: Music and Podcasts",
    "description": "With the Spotify app, you can explore an extensive library of music and podcasts for free...",
    "developer": "Spotify",
    "developerId": "324684583",
    "developerUrl": "https://apps.apple.com/us/developer/spotify/id324684583",
    "developerWebsite": "https://www.spotify.com/",
    "seller": "Spotify",
    "genre": "Music",
    "genres": ["Music", "Entertainment"],
    "rating": 4.77263,
    "ratingsCount": 42331211,
    "ratingCurrentVersion": 4.77263,
    "ratingsCountCurrentVersion": 42331211,
    "price": 0.0,
    "currency": "USD",
    "formattedPrice": "Free",
    "isFree": true,
    "version": "9.1.86",
    "releaseNotes": "We’re always making changes and improvements to Spotify. To make sure you don’t miss a thing, just keep your Updates turned on.",
    "releasedAt": "2011-07-14T11:22:37Z",
    "updatedAt": "2026-09-23T17:49:27Z",
    "contentRating": "12+",
    "minimumOsVersion": "16.1",
    "fileSizeBytes": 311322624,
    "languages": ["AF", "AM"],
    "iconUrl": "https://is1-ssl.mzstatic.com/image/thumb/Purple211/v4/fd/b0/e6/fdb0e66d-165c-aa66-ac6b-1ee1e01911e8/AppIcon-0-0-1x_U007epad-0-1-0-0-sRGB-85-220.png/512x512bb.jpg",
    "screenshots": ["https://is1-ssl.mzstatic.com/image/thumb/PurpleSource211/v4/f3/ce/05/f3ce0547-690a-b355-b1dd-6b6e91808279/IOS_-_5.5_-_S01_-_EN_-_CA_U005bEnglish__U0028Canada_U0029_U005d.png/392x696bb.png"],
    "ipadScreenshots": [],
    "scrapedAt": "2026-09-29T11:47:46Z"
}
```

### How much does it cost?

You pay per saved result: **$0.25 per 1,000 results**. There is no start fee and no monthly rental. A review, an app and a search result each count as one result.

| Run | Results | Cost |
|---|---|---|
| 100 newest reviews of one app | 100 | $0.03 |
| Newest and most helpful reviews of one app in 19 countries | 17,064 | $4.27 |
| 200 apps for one search keyword | 200 | $0.05 |

Set a maximum charge per run in the run options and the Actor stops when it is reached.

### Limits you should know

- **At most 500 reviews per app, country and sort order.** Apple publishes 10 pages of 50 reviews and nothing beyond that. With **Both** sort orders you get up to 1,000 reviews per country, because the newest and the most helpful list rarely overlap. In our test Spotify returned between 600 and 1,000 reviews per country. Older reviews cannot be reached.
- **To get more reviews, add more countries.** Reviews are stored per country. A run over all countries returned 15,255 reviews of WhatsApp at 100 per country. Small countries have few reviews or none.
- **Only reviews with text.** Most users give stars without writing anything. Those ratings are counted in `ratingsCount` of the app details, but they cannot be collected one by one.
- **No developer replies.** Apple's public review feed does not include the developer's answers.
- **No direct link to a single review.** The App Store has no page for one review, so `url` opens the review page of the app.
- **Apple sometimes returns an empty page.** About one request in seven comes back empty although reviews exist. The Actor asks again up to five times, which fixed every case in our tests. If a page stays empty, the log shows a warning and up to 50 reviews can be missing.
- **Search returns at most 200 apps per keyword and country.** This is the limit of Apple's search.
- **An app can be missing in a country.** Apps that are not sold in a country are skipped there with a warning in the log.
- **The app name comes from the first country in your list.** Apps often have translated names. All reviews of a run carry the same `appName`.
- **Speed.** About 3,800 reviews per minute. We tested runs up to 17,000 reviews and 400 requests on Apify without being slowed down by Apple. Larger runs were not tested.

### Tips

- **Start with the big markets.** `us`, `gb`, `ca`, `au`, `de`, `fr`, `jp`, `br` and `in` hold most reviews of international apps.
- **Get an even sample.** Set **Max reviews per app and country** so that one large country does not fill the whole run.
- **Monitor new reviews.** Schedule a daily run sorted by newest with a small **Max results**.
- **Compare prices.** Run app details with several countries to see the price and currency in each store.

### FAQ

**Is it legal?** The Actor collects only data that Apple shows publicly to every visitor. Results contain personal data such as user names. Make sure you have a legitimate reason to process it, as required by the GDPR and similar laws.

**Do I need an Apple account or an API key?** No.

**Does it work for Mac apps?** App details and search cover apps that the App Store lists as software. Reviews were tested with iPhone and iPad apps only.

**Something is broken or missing?** Open a ticket in the Issues tab. Issues are usually answered within a day.

# Actor input Schema

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

Choose the kind of data you need. Each mode uses the matching input below.

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

Used in reviews and app details modes. Paste App Store links or app ids. The app id is the number at the end of the link, for example 324684580 in apps.apple.com/us/app/spotify/id324684580.

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

Two-letter country codes of the App Store, for example us, gb, de or jp. Apple shows at most 500 reviews per app in each country, so add more countries to get more reviews. Type "all" to go through every country.

## `searchQueries` (type: `array`):

Used in search mode. For example "meditation" or "photo editor". The App Store returns up to 200 apps per keyword and country.

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

Maximum number of results to save in this run.

## `maxItemsPerApp` (type: `integer`):

Optional. Limits the reviews saved for each app, so that one app does not use up the whole run.

## `maxItemsPerCountry` (type: `integer`):

Optional. Limits the reviews saved for each app in each country. Useful to get an even sample across countries.

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

Used in reviews mode. "Both" reads the newest and the most helpful list and removes duplicates, which gives up to 1,000 reviews per country.

## `maxItemsPerQuery` (type: `integer`):

Used in search mode. Limits the apps saved for each keyword in each country. The maximum is 200.

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

Optional. The Actor works without a proxy. Turn one on only if runs start failing with blocked requests.

## Actor input object example

```json
{
  "mode": "reviews",
  "appIds": [
    "324684580"
  ],
  "countries": [
    "us"
  ],
  "maxItems": 100,
  "sort": "mostRecent",
  "proxyConfiguration": {
    "useApifyProxy": false
  }
}
```

# Actor output Schema

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

Reviews or apps saved by the run, one item per result.

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

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

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

```

## MCP server setup

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