# App Store Reviews Scraper: Apple Ratings, Replies, App Details (`fernandosord/app-store-reviews-scraper`) Actor

Scrape Apple App Store reviews by app link, ID or search term, in many countries at once: rating, title, text, author, date, app version and the developer's reply, with app name, developer, rating and price on every row. Thousands of reviews per country, star and date filters. No login.

- **URL**: https://apify.com/fernandosord/app-store-reviews-scraper.md
- **Developed by:** [Plainsource](https://apify.com/fernandosord) (community)
- **Categories:** Marketing, Business
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $0.30 / 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

This App Store reviews scraper downloads the reviews of any iPhone or iPad app from Apple's App Store: star rating, title, review text, author, date, the app version the review was written for, and the developer's reply. Every row also carries the app's name, developer, average rating, rating count, current version, price and category for that country. Give it App Store links, numeric app IDs, bundle IDs or search terms, and as many countries as you like. No Apple ID, cookie or API key needed.

- **Paste any kind of app reference.** `https://apps.apple.com/us/app/duolingo-language-lessons/id570060128`, `570060128`, `com.duolingo.DuolingoMobile` or simply `duolingo` all work. A search term is replaced by the top result.
- **Many countries in one run.** Each country's App Store has its own reviews. List `us`, `gb`, `de`, `jp` and the Actor scrapes every app in each of them.
- **More than 500 reviews per country.** Apple's public RSS feed stops at 500. This Actor reads the same endpoint the App Store website uses, which goes thousands of reviews deep, and uses the RSS feed to add app versions and helpful votes.
- **Developer replies included**, with the date of the reply.

The companion Actor for Android apps is the [Google Play Reviews Scraper](https://apify.com/fernandosord/google-play-reviews-scraper), with the same kind of output for Google Play.

### What data you get

| Field | What it holds |
|---|---|
| `reviewId`, `rating`, `title`, `text` | The review: ID, stars (1 to 5), title and text |
| `author`, `date`, `isEdited` | Reviewer's nickname, when the review was posted or last edited, and whether it was edited |
| `version` | App version the review was written for (newest or most helpful 500 reviews per country, see FAQ) |
| `helpfulVotes`, `voteCount` | How many people found the review helpful, out of how many votes (same 500 review limit) |
| `developerReply`, `developerReplyDate` | The developer's reply and when it was last changed |
| `appId`, `appName`, `developer`, `bundleId`, `appUrl` | The app |
| `country` | Which country's App Store the review is from |
| `appRating`, `appRatingCount` | Average rating and number of ratings in that country |
| `appCurrentVersion`, `appUpdatedAt`, `appReleaseDate` | Current version, when it came out, and the app's first release |
| `appPrice`, `appFormattedPrice`, `appCurrency`, `appGenre`, `appContentRating`, `appIcon` | Price, category, age rating and icon |
| `reviewSource`, `source` | Which Apple endpoint the review came from, and which input it belongs to |

### How to use it

1. Add one or more apps: links, IDs, bundle IDs or search terms.
2. Add the **Countries** you want (two-letter codes, `us` by default).
3. Set **Max reviews per app per country** and pick a sort order: most recent, most helpful, most favorable or most critical.
4. Optional: set **Min stars** and **Max stars**, or **Only reviews newer than**.
5. Run it and export to JSON, CSV or Excel, or call it from the API, Make, Zapier, n8n or an AI agent through the Apify MCP server.

A run with 100 reviews of one app in one country takes about 6 seconds.

#### Example input

```json
{
  "apps": ["https://apps.apple.com/us/app/duolingo-language-lessons/id570060128", "nebula horoscope"],
  "countries": ["us", "gb"],
  "maxReviewsPerCountry": 500,
  "sort": "mostRecent",
  "reviewsNewerThan": "30 days"
}
```

#### Example output (one review from a real run)

```json
{
  "appId": "1459969523",
  "appName": "Nebula: Spiritual Guidance",
  "developer": "Spiritual Nebula Limited",
  "bundleId": "com.genesismedia.Nebula.Horoscope",
  "country": "us",
  "appUrl": "https://apps.apple.com/us/app/nebula-spiritual-guidance/id1459969523",
  "appRating": 4.574,
  "appRatingCount": 170898,
  "appCurrentVersion": "6.64.1",
  "appPrice": 0,
  "appFormattedPrice": "Free",
  "appCurrency": "USD",
  "appGenre": "Lifestyle",
  "appContentRating": "17+",
  "appReleaseDate": "2019-04-28T20:35:01Z",
  "appUpdatedAt": "2026-10-28T09:03:07Z",
  "reviewId": "14718043402",
  "rating": 5,
  "title": "Pure awesomeness",
  "text": "This app because it provides you with everything you need to know about your zodiac… in drastic details",
  "author": "Andhernameispri",
  "date": "2026-10-27T15:02:27Z",
  "isEdited": false,
  "version": "6.64.0",
  "helpfulVotes": 0,
  "voteCount": 0,
  "developerReply": "Your review made our day 💜 It’s lovely to know the app felt rich and helpful. With gratitude, Nebula Team 🔮",
  "developerReplyDate": "2026-10-28T21:21:37Z",
  "reviewSource": "web",
  "source": "nebula horoscope",
  "scrapedAt": "2026-10-30T02:52:06.147Z"
}
```

### How much does it cost?

You pay per review saved. Each review costs $0.0003, plus $0.0005 once per run. The app details on every row are included at no extra cost. 1,000 reviews cost about $0.30, and Apify's free plan credit of $5 a month covers about 16,000 reviews.

Inputs that fail (a wrong ID, an app that is not sold in one of your countries, a link that is not an App Store link) cost nothing. They are listed with the reason in the `SUMMARY` record of the run's key-value store, next to how many reviews each app and country gave and why it stopped.

### Use cases

- **Product feedback:** pull every 1 and 2 star review since your last release and group the complaints by app version.
- **Country comparison:** see how the same app is rated in the US, the UK, Germany and Japan, in each market's own words.
- **Competitor research:** compare what users praise and hate in the top apps of your category.
- **Support monitoring:** run it daily with **Only reviews newer than** set to `3 days` and check which reviews have no developer reply.
- **Sentiment and AI datasets:** feed review titles and text with ratings into a classifier, a dashboard or an LLM summary.

### FAQ

**How many reviews can I get per country?**
For big apps, thousands. The Actor pages through the endpoint the App Store website uses, 20 reviews at a time. Apple limits how much one IP address may read. In our tests on Apify without a proxy, one run started getting "Too Many Requests" after about 5,000 reviews, while another read 6,000 with no trouble. When Apple keeps refusing, the Actor takes the rest from Apple's RSS feed, which stops at 500 reviews per app and country, and `SUMMARY` says so. If you need more than about 5,000 reviews in one run, turn on Apify Proxy in the input so the requests are spread over more addresses. It is slower: our proxy test scanned several thousand reviews per country in 3 countries in about 17 minutes, and never had to fall back.

**Why is `version` empty on some reviews?**
Apple only gives the app version (and helpful votes) in its RSS feed, which covers the 500 newest or 500 most helpful reviews per country. Reviews further back, or with the favorable and critical sort orders, have `version: null`.

**Why are the newest reviews a day or more old?**
Apple takes a while to publish new reviews, on its website and in its feed alike. In our tests the newest review of large apps in the US store was about a day and a half old.

**What does "most helpful" mean?**
It is Apple's default order on the App Store page. Apple does not say how it is computed. It is not the same as sorting by `helpfulVotes`.

**Does the search term pick the right app?**
It takes the top result of Apple's search in the first country you list. Check `appName` in the output, or use the app ID or link to be sure. Raise **Search results per term** to get the top few matches.

**Do I need an Apple ID?**
No. The Actor only reads what the App Store shows to anyone.

**Is this legal?**
It only reads reviews that are shown publicly on the App Store. You are responsible for how you use the data, especially reviewer nicknames, under laws like GDPR.

### Other Actors by this developer

- [Google Play Reviews Scraper](https://apify.com/fernandosord/google-play-reviews-scraper): the companion Actor for Android app reviews with developer replies.
- [Google Trends Scraper](https://apify.com/fernandosord/google-trends-reliable): interest over time, by region and related searches for any keyword, such as your app's name.
- [Google News Scraper](https://apify.com/fernandosord/google-news-rss-scraper): news articles about an app or company from Google News.
- [Google Sheets Export](https://apify.com/fernandosord/google-sheets-export): send the reviews of any run straight to a Google Sheet.
- [Website Change Monitor](https://apify.com/fernandosord/website-change-monitor): get told when a competitor's pricing or changelog page changes.

# Actor input Schema

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

Any mix of: an App Store link (https://apps.apple.com/us/app/duolingo-language-lessons/id570060128), a numeric app ID (570060128), a bundle ID (com.duolingo.DuolingoMobile) or a search term (duolingo). A search term is replaced by the top search result in the first country, or by the top few if you raise Search results per term.

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

Two-letter App Store country codes (us, gb, de, jp, br). Every app is scraped in every country listed, because each country's store has its own reviews.

## `maxReviewsPerCountry` (type: `integer`):

The Actor stops at this number for each app in each country. Big apps have tens of thousands of written reviews per country.

## `sort` (type: `string`):

Most recent, Most helpful (Apple's default order), Most favorable or Most critical. The date cut-off stops the run early only with Most recent.

## `minStars` (type: `integer`):

Optional. Only keep reviews with at least this many stars (1 to 5).

## `maxStars` (type: `integer`):

Optional. Only keep reviews with at most this many stars (1 to 5). Set min and max to 1 for one-star reviews only.

## `reviewsNewerThan` (type: `string`):

Optional. A date (2026-01-31) or a relative period (7 days, 3 months). Older reviews are skipped.

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

For search terms only: how many of the top search results to scrape. 1 takes the best match.

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

Optional. Apple's endpoints work without a proxy for up to about 5,000 reviews per run. Above that Apple starts refusing one IP address and the Actor falls back to the RSS feed (500 reviews per app and country). Turn on Apify Proxy for bigger runs. It is slower but spreads the requests.

## Actor input object example

```json
{
  "apps": [
    "https://apps.apple.com/us/app/duolingo-language-lessons/id570060128"
  ],
  "countries": [
    "us"
  ],
  "maxReviewsPerCountry": 100,
  "sort": "mostRecent",
  "searchResultsPerTerm": 1,
  "proxyConfiguration": {
    "useApifyProxy": false
  }
}
```

# Actor output Schema

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

One item per review, with the app's details for that country attached.

# 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": [
        "https://apps.apple.com/us/app/duolingo-language-lessons/id570060128"
    ],
    "countries": [
        "us"
    ],
    "maxReviewsPerCountry": 100,
    "proxyConfiguration": {
        "useApifyProxy": false
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("fernandosord/app-store-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": ["https://apps.apple.com/us/app/duolingo-language-lessons/id570060128"],
    "countries": ["us"],
    "maxReviewsPerCountry": 100,
    "proxyConfiguration": { "useApifyProxy": False },
}

# Run the Actor and wait for it to finish
run = client.actor("fernandosord/app-store-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": [
    "https://apps.apple.com/us/app/duolingo-language-lessons/id570060128"
  ],
  "countries": [
    "us"
  ],
  "maxReviewsPerCountry": 100,
  "proxyConfiguration": {
    "useApifyProxy": false
  }
}' |
apify call fernandosord/app-store-reviews-scraper --silent --output-dataset

```

## MCP server setup

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