# App Review Aggregator — App Store & Google Play (`genetheaiguy/review-aggregator`) Actor

Scrape customer reviews from the Apple App Store and Google Play in a single run and get them back in one normalized, LLM-ready schema. Ratings, review text, authors, dates, app versions, and developer replies.

- **URL**: https://apify.com/genetheaiguy/review-aggregator.md
- **Developed by:** [Gene Swank](https://apify.com/genetheaiguy) (community)
- **Categories:** Automation, AI, Social media
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $0.40 / 1,000 reviews

This Actor is paid per event and usage. You are charged both the fixed price for specific events and for Apify platform usage.

Learn more: https://docs.apify.com/platform/actors/running/actors-in-store#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.

In JavaScript/TypeScript projects, use official [JavaScript/TypeScript client](https://docs.apify.com/api/client/js/docs.md):

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

In Python projects, use official [Python client library](https://docs.apify.com/api/client/python/docs.md):

```bash
pip install apify-client
```

In shell scripts, use [Apify CLI](https://docs.apify.com/cli/docs.md):

````bash
# MacOS / Linux
curl -fsSL https://apify.com/install-cli.sh | bash
# Windows
irm https://apify.com/install-cli.ps1 | iex
```bash

In AI frameworks, you might use the [Apify MCP server](https://docs.apify.com/integrations/mcp.md).

If your project is in a different language, use 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

## App Review Aggregator — App Store & Google Play reviews in one API

Scrape customer reviews from the **Apple App Store** and **Google Play** in a single run — and get them back in **one normalized schema**, ready for spreadsheets, dashboards, sentiment analysis, or LLM pipelines.

Stop stitching together separate scrapers with different output formats. Enter your app's IDs, run once, and download every review from both stores as clean JSON, CSV, or Excel.

### Why use this Actor?

- **One schema for both stores.** Every review has the same fields (`rating`, `text`, `author`, `publishedAt`, `appVersion`, `replyText`, …) whether it came from Apple or Google. No post-processing needed.
- **LLM & AI-agent ready.** The normalized output drops straight into sentiment analysis, RAG pipelines, or an MCP-connected AI agent.
- **Track competitors.** Run it on competitor apps to benchmark ratings and read what their users complain about.
- **Developer replies included.** See which reviews were answered and what was said.
- **No login, no cookies, no proxies.** Just app IDs.

### Input

| Field | Description | Example |
|---|---|---|
| `appStoreAppId` | Numeric Apple App Store app ID (from the app URL) | `618783545` |
| `appStoreCountry` | App Store storefront country | `us` |
| `googlePlayAppId` | Google Play package name (after `?id=` in the URL) | `com.Slack` |
| `googlePlayCountry` / `googlePlayLanguage` | Google Play locale | `us` / `en` |
| `maxReviewsPerSource` | Cap per store | `100` |

Provide one store or both — a store you leave empty is skipped.

### Output

Each review is one dataset item in the same normalized schema:

```json
{
    "source": "googleplay",
    "target": "com.Slack",
    "sourceReviewId": "7c28b6f4-154c-46a4-b277-e4064815f7ad",
    "rating": 5,
    "title": null,
    "text": "Great for team communication…",
    "author": "Jane D.",
    "publishedAt": "2026-07-12T08:41:09.000Z",
    "url": "https://play.google.com/store/apps/details?id=com.Slack",
    "country": "us",
    "appVersion": "26.07.10",
    "helpfulCount": 3,
    "replyText": "Thanks Jane!",
    "replyAt": "2026-07-13T09:00:00.000Z"
}
````

Download it as JSON, CSV, Excel, or XML from the **Storage** tab, or fetch it via the [Apify API](https://docs.apify.com/api/v2).

### Use cases

- **Voice-of-customer analysis** — feed all reviews into an LLM and summarize what users love and hate.
- **Competitor monitoring** — schedule weekly runs on competitor apps and diff the results.
- **Release monitoring** — watch ratings by `appVersion` after each release to catch regressions early.
- **Reputation dashboards** — pipe the dataset into Google Sheets, Looker, or Power BI via Apify integrations.

### FAQ

**Where do I find the App Store app ID?**
In the app's URL: `https://apps.apple.com/us/app/slack/id618783545` → `618783545`.

**Where do I find the Google Play app ID?**
In the app's URL: `https://play.google.com/store/apps/details?id=com.Slack` → `com.Slack`.

**How many reviews can I get?**
Google Play: effectively all reviews, newest first. App Store: Apple's public feed exposes the ~500 most recent reviews per storefront country — run with multiple `appStoreCountry` values to cover more markets.

**Is it legal to scrape reviews?**
This Actor only collects publicly available data. See Apify's [legality of web scraping](https://blog.apify.com/is-web-scraping-legal/) overview.

# Actor input Schema

## `appStoreAppId` (type: `string`):

Numeric Apple App Store app ID. You can find it in the app's URL, e.g. for `https://apps.apple.com/us/app/slack/id618783545` the ID is `618783545`. Leave empty to skip the App Store.

## `appStoreCountry` (type: `string`):

Two-letter country code of the App Store storefront to read reviews from.

## `googlePlayAppId` (type: `string`):

Google Play package name, e.g. `com.Slack`. You can find it in the app's URL after `?id=`. Leave empty to skip Google Play.

## `googlePlayCountry` (type: `string`):

Two-letter country code for Google Play reviews.

## `googlePlayLanguage` (type: `string`):

Two-letter language code for Google Play reviews.

## `maxReviewsPerSource` (type: `integer`):

Maximum number of reviews to fetch from each source.

## Actor input object example

```json
{
  "appStoreAppId": "618783545",
  "appStoreCountry": "us",
  "googlePlayAppId": "com.Slack",
  "googlePlayCountry": "us",
  "googlePlayLanguage": "en",
  "maxReviewsPerSource": 100
}
```

# 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 = {
    "appStoreAppId": "618783545",
    "googlePlayAppId": "com.Slack"
};

// Run the Actor and wait for it to finish
const run = await client.actor("genetheaiguy/review-aggregator").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 = {
    "appStoreAppId": "618783545",
    "googlePlayAppId": "com.Slack",
}

# Run the Actor and wait for it to finish
run = client.actor("genetheaiguy/review-aggregator").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print("💾 Check your data here: https://console.apify.com/storage/datasets/" + run["defaultDatasetId"])
for item in client.dataset(run["defaultDatasetId"]).iterate_items():
    print(item)

# 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/python/docs/quick-start

```

## CLI example

```bash
echo '{
  "appStoreAppId": "618783545",
  "googlePlayAppId": "com.Slack"
}' |
apify call genetheaiguy/review-aggregator --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "command": "npx",
            "args": [
                "mcp-remote",
                "https://mcp.apify.com/?tools=genetheaiguy/review-aggregator",
                "--header",
                "Authorization: Bearer <YOUR_API_TOKEN>"
            ]
        }
    }
}

```

## OpenAPI specification

```json
{
    "openapi": "3.0.1",
    "info": {
        "title": "App Review Aggregator — App Store & Google Play",
        "description": "Scrape customer reviews from the Apple App Store and Google Play in a single run and get them back in one normalized, LLM-ready schema. Ratings, review text, authors, dates, app versions, and developer replies.",
        "version": "1.0",
        "x-build-id": "e2Kf6PPUG5VM7n8as"
    },
    "servers": [
        {
            "url": "https://api.apify.com/v2"
        }
    ],
    "paths": {
        "/acts/genetheaiguy~review-aggregator/run-sync-get-dataset-items": {
            "post": {
                "operationId": "run-sync-get-dataset-items-genetheaiguy-review-aggregator",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor, waits for its completion, and returns Actor's dataset items in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK"
                    }
                }
            }
        },
        "/acts/genetheaiguy~review-aggregator/runs": {
            "post": {
                "operationId": "runs-sync-genetheaiguy-review-aggregator",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor and returns information about the initiated run in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/runsResponseSchema"
                                }
                            }
                        }
                    }
                }
            }
        },
        "/acts/genetheaiguy~review-aggregator/run-sync": {
            "post": {
                "operationId": "run-sync-genetheaiguy-review-aggregator",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor, waits for completion, and returns the OUTPUT from Key-value store in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK"
                    }
                }
            }
        }
    },
    "components": {
        "schemas": {
            "inputSchema": {
                "type": "object",
                "properties": {
                    "appStoreAppId": {
                        "title": "App Store app ID",
                        "type": "string",
                        "description": "Numeric Apple App Store app ID. You can find it in the app's URL, e.g. for `https://apps.apple.com/us/app/slack/id618783545` the ID is `618783545`. Leave empty to skip the App Store."
                    },
                    "appStoreCountry": {
                        "title": "App Store country",
                        "type": "string",
                        "description": "Two-letter country code of the App Store storefront to read reviews from.",
                        "default": "us"
                    },
                    "googlePlayAppId": {
                        "title": "Google Play app ID",
                        "type": "string",
                        "description": "Google Play package name, e.g. `com.Slack`. You can find it in the app's URL after `?id=`. Leave empty to skip Google Play."
                    },
                    "googlePlayCountry": {
                        "title": "Google Play country",
                        "type": "string",
                        "description": "Two-letter country code for Google Play reviews.",
                        "default": "us"
                    },
                    "googlePlayLanguage": {
                        "title": "Google Play language",
                        "type": "string",
                        "description": "Two-letter language code for Google Play reviews.",
                        "default": "en"
                    },
                    "maxReviewsPerSource": {
                        "title": "Max reviews per source",
                        "minimum": 1,
                        "maximum": 10000,
                        "type": "integer",
                        "description": "Maximum number of reviews to fetch from each source.",
                        "default": 100
                    }
                }
            },
            "runsResponseSchema": {
                "type": "object",
                "properties": {
                    "data": {
                        "type": "object",
                        "properties": {
                            "id": {
                                "type": "string"
                            },
                            "actId": {
                                "type": "string"
                            },
                            "userId": {
                                "type": "string"
                            },
                            "startedAt": {
                                "type": "string",
                                "format": "date-time",
                                "example": "2025-01-08T00:00:00.000Z"
                            },
                            "finishedAt": {
                                "type": "string",
                                "format": "date-time",
                                "example": "2025-01-08T00:00:00.000Z"
                            },
                            "status": {
                                "type": "string",
                                "example": "READY"
                            },
                            "meta": {
                                "type": "object",
                                "properties": {
                                    "origin": {
                                        "type": "string",
                                        "example": "API"
                                    },
                                    "userAgent": {
                                        "type": "string"
                                    }
                                }
                            },
                            "stats": {
                                "type": "object",
                                "properties": {
                                    "inputBodyLen": {
                                        "type": "integer",
                                        "example": 2000
                                    },
                                    "rebootCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "restartCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "resurrectCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "computeUnits": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            },
                            "options": {
                                "type": "object",
                                "properties": {
                                    "build": {
                                        "type": "string",
                                        "example": "latest"
                                    },
                                    "timeoutSecs": {
                                        "type": "integer",
                                        "example": 300
                                    },
                                    "memoryMbytes": {
                                        "type": "integer",
                                        "example": 1024
                                    },
                                    "diskMbytes": {
                                        "type": "integer",
                                        "example": 2048
                                    }
                                }
                            },
                            "buildId": {
                                "type": "string"
                            },
                            "defaultKeyValueStoreId": {
                                "type": "string"
                            },
                            "defaultDatasetId": {
                                "type": "string"
                            },
                            "defaultRequestQueueId": {
                                "type": "string"
                            },
                            "buildNumber": {
                                "type": "string",
                                "example": "1.0.0"
                            },
                            "containerUrl": {
                                "type": "string"
                            },
                            "usage": {
                                "type": "object",
                                "properties": {
                                    "ACTOR_COMPUTE_UNITS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_WRITES": {
                                        "type": "integer",
                                        "example": 1
                                    },
                                    "KEY_VALUE_STORE_LISTS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_INTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_EXTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_SERPS": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            },
                            "usageTotalUsd": {
                                "type": "number",
                                "example": 0.00005
                            },
                            "usageUsd": {
                                "type": "object",
                                "properties": {
                                    "ACTOR_COMPUTE_UNITS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_WRITES": {
                                        "type": "number",
                                        "example": 0.00005
                                    },
                                    "KEY_VALUE_STORE_LISTS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_INTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_EXTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_SERPS": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }
}
```
