# Apple App Store Reviews Scraper & API (`alfdev996/app-store-reviews-scraper-api`) Actor

Extract Apple App Store customer reviews as clean JSON for any app and any country storefront. Optional new-only mode returns just the reviews that appeared since the last run. No API key, no proxies.

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

## Pricing

from $0.40 / 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?

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 API — Apple app reviews as clean JSON

Fetch Apple App Store customer reviews for **any app**, in **any country storefront**, as flat JSON you can drop straight into a spreadsheet, a database, or an AI agent. Optionally run it on a schedule and get back **only the reviews that appeared since last time**.

No account with Apple, no API key, no browser automation. The Actor reads Apple's own public review feed, so it is fast, cheap, and it does not break when a website is redesigned.

***

### What you get

One row per review, with a stable `reviewId` you can deduplicate on:

```json
{
  "reviewId": "14525017960",
  "appId": "324684580",
  "country": "us",
  "rating": 2,
  "title": "Pay to use",
  "body": "EVERYTHING is pay to use, to skip songs, to replay music…",
  "author": "Sylveon Rose",
  "authorUrl": "https://itunes.apple.com/us/reviews/id1049196689",
  "appVersion": "9.1.80",
  "updatedAt": "2026-09-08T05:07:28-07:00",
  "voteSum": 0,
  "voteCount": 0,
  "reviewUrl": "https://itunes.apple.com/us/review?id=324684580&type=Purple%20Software",
  "source": "apple-app-store"
}
```

Every run also writes a `SUMMARY` record to the key-value store, listing each app/storefront pair with its status (`ok`, `monitoring-started`, `no-reviews-or-app-not-found`, `error`). Nothing fails silently.

***

### Quick start

```json
{
  "appIds": ["324684580"],
  "countries": ["us"],
  "maxReviewsPerApp": 50
}
```

`appIds` accepts the numeric App Store ID **or** the full URL — `https://apps.apple.com/us/app/spotify/id324684580` works as-is, so you can paste straight from the store.

#### Watch several markets at once

```json
{
  "appIds": ["324684580", "1232780281"],
  "countries": ["us", "gb", "de", "it", "jp"],
  "sortBy": "mostRecent",
  "maxReviewsPerApp": 100
}
```

Apple keeps reviews separate per storefront, so this is the only way to see what non-US users are saying.

#### Alert me only about new 1-star reviews

```json
{
  "appIds": ["324684580"],
  "countries": ["us", "gb"],
  "onlyNew": true,
  "minRating": 1,
  "maxRating": 1
}
```

Schedule that every hour and connect a webhook or an integration. The first run records the starting point and returns at most the 50 most recent reviews; every run after that returns **only what is genuinely new** — usually zero rows, and occasionally the one review you actually need to see.

***

### Use with AI agents (MCP)

This Actor is available as a tool through Apify's MCP server, so an assistant such as Claude or Cursor can call it directly. Point your MCP client at:

```
https://mcp.apify.com
```

Then ask in plain language:

> *"What are people complaining about in the latest App Store reviews for app 324684580 in the US and UK?"*

The agent will call this Actor, receive structured rows, and reason over them. Two tips that make agent calls work well:

- Keep `maxReviewsPerApp` small (**20–50**) so the response stays inside the model's context.
- Use `sortBy: "mostHelpful"` for a general sentiment question, and `"mostRecent"` for "what changed lately".

Pricing is per event, which makes the Actor eligible for agentic payment flows — an agent can call it and pay per call without a subscription.

***

### Input reference

