# App Store Reviews Scraper – iOS Ratings, Reviews, Multi-Country (`nourishing_courier/app-store-reviews-scraper`) Actor

App Store Reviews Scraper for any iPhone or iPad app: star rating, title, full text, app version, date and helpful votes, plus the app's overall rating on every row. Scrape many countries in one run to go past Apple's 500-per-country cap. No API key or login. For ASO and sentiment work.

- **URL**: https://apify.com/nourishing\_courier/app-store-reviews-scraper.md
- **Developed by:** [Ani Björkström](https://apify.com/nourishing_courier) (community)
- **Categories:** E-commerce, AI
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

$0.50 / 1,000 review delivereds

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 – iOS Ratings, Reviews, Multi-Country

**App Store Reviews Scraper** collects the public customer reviews of any iPhone or iPad app from the Apple App Store and returns them as clean, flat rows: star rating, review title, full text, app version, date and helpful votes. Paste an App Store URL or a numeric Apple app id like `310633997`, pick one or many countries, and run it – no App Store Connect access, no API key, no login, no proxy.

- **Multi-country in one run.** Apple keeps a separate review feed per storefront and caps each at 500 reviews. List `us`, `gb`, `de`, `fr`, `jp`… and the App Store Reviews Scraper collects up to 500 from each, so one app can yield thousands of iOS reviews.
- **App details on every row.** App name, developer, overall rating, total ratings count, genre, current version, price and bundle id for that storefront are merged into each review – no second lookup needed.
- **Native sorting, star filters, pay only for delivered reviews.** Most recent or Most helpful order comes straight from Apple; star and text filters keep only what you need, and you are never charged for filtered-out reviews or error rows.

***

### What you get

Every App Store review is one flat JSON row (ready for CSV, Excel, Google Sheets, BigQuery or an AI agent):

| Field | Description |
|---|---|
| `appId` | Numeric Apple app id, e.g. `310633997` |
| `appName` | App title in that storefront |
| `appDeveloper` | Seller / developer name |
| `appRating`, `appRatingsCount` | Overall App Store rating in that country and number of ratings |
| `appGenre` | Primary category, e.g. `Social Networking` |
| `appCurrentVersion`, `appPrice`, `appBundleId` | Current version on sale, price, iOS bundle id |
| `country` | Storefront the review comes from (`us`, `gb`, `de`…) |
| `reviewId` | Stable App Store review ID |
| `userName`, `userUrl` | Reviewer nickname and their public reviews page |
| `rating` | 1–5 stars |
| `title` | Review headline |
| `text` | Full review text |
| `appVersion` | App version the review was written for |
| `date` | Review date, ISO 8601 UTC |
| `helpfulVotes`, `totalVotes` | Apple's helpful score and total votes cast on the review |
| `url` | The app's reviews page in that storefront |
| `scrapedAt` | When this run collected the row |
| `error` | Only on problem rows: why an app/country returned nothing |

***

### Input

A run with no input at all scrapes the 200 most recent US reviews of WhatsApp, so scheduled and test runs never come back empty.

**Most recent reviews of one app, US store**

```json
{
  "appIds": ["https://apps.apple.com/us/app/whatsapp-messenger/id310633997"],
  "maxReviewsPerApp": 500
}
```

**Several apps across four countries (up to 2,000 reviews per app)**

```json
{
  "appIds": ["324684580", "570060128", "id479516143"],
  "countries": ["us", "gb", "de", "fr"],
  "maxReviewsPerApp": 500
}
```

**Only negative reviews with text, most helpful first**

```json
{
  "appIds": ["310633997"],
  "countries": ["us", "gb", "ca", "au"],
  "sortBy": "mostHelpful",
  "minRating": 1,
  "maxRating": 2,
  "onlyWithText": true
}
```

| Option | Default | What it does |
|---|---|---|
| `appIds` | `["310633997"]` | App Store URLs or numeric app ids (`310633997` or `id310633997`), one per line |
| `countries` | `["us"]` | Two-letter storefront codes. Each country is a separate feed of up to 500 reviews. A country inside a pasted URL wins for that app |
| `maxReviewsPerApp` | `200` | Cap per app **per country**, up to 500 (Apple's limit) |
| `sortBy` | `mostRecent` | `mostRecent` or `mostHelpful`, applied by Apple |
| `minRating`, `maxRating` | `1`, `5` | Star range to keep |
| `onlyWithText` | `false` | Skip reviews with an empty body |
| `concurrency` | `4` | App/country feeds fetched in parallel (1–10) |
| `proxyConfiguration` | off | Not needed at normal volumes |

**About the 500-review limit.** Apple's public review feed returns 50 reviews per page and stops after 10 pages, so any App Store reviews scraper that uses it gets at most 500 reviews per app per country (about 450 when sorting by most helpful). To collect more, add countries: `["us","gb","ca","au","in"]` gives up to 2,500 English-language reviews of one app. When a star or text filter is on, the actor reads the whole 500-review feed and then keeps the matching reviews, up to your cap.

***

### Output example

```json
{
  "appId": "310633997",
  "appName": "WhatsApp Messenger",
  "appDeveloper": "WhatsApp Inc.",
  "appRating": 4.68,
  "appRatingsCount": 18687721,
  "appGenre": "Social Networking",
  "appCurrentVersion": "26.38.74",
  "appPrice": 0.0,
  "appBundleId": "net.whatsapp.WhatsApp",
  "country": "us",
  "reviewId": "14603402613",
  "userName": "Stve82v",
  "userUrl": "https://itunes.apple.com/us/reviews/id1956982373",
  "rating": 5,
  "title": "WhatsApp",
  "text": "I need to update my chat",
  "appVersion": "26.37.76",
  "date": "2026-09-28T13:34:56+00:00",
  "helpfulVotes": 0,
  "totalVotes": 0,
  "url": "https://apps.apple.com/us/app/id310633997?see-all=reviews",
  "scrapedAt": "2026-09-30T18:22:16+00:00"
}
```

If an app cannot be scraped in a country – a wrong id, an app not sold there, a Google Play package pasted by mistake, or filters that match nothing – you get one row with an `error` field that says exactly why. Those rows are never charged.

***

### Use cases for an App Store Reviews Scraper

- **Product managers and iOS teams** – pull the most recent 1–2 star App Store reviews after every release and push them to Slack, Jira or Linear.
- **ASO and app marketing agencies** – mine iOS review titles and text for keywords and feature requests, and compare ratings of competitors country by country.
- **Localisation and international growth teams** – see how the same app is received in the US, UK, Germany, Japan and Brazil in one dataset.
- **AI, RAG and sentiment-analysis builders** – feed thousands of flat, labelled rows (stars + title + text + version + date) into GPT, Claude or a classifier; the schema is MCP- and agent-friendly.
- **Market researchers and investors** – benchmark App Store rating and review sentiment across a portfolio of iOS apps over time.
- **Customer support leads** – surface the most helpful negative reviews first, the ones other shoppers actually read.

***

### Pricing

The App Store Reviews Scraper is pay per result: **$0.50 per 1,000 reviews** delivered to the dataset, with platform usage included. There is no start fee and no monthly rental. Error rows and reviews removed by your filters are never charged. A 200-review run costs $0.10.

***

### Integrations

**Python (`apify-client`)**

```python
from apify_client import ApifyClient

client = ApifyClient("YOUR_APIFY_TOKEN")
run = client.actor("nourishing_courier/app-store-reviews-scraper").call(run_input={
    "appIds": ["310633997", "324684580"],
    "countries": ["us", "gb"],
    "maxReviewsPerApp": 500,
})
for review in client.dataset(run["defaultDatasetId"]).iterate_items():
    print(review.get("country"), review.get("rating"), review.get("title"))
```

**JavaScript / Node.js**

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

const client = new ApifyClient({ token: 'YOUR_APIFY_TOKEN' });
const run = await client.actor('nourishing_courier/app-store-reviews-scraper').call({
    appIds: ['https://apps.apple.com/us/app/duolingo-language-lessons/id570060128'],
    sortBy: 'mostHelpful',
    minRating: 1,
    maxRating: 2,
});
const { items } = await client.dataset(run.defaultDatasetId).listItems();
console.log(items.length, 'App Store reviews');
```

**curl (synchronous, returns the reviews directly)**

```bash
curl -X POST "https://api.apify.com/v2/acts/nourishing_courier~app-store-reviews-scraper/run-sync-get-dataset-items?token=YOUR_APIFY_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"appIds":["310633997"],"countries":["us","gb"],"maxReviewsPerApp":100}'
```

**n8n, Make and Zapier** – add the Apify node or module, choose this actor, paste one of the inputs above and map the rows into Google Sheets, Airtable, Notion or Slack. Schedule it daily with `sortBy: "mostRecent"` for iOS review monitoring. **MCP / AI agents** – expose the App Store Reviews Scraper via the Apify MCP server so an agent can call it as a tool ("get this week's negative App Store reviews of 310633997 in the UK"). Datasets export as JSON, CSV, Excel, XML and RSS.

***

### Other app review scrapers by the same author

- **Android:** [Google Play Reviews Scraper](https://apify.com/nourishing_courier/google-play-reviews-scraper) – Android reviews with developer replies, installs and native star filters.
- **Both stores:** [App Store & Google Play Reviews Scraper](https://apify.com/nourishing_courier/app-reviews-scraper) – iOS and Android reviews in one unified schema, one run.

***

### Limits, fair use and legality

This App Store Reviews Scraper reads Apple's public customer-review feed and the public iTunes Lookup API, one page at a time with bounded retries and backoff. It does not log in or access private data. Apple's feed is limited to 500 reviews per app per country and does not expose developer responses, so those are not in the output. Reviews are public user content; use them in line with Apple's terms and privacy law such as the GDPR, and do not try to re-identify reviewers. This actor is not affiliated with or endorsed by Apple.

***

### FAQ

#### How do I scrape App Store reviews without an API key?

Paste an App Store URL or the numeric app id (the digits after `id` in the URL) into `appIds` and start the run. The App Store Reviews Scraper needs no App Store Connect account, API key or login.

#### How many App Store reviews can I get per app?

Up to 500 per country – Apple's own limit. List several `countries` to multiply that: ten storefronts give up to 5,000 reviews of one app.

#### How do I find an app's App Store id?

Open the app on apps.apple.com; the URL ends in `id` plus digits, e.g. `.../whatsapp-messenger/id310633997`. Paste the whole URL or just `310633997`.

#### Can I get only 1-star or negative iOS reviews?

Yes. Set `minRating: 1` and `maxRating: 2`. The actor reads the full feed for each country and keeps only matching reviews; filtered-out reviews are not charged.

#### Can I sort by most helpful?

Yes. `sortBy: "mostHelpful"` asks Apple for its most-helpful ordering; `mostRecent` (the default) gives the newest reviews first.

#### Does it include developer responses?

No. Apple's public review feed does not include developer responses, so no App Store scraper based on it can return them. Google Play replies are available in the [Google Play Reviews Scraper](https://apify.com/nourishing_courier/google-play-reviews-scraper).

#### Does it work with n8n, Make or Zapier?

Yes. Use the Apify integration in any of them to run the App Store Reviews Scraper, pass the JSON input and map the flat rows into your spreadsheet, CRM or database.

#### Can I export App Store reviews to CSV or Excel?

Yes. Every App Store Reviews Scraper dataset downloads as CSV, Excel, JSON or XML from the Output tab or via the API (`format=csv`).

#### Does it scrape Google Play too?

This actor is dedicated to the Apple App Store. For Android use the [Google Play Reviews Scraper](https://apify.com/nourishing_courier/google-play-reviews-scraper), or the [combined actor](https://apify.com/nourishing_courier/app-reviews-scraper) for both stores in one run.

#### Why did I get an `error` row?

Usually a wrong id, an app not sold in that country, a Google Play package name pasted here, or filters that matched no review. The `error` text explains which, and error rows are free.

# Actor input Schema

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

App Store URLs (https://apps.apple.com/us/app/whatsapp-messenger/id310633997) or numeric Apple app ids (310633997 or id310633997). One app per line. A country inside a pasted URL is used for that app instead of the Countries list.

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

Two-letter App Store country codes, e.g. us, gb, de, fr, jp, se. Apple keeps a separate review feed per country and serves at most 500 reviews per app per country, so add more countries to collect more than 500 reviews of one app.

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

Cap per app per country. Apple's public feed stops at 500 per country (about 450 when sorting by most helpful).

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

Applied by the App Store itself: most recent first, or most helpful first.

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

Keep only reviews at or above this many stars. Set min 1 and max 2 to collect only negative reviews. With any filter on, the actor reads the full feed (up to 500) and then keeps the matches.

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

Keep only reviews at or below this many stars.

## `onlyWithText` (type: `boolean`):

Skip reviews whose body is empty.

## `concurrency` (type: `integer`):

How many app/country feeds to fetch at once. Lower this if Apple starts throttling.

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

Optional. The App Store feed does not need a proxy at normal volumes; turn one on only for very large batches that start getting throttled.

## Actor input object example

```json
{
  "appIds": [
    "310633997"
  ],
  "countries": [
    "us"
  ],
  "maxReviewsPerApp": 200,
  "sortBy": "mostRecent",
  "minRating": 1,
  "maxRating": 5,
  "onlyWithText": false,
  "concurrency": 4,
  "proxyConfiguration": {
    "useApifyProxy": false
  }
}
```

# Actor output Schema

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

Every review with its rating, title, text, date, version, country and helpful votes.

## `reviewsCsv` (type: `string`):

The same records as a spreadsheet-ready CSV file.

## `consoleView` (type: `string`):

Open the run's dataset in Apify Console.

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

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

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

```

## MCP server setup

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