# App Store Ratings Scraper (`maximedupre/app-store-ratings-scraper`) Actor

Get live Google Play and Apple App Store ratings, review counts, prices, categories, developers, icons, screenshots, and app metadata. Paste app URLs or IDs for a quick first run.

- **URL**: https://apify.com/maximedupre/app-store-ratings-scraper.md
- **Developed by:** [Maxime Dupré](https://apify.com/maximedupre) (community)
- **Categories:** Developer tools, Automation
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, NaN bookmarks
- **User rating**: No ratings yet

## Pricing

from $0.15 / 1,000 app rating results

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/platform/actors/running/actors-in-store#pay-per-event

## What's an Apify Actor?

Actors are a software tools running on the Apify platform, for all kinds of web data extraction and automation use cases.
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.md):

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

In Python projects, use official [Python client library](https://docs.apify.com/api/client/python.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/platform/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 Store Ratings Scraper

App Store Ratings Scraper gets live rating and app metadata from [Google Play](https://play.google.com/store/apps) and the [Apple App Store](https://apps.apple.com/). Paste app URLs or app IDs, run the Actor, and export normalized rows with ratings, review counts, prices, categories, developers, icons, screenshots, market settings, and source URLs.

Use it when you need a quick app rating monitor, a mobile app market research dataset, or clean app store metadata for dashboards and competitor analysis. You do not need Google Play credentials, an Apple Developer account, cookies, or API keys.

### What This Actor Does

The Actor checks known app targets and returns one row per target. It works with:

- Google Play app URLs, such as `https://play.google.com/store/apps/details?id=com.instagram.android`
- Android package IDs, such as `com.instagram.android`
- Apple App Store URLs, such as `https://apps.apple.com/us/app/duolingo-language-lessons/id570060128`
- Apple numeric IDs and `id...` values, such as `570060128` or `id570060128`

Each run can mix Google Play and Apple App Store targets. The Actor keeps source-specific fields, such as store URL and app ID, while normalizing the row shape so you can compare iOS and Android apps in one dataset.

### Data You Can Extract

The default dataset includes app rating and metadata fields that are useful for monitoring and analysis:

- App name, platform, app ID, and source store URL
- Average rating, rating count, review count, and rating scale
- App description, category, developer name, and developer URL
- Price, currency, free/paid status, and availability
- App icon URL and screenshot URLs when available
- Content rating, OS requirements, and supported Apple devices when available
- Country, language, target input, fetch timestamp, status, and user-actionable error message

Rows use consistent field names across both stores. For example, `rating`, `ratingCount`, `price`, `priceCurrency`, `country`, and `fetchedAt` mean the same thing whether the source app came from Google Play or the Apple App Store.

### Common Use Cases

#### App rating monitoring

Schedule the Actor daily or weekly to track public rating and review-count changes for your own app or a group of competitor apps.

#### Competitive research

Compare apps in a category by rating, rating volume, price, content rating, developer, and market availability.

#### BI and reporting

Send fresh app store rating data to a spreadsheet, warehouse, dashboard, or internal report using Apify dataset exports, API access, integrations, schedules, and webhooks.

#### App portfolio tracking

Monitor a set of Android and iOS apps in one run without keeping separate scraping tools for each store.

### How To Run

1. Open the Actor input.
2. Paste one app target per line in **App URLs or IDs**.
3. Choose the Apple App Store country and Google Play country/language.
4. Keep **App limit** low for a small test run, or raise it for a larger batch.
5. Start the Actor and open the dataset when the run finishes.

The prefilled run checks one Apple App Store app and one Google Play app, so you can see both output shapes immediately.

### Input

| Field | What to enter |
| --- | --- |
| `targets` | Google Play URLs, Android package IDs, Apple App Store URLs, Apple numeric IDs, or Apple `id...` values. |
| `appleCountry` | Apple storefront country for Apple targets. |
| `googleCountry` | Google Play market country for Google targets. |
| `googleLanguage` | Google Play page language. |
| `maxItems` | Maximum number of input targets to process. |
| `includeScreenshots` | Include public screenshot URLs when the store exposes them. |
| `includeDescription` | Include the public app description text. Turn it off for smaller rows. |

Example input:

```json
{
	"targets": [
		"https://apps.apple.com/us/app/duolingo-language-lessons/id570060128",
		"https://play.google.com/store/apps/details?id=com.instagram.android",
		"com.openai.chatgpt",
		"id6448311069"
	],
	"appleCountry": "us",
	"googleCountry": "US",
	"googleLanguage": "en",
	"maxItems": 50,
	"includeScreenshots": true,
	"includeDescription": true
}
````

### Output Example

Each dataset item is one app rating result. Values vary by source and market.

```json
{
	"target": "https://play.google.com/store/apps/details?id=com.instagram.android",
	"status": "ok",
	"platform": "google",
	"appId": "com.instagram.android",
	"storeUrl": "https://play.google.com/store/apps/details?id=com.instagram.android&hl=en&gl=US",
	"name": "Instagram",
	"description": "Create and share photos, stories, and reels...",
	"category": "SOCIAL",
	"developerName": "Instagram",
	"developerUrl": "https://help.instagram.com/",
	"rating": 4.01,
	"ratingCount": 167835413,
	"reviewCount": 167835413,
	"ratingScale": 5,
	"price": 0,
	"priceCurrency": "USD",
	"isFree": true,
	"availability": "available",
	"country": "US",
	"language": "en",
	"iconUrl": "https://play-lh.googleusercontent.com/...",
	"screenshots": ["https://play-lh.googleusercontent.com/..."],
	"contentRating": null,
	"requirements": null,
	"availableDevices": [],
	"fetchedAt": "2026-05-21T18:00:00.000Z",
	"errorMessage": null
}
```

If a target is invalid, unavailable, or not found in the selected market, the Actor keeps the run successful and returns a row with a status such as `not_found`, `unsupported_market`, or `unavailable`. This makes it easier to reconcile every input target against the output dataset.

### Pricing

This Actor uses pay-per-event pricing. You pay for each app result row saved to the dataset, plus the standard Actor start event. The app result event is priced at `$0.15 per 1,000 rows`.

### Limits And Caveats

- The Actor checks known app targets. It does not search app stores by keyword.
- It returns app rating and metadata rows, not individual user review text.
- Google Play and Apple App Store can expose different fields for the same app. Missing source fields are returned as `null` or empty arrays.
- Country and language settings can affect names, pricing, availability, ratings, and descriptions.
- Historical trend storage is not built in. To monitor changes over time, schedule runs and compare datasets.

### FAQ

#### Does this scrape Apple App Store reviews or Google Play reviews?

No. This Actor focuses on app-level ratings and metadata: average rating, rating count, review count, price, category, developer, icon, screenshots, and related store fields. It does not return individual review text.

#### Do I need an Apple Developer account or Google Play API key?

No. The Actor reads public store data and does not ask for cookies, login details, developer accounts, or API keys.

#### Can I use it as an App Store ratings API?

Yes. You can run the Actor through the Apify API, read results from the default dataset API, schedule recurring runs, and connect outputs to Apify integrations or webhooks.

#### Why are some fields null?

Google Play and the Apple App Store do not expose every field for every app, country, and language. The Actor keeps a stable schema and uses `null` or an empty array when a public field is not available.

#### Can I monitor ratings over time?

Yes. Schedule the Actor and store each run's dataset. Use `appId`, `platform`, `country`, `language`, and `fetchedAt` to compare snapshots over time.

# Actor input Schema

## `targets` (type: `array`):

Paste one app per line. Supports Google Play URLs, Android package IDs, Apple App Store URLs, Apple numeric IDs, and Apple IDs like id570060128.

## `appleCountry` (type: `string`):

Apple App Store country to use for Apple targets. Ratings, prices, availability, and descriptions can vary by storefront.

## `googleCountry` (type: `string`):

Google Play country to use for Android targets. Market settings can affect ratings, pricing, availability, and text.

## `googleLanguage` (type: `string`):

Language to request for Google Play app pages.

## `maxItems` (type: `integer`):

Maximum number of input targets to process in this run.

## `includeScreenshots` (type: `boolean`):

Add public app screenshot URLs to each row when the store exposes them.

## `includeDescription` (type: `boolean`):

Add the public app description text to each row. Turn this off when you want smaller dataset items.

## Actor input object example

```json
{
  "targets": [
    "https://apps.apple.com/us/app/duolingo-language-lessons/id570060128",
    "https://play.google.com/store/apps/details?id=com.instagram.android"
  ],
  "appleCountry": "us",
  "googleCountry": "US",
  "googleLanguage": "en",
  "maxItems": 50,
  "includeScreenshots": true,
  "includeDescription": true
}
```

# Actor output Schema

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

Open the dataset with app ratings, review counts, prices, developers, categories, media URLs, source URLs, and market metadata.

# 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 = {
    "targets": [
        "https://apps.apple.com/us/app/duolingo-language-lessons/id570060128",
        "https://play.google.com/store/apps/details?id=com.instagram.android"
    ],
    "maxItems": 50
};

// Run the Actor and wait for it to finish
const run = await client.actor("maximedupre/app-store-ratings-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 = {
    "targets": [
        "https://apps.apple.com/us/app/duolingo-language-lessons/id570060128",
        "https://play.google.com/store/apps/details?id=com.instagram.android",
    ],
    "maxItems": 50,
}

# Run the Actor and wait for it to finish
run = client.actor("maximedupre/app-store-ratings-scraper").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 '{
  "targets": [
    "https://apps.apple.com/us/app/duolingo-language-lessons/id570060128",
    "https://play.google.com/store/apps/details?id=com.instagram.android"
  ],
  "maxItems": 50
}' |
apify call maximedupre/app-store-ratings-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "command": "npx",
            "args": [
                "mcp-remote",
                "https://mcp.apify.com/?tools=maximedupre/app-store-ratings-scraper",
                "--header",
                "Authorization: Bearer <YOUR_API_TOKEN>"
            ]
        }
    }
}

```

## OpenAPI specification

```json
{
    "openapi": "3.0.1",
    "info": {
        "title": "App Store Ratings Scraper",
        "description": "Get live Google Play and Apple App Store ratings, review counts, prices, categories, developers, icons, screenshots, and app metadata. Paste app URLs or IDs for a quick first run.",
        "version": "0.0",
        "x-build-id": "5fjNSsObOGdRZwk6t"
    },
    "servers": [
        {
            "url": "https://api.apify.com/v2"
        }
    ],
    "paths": {
        "/acts/maximedupre~app-store-ratings-scraper/run-sync-get-dataset-items": {
            "post": {
                "operationId": "run-sync-get-dataset-items-maximedupre-app-store-ratings-scraper",
                "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/maximedupre~app-store-ratings-scraper/runs": {
            "post": {
                "operationId": "runs-sync-maximedupre-app-store-ratings-scraper",
                "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/maximedupre~app-store-ratings-scraper/run-sync": {
            "post": {
                "operationId": "run-sync-maximedupre-app-store-ratings-scraper",
                "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",
                "required": [
                    "targets",
                    "maxItems",
                    "appleCountry",
                    "googleCountry",
                    "googleLanguage",
                    "includeScreenshots",
                    "includeDescription"
                ],
                "properties": {
                    "targets": {
                        "title": "App URLs or IDs",
                        "minItems": 1,
                        "maxItems": 1000,
                        "type": "array",
                        "description": "Paste one app per line. Supports Google Play URLs, Android package IDs, Apple App Store URLs, Apple numeric IDs, and Apple IDs like id570060128.",
                        "items": {
                            "type": "string",
                            "minLength": 1
                        }
                    },
                    "appleCountry": {
                        "title": "Apple storefront",
                        "enum": [
                            "us",
                            "ca",
                            "gb",
                            "au",
                            "de",
                            "fr",
                            "es",
                            "it",
                            "nl",
                            "br",
                            "mx",
                            "jp",
                            "in",
                            "pt",
                            "cn"
                        ],
                        "type": "string",
                        "description": "Apple App Store country to use for Apple targets. Ratings, prices, availability, and descriptions can vary by storefront.",
                        "default": "us"
                    },
                    "googleCountry": {
                        "title": "Google Play market",
                        "enum": [
                            "US",
                            "CA",
                            "GB",
                            "AU",
                            "DE",
                            "FR",
                            "ES",
                            "IT",
                            "NL",
                            "BR",
                            "MX",
                            "JP",
                            "IN",
                            "PT"
                        ],
                        "type": "string",
                        "description": "Google Play country to use for Android targets. Market settings can affect ratings, pricing, availability, and text.",
                        "default": "US"
                    },
                    "googleLanguage": {
                        "title": "Google Play language",
                        "enum": [
                            "en",
                            "de",
                            "fr",
                            "es",
                            "it",
                            "nl",
                            "pt",
                            "ja"
                        ],
                        "type": "string",
                        "description": "Language to request for Google Play app pages.",
                        "default": "en"
                    },
                    "maxItems": {
                        "title": "App limit",
                        "minimum": 1,
                        "maximum": 1000,
                        "type": "integer",
                        "description": "Maximum number of input targets to process in this run.",
                        "default": 50
                    },
                    "includeScreenshots": {
                        "title": "Include screenshots",
                        "type": "boolean",
                        "description": "Add public app screenshot URLs to each row when the store exposes them.",
                        "default": true
                    },
                    "includeDescription": {
                        "title": "Include descriptions",
                        "type": "boolean",
                        "description": "Add the public app description text to each row. Turn this off when you want smaller dataset items.",
                        "default": true
                    }
                }
            },
            "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
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }
}
```