| Field | Type | Default | What it does |
|---|---|---|---|
| `appIds` | array | — | **Required.** Numeric App Store IDs or App Store URLs. |
| `countries` | array | `["us"]` | Two-letter storefront codes. Each one is a separate set of reviews. |
| `sortBy` | string | `mostRecent` | `mostRecent` or `mostHelpful`. |
| `maxReviewsPerApp` | integer | `100` | Cap per app **and** per country. Max 500 (Apple's own ceiling). |
| `onlyNew` | boolean | `false` | Return only reviews that appeared since the previous run. |
| `stateStoreName` | string | `app-review-state` | Which memory the monitoring uses. Different names monitor different sets independently. |
| `minRating` / `maxRating` | integer | `1` / `5` | Keep only reviews inside this star range. |
| `requestDelayMs` | integer | `250` | Pause between requests to Apple. |

***

### Pricing

Pay per event — you are charged for what you actually receive:

| Event | What triggers it |
|---|---|
| `actor-start` | Once per run. |
| `review` | Each review delivered to your dataset. |

A monitoring run that finds nothing new costs one `actor-start` and nothing else. There is no subscription and no minimum.

***

### Limitations, stated plainly

- **Apple caps the public feed at 500 reviews per app per storefront** (10 pages of 50). This is Apple's limit, not this Actor's, and no tool can go past it on public data. Add more `countries` to widen coverage. For monitoring this ceiling never matters, because you only need the newest page.
- **Ratings without written text are not in the feed.** Apple only publishes reviews that have a title and body, so the counts here are lower than the rating totals shown on the store page.
- **Google Play is not covered.** This Actor deliberately does one source well. The output schema already carries a `source` field so a Play version can be merged into the same dataset later without changing your pipeline.
- **`onlyNew` state lives in a named key-value store on your account.** Deleting that store resets monitoring to a fresh start.
- **Reviews contain author nicknames**, which are personal data under GDPR. They are public, but treat them accordingly: do not enrich or profile individuals.

***

### FAQ

**Where do I find the app ID?**
In the App Store URL, right after `id`. In `https://apps.apple.com/us/app/spotify/id324684580` it is `324684580`. You can also just paste the whole URL.

**Can I get reviews for my own app including replies?**
Not through this Actor. Apple's App Store Connect API exposes developer replies, but only for apps you own. This Actor reads the public feed, which works for any app including your competitors'.

**Why did my first monitoring run return 50 reviews?**
That is the starting point being recorded. From the second run onwards you only get new ones.

**Does it need proxies?**
No. Apple's feed is public and does not block, so runs are cheap and reliable.

# Actor input Schema

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

The apps to fetch reviews for. Accepts numeric App Store IDs (e.g. '324684580') or full App Store URLs (e.g. 'https://apps.apple.com/us/app/spotify/id324684580'). The numeric ID is the number after 'id' in the URL.

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

Two-letter ISO country codes of the App Store storefronts to read. Apple keeps reviews separate per storefront, so 'us' returns only US reviews. Each extra country is a separate set of reviews.

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

'mostRecent' returns newest reviews first and is what you want for monitoring. 'mostHelpful' returns Apple's ranked reviews and is better for a one-off overview of sentiment.

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

Upper bound on reviews returned for each app/country pair. Apple's public feed exposes at most 500 reviews per app per storefront, so values above 500 have no effect. Keep this small (20-50) when calling from an AI agent so the response stays readable.

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

Turn on to make repeated runs incremental: the Actor remembers the newest review it has already returned for each app/country pair and returns only what appeared since. The first run returns at most the 50 most recent reviews and records the starting point, so switching this on never dumps the whole backlog. Use it with a schedule to build a 'new review' alert.

## `stateStoreName` (type: `string`):

Only used when 'Only reviews new since the last run' is on. Runs sharing this name share the same memory of what was already returned. Use different names to monitor different sets of apps independently.

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

Drop reviews below this rating. Set both this and the maximum to 1 to get only 1-star reviews, which is the usual setup for a complaint alert.

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

Drop reviews above this rating.

## `requestDelayMs` (type: `integer`):

Pause between calls to Apple's feed. The default is polite and rarely needs changing.

## Actor input object example

```json
{
  "appIds": [
    "324684580",
    "https://apps.apple.com/us/app/notion/id1232780281"
  ],
  "countries": [
    "us",
    "gb",
    "it",
    "de",
    "jp"
  ],
  "sortBy": "mostRecent",
  "maxReviewsPerApp": 100,
  "onlyNew": false,
  "stateStoreName": "app-review-state",
  "minRating": 1,
  "maxRating": 5,
  "requestDelayMs": 250
}
```

# Actor output Schema

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

One row per App Store review, deduplicated by reviewId. Each row carries the rating, title, body, author, app version, storefront country and review date. When 'Only reviews new since the last run' is on, this contains just the reviews that appeared since the previous run — an empty result means nothing new, not a failure.

## `summary` (type: `string`):

Per app and country storefront: how many reviews were delivered and a status of 'ok', 'monitoring-started', 'no-reviews-or-app-not-found', or 'error'. Read this to tell an empty result apart from a wrong app ID or a failed request.

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

// Run the Actor and wait for it to finish
const run = await client.actor("alfdev996/app-store-reviews-scraper-api").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"] }

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

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,alfdev996/app-store-reviews-scraper-api"
        }
    }
}
```

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/yIwqBt0ztR9HHwNNh/builds/Id4Fk3wwIUELP9ffD/openapi.json
