# App Store Reviews Scraper - Ratings, App Data & Top Charts (`deanko/appstore-scraper`) Actor

Scrape Apple App Store reviews, ratings, star histograms, app details and top free, paid & grossing charts for many countries in one run. $1 per 1,000 rows.

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

## Pricing

from $1.00 / 1,000 results

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?

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 - iOS ratings, app data & top charts

**App Store Reviews Scraper** exports Apple App Store **reviews**, **ratings**, **1-5 star histograms**, **app details** and **top charts** (Top Free, Top Paid, Top Grossing, overall or per category) for **any number of apps and countries in one run**. Paste App Store IDs or URLs, or search by keyword, and download clean rows as JSON, CSV, Excel, or through the API.

No login, no API key, no proxy setup. **$1 per 1,000 rows.**

### What does App Store Reviews Scraper do?

It is an iOS app reviews scraper, App Store ratings tracker and top charts scraper in one Actor:

- **App Store reviews**: rating, title, review text, app version, date, helpful votes and total votes, up to the 500 most recent reviews per app and country.
- **App details**: name, developer, bundle ID, price, average rating, rating count, **star rating distribution (1-5)**, current-version rating, version, release notes, release dates, genre, size, minimum iOS, content rating, languages, description and icon.
- **Top charts**: Top Free, Top Paid and Top Grossing iPhone apps (up to 100 ranks), overall or for one App Store category such as Games, Finance or Health & Fitness.
- **Keyword search**: find apps by keyword (for example `habit tracker`) and scrape the top results without knowing their IDs.

Every row carries `type` (`app`, `review` or `chart`) and `country`, so one dataset holds everything and is easy to filter or pivot.

#### Who is it for?

- **App developers and product managers**: read what users say about each release, catch bugs and feature requests early.
- **ASO and app marketing teams**: track rating, rating count, star distribution and chart rank for your app and competitors in every market.
- **Market researchers and investors**: see which apps lead Top Grossing in Japan vs the US, how prices differ by storefront, and how ratings move over time.
- **Data and AI teams**: feed review text into sentiment analysis, topic clustering or an LLM.

#### Use cases

- Monitor App Store reviews and ratings after each app update (schedule it daily).
- Compare one app across 10+ countries side by side.
- Build a history of top charts per category.
- Collect competitor reviews to find gaps in their product.
- Export App Store reviews to CSV or Excel for a report.

### Why this App Store scraper?

- **Reviews, app data and charts in one run.** Many App Store actors do only reviews or only app metadata. Here you get all three, so one scheduled run covers your app, your competitors and the charts they compete in.
- **Many countries at once.** Pass `["us", "gb", "de", "jp"]` and every app, review feed and chart is fetched for each storefront. Apple caps reviews at 500 per storefront, so more countries also means more reviews.
- **Star histogram included.** Each app row has the 1-5 star breakdown from the public App Store page, not only the average.
- **Reviews when the feed is empty.** For some apps Apple's reviews feed returns nothing. Instead of an empty result, the actor falls back to the featured reviews on the public App Store page (about 10 per app and country), and labels each review with its `source`.
- **You pay only for rows you get.** No charge per request, page or search. Set `maxItems` or a maximum charge per run, and the run stops right there.
- **Privacy-friendly.** Reviewer names and profile links are never collected, which makes GDPR-sensitive analysis simpler.

### How to scrape App Store reviews

1. Open the actor and click **Try for free**.
2. In **App IDs or App Store URLs**, paste one or more apps, for example `310633997` or `https://apps.apple.com/us/app/notion-notes-tasks-ai/id1232780281`. The ID is the number after `id` in the URL. Or type keywords in **Search terms**.
3. Pick **Countries** as two-letter codes (`us`, `gb`, `de`, `jp`, ...).
4. Set **Max reviews per app** (up to 500 per country). Turn **Include reviews** or **Include app details** off if you don't need them.
5. Optional: choose **Top charts** and a **Chart genre**.
6. Set **Max results** as your row and cost cap, then click **Start**.
7. Download the results as JSON, CSV, Excel or HTML, or read them through the API. Use the **Apps**, **Reviews** and **Charts** views to see each row type as its own table.

The prefilled input scrapes WhatsApp in the US with its 20 most recent reviews: 21 rows, about $0.02, in a few seconds.

#### Example input

```json
{
  "appIds": ["https://apps.apple.com/us/app/notion-notes-tasks-ai/id1232780281", "310633997"],
  "searchTerms": ["habit tracker"],
  "searchResultsPerTerm": 3,
  "countries": ["us", "gb", "de", "jp"],
  "includeAppDetails": true,
  "includeReviews": true,
  "maxReviewsPerApp": 100,
  "charts": ["top-free", "top-grossing"],
  "chartGenreId": "6007",
  "chartLimit": 50,
  "maxItems": 5000
}
```

#### Input fields

| Field | What it does | Default |
|---|---|---|
| `appIds` | App Store IDs (`310633997`, `id310633997`) or App Store URLs | WhatsApp as a demo when everything is empty |
| `searchTerms` | Keywords to find apps; top results are scraped like App IDs | `[]` |
| `searchResultsPerTerm` | Apps taken per search term and country (1-200) | `5` |
| `countries` | Two-letter storefront codes | `["us"]` |
| `includeAppDetails` | One `app` row per app and country | `true` |
| `includeReviews` | `review` rows | `true` |
| `maxReviewsPerApp` | Reviews per app and country (1-500) | `50` |
| `charts` | Any of `top-free`, `top-paid`, `top-grossing` | `[]` |
| `chartGenreId` | One App Store category for charts, e.g. `6014` Games, `6015` Finance | all apps |
| `chartLimit` | Ranks per chart (1-100) | `100` |
| `maxItems` | Total row cap (also your cost cap) | `1000` |

### Sample output

Every row has `type`, `country` and `scrapedAt`.

**Review row** (`type: "review"`)

```json
{
  "type": "review",
  "country": "us",
  "appId": "310633997",
  "reviewId": "14679618687",
  "rating": 4,
  "title": "Hihihi",
  "text": "Idk I started but I heard it's amazing so tried it / it was good",
  "appVersion": "26.40.77",
  "date": "2026-10-17T17:54:06-07:00",
  "helpfulVotes": 0,
  "totalVotes": 0,
  "source": "rss",
  "scrapedAt": "2026-10-19T08:23:58.661Z"
}
```

**App row** (`type: "app"`, shortened)

```json
{
  "type": "app",
  "country": "us",
  "appId": "310633997",
  "name": "WhatsApp Messenger",
  "bundleId": "net.whatsapp.WhatsApp",
  "developer": "WhatsApp Inc.",
  "developerId": "310634000",
  "price": 0,
  "currency": "USD",
  "formattedPrice": "Free",
  "rating": 4.6833,
  "ratingCount": 18790221,
  "ratingHistogram": { "1": 646939, "2": 255438, "3": 568957, "4": 1458599, "5": 15860288 },
  "ratingCurrentVersion": 4.6833,
  "ratingCountCurrentVersion": 18790221,
  "version": "26.40.77",
  "currentVersionReleaseDate": "2026-10-12T12:34:26Z",
  "releaseNotes": "We update the app regularly to fix bugs, optimize performance and improve the experience...",
  "releaseDate": "2009-05-04T02:43:49Z",
  "primaryGenre": "Social Networking",
  "genres": ["Social Networking", "Utilities"],
  "sizeBytes": 402210816,
  "minimumOsVersion": "15.1",
  "contentRating": "12+",
  "languages": ["AR", "EN", "DE"],
  "description": "WhatsApp from Meta is a free messaging and calling app...",
  "url": "https://apps.apple.com/us/app/whatsapp-messenger/id310633997",
  "iconUrl": "https://is1-ssl.mzstatic.com/image/thumb/.../512x512bb.jpg",
  "scrapedAt": "2026-10-17T10:45:30.324Z"
}
```

**Chart row** (`type: "chart"`)

```json
{
  "type": "chart",
  "country": "us",
  "chart": "top-free",
  "genreId": "6014",
  "rank": 1,
  "appId": "6761760135",
  "name": "Meowdoku!",
  "bundleId": "com.oakever.meowdoku",
  "developer": "Oakever Games",
  "price": 0,
  "currency": "USD",
  "category": "Games",
  "categoryId": "6014",
  "releaseDate": "2026-05-19T00:00:00-07:00",
  "url": "https://apps.apple.com/us/app/meowdoku/id6761760135",
  "iconUrl": "https://is1-ssl.mzstatic.com/image/thumb/.../100x100bb.png",
  "scrapedAt": "2026-10-17T10:43:39.364Z"
}
```

#### Output fields

