# Apple App Store Scraper: apps, ratings and reviews (`angadseth/app-store-scraper`) Actor

Get Apple App Store apps, ratings and customer reviews from many countries in one run: search apps, app details by ID, URL or bundle ID, reviews with rating and date filters, all apps of a developer, and top free, paid and grossing charts.

- **URL**: https://apify.com/angadseth/app-store-scraper.md
- **Developed by:** [Angad Jangir](https://apify.com/angadseth) (community)
- **Categories:** Marketing, Developer tools
- **Security:** Limited permissions
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

$0.20 / 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

## Apple App Store Scraper: apps, ratings and reviews

Get **Apple App Store apps, ratings, customer reviews, developer catalogues and top charts** as clean JSON, CSV or Excel, from **many countries in one run**. One Actor does all five jobs: search apps, app details, reviews, all apps of a developer, and top free, paid and grossing charts.

The Actor reads only Apple's own official public endpoints (the iTunes Search and Lookup APIs and the App Store RSS feeds). It needs no login, no API key and no browser, so runs are fast and cheap: 20 reviews take about 4 seconds, a full top-100 chart with complete app details about 5 seconds.

### Who uses it

- **ASO and app marketing teams** tracking ratings, rank, categories, prices and release notes of their app and competitors in every storefront.
- **Product teams** reading what users complain about after each release. Filter by star rating and date to get only the new 1 and 2-star reviews.
- **Market researchers and investors** who want the top grossing games in India or every finance app that matches "budget" in ten countries.
- **AI agents and data teams** doing sentiment analysis, topic clustering or LLM summaries of reviews. The Actor can be called as a tool through the Apify MCP server.

### Modes

| Mode | You give | You get |
|---|---|---|
| **Search apps** | search terms, e.g. `budget tracker` | up to 200 apps per term per country, with their search position |
| **App details** | app IDs, App Store links or bundle IDs | full details of each app in each country |
| **Reviews** | app IDs, App Store links or bundle IDs | customer reviews, filtered by stars and date |
| **Developer apps** | developer IDs or developer links (an app ID works too) | every app of that developer |
| **Top charts** | chart (top free, top paid, top grossing, new free, new paid), iPhone or iPad, optional category | up to 100 ranked apps per country, with full details |

Turn on **Also get reviews for each app** in any app mode to save each app's reviews right after it, for example the top 20 grossing games plus their latest reviews in one run.

Every record has `recordType` set to `app` or `review`, so mixed runs stay easy to filter.

### Example inputs

Latest reviews of WhatsApp in the US, UK and India:

```json
{ "mode": "reviews", "apps": ["310633997"], "countries": ["us", "gb", "in"], "maxItems": 1500 }
```

Only 1 and 2-star reviews since 1 October, for an app given by link and another by bundle ID:

```json
{
  "mode": "reviews",
  "apps": ["https://apps.apple.com/us/app/spotify-music-and-podcasts/id324684580", "net.whatsapp.WhatsApp"],
  "countries": ["us"],
  "minRating": 1,
  "maxRating": 2,
  "reviewsSince": "2026-10-01"
}
```

As many reviews as Apple gives (newest and most helpful lists merged, about 1,000 per app per country):

```json
{ "mode": "reviews", "apps": ["324684580"], "countries": ["us"], "reviewsSort": "both", "maxReviewsPerApp": 1000, "maxItems": 1000 }
```

Search two terms in two countries:

```json
{ "mode": "searchApps", "searchTerms": ["budget tracker", "expense tracker"], "countries": ["us", "gb"], "maxItems": 400 }
```

App details in English for the Japanese store:

```json
{ "mode": "appDetails", "apps": ["310633997", "com.spotify.client"], "countries": ["jp"], "language": "en_us" }
```

All apps of Google:

```json
{ "mode": "developerApps", "developers": ["https://apps.apple.com/us/developer/google-llc/id281956209"], "countries": ["us"] }
```

Top grossing games in the US and India:

```json
{ "mode": "topCharts", "chartType": "grossing", "genre": "6014", "countries": ["us", "in"], "maxItems": 200 }
```

Top 10 paid iPad apps in Germany, with 20 reviews each:

```json
{ "mode": "topCharts", "chartType": "paid", "chartDevice": "ipad", "countries": ["de"], "includeReviews": true, "maxReviewsPerApp": 20, "maxItems": 210 }
```

### Output examples

An app record (description shortened, from a real run):

```json
{
  "recordType": "app",
  "appId": 310633997,
  "bundleId": "net.whatsapp.WhatsApp",
  "name": "WhatsApp Messenger",
  "developer": "WhatsApp Inc.",
  "developerId": 310634000,
  "price": 0,
  "currency": "INR",
  "isFree": true,
  "rating": 4.61,
  "ratingCount": 8289459,
  "currentVersionRating": 4.61,
  "version": "26.43.75",
  "releaseDate": "2009-05-04T02:43:49Z",
  "currentVersionReleaseDate": "2026-11-02T16:48:57Z",
  "genres": ["Social Networking", "Utilities"],
  "primaryGenre": "Social Networking",
  "contentRating": "12+",
  "sizeBytes": 416272384,
  "minimumOsVersion": "15.1",
  "languages": ["AR", "BN", "CA", "HR", "CS", "DA", "NL", "EN", "..."],
  "description": "Bring your group together on WhatsApp...",
  "releaseNotes": "We update the app regularly to fix bugs, optimize performance and improve the experience.",
  "url": "https://apps.apple.com/in/app/whatsapp-messenger/id310633997",
  "iconUrl": "https://is1-ssl.mzstatic.com/image/thumb/.../512x512bb.jpg",
  "screenshotUrls": ["https://is1-ssl.mzstatic.com/image/thumb/.../320x480bb.jpg"],
  "country": "in",
  "chart": null,
  "chartRank": null,
  "searchTerm": null,
  "searchRank": null
}
```

App records also include `sellerName`, `formattedPrice`, `currentVersionRatingCount`, `genreIds`, `primaryGenreId`, `advisories`, `features`, `supportedDeviceCount`, `isGameCenterEnabled`, `developerUrl`, `developerWebsite`, `ipadScreenshotUrls` and `scrapedAt`. In Top charts mode `chart` and `chartRank` are filled (for example `"Top grossing iPhone - Games"`, `1`); in Search apps mode `searchTerm` and `searchRank` are.

A review record:

```json
{
  "recordType": "review",
  "reviewId": "14746487405",
  "appId": 310633997,
  "appName": "WhatsApp",
  "country": "us",
  "rating": 1,
  "title": "Improve. Call quality",
  "text": "It's terrible on older iPhones",
  "author": "Marif1952",
  "authorId": "1905666770",
  "version": "26.43.75",
  "voteCount": 0,
  "voteSum": 0,
  "updatedAt": "2026-11-03T16:02:51.000Z",
  "url": "https://apps.apple.com/us/app/id310633997?see-all=reviews",
  "scrapedAt": "2026-11-05T14:55:06.383Z"
}
```

The dataset has two ready views, **Apps** and **Reviews**. A run summary (counts per country and any warnings, such as an app that is not sold in one country) is saved as `SUMMARY` in the key-value store.

### Pricing

You pay per record saved to the dataset (each app or review is one record). Reviews dropped by your star or date filters are free. **Max results** is a hard cap, so you always know the most a run can cost. With several countries or search terms the cap is shared fairly, so the first country cannot use it all.

### Limits

- **Reviews:** Apple's feed gives up to **500 most recent** reviews per app per country (10 pages of 50), and a separate list of up to 500 **most helpful** ones. Choose review order "Both" to merge them for about 1,000 per app per country. For more reviews, add more countries: each storefront has its own reviews.
- Apple's feed has only reviews with text. Star-only ratings are counted in `ratingCount` but have no review record.
- **Search:** at most 200 apps per term per country (Apple's limit). Use more specific terms for more coverage.
- **Charts:** up to 100 apps per chart per country. New free and New paid charts exist for iPhone only.
- **Developer apps:** up to 200 apps per developer per country.
- Apple sometimes reports the same number for total and current-version ratings. The Actor returns what Apple returns.

### FAQ

**Is this allowed?** The Actor uses only Apple's official public endpoints (iTunes Search API, Lookup API and the App Store RSS feeds) that Apple offers for anyone to use, at a polite pace with automatic back-off. It does not log in, use keys or get around any protection. You are responsible for how you use the data, including reviewers' names.

**Which countries work?** Any App Store storefront, by its two-letter code: us, gb, in, de, fr, jp, br, ca, au, kr and so on.

**How do I find an app ID?** It is the number after `id` in the App Store link, e.g. `310633997` in `https://apps.apple.com/us/app/whatsapp-messenger/id310633997`. You can also paste the whole link or the bundle ID.

**Can I get reviews in one language?** Reviews come in the language the user wrote them in, and a storefront's reviews are mostly in its local language. The **Language** setting changes app names, descriptions and categories, e.g. `en_us` in the Japanese store.

**Can I track new reviews daily?** Yes. Save the input as a Task with `reviewsSince` set, add a Schedule, and with "Most recent" order the Actor stops reading as soon as it reaches older reviews, so daily runs are quick and cheap.

### Integrations

Send results to Google Sheets, Slack, email, Zapier, Make, n8n, Airbyte or a webhook with Apify integrations, or read them from the Apify API in JSON, CSV, Excel, XML or HTML. AI agents can call the Actor through the Apify MCP server.

**Something broke or a field is missing?** Open an issue on the Actor's Issues tab and it will be fixed quickly.

### More Actors by angadseth

- [GeM Tenders Scraper (India Government e-Marketplace Bids)](https://apify.com/angadseth/gem-tenders-scraper): Get live GeM bids and reverse auctions from India's Government e-Marketplace
- [India eProcurement Tenders Scraper (CPPP + 30 State Portals)](https://apify.com/angadseth/india-eprocurement-tenders): Live government tenders from India's central eProcure (CPPP), central PSU, defence and 30+ state NIC eProcurement portals in one run.
- [ATS Jobs Feed: Greenhouse, Lever, Ashby, Workday + 5 more](https://apify.com/angadseth/ats-jobs-feed): Get every open job from a company's own careers board
- [Bluesky Scraper: Posts, Profiles, Followers and Feeds](https://apify.com/angadseth/bluesky-scraper): Scrape Bluesky without a login
- [Website Contact Enricher: Emails, Phones, Socials per Domain](https://apify.com/angadseth/website-contact-enricher): One clean lead row per company domain
- [Website Screenshot & PDF: full page, mobile, element, WebP](https://apify.com/angadseth/website-screenshot): Screenshots (PNG, JPEG, WebP) and PDFs of any list of URLs.
- [Remote Jobs Aggregator: RemoteOK, Jobicy, Arbeitnow + 2 more](https://apify.com/angadseth/remote-jobs-aggregator): Remote jobs from RemoteOK, Jobicy, Arbeitnow, Working Nomads and 4 Day Week in one clean feed.
- [PDF & Document Text Extractor: PDF, DOCX, PPTX, XLSX to Text](https://apify.com/angadseth/pdf-text-extractor): Turn public document URLs (PDF, DOCX, PPTX, XLSX, CSV, HTML, TXT) into clean text

# Actor input Schema

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

Search apps = apps matching your search terms. App details = full details for the apps you list. Reviews = customer reviews of the apps you list. Developer apps = every app of the developers you list. Top charts = Apple's top free, paid or grossing charts.

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

Words to search the App Store for, e.g. "budget tracker", "meditation", "food delivery". Each term is searched in each country. Apple returns at most 200 apps per term per country.

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

Apps to look up or get reviews for. Use the numeric App Store ID (310633997), the App Store link (https://apps.apple.com/us/app/whatsapp-messenger/id310633997) or the bundle ID (net.whatsapp.WhatsApp). One per line.

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

Developers whose apps you want. Use the numeric developer ID (310634000) or the developer link (https://apps.apple.com/us/developer/whatsapp-inc/id310634000). An app ID also works: the Actor then lists all apps of that app's developer.

## `chartType` (type: `string`):

Which Apple top chart to read. Each chart has up to 100 apps per country.

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

iPhone or iPad charts. New free and New paid exist for iPhone only.

## `genre` (type: `string`):

Limit the chart to one App Store category. All = the overall chart.

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

For Search apps, App details, Developer apps and Top charts: after each app record, also save its customer reviews (using the review settings below). Reviews mode always saves reviews.

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

Two-letter App Store country codes, e.g. us, gb, in, de, jp, br. Every country is a separate storefront with its own prices, ratings, charts and reviews, so add more countries to get more reviews.

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

Optional. Language for app names, descriptions and categories, e.g. en_us or ja_jp. Leave empty for the country's default language. Reviews always come in the language the user wrote them in.

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

Stop after this many records in total (apps plus reviews). You pay per record saved.

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

Apple's feed gives up to 500 recent reviews (or 500 most helpful) per app per country. With sort order "Both" you can get up to about 1,000.

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

Most recent = newest reviews first. Most helpful = reviews with the most helpful votes. Both = read both lists and merge them without duplicates, for more reviews per country.

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

Keep only reviews with at least this many stars (1 to 5).

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

Keep only reviews with at most this many stars (1 to 5). Set to 2 to collect complaints only.

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

Optional. YYYY-MM-DD. Keep only reviews written or updated on or after this date. With "Most recent" order the Actor stops reading early once reviews get older.

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

Not needed: Apple's public endpoints work without a proxy. Set one only if you run very large jobs and Apple starts slowing you down.

## Actor input object example

```json
{
  "mode": "reviews",
  "apps": [
    "310633997"
  ],
  "chartType": "free",
  "chartDevice": "iphone",
  "genre": "all",
  "includeReviews": false,
  "countries": [
    "us"
  ],
  "maxItems": 20,
  "maxReviewsPerApp": 500,
  "reviewsSort": "mostRecent",
  "minRating": 1,
  "maxRating": 5,
  "proxyConfiguration": {
    "useApifyProxy": false
  }
}
```

# Actor output Schema

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

All app and review records found in this run, as a dataset you can download in JSON, CSV or Excel. Use the recordType field (app or review) to tell them apart.

## `summary` (type: `string`):

Counts of apps and reviews per country and any warnings from this run.

# 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 = {
    "mode": "reviews",
    "apps": [
        "310633997"
    ],
    "countries": [
        "us"
    ],
    "maxItems": 20
};

// Run the Actor and wait for it to finish
const run = await client.actor("angadseth/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 = {
    "mode": "reviews",
    "apps": ["310633997"],
    "countries": ["us"],
    "maxItems": 20,
}

# Run the Actor and wait for it to finish
run = client.actor("angadseth/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 '{
  "mode": "reviews",
  "apps": [
    "310633997"
  ],
  "countries": [
    "us"
  ],
  "maxItems": 20
}' |
apify call angadseth/app-store-scraper --silent --output-dataset

```

## MCP server setup

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