# App Store & Google Play Scraper API | Reviews, Charts, Data (`aurelix/app-store-google-play-scraper`) Actor

Scrape App Store and Google Play apps and reviews in one schema: $0.18 per 1,000 apps and $0.025 per 1,000 reviews. App Store data and Google Play data: ratings, installs, developer pages, App Store top charts, several countries per run, only-new-reviews mode. No login; reviewer names as shown.

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

## Pricing

from $0.15 / 1,000 app results

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

### What is App Store & Google Play Scraper?

**App Store and Google Play apps, top charts and reviews in one table, for $0.18 per 1,000 apps and $0.025 per 1,000 reviews, no login.**

For product, growth and ASO teams. Paid Apify plans pay $0.15 per 1,000 apps; reviews include the reviewer's name as shown. The example input (2 apps, 40 reviews) costs about $0.0064. Your first run with the example input costs about $0.013 (42 apps in our test run).

[![App Store & Google Play Scraper: example output from a real run](https://api.apify.com/v2/key-value-stores/twkCCtTWzsi8fVbx5/records/app-store-google-play-scraper-card-v2.png)](https://console.apify.com/actors/wI26HiER6vwANfcVs?addFromActorId=wI26HiER6vwANfcVs)

[![App Store & Google Play Scraper: 75-second demo video](https://api.apify.com/v2/key-value-stores/twkCCtTWzsi8fVbx5/records/app-store-google-play-scraper-demo-thumb-v1.png)](https://api.apify.com/v2/key-value-stores/twkCCtTWzsi8fVbx5/records/app-store-google-play-scraper-demo-v1.mp4)

**[▶ Watch the 75-second demo](https://api.apify.com/v2/key-value-stores/twkCCtTWzsi8fVbx5/records/app-store-google-play-scraper-demo-v1.mp4)**

| | |
|---|---|
| **Stores** | Apple App Store and Google Play, one schema (`store` field) |
| **Start from** | App URLs, App Store IDs, package names, developer pages, App Store top charts |
| **Reviews** | App Store: up to 500 per app and country; Google Play: the ~20 the app page shows |
| **Countries** | Any store country, several per run (e.g. us, gb, de) |
| **Output** | 50 app fields, 19 review fields; JSON, CSV, Excel, API |
| **Automate** | Only-new-reviews mode, schedules, Slack/webhook digest, Zapier, Make, n8n, MCP |
| **Price** | $0.18 per 1,000 apps ($0.15 per 1,000 apps on paid Apify plans) |
| **Free to try** | Runs on Apify's free plan: the $5 monthly credit covers about 27,000 apps or about 200,000 reviews |
| **Login needed** | No |

### Daily monitor: only what's new, every morning

Set it once, get only the new reviews every morning. With **Only new reviews** on, the first run returns everything that matches; each later run skips reviews that earlier runs already returned, so you pay only for new ones.

```json
{
  "apps": [
    "https://apps.apple.com/us/app/duolingo-language-lessons/id570060128",
    "com.duolingo"
  ],
  "countries": [
    "us"
  ],
  "maxReviewsPerApp": 200,
  "onlyNewReviews": true,
  "stateKey": "duolingo-daily"
}
```

1. Paste this input into the **Input** tab (JSON view) and click **Save as a new task**; it appears under **Saved tasks**.
2. Open the task from **Saved tasks** and click **Schedule**.
3. Choose **Daily**, pick the hour, and save.

**Cost example:** 1 app on both stores, about 100 new reviews a day plus its 2 app rows ≈ $0.24/month on the free plan ($0.23 on paid plans): one run a day for 30 days, start fee included. The first run returns everything that matches, so it costs more.

Add a Slack incoming-webhook URL in `slackWebhookUrl` (or any URL in `webhookUrl`) to get a short digest of each run's new reviews; nothing is sent when a run finds nothing.

### Why App Store & Google Play Scraper users pick this one

- **Both stores, one schema.** iOS and Android apps and reviews in one dataset, store field.
- **Reviews with reviewer names.** Display name and profile link or picture, as shown.
- **Only new reviews.** Daily runs return only the reviews you have not seen.
- **Charts and developer pages.** App Store top 100 by category, every app of a publisher.
- **Several countries per run.** Up to 500 App Store reviews per app and country.

### Get started in 3 steps

1. Paste apps into 'Apps': App Store or Google Play URLs, App Store IDs like 324684580, or package names like com.spotify.music. Or add a developer page, or pick App Store top charts.
2. Set 'Reviews per app' (0 = app details only) and the store countries, e.g. us and gb; turn on 'Only new reviews' for daily tracking.
3. Click Start, or schedule it daily. Download JSON, CSV or Excel, or send results to Google Sheets, Slack, Zapier, Make or n8n.

**[▶ Try it with the example input](https://console.apify.com/actors/wI26HiER6vwANfcVs?addFromActorId=wI26HiER6vwANfcVs)**

The form opens with an example input already filled in: that run costs about $0.013 on the free plan.

### How much does it cost to scrape App Store and Google Play data?

Pay per event: you pay only for what the run returns, plus a small start fee. Bronze, Silver, Gold and higher Apify plans pay less per result.

| Apps | Free plan | Paid plans (Bronze, Silver, Gold) |
|---|---|---|
| 100 | $0.023 | $0.02 |
| 1,000 | $0.19 | $0.16 |
| 10,000 | $1.81 | $1.51 |

Totals include the $0.005 start fee per run, rounded to the cent (amounts under $0.10 to four decimals). Apify's free plan includes $5 of credit a month, enough for about 27,000 apps or about 200,000 reviews.

Every app read is one app result; reviews are billed on top at $0.025 per 1,000 on every plan. Worked examples on the free plan, start fee included: 1 app with 500 App Store reviews = $0.018; 10 competitor apps in 3 countries with 100 reviews each = 30 apps + 3,000 reviews = $0.085; a daily 'Only new reviews' run on 2 apps that finds 60 new reviews = $0.0069 ($0.21 a month). App IDs the stores do not know, duplicate reviews and reviews you already received in 'Only new reviews' mode are never charged.

#### Billing events

| Event | Free plan | Paid plans (Bronze, Silver, Gold) |
|---|---|---|
| `app-result` | $0.18 per 1,000 apps | $0.15 per 1,000 apps |
| `review-result` | $0.025 per 1,000 reviews | $0.025 per 1,000 reviews |
| `apify-actor-start` | $0.005 per run | $0.005 per run |

### What data you get

**App Store & Google Play Scraper** reads public app listings from Apple's App Store and Google Play and returns them in one schema: an app row per app and country (title, developer, category, price, rating, rating count, installs on Google Play, version, release and update dates, icon, screenshots) and, if you ask for them, a review row per review (rating, title, text, date, app version, helpful votes, developer reply, reviewer name). Start from app URLs, App Store IDs or Android package names, from a developer page, or from an App Store top chart with its ranks. Each review carries the reviewer's display name as the store shows it, plus the public iTunes profile link (App Store) or profile picture (Google Play).

- Every row: type (app or review), store (app_store or google_play), app_id, country, url, source_url, scraped_at in ISO 8601 UTC
- App rows: title, bundle_id, developer, developer_id, developer_url, developer_website, summary, description, genre, genre_id, genres
- App rows: price, currency, is_free, in_app_purchases, contains_ads, rating, ratings_count, reviews_count, rating_histogram (Google Play), rating_current_version (App Store)
- App rows: installs, installs_min, installs_count (Google Play), content_rating, version, min_os_version, size_bytes, languages, released_at, updated_at, release_notes, icon_url, screenshots, privacy_policy_url
- App rows from charts and developer pages: chart, chart_genre, chart_rank, chart_ranks (every chart and rank the app holds in this run), found_via
- Review rows: app_title, review_id, reviewer_name, reviewer_url (App Store), reviewer_avatar_url (Google Play), rating, review_title, text, date, app_version, helpful_votes, total_votes, developer_reply, developer_reply_at

| type | store | app_id | title | rating | ratings_count | text |
|---|---|---|---|---|---|---|
| app | app_store | 570060128 | Duolingo: Learn Languages | 4.72 | 5558294 |  |
| app | google_play | com.duolingo | Duolingo: Learn Languages | 4.75 | 51617304 |  |
| review | app_store | 570060128 | Duolingo: Learn Languages | 5 |  | You give me confidence and then at school I get smarter b... |
| review | google_play | com.duolingo | Duolingo: Learn Languages | 1 |  | I don't feel like I'm learning the language I signed up f... |

One full app record, exactly as a real run returned it (long text and lists shortened here). From a real run:

```json
{
  "type": "app",
  "store": "app_store",
  "app_id": "6448311069",
  "bundle_id": "com.openai.chat",
  "title": "ChatGPT",
  "url": "https://apps.apple.com/us/app/chatgpt/id6448311069",
  "developer": "OpenAI OpCo, LLC",
  "developer_id": "1684349733",
  "developer_url": "https://apps.apple.com/us/developer/openai-opco-llc/id1684349733",
  "developer_website": "https://openai.com/chatgpt",
  "summary": null,
  "description": "Introducing ChatGPT for iOS: OpenAI’s latest advancements at your fingertips.\n\nThis official app is free, syncs your his... [1219 more characters]",
  "genre": "Productivity",
  "genre_id": "6007",
  "genres": [
    "Productivity",
    "Utilities"
  ],
  "price": 0,
  "currency": "USD",
  "is_free": true,
  "in_app_purchases": null,
  "contains_ads": null,
  "rating": 4.82,
  "ratings_count": 11924418,
  "reviews_count": null,
  "rating_histogram": null,
  "rating_current_version": 4.82,
  "ratings_count_current_version": 11924418,
  "installs": null,
  "installs_min": null,
  "installs_count": null,
  "content_rating": "12+",
  "version": "1.2026.300",
  "min_os_version": "18.0",
  "size_bytes": 305684480,
  "languages": [
    "SQ",
    "AM",
    "AR",
    "... [57 more]"
  ],
  "released_at": "2023-05-18T07:00:00Z",
  "updated_at": "2026-11-03T18:55:49Z",
  "release_notes": "Bug fixes and small improvements.",
  "icon_url": "https://is1-ssl.mzstatic.com/image/thumb/Purple221/v4/5c/9c/84/5c9c8431-bd39-08fa-cba4-8bb6561f9877/AppIcon-0-0-1x_U007e... [38 more characters]",
  "header_image_url": null,
  "screenshots": [
    "https://is1-ssl.mzstatic.com/image/thumb/PurpleSource221/v4/a1/39/1d/a1391d37-04ea-8ead-62eb-d925b773ed4a/1_iPhone.jpg/3... [12 more characters]",
    "https://is1-ssl.mzstatic.com/image/thumb/PurpleSource211/v4/24/88/47/248847d2-af10-20a9-cfd7-42d071b3dd61/2_iPhone.jpg/3... [12 more characters]",
    "https://is1-ssl.mzstatic.com/image/thumb/PurpleSource221/v4/ad/c7/1f/adc71f08-c935-fd79-c6c8-e5ba2d690bea/3_iPhone.jpg/3... [12 more characters]",
    "... [13 more]"
  ],
  "privacy_policy_url": null,
  "chart": "top-free",
  "chart_genre": "iTunes Store: Top Free Apps",
  "chart_rank": 5,
  "chart_ranks": [
    {
      "chart": "top-free",
      "chart_genre": "iTunes Store: Top Free Apps",
      "rank": 5
    },
    {
      "chart": "top-grossing",
      "chart_genre": "iTunes Store: Top Grossing Apps",
      "rank": 1
    }
  ],
  "found_via": "chart",
  "country": "us",
  "language": null,
  "source_url": "https://apps.apple.com/us/app/chatgpt/id6448311069",
  "scraped_at": "2026-11-05T08:23:39Z"
}
```

### Use cases

- Product and growth teams tracking their own app's new reviews every day, both stores in one sheet
- Competitor research: ratings, installs, prices, update cadence and what users complain about
- App Store Optimization: top-chart ranks by category and country, with full app details
- Market sizing: every app of a publisher, with ratings and Google Play install brackets
- Feeding review text to an LLM for sentiment, feature requests and bug themes

### Input

| Field | Type | What it does | Default |
|---|---|---|---|
| `apps` (Apps) | array | Apps to read, mixed freely: an App Store URL (e.g. 'https://apps.apple.com/us/app/spotify-music-and-podcasts/id324684580'), an App Store ID ('324684580' or 'id324684580'), a Google... |  |
| `maxReviewsPerApp` (Reviews per app) | integer | How many reviews to return for each app and country, e.g. 100; 0 = app details only. | 0 |
| `developers` (Developer pages) | array | Every app of a developer, e.g. 'https://apps.apple.com/us/developer/spotify/id324684583', 'https://play.google.com/store/apps/developer?id=Spotify+AB' or 'https://play.google.com/store/apps/dev?id=5700313618786177705'. |  |
| `appStoreCharts` (App Store top charts) | array | App Store top charts to read, e.g. \['top-free']: each app comes with its rank; an app on several of your... |  |
| `chartGenre` (Chart category) | string | App Store category for the charts, e.g. Games; 'All categories' = the overall chart. |  |
| `countries` (Countries) | array | Two-letter store countries, e.g. \['us', 'gb', 'de']. | \["us"] |

All 14 fields, with examples: see the **Input** tab.

### Use with AI agents (MCP)

MCP (Model Context Protocol) is the open standard that lets AI assistants such as Claude, ChatGPT and Cursor call outside tools. Apify's hosted MCP server at `https://mcp.apify.com/?tools=aurelix/app-store-google-play-scraper` gives your assistant this Actor only: it fills in the input from your request, runs it and reads the apps back, at the same per-result price as a run started by hand.

#### Example prompts

- "Get the latest 100 App Store and Google Play reviews of the Spotify app in the US and summarise the main complaints"
- "Pull app details, rating and review count for com.spotify.music on Google Play in the US and the UK"
- "Collect recent one- and two-star reviews of an app I give you from both stores and group them by theme"

#### Claude Desktop and claude.ai

**Settings > Connectors > Add custom connector**, name it Apify, paste `https://mcp.apify.com/?tools=aurelix/app-store-google-play-scraper`, keep the detected OAuth settings, select **Add** and sign in to Apify.

#### Claude Code

```bash
claude mcp add --transport http apify "https://mcp.apify.com/?tools=aurelix/app-store-google-play-scraper"
```

#### Cursor and VS Code

Add this to `~/.cursor/mcp.json` (Cursor); in VS Code's `.vscode/mcp.json` put the same entry under `"servers"` with `"type": "http"`. Sign in to Apify when asked.

```json
{
  "mcpServers": {
    "apify": {
      "url": "https://mcp.apify.com/?tools=aurelix/app-store-google-play-scraper"
    }
  }
}
```

#### ChatGPT

Turn on **Developer mode**, open **Settings > Apps & Connectors > Create**, paste the URL above as the MCP server URL, choose **OAuth** and authorize Apify.

Clients without sign-in send `Authorization: Bearer <YOUR_APIFY_TOKEN>` instead. No Apify account? This Actor supports Apify's agentic payments: an agent can pay per run with a prepaid, spend-capped token, bought with x402 stablecoin payments.

#### n8n AI agent

Give an **AI Agent** node an **MCP Client Tool** with the endpoint `https://mcp.apify.com/?tools=aurelix/app-store-google-play-scraper` and a Bearer credential holding your Apify token.

### Use it from AI agents (MCP), the API or no-code

#### Copy this to your AI assistant

```text
Use the Apify Actor aurelix/app-store-google-play-scraper (App Store & Google Play Scraper) through Apify's MCP server or API. Main input: apps (Apps); maxReviewsPerApp (Reviews per app). Example input: {"apps": ["https://apps.apple.com/us/app/spotify-music-and-podcasts/id324684580", "com.spotify.music"], "maxReviewsPerApp": 100, "countries": ["us", "gb"]}. Each result is one app with fields such as type, store, app_id, bundle_id, title, url, developer, developer_id. It costs $0.18 per 1,000 apps on Apify's free plan plus a $0.005 start fee per run, and needs no login.
```

MCP server URL for this Actor: `https://mcp.apify.com/?tools=aurelix/app-store-google-play-scraper` (setup for each client in the section above).

#### API

Start a run and read the dataset with Apify's REST API or the Python and JavaScript clients:

```python
from apify_client import ApifyClient

client = ApifyClient("<YOUR_APIFY_TOKEN>")
run = client.actor("aurelix/app-store-google-play-scraper").call(run_input={'apps': ['https://apps.apple.com/us/app/spotify-music-and-podcasts/id324684580', 'com.spotify.music'], 'maxReviewsPerApp': 100, 'countries': ['us', 'gb']})
for item in client.dataset(run["defaultDatasetId"]).iterate_items():
    print(item)
```

#### No-code: schedule it in 3 clicks

Send the results to Google Sheets, Zapier, Make, n8n, Slack or any webhook URL.

1. Fill in the input, then click **Save as a new task**.
2. In the task, click **Schedule** and pick daily or weekly (Apify Schedules).
3. Turn on **Only new reviews** so each run returns only what is new, and paste a Slack or webhook URL into **Slack webhook URL** / **Webhook URL** to get a digest of the new items (count plus the top 10) after every run.

Prefer n8n or Make? Ask in the **Issues** tab and we will share a ready-made workflow for it.

### FAQ

#### Can I scrape App Store and Google Play reviews without login?

Yes. It never logs in, so you need no Apple or Google account, password or cookies; only a free Apify account to run it.

#### Is there an App Store or Google Play reviews API?

You can use this Actor as one. Start it with Apify's REST API or the Python and JavaScript clients and read the results as JSON (see the code above), or call it from an AI agent through MCP.

#### How much does it cost to scrape App Store and Google Play data?

About $0.19 for 1,000 apps on Apify's free plan and $0.16 on paid plans, start fee included. The free $5 monthly credit covers about 27,000 apps or about 200,000 reviews.

#### Can I export App Store and Google Play data to Excel or Google Sheets?

Yes. Download the results as Excel, CSV, JSON, XML or HTML from the run's **Storage** tab, or send them to Google Sheets with Apify's Google Sheets integration or the API.

#### Is it legal to scrape the App Store and Google Play?

It reads only public data any logged-out visitor can see: app store listings, ratings and public reviews from Apple's public feeds and Google Play app pages, on paths the stores' robots.txt allows. It never logs in and never solves CAPTCHAs; reviewer display names and public profile links are returned as the stores show them. Apple's and Google's terms discourage automated access; keep your use to analysis of public data. Data is returned as shown publicly on the source; people can ask for removal by opening an issue on this Actor's Issues tab; if Apple or Google formally asks us to stop, this Actor will stop. You are responsible for using the data lawfully, incl. privacy laws; this is not legal advice.

#### Which data comes from which store?

Both stores fill the same fields where both publish them. Google Play adds installs, the star histogram, written-review count, in-app purchase range, ads label, feature graphic and privacy-policy link. The App Store adds size, minimum iOS version, supported languages, the current version's rating and review titles and total votes. A field a store does not publish is null.

#### How many reviews can I get?

App Store: up to 500 per app and country, which is Apple's public feed limit (50 per page, 10 pages), sorted by most recent or most helpful. Add more countries to get more: each has its own 500. Google Play: the reviews its public app page shows, about 20 per app and language; change 'Google Play language' to get another language's set.

#### Why does it return about 20 Google Play reviews per app?

This Actor only reads pages play.google.com/robots.txt allows, so it returns the reviews on the public app page, about 20 per app and language. This tool doesn't cover thousands of Play reviews per app.

#### Can I search the App Store or Google Play by keyword?

No. Both stores' robots.txt files disallow their search paths (itunes.apple.com/search and play.google.com/store/search), so this Actor does not use them. Start from app URLs, developer pages or App Store top charts instead.

#### Does it cover Google Play top charts?

No. Google Play loads its charts through an endpoint robots.txt disallows. App Store top free, top paid and top grossing charts are supported, overall or by category, up to rank 100.

#### Does it return reviewer names?

Yes, as the stores show them publicly: the reviewer's display name on every review, the public iTunes profile link on App Store reviews and the profile picture URL on Google Play reviews. Review text and developer replies are returned unchanged. Nothing behind a login is read. Data is returned as shown publicly on the source; people can ask for removal by opening an issue on this Actor's Issues tab.

#### How does 'Only new reviews' work?

The Actor remembers the review IDs it returned per app (and Google Play language) across all countries, for 180 days; adding a country later never returns a review you already received. The next run returns only reviews it has not returned before, so a daily schedule gives you each day's new reviews and charges only for those.

#### Does it need a proxy?

The default Apify Proxy datacenter group works for both stores; nothing extra to buy. The Actor waits between requests and switches proxy session when a store throttles.

### Built for reliable, repeat runs

- Failed runs: a throttled request gets a fresh proxy session and backs off, and anything still unread is named in the run status while the rest is kept.
- Reviewer fields: this Actor returns the reviewer name, App Store profile link and Google Play profile picture, in one schema across both stores.
- Both stores, many countries: both stores share one schema and a run takes a list of countries.
- No repeats on scheduled runs: 'Only new reviews' returns and charges only reviews you have not received (each app read is still one app row).

### Limits (stated honestly)

- No keyword search on either store and no Google Play charts: those paths are disallowed by the stores' robots.txt.
- App Store reviews: at most 500 per app and country (Apple's public feed). Google Play reviews: about 20 per app and language (what the public page shows).
- App Store top charts go to rank 100; Google Play developer pages list what the page shows (all apps for most developers, a first set for very large ones).
- Google Play shows 'Varies with device' for many apps, so version and minimum Android version are often empty.
- Apple's public review feed sometimes answers with no reviews for a while; such apps are named in the run status as not read (status 'Partial') instead of looking review-free.
- App IDs or package names the stores do not know are skipped without charge; after 5 unknown apps in a row the run stops and says so, so check the IDs (package names are case-sensitive).
- If a store refuses 2 requests in a row even after retries, the run stops asking that store and names it in the status; the other store is still read.
- Ratings, ranks and prices change constantly; a run is a snapshot of when it ran.
- If a store keeps throttling after retries, results already read are kept and the run status starts with 'Partial'.
- Reviewer fields are what each store shows: Apple's feed gives a display name and profile link, Google Play a display name and picture; neither shows emails or real-name verification.

### Works great with

- **Then: [Google Autocomplete API](https://apify.com/aurelix/google-autocomplete-scraper)**: put an app's name or category into its keywords to see what people type into Google around it, for App Store Optimization ideas
- **Then: [Google Trends by Region](https://apify.com/aurelix/google-trends-scraper)**: compare search interest in competing app names over time and by country

### Recent changes

- **0.2**: Review rows now include the reviewer's display name, App Store profile link and Google Play profile picture as the stores show them; review text and developer replies are returned unchanged. Common input names work as pasted (appIds, startUrls, appIdOrUrl, country, sort, maxItems), as do country names, comma-separated lists and developer links in 'apps'; a run where a store is down ends with a plain message and charges nothing for it.
- **0.1**: First release: App Store and Google Play apps and reviews in one schema, developer pages, App Store top charts by category, several countries per run, only-new-reviews mode, no reviewer identity.

The full history is on the **Changelog** tab.

### Tested daily

An automated health check runs this Actor every day on a fixed input and checks that at least 31 apps come back with `type`, `store`, `app_id`, `url`, `source_url`, `scraped_at` filled in; a failed check alerts the maintainer straight away.

### Your feedback

Missing a field, found a bug or need another filter? Open an issue on the **Issues** tab; we aim to answer within a day. If this Actor saved you time, a short review helps other people find it.

# Changelog

This Actor's version history is a separate document: https://apify.com/aurelix/app-store-google-play-scraper/changelog.md

# Actor input Schema

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

Apps to read, mixed freely: an App Store URL (e.g. 'https://apps.apple.com/us/app/spotify-music-and-podcasts/id324684580'), an App Store ID ('324684580' or 'id324684580'), a Google Play URL (e.g. 'https://play.google.com/store/apps/details?id=com.spotify.music') or an Android package name ('com.spotify.music'). A country in the URL (e.g. /gb/) is used for that app.

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

How many reviews to return for each app and country, e.g. 100; 0 = app details only. The App Store gives up to 500 per app and country; Google Play's public app page shows about 20 per app and language.

## `developers` (type: `array`):

Every app of a developer, e.g. 'https://apps.apple.com/us/developer/spotify/id324684583', 'https://play.google.com/store/apps/developer?id=Spotify+AB' or 'https://play.google.com/store/apps/dev?id=5700313618786177705'.

## `appStoreCharts` (type: `array`):

App Store top charts to read, e.g. \['top-free']: each app comes with its rank; an app on several of your charts is one row whose chart_ranks lists every chart and rank (up to 100). Google Play's charts are not on any public page that robots.txt allows, so they are not offered.

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

App Store category for the charts, e.g. Games; 'All categories' = the overall chart.

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

Two-letter store countries, e.g. \['us', 'gb', 'de']. Each app ID, package name, developer page and chart is read in every country listed; prices, ratings and reviews differ per country.

## `maxAppsPerList` (type: `integer`):

Most apps to return from each chart (up to 100) or developer page, e.g. 50.

## `language` (type: `string`):

Language code for Google Play pages and the reviews they show, e.g. 'en', 'de', 'pt-BR'. The App Store answers in each country's own store language.

## `reviewSort` (type: `string`):

Which App Store reviews come first: the most recent or the most helpful.

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

Return only reviews not returned by your previous runs of the same app, in any country (one memory per app and Google Play language). The first run returns everything; schedule it daily to get each day's new reviews.

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

Name for the 'previous runs' memory used by 'Only new reviews', e.g. 'my-app-daily'. Leave empty to share one memory per app across all your runs.

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

Apify Proxy; the default datacenter group works for both stores.

## `slackWebhookUrl` (type: `string`):

After each run, post a short digest to Slack: how many results were saved (new reviews only when 'Only new reviews' is on) and the top 10, e.g. https://hooks.slack.com/services/T000/B000/XXXX. Nothing is posted when the run saved nothing. Leave empty to skip.

## `webhookUrl` (type: `string`):

After each run, POST the same digest as JSON (actor, newOnly, count, items = top 10 results, runUrl, text) to any URL, e.g. a Zapier, Make or n8n webhook. Nothing is sent when the run saved nothing. Leave empty to skip.

## Actor input object example

```json
{
  "apps": [
    "https://apps.apple.com/us/app/spotify-music-and-podcasts/id324684580",
    "com.spotify.music"
  ],
  "maxReviewsPerApp": 20,
  "developers": [],
  "appStoreCharts": [],
  "chartGenre": "",
  "countries": [
    "us"
  ],
  "maxAppsPerList": 50,
  "language": "en",
  "reviewSort": "mostrecent",
  "onlyNewReviews": false,
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}
```

# Actor output Schema

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

One item per app (type 'app') and per review (type 'review'), both stores in one schema.

# 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/spotify-music-and-podcasts/id324684580",
        "com.spotify.music"
    ],
    "maxReviewsPerApp": 20
};

// Run the Actor and wait for it to finish
const run = await client.actor("aurelix/app-store-google-play-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/spotify-music-and-podcasts/id324684580",
        "com.spotify.music",
    ],
    "maxReviewsPerApp": 20,
}

# Run the Actor and wait for it to finish
run = client.actor("aurelix/app-store-google-play-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/spotify-music-and-podcasts/id324684580",
    "com.spotify.music"
  ],
  "maxReviewsPerApp": 20
}' |
apify call aurelix/app-store-google-play-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,aurelix/app-store-google-play-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/wI26HiER6vwANfcVs/builds/qumVzhl2bVoeoJfTf/openapi.json