| Field | Row type | Description |
|---|---|---|
| `type` | all | `app`, `review` or `chart` |
| `country` | all | Storefront code, e.g. `us` |
| `appId` | all | Numeric App Store ID |
| `name`, `developer`, `bundleId` | app, chart | App name, developer name, bundle ID |
| `rating`, `ratingCount` | app | Average rating (all versions) and number of ratings |
| `ratingHistogram` | app | Count of 1, 2, 3, 4 and 5 star ratings |
| `ratingCurrentVersion`, `ratingCountCurrentVersion` | app | Rating for the current version |
| `price`, `currency`, `formattedPrice` | app, chart | Price in the storefront's currency |
| `version`, `currentVersionReleaseDate`, `releaseNotes` | app | Latest version and its notes |
| `releaseDate`, `primaryGenre`, `genres`, `sizeBytes`, `minimumOsVersion`, `contentRating`, `languages`, `description`, `iconUrl`, `url` | app | App metadata |
| `rating` | review | Stars, 1-5 |
| `title`, `text` | review | Review title and body |
| `appVersion` | review | App version the review was written for (feed reviews only) |
| `date` | review | When the review was posted or updated |
| `helpfulVotes`, `totalVotes` | review | Vote counts (feed reviews only) |
| `reviewId`, `source` | review | Apple review ID; `rss` (reviews feed) or `storePage` (fallback) |
| `chart`, `genreId`, `rank`, `category`, `categoryId` | chart | Chart name, genre filter, rank position, app category |
| `scrapedAt` | all | When the row was collected |

### Pricing

Pay per event, no subscription:

- **$0.001 per result row** (app, review or chart row), which is **$1 per 1,000 rows**.
- **$0.00005 per run start** (per GB of memory; the default 256 MB counts as one start).

Platform compute and proxy costs are included.

**Worked example:** 3 apps x 4 countries, each with app details and 100 reviews = 3 x 4 x (1 + 100) = 1,212 rows = **about $1.21**. Adding Top Free and Top Grossing (100 ranks each) for those 4 countries adds 800 rows = $0.80.

Set **Max results** (`maxItems`) or a maximum charge per run, and the actor stops exactly there. You are only charged for rows that were saved.

### Integrations and API

Use the results in Google Sheets, Make, Zapier, n8n, Slack, Airbyte or your own code. Schedule runs from **Schedules** and get notified with **Webhooks**.

**Python** (`pip install apify-client`)

```python
from apify_client import ApifyClient

client = ApifyClient("<YOUR_APIFY_TOKEN>")
run = client.actor("deanko/appstore-scraper").call(run_input={
    "appIds": ["310633997"],
    "countries": ["us", "gb"],
    "maxReviewsPerApp": 100,
})
for row in client.dataset(run["defaultDatasetId"]).iterate_items():
    if row["type"] == "review":
        print(row["country"], row["rating"], row["title"])
```

**JavaScript / Node.js** (`npm install apify-client`)

```js
import { ApifyClient } from 'apify-client';

const client = new ApifyClient({ token: '<YOUR_APIFY_TOKEN>' });
const run = await client.actor('deanko/appstore-scraper').call({
    appIds: ['310633997'],
    countries: ['us', 'gb'],
    charts: ['top-grossing'],
    chartGenreId: '6014',
});
const { items } = await client.dataset(run.defaultDatasetId).listItems();
console.log(items.filter((r) => r.type === 'chart').slice(0, 10));
```

You can also call it over plain HTTP: `POST https://api.apify.com/v2/acts/deanko~appstore-scraper/run-sync-get-dataset-items?token=<YOUR_APIFY_TOKEN>` with the input as the JSON body.

### FAQ

**How many App Store reviews can I get per app?**
Up to the 500 most recent reviews per app and country. That is Apple's own limit for its public reviews feed. To get more, add more countries; each storefront has its own reviews.

**Why did I get only about 10 reviews for an app?**
For some apps Apple's reviews feed is empty. The actor then returns the featured reviews from the public App Store page instead (marked `source: "storePage"`), which is usually around 10 per country.

**Can I scrape App Store reviews for several countries at once?**
Yes. Put all the codes in `countries`. Each review row has a `country` field.

**Do I need an App Store ID?**
No. Paste the full App Store URL, or use `searchTerms` to find apps by keyword.

**Can I export App Store reviews to CSV or Excel?**
Yes. Every dataset can be downloaded as CSV, Excel, JSON, XML or HTML from the run page or the API.

**Does it collect reviewer names?**
No. Reviewer names, nicknames and profile links are deliberately left out.

**Does it scrape Google Play?**
No, only the Apple App Store.

**How do I track ratings or rankings over time?**
Create a schedule (for example daily). Each run's rows have `scrapedAt`, so you can append them to one sheet or database and chart the trend.

**Which chart genre IDs are available?**
The input has a dropdown with the App Store categories (Business 6000, Games 6014, Finance 6015, Health & Fitness 6013, Productivity 6007, Shopping 6024 and more).

### Limitations

