# App Store Scraper: Reviews, Ratings & App Data (`digital_influx/app-store-scraper`) Actor

Get Apple App Store reviews from many countries plus full app details, search results, developer apps and top charts. Filter reviews by rating and date, or get only new reviews on scheduled runs. Uses Apple's public endpoints: no proxies, no login, fast and cheap.

- **URL**: https://apify.com/digital\_influx/app-store-scraper.md
- **Developed by:** [Bruno Petrelli](https://apify.com/digital_influx) (community)
- **Categories:** E-commerce, Marketing, AI
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $3.00 / 1,000 app details saveds

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 Scraper: Reviews, Ratings & App Data

Get **App Store reviews from as many countries as you need**, plus **full app details**, **search results**, **all apps of a developer** and **top charts** (free, paid, grossing, by category), in one run.

It uses Apple's own public endpoints (the iTunes Search API and the App Store RSS feeds):

- **No proxies, no browser, no login.** In our test, 7 apps and 1,090 reviews were read in 8 seconds.
- **Stable:** these are official endpoints Apple has kept for years.
- **Pay only for what you keep:** reviews filtered out by stars or date are not charged.

### What you can use it for

- **Product teams:** read every 1- and 2-star review after a release, in every market, and see which app version they mention.
- **Competitor research:** compare ratings, rating counts, prices, update frequency and complaints across competing apps.
- **ASO and market research:** track who is in the top charts of a category and how their ratings move.
- **Agencies:** monthly review reports for clients, per country.
- **AI agents and LLM pipelines:** clean JSON with review text, ready for sentiment analysis or summarization. Callable through the Apify MCP server.

### Input

| Field | What it does |
|---|---|
| Apps | App Store links, app ids (`1232780281`), bundle ids (`com.openai.chat`) or developer page links (all of that developer's apps). |
| Search terms | Find apps like the App Store search does, up to 200 per term. |
| Top charts | `top-free`, `top-paid`, `top-grossing`, optionally for one category, up to 99 apps each. |
| Store country | The App Store used for details, search and charts (`us`, `gb`, `de`, `br`…). |
| Save app details / Save reviews | Choose what to collect. |
| Max reviews per app | Apple shows the newest 500 reviews per country. |
| Review countries | Countries read in order until the per-app maximum is reached, e.g. `us, gb, ca, au` for up to 2,000 English reviews. |
| Min / max stars | E.g. max 2 to collect complaints only. |
| Reviews from the last (days) | Only recent reviews. Reading stops at the first older review, so runs are faster. |
| Only new reviews | For scheduled monitoring: each run saves only the reviews earlier runs did not save, and reading an app stops at the first review already saved. |
| Memory name | Optional: a separate "only new" memory per client or task, or a new name to start over. |

Example: every 1-2 star review from the last 30 days, in four countries, for two apps:

```json
{
  "apps": ["https://apps.apple.com/us/app/notion-notes-tasks-ai/id1232780281", "com.openai.chat"],
  "reviewCountries": ["us", "gb", "ca", "au"],
  "maxReviewsPerApp": 2000,
  "maxRating": 2,
  "reviewsWithinDays": 30
}
```

### Output

Two kinds of records in the dataset, told apart by `type`. The dataset has a **Reviews** view and an **Apps** view.

Review:

```json
{
  "type": "review",
  "reviewId": "14577362103",
  "appId": "1232780281",
  "appName": "Notion: Notes, Tasks, AI",
  "country": "us",
  "rating": 3,
  "title": "bug ?",
  "text": "the app messes up whenever i try to type...",
  "appVersion": "1.7.339",
  "author": "weasley pounder",
  "authorUrl": "https://itunes.apple.com/us/reviews/id1265015590",
  "date": "2026-09-21T19:21:30.000Z",
  "voteSum": 0,
  "voteCount": 0
}
```

App:

```json
{
  "type": "app",
  "appId": "1232780281",
  "bundleId": "notion.id",
  "name": "Notion: Notes, Tasks, AI",
  "developer": "Notion Labs, Incorporated",
  "developerId": "1232780280",
  "country": "us",
  "price": 0,
  "currency": "USD",
  "free": true,
  "rating": 4.77604,
  "ratingCount": 90206,
  "version": "1.7.340",
  "releasedAt": "2017-09-14T19:07:31.000Z",
  "updatedAt": "2026-09-22T15:23:11.000Z",
  "genre": "Productivity",
  "contentRating": "4+",
  "sizeBytes": 712564736,
  "url": "https://apps.apple.com/us/app/notion-notes-tasks-ai/id1232780281",
  "iconUrl": "https://is1-ssl.mzstatic.com/...",
  "description": "Notion is an AI-powered all-in-one workspace...",
  "source": "search",
  "searchTerm": "notion",
  "chart": null,
  "chartRank": null
}
```

App records also include `ratingCurrentVersion`, `genres`, `languages`, `minimumOsVersion`, `screenshotUrls`, `releaseNotes`, `sellerUrl` and `developerUrl`. An app you paste that also appears in a chart you asked for keeps its chart rank.

The run's **OUTPUT** record lists reviews saved per app and every input that could not be found, with the reason.

### Pricing

Pay per event: one price per **app record** and a much lower one per **review**. You pay only for records saved. Reviews dropped by your star or date filters cost nothing, and with **Only new reviews** a review is never charged twice. Set a maximum cost per run and the Actor stops cleanly when it is reached.

### Good to know

- **Only new reviews** keeps one small record per app (the ids of the reviews it saved, for a year) in a key-value store named `app-store-state` in your own account. Reviews come newest first, so a scheduled run reads only down to the last review it already has: fast and cheap even for apps with thousands of reviews.

- Apple exposes the **newest 500 reviews per country** per app. Adding countries is the way to collect more.

- Reviews are **per country store**: US reviews and UK reviews are different sets.

- Apple's review feed is sometimes **empty for hours** for almost every app. When an app that has ratings comes back with no reviews, the Actor asks again twice. If the feed is still empty, the run says so in its status and OUTPUT (`emptyReviewFeeds`) instead of passing it off as "no reviews". Nothing is charged for reviews that did not come; run it again later.

- Top charts return at most 99 apps, Apple's own limit for these feeds.

- App details and search go through Apple's Search API, which allows about 20 requests per minute, so the Actor paces those requests itself. Reviews and charts are not affected.

- Apple's terms apply to artwork: use `iconUrl` and `screenshotUrls` only to show or promote the apps themselves.

- Google Play is not included.

### Support

Something missing or wrong? Open an issue on the Actor's Issues tab with the input you used. Issues get an answer within a few days.

# Actor input Schema

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

One per line: an App Store link (apps.apple.com/us/app/notion/id1232780281), an app id (1232780281), a bundle id (com.openai.chat) or a developer page link (apps.apple.com/us/developer/…/id123) to get all of that developer's apps.

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

Find apps the way users do in the App Store search, e.g. 'habit tracker'.

## `searchLimit` (type: `integer`):

1 to 200.

## `charts` (type: `array`):

Add top-free, top-paid and/or top-grossing to get the ranked apps of that chart.

## `chartGenre` (type: `string`):

Limit charts to one category. Leave empty for all apps.

## `chartLimit` (type: `integer`):

1 to 99 (Apple's own maximum for these charts).

## `country` (type: `string`):

Two-letter code of the App Store used for app details, search and charts: us, gb, de, br, ar, jp…

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

One record per app with rating, rating count, price, version, size, category, dates, description and more.

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

Newest reviews of every app found.

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

Apple shows up to 500 of the newest reviews per country. For more, add countries below.

## `reviewCountries` (type: `array`):

Each country's App Store has its own reviews. Countries are read in this order until the per-app maximum is reached. Empty = the store country above.

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

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

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

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

## `reviewsWithinDays` (type: `integer`):

Only reviews written in the last N days. Reading stops as soon as older reviews appear, so this also makes runs faster.

## `onlyNewReviews` (type: `boolean`):

Save only reviews that earlier runs with this option did not save, so a daily or weekly schedule gives you just the new reviews of each app and you pay only for those. Reading an app stops at the first review already saved. The memory is one record per app, kept for a year in a key-value store named "app-store-state" in your account.

## `stateKey` (type: `string`):

Give a name to keep a separate memory (for example one per client or per task), or a new name to start over. Letters, digits, dot, dash and underscore.

## Actor input object example

```json
{
  "apps": [
    "https://apps.apple.com/us/app/notion-notes-tasks-ai/id1232780281"
  ],
  "searchLimit": 50,
  "chartGenre": "",
  "chartLimit": 50,
  "country": "us",
  "includeAppDetails": true,
  "includeReviews": true,
  "maxReviewsPerApp": 50,
  "onlyNewReviews": false
}
```

# Actor output Schema

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

No description

## `summary` (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/notion-notes-tasks-ai/id1232780281"
    ],
    "maxReviewsPerApp": 50
};

// Run the Actor and wait for it to finish
const run = await client.actor("digital_influx/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 = {
    "apps": ["https://apps.apple.com/us/app/notion-notes-tasks-ai/id1232780281"],
    "maxReviewsPerApp": 50,
}

# Run the Actor and wait for it to finish
run = client.actor("digital_influx/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 '{
  "apps": [
    "https://apps.apple.com/us/app/notion-notes-tasks-ai/id1232780281"
  ],
  "maxReviewsPerApp": 50
}' |
apify call digital_influx/app-store-scraper --silent --output-dataset

```

## MCP server setup

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