# App Store Scraper: Reviews, App Details, Search & Charts (`wulfcare/app-store-scraper`) Actor

Scrape Apple App Store reviews with no 500 cap (any country, newest/helpful/critical sort, star and date filters, developer replies), full app details with rating histogram, version history and App Privacy labels, search results, top charts, developer apps and similar apps.

- **URL**: https://apify.com/wulfcare/app-store-scraper.md
- **Developed by:** [Wulfcare Data](https://apify.com/wulfcare) (community)
- **Categories:** Developer tools, SEO tools
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

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

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 Scraper

Everything public on Apple's App Store, in one Actor:

- **Reviews**: every review of any app, **with no 500 cap**. You can go back to an app's very first review (WhatsApp in the US: 200,000+). Sort **newest first, most helpful, most favorable or most critical**, **filter by star rating**, stop at a date (only reviews since 2026-09-01, or the last 30 days), and cover **several countries in one run**. You get the stars, title, text, date, whether it was edited, **the developer's reply**, and **the app version the reviewer used** (for the newest 500).
- **App details**: rating and **1-5 star histogram**, price, in-app purchases, age rating and advisories, current version and **version history with release notes**, release and update dates, size, languages, devices, chart position, developer website, support and privacy policy links, screenshots, and the full **App Privacy labels** (data linked to you, data used to track you, and why).
- **Search**: the apps the App Store lists for any search term, up to 200.
- **Top charts**: top free, top paid and top grossing for **iPhone, iPad or Mac**, overall or for any of 45 categories and game genres.
- **Developer apps**: every app from a developer, by URL, id or exact name.
- **Similar apps**: the App Store's "You Might Also Like" list for an app.

Any of the **175 App Store countries**, and apps by **URL, numeric id or bundle id** (`com.spotify.client`). A missing app, a typo or an app that isn't sold in a country **never crashes the run**. You get a free row that says what went wrong, and the other apps carry on.

### What people use it for

- **App review monitoring**: run it daily with *Only reviews since: 1 day* and send the new 1-2 star reviews to Slack or a spreadsheet
- **Sentiment and feature research**: pull thousands of reviews of your app and your competitors' apps into an LLM or BI tool; the app version on recent reviews shows which release caused a spike
- **Complaint mining**: *Most critical* with 1-star only gets every complaint first, and the run stops as soon as it's past them
- **Competitor tracking**: ratings, prices, versions and release notes of a list of apps over time
- **Market research and ASO**: what ranks for a keyword, what tops a category chart in each country, what Apple shows next to your app
- **Privacy and compliance research**: App Privacy labels across a whole category

### How to use it

1. Pick **What to scrape**.
2. Add apps (App Store URLs, ids like `324684580`, or bundle ids like `com.spotify.client`), search terms, charts or developers.
3. Set the **countries** (default `us`). Add several to cover them all in one run.
4. Run it, then download JSON, CSV or Excel, or call the API.

Every run returns **one kind of row**, so the dataset always has the same columns. Every column is present on every row (`null` when the App Store has no value), and the columns don't change between runs.

### What you get

#### Reviews: one row per review

```json
{
  "appId": "324684580",
  "appTitle": "Spotify: Music and Podcasts",
  "reviewId": "14603418822",
  "score": 2,
  "title": "Keeps pausing",
  "text": "Since the last update the music stops whenever I lock my phone.",
  "date": "2026-09-28T13:39:43Z",
  "isEdited": false,
  "appVersion": "9.1.86",
  "replyText": "Hey! Sorry to hear that. Could you try a clean reinstall? ...",
  "replyDate": "2026-09-28T19:02:11Z",
  "userName": null,
  "appUrl": "https://apps.apple.com/us/app/id324684580",
  "country": "US",
  "language": null,
  "error": null
}
```

Reviewer **nicknames** are optional (off by default). No other reviewer data is collected.

#### App details: one row per app

```json
{
  "appId": "310633997",
  "bundleId": "net.whatsapp.WhatsApp",
  "url": "https://apps.apple.com/us/app/whatsapp-messenger/id310633997",
  "title": "WhatsApp Messenger",
  "subtitle": "Simple. Reliable. Private.",
  "description": "WhatsApp from Meta is a free messaging and calling app...",
  "score": 4.7,
  "ratings": 18682801,
  "histogram": { "1": 641260, "2": 253422, "3": 565731, "4": 1451543, "5": 15770845 },
  "free": true,
  "price": 0,
  "currency": "USD",
  "priceText": "Free",
  "inAppPurchases": true,
  "genre": "Social Networking",
  "genreId": "6005",
  "genres": [{ "name": "Social Networking", "id": "6005" }, { "name": "Utilities", "id": "6002" }],
  "contentRating": "12+",
  "contentAdvisories": ["Infrequent/Mild Horror/Fear Themes", "..."],
  "developer": "WhatsApp Inc.",
  "developerId": "310634000",
  "developerUrl": "https://apps.apple.com/us/developer/whatsapp-inc/id310634000",
  "developerWebsite": "http://www.whatsapp.com/",
  "supportUrl": "http://www.whatsapp.com/faq/",
  "privacyPolicy": "https://www.whatsapp.com/legal/#Privacy",
  "releasedAt": "2009-05-04",
  "updatedAt": "2026-09-28T15:54:35Z",
  "version": "26.38.74",
  "releaseNotes": "We update the app regularly to fix bugs, optimize performance and improve the experience.",
  "versionHistory": [{ "version": "26.38.74", "date": "2026-09-28T15:54:35Z", "notes": "..." }],
  "minimumOsVersion": "15.1",
  "sizeBytes": 385214464,
  "languages": ["English", "Arabic", "..."],
  "devices": ["iphone", "ipad", "mac", "watch", "..."],
  "chartRank": 2,
  "chartName": "Top free · Social Networking",
  "icon": "https://is1-ssl.mzstatic.com/image/thumb/.../512x512bb.png",
  "screenshots": ["https://is1-ssl.mzstatic.com/image/thumb/.../1290x2796bb.jpg"],
  "privacyLabels": [
    {
      "type": "Data Linked to You",
      "categories": [],
      "purposes": [
        { "purpose": "Third-Party Advertising", "categories": [{ "category": "Location", "types": ["Coarse Location"] }] }
      ]
    }
  ],
  "country": "US",
  "language": null
}
```

Paid apps have `free: false`, `price: 6.99` and `priceText: "$6.99"`. The price and currency follow the country (`6,99 €` in Germany).

#### Search, charts, developer and similar apps: one row per app

`input` (the search term, chart or developer), `rank`, `appId`, `bundleId`, `url`, `title`, `subtitle`, `developer`, `developerId`, `score`, `ratings`, `genre`, `free`, `price`, `currency`, `priceText`, `inAppPurchases`, `contentRating`, `releasedAt`, `description`, `icon`.

Turn on **Full details for every listed app** to get the complete App details row for every app in a search, chart, developer or similar list instead.

### Pricing

Pay per result. There's no start fee and no monthly rental, and **you're never charged for errors**: not-found apps, invalid inputs, empty searches and failed requests are free rows.

| Result | Price |
|---|---|
| Review | $0.10 per 1,000 |
| App details | $0.50 per 1,000 |
| App in a search, chart, developer or similar list | $0.20 per 1,000 |

Set **Max cost per run** in the run options to cap your spend. The run stops cleanly when it gets there, and you keep everything scraped so far.

### Examples

**Every 1- and 2-star review from the last 30 days**

```json
{ "mode": "reviews", "appIds": ["https://apps.apple.com/us/app/id324684580"], "maxReviewsPerApp": 0, "reviewStars": ["1", "2"], "reviewsSince": "30 days" }
```

**New reviews from every English-speaking store, for a daily schedule**

```json
{ "mode": "reviews", "appIds": ["com.yourcompany.app"], "countries": ["us", "gb", "ca", "au", "nz", "ie"], "maxReviewsPerApp": 0, "reviewsSince": "1 day" }
```

**Every review an app has ever had** (Bear: all 1,744 US reviews back to 2016, in under a minute)

```json
{ "mode": "reviews", "appIds": ["1016366447"], "maxReviewsPerApp": 0 }
```

**Top 100 grossing puzzle games in Japan, with full details**

```json
{ "mode": "charts", "chartCollections": ["topgrossing"], "chartGenres": ["7012"], "countries": ["jp"], "includeFullDetails": true }
```

**Every app from a developer**

```json
{ "mode": "developer", "developers": ["https://apps.apple.com/us/developer/supercell/id488106216"] }
```

### Good to know

- **Reviews belong to a country's store.** The US store has the reviews written in the US store, whatever their language. Add more countries to get more reviews.
- **Speed**: about **500-700 reviews a minute** (5,000 reviews in 7-10 minutes, 30,000-40,000 an hour). App details, search, charts and lists take seconds. Apple limits how fast one IP address can page through reviews, so the Actor paces itself just under that limit instead of getting blocked, and spreads requests over Apify Proxy too. Very large pulls (100,000+ reviews) run faster with residential proxy. The default run timeout is 5 hours; raise it for bigger pulls. Now and then Apple blocks a shared Apify IP for a while; if it stays blocked for 15 minutes, the app ends with a free error row saying how many reviews were saved, and you only pay for those.
- **App version on reviews**: Apple only publishes it for the newest (and most helpful) 500 reviews of each app per country. Older reviews have `appVersion: null`.
- **Charts go to 100**, Apple's own limit. **Search goes to 200.**
- **Apps not sold in a country** show up as "App not found in the XX App Store". Run again with a country where it's sold.
- **Everything comes from the public App Store website**, as a logged-out visitor sees it. No Apple account is used.

### Other Actors by Wulfcare Data

- [Google Hotels Prices Scraper](https://apify.com/wulfcare/google-hotels-scraper): every booking site's price for any hotel and dates, and hotel searches
- [Free YouTube Scraper](https://apify.com/wulfcare/youtube-scraper): YouTube videos, Shorts, channels and searches with views, likes, comments and channel stats, free
- [Google Play Scraper](https://apify.com/wulfcare/google-play-scraper): the same for Google Play (reviews, app details, data safety, charts)
- [Google Trends Scraper](https://apify.com/wulfcare/google-trends-scraper): interest over time, rising queries and Trending Now
- [Google Jobs Scraper](https://apify.com/wulfcare/google-jobs-scraper): job listings from Google Jobs
- [YouTube Transcript Scraper](https://apify.com/wulfcare/youtube-transcript-scraper): transcripts of videos, whole channels, playlists and searches as text, timestamped segments or SRT

Found a problem or need a field? Open an issue on the Issues tab.

# Actor input Schema

## `mode` (type: `string`):

Each run returns one kind of row, so your dataset always has the same columns. Reviews, App details and Similar apps use the app list below; the other modes use their own section.

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

App Store URLs (https://apps.apple.com/us/app/.../id324684580), numeric app ids (324684580) or bundle ids (com.spotify.client). Used by Reviews, App details and Similar apps.

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

Two-letter App Store country codes (us, gb, de, jp, br, ...). Each country is its own store with its own reviews, prices, charts and search results; add several to cover them all in one run. Every row says which country it came from.

## `language` (type: `string`):

Optional, e.g. en-US, de-DE, fr-FR. App names and descriptions come in this language when the developer provides it. Leave empty for each country's default language. Reviews are always the ones written in that country's store, whatever their language.

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

0 = every review the App Store has for the app in each country (no 500 cap). With a star filter, this counts only reviews with those stars.

## `reviewsSort` (type: `string`):

Newest first is best for monitoring and date cutoffs. Most critical is the fastest way to get complaints.

## `reviewStars` (type: `array`):

Leave empty for all ratings. You're only charged for reviews with these stars. Tip: with Most critical (or Most favorable) the run stops as soon as it's past the stars you picked.

## `reviewsSince` (type: `string`):

Skip reviews older than this, e.g. 2026-09-01 or "30 days". With Newest first the run stops as soon as it reaches older reviews.

## `includeReviewerNames` (type: `boolean`):

Off by default. The App Store shows a nickname for each reviewer; no other reviewer data is collected.

## `searchQueries` (type: `array`):

One search per line, e.g. "habit tracker". Up to 200 apps per term and country.

## `chartCollections` (type: `array`):

Which top charts to fetch (up to 100 apps each, Apple's limit).

## `chartDevice` (type: `string`):

iPhone, iPad or Mac App Store charts.

## `chartGenres` (type: `array`):

One chart per category (and per chart and country). iPhone and iPad only; Mac charts are overall.

## `developers` (type: `array`):

Developer page URLs (https://apps.apple.com/us/developer/supercell/id488106216), numeric developer ids, or exact developer names as shown on the App Store.

## `maxResults` (type: `integer`):

0 = everything the App Store lists (search up to 200, charts up to 100).

## `includeFullDetails` (type: `boolean`):

Search, charts, developer and similar modes return an app card by default. Turn this on to get the full App details row (ratings histogram, version history, privacy labels, ...) for each app, charged as an app detail.

## `includePrivacyLabels` (type: `boolean`):

The app's privacy "nutrition label": data linked to you, data used to track you, and why. Free, it comes with the same request.

## `includeVersionHistory` (type: `boolean`):

Recent versions with their dates and release notes.

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

The App Store limits how fast one IP can page through reviews, so requests are spread over the run's own IP and Apify Proxy IPs. Datacenter proxy is plenty.

## `maxConcurrency` (type: `integer`):

How many IPs requests are spread over (the run's own IP plus proxy sessions). More is faster for very large review pulls.

## Actor input object example

```json
{
  "mode": "reviews",
  "appIds": [
    "https://apps.apple.com/us/app/spotify-music-and-podcasts/id324684580"
  ],
  "countries": [
    "us"
  ],
  "maxReviewsPerApp": 100,
  "reviewsSort": "newest",
  "includeReviewerNames": false,
  "chartCollections": [
    "topfree"
  ],
  "chartDevice": "iphone",
  "chartGenres": [
    "all"
  ],
  "maxResults": 0,
  "includeFullDetails": false,
  "includePrivacyLabels": true,
  "includeVersionHistory": true,
  "proxyConfiguration": {
    "useApifyProxy": true
  },
  "maxConcurrency": 6
}
```

# 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": [
        "https://apps.apple.com/us/app/spotify-music-and-podcasts/id324684580"
    ],
    "countries": [
        "us"
    ],
    "maxReviewsPerApp": 100,
    "proxyConfiguration": {
        "useApifyProxy": true
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("wulfcare/app-store-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": ["https://apps.apple.com/us/app/spotify-music-and-podcasts/id324684580"],
    "countries": ["us"],
    "maxReviewsPerApp": 100,
    "proxyConfiguration": { "useApifyProxy": True },
}

# Run the Actor and wait for it to finish
run = client.actor("wulfcare/app-store-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": [
    "https://apps.apple.com/us/app/spotify-music-and-podcasts/id324684580"
  ],
  "countries": [
    "us"
  ],
  "maxReviewsPerApp": 100,
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}' |
apify call wulfcare/app-store-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,wulfcare/app-store-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/4BsSOAdZj4JR5gYpj/builds/b1l98mCypQYoKh4dR/openapi.json