- Reviews: at most the 500 most recent per app and country (Apple's limit). Sorting is newest first; there is no filter by rating, keyword or date range.
- Feed-only fields (`appVersion`, `helpfulVotes`, `totalVotes`) are `null` for fallback reviews from the App Store page.
- Developer replies to reviews are not included.
- Top charts come from Apple's iPhone charts feed: up to 100 ranks, Top Free, Top Paid and Top Grossing only.
- Keyword search uses the iTunes Search API, so results can differ slightly from what the App Store app shows.
- Apple rate-limits search and lookup requests. The actor retries automatically, but very large keyword lists run slower.
- An app not sold in a storefront is skipped for that country, with a warning in the log.
- No Google Play, Mac App Store-only or Apple Arcade-specific data.

### Support and feedback

Found a bug, need a field, or want a feature? Open an issue in the **Issues** tab of this actor. Feedback is read and answered there.

### Legal

Data comes from Apple's publicly available App Store endpoints and pages. Reviewer names and profile links are not collected. You are responsible for using the data in line with Apple's terms and the laws that apply to you (for example GDPR when analysing review text).

# Actor input Schema

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

Apps to scrape, as numeric App Store IDs (310633997), 'id310633997', or full App Store URLs (https://apps.apple.com/us/app/whatsapp-messenger/id310633997). Each app gives one 'app' row per country plus its reviews. If App IDs, Search terms and Top charts are all empty, WhatsApp is used as a demo.

## `searchTerms` (type: `array`):

Optional. Find apps by keyword (iTunes Search API), e.g. 'habit tracker' or 'budget app'. The top results per term are scraped like App IDs (details + reviews). Handy for competitor research when you don't know the IDs.

## `searchResultsPerTerm` (type: `integer`):

How many top search results to scrape for each search term, per country. Default 5.

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

Two-letter App Store country codes (ISO 3166-1 alpha-2), e.g. us, gb, de, fr, jp, kr, br, in. Everything is fetched separately for each storefront, because ratings, prices, charts and reviews differ per country. Default: us.

## `includeAppDetails` (type: `boolean`):

Output one 'app' row per app and country: name, developer, bundle ID, price, average rating, rating count, 1-5 star histogram, current-version rating, version, release notes, genre, size, languages and more.

## `includeReviews` (type: `boolean`):

Output 'review' rows: rating, title, text, date, app version and vote counts where available. Sources: Apple's customer reviews RSS (up to 500 most recent per storefront) and, when the RSS returns nothing, the featured reviews shown on the public App Store product page (about 10 per app and country). Reviewer names are never collected.

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

Maximum reviews per app and country, newest first. Apple's reviews feed exposes at most the 500 most recent reviews per storefront; if the feed is empty the actor falls back to the ~10 featured reviews on the product page. Default 50.

## `charts` (type: `array`):

Optional. Also scrape these top charts (up to 100 ranked apps each) for every selected country. Each chart row has rank, app ID, name, bundle ID, developer, price and category.

## `chartGenreId` (type: `string`):

Limit top charts to one App Store category (e.g. Games, Finance, Health & Fitness). 'All apps' returns the overall charts. Only used when Top charts is set.

## `chartLimit` (type: `integer`):

How many ranked apps to return per chart (Apple returns at most 100).

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

Hard cap on rows in total (apps + reviews + chart entries) across all countries. You pay per row, so this is also your cost cap: 1,000 rows = $1. Default 1000.

## Actor input object example

```json
{
  "appIds": [
    "310633997"
  ],
  "searchTerms": [
    "habit tracker"
  ],
  "searchResultsPerTerm": 5,
  "countries": [
    "us"
  ],
  "includeAppDetails": true,
  "includeReviews": true,
  "maxReviewsPerApp": 20,
  "charts": [],
  "chartGenreId": "",
  "chartLimit": 100,
  "maxItems": 1000
}
```

# Actor output Schema

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

No description

# 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": [
        "310633997"
    ],
    "searchTerms": [],
    "countries": [
        "us"
    ],
    "maxReviewsPerApp": 20,
    "maxItems": 1000
};

// Run the Actor and wait for it to finish
const run = await client.actor("deanko/appstore-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": ["310633997"],
    "searchTerms": [],
    "countries": ["us"],
    "maxReviewsPerApp": 20,
    "maxItems": 1000,
}

# Run the Actor and wait for it to finish
run = client.actor("deanko/appstore-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": [
    "310633997"
  ],
  "searchTerms": [],
  "countries": [
    "us"
  ],
  "maxReviewsPerApp": 20,
  "maxItems": 1000
}' |
apify call deanko/appstore-scraper --silent --output-dataset

```

## MCP server setup

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