# App Store Reviews Scraper — Ratings, Versions & Countries (`tidyfeed/app-store-reviews-scraper`) Actor

Apple App Store reviews for any app in any country's store, newest or most helpful first: rating, title, text, version, author, date, one row per review. Or one summary row per app and country: Apple's rating and count, recent star split, review velocity, current version. No login, no proxies.

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

## Pricing

from $0.70 / 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.
Since this Actor supports Apify Store discounts, the price gets lower the higher subscription plan you have.

Learn more: https://docs.apify.com/actors/running/actors-in-store.md#pay-per-event

## What's an Apify Actor?

Actors are web data automations that power AI and operations. They run on the Apify platform to scrape websites, process data, connect APIs, and automate workflows.
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.
Actors are written with capital "A".

## 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.
The best way to integrate Actors is as follows.

- **AI agents and MCP clients** — the [Apify MCP server](https://docs.apify.com/integrations/mcp.md) at `https://mcp.apify.com` (remote, streamable HTTP, OAuth on first use).
- **Agentic workflows and local Actor development** — [Agent Skills](https://apify.com/.well-known/agent-skills/index.json) with the [Apify CLI](https://docs.apify.com/cli/docs.md): `npm install -g apify-cli`, then `apify login`.
- **JavaScript/TypeScript projects** — the official [JS/TS client](https://docs.apify.com/api/client/js/docs.md): `npm install apify-client`.
- **Python projects** — the official [Python client](https://docs.apify.com/api/client/python/docs.md): `pip install apify-client`.
- **Any other language** — the [REST API](https://docs.apify.com/api/v2.md).

For usage examples, see the [API](#api) section below.

For more details, see Apify documentation as [Markdown index](https://docs.apify.com/llms.txt) and [Markdown full-text](https://docs.apify.com/llms-full.txt).

# README

## App Store Reviews Scraper — Ratings, Versions & Countries

**What are people saying about this app right now, in this country?**

Every review Apple serves for an app, newest first or most helpful first, one row per review: stars, title, text, the version it was written against, author and date. Read the same app from several countries' stores in one run. Or flip the switch and get one summary row per app and country — Apple's own average rating and rating count, the version on sale, how the recent reviews split across one to five stars and how fast they are coming in.

No API key. No login. No proxies.

***

### Two modes

**Reviews — one row per review.** The default. Give it an app link or ID and a list of countries, and get the reviews as a table you can filter by stars, version or date.

**Summary — one row per app and country.** Give it twenty apps — yours, your competitors' — and get twenty rows you can sort: Apple rating and count, average of the recent reviews, the one-to-five star split, reviews per day, days since the last update.

***

### What you get

#### Reviews mode

**The review** — `rating` (1–5), `title`, `body`, `version` (the app version the reviewer had), `author`, `helpfulVotes` and `helpfulVoteCount`, `reviewId`

**When** — `reviewedAt`, `daysSinceReview`

**Which app, which store** — `appId`, `appName`, `developer`, `country`, `appUrl`

#### Summary mode

**Apple's figures** — `averageRating` and `ratingCount` as shown on the store page (all ratings, not only written reviews), `currentVersion`, `currentVersionReleaseDate`, `daysSinceUpdate`, `firstReleaseDate`, `price`, `currency`, `genre`, `contentRating`, `minimumOsVersion`, `sizeMB`, `bundleId`, `releaseNotes`

**Computed from the newest reviews** — `reviewsRead`, `recentAverageRating`, `stars5` … `stars1`, `reviewsLast30d`, `reviewsPerDay30d`, `latestReviewAt`, `oldestReviewReadAt`

**How complete** — `status` says whether the figures cover the window you care about (see Honest limits)

***

### Typical uses

- **Watch your own app after a release.** Reviews mode, `daysBack: 7`, on a schedule. Filter to the new version number and read what changed.
- **Compare the competition.** Summary mode on the apps in your category: who is rated best, who is slipping in the recent reviews, who ships updates and who has gone quiet.
- **See the same app through different markets.** `countries: ["us", "gb", "de", "jp", "kr"]` — the star split and the complaints differ by store more often than teams expect.
- **Feed support and product.** Sort the low-star rows by `helpfulVotes` and you have the complaints other users agree with.

***

### Input

| Field | What it does |
|---|---|
| `apps` | App Store links or numeric IDs. `https://apps.apple.com/us/app/whatsapp-messenger/id310633997` or `310633997`. |
| `countries` | Two-letter storefront codes (`us`, `gb`, `de`, `jp`, `kr`…). Each app is read from every store listed. Leave empty to use the country in each link, or the US store for bare IDs. |
| `mode` | `reviews` (default) or `summary`. |
| `sortBy` | `mostrecent` (default) or `mosthelpful` — the two orders Apple offers. |
| `daysBack` | `0` for no date filter; `7` or `30` for a tracking window. |
| `maxReviewsPerApp` | Cap per app per country, default 100. Apple's ceiling is 500 (see below). |

***

### What it costs

**$1.00 per 1,000 reviews** in reviews mode, **$10.00 per 1,000 app summaries** in summary mode, plus $0.005 per run. Apify's Starter, Scale and Business plans get 10%, 20% and 30% off.

You pay for rows delivered. An app with no reviews in a store, an ID that does not exist, or a date window that matches nothing costs nothing. Reading the same app from five countries is five sets of rows.

For scale: the full 500 reviews Apple serves for one app in one country is $0.50; a summary of 50 competitor apps is $0.50.

***

### How it works

Apple publishes a JSON feed of customer reviews for every app and storefront, fifty per page, and a lookup endpoint with the app's rating, version and metadata. This actor reads those two endpoints and nothing else — no browser, no HTML scraping of store pages, no proxies. That is why it is fast (a full 500-review read takes a few seconds), cheap, and does not break when Apple restyles the App Store.

Reviews are walked page by page until the cap, the date window or the end of the feed is reached. Each review's `updated` timestamp is normalised to UTC.

***

### Honest limits

- **Apple serves at most 500 reviews per app per country** — ten pages of fifty, then nothing. Measured 11 September 2026. The feed also has holes: for big apps a page in the middle comes back empty while later pages are full (WhatsApp US page 3, Instagram US page 2), so this actor reads all ten pages rather than stopping at the first empty one. For a big app that is a few days of reviews; for a small one it is the whole history. `status` tells you which case you are in, and a scheduled run with `daysBack` is how you build a longer record.
- **The 30-day figures in summary mode are only reported when they are complete.** If the reviews read stop short of 30 days back — because of your cap or Apple's ceiling — `reviewsLast30d` and `reviewsPerDay30d` are left empty rather than reported as a floor, and `status` says so.
- **`averageRating` and `ratingCount` are Apple's figures for all ratings, including the star-only ones with no text.** `recentAverageRating` is computed from the written reviews this actor read. The two measure different things and usually differ.
- **Apple no longer publishes a separate rating for the current version.** The lookup endpoint returns the same number for "all versions" and "current version", so only one is reported here.
- **Developer replies are not in Apple's feed**, so they are not here either.
- **Review order is Apple's.** "Most recent" is by the review's last-updated time, so an edited old review can appear near the top.
- **A storefront code that Apple does not recognise returns nothing**, reported per app with the reason.

***

### Scheduling

Reviews keep coming. Schedule reviews mode with `daysBack: 7` on your apps and each run adds the week's reviews; schedule summary mode weekly on your category and you have a dated record of ratings, star splits and update cadence over time.

***

### Legal

This actor reads only data that Apple serves publicly for each app, at addresses it serves to anyone. Reviews are public statements their authors chose to publish under a screen name. It requires no login and bypasses no access control. You remain responsible for how you use the exported data.

***

Questions, or an app that behaves oddly? Open an issue on the actor — issues are read and answered.

# Actor input Schema

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

App Store links or numeric app IDs. https://apps.apple.com/us/app/whatsapp-messenger/id310633997 and 310633997 both work. The country in a link is used when the Countries field below is left empty.

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

Two-letter storefront codes: us, gb, de, fr, jp, kr, br, in… Each app is read from every store listed, so 2 apps × 3 countries = 6 sets of reviews. Leave empty to use the country from each link, or the US store for bare IDs.

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

"Reviews" gives one row per review. "Summary" gives one row per app and country: Apple's average rating and rating count, the version on sale, and the rating split and velocity of the most recent reviews.

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

Apple serves reviews either newest first or most helpful first. Newest first is the one to use for tracking; most helpful surfaces the reviews other users voted up.

## `daysBack` (type: `integer`):

Leave at 0 for no date filter. Set 7 or 30 to track what came in since the last run. Works with newest-first order.

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

Upper limit for each app in each country. Apple serves at most 500 reviews per app per country (10 pages of 50), so 500 is the ceiling whatever you enter here.

## Actor input object example

```json
{
  "apps": [
    "https://apps.apple.com/us/app/whatsapp-messenger/id310633997",
    "544007664",
    "https://apps.apple.com/gb/app/duolingo/id570060128"
  ],
  "countries": [
    "us",
    "gb",
    "de",
    "jp",
    "kr"
  ],
  "mode": "reviews",
  "sortBy": "mostrecent",
  "daysBack": 0,
  "maxReviewsPerApp": 100
}
```

# Actor output Schema

## `rows` (type: `string`):

No description

## `rowsCsv` (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 = {
    "apps": [
        "https://apps.apple.com/us/app/whatsapp-messenger/id310633997"
    ],
    "countries": [
        "us"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("tidyfeed/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/whatsapp-messenger/id310633997"],
    "countries": ["us"],
}

# Run the Actor and wait for it to finish
run = client.actor("tidyfeed/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/whatsapp-messenger/id310633997"
  ],
  "countries": [
    "us"
  ]
}' |
apify call tidyfeed/app-store-reviews-scraper --silent --output-dataset

```

## MCP server setup

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