# App Store & Google Play Scraper — App Details, Search & Charts (`tidydata/app-store-google-play-scraper`) Actor

Scrape app data from the Apple App Store and Google Play: rating, ratings count, installs, price, version, developer website and email, genre, release and update dates, screenshots. Search by keyword, list a developer's apps or Apple top charts. Any country. $0.50 per 1,000 apps.

- **URL**: https://apify.com/tidydata/app-store-google-play-scraper.md
- **Developed by:** [tidydata](https://apify.com/tidydata) (community)
- **Categories:** E-commerce, Lead generation, Developer tools
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $0.40 / 1,000 apps

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.
Since this Actor supports Apify Store discounts, the price gets lower the higher subscription plan you have.

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

## What's an Apify Actor?

An Actor is a serverless cloud program that runs on the Apify platform. It has two run modes.
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.

Apify vocabulary and the platform model are defined once, in the agent quickstart at https://apify.com/agents.md.

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

Do not guess an integration path. Every one of them is in the agent quickstart at https://apify.com/agents.md: the Apify MCP server, Agent Skills with the Apify CLI, the JavaScript and Python clients, the REST API, and the account-free path for an agent with no human to sign in. It also carries the rule on stating cost before the first paid run.

For examples already wired to this Actor's own input schema, see the [API](#api) section below.

Each client library has reference documentation the quickstart does not restate: [JavaScript/TypeScript](https://docs.apify.com/api/client/js/docs.md) (`npm install apify-client`) and [Python](https://docs.apify.com/api/client/python/docs.md) (`pip install apify-client`).

# README

## 📱 App Store & Google Play Scraper — App Details, Search & Charts

Scrape **app data from the Apple App Store and Google Play** in one run and one table: **rating, ratings count, installs, price, version, release and update dates, genre, developer website and support email, description, screenshots** and more. Get it for a **list of apps**, for **keyword searches** (with each app's position), for **all apps of a developer**, or for **Apple's top charts** by category. Any country.

**$0.50 per 1,000 apps.** Repeated apps and error rows are free. No API key, no login.

- ✅ **Both stores**, same columns (`store`: `appstore` / `googleplay`)
- ✅ **4 ways in**: app links/IDs · search terms · developer pages · Apple top free / paid / grossing charts
- ✅ **Search position** of every app — track your ASO ranking or map a niche
- ✅ **Developer contact**: website (both stores) and support email + address (Google Play)
- ✅ **Google Play installs** (`10,000,000+` and the exact `realInstalls`), rating histogram, ads and in-app purchases
- ✅ **App Store** file size, minimum iOS, languages, rating of the current version, release notes
- ✅ **Any country** (us, gb, es, de, fr, br, in…), Google Play **language** of your choice
- ✅ Fast: ~30 apps in a few seconds, no browser

### Who uses it

- **App marketers & ASO** — where do you and your competitors rank for each keyword, in each country?
- **Founders & product teams** — size up a niche before building: installs, ratings, pricing, update frequency.
- **Agencies & B2B sales** — lists of app developers with website and support email (e.g. all finance apps in the top grossing chart).
- **Investors & analysts** — follow top charts and rating changes over time with a scheduled run.
- **AI & research** — app descriptions and metadata at scale.

### How to use it

Fill in any mix of these (all optional, at least one):

1. **Apps** — one per line:
   ```
   https://apps.apple.com/us/app/duolingo-language-lessons/id570060128
   https://play.google.com/store/apps/details?id=com.duolingo
   com.spotify.music
   310633997
   ```
2. **Search terms** — e.g. `habit tracker`, `budget planner`. Pick the stores to search.
3. **Developers** — `https://apps.apple.com/us/developer/meta-platforms-inc/id284882218` or `https://play.google.com/store/apps/developer?id=Spotify+AB`.
4. **Apple top charts** — top free, paid or grossing (iPhone or iPad), optionally for one category (Games, Finance, Health & Fitness…).

Then choose **countries**, the Google Play **language** and **max results** per search/developer/chart, and run. Export to CSV, Excel, JSON or HTML, or schedule it daily/weekly.

### Output example

```json
{
  "type": "app",
  "store": "googleplay",
  "source": "search: habit tracker",
  "position": 1,
  "appId": "org.isoron.uhabits",
  "title": "Loop Habit Tracker",
  "developer": "Álinson S Xavier",
  "developerEmail": "dev@loophabits.org",
  "developerWebsite": null,
  "rating": 4.72,
  "ratingsCount": 63532,
  "installs": "5,000,000+",
  "realInstalls": 7914657,
  "price": 0,
  "free": true,
  "genre": "Productivity",
  "updated": "2025-09-14T22:56:06+00:00",
  "url": "https://play.google.com/store/apps/details?id=org.isoron.uhabits",
  "country": "us",
  "charged": true
}
```

Every row also has `icon`, `currency`, `version`, `released`, `contentRating`, `genres`, `description`, `screenshots`, `scrapedAt`, plus store-specific fields:

| Field | App Store | Google Play |
|---|---|---|
| `installs`, `minInstalls`, `realInstalls` | — | ✅ |
| `histogram` (1★…5★ counts), `reviewsCount` | — | ✅ |
| `developerEmail`, `developerAddress`, `privacyPolicy` | — | ✅ |
| `containsAds`, `inAppPurchases`, `inAppPriceRange`, `summary`, `video` | — | ✅ |
| `ratingCurrentVersion`, `ratingsCountCurrentVersion` | ✅ | — |
| `bundleId`, `sizeBytes`, `minOsVersion`, `languages`, `releaseNotes` | ✅ | — |

Apps that can't be found come as free rows with `"type": "error"` and the reason.

### Pricing

**$0.0005 per app ($0.50 per 1,000).** Store discounts apply automatically on paid Apify plans (−10 % Bronze, −15 % Silver, −20 % Gold). Repeated apps (same store and country) and error rows are not charged. Set a maximum cost per run in Apify and the scraper stops right there.

Example: the top 100 grossing apps in 5 countries = 500 apps = **$0.25**.

### Limits worth knowing

- **Google Play search** returns up to **30 apps per term** (what the store shows). The App Store search returns up to 200.
- **Apple charts** go up to 100 apps per chart. Google Play no longer publishes top charts on the web.
- **Google Play developer pages** list the apps that Google shows on that page.
- Ratings counts and installs are the stores' public numbers at the time of the run.

### Need reviews too?

Use **[App Store & Google Play Reviews Scraper](https://apify.com/tidydata/app-reviews-scraper)** — ratings, review texts, versions and developer replies, filter by stars, $0.10 per 1,000 reviews.

More TidyData tools: [Website Contact Extractor](https://apify.com/tidydata/website-contact-extractor) (emails and social links from developer websites) · [Merge, Deduplicate & Transform](https://apify.com/tidydata/merge-dedupe-datasets) · [Google Sheets Export](https://apify.com/tidydata/google-sheets-export-import).

### FAQ

**Is it legal?** It reads public store pages and Apple's public iTunes Search API, like a visitor would, without login. You are responsible for how you use the data (e.g. contacting developers must follow anti-spam laws such as GDPR and CAN-SPAM).

**Can I track changes?** Yes: schedule the run daily and compare datasets, or send them to Google Sheets.

**Something missing or broken?** Open an issue in the Issues tab — we answer fast.

# Actor input Schema

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

One per line: App Store links (apps.apple.com/…/id123) or IDs, Google Play links (play.google.com/store/apps/details?id=…) or package names (com.example.app). Returns full details for each.

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

Keywords to search in the stores, e.g. 'budget planner'. Returns the apps in store order with their position (great for ASO and finding competitors).

## `searchStores` (type: `array`):

Which stores the search terms are sent to.

## `developers` (type: `array`):

All apps of a developer: App Store developer links (apps.apple.com/…/developer/…/id123) or Google Play developer links (play.google.com/store/apps/developer?id=… or /dev?id=…).

## `appleCharts` (type: `array`):

App Store top charts with rank, up to 100 apps per chart, country and category.

## `appleChartGenre` (type: `string`):

Category for the Apple charts.

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

2-letter country codes (us, gb, es, de, fr, br, in…). Each app/search/chart is read from every country's store. If empty, App Store links use the country in the link.

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

Language of Google Play texts (en, es, de, pt…).

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

App Store search: up to 200. Google Play search: up to 30 (what the store shows). Charts: up to 100.

## `fullDetails` (type: `boolean`):

Opens each app found by a Google Play search to add installs, ratings count, developer email and website, update date… Off = faster, lighter rows (same price).

## `deduplicate` (type: `boolean`):

If the same app (store + country) shows up in several searches or charts, keep the first one and don't pay twice.

## Actor input object example

```json
{
  "apps": [
    "https://apps.apple.com/us/app/duolingo-language-lessons/id570060128",
    "https://play.google.com/store/apps/details?id=com.duolingo"
  ],
  "searchTerms": [
    "habit tracker"
  ],
  "searchStores": [
    "appstore",
    "googleplay"
  ],
  "appleChartGenre": "all",
  "countries": [
    "us"
  ],
  "language": "en",
  "maxResults": 30,
  "fullDetails": true,
  "deduplicate": true
}
```

# Actor output Schema

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

One row per result.

# API

You can run this Actor programmatically using our API. Below are code examples in JavaScript, Python, and CLI, as well as the OpenAPI specification and MCP server setup.

## JavaScript example

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

// Initialize the ApifyClient with your Apify API token
// Replace the '<YOUR_API_TOKEN>' with your token
const client = new ApifyClient({
    token: '<YOUR_API_TOKEN>',
});

// Prepare Actor input
const input = {
    "apps": [
        "https://apps.apple.com/us/app/duolingo-language-lessons/id570060128",
        "https://play.google.com/store/apps/details?id=com.duolingo"
    ],
    "searchTerms": [
        "habit tracker"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("tidydata/app-store-google-play-scraper").call(input);

// Fetch and print Actor results from the run's dataset (if any)
console.log('Results from dataset');
console.log(`💾 Check your data here: https://console.apify.com/storage/datasets/${run.defaultDatasetId}`);
const { items } = await client.dataset(run.defaultDatasetId).listItems();
items.forEach((item) => {
    console.dir(item);
});

// 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/js/docs

```

## Python example

```python
from apify_client import ApifyClient

# Initialize the ApifyClient with your Apify API token
# Replace '<YOUR_API_TOKEN>' with your token.
client = ApifyClient("<YOUR_API_TOKEN>")

# Prepare the Actor input
run_input = {
    "apps": [
        "https://apps.apple.com/us/app/duolingo-language-lessons/id570060128",
        "https://play.google.com/store/apps/details?id=com.duolingo",
    ],
    "searchTerms": ["habit tracker"],
}

# Run the Actor and wait for it to finish
run = client.actor("tidydata/app-store-google-play-scraper").call(run_input=run_input)

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

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

```

## CLI example

```bash
echo '{
  "apps": [
    "https://apps.apple.com/us/app/duolingo-language-lessons/id570060128",
    "https://play.google.com/store/apps/details?id=com.duolingo"
  ],
  "searchTerms": [
    "habit tracker"
  ]
}' |
apify call tidydata/app-store-google-play-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,tidydata/app-store-google-play-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/YSVUPRPRfGoBhoJ2M/builds/VksQhGBDioD61yKOp/openapi.json
