# Reviewbot Universal Review Scraper (`reviewbot/universal-review-scraper`) Actor

Extract app reviews from Google Play, Apple App Store, and Microsoft Store using a single actor. Supports filters like ratings, dates, country, and webhooks. Ideal for unified review monitoring, analytics, and cross-platform insights.

- **URL**: https://apify.com/reviewbot/universal-review-scraper.md
- **Developed by:** [reviewbot](https://apify.com/reviewbot) (community)
- **Categories:** Automation, Developer tools, Other
- **Stats:** 16 total users, 2 monthly users, 98.2% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

$0.05 / 1,000 paid\_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?

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

## Universal App Review Scraper

Extract reviews from Google Play, Apple App Store, Microsoft Store, and Tencent Application宝 (China) with a single actor.

### What This Actor Does

The Universal App Review Scraper is an all-in-one solution for extracting user reviews from mobile and desktop applications across the four major app stores. Whether you're a product manager analyzing user feedback, a developer monitoring app reputation, or a researcher studying app store ecosystems, this actor provides a unified interface to access review data from any platform.

**Perfect for:**

- 📱 **App Developers** - Monitor user feedback across all platforms where your app is published
- 📊 **Product Managers** - Analyze user sentiment and feature requests from real app store reviews
- 🔍 **Market Researchers** - Study competitor apps and market trends across mobile and desktop platforms
- 🏢 **Digital Agencies** - Provide comprehensive app analytics and reputation monitoring for clients
- 📈 **Data Scientists** - Gather large-scale review datasets for sentiment analysis and ML projects
- 🇨🇳 **China Market Analysts** - Access reviews from Tencent Application宝, the leading app store in China

**Why Use This Actor:**

- **Single Solution**: One actor handles all four major app stores (Google Play, Apple App Store, Microsoft Store, Tencent)
- **Consistent Data Format**: Standardized output regardless of source platform
- **Advanced Filtering**: Filter by ratings, dates, countries, and languages
- **China Market Access**: Scrape reviews from Tencent Application宝 with automatic translation
- **High Performance**: Optimized for speed with built-in rate limiting and error handling
- **Rich Metadata**: Extract detailed information like app versions, helpfulness scores, and platform-specific data

### Quick Start

#### Using Apify Console

1. Go to [Apify Console](https://console.apify.com/actors/e9bEKZerOg2LjDyjp)
2. Configure input parameters and run

#### Using Apify CLI

```bash
npm install -g apify-cli
apify run e9bEKZerOg2LjDyjp --input='{"store": "google", "appId": "com.whatsapp", "limit": 50}'
```

### Input Parameters

#### Required Parameters

| Parameter | Type | Description |
|-----------|------|-------------|
| `store` | string | Platform to scrape: `"google"`, `"apple"`, `"microsoft"`, or `"tencent"` |
| `appId` | string | App identifier (format varies by store - see below) |

#### Optional Parameters

| Parameter | Type | Default | Description |
|-----------|------|---------|-------------|
| `limit` | number | 100 | Maximum number of reviews to extract |
| `ratings` | array | \[1,2,3,4,5] | Filter by star ratings (e.g., `[4,5]` for good reviews only) |
| `startDate` | string | - | Extract reviews after this date (format: "2024-01-01") |
| `endDate` | string | - | Extract reviews before this date (format: "2024-12-31") |

#### Store-Specific Parameters

Different stores accept different parameters. Here's what works with each:

##### Google Play (`"google"`)

- ✅ `country` (string) - Country code like `"us"`, `"gb"`, `"de"` or `"auto"` for automatic detection
- ✅ `language` (string) - Language code like `"en"`, `"es"`, `"fr"`
- ℹ️ Uses package names as `appId` (e.g., `"com.whatsapp"`)

##### Apple App Store (`"apple"`)

- ✅ `country` (string) - Country code like `"us"`, `"gb"`, `"de"`
- ❌ Language selection not supported (store-determined)
- ℹ️ Uses numeric IDs as `appId` (e.g., `"310633997"`)

##### Microsoft Store (`"microsoft"`)

- ✅ `market` (string) - Market code like `"US"`, `"GB"`, `"DE"` (note: uppercase)
- ✅ `locale` (string) - Locale like `"en-US"`, `"en-GB"`, `"de-DE"`
- ℹ️ Uses store IDs as `appId` (e.g., `"9nksqgp7f2nh"`)

##### Tencent Application宝 (`"tencent"`) 🇨🇳

- ✅ `translateTo` (string) - Translate Chinese reviews to another language (e.g., `"en"`, `"es"`, `"ja"`)
- ❌ Country selection not supported (China market only)
- ℹ️ Uses Android package names as `appId` (e.g., `"com.tencent.mm"`)
- 🌍 Reviews are in Chinese by default - use `translateTo: "en"` for English translation

#### Quick Reference: What Works Where?

| Feature | Google | Apple | Microsoft | Tencent |
|---------|--------|-------|-----------|---------|
| Country/Market | ✅ `country` | ✅ `country` | ✅ `market` | ❌ (China only) |
| Language/Locale | ✅ `language` | ❌ | ✅ `locale` | ✅ `translateTo` |
| Rating Filter | ✅ | ✅ | ✅ | ✅ |
| Date Range | ✅ | ✅ | ✅ | ✅ |

### App ID Formats

Each store uses a different format for identifying apps:

| Store | Format | How to Find | Example |
|-------|--------|-------------|---------|
| **Google Play** | Package name | Look in the URL: `play.google.com/store/apps/details?id=PACKAGE_NAME` | `com.whatsapp` |
| **Apple App Store** | Numeric ID | Look in the URL: `apps.apple.com/app/idNUMBER` | `310633997` |
| **Microsoft Store** | Store ID | Look in the URL: `apps.microsoft.com/detail/STORE_ID` | `9nksqgp7f2nh` |
| **Tencent** | Android package | Same as Google Play package name | `com.tencent.mm` |

### Usage Examples

#### Google Play Store

```json
{
  "store": "google",
  "appId": "com.whatsapp",
  "limit": 100,
  "language": "en",
  "country": "us"
}
```

#### Apple App Store

```json
{
  "store": "apple",
  "appId": "310633997",
  "limit": 50,
  "country": "us",
  "ratings": [4, 5]
}
```

#### Microsoft Store

```json
{
  "store": "microsoft", 
  "appId": "9nksqgp7f2nh",
  "limit": 200,
  "market": "US",
  "locale": "en-US"
}
```

#### Tencent Application宝 (China) 🇨🇳

```json
{
  "store": "tencent",
  "appId": "com.tencent.mm",
  "limit": 50,
  "translateTo": "en"
}
```

**Note**: Tencent reviews are in Chinese by default. Add `"translateTo": "en"` to automatically translate to English (or any other language code).

### Advanced Filtering Examples

#### Get Only Bad Reviews (1-2 stars)

Perfect for identifying user complaints and issues:

```json
{
  "store": "google",
  "appId": "com.instagram.android",
  "limit": 100,
  "ratings": [1, 2],
  "country": "us"
}
```

#### Get Recent Reviews Only

Extract reviews from the last month:

```json
{
  "store": "apple",
  "appId": "310633997",
  "limit": 50,
  "startDate": "2026-01-01",
  "endDate": "2026-01-31",
  "country": "us"
}
```

#### Tencent with Translation & Filters

Get highly-rated Chinese reviews in English:

```json
{
  "store": "tencent",
  "appId": "com.tencent.mm",
  "limit": 30,
  "ratings": [4, 5],
  "translateTo": "en",
  "startDate": "2026-01-01"
}
```

#### Microsoft Store - Specific Market

Get reviews from UK market only:

```json
{
  "store": "microsoft",
  "appId": "9nksqgp7f2nh",
  "limit": 100,
  "market": "GB",
  "locale": "en-GB",
  "ratings": [1, 2, 3, 4, 5]
}
```

### Using Apify SDK

#### Install SDK

```bash
npm install apify-client
```

#### JavaScript Example

```javascript
import { ApifyApi } from 'apify-client';

const client = new ApifyApi({
  token: 'YOUR_APIFY_TOKEN',
});

async function getReviews() {
  const run = await client.actor('e9bEKZerOg2LjDyjp').call({
    store: 'google',
    appId: 'com.whatsapp',
    limit: 100,
    language: 'en',
    country: 'us'
  });

  const { items } = await client.dataset(run.defaultDatasetId).listItems();
  console.log('Reviews:', items);
}

getReviews();
```

#### Python Example

```python
from apify_client import ApifyClient

client = ApifyClient('YOUR_APIFY_TOKEN')

run = client.actor('e9bEKZerOg2LjDyjp').call(run_input={
    'store': 'google',
    'appId': 'com.whatsapp', 
    'limit': 100,
    'language': 'en',
    'country': 'us'
})

items = client.dataset(run['defaultDatasetId']).list_items().items
print(f"Downloaded {len(items)} reviews")
```

### cURL Examples

#### Run Actor

```bash
curl -X POST 'https://api.apify.com/v2/acts/e9bEKZerOg2LjDyjp/runs' \
  -H 'Authorization: Bearer YOUR_APIFY_TOKEN' \
  -H 'Content-Type: application/json' \
  -d '{
    "store": "google",
    "appId": "com.instagram.android", 
    "limit": 50
  }'
```

#### Get Results

```bash
curl 'https://api.apify.com/v2/datasets/DATASET_ID/items' \
  -H 'Authorization: Bearer YOUR_APIFY_TOKEN'
```

### Output Format

#### Standard Output (Google, Apple, Microsoft)

```json
{
  "reviews": [
    {
      "reviewId": "review_123",
      "author": "John D.",
      "rating": 5,
      "title": "Great app!",
      "text": "This app works perfectly for my needs.",
      "reviewedAt": "2024-01-15T10:30:00.000Z",
      "version": "2.24.1.78",
      "country": "US",
      "helpful": 12
    }
  ],
  "appInfo": {
    "title": "WhatsApp Messenger",
    "developer": "WhatsApp Inc.",
    "rating": 4.2,
    "url": "https://play.google.com/store/apps/details?id=com.whatsapp"
  },
  "metadata": {
    "scrapedAt": "2024-01-20T14:00:00.000Z",
    "totalReviews": 50,
    "store": "google"
  }
}
```

#### Tencent Output (with Translation)

When using `translateTo` parameter, Tencent reviews include both original and translated text:

```json
{
  "reviews": [
    {
      "reviewId": "tencent-com.tencent.mm-123456",
      "author": "用户123",
      "rating": 5,
      "text": "很好用的应用",
      "translatedText": "Very useful app",
      "reviewedAt": "2024-01-15",
      "store": "tencent",
      "helpful": 10
    }
  ],
  "appInfo": {
    "title": "App com.tencent.mm",
    "developer": "Tencent Store",
    "url": "https://sj.qq.com/appdetail/com.tencent.mm"
  }
}
```

**Note**:

- `text` contains the original Chinese review
- `translatedText` contains the translated review (if `translateTo` was specified)
- If no translation is requested, only `text` field is present with Chinese content

### 💳 Pricing & Cost Control

This Actor uses **Pay-Per-Event (PPE)** pricing, so you only pay for the reviews you actually receive.

#### How Pricing Works

- ✅ **First 10 reviews are FREE** on every run
- 💵 **$0.00005 per additional review**
- 📦 Charges are based on the **number of reviews returned**, not runtime

**Example:**

| Reviews Returned | Free Reviews | Paid Reviews | Total Cost |
|------------------|--------------|--------------|------------|
| 10               | 10           | 0            | $0.00      |
| 50               | 10           | 40           | $0.002     |
| 100              | 10           | 90           | $0.0045    |
| 1,000            | 10           | 990          | $0.0495    |

### Popular Apps for Testing

#### Global Apps

| App | Google Play | Apple Store | Microsoft Store |
|-----|-------------|-------------|-----------------|
| WhatsApp | `com.whatsapp` | `310633997` | `9nksqgp7f2nh` |
| Instagram | `com.instagram.android` | `389801252` | `9nblggh5l9xt` |
| Spotify | `com.spotify.music` | `324684580` | `9ncbcszsjrsb` |
| Netflix | `com.netflix.mediaclient` | `363590051` | `9wzdncrfj3tj` |

#### China Market Apps (Tencent)

| App | Package Name |
|-----|--------------|
| WeChat (微信) | `com.tencent.mm` |
| Douyin (抖音 - TikTok China) | `com.ss.android.ugc.aweme` |
| Taobao (淘宝) | `com.taobao.taobao` |
| Alipay (支付宝) | `com.eg.android.AlipayGphone` |
| Meituan (美团) | `com.sankuai.meituan` |
| JD.com (京东) | `com.jingdong.app.mall` |

### Error Handling

The actor will return error information in the output:

```json
{
  "error": {
    "type": "APP_NOT_FOUND",
    "message": "App not found in the specified store",
    "appId": "invalid.package.name"
  }
}
```

### Support

- [Apify Documentation](https://docs.apify.com)
- [Actor Issues](https://github.com/apify/actors/issues)
- [Community Forum](https://community.apify.com)

# Actor input Schema

## `store` (type: `string`):

Choose which app store to scrape

## `appId` (type: `string`):

App identifier - Format varies by store: Google/Tencent: package name (e.g., com.whatsapp), Apple: numeric ID (e.g., 310633997), Microsoft: app ID (e.g., 9nksqgp7f2nh)

## `limit` (type: `integer`):

Maximum number of reviews to scrape (default: 100, max: 1000). Works with: \[Google, Apple, Microsoft, Tencent]

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

Country/market code for store region. Use 'auto' for intelligent detection. Works with: \[Google, Apple, Microsoft]. For Microsoft, this sets the market (e.g., US, GB). For Tencent, this field is ignored (China only).

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

Language code for reviews and interface. Works with: \[Google]. For Microsoft, locale is auto-detected from country. For Tencent, reviews are in Chinese (use translateTo for English).

## `translateTo` (type: `string`):

Translate reviews to this language. Works with: \[Tencent]. Translates Chinese reviews to your target language (default: English).

## `startDate` (type: `string`):

Filter reviews from this date (ISO format: YYYY-MM-DD). Works with: \[Google, Apple, Microsoft, Tencent]

## `endDate` (type: `string`):

Filter reviews until this date (ISO format: YYYY-MM-DD). Works with: \[Google, Apple, Microsoft, Tencent]

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

Include only these star ratings (1-5). Works with: \[Google, Apple, Microsoft, Tencent]

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

Your webhook endpoint to receive review data in real-time. Works with: \[Google, Apple, Microsoft, Tencent]

## `webhookApiKey` (type: `string`):

API key for webhook authentication (sent in Authorization header). Works with: \[Google, Apple, Microsoft, Tencent]

## Actor input object example

```json
{
  "store": "google",
  "appId": "com.whatsapp",
  "limit": 100,
  "country": "auto",
  "language": "en",
  "translateTo": "en",
  "startDate": "2024-01-01",
  "endDate": "2024-12-31",
  "ratings": [
    4,
    5
  ],
  "webhookUrl": "https://your-api.com/webhooks/reviews"
}
```

# Actor output Schema

## `source` (type: `string`):

Source platform identifier

## `store` (type: `string`):

Target app store platform

## `appId` (type: `string`):

Application identifier for the target store

## `runId` (type: `string`):

Unique identifier for this scraping run

## `actorId` (type: `string`):

Unique identifier for the Apify actor that executed this run

## `appName` (type: `string`):

Name of the application

## `developer` (type: `string`):

App developer/publisher name

## `appRating` (type: `string`):

Overall app rating from the store

## `appUrl` (type: `string`):

Direct URL to the app in the target store

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

Array of scraped user reviews

## `metadata` (type: `string`):

Additional information about the scraping process and results

# 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 = {};

// Run the Actor and wait for it to finish
const run = await client.actor("reviewbot/universal-review-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 = {}

# Run the Actor and wait for it to finish
run = client.actor("reviewbot/universal-review-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 '{}' |
apify call reviewbot/universal-review-scraper --silent --output-dataset

```

## MCP server setup

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