# App Store Reviews Scraper – Ratings, Text & Sentiment Data (`mikumans/app-store-reviews`) Actor

Export iOS App Store reviews for any app and country: rating, title, text, date, app version and language, with filters. Anonymous (no reviewer names), from Apple's public feed. Failures free.

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

## Pricing

$2.00 / 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 Reviews Scraper – Ratings, Text & Sentiment Data

Export **iOS App Store reviews** for any app, in any country store, as a clean table: star rating, title, review text, date, app version and detected language. Filter by **country, language, rating and date**. Built on **Apple's public customer-reviews feed** and iTunes Search API. No login, no browser, no blocking. **Anonymous by design:** reviewer names and IDs are never collected.

### What can you use it for?

- **Product feedback mining:** find bugs and feature requests in 1–2 star reviews after each release (`appVersionReviewed`).
- **Competitor research:** compare what users love and hate about rival apps, per market.
- **Sentiment & AI analysis:** feed review text to LLMs or BI tools for topic and sentiment dashboards.
- **Release monitoring:** schedule daily with a date filter and get only new reviews.
- **Localization insights:** see what users in Germany, Brazil or Japan say about your app.

### Features

| Feature | This Actor | Typical review scrapers |
|---|---|---|
| App URL, numeric ID **or app name** input | ✅ | URL/ID only |
| Multiple **countries** per run | ✅ | Often one |
| Filters: **rating range, date range, language** | ✅ | Rarely all |
| Language detection on every review | ✅ | ❌ |
| App details (name, developer, genre, overall rating) on each row | ✅ | Sometimes |
| **No personal data:** reviewer names/IDs stripped | ✅ | ❌ usually included |
| Official public Apple endpoints, no browser, no proxy needed | ✅ | Varies |
| **Failures are free** | ✅ | ❌ |

### How to use

1. Add apps (App Store URL, ID like `570060128`, or a name like `Notion`).
2. Pick countries and optional filters.
3. Click **Start** and export JSON, CSV or Excel.

#### Example input

```json
{ "apps": ["https://apps.apple.com/us/app/duolingo-language-lessons/id570060128", "Notion"],
  "countries": ["us", "de"], "maxReviewsPerApp": 100, "maxRating": 2, "languages": ["en", "de"], "dateFrom": "2026-09-01" }
```

#### Example output

```json
{ "store": "app-store", "appId": "570060128", "appName": "Duolingo: Learn Languages", "developer": "Duolingo",
  "appAverageRating": 4.7, "country": "us", "rating": 2, "title": "Too many ads now",
  "text": "Used to love it but the latest update...", "language": "en", "appVersionReviewed": "7.12.0",
  "date": "2026-10-14T10:03:12.000Z", "helpfulVotes": 3, "totalVotes": 4 }
```

### Limits

Apple's public feed exposes the **~500 most recent reviews per app per country** (10 pages × 50). For more history, run across more countries or schedule regular runs and accumulate. Language is detected automatically (very short reviews may be `null`).

### Pricing

Pay per review returned, with no start fee and no platform usage fees on top. See the **Pricing** tab.

- 100 reviews ≈ $0.20 · 1,000 reviews ≈ $2 · 10,000 reviews ≈ $20
- Filtered-out reviews, apps not found and unavailable countries are **not charged** (listed in `FAILED`).

### Integrations

- **API:** run via the Apify API or the JavaScript/Python clients, and get results as JSON, CSV, Excel or XML.
- **No-code:** Make, Zapier, n8n, Google Sheets, Slack, webhooks and **schedules**.
- **AI agents:** available through the Apify MCP server.

### FAQ

**Does it scrape Google Play too?** No. Google Play reviews are only reachable through endpoints its robots.txt disallows, so this Actor sticks to Apple's public feed.
**Why no reviewer names?** Privacy. The data you need for product insight doesn't require personal data, which keeps your GDPR exposure minimal.
**Is this allowed?** It uses Apple's publicly offered RSS feed and iTunes Search API, without logins or circumvention. Use the content in line with Apple's terms and your local law.
**Can I get reviews older than 500?** Not via Apple's public feed.

### Related Actors from the same developer

- 📸 **[Website Screenshot API](https://apify.com/mikumans/website-screenshot)**: full-page, mobile and PDF screenshots.
- ⚡ **[Bulk PageSpeed & Lighthouse Checker](https://apify.com/mikumans/bulk-pagespeed-auditor)**: Core Web Vitals for many URLs.
- 🗺️ **[Sitemap URL Extractor](https://apify.com/mikumans/sitemap-extractor-pro)**: every URL from a site's sitemaps, with change monitoring.

**Keywords:** App Store reviews scraper, iOS app reviews, app ratings export, app review analysis, App Store review API, customer feedback, sentiment analysis, competitor app research.

# Actor input Schema

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

App Store URLs (apps.apple.com/...id123), numeric app IDs, or app names (first search match is used).

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

Two-letter App Store country codes (us, gb, de, be, nl, fr...). Reviews are per country store.

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

Apple's public feed returns up to 500 most recent reviews per app per country.

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

Only reviews with at least this many stars.

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

Only reviews with at most this many stars (e.g. 2 for complaints only).

## `dateFrom` (type: `string`):

Only reviews on/after this date (YYYY-MM-DD).

## `dateTo` (type: `string`):

Only reviews on/before this date (YYYY-MM-DD).

## `languages` (type: `array`):

Keep only reviews detected in these languages (ISO codes like en, de, fr, nl). Empty = all.

## `includeAppDetails` (type: `boolean`):

Add app name, developer, genre and overall rating to each row.

## Actor input object example

```json
{
  "apps": [
    "https://apps.apple.com/us/app/duolingo-language-lessons/id570060128",
    "Notion"
  ],
  "countries": [
    "us",
    "gb"
  ],
  "maxReviewsPerApp": 100,
  "minRating": 1,
  "maxRating": 5,
  "languages": [],
  "includeAppDetails": true
}
```

# Actor output Schema

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

One row per review (anonymous: no reviewer names or IDs)

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

Per app and country counts

## `failed` (type: `string`):

Apps or countries that could not be read

# 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",
        "Notion"
    ],
    "countries": [
        "us",
        "gb"
    ],
    "maxReviewsPerApp": 100
};

// Run the Actor and wait for it to finish
const run = await client.actor("mikumans/app-store-reviews").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",
        "Notion",
    ],
    "countries": [
        "us",
        "gb",
    ],
    "maxReviewsPerApp": 100,
}

# Run the Actor and wait for it to finish
run = client.actor("mikumans/app-store-reviews").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",
    "Notion"
  ],
  "countries": [
    "us",
    "gb"
  ],
  "maxReviewsPerApp": 100
}' |
apify call mikumans/app-store-reviews --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,mikumans/app-store-reviews"
        }
    }
}
```

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/oAfgdmC0oDvcTAL3E/builds/Kpe4FwhNwJZhwj5vB/openapi.json
