# App Store & Google Play Apps Scraper: Search, Charts, Details (`steadyrows/app-store-google-play-apps`) Actor

Search both app stores, pull top free/paid/grossing charts by category and country, or get full details for a list of apps. One output format for Apple and Google Play.

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

## Pricing

from $0.50 / 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.

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

### What this does

Gets app data from the **Apple App Store and Google Play in one run**, in one output format. It has three modes:

- **Search**: the apps that rank for a keyword, in rank order. Useful for app store optimization research: see who ranks for "budget planner" in the US and in India.
- **Charts**: top free, top paid or top grossing apps, overall or in a category (finance, games, health…), per country.
- **Details**: the full record for a list of apps. Rating and rating histogram, installs (Google Play), price, version, release notes, developer contact, and for the App Store: **in-app purchase prices, privacy labels, version history and chart position**.

To get the reviews for these apps, use the companion actor **App Store & Google Play Reviews Scraper**.

### Input examples

Search both stores in two countries:

```json
{ "mode": "search", "queries": ["budget planner", "expense tracker"], "countries": ["us", "in"], "maxResults": 50 }
```

Top grossing finance apps in the US:

```json
{ "mode": "charts", "chart": "top_grossing", "category": "finance", "countries": ["us"] }
```

Details for specific apps (any mix of stores):

```json
{ "mode": "details", "apps": ["com.spotify.music", "324684580", "https://apps.apple.com/us/app/instagram/id389801252"] }
```

Compare an app's subscription prices across countries (one row per app per country, each with local in-app purchase prices):

```json
{ "mode": "details", "apps": ["1438388363"], "countries": ["us", "gb", "de", "in", "br", "jp"] }
```

Categories: books, business, education, entertainment, finance, food, games, health, lifestyle, medical, music, navigation, news, photo, productivity, shopping, social, sports, travel, utilities, weather.

### Output

```json
{
  "store": "google_play",
  "rank": 3,
  "appId": "com.spotify.music",
  "title": "Spotify: Music and Podcasts",
  "developer": "Spotify AB",
  "rating": 4.35,
  "ratingCount": 36386750,
  "installs": "1,000,000,000+",
  "price": 0,
  "genre": "Music & Audio",
  "updated": "2026-09-25T08:00:14.000Z",
  "developerEmail": "support@spotify.com",
  "country": "us",
  "query": "music",
  "url": "https://play.google.com/store/apps/details?id=com.spotify.music"
}
```

Every row has the same fields for both stores. Fields a store doesn't publish are `null`: Apple does not publish install counts, Google Play does not publish a version history.

#### Extra App Store fields (details mode, or search and charts with **Full details** on)

Run the same app in several countries to compare local subscription prices.

```json
{
  "store": "app_store",
  "appId": "1438388363",
  "title": "Habit Tracker",
  "summary": "Goal Tracker & ADHD Planner",
  "country": "us",
  "ratingHistogram": { "1": 2370, "2": 1090, "3": 3538, "4": 10848, "5": 129553 },
  "chartPosition": 112,
  "chartName": "top-free",
  "chartGenre": "Productivity",
  "inAppPurchaseList": [
    {
      "id": "1444839241", "name": "Enhance Yourself", "price": 5.99, "priceFormatted": "$5.99", "currency": "USD",
      "isSubscription": true, "period": "P1Y",
      "introOffer": { "type": "FreeTrial", "period": "P3D", "periods": 1, "price": 0 },
      "subscriptionGroup": "Habify Sub", "familyShareable": true
    }
  ],
  "privacyLabels": [
    { "type": "Data Not Linked to You", "typeId": "DATA_NOT_LINKED_TO_YOU", "purpose": "Analytics", "purposeId": "ANALYTICS",
      "category": "Diagnostics", "categoryId": "DIAGNOSTICS", "dataTypes": ["Crash Data"] }
  ],
  "versionHistory": [
    { "version": "2.14.23", "date": "2026-08-15T15:18:18.000Z", "notes": "- add shortcut supports ..." }
  ],
  "similarApps": ["1547137474", "1450486923"],
  "developerOtherApps": ["993066159", "1499313977"],
  "inAppEvents": [],
  "seller": "Inner Grow Limited",
  "privacyPolicyUrl": "http://intuitive.studio/habify/privacy",
  "supportUrl": "https://intuitive.studio/habify",
  "sizeBytes": 339836928
}
```

#### Extra Google Play fields (details mode, or search and charts with **Full details** on)

`ratingHistogram`, `maxInstalls` (the install count Google Play reports, finer than the "1,000,000+" bucket), `inAppPurchaseRange`, `adSupported`, `releaseNotes`, `privacyPolicyUrl`, `screenshots`, and the developer's published contact: `developerEmail`, `developerWebsite`, `developerAddress`, `developerPhone`.

### Limits worth knowing

- App Store search returns at most 200 results per keyword, and charts at most 200 apps.
- Google Play search returns about 30–250 results depending on the keyword, and some small category charts are shorter than the limit (for example, top grossing finance in the UK lists 15 apps). Those are Google's limits, not this actor's.
- Search and chart rows are brief by default. Turn on **Full details** to fetch each app's full record (one extra request per app, so slower).
- The App Store lists at most 10 in-app purchases per app (the ones Apple shows on the app page), the last 25 versions, and 10 similar apps.
- App Store text (title, subtitle, privacy label names) comes in the main language of the country's store. Privacy labels also carry language-independent IDs (`typeId`, `purposeId`, `categoryId`) so you can compare countries.
- An app that isn't sold in a country is skipped with a warning in the log; the run still succeeds.
- The App Store row is built from two Apple sources. If one of them is down, you still get the row with the fields the other one has.

### Pricing

You pay per app row delivered. Set a maximum cost per run in the run options and the actor stops cleanly when it reaches it.

| Event | Price |
|---|---|
| App row | $0.50 per 1,000 |
| Run start | $0.002 |

### Support

Open an issue on the Issues tab. Broken runs get fixed first.

# Actor input Schema

## `mode` (type: `string`):

Search results for keywords, top charts, or details for a list of apps.

## `stores` (type: `array`):

Which stores to query.

## `queries` (type: `array`):

Keywords to search in the stores (search mode).

## `chart` (type: `string`):

Which chart to fetch (charts mode).

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

Leave empty for all apps. One of: books, business, education, entertainment, finance, food, games, health, lifestyle, medical, music, navigation, news, photo, productivity, shopping, social, sports, travel, utilities, weather.

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

Google Play package or URL, App Store ID or URL. App Store rows include in-app purchase prices, privacy labels, version history and chart position.

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

Two-letter country codes (us, gb, in, de...).

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

Maximum apps per keyword or chart, per store.

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

Search and chart rows are brief. Turn this on to fetch every app's full record: description, installs and developer contact on Google Play; in-app purchase prices, privacy labels and version history on the App Store. One extra request per app, so slower. Details mode always returns the full record.

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

Two-letter language code for Google Play.

## Actor input object example

```json
{
  "mode": "search",
  "stores": [
    "app_store",
    "google_play"
  ],
  "queries": [
    "budget planner"
  ],
  "chart": "top_free",
  "apps": [
    "com.spotify.music",
    "324684580"
  ],
  "countries": [
    "us"
  ],
  "maxResults": 100,
  "fullDetails": false,
  "language": "en"
}
```

# Actor output Schema

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

All rows the run collected, one per item, in the default dataset.

# 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 = {
    "queries": [
        "budget planner"
    ],
    "apps": [
        "com.spotify.music",
        "324684580"
    ],
    "countries": [
        "us"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("steadyrows/app-store-google-play-apps").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 = {
    "queries": ["budget planner"],
    "apps": [
        "com.spotify.music",
        "324684580",
    ],
    "countries": ["us"],
}

# Run the Actor and wait for it to finish
run = client.actor("steadyrows/app-store-google-play-apps").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 '{
  "queries": [
    "budget planner"
  ],
  "apps": [
    "com.spotify.music",
    "324684580"
  ],
  "countries": [
    "us"
  ]
}' |
apify call steadyrows/app-store-google-play-apps --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,steadyrows/app-store-google-play-apps"
        }
    }
}
```

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/8lAkOryWugDR96CX5/builds/oWy2NFcvL2RXcDkzy/openapi.json
