# App Store & Google Play Scraper: Reviews, Ranks & Versions (`chaptersoft/app-intel-app-store-google-play`) Actor

App Store + Google Play in one run: app details, reviews with filters, top charts & category ranks, version history, privacy/data safety, topic insights and new-since-last-run diffs. Pay per result, no start fee.

- **URL**: https://apify.com/chaptersoft/app-intel-app-store-google-play.md
- **Developed by:** [Jeremy Lam](https://apify.com/chaptersoft) (community)
- **Categories:** Developer tools, SEO tools, Marketing
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $0.08 / 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 & Google Play Scraper — Reviews, Top Charts, Ranks & Version History (with change monitoring)

**App Intel** covers the **Apple App Store** (iPhone, iPad and Mac apps) and **Google Play** in one run. Give it app IDs, bundle or package names, store URLs, developer pages or plain search terms. You get back:

- 📱 **App details for each store and country**: rating with a ★ histogram, rating count, installs, price and in-app purchases, version and release notes, **version history**, size, age rating, **App Store privacy labels / Google Play data safety**, permissions, developer contact, screenshots, similar apps, App Store events and editorial features.
- 💬 **Reviews** with real filters: sort, star rating, date range, keywords, minimum length, helpful votes, developer reply and app version. Each review carries **topic tags** (crashes, pricing, ads, login …) and a **sentiment score**.
- 🏆 **Top charts and chart ranks**: top free / paid / grossing (plus App Store new and iPad charts) for any category and country. You can also look up where each app ranks.
- 🧠 **Free insights record per app**: rating mix, top complaint topics with example quotes, complaint and praise phrases, average rating by version, and developer reply rate.
- 🔔 **What changed since the last run**: new reviews, edited or answered reviews, new versions, price, rating and IAP changes, rank moves, and apps entering or leaving charts. Put it on a schedule and receive only the changes.

Pay per result: **$0.08 per 1,000** apps, reviews or chart rows. **No start fee, no subscription.** Every source is public: no login, no API key, no cookies.

***

### Why this one

| | **App Intel** | Typical App Store / Play scraper |
|---|---|---|
| Stores | **App Store + Google Play in one run**, with automatic matching of the same app across stores | One store per Actor |
| Input | ID, bundle/package, store URL, developer URL, search term, `apple:` / `google:` prefixes | Usually only an ID or URL |
| Countries | Any number per run (up to all 175 App Store storefronts). If a storefront sells a separate local app (e.g. TikTok JP), its local twin is found | One country per run |
| Review filters | Stars, from/to date (or "30 days"), keywords, min length, min helpful votes, developer replied or not, app version, sort | Often only sort and max items. Users report filters being ignored |
| App Store depth | Newest and most-helpful feeds merged (≈1,000 per storefront), plus fan-out across countries | 500 or fewer, and runs often stop early |
| Version history | App Store: last 25 releases with notes. Google Play: built from what each run observes, and the "Varies with device" version is resolved from reviews | Rare |
| Ranks & charts | Top free / paid / grossing / new by category, rank lookup for your apps, and rank moves since the last run | Separate Actor, $0.80–$2 per 1,000 rows |
| Insights | Topic tags, sentiment and an insights summary per app at no extra cost, deterministic, no AI bill | — |
| Monitoring | Built-in diff: new / changed / unchanged / removed for apps, reviews and chart rows, with previous values | — |
| Price | **$0.08 / 1,000**, no start fee | $0.10–$15 / 1,000, often with start fees |

### Quick start

**Reviews and details for two apps on both stores (US + UK):**

```json
{ "apps": ["Duolingo", "com.spotify.music"], "countries": ["us", "gb"], "maxReviewsPerApp": 200 }
```

**Only 1–2★ reviews about crashes from the last 30 days:**

```json
{ "apps": ["https://apps.apple.com/us/app/instagram/id389801252"], "reviewRatings": ["1", "2"], "reviewsFrom": "30 days", "reviewKeywords": ["crash", "freeze", "bug"], "maxReviewsPerApp": 1000 }
```

**Top charts by category in several countries:**

```json
{ "charts": ["apple:topFree", "apple:topGrossing:6014", "google:topGrossing:GAME"], "countries": ["us", "de", "jp"], "chartDepth": 100 }
```

**Daily competitor monitor (schedule it, get only what's new):**

```json
{ "apps": ["Headspace", "Calm"], "countries": ["us"], "maxReviewsPerApp": 300, "includeChartRanks": true, "outputMode": "changes", "monitorKey": "meditation-competitors" }
```

**All apps from one developer (King on the App Store, Microsoft on Google Play):**

```json
{ "apps": ["https://apps.apple.com/us/developer/king/id526656015", "https://play.google.com/store/apps/dev?id=6720847872553662727"], "maxReviewsPerApp": 0 }
```

#### Accepted inputs (`apps`)

| You type | Means |
|---|---|
| `https://apps.apple.com/gb/app/spotify/id324684580` | That App Store app (URL country is used if you set no countries) |
| `324684580` or `id324684580` | App Store ID (iPhone, iPad or Mac) |
| `https://play.google.com/store/apps/details?id=com.whatsapp` | That Google Play app |
| `com.spotify.music` | Google Play package **or** iOS bundle ID, tried on both stores |
| `https://apps.apple.com/us/developer/…/id526656015`, `https://play.google.com/store/apps/dev?id=…` | Every app of that developer (`maxAppsPerDeveloper`) |
| `meditation app` | Search: top `maxResultsPerSearch` results on each store, with `searchRank` |
| `apple:…`, `google:…` | Limit that line to one store and skip counterpart matching |

### Output

The dataset mixes four flat item types. Filter on `type`, or open the ready-made views: *Apps, Reviews, Changes since last run, Version history, Top charts, Review insights*.

<details><summary><b>type = "app"</b> (shortened; the <code>change</code> block shows what a later run looks like)</summary>

```json
{
  "type": "app", "id": "apple:us:6448311069", "store": "apple", "platform": "ios", "country": "us",
  "appId": "6448311069", "bundleId": "com.openai.chat", "title": "ChatGPT", "subtitle": "Your everyday AI assistant",
  "developer": "OpenAI OpCo, LLC", "genre": "Productivity", "rating": 4.8259, "ratingCount": 11313295,
  "histogram": { "1": 257915, "2": 64199, "3": 138062, "4": 468942, "5": 10384177 },
  "price": 0, "offersIAP": true, "iapRange": "$4.00 – $500.00", "version": "1.2026.272",
  "currentVersionReleaseDate": "2026-10-06T18:07:01.000Z", "contentRating": "13+", "sizeText": "271.7 MB",
  "privacy": [{ "label": "Data Linked to You", "categories": ["Location", "Contact Info", "User Content", "Identifiers", "Usage Data"] }],
  "chartRanks": [{ "chart": "topFree", "category": "all", "categoryName": "All apps", "rank": 3 }, { "chart": "topGrossing", "category": "all", "rank": 1 }],
  "versionHistory": [{ "version": "1.2026.272", "date": "2026-10-06T18:07:01.000Z", "releaseNotes": "Bug fixes and small improvements." }, "… up to 25"],
  "counterpart": { "store": "google", "appId": "com.openai.chatgpt", "title": "ChatGPT", "confidence": 1 },
  "url": "https://apps.apple.com/us/app/chatgpt/id6448311069",
  "change": { "status": "changed", "changedFields": ["version", "releaseNotes"], "events": ["newVersion"], "previous": { "version": "1.2026.267" }, "deltas": { "ratingCount": { "from": 11290112, "to": 11313295, "delta": 23183 }, "rank:topFree:all": { "from": 5, "to": 3, "delta": 2 } } }
}
```

Google Play records also include `installs`, `minInstalls` and `maxInstalls`, `reviewCount`, `adSupported`, data safety in `privacy`, `permissions` (opt-in), developer email, address and website, `latestVersionInReviews` (resolves "Varies with device"), `videoUrl` and similar apps.

</details>

<details><summary><b>type = "review"</b> (example)</summary>

```json
{
  "type": "review", "id": "google:80af2a44-…", "store": "google", "country": "us", "language": "en",
  "appId": "com.zhiliaoapp.musically", "appTitle": "TikTok", "rating": 2, "title": null,
  "text": "Keeps crashing since the last update…", "date": "2026-10-15T14:44:09.326Z", "version": "47.1.4",
  "thumbsUp": 12, "userName": "…", "developerReply": "Hi! Thanks for…", "developerReplyDate": "2026-10-15T15:00:04.000Z",
  "topics": ["bugs_crashes", "updates"], "sentiment": "negative", "sentimentScore": -0.65,
  "reviewUrl": "https://play.google.com/store/apps/details?id=…&reviewId=…",
  "change": { "status": "new", "firstSeenAt": "2026-10-16T14:45:20.856Z" }
}
```

</details>

<details><summary><b>type = "chartEntry"</b> and <b>type = "insights"</b></summary>

`chartEntry`: `store, country, chart, category, categoryName, rank, chartSize, appId, bundleId, title, developer, price, rating, url, change` (`rankUp`, `rankDown` or `reEntered`, with the delta). Apps that dropped out of a chart since the last run come as free `removed` rows.

`insights` (free, one per app, store and country/language): `reviewsAnalyzed, dateRange, averageRating, ratingDistribution, sentiment {positiveShare, negativeShare}, topics [{topic, count, share, avgRating, negativeShare, exampleQuote}], topComplaintPhrases, topPraisePhrases, byVersion [{version, count, avgRating}], developerReplyRate, newReviews, sinceLastRun`.

</details>

Each run also writes an **`OUTPUT` record** to its key-value store. It holds what each input resolved to, inputs that matched nothing, status per app and country (`ok`, `not_available` or `error`, with the reason), chart status, notes, totals per type, charged counts, HTTP stats and duration. A failure in one store or country never sinks the rest of the run.

### Monitoring: "what changed since last time"

Every run saves a compact memory in a named key-value store (`app-intel-monitor` by default), keyed by your input (or by `monitorKey`). The next run marks each item:

- **Apps**: `new`, `unchanged` or `changed`, plus `changedFields`, `previous` values and `events`. Events: `newVersion`, `priceChange`, `ratingChange`, `iapChange`, `listingUpdate` (title, subtitle, description), `privacyUpdate`, `installsMilestone`, `contentRatingChange`, `categoryChange`, `adsChange`. Counters and ranks always show `deltas` and never count as a "change" on their own, so reruns have **zero false positives**.
- **Reviews**: `new`, `unchanged`, or `changed` with `developerReplied` / `edited`.
- **Chart rows**: `new` / `reEntered`, `rankUp` / `rankDown` with the delta, and `removed` (dropped out). Removal is only reported for charts that were fully fetched.

Set **Output** to *Only new* or *changes* and schedule the Actor. You then pay only for the new or changed items it outputs. If a run hits your spending limit, items that were not delivered are **not** marked as seen, so the next run delivers them.

### Pricing

| Event | Price |
|---|---|
| App record (one app × one store × one country) | $0.08 / 1,000 |
| Review | $0.08 / 1,000 |
| Chart entry | $0.08 / 1,000 |
| Insights summaries, "removed from chart" notices, OUTPUT summary | free |
| Start fee | none |

Examples: 10,000 reviews cost **$0.80**. A daily monitor of 5 apps × 2 countries with about 50 new reviews a day costs under **$0.15 a month**. Set **Maximum cost per run** in the run options and the Actor stops cleanly at that budget, never above it.

### Use with AI agents (MCP)

Items are flat JSON with stable field names, which suits LLM tools. Add the Actor to the [Apify MCP server](https://mcp.apify.com) and ask, for example, *"Compare 1-star complaints about Duolingo and Babbel in the US and Germany this month."* The free `insights` items give an agent the summary without reading every review.

### Limits & FAQ

- **How many App Store reviews?** Apple's public feed serves 500 reviews per storefront and sort order, and it lags a day or two. App Intel merges the newest and most-helpful feeds (`appleReviewDepth`, about 1,000 per storefront) and can fan out across countries. Apple does not publish developer responses or reviews older than that on any public endpoint. Tools that claim more use Apple's private web-player API with a scraped token, which we avoid on purpose.
- **Google Play reviews?** Tens of thousands per app (5,000 in about 20 s in our tests). Reviews are per language, not per country, so `us` and `gb` share one English stream. The star filter runs on Google's side, so pulling "only 1★" is fast.
- **Google Play version history?** Google publishes only the current version. App Intel records every version it observes from run to run (`versionHistorySource: "observed"`), and when the store says "Varies with device" it fills `latestVersionInReviews` from the newest reviews.
- **App not sold in a country?** It is reported in OUTPUT as `not_available`. For App Store search-type inputs, the same developer's local app is used if one exists (noted in OUTPUT).
- **Short run timeout?** App Intel watches the run's timeout and wraps up shortly before it, so you keep everything collected so far plus OUTPUT and the monitoring state. The run ends as SUCCEEDED with `OUTPUT.stoppedEarly: "timeout"` instead of TIMED-OUT, and the next run picks up what was missed.
- **Proxy?** Not needed for normal use. For very large runs you can add one under *Advanced*.
- **Topics in my language?** Rules cover English, Spanish, German, French, Portuguese, Italian, Japanese, Korean and Chinese. They are deterministic keyword rules, not AI: free, fast and repeatable.
- **Is it legal?** It reads only public store pages and Apple's official iTunes Search/RSS endpoints, and stores no logins. Review text and user names are personal data in some jurisdictions, so process them in line with the GDPR/CCPA and the stores' terms.

Found a bug or missing field? Open an issue on the Issues tab. We read every one.

# Actor input Schema

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

One per line, any mix of: App Store URL (https://apps.apple.com/us/app/…/id324684580), Google Play URL (https://play.google.com/store/apps/details?id=com.spotify.music), Apple numeric ID (324684580), Google Play package / iOS bundle ID (com.spotify.music), App Store or Google Play developer URL, or a plain search term ("meditation app"). Prefix with apple: or google: to restrict one line to one store (google:com.whatsapp). By default the matching app on the other store is found too (see "Find the other store's version").

## `stores` (type: `array`):

Which stores to search. Inputs that only exist on one store (a Play URL, an Apple ID) are looked up there, plus their counterpart on the other store if both are selected.

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

ISO 3166-1 alpha-2 codes (us, gb, de, jp …). Each app is fetched in every country: local rating, price, rank, version and that storefront's reviews. Use ALL for all 175 App Store storefronts. Google Play reviews are per language, so countries sharing a language share one review stream.

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

"auto" uses each country's main language (de for Germany, ja for Japan). Or force one language code for listings and Play reviews, e.g. en.

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

0 = no reviews (details only). Google Play: tens of thousands available. App Store: Apple's public feed returns up to 500 per storefront per sort order; with "App Store review depth" = max we merge the newest and most-helpful feeds (up to ~1,000) per storefront. Add countries for more.

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

Order in which reviews are fetched. App Store supports newest and most helpful; "By rating" applies to Google Play (App Store falls back to newest — use the star filter instead).

## `reviewRatings` (type: `array`):

Leave empty for all. Google Play filters on the server (fast); App Store filters locally.

## `reviewsFrom` (type: `string`):

Keep reviews on/after this date: YYYY-MM-DD, an ISO timestamp, or relative such as "30 days" / "2 weeks". With newest-first sorting the scraper stops paging once it passes this date.

## `reviewsTo` (type: `string`):

Keep reviews on/before this date (same formats).

## `reviewKeywords` (type: `array`):

Keep only reviews whose title or text contains at least one of these words (case-insensitive).

## `minReviewLength` (type: `integer`):

Keep only reviews whose text has at least this many characters (0 = no minimum).

## `minThumbsUp` (type: `integer`):

Keep only reviews with at least this many thumbs-up / helpful votes.

## `developerReplyFilter` (type: `string`):

Developer replies are public on Google Play only.

## `reviewAppVersions` (type: `array`):

e.g. 9.0.86 — prefix match, so 9.0 keeps every 9.0.x review.

## `appleReviewDepth` (type: `string`):

Apple serves max 500 reviews per storefront per sort order. Max merges the newest and most-helpful feeds (≈1,000 unique per storefront). Auto does that when you ask for more than 500 or filter by stars/keywords.

## `analyzeTopics` (type: `boolean`):

Tag every review with topics (bugs/crashes, pricing, ads, login, UI, performance, support, feature requests …) and a sentiment score, and add one free "insights" summary per app stream: rating mix, top complaint topics with example quotes, complaint/praise phrases, per-version averages and reply rate. Deterministic keyword rules — no AI API, no extra cost.

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

Full app record per store per country: rating + histogram, rating count, installs, price/IAP, version + release notes, version history, size, content rating, privacy labels / data safety, developer contact, screenshots, similar apps.

## `includeChartRanks` (type: `boolean`):

Look each app up in its store's top free / paid / grossing charts (overall and its own category, top 200) in every country and add chartRanks.

## `includeDataSafety` (type: `boolean`):

Add the Google Play "Data safety" section (data shared, data collected, security practices) as privacy.

## `includePermissions` (type: `boolean`):

Add the Google Play permission list (e.g. "Location: precise location") to each Google Play app.

## `includeSimilarApps` (type: `boolean`):

Off: first 10 similar apps. On: up to 50.

## `findCounterpart` (type: `boolean`):

For an Apple-only or Play-only input, find the same app on the other store (same developer + title match, confidence reported). Skipped for lines with an apple:/google: prefix.

## `maxResultsPerSearch` (type: `integer`):

For search-term inputs: how many top search results per store to include (1 = best match only).

## `maxAppsPerDeveloper` (type: `integer`):

For developer URL inputs: max apps of that developer to include per store.

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

One per line: store:chart\[:category]. Charts: topFree, topPaid, topGrossing (both stores); newFree, newPaid, topFreeIpad, topPaidIpad, topGrossingIpad (App Store). Category: Apple genre ID (6014 = Games, 7012 = Puzzle) or Play category (GAME_PUZZLE, HEALTH_AND_FITNESS). Omit the store for both: "topFree". Fetched for every country above.

## `chartDepth` (type: `integer`):

Positions per chart (App Store feed max ~100–200, Google Play max 200).

## `outputMode` (type: `string`):

Every run remembers what it saw (named key-value store). Schedule the same input daily and pick "Only new" to get just new reviews, or "changes" for new versions, price/rating changes, rank moves and apps dropping out of charts. You are only charged for items that are output.

## `monitorKey` (type: `string`):

Optional name for this monitor's memory. Default: derived from apps + charts + stores + countries, so a changed input starts fresh. Set it to keep history while editing the input.

## `stateStoreName` (type: `string`):

Named key-value store that keeps the monitor memory between runs.

## `maxConcurrency` (type: `integer`):

Parallel requests. The default is gentle on the stores; raise it only for large runs.

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

Not needed for normal use — all endpoints are public. Use a proxy only for very large runs.

## `includeRaw` (type: `boolean`):

Debug: keep a raw copy of selected source fields on each item.

## Actor input object example

```json
{
  "apps": [
    "https://apps.apple.com/us/app/instagram/id389801252",
    "com.spotify.music",
    "Duolingo",
    "google:com.whatsapp"
  ],
  "stores": [
    "apple",
    "google"
  ],
  "countries": [
    "us",
    "gb"
  ],
  "language": "auto",
  "maxReviewsPerApp": 100,
  "reviewSort": "newest",
  "minReviewLength": 0,
  "minThumbsUp": 0,
  "developerReplyFilter": "all",
  "appleReviewDepth": "auto",
  "analyzeTopics": true,
  "includeAppDetails": true,
  "includeChartRanks": false,
  "includeDataSafety": true,
  "includePermissions": false,
  "includeSimilarApps": false,
  "findCounterpart": true,
  "maxResultsPerSearch": 1,
  "maxAppsPerDeveloper": 50,
  "charts": [
    "apple:topFree",
    "google:topGrossing:GAME",
    "apple:topPaid:6014"
  ],
  "chartDepth": 100,
  "outputMode": "all",
  "stateStoreName": "app-intel-monitor",
  "maxConcurrency": 6,
  "proxyConfiguration": {
    "useApifyProxy": false
  },
  "includeRaw": false
}
```

# Actor output Schema

## `apps` (type: `string`):

One item per app per store per country: metadata, rating and histogram, installs, price/IAP, privacy or data-safety labels, chart ranks and the change status since the last run. Switch views for reviews, changes, versions, charts and insights.

## `reviews` (type: `string`):

The same dataset shown with the Reviews view: store, country, app, rating, title, text, date, version, topic tags and sentiment.

## `changes` (type: `string`):

The same dataset shown with the 'Changes since last run' view (new and changed apps, reviews and chart positions).

## `charts` (type: `string`):

The same dataset shown with the Top charts view (chart, category, rank and rank change).

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

JSON summary of the run: resolved and unresolved inputs, totals per item type, new/changed/unchanged counts, charged events, notes and errors.

# 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": [
        "Duolingo",
        "com.spotify.music"
    ],
    "countries": [
        "us",
        "gb"
    ],
    "maxReviewsPerApp": 100,
    "proxyConfiguration": {
        "useApifyProxy": false
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("chaptersoft/app-intel-app-store-google-play").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": [
        "Duolingo",
        "com.spotify.music",
    ],
    "countries": [
        "us",
        "gb",
    ],
    "maxReviewsPerApp": 100,
    "proxyConfiguration": { "useApifyProxy": False },
}

# Run the Actor and wait for it to finish
run = client.actor("chaptersoft/app-intel-app-store-google-play").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": [
    "Duolingo",
    "com.spotify.music"
  ],
  "countries": [
    "us",
    "gb"
  ],
  "maxReviewsPerApp": 100,
  "proxyConfiguration": {
    "useApifyProxy": false
  }
}' |
apify call chaptersoft/app-intel-app-store-google-play --silent --output-dataset

```

## MCP server setup

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

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/HKje1ZZIriJdy81wS/builds/xV5W5kptuWpeLY01F/openapi.json
