# App Store Reviews Scraper - iOS & macOS Reviews (`khadinakbar/appstore-reviews-scraper`) Actor

Scrape Apple App Store reviews for any iOS/macOS app across multiple countries in one run. Get ratings, titles, bodies, authors, versions, dates, votes, and URLs with rating, date, and keyword filters applied before billing. No login, no cookies, no external API keys.

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

## Pricing

from $0.50 / 1,000 review returneds

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/platform/actors/running/actors-in-store#pay-per-event

## What's an Apify Actor?

Actors are web data automations that power AI and operations. They run on the Apify platform to scrape websites, process data, connect APIs, and automate workflows.
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.
Actors are written with capital "A".

## 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.
The best way to integrate Actors is as follows.

- **AI agents and MCP clients** — the [Apify MCP server](https://docs.apify.com/integrations/mcp.md) at `https://mcp.apify.com` (remote, streamable HTTP, OAuth on first use).
- **Agentic workflows and local Actor development** — [Agent Skills](https://apify.com/.well-known/agent-skills/index.json) with the [Apify CLI](https://docs.apify.com/cli/docs.md): `npm install -g apify-cli`, then `apify login`.
- **JavaScript/TypeScript projects** — the official [JS/TS client](https://docs.apify.com/api/client/js/docs.md): `npm install apify-client`.
- **Python projects** — the official [Python client](https://docs.apify.com/api/client/python/docs.md): `pip install apify-client`.
- **Any other language** — the [REST API](https://docs.apify.com/api/v2.md).

For usage examples, see the [API](#api) section below.

For more details, see Apify documentation as [Markdown index](https://docs.apify.com/llms.txt) and [Markdown full-text](https://docs.apify.com/llms-full.txt).

# README

## App Store Reviews Scraper — iOS & macOS Reviews

Scrape Apple App Store customer reviews for any iOS or macOS app across **one or many country storefronts in a single run**. Extract ratings, review titles and bodies, reviewer names, app versions, dates, helpfulness votes, and canonical review URLs — and apply **rating, date, keyword, and helpful-vote filters before billing**, so you only pay for reviews that match.

No login, no cookies, no external API keys. Built for product/PM teams, ASO research, sentiment analysis, release-impact tracking, competitor monitoring, and AI-agent workflows.

### When to use this Actor

- **App product & PM teams** monitoring their own and competitor iOS app feedback across markets.
- **ASO and sentiment researchers** who need fresh, structured review data for keyword mining, version-impact comparison, and localization QA.
- **Release-impact tracking** — fetch only 1-star reviews since a release date to spot regressions fast.
- **Localization QA** — pull the same app's reviews from many country storefronts in one run.
- **AI agents** — narrow input (app IDs), flat 15-field JSON output, sub-minute runs, predictable Pay-per-event cost.

### When NOT to use it

- You need **Google Play / Android reviews** — this Actor is Apple App Store only. Use a Google Play reviews Actor.
- You need reviews for **your own apps only and have an App Store Connect API key** — the official App Store Connect API returns more fields and is Apple's supported path for your own apps. This Actor uses Apple's public RSS feed, which covers any app but caps at 500 reviews per app per country.
- You need to translate reviews — this Actor returns text in the storefront's original language. Pair it with a translation Actor if you need English normalization.

### How it works

The Actor reads Apple's public iTunes RSS customer-reviews JSON feed:

```
https://itunes.apple.com/{country}/rss/customerreviews/id={appId}/sortBy={sort}/page={n}/json
```

The feed is unauthenticated, returns up to **50 reviews per page across at most 10 pages** (a 500-review cap per app per country storefront imposed by Apple), and supports two sort orders. The Actor walks every `{app} × {country}` pair you request, deduplicates identical reviews across storefronts, applies your filters, and writes one validated row per matching review to the default dataset.

### Input

| Field | Type | Required | Default | Description |
|---|---|---|---|---|
| `appIds` | array | ✅ | — | Apple App Store numeric IDs or `apps.apple.com` URLs. |
| `countries` | array | — | `["us"]` | Lowercase 2-letter storefront codes (us, gb, de, jp, …). |
| `sortBy` | enum | — | `mostRecent` | `mostRecent` or `mostHelpful`. |
| `maxReviewsPerApp` | integer | — | `500` | Per-app, per-country cap. Apple's effective ceiling is 500. |
| `maxReviews` | integer | — | `1000` | Hard billing/output cap across the whole run. |
| `ratingFilter` | array\<int 1–5> | — | `[]` | Keep only these star ratings. Empty = all ratings. |
| `dateFrom` | ISO date | — | `""` | Keep only reviews on/after this date. |
| `dateTo` | ISO date | — | `""` | Keep only reviews on/before this date. |
| `keywords` | array | — | `[]` | Keep only reviews whose title/body contains at least one substring (case-insensitive). |
| `minVoteSum` | integer | — | `0` | Keep only reviews with helpfulness vote sum ≥ this. |

> Filters are applied **before billing** — non-matching reviews are skipped without being charged.

#### Input example

```json
{
    "appIds": ["324684580", "https://apps.apple.com/us/app/whatsapp-messenger/id310633997"],
    "countries": ["us", "gb", "de"],
    "sortBy": "mostRecent",
    "maxReviews": 200,
    "ratingFilter": [1, 2],
    "dateFrom": "2026-01-01",
    "keywords": ["crash", "login"]
}
```

### Output

Each row in the default dataset is one review with these 15 flat fields:

| Field | Type | Example |
|---|---|---|
| `reviewId` | string | `14376567123` |
| `appId` | string | `324684580` |
| `appName` | string | null | `Spotify - Music and Podcasts` |
| `country` | string | `us` |
| `rating` | integer 1–5 | `5` |
| `title` | string | `Amazing` |
| `body` | string | `Easy to use and So much more` |
| `reviewerName` | string | null | `Arpi house` |
| `reviewerUrl` | string | null | `https://itunes.apple.com/us/reviews/id1726025656` |
| `appVersion` | string | null | `9.1.68` |
| `date` | ISO 8601 | `2026-08-01T16:53:50-07:00` |
| `voteSum` | integer | `0` |
| `voteCount` | integer | `0` |
| `reviewUrl` | string | null | `https://itunes.apple.com/us/review?id=324684580&type=Purple%20Software` |
| `scrapedAt` | ISO 8601 | `2026-08-03T12:00:00.000Z` |

Terminal `OUTPUT` and `RUN_SUMMARY` records are written to the default key-value store on every run.

#### Output example

```json
{
    "reviewId": "14376567123",
    "appId": "324684580",
    "appName": null,
    "country": "us",
    "rating": 5,
    "title": "Amazing",
    "body": "Easy to use and So much more",
    "reviewerName": "Arpi house",
    "reviewerUrl": "https://itunes.apple.com/us/reviews/id1726025656",
    "appVersion": "9.1.68",
    "date": "2026-08-01T16:53:50-07:00",
    "voteSum": 0,
    "voteCount": 0,
    "reviewUrl": "https://itunes.apple.com/us/review?id=324684580&type=Purple%20Software",
    "scrapedAt": "2026-08-03T12:00:00.000Z"
}
```

### Pricing — Pay per event + platform usage

This Actor uses Apify's **Pay per event + platform usage** pricing model. You pay two event charges plus the underlying platform usage (compute, proxy) Apify reports separately:

- **Actor start**: `$0.00005` — charged once per run, scaled by Actor memory.
- **Review returned**: `$0.0005` ($0.50 per 1,000 reviews) — charged **only** when one complete, schema-validated, filter-matching review is written to the dataset.

**Typical cost envelope.** A run capped at `maxReviews: 1000` costs at most `$0.50` in review events plus platform usage; a `maxReviews: 200` monitoring run costs at most `$0.10` in review events plus platform usage. The Actor prints the cost cap in the run status message before any charge fires.

### API / CLI example

```bash
## Run on Apify with the default Spotify example
apify call khadinakbar/appstore-reviews-scraper \
    --input='{"appIds":["324684580"],"countries":["us"],"maxReviews":50}'
```

```bash
## Fetch the dataset as JSON
curl "https://api.apify.com/v2/datasets/$DATASET_ID/items?format=json"
```

### AI-agent prompt card

> Use this tool when the user asks for App Store reviews, iOS app feedback, app ratings, or ASO/review sentiment for an Apple App Store app. Pass an `appIds` array (numeric IDs or `apps.apple.com` URLs) and optionally `countries`, `ratingFilter`, `dateFrom`, or `keywords`. It returns one JSON object per review with `rating`, `title`, `body`, `reviewerName`, `appVersion`, `date`, `voteSum`, and `reviewUrl`. Do not use it for Google Play reviews or for the user's own apps when an App Store Connect API key is available. Cost is $0.0005 per review returned plus a small start fee.

### Best results guidance

- **For release-impact tracking**, set `dateFrom` to the release date and `ratingFilter: [1, 2]` — you'll see only new negative reviews, and pay only for those.
- **For localization QA**, list the same `appId` across many `countries` in one run; the Actor dedups identical cross-storefront reviews automatically.
- **For ASO keyword mining**, set `sortBy: mostHelpful` and a high `minVoteSum` to surface the most-endorsed feedback.
- **Keep `maxReviews` bounded** so agent workflows can forecast cost. The run status message prints the cap.

### Limitations and honesty

- **500-review cap per app per country.** This is imposed by Apple's public RSS feed, not by this Actor. No public Apify Actor in this niche exceeds it.
- **App name may be null.** Apple's RSS `feed.author.name` returns "iTunes Store", not the app name. `appName` is best-effort.
- **Apple RSS is read-only and public.** This Actor cannot post, edit, or delete reviews, and cannot access private App Store Connect data.
- **Translation is out of scope.** Returned text is in the storefront's original language.

### Integrations

Connect the output dataset to Google Sheets, Airtable, Notion, Supabase, Slack, or any of Apify's 9,000+ integrations via the Console **Export** or **Webhooks** tabs after a run.

### Builder's note

This Actor exists because the Apple App Store reviews niche on Apify is **saturated on the headline job** (single-app, single-country) but **thin on the multi-country and pre-billing-filter jobs**. The market leader takes one country per run and exposes only four input fields; the only multi-country alternative requires an external translation API key. This Actor packages the three real moats into one private-data-first tool: many countries in one run, filters that skip non-matches before charging, and an MCP-first 15-field output shape.

### Legal disclaimer

You are responsible for complying with Apple's Terms of Service, the App Store's review content licensing, and any applicable data-protection law when using scraped review data. This Actor reads only Apple's public, unauthenticated RSS feed and does not bypass authentication, rate limits, or access controls. It is provided for research, monitoring, and lawful analysis of publicly available feedback.

# Actor input Schema

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

Add one or more Apple App Store apps per line. Accept numeric App IDs (e.g. 324684580) or full app URLs (e.g. https://apps.apple.com/us/app/spotify/id324684580). URL ids and numeric ids are both reduced to the numeric ID. Duplicate apps are processed once. Apple caps each app at 500 reviews per country storefront.

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

One or more lowercase two-letter App Store storefront codes (e.g. us, gb, de, jp, fr). Reviews are fetched from every selected country in a single run; identical reviews across storefronts are deduplicated. Apple returns at most 500 reviews per app per country. Defaults to United States.

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

Controls the order Apple returns reviews. Most recent prioritizes fresh feedback for monitoring. Most helpful prioritizes reviews with more helpfulness votes for signal extraction.

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

Caps paid review rows for each app within each country storefront. Apple's RSS feed itself returns at most 500 reviews per app per country, so 1-500 is the effective range. Lower this for lightweight monitoring.

## `maxReviews` (type: `integer`):

Sets the hard billing and output cap across all apps and countries. The Actor checks this limit before every paid dataset write. The default of 1000 costs at most $0.50 in review events.

## `ratingFilter` (type: `array`):

Optionally list exact star ratings to include, such as \[1] for one-star alerts or \[4, 5] for testimonials. Leave the array empty to include every rating. Values must be unique integers from 1 through 5. Filtering happens before billing so non-matching reviews are not charged.

## `dateFrom` (type: `string`):

Optionally keep only reviews dated on or after this ISO 8601 date (e.g. 2026-01-01). Used for release-impact tracking and regression alerting. Filtering happens before billing. Leave empty for no lower bound.

## `dateTo` (type: `string`):

Optionally keep only reviews dated on or before this ISO 8601 date (e.g. 2026-12-31). Filtering happens before billing. Leave empty for no upper bound.

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

Optionally keep only reviews whose title or body contains at least one of these case-insensitive substrings (e.g. crash, login, 課金). Useful for surfacing bug reports and feature requests. Filtering happens before billing. Leave the array empty to disable keyword filtering.

## `minVoteSum` (type: `integer`):

Optionally keep only reviews whose Apple helpfulness vote sum is at least this integer. Use to surface the most widely-endorsed feedback. Filtering happens before billing. Set to 0 (default) to disable.

## Actor input object example

```json
{
  "appIds": [
    "324684580",
    "https://apps.apple.com/us/app/whatsapp-messenger/id310633997"
  ],
  "countries": [
    "us"
  ],
  "sortBy": "mostRecent",
  "maxReviewsPerApp": 100,
  "maxReviews": 200,
  "ratingFilter": [],
  "dateFrom": "",
  "dateTo": "",
  "keywords": [],
  "minVoteSum": 0
}
```

# Actor output Schema

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

Structured reviews with rating, title, body, reviewer, version, date, helpfulness votes, country, and source provenance.

## `outputSummary` (type: `string`):

Compact machine-readable terminal outcome and output counts.

## `runSummary` (type: `string`):

Detailed run diagnostics, cost counters, warnings, errors, and stop reason.

# 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",
        "https://apps.apple.com/us/app/whatsapp-messenger/id310633997"
    ],
    "countries": [
        "us"
    ],
    "sortBy": "mostRecent",
    "maxReviewsPerApp": 100,
    "maxReviews": 200,
    "ratingFilter": [],
    "dateFrom": "",
    "dateTo": "",
    "keywords": [],
    "minVoteSum": 0
};

// Run the Actor and wait for it to finish
const run = await client.actor("khadinakbar/appstore-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",
        "https://apps.apple.com/us/app/whatsapp-messenger/id310633997",
    ],
    "countries": ["us"],
    "sortBy": "mostRecent",
    "maxReviewsPerApp": 100,
    "maxReviews": 200,
    "ratingFilter": [],
    "dateFrom": "",
    "dateTo": "",
    "keywords": [],
    "minVoteSum": 0,
}

# Run the Actor and wait for it to finish
run = client.actor("khadinakbar/appstore-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",
    "https://apps.apple.com/us/app/whatsapp-messenger/id310633997"
  ],
  "countries": [
    "us"
  ],
  "sortBy": "mostRecent",
  "maxReviewsPerApp": 100,
  "maxReviews": 200,
  "ratingFilter": [],
  "dateFrom": "",
  "dateTo": "",
  "keywords": [],
  "minVoteSum": 0
}' |
apify call khadinakbar/appstore-reviews-scraper --silent --output-dataset

```

## MCP server setup

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