# App Store Reviews Scraper - Ratings, Text, Dates by Country (`scrapewise/app-store-reviews-scraper`) Actor

Scrape Apple App Store reviews for any iPhone or iPad app by link, id or name: star rating, title, full review text, date, edited flag and country, plus the app's name, developer, category and average rating. Pick countries, newest or most helpful first, date and star filters. Error rows are free.

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

## Pricing

from $0.76 / 1,000 review delivereds

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?

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

Scrape Apple App Store reviews for any iPhone or iPad app: star rating, review title, full text, date, edited flag and country, together with the app's name, developer, category, current version, average rating and number of ratings. Give it app links, app ids or app names, pick one or many countries, and filter by stars and date. Export to JSON, CSV or Excel, or send the rows to your own tools.

### At a glance

| | |
|---|---|
| Price | **US$ 1.00 per 1,000 reviews** on the Free plan (lower on paid Apify plans) plus a US$ 0.005 start fee |
| What you pay for | Each unique review delivered. Error rows and duplicates are free |
| Speed | About 45 reviews in 12 seconds for one app; 20 reviews per page |
| Depth | Tens of thousands of reviews per app and country, newest first |
| Countries | Any App Store country (us, gb, br, jp, de, fr, ...), each read separately |
| Login | None. Public reviews only |
| Output | JSON, CSV, Excel, XML, HTML via the dataset, API or integrations |

### What you can do with it

- **Track complaints after a release.** Newest first, 1 and 2 stars only, since the release date.
- **Compare countries.** The same app across us, gb, br and jp, with the local language text.
- **Watch competitors.** Several apps in one run with a shared cap, or a cap per app so the first one does not use it all.
- **Feed analysis.** Sentiment, topic clustering, support triage, product research, LLM summaries.
- **Build a review archive.** Schedule it daily with a date filter and append to a sheet or database.

### Quick start

Paste an app link or its id and run. The default input reads the newest 50 reviews of one app:

```json
{
  "appIds": ["570060128"],
  "countries": ["us"],
  "maxItems": 50
}
```

Complaints from Brazil in the last month, by app name:

```json
{
  "searchQueries": ["Nubank"],
  "countries": ["br"],
  "minRating": 1,
  "maxRating": 2,
  "reviewsSince": "2026-10-01",
  "maxItems": 200
}
```

Several apps, several countries, 100 reviews per app and country:

```json
{
  "appIds": ["https://apps.apple.com/us/app/duolingo-language-lessons/id570060128", "1514329124"],
  "countries": ["us", "gb", "de"],
  "maxReviewsPerApp": 100,
  "maxItems": 1000
}
```

### Input

| Field | Type | What it does |
|---|---|---|
| `appIds` | list | App Store links or the number after `id`. A link that contains a country (`/us/`, `/br/`) uses that country |
| `searchQueries` | list | Exact app names. Each name takes the top App Store match; use a link when the name is common |
| `countries` | list | Two-letter country codes, default `us`. Each country is a separate set of reviews |
| `sortBy` | `newest` or `helpful` | Newest first (default) lets the date filter stop early |
| `minRating`, `maxRating` | 1 to 5 | Keep only reviews inside this star range |
| `reviewsSince` | date | Keep reviews on or after this date, for example `2026-01-31` |
| `maxItems` | number | Hard cap for the whole run (default 50, 0 = no cap) |
| `maxReviewsPerApp` | number | Optional cap per app and country (0 = off) |
| `proxyConfiguration` | object | Apify proxy settings. The default works for normal volumes |

Leave the input empty and the Actor reads the newest reviews of one popular app as an example, so a first run always returns data.

### Output fields

| Field | Meaning |
|---|---|
| `type` | `review` for data rows, `error` for rows that explain a problem |
| `reviewId` | Id of the review itself |
| `appId`, `appName` | App id and name in that country |
| `country` | Two-letter App Store country |
| `rating` | Stars, 1 to 5 |
| `title`, `review` | Review title and full text, in the review's language |
| `reviewLength` | Characters in the text |
| `date` | Review date (UTC, ISO format) |
| `isEdited` | Whether the review was edited after posting |
| `developer`, `category`, `bundleId` | Seller, main category and bundle id of the app |
| `currentAppVersion` | The version the store lists now |
| `appAverageRating`, `appRatingCount` | The app's overall rating and total number of ratings in that country |
| `appUrl` | Link to the app page |
| `sourceInput` | The link, id or name you gave |
| `scrapedAt` | When the row was collected |
| `errorCode`, `error` | Filled only on error rows |

Reviewer names, photos and profiles are not collected. Email addresses and phone numbers that a reviewer typed into the text are replaced by `[contact removed]`. The App Store does not publish the app version a review was written for, nor developer replies, so those fields do not exist.

### Example output

A real row (Brazil, 1 star), collected on 1 Nov 2026:

