# Apple App Store Reviews Scraper (`cliqtomedia/apple-app-store-reviews-scraper`) Actor

Export Apple App Store reviews by app and country to JSON or CSV, with stable IDs and clear stop reasons.

- **URL**: https://apify.com/cliqtomedia/apple-app-store-reviews-scraper.md
- **Developed by:** [Cliqto Media](https://apify.com/cliqtomedia) (community)
- **Categories:**
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 1 bookmarks
- **User rating**: No ratings yet

## Pricing

from $0.10 / 1,000 apple app store 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

## Apple App Store Reviews Scraper

Export public Apple App Store reviews by app and country. Save the results as
JSON, CSV, Excel, XML, or read them through the Apify API.

Add an Apple app ID or an App Store URL. Then choose the countries you need.
The Actor saves one clean row for each unique review.

Use the data for product research, ASO, release checks, and customer feedback.
Each row includes the rating, title, text, author, date, and stable IDs.

This Actor is unofficial and is not affiliated with Apple. It does not use the
official App Store Connect API.

### What you get

- Up to 2,000 reviews for each app and country.
- Up to 10,000 reviews in one run.
- One Dataset row for each unique review.
- Stable IDs for updates and later comparisons.
- Review data for several apps and countries in one run.
- A run report that explains every stop or error (`RUN_SUMMARY`).
- No Apple account, API key, proxy, or browser setup.

### How to use it

1. Add one or more app IDs or App Store URLs.
2. Add two-letter country codes, such as `us`, `gb`, or `de`.
3. Set a small review limit for your first run.
4. Start the Actor and open the Dataset.
5. Open `RUN_SUMMARY` if you need details about the run.

Example with an app ID:

```json
{
  "appIds": ["324684580"],
  "countries": ["us", "gb"],
  "sort": "appleDefault",
  "maxReviewsPerAppCountry": 20,
  "maxReviewsTotal": 40
}
```

Example with an App Store URL:

```json
{
  "startUrls": [
    { "url": "https://apps.apple.com/us/app/example/id324684580" }
  ],
  "countries": ["us"],
  "sort": "appleDefault",
  "maxReviewsPerAppCountry": 10,
  "maxReviewsTotal": 10
}
```

The URL and country fields have separate jobs:

1. Add the App Store URL.
2. Choose countries in the `countries` field.
3. The Actor uses those countries for review collection.
4. The Actor reads only the app ID from the URL.

### Input fields

| Field | Type | What to enter |
|---|---|---|
| `appIds` | string array | Apple app IDs, such as `324684580`. |
| `startUrls` | URL array | Product URLs from `apps.apple.com` or `itunes.apple.com`. |
| `countries` | string array | Two-letter App Store country codes, such as `us` or `jp`. |
| `sort` | string | Use `appleDefault`. Apple chooses the source order. |
| `maxReviewsPerAppCountry` | integer | Save 1 to 2,000 reviews for each app and country. |
| `maxReviewsTotal` | integer | Save 1 to 10,000 reviews across the whole run. |

You can add up to 50 app IDs and URLs in total. The app and country plan can
contain up to 50 pairs.

The default limits are 10 reviews. This keeps your first run small and cheap.

### Review output

The Dataset contains review rows only. This example uses invented values:

```json
{
  "schemaVersion": "1.1",
  "recordId": "apple-app-store-review:v1:324684580:us:synthetic-123",
  "reviewId": "synthetic-123",
  "appId": "324684580",
  "appName": "Example App",
  "appUrl": "https://apps.apple.com/us/app/id324684580",
  "country": "us",
  "sort": "appleDefault",
  "authorName": "Example Reviewer",
  "title": "Synthetic title",
  "text": "Synthetic review body.",
  "rating": 5,
  "appVersion": null,
  "reviewedAt": "2026-08-27T15:15:00Z",
  "helpfulVotes": null,
  "totalVotes": null,
  "isEdited": false,
  "sourcePage": 1,
  "sourceTransport": "apple-web-reviews-api:v1",
  "sourceUrl": "https://apps.apple.com/api/apps/v1/catalog/us/apps/324684580/reviews",
  "scrapedAt": "2026-09-02T00:00:00Z"
}
```

Use `recordId` to update existing rows in your system. The same review keeps
the same ID for the same app and country.

Some fields can be empty. Apple does not provide app version or vote counts
through this source, so these fields are `null`.

### Run report

The Actor saves a separate report named `RUN_SUMMARY`. Open it when the Dataset
is empty or smaller than expected.

The report shows:

- how many app and country pairs were checked;
- how many reviews were found, saved, and charged;
- which pages were requested;
- why each app and country pair stopped;
- whether the run stopped because of your result or charge limit;
- safe error details for support.

### Limits

Apple provides a changing window of public reviews. This Actor does not promise
a complete review history.

- Each source page can contain up to 20 reviews.
- The Actor requests up to 100 pages for each app and country.
- The maximum is 2,000 reviews for each app and country.
- The whole run stops at 10,000 saved reviews.
- Apple controls the order shown as `appleDefault`.
- Different countries can return different reviews.
- A run can return fewer reviews than you request.

The Actor checks that every next page is new. It stops if Apple repeats a page,
skips a page, changes the data shape, or returns an error.

Reviews saved before a later error stay in the Dataset. The run report explains
why collection stopped.

### Pricing

The current price is:

- USD 0.002 when the Actor starts;
- USD 0.0001 for each unique review saved.

A run with 10 saved reviews costs USD 0.003. A run with 200 saved reviews costs
USD 0.022. A run with 2,000 saved reviews costs USD 0.202. A run with 10,000
saved reviews costs USD 1.002.

You do not pay the review charge for repeated or unsaved reviews. A charge limit
stops the run before another review is saved.

Always check the Pricing tab before a large run. Your Apify plan may also have
its own platform usage rules.

### Why results can be smaller

You may receive fewer rows when:

- Apple exposes fewer reviews for that country;
- the app is not available in the selected country;
- Apple returns the same review more than once;
- your total result limit is reached;
- your maximum charge is reached;
- Apple repeats or skips a page;
- Apple returns an error or changes the response.

Open `RUN_SUMMARY` to see the exact reason for each app and country.

### Common uses

- Export iOS app reviews to JSON, CSV, or Excel.
- Compare App Store reviews across countries.
- Study customer feedback for product and ASO work.
- Check feedback after an app release.
- Send review data to your database through the Apify API.

### FAQ

#### Do I need an Apple account or API key?

No. The Actor reads a public Apple-hosted source. It cannot access non-public App
Store Connect data.

#### Does the Actor return the newest reviews first?

Not always. Apple controls `appleDefault` order. The order can change between
runs.

#### Can I get all historical reviews?

No. The Actor returns up to 100 current source pages. This is not a complete
history.

#### Can I get developer replies?

No. Developer replies are not available in this output.

#### How do I remove repeated reviews across runs?

Use `recordId` as the update key. It combines the app ID, country, and Apple
review ID.

#### What happens after a late error?

Reviews already saved remain available. Open `RUN_SUMMARY` to see the stop
reason and affected app-country pair.

### Need help?

1. Open the failed or incomplete run.
2. Open `RUN_SUMMARY` from the Output tab.
3. Check the app ID, country, limits, final status, and stop reason.
4. Send support the Run ID and these safe details.

Do not send review text, author names, tokens, cookies, or authorization
headers.

### Privacy and responsible use

Review text and author names are public user content. They can still contain
personal data.

Collect only the data you need. Protect exported files and follow privacy,
retention, and Apple rules that apply to your work.

Apple and App Store are trademarks of Apple Inc. This Actor is unofficial and
is not endorsed by Apple.

# Actor input Schema

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

Add numeric Apple app IDs. You can add up to 50 IDs and URLs in total.

## `startUrls` (type: `array`):

Add App Store product URLs. The Actor reads the app ID from each URL.

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

Add two-letter country codes, such as us, gb, or de. Each country is a separate App Store market.

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

Apple chooses the review order. The order may change between runs.

## `maxReviewsPerAppCountry` (type: `integer`):

Save up to this many reviews for each app and country. The maximum is 2,000.

## `maxReviewsTotal` (type: `integer`):

Stop after saving this many unique reviews across the whole run.

## Actor input object example

```json
{
  "appIds": [
    "324684580"
  ],
  "countries": [
    "us"
  ],
  "sort": "appleDefault",
  "maxReviewsPerAppCountry": 10,
  "maxReviewsTotal": 10
}
```

# Actor output Schema

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

One row for each unique review, app, and country.

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

Shows why collection finished, stopped early, or failed.

# 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("cliqtomedia/apple-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"] }

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

```

## MCP server setup

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