# App Store and Google Play Scraper (`magicfingers/appstore-scraper`) Actor

Scrape Apple App Store and Google Play Store. Search apps, get details, reviews, top charts, and developer profiles. Supports 150+ countries.

- **URL**: https://apify.com/magicfingers/appstore-scraper.md
- **Developed by:** [abdulrahman alrashid](https://apify.com/magicfingers) (community)
- **Categories:** Other
- **Stats:** 124 total users, 20 monthly users, 100.0% runs succeeded, 2 bookmarks
- **User rating**: 5.00 out of 5 stars

## Pricing

Pay per usage

This Actor is paid per platform usage. The Actor is free to use, and you only pay for the Apify platform usage, which gets cheaper the higher subscription plan you have.

Learn more: https://docs.apify.com/actors/running/actors-in-store.md#pay-per-usage

## 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

## App Store & Google Play Scraper

Scrape Apple App Store and Google Play Store data. Search apps, get details, reviews, top charts, and developer profiles from both stores with a single actor.

### Features

- **Search apps** by keyword on both App Store and Google Play
- **App details**: name, developer, rating, review count, price, category, description, version, last updated, size, downloads (Play), screenshots, and more
- **App reviews** with rating, text, date, username, helpful votes, developer replies (Play)
- **Top charts**: free, paid, and grossing apps by category and country
- **Developer profiles**: get all apps by a developer
- **150+ countries** with locale filtering
- **Normalized output**: same JSON format for both stores

### Input Examples

#### Search apps

```json
{
    "action": "search",
    "store": "both",
    "searchTerms": ["fitness tracker", "meditation app"],
    "country": "us",
    "maxResults": 50
}
```

#### Get app details

```json
{
    "action": "details",
    "store": "both",
    "appIds": [
        "com.spotify.client",
        "com.spotify.music",
        "324684580",
        "https://apps.apple.com/us/app/spotify/id324684580"
    ],
    "country": "us"
}
```

#### Scrape reviews

```json
{
    "action": "reviews",
    "store": "both",
    "appIds": ["com.spotify.client", "324684580"],
    "country": "us",
    "maxReviews": 200,
    "reviewSort": "newest"
}
```

#### Get top charts

```json
{
    "action": "topCharts",
    "store": "both",
    "chartType": "free",
    "category": "GAMES",
    "country": "us",
    "maxResults": 100
}
```

#### Get developer apps

```json
{
    "action": "developer",
    "store": "both",
    "developerIds": ["Spotify AB", "324684580"],
    "country": "us",
    "maxResults": 50
}
```

### Output Format

#### App object

| Field | Type | Description |
|-------|------|-------------|
| store | string | `apple` or `google` |
| appId | string | App ID (numeric for Apple, package name for Google) |
| bundleId | string | Bundle/package identifier |
| name | string | App name |
| url | string | Store page URL |
| developer | string | Developer name |
| developerId | string | Developer ID |
| developerUrl | string | Developer page URL |
| icon | string | App icon URL |
| rating | number | Average rating (1-5) |
| reviewCount | number | Total number of ratings |
| price | string | Formatted price or "Free" |
| priceValue | number | Numeric price |
| currency | string | Price currency code |
| category | string | Primary category |
| categories | array | All categories |
| description | string | Full description |
| version | string | Current version |
| lastUpdated | string | Last update date |
| releaseDate | string | Original release date |
| size | string | Formatted file size |
| downloads | string | Download count (Google Play only) |
| minimumOsVersion | string | Minimum OS version |
| contentRating | string | Age/content rating |
| screenshots | array | Screenshot URLs |
| scrapedAt | string | ISO timestamp of scrape |

#### Review object

| Field | Type | Description |
|-------|------|-------------|
| store | string | `apple` or `google` |
| appId | string | App ID |
| type | string | Always `review` |
| reviewId | string | Unique review ID |
| userName | string | Reviewer name |
| rating | number | Star rating (1-5) |
| title | string | Review title (Apple only) |
| text | string | Review text |
| date | string | Review date |
| version | string | App version reviewed |
| helpfulCount | number | Helpful votes |
| developerReply | string | Developer response (Google only) |
| country | string | Country code |

### Supported Categories

Use these category names in the `category` field:

`GAMES`, `BUSINESS`, `EDUCATION`, `ENTERTAINMENT`, `FINANCE`, `FOOD_AND_DRINK`, `HEALTH_AND_FITNESS`, `LIFESTYLE`, `MEDICAL`, `MUSIC`, `NAVIGATION`, `NEWS`, `PHOTO_AND_VIDEO`, `PRODUCTIVITY`, `REFERENCE`, `SHOPPING`, `SOCIAL_NETWORKING`, `SPORTS`, `TRAVEL`, `UTILITIES`, `WEATHER`

Google Play additional: `ART_AND_DESIGN`, `AUTO_AND_VEHICLES`, `BEAUTY`, `BOOKS_AND_REFERENCE`, `COMICS`, `COMMUNICATION`, `DATING`, `EVENTS`, `HOUSE_AND_HOME`, `MAPS_AND_NAVIGATION`, `MUSIC_AND_AUDIO`, `NEWS_AND_MAGAZINES`, `PARENTING`, `PERSONALIZATION`, `PHOTOGRAPHY`, `TOOLS`, `VIDEO_PLAYERS`

### Country Codes

Use standard ISO 3166-1 alpha-2 codes: `us`, `gb`, `de`, `fr`, `jp`, `kr`, `cn`, `br`, `in`, `au`, `ca`, `mx`, `es`, `it`, `nl`, `se`, `no`, `dk`, `fi`, `ru`, `tr`, `sa`, `ae`, `sg`, `my`, `th`, `id`, `ph`, `vn`, `tw`, `hk`, etc.

### Pricing

Pay-per-event: **$0.40 per 1,000 results** ($0.0004 per result)

| Usage | Results | Cost |
|-------|---------|------|
| Search 1 keyword, both stores | ~100 | $0.04 |
| 100 app details | 100 | $0.04 |
| 500 reviews | 500 | $0.20 |
| Top 200 chart, both stores | 400 | $0.16 |

### Technical Notes

- **Apple App Store**: Uses the public iTunes Search API for search and details, RSS/JSON feed for reviews and charts, and the AMP API as a fallback for additional reviews.
- **Google Play Store**: Scrapes the web interface for search, details, and charts. Uses the internal batchexecute API for paginated reviews.
- **Rate limiting**: Built-in delays between requests to avoid IP blocks. Use Apify Proxy for best reliability.
- **Review limits**: Apple RSS feed provides up to 500 reviews per app. Google Play batchexecute API can fetch thousands.

# Actor input Schema

## `action` (type: `string`):

What type of scraping to perform

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

Which app store(s) to scrape

## `searchTerms` (type: `array`):

Keywords to search for (one per line). Used with 'search' action.

## `appIds` (type: `array`):

App IDs or store URLs (one per line). Used with 'details' and 'reviews' actions. Apple: numeric ID or bundle ID (e.g., 'com.spotify.client' or '324684580'). Google Play: package name (e.g., 'com.spotify.music').

## `developerIds` (type: `array`):

Developer IDs or store URLs (one per line). Used with 'developer' action. Apple: numeric developer ID. Google Play: developer name or ID from URL.

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

Two-letter country code (ISO 3166-1 alpha-2)

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

Language code for results (e.g., 'en', 'es', 'fr', 'de', 'ja')

## `chartType` (type: `string`):

Type of top chart. Used with 'topCharts' action.

## `category` (type: `string`):

App category for top charts. Leave empty for overall charts. Examples: 'GAMES', 'BUSINESS', 'EDUCATION', 'HEALTH\_AND\_FITNESS'.

## `maxResults` (type: `integer`):

Maximum number of results to return per search term / chart / developer

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

Maximum number of reviews to scrape per app. Used with 'reviews' action.

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

How to sort reviews

## `includeDetails` (type: `boolean`):

When searching or scraping charts, also fetch full app details for each result (slower but more data).

## `proxy` (type: `object`):

Proxy settings for web requests

## Actor input object example

```json
{
  "action": "search",
  "store": "both",
  "searchTerms": [
    "fitness tracker"
  ],
  "country": "us",
  "language": "en",
  "chartType": "free",
  "category": "",
  "maxResults": 5,
  "maxReviews": 100,
  "reviewSort": "mostRelevant",
  "includeDetails": false,
  "proxy": {
    "useApifyProxy": true
  }
}
```

# 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 = {
    "action": "search",
    "store": "both",
    "searchTerms": [
        "fitness tracker"
    ],
    "country": "us",
    "language": "en",
    "chartType": "free",
    "maxResults": 5,
    "maxReviews": 100,
    "reviewSort": "mostRelevant",
    "proxy": {
        "useApifyProxy": true
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("magicfingers/appstore-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 = {
    "action": "search",
    "store": "both",
    "searchTerms": ["fitness tracker"],
    "country": "us",
    "language": "en",
    "chartType": "free",
    "maxResults": 5,
    "maxReviews": 100,
    "reviewSort": "mostRelevant",
    "proxy": { "useApifyProxy": True },
}

# Run the Actor and wait for it to finish
run = client.actor("magicfingers/appstore-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 '{
  "action": "search",
  "store": "both",
  "searchTerms": [
    "fitness tracker"
  ],
  "country": "us",
  "language": "en",
  "chartType": "free",
  "maxResults": 5,
  "maxReviews": 100,
  "reviewSort": "mostRelevant",
  "proxy": {
    "useApifyProxy": true
  }
}' |
apify call magicfingers/appstore-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,magicfingers/appstore-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/4e8xUUsIW43Uy8lCV/builds/vcoAB0ecSpOeVi5AF/openapi.json
