# App Store Reviews Scraper — Ratings & Feedback (`hichemdev/appstore-reviews-scraper`) Actor

Scrape Apple App Store reviews: star rating, title, full review text, author, reviewed app version, date and helpful votes, plus the app's live store rating. Pull from many country stores at once and filter by rating or keyword. No API key.

- **URL**: https://apify.com/hichemdev/appstore-reviews-scraper.md
- **Developed by:** [Hichem Ben Moussa](https://apify.com/hichemdev) (community)
- **Categories:** Developer tools, Business, Marketing
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $3.00 / 1,000 reviews

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/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 — Ratings & User Feedback

Scrape **Apple App Store reviews** — star rating, title, full review text, author, the app version reviewed, the date and helpful votes — for any app, from any country store, with the app's live overall rating attached to every row.

No API key required.

### What you get

| Field | Description |
|---|---|
| `rating` | Stars, 1–5 |
| `title` | Review headline |
| `review` | Full review text |
| `author`, `authorUrl` | Reviewer nickname and profile |
| `reviewedVersion` | The app version the user actually reviewed |
| `currentAppVersion` | The version live in the store right now |
| `isOnCurrentVersion` | Whether this review is about the current build — the fastest way to see if a bad release is driving complaints |
| `updatedAt` | Review date |
| `thumbsUp`, `voteCount` | Helpful votes |
| `appId`, `appName`, `developer` | App identity |
| `appAverageRating`, `appRatingCount` | Live store rating and total number of ratings |
| `country` | Which country store the review came from |
| `reviewId`, `appUrl` | Identifiers and link |

### Example input

```json
{
  "apps": ["544007664"],
  "countries": ["us", "gb", "de", "fr"],
  "sortBy": "mostrecent",
  "maxReviewsPerApp": 500
}
```

Mine complaints only — the fastest route to a product backlog:

```json
{
  "apps": ["https://apps.apple.com/us/app/youtube/id544007664"],
  "maxRating": 2,
  "keyword": "crash"
}
```

App IDs can be given as a bare number or as any App Store URL.

### Example output

```json
{
  "rating": 1,
  "title": "AI feature ruined all animators and artist lives",
  "review": "So the reason why I saying this is because I heard about this new update...",
  "author": "Nickname_9308",
  "reviewedVersion": "21.38.2",
  "currentAppVersion": "21.38.3",
  "isOnCurrentVersion": false,
  "updatedAt": "2026-09-25T04:51:41-07:00",
  "thumbsUp": 0,
  "appName": "YouTube",
  "appAverageRating": 4.6665,
  "appRatingCount": 49142618,
  "country": "us"
}
```

### Who uses this

- **Product teams** — filter to 1- and 2-star reviews and read what is actually breaking, ranked by helpful votes
- **ASO and marketing** — the vocabulary real users type is the keyword list you should be targeting
- **Competitor research** — pull a rival's reviews and find the feature requests they keep ignoring
- **Release monitoring** — `isOnCurrentVersion` isolates feedback on the build you just shipped from historical noise
- **Support and QA** — catch a crash wave before it reaches your ticket queue
- **Sentiment analysis pipelines** — clean, dated, versioned text ready for an LLM or classifier

### The 500-review limit, and how to get past it

Apple's public review feed serves **50 reviews per page and stops at page 10** — a hard ceiling of **500 reviews per app, per country store**. No scraper can exceed it from this source, and any actor claiming unlimited App Store reviews from one country is not being straight with you.

The real workaround is **querying multiple country stores**, which are separate feeds with separate reviews. Listing `["us","gb","ca","au","de","fr"]` yields up to 3,000 reviews for the same app. The actor handles this in one run and tags every row with its `country`, and `maxReviewsPerApp` caps the combined total across all of them.

Reviews are returned newest-first by default, so a scheduled daily run picks up everything new without ever approaching the cap.

### Pricing

Pay per result. Each review returned counts as one result, and the rating and keyword filters are applied before charging — so a run that keeps only 1-star reviews mentioning "crash" bills for just those.

### Notes

- Ratings-only submissions (a star with no written review) are not in this feed; Apple publishes only written reviews. That is why `appRatingCount` is far larger than the number of reviews available.
- An app not published in a given country store is reported in the log and skipped rather than failing the run.
- `appAverageRating` and `appRatingCount` are the live store-wide figures at run time, attached to each row for convenience — they describe the app, not the individual review.
- This is an unofficial actor and is not affiliated with Apple.

# Actor input Schema

## `apps` (type: `array`):

App Store IDs or URLs, e.g. 544007664 or https://apps.apple.com/us/app/youtube/id544007664.

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

Two-letter country codes. Apple caps each store at 500 reviews per app, so adding countries is how you get more - e.g. us, gb, de, fr, ca, au.

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

Review order as Apple serves it.

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

Keep only reviews with at least this many stars. Set 1 and max 2 to study complaints.

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

Keep only reviews with at most this many stars.

## `keyword` (type: `string`):

Keep only reviews whose title or text mentions this word, e.g. crash, subscription, ads.

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

Cap per app across all selected countries. 0 means no cap.

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

Stop after this many reviews in total.

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

Optional. A proxy is not required for this actor.

## Actor input object example

```json
{
  "apps": [
    "544007664"
  ],
  "countries": [
    "us"
  ],
  "sortBy": "mostrecent",
  "maxReviewsPerApp": 200,
  "maxReviews": 50,
  "proxyConfiguration": {
    "useApifyProxy": false
  }
}
```

# Actor output Schema

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

All scraped items as JSON.

## `overview` (type: `string`):

Browse results in the 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 = {
    "apps": [
        "544007664"
    ],
    "countries": [
        "us"
    ],
    "maxReviews": 50
};

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

# Run the Actor and wait for it to finish
run = client.actor("hichemdev/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 '{
  "apps": [
    "544007664"
  ],
  "countries": [
    "us"
  ],
  "maxReviews": 50
}' |
apify call hichemdev/appstore-reviews-scraper --silent --output-dataset

```

## MCP server setup

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