# App Store Reviews Scraper (`xtracto/appstore-reviews-scraper`) Actor

Extract customer reviews for any Apple App Store app - rating, title, review text, author, app version, date and vote counts - via Apple's open no-auth feed. Optional app details. No login, no API key.

- **URL**: https://apify.com/xtracto/appstore-reviews-scraper.md
- **Developed by:** [Farhan Febrian Nauval](https://apify.com/xtracto) (community)
- **Categories:** Lead generation
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $0.99 / 1,000 results

This Actor is paid per event and usage. You are charged both the fixed price for specific events and for Apify platform usage.
Since this Actor supports Apify Store discounts, the price gets lower the higher subscription plan you have.

Learn more: https://docs.apify.com/platform/actors/running/actors-in-store#pay-per-event

## What's an Apify Actor?

Actors are a software tools running on the Apify platform, for all kinds of web data extraction and automation use cases.
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.

In JavaScript/TypeScript projects, use official [JavaScript/TypeScript client](https://docs.apify.com/api/client/js/docs.md):

```bash
npm install apify-client
```

In Python projects, use official [Python client library](https://docs.apify.com/api/client/python/docs.md):

```bash
pip install apify-client
```

In shell scripts, use [Apify CLI](https://docs.apify.com/cli/docs.md):

````bash
# MacOS / Linux
curl -fsSL https://apify.com/install-cli.sh | bash
# Windows
irm https://apify.com/install-cli.ps1 | iex
```bash

In AI frameworks, you might use the [Apify MCP server](https://docs.apify.com/integrations/mcp.md).

If your project is in a different language, use 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

Get **customer reviews for any Apple App Store app** — star rating, review title, full review text, author, app version, date, and vote counts — straight from Apple's public data. Point it at an app's numeric ID, pick a country, and press Run.

### Why use this actor

- **No account, no API key, no login** — just press Run.
- **Full review text**, not just the star rating — title, body, author, and the app version the review was written for.
- **Any country storefront** (US, GB, DE, ID, BR, and more) — reviews differ per country, so you choose which market to read.
- **Sort by newest or most helpful** — track fresh feedback, or surface the reviews the community voted up.
- **Scrape many apps in one run** and get one clean row per review.
- **Optional app details** — name, developer, category, average rating, total rating count, icon, and more.
- **Clean, stable JSON** ready for spreadsheets, dashboards, databases, or sentiment analysis. Export to JSON, CSV, or Excel, and run it on a schedule.

### How it works

1. Enter the **App ID** (the number in the app's App Store URL, e.g. `.../id310633997` → `310633997`).
2. Choose the **country**, how to **sort** reviews, and how many reviews you want.
3. Press **Run**. Reviews stream into the dataset, ready to export to JSON, CSV, or Excel.

No scrapers, servers, or blocks to manage — the actor handles retries for you.

### Input

```json
{
  "appId": "310633997",
  "country": "us",
  "sortBy": "mostrecent",
  "maxReviews": 200,
  "includeMetadata": true
}
````

| Field | Type | Description |
| --- | --- | --- |
| `appId` | string | The numeric App Store ID of the app (e.g. `310633997` = WhatsApp). |
| `appIds` | array of strings | Optional. Several app IDs to scrape in one run. |
| `country` | string | Two-letter storefront code (e.g. `us`, `gb`, `de`, `id`, `br`). |
| `sortBy` | string | `mostrecent` (newest first) or `mosthelpful` (most-voted first). |
| `maxReviews` | integer | Reviews to fetch per app (1–500). See the limit below. |
| `includeMetadata` | boolean | Also emit one app-details record per app. Default `true`. |
| `maxItems` | integer | Global cap on total records across all apps (`0` = no cap). |
| `proxyConfiguration` | object | Optional. Not required — the data is public. |

### Output

Every record carries a small header (`_input`, `_scrapedAt`, `_source`, `recordType`). Review records have clean top-level fields **and** keep Apple's original review data under `raw`, so nothing is lost. `recordType` is `REVIEW` or `APP`.

#### `REVIEW` — app `310633997` (WhatsApp), country `us`, most recent

```json
{
  "_input": "310633997:us:mostrecent",
  "_scrapedAt": "2026-07-15T17:57:46Z",
  "_source": "S1-reviews",
  "recordType": "REVIEW",
  "appId": "310633997",
  "country": "us",
  "sortBy": "mostrecent",
  "reviewId": "14300125143",
  "rating": 1,
  "title": "Terrible",
  "content": "Do not force me to update. Terrible app.",
  "authorName": "Tigerbean__",
  "authorUri": "https://itunes.apple.com/us/reviews/id123675853",
  "appVersion": "26.27.72",
  "updated": "2026-07-13T17:43:34-07:00",
  "voteSum": 0,
  "voteCount": 0,
  "reviewUrl": "https://itunes.apple.com/us/review?id=310633997&type=Purple%20Software",
  "raw": { "author": { "...": "..." }, "im:rating": { "label": "1" }, "...": "... Apple's original entry" }
}
```

More reviews from the same run (flattened key fields):

```json
{ "rating": 5, "title": "Perfectly fine", "content": "Perfectly fine", "authorName": "Akay Mirza Ali", "appVersion": "26.27.72", "updated": "2026-07-13T18:36:04-07:00" }
{ "rating": 2, "title": "Meh", "content": "Countless programmers adding gimmicky features in forced updates to try to justify their existence", "authorName": "Nick Name 4523", "appVersion": "26.27.72", "updated": "2026-07-13T17:31:42-07:00" }
```

#### `APP` — app details (when `includeMetadata` is on)

```json
{
  "_input": "310633997:us:mostrecent",
  "_scrapedAt": "2026-07-15T17:57:46Z",
  "_source": "S1-lookup",
  "recordType": "APP",
  "appId": "310633997",
  "country": "us",
  "trackName": "WhatsApp Messenger",
  "sellerName": "WhatsApp Inc.",
  "primaryGenreName": "Social Networking",
  "averageUserRating": 4.6862,
  "userRatingCount": 18248776,
  "version": "26.27.74",
  "price": 0,
  "artworkUrl512": "https://is1-ssl.mzstatic.com/image/thumb/.../512x512bb.jpg"
}
```

#### Key output fields

| Field | Type | Description |
| --- | --- | --- |
| `recordType` | string | `REVIEW` or `APP`. |
| `rating` | integer | Star rating, 1–5 (review records). |
| `title` | string | Review headline. |
| `content` | string | Full review text. |
| `authorName` | string | Reviewer's display name. |
| `appVersion` | string | App version the review was written for. |
| `updated` | string | When the review was posted (ISO 8601). |
| `voteSum` / `voteCount` | integer | Net helpful score and number of votes. |
| `reviewId` | string | Apple's unique ID for the review. |
| `appId` / `country` / `sortBy` | string | Echo of what was requested. |
| `raw` | object | Apple's original, untouched review entry. |
| `trackName` / `sellerName` | string | App name / developer (app records). |
| `averageUserRating` / `userRatingCount` | number | Overall rating and total number of ratings (app records). |
| `primaryGenreName` | string | App category (app records). |

On any failure the actor emits a `{_input, _scrapedAt, _source, _error, _errorDetail}` record instead of silently skipping.

### Notes & limits

- **Apple exposes about 500 reviews per app per country** (10 pages of 50), sorted by most recent or most helpful. `maxReviews` above 500 is capped. To read more feedback, scrape the same app across several country storefronts.
- Reviews are per **country** — the `us` storefront and the `gb` storefront return different reviews.
- All data is public — no account or key needed. A proxy is optional and only helps if you scrape many apps at once.

### Other Apple actors

| Actor | What it does |
| --- | --- |
| **App Store Reviews Scraper** | Customer reviews (rating, text, author, version) for any App Store app. |
| **Apple Podcast Charts & Metadata** | Ranked podcast charts, show/episode metadata, and podcast search. |

# Actor input Schema

## `appId` (type: `string`):

The numeric App Store ID of the app to get reviews for. Find it in the app's App Store URL, e.g. .../id310633997 -> 310633997 (WhatsApp). Leave blank if you use 'App IDs' below.

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

Optional. Several numeric App Store IDs to scrape in one run. Combined with 'App ID' above if both are given.

## `country` (type: `string`):

Two-letter storefront code for the country whose reviews you want, e.g. us, gb, de, id, br. Reviews differ per country.

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

'Most recent' returns the newest reviews first. 'Most helpful' returns the reviews with the most votes first.

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

How many reviews to fetch per app (per country). Apple only exposes up to about 500 reviews per app per country, so values above 500 are capped.

## `includeMetadata` (type: `boolean`):

If on, also emit one record per app with its App Store details (name, developer, category, average rating, icon, etc.) alongside the reviews.

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

Global cap on the total number of records pushed in this run across all apps. 0 = no cap.

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

Optional. Apple's review feeds are public, so a proxy is not required. A residential proxy can help if you scrape many apps and hit soft rate limits.

## Actor input object example

```json
{
  "appId": "310633997",
  "appIds": [
    "310633997"
  ],
  "country": "us",
  "sortBy": "mostrecent",
  "maxReviews": 200,
  "includeMetadata": true,
  "maxItems": 0,
  "proxyConfiguration": {
    "useApifyProxy": false,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ]
  }
}
```

# 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 = {
    "appId": "310633997",
    "appIds": [
        "310633997"
    ],
    "country": "us",
    "sortBy": "mostrecent",
    "maxReviews": 200
};

// Run the Actor and wait for it to finish
const run = await client.actor("xtracto/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 = {
    "appId": "310633997",
    "appIds": ["310633997"],
    "country": "us",
    "sortBy": "mostrecent",
    "maxReviews": 200,
}

# Run the Actor and wait for it to finish
run = client.actor("xtracto/appstore-reviews-scraper").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print("💾 Check your data here: https://console.apify.com/storage/datasets/" + run["defaultDatasetId"])
for item in client.dataset(run["defaultDatasetId"]).iterate_items():
    print(item)

# 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/python/docs/quick-start

```

## CLI example

```bash
echo '{
  "appId": "310633997",
  "appIds": [
    "310633997"
  ],
  "country": "us",
  "sortBy": "mostrecent",
  "maxReviews": 200
}' |
apify call xtracto/appstore-reviews-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "command": "npx",
            "args": [
                "mcp-remote",
                "https://mcp.apify.com/?tools=xtracto/appstore-reviews-scraper",
                "--header",
                "Authorization: Bearer <YOUR_API_TOKEN>"
            ]
        }
    }
}

```

## OpenAPI specification

```json
{
    "openapi": "3.0.1",
    "info": {
        "title": "App Store Reviews Scraper",
        "description": "Extract customer reviews for any Apple App Store app - rating, title, review text, author, app version, date and vote counts - via Apple's open no-auth feed. Optional app details. No login, no API key.",
        "version": "0.1",
        "x-build-id": "uS2fS81HQ2HLCybRr"
    },
    "servers": [
        {
            "url": "https://api.apify.com/v2"
        }
    ],
    "paths": {
        "/acts/xtracto~appstore-reviews-scraper/run-sync-get-dataset-items": {
            "post": {
                "operationId": "run-sync-get-dataset-items-xtracto-appstore-reviews-scraper",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor, waits for its completion, and returns Actor's dataset items in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK"
                    }
                }
            }
        },
        "/acts/xtracto~appstore-reviews-scraper/runs": {
            "post": {
                "operationId": "runs-sync-xtracto-appstore-reviews-scraper",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor and returns information about the initiated run in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/runsResponseSchema"
                                }
                            }
                        }
                    }
                }
            }
        },
        "/acts/xtracto~appstore-reviews-scraper/run-sync": {
            "post": {
                "operationId": "run-sync-xtracto-appstore-reviews-scraper",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor, waits for completion, and returns the OUTPUT from Key-value store in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK"
                    }
                }
            }
        }
    },
    "components": {
        "schemas": {
            "inputSchema": {
                "type": "object",
                "properties": {
                    "appId": {
                        "title": "App ID",
                        "type": "string",
                        "description": "The numeric App Store ID of the app to get reviews for. Find it in the app's App Store URL, e.g. .../id310633997 -> 310633997 (WhatsApp). Leave blank if you use 'App IDs' below."
                    },
                    "appIds": {
                        "title": "App IDs (multiple)",
                        "type": "array",
                        "description": "Optional. Several numeric App Store IDs to scrape in one run. Combined with 'App ID' above if both are given.",
                        "items": {
                            "type": "string"
                        }
                    },
                    "country": {
                        "title": "Country",
                        "type": "string",
                        "description": "Two-letter storefront code for the country whose reviews you want, e.g. us, gb, de, id, br. Reviews differ per country.",
                        "default": "us"
                    },
                    "sortBy": {
                        "title": "Sort reviews by",
                        "enum": [
                            "mostrecent",
                            "mosthelpful"
                        ],
                        "type": "string",
                        "description": "'Most recent' returns the newest reviews first. 'Most helpful' returns the reviews with the most votes first.",
                        "default": "mostrecent"
                    },
                    "maxReviews": {
                        "title": "Max reviews per app",
                        "minimum": 1,
                        "maximum": 500,
                        "type": "integer",
                        "description": "How many reviews to fetch per app (per country). Apple only exposes up to about 500 reviews per app per country, so values above 500 are capped.",
                        "default": 200
                    },
                    "includeMetadata": {
                        "title": "Include app details",
                        "type": "boolean",
                        "description": "If on, also emit one record per app with its App Store details (name, developer, category, average rating, icon, etc.) alongside the reviews.",
                        "default": true
                    },
                    "maxItems": {
                        "title": "Max records total (0 = no cap)",
                        "minimum": 0,
                        "type": "integer",
                        "description": "Global cap on the total number of records pushed in this run across all apps. 0 = no cap.",
                        "default": 0
                    },
                    "proxyConfiguration": {
                        "title": "Proxy",
                        "type": "object",
                        "description": "Optional. Apple's review feeds are public, so a proxy is not required. A residential proxy can help if you scrape many apps and hit soft rate limits.",
                        "default": {
                            "useApifyProxy": false,
                            "apifyProxyGroups": [
                                "RESIDENTIAL"
                            ]
                        }
                    }
                }
            },
            "runsResponseSchema": {
                "type": "object",
                "properties": {
                    "data": {
                        "type": "object",
                        "properties": {
                            "id": {
                                "type": "string"
                            },
                            "actId": {
                                "type": "string"
                            },
                            "userId": {
                                "type": "string"
                            },
                            "startedAt": {
                                "type": "string",
                                "format": "date-time",
                                "example": "2025-01-08T00:00:00.000Z"
                            },
                            "finishedAt": {
                                "type": "string",
                                "format": "date-time",
                                "example": "2025-01-08T00:00:00.000Z"
                            },
                            "status": {
                                "type": "string",
                                "example": "READY"
                            },
                            "meta": {
                                "type": "object",
                                "properties": {
                                    "origin": {
                                        "type": "string",
                                        "example": "API"
                                    },
                                    "userAgent": {
                                        "type": "string"
                                    }
                                }
                            },
                            "stats": {
                                "type": "object",
                                "properties": {
                                    "inputBodyLen": {
                                        "type": "integer",
                                        "example": 2000
                                    },
                                    "rebootCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "restartCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "resurrectCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "computeUnits": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            },
                            "options": {
                                "type": "object",
                                "properties": {
                                    "build": {
                                        "type": "string",
                                        "example": "latest"
                                    },
                                    "timeoutSecs": {
                                        "type": "integer",
                                        "example": 300
                                    },
                                    "memoryMbytes": {
                                        "type": "integer",
                                        "example": 1024
                                    },
                                    "diskMbytes": {
                                        "type": "integer",
                                        "example": 2048
                                    }
                                }
                            },
                            "buildId": {
                                "type": "string"
                            },
                            "defaultKeyValueStoreId": {
                                "type": "string"
                            },
                            "defaultDatasetId": {
                                "type": "string"
                            },
                            "defaultRequestQueueId": {
                                "type": "string"
                            },
                            "buildNumber": {
                                "type": "string",
                                "example": "1.0.0"
                            },
                            "containerUrl": {
                                "type": "string"
                            },
                            "usage": {
                                "type": "object",
                                "properties": {
                                    "ACTOR_COMPUTE_UNITS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_WRITES": {
                                        "type": "integer",
                                        "example": 1
                                    },
                                    "KEY_VALUE_STORE_LISTS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_INTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_EXTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_SERPS": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            },
                            "usageTotalUsd": {
                                "type": "number",
                                "example": 0.00005
                            },
                            "usageUsd": {
                                "type": "object",
                                "properties": {
                                    "ACTOR_COMPUTE_UNITS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_WRITES": {
                                        "type": "number",
                                        "example": 0.00005
                                    },
                                    "KEY_VALUE_STORE_LISTS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_INTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_EXTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_SERPS": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }
}
```
