# Competitor App Reviews Analysis Scraper - Compare Apps (`vonsensey/competitor-app-reviews-analysis-scraper`) Actor

Put several competing apps side by side: reviews from both stores for every app on your list in one dataset with identical columns, plus one profile row per app with average rating, star histogram, installs and current version. Filter to 1-3 stars to read what users leave a rival over.

- **URL**: https://apify.com/vonsensey/competitor-app-reviews-analysis-scraper.md
- **Developed by:** [Blackcube Agency AB](https://apify.com/vonsensey) (community)
- **Categories:** Developer tools, Marketing, E-commerce
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $3.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.
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?

Actors are web data automations that power AI and operations. They run on the Apify platform to scrape websites, process data, connect APIs, and automate workflows.
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.
Actors are written with capital "A".

## 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.
The best way to integrate Actors is as follows.

- **AI agents and MCP clients** — the [Apify MCP server](https://docs.apify.com/integrations/mcp.md) at `https://mcp.apify.com` (remote, streamable HTTP, OAuth on first use).
- **Agentic workflows and local Actor development** — [Agent Skills](https://apify.com/.well-known/agent-skills/index.json) with the [Apify CLI](https://docs.apify.com/cli/docs.md): `npm install -g apify-cli`, then `apify login`.
- **JavaScript/TypeScript projects** — the official [JS/TS client](https://docs.apify.com/api/client/js/docs.md): `npm install apify-client`.
- **Python projects** — the official [Python client](https://docs.apify.com/api/client/python/docs.md): `pip install apify-client`.
- **Any other language** — the [REST API](https://docs.apify.com/api/v2.md).

For usage examples, see the [API](#api) section below.

For more details, see Apify documentation as [Markdown index](https://docs.apify.com/llms.txt) and [Markdown full-text](https://docs.apify.com/llms-full.txt).

# README

## Competitor App Reviews Analysis Scraper - Compare Apps

<table style="border-collapse:collapse;width:100%;margin:0 0 4px">
<tr><td colspan="3" style="padding:9px 12px;background:#0B6E75;border:1px solid #0B6E75"><span style="color:#FFFFFF;font-weight:700;font-size:13px;letter-spacing:.3px">App Store &amp; Google Play Reviews Suite</span><span style="color:#CFF0F2;font-size:12px"> &nbsp;&bull;&nbsp; 2 Actors, one codebase, one review billed once</span></td></tr>
<tr><td style="padding:9px 12px;border:1px solid #E5E7EB;background:#FFFFFF;vertical-align:top;width:33%"><a href="https://apify.com/vonsensey/app-store-google-play-reviews-scraper" style="color:#111827;font-weight:700;font-size:13px;text-decoration:none">App Store &amp; Google Play Reviews Scraper API</a><br><span style="color:#6B7280;font-size:11px">iOS &amp; Android</span></td><td style="padding:9px 12px;border:1px solid #E5E7EB;background:#ECFDF5;vertical-align:top;width:33%"><span style="color:#0B6E75;font-weight:700;font-size:13px">Competitor App Reviews Analysis Scraper</span><br><span style="color:#0B6E75;font-size:11px;font-weight:600">&#10148; You are here</span></td></tr>
</table>

**More from this account:** [YouTube Transcript Suite](https://apify.com/vonsensey/youtube-transcript-scraper) · [Website Contact & Email Suite](https://apify.com/vonsensey/website-contact-email-extractor) · [Career Site & ATS Jobs Suite](https://apify.com/vonsensey/career-page-job-postings-scraper-api) · [Google News Suite](https://apify.com/vonsensey/google-news-scraper-api) · [Keyword Research Suite](https://apify.com/vonsensey/google-keyword-ideas-scraper) · [Shopify Store Intelligence Suite](https://apify.com/vonsensey/shopify-store-leads-scraper) · [eBay Data Suite](https://apify.com/vonsensey/ebay-scraper-api) · [Amazon Reviews Suite](https://apify.com/vonsensey/amazon-reviews-scraper-api) · [Reddit](https://apify.com/vonsensey/reddit-scraper-posts-comments-api) · [Meta Ad Library](https://apify.com/vonsensey/facebook-ads-library-scraper-meta-ad-api) · [Vinted](https://apify.com/vonsensey/vinted-scraper-api) · [Trustpilot Review Intelligence Suite](https://apify.com/vonsensey/trustpilot-reviews-scraper)

Put several competing apps side by side: reviews from both stores for every app on your list in one dataset with identical columns, plus one profile row per app with average rating, star histogram, installs and current version. Filter to 1-3 stars to read what users leave a rival over.

### Why this one

**Both stores, one shape.** Paste App Store and Google Play links, ids or package names into one list and get one dataset where an iOS review and an Android review have exactly the same columns — `rating`, `text`, `publishedDate`, `appVersion`, `replyText`, `helpfulCount`, `country`, `language`. No joining two exports with different field names.

**It goes well past the 500-review feed.** Apple's public review feed stops at 500 per storefront, and most tools stop there with it. This Actor reads that feed in both of its sort orders and then continues into the store's deep catalog, the same source the App Store's own review page uses. Measured on the platform: **3,798 distinct reviews for one app in one storefront**, in one run. On Google Play it reads 1,000 reviews per request and was measured to 30,000 with no end in sight.

**Every storefront in one run.** App Store reviews are published per country, and the same app has a different set in each of the 175 storefronts. Enter `all` and the run walks every one of them and returns a single deduplicated dataset with the storefront on every row. Measured: **175 of 175 storefronts in 58 seconds, zero errors.**

**It tells you what it could not reach.** Every app gets a free coverage row: partitions asked for, partitions read, partitions where the store's own ceiling was hit, and partitions your own cap stopped early — two different facts, reported as two different fields. No rival in this category emits any completeness signal.

**Developer replies, app version, helpful votes, review tags.** The developer's reply with its date on both stores, the app version the review was written on, helpful-vote counts, and Google Play's structured review tags (performance, battery, usability and so on) that no other listing returns.

**A schedule does not re-bill you for history.** Turn on change tracking and the Actor remembers every review id it has delivered, so tomorrow's run charges for tomorrow's reviews. There is no run-start fee, so a daily watch on a quiet app costs nothing on a quiet day.

**Filters are applied before you pay.** Star ratings, a date window, app versions, a keyword, replied-only — a review your filter drops is never charged. On Google Play the star filter is applied by the store itself, so a 1-star pull never reads the 5-star reviews at all.

### What people use it for

- **Release monitoring.** Put your apps on a daily schedule with change tracking on and get the reviews that appeared since the last run, with the app version on each one, so "the update broke login" reaches you the morning it is written.
- **Competitor research.** Pull the 1 and 2 star reviews for three rival apps on both stores and read, in their users' words, what makes people leave.
- **Feeding a sentiment or topic model.** Review text with rating, version, date, storefront and language attached, deduplicated, in one schema for iOS and Android.
- **App and developer data.** One profile row per app with rating, star histogram, installs, version, release notes and the developer's published email, website, address and phone — without paying for review text you do not need.

### Getting started

Paste one app per line into **Apps** — App Store or Google Play links, Apple ids or Android package
names, mixed freely — set how many reviews you want per app, and run it. This listing starts already configured for several apps side by side, profile row per app; every other option is still available.

### Recipes

#### Both stores for one app, newest first

```json
{
  "apps": [
    "https://apps.apple.com/us/app/whatsapp-messenger/id310633997",
    "https://play.google.com/store/apps/details?id=com.whatsapp"
  ],
  "maxReviewsPerApp": 500
}
```

#### Every App Store storefront, merged and deduplicated

```json
{
  "apps": ["310633997"],
  "countries": ["all"],
  "maxReviewsPerApp": 0
}
```

`0` means as much as the Actor can reach. The coverage row names any storefront it did not finish.

#### Just the complaints, with the developer's answer

```json
{
  "apps": ["com.whatsapp", "310633997"],
  "ratings": ["1", "2"],
  "maxReviewsPerApp": 1000
}
```

#### A daily watch over your apps, billed only for new reviews

```json
{
  "apps": ["com.yourcompany.app", "https://apps.apple.com/us/app/id123456789"],
  "onlyNewSinceLastRun": true,
  "stateLabel": "our-apps",
  "reviewsSince": "2026-08-01"
}
```

#### What broke in the last release

```json
{
  "apps": ["com.whatsapp"],
  "appVersions": ["2.26.32.83", "2.26.32.84"],
  "ratings": ["1", "2", "3"]
}
```

#### App data only, no review text

```json
{
  "apps": ["com.whatsapp", "310633997", "org.telegram.messenger", "686449807"],
  "appProfilesOnly": true
}
```

One or two requests per app. Rating, histogram, installs, version, release notes and developer contact details, and no review charges at all.

### Input reference

| Field | What it does |
|---|---|
| `apps` | App Store URLs, Google Play URLs, Apple app ids or Android package names, one per line |
| `stores` | both, App Store only, or Google Play only |
| `maxReviewsPerApp` | per-app cap across all its storefronts and languages; 0 means as much as the Actor can reach |
| `maxReviews` | ceiling across the whole run |
| `countries` | App Store storefronts, or `all` for every one of the 175 |
| `languages` | Google Play languages; each is a separate set of reviews |
| `appStoreSource` | feed then catalog (default), feed only, or catalog only |
| `includeAppProfile` | add the app intelligence row (charged separately) |
| `appProfilesOnly` | app rows only, no reviews and no review charges |
| `ratings` | keep only these star ratings; applied by Google Play before billing |
| `sort` | newest first, most helpful first, or by rating (Google Play) |
| `reviewsSince` / `publishedBefore` | date window; newest-first runs stop early at the bound |
| `appVersions` | only reviews written on these versions |
| `searchTerm` | only reviews mentioning this word |
| `onlyWithReplies` | keep only reviews the developer answered |
| `onlyNewSinceLastRun` + `stateLabel` | change tracking for scheduled runs |
| `maxCostUsd` | hard spending ceiling for the run |

### What you get

Each review row, identical for both stores:

| Field | What it is |
|---|---|
| `store` | `app-store` or `google-play` |
| `appId`, `appName` | the Apple app id or Android package name, and the app's name |
| `rating` | 1 to 5 stars |
| `title`, `text` | the review as written (Google Play reviews have no title) |
| `publishedDate` | ISO timestamp |
| `appVersion` | the version the review was written on, where the store publishes it |
| `country` | the App Store storefront, or the country the Google Play profile was read under |
| `language` | the Google Play language partition the review was read from |
| `reviewerName`, `reviewerUrl`, `reviewerImage` | who wrote it |
| `helpfulCount`, `voteCount` | helpful votes (App Store net votes and total; Google Play thumbs-up) |
| `hasReply`, `replyText`, `replyDate` | the developer's public answer |
| `isEdited` | whether the reviewer edited it (App Store catalog) |
| `reviewTags` | Google Play's structured tags, e.g. `vaf_app_quality_performance: 1` |
| `appRating`, `appRatingCount` | the app's average rating and count, flat on every row so a spreadsheet needs no joins |
| `reviewUrl`, `reviewId` | a stable id, and a link on Google Play |

Each app profile row:

| Field | What it is |
|---|---|
| `rating`, `ratingCount`, `reviewCount` | the headline numbers; `reviewCount` is written reviews, where the store publishes it |
| `ratingOne` … `ratingFive` | the exact star histogram (Google Play) |
| `installs`, `minInstalls`, `maxInstalls` | install counts (Google Play) |
| `developerName`, `developerId`, `developerUrl` | who publishes it |
| `developerEmail`, `developerWebsite`, `developerAddress`, `developerPhone` | the contact details the developer publishes on the store listing |
| `category`, `categories`, `price`, `currency`, `isFree` | classification and price |
| `version`, `releaseNotes`, `updatedDate`, `releasedDate` | the current release |
| `contentRating`, `minimumOsVersion`, `fileSizeBytes`, `languages` | requirements |
| `hasInAppPurchases`, `inAppPurchaseRange`, `adSupported` | monetisation flags |
| `bundleId`, `appUrl`, `iconUrl`, `description`, `screenshotCount` | identity |

And one free coverage row per app:

| Field | What it is |
|---|---|
| `reviewsReturned` | what you got |
| `partitionedBy` | `country` for the App Store, `language` for Google Play |
| `partitionsRequested`, `partitionsWalked`, `partitionsWithReviews` | how much of what you asked for was read |
| `cappedPartitions` | partitions where the store's own ceiling was reached and more exists |
| `unfinishedPartitions` | partitions your cap, budget or a store error stopped early |
| `requests`, `stoppedBecause` | how much work it took and why it stopped |

Fields a store does not publish are `null`, never `0` or a guess.

### Run it on a schedule

This is built to be put on a cron. Set `onlyNewSinceLastRun` to true and give `stateLabel` a
name — for example `our-apps` — and reuse that exact label on every run. The Actor keeps the ids
of every review it has already handed you, so a scheduled run delivers and charges for new reviews
only. There is no run-start fee, so a morning where nobody reviewed you costs nothing.

In Apify, open the Actor, choose **Schedules**, and add one — `0 7 * * *` runs it every day at
07:00 UTC. Set `reviewsSince` as well and a newest-first run stops paging the moment it gets past
the date, which keeps a daily run to a handful of requests per app.

### Pricing

| Charged for | Free | Bronze | Silver | Gold | Platinum | Diamond |
|---|---|---|---|---|---|---|
| 1,000 reviews | $6.00 | $5.40 | $3.90 | $3.00 | $2.80 | $2.60 |
| 1,000 app profiles | $16.00 | $13.50 | $10.30 | $8.00 | $7.40 | $6.80 |

The Store card shows the Gold tier. So 1,000 reviews is **$3.00**
on Gold, and an app profile is **$8.00 per 1,000**.

There is **no charge for starting a run**, and these are always free:

- apps that cannot be found, and anything else that produced no data
- reviews excluded by your own filters
- the per-app coverage report
- every diagnostic row explaining why something returned nothing

### FAQ

#### How do I export App Store or Google Play reviews to CSV or Excel?

Run the Actor, open the run's **Storage** tab and choose CSV, Excel or JSON. The dataset ships
with a reviews view, an app-profiles view and a coverage view, so the export already has sensible
columns. Both stores share one column set, so one file holds iOS and Android together.

#### Can I get more than 500 App Store reviews for an app?

Yes. Apple's public review feed serves 500 per storefront and sort order, and that is where most
tools stop. This Actor reads the feed in both sort orders and then continues into the store's deep
catalog. Measured on one app in one storefront: 3,798 distinct reviews in a single run. How deep
the catalog goes varies by app; every run reports what it reached in the coverage row, and no
number is promised that was not measured.

#### Can I scrape App Store reviews from all countries at once?

Yes. Set `countries` to `all` and the run reads every one of the 175 storefronts, deduplicates
across them, and puts the storefront on every row. Measured: all 175 walked in 58 seconds.

#### Does it return the developer's reply?

Yes — `replyText` and `replyDate` on any review that has one, and `hasReply` to filter on. On
Google Play replies come with the review feed. On the App Store only the deep catalog publishes
them, so `onlyWithReplies` reads that source.

#### Why do Google Play reviews change with the language and not the country?

Because that is how Google Play partitions them: the English, German and Spanish review sets for
the same app share no reviews at all, while the same language read from different countries returns
identical ids. So `languages` is what decides which Google Play reviews you get; `countries` only
chooses which country's rating snapshot goes on the app profile.

#### Does it return the app version for each review?

Yes, where the store publishes it — on the App Store feed and on Google Play. Reviews read from the
App Store's deep catalog do not carry a version, and `appVersion` is `null` on those rather than
a guess. Measured fill rates on the platform: 90–99% on feed and Google Play rows.

#### Do I need an Apple or Google API key?

No. Both stores publish their reviews openly. The official developer APIs only cover your own apps
— and Google's serves only the last seven days — so a research or competitor use case needs a
scraper anyway. Nothing here expires and there is nothing to apply for.

#### What does a run actually cost?

You pay per review delivered, and per app profile if you keep that on. A run that returns 1,000
reviews on the Gold tier costs $3.00. Reviews filtered out by your settings, apps that cannot be
found, error rows and the coverage report are free, and there is no charge for starting a run. The
free Apify plan runs it exactly like a paid one.

#### Will a daily schedule bill me for the same reviews again?

Not with `onlyNewSinceLastRun` on. The Actor remembers the review ids it has delivered under your
`stateLabel` and skips them, so you are charged for new reviews only.

#### Is this an official Apple or Google tool?

No. It is an independent Actor that reads publicly available review pages and feeds. It is not
affiliated with, endorsed by, or connected to Apple or Google in any way.

### Notes and limits

- **Unofficial.** Not affiliated with, endorsed by, or connected to Apple Inc. or Google LLC. "App
  Store" and "Google Play" are used only to say which public stores this Actor reads.
- **Public data only.** It reads what any visitor to the store can open. It does not log in, and it
  collects no private or login-gated data.
- **Personal data.** Reviews carry the display name the reviewer chose to publish. If you process
  them for people in the EU/UK, that is personal data and the GDPR applies to what you do with it —
  you are the controller of your copy.
- **Ratings without text.** Both stores count star-only ratings that carry no review, and neither
  serves them as rows. The app profile carries the rating count and, on Google Play, the written
  review count, so the gap is visible up front.
- **Depth is measured, not promised.** The App Store's deep catalog varies by app; the coverage row
  says what was reached. Google Play was measured to 30,000 reviews for one app with no end found.
- **No proxy needed.** Both stores were read directly from Apify's network in every measured run.
  The proxy option is there for the day that changes.

### Support

Something wrong, or a field you need? Open an issue on the
[Actor's issues tab](https://apify.com/vonsensey/competitor-app-reviews-analysis-scraper/issues) and it gets looked at.

The full-featured version of this engine is [App Store & Google Play Reviews Scraper API - iOS & Android](https://apify.com/vonsensey/app-store-google-play-reviews-scraper).

> **Run it without configuring anything** — [Compare competitor app reviews side by side](https://apify.com/vonsensey/competitor-app-reviews-analysis-scraper/examples/compare-competitor-app-reviews), a ready-made example you can start as-is or copy.

### Use cases

- **Release monitoring.** Put your apps on a daily schedule with change tracking on and get only the reviews that appeared since the last run, with the app version on each one.
- **Competitor research.** Pull the 1 and 2 star reviews for rival apps on both stores and read, in their users' words, what makes people leave.
- **Feed a sentiment or topic model.** Review text with rating, version, date, storefront and language attached, deduplicated, in one schema for iOS and Android.
- **App and developer data.** One profile row per app with rating, star histogram, installs, version, release notes and the developer's published contact details, without paying for review text.

### Run it on a schedule

A one-off pull answers a question; a schedule answers it every day without you. Open **Schedules** in the Apify Console, point a cron at this Actor, and the dataset keeps filling on its own — no server, no cron box, no babysitting. Everything here is built to be re-run: you are billed per review delivered, so a scheduled run that finds nothing new costs nothing.

### FAQ

#### How do I export App Store and Google Play reviews to CSV or Excel?

Run it, then open the run's Storage tab and pick CSV, Excel or JSON. Both stores share one column set, so one file holds iOS and Android reviews together.

#### Can I get more than 500 App Store reviews for one app?

Yes. Apple's public feed stops at 500 per storefront and that is where most tools stop. This suite reads the feed in both sort orders and then continues into the store's deep catalog — measured at 3,798 distinct reviews for one app in one storefront. Every run reports what it reached in a free coverage row.

#### Can I scrape App Store reviews from all countries at once?

Yes. Set countries to all and the run reads every one of the 175 storefronts, deduplicates across them and puts the storefront on every row. Measured: all 175 in 58 seconds.

#### Will a daily schedule bill me for the same reviews twice?

No, with change tracking on. The Actor remembers the review ids it has already delivered under your tracking label and skips them, so you are charged for new reviews only. There is no run-start fee, so a quiet day costs nothing.

***

Something wrong, or a field you need that is missing? Open an issue on the **Issues** tab — it is read and it gets fixed. If this saved you time, a rating on the Store page helps the next person find it.

# Actor input Schema

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

One app per line, from either store: an App Store URL (https://apps.apple.com/us/app/whatsapp-messenger/id310633997), a Google Play URL (https://play.google.com/store/apps/details?id=com.whatsapp), a bare Apple app id (310633997) or a bare Android package name (com.whatsapp). Mix both stores freely. An app that cannot be found comes back as a free error row instead of failing the run.

## `stores` (type: `string`):

Collect from both stores, or only one. Apps from a store that is switched off are reported as a free row and never charged.

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

Stop after this many reviews for each app, across all its storefronts and languages. Set 0 for everything this Actor can reach: on the App Store it reads the newest-first feed in both sort orders and then the store's deep catalog, which goes well past the 500-per-storefront limit other tools stop at. Every run reports exactly what it reached and what it could not.

## `maxReviews` (type: `integer`):

Hard ceiling across every app in the run. 0 means no overall limit.

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

Two-letter storefront codes such as us, gb, de, jp — App Store reviews are published per storefront, and the same app has a completely different set in each one. Enter all to read every one of the 175 storefronts in a single run and get one merged, deduplicated dataset. For Google Play this only chooses which country's rating snapshot goes on the app profile; Play reviews are split by language, not country.

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

Two-letter language codes such as en, de, es, pt. Google Play serves a separate set of reviews for each language — en, de and es for the same app share no reviews at all — so add every language you want covered. Leave it at en for English only.

## `appStoreSource` (type: `string`):

Feed then catalog reads the newest-first feed (fast, 500 per storefront and sort order, carries the app version) and continues into the store's deep catalog only where the feed hit its ceiling. Feed only stops at the feed. Catalog only reads the deep catalog alone — it is the only source that carries developer replies, and it is what a replied-only run uses.

## `includeAppProfile` (type: `boolean`):

Add one app intelligence row per app: average rating and rating count, the 1-to-5 star histogram and install counts where the store publishes them, developer name and the developer's published email, website, address and phone, category, price, current version and release notes, release and last-update dates, content rating, minimum OS and size. Turn it off and it is never charged.

## `appProfilesOnly` (type: `boolean`):

Return just the app intelligence row for each app and skip the reviews entirely — rating, histogram, installs, developer contact details, version. One or two requests per app and no review charges.

## `ratings` (type: `array`):

Only return reviews with these star ratings. Leave empty for all of them. On Google Play the store applies this itself, so a 1-star pull never reads the 5-star reviews at all.

## `sort` (type: `string`):

Newest first is what a monitor wants and is what lets a date bound stop the run early. Most helpful surfaces the reviews other users voted up. By rating is a Google Play order only; the App Store feed falls back to newest first.

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

A date such as 2026-01-31. Older reviews are skipped and never charged, and on a newest-first run the Actor stops paging as soon as it gets past the date. Ideal on a schedule.

## `publishedBefore` (type: `string`):

Upper bound on the publication date, for a fixed historical window.

## `appVersions` (type: `array`):

Only reviews written on these app versions, exactly as the store shows them, for example 4.2.1. Useful for "what broke in the last release". Not every review carries a version; those are skipped by this filter.

## `searchTerm` (type: `string`):

Only keep reviews whose title or text contains this word, for example crash, refund or login. Reviews without it are never charged.

## `onlyWithReplies` (type: `boolean`):

Keep only reviews that carry a developer reply. On the App Store this switches to the catalog feed, the only one that publishes replies.

## `onlyNewSinceLastRun` (type: `boolean`):

Remember which reviews were already delivered and skip them next time, so a daily or weekly schedule only ever charges for genuinely new feedback. Needs a tracking label below.

## `stateLabel` (type: `string`):

A name for this watch list, for example our-apps. Reuse exactly the same label on every run so the Actor knows which history to compare against. A different label is a separate, independent memory.

## `maxCostUsd` (type: `integer`):

A hard spending ceiling for this run. The run stops delivering once it would exceed it. Leave empty for no ceiling.

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

Leave this off. Both stores publish their reviews openly and are read directly from Apify's own network. Only change it if you have a specific reason.

## Actor input object example

```json
{
  "apps": [
    "https://apps.apple.com/us/app/whatsapp-messenger/id310633997",
    "https://play.google.com/store/apps/details?id=com.whatsapp",
    "https://apps.apple.com/us/app/telegram-messenger/id686449807",
    "https://play.google.com/store/apps/details?id=org.telegram.messenger",
    "https://apps.apple.com/us/app/signal-private-messenger/id874139669",
    "https://play.google.com/store/apps/details?id=org.thoughtcrime.securesms"
  ],
  "stores": "both",
  "maxReviewsPerApp": 200,
  "maxReviews": 0,
  "countries": [
    "us",
    "gb"
  ],
  "languages": [
    "en"
  ],
  "appStoreSource": "both",
  "includeAppProfile": true,
  "appProfilesOnly": false,
  "ratings": [],
  "sort": "newest",
  "appVersions": [],
  "onlyWithReplies": false,
  "onlyNewSinceLastRun": false,
  "stateLabel": "my-watchlist",
  "proxyConfiguration": {
    "useApifyProxy": false
  }
}
```

# Actor output Schema

## `reviews` (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/whatsapp-messenger/id310633997",
        "https://play.google.com/store/apps/details?id=com.whatsapp",
        "https://apps.apple.com/us/app/telegram-messenger/id686449807",
        "https://play.google.com/store/apps/details?id=org.telegram.messenger",
        "https://apps.apple.com/us/app/signal-private-messenger/id874139669",
        "https://play.google.com/store/apps/details?id=org.thoughtcrime.securesms"
    ],
    "maxReviewsPerApp": 200,
    "countries": [
        "us",
        "gb"
    ],
    "languages": [
        "en"
    ],
    "stateLabel": "my-watchlist"
};

// Run the Actor and wait for it to finish
const run = await client.actor("vonsensey/competitor-app-reviews-analysis-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/whatsapp-messenger/id310633997",
        "https://play.google.com/store/apps/details?id=com.whatsapp",
        "https://apps.apple.com/us/app/telegram-messenger/id686449807",
        "https://play.google.com/store/apps/details?id=org.telegram.messenger",
        "https://apps.apple.com/us/app/signal-private-messenger/id874139669",
        "https://play.google.com/store/apps/details?id=org.thoughtcrime.securesms",
    ],
    "maxReviewsPerApp": 200,
    "countries": [
        "us",
        "gb",
    ],
    "languages": ["en"],
    "stateLabel": "my-watchlist",
}

# Run the Actor and wait for it to finish
run = client.actor("vonsensey/competitor-app-reviews-analysis-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/whatsapp-messenger/id310633997",
    "https://play.google.com/store/apps/details?id=com.whatsapp",
    "https://apps.apple.com/us/app/telegram-messenger/id686449807",
    "https://play.google.com/store/apps/details?id=org.telegram.messenger",
    "https://apps.apple.com/us/app/signal-private-messenger/id874139669",
    "https://play.google.com/store/apps/details?id=org.thoughtcrime.securesms"
  ],
  "maxReviewsPerApp": 200,
  "countries": [
    "us",
    "gb"
  ],
  "languages": [
    "en"
  ],
  "stateLabel": "my-watchlist"
}' |
apify call vonsensey/competitor-app-reviews-analysis-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,vonsensey/competitor-app-reviews-analysis-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/1eOH6LguZa5w9VoP8/builds/dxrJqPtbIz9lBb4TP/openapi.json