```json
{
  "type": "review",
  "reviewId": "14730334077",
  "appId": "814456780",
  "appName": "Nubank: Conta, Cartão e mais",
  "country": "br",
  "rating": 1,
  "title": "Lixo",
  "review": "Lixo",
  "reviewLength": 4,
  "date": "2026-10-30T16:47:42Z",
  "isEdited": false,
  "developer": "NU PAGAMENTOS S/A INSTITUICAO DE PAGAMENTO",
  "category": "Finance",
  "bundleId": "com.nu.iphone",
  "currentAppVersion": "8.0.17",
  "appAverageRating": 4.82304,
  "appRatingCount": 1667588,
  "appUrl": "https://apps.apple.com/br/app/nubank-conta-cart%C3%A3o-e-mais/id814456780",
  "sourceInput": "Nubank",
  "scrapedAt": "2026-11-01T17:06:54Z",
  "errorCode": null,
  "error": null
}
```

### Errors

Problems come back as rows with `type: "error"` and a code. They are never charged.

| Code | Meaning |
|---|---|
| `INVALID_URL` | The entry is not an App Store link or app id |
| `APP_NOT_FOUND` | No app with that name, or the app is not sold in that country |
| `NO_RESULTS` | The app exists but no review matches your filters |
| `BLOCKED` | The App Store did not answer; run again in a few minutes |
| `INVALID_INPUT` | A field has a wrong value, for example a country code with three letters |

### Integrations, scheduling and AI agents

- **Schedules.** Use the Apify scheduler with `sortBy: newest` and a `reviewsSince` date to get a daily or weekly feed of new reviews.
- **Export.** Download from the dataset as JSON, CSV, Excel, XML or HTML, or read it with the Apify API and client libraries for Python and JavaScript.
- **Make, n8n, Zapier.** Start the Actor and read the dataset with the Apify modules; send low-star reviews to Slack, email or a ticketing tool.
- **Google Sheets and databases.** Use the Apify integrations to append each run to a sheet, BigQuery or a warehouse.
- **AI agents.** The Actor is available through the Apify MCP server, so an assistant can call it with an app name and a star filter and summarize what comes back.

### FAQ

**Do I need an Apple account or API key?** No. The Actor reads public reviews only.

**How many reviews can I get?** As many as the store lists for the app and country, up to thousands per run. Big apps have tens of thousands of reviews per country. Use `maxItems` to set your budget.

**Why does the same app give different reviews in other countries?** Each App Store country keeps its own reviews, in its own language. Add every country you care about to `countries`.

**Can I get only recent reviews?** Yes. Keep `sortBy` on `newest` and set `reviewsSince`. The run stops as soon as it reaches older reviews.

**Can I get reviews of an app that is not in the US store?** Yes. Put its country in `countries` or use a link with that country in it.

**Am I charged for duplicates or errors?** No. Only unique delivered reviews are charged.

### Limitations

- Reviews come 20 at a time and the store paces requests, so very large pulls take longer. A first page of 50 reviews takes seconds.
- Only reviews that the App Store lists publicly for the app and country are available. Some countries have few or no reviews for small apps.
- The review's app version, developer replies and reviewer identity are not provided by the store and are not part of the output.
- Names in `searchQueries` take the top match; use a link when you need a precise app.

### Changelog

- **1 Nov 2026**, version 0.1: first release with app links, ids and names, multi-country, star and date filters, newest or most helpful order.

# Actor input Schema

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

App Store links (https://apps.apple.com/us/app/name/id570060128) or just the number after 'id', one per line. A link carries its own country. Leave empty when you use app names below.

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

Exact app names, one per line, for example Duolingo. Each name takes the top App Store match, so use a link when the name is common.

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

Two-letter App Store country codes, for example us, gb, br, jp, de. Each country is read separately and every row carries its country. Links with a country in them use that country.

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

Newest first lets the date filter stop early.

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

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

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

Keep reviews with at most this many stars. Use minimum 1 and maximum 2 for complaints.

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

Only reviews on or after this date, written 2026-01-31. Works best with newest first.

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

Hard cap for the whole run, across all apps and countries. 0 = no cap.

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

Optional cap for each app and country, so the first app does not use the whole budget. 0 = only the run cap applies.

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

Apify datacenter proxy by default. Change it only if you know you need to.

## Actor input object example

```json
{
  "appIds": [
    "570060128"
  ],
  "countries": [
    "us"
  ],
  "sortBy": "newest",
  "minRating": 1,
  "maxRating": 5,
  "maxItems": 50,
  "maxReviewsPerApp": 0,
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}
```

# Actor output Schema

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

No description

## `resultsCsv` (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": [
        "570060128"
    ],
    "countries": [
        "us"
    ],
    "maxItems": 50,
    "proxyConfiguration": {
        "useApifyProxy": true
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("scrapewise/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 = {
    "appIds": ["570060128"],
    "countries": ["us"],
    "maxItems": 50,
    "proxyConfiguration": { "useApifyProxy": True },
}

# Run the Actor and wait for it to finish
run = client.actor("scrapewise/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 '{
  "appIds": [
    "570060128"
  ],
  "countries": [
    "us"
  ],
  "maxItems": 50,
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}' |
apify call scrapewise/app-store-reviews-scraper --silent --output-dataset

```

## MCP server setup

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