# App Store and Google Play Data, Ranks and Charts (`sourcedirect/app-data-scraper`) Actor

App details, keyword search rankings and top charts from Google Play and the Apple App Store in one run. See where an app ranks for a keyword in any country, or pull install counts, ratings, pricing and developer contacts.

- **URL**: https://apify.com/sourcedirect/app-data-scraper.md
- **Developed by:** [Kurt Landman](https://apify.com/sourcedirect) (community)
- **Categories:** SEO tools, E-commerce, Business
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $0.50 / 1,000 rows

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

App details, **keyword rankings** and top charts from both app stores in one run.

Point it at an app and get everything the store publishes about it. Point it at a keyword and get the ranked results from both stores, so you can see exactly where an app sits for a search term in any country.

***

### Three things it does

**1. Look up apps.** Paste a Google Play package name, an App Store ID, or a store URL from either store. You get ratings, install counts, pricing, version history, category, developer contact details and screenshots.

**2. Rank keywords.** Give it search terms and it returns the ranked results from both stores, with a `rank` on every row. Run the same keyword across several countries to see where you place in each market. This is the app store optimisation use case, and it is the reason most people run something like this.

**3. Pull top charts.** Apple's top free and top paid charts for any country. Google Play publishes no equivalent open chart feed, so charts are App Store only, that is Google's limit, not the Actor's.

### Input

```json
{
  "apps": ["com.spotify.music", "https://apps.apple.com/us/app/id324684580"],
  "searchTerms": ["music streaming", "podcast app"],
  "topCharts": ["top-free"],
  "countries": ["us", "gb", "de"],
  "language": "en",
  "maxResultsPerSearch": 50
}
```

You can use any one of `apps`, `searchTerms` or `topCharts` on its own, you do not need all three.

### What you get

Every row carries a `type` telling you what it is:

| `type` | What it is |
|---|---|
| `app` | Full details for one app in one country |
| `searchResult` | One app's position for one keyword in one country, with `rank` |
| `chartEntry` | One app's place in a top chart, with `rank` |

Both stores are normalised to the same column names, so Apple and Google rows sit side by side in one table.

A few fields only exist on one side, and are left empty rather than faked:

- `installs` and `developerEmail`, Google Play publishes these, Apple does not.
- `size`, the App Store publishes it, Google Play does not.

### What it costs

$0.50 per 1,000 rows. You are charged for rows actually returned, with no monthly fee and no per-run start fee.

### Common uses

- **Track your keyword rank** over time and across countries, on both stores at once.
- **Size up a category**, pull the top 50 for a keyword and compare ratings, install counts and pricing.
- **Competitor watch**, see when a rival ships an update, changes price, or moves category.
- **Find publishers**, Google Play exposes developer contact details on app records.

### Notes and limits

- Not every app is published in every storefront. An empty result for a country is a real answer, not a failure; the run summary records what came back from where.
- Rankings are what the store returns for that country and language at the moment you run it. They move, which is the point of tracking them.
- Both stores are read through their public interfaces. No login, and nothing private is accessed.

# Actor input Schema

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

Apps you want the full details for. Paste a Google Play package name (`com.spotify.music`), an App Store ID (`324684580`), or a store URL from either store.

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

Search terms to run against both stores. Every result comes back with its `rank`, so you can see exactly where an app sits for a keyword in each country. This is the app store optimisation use case.

## `topCharts` (type: `array`):

Apple top charts to pull for each country. Google Play publishes no equivalent open chart feed, so this is App Store only.

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

Two-letter country codes, e.g. `us`, `gb`, `de`, `jp`. Rankings and pricing differ per country, so this is where the interesting comparisons come from.

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

Two-letter language code for Google Play, e.g. `en`, `de`. The App Store uses each storefront's own language.

## `maxResultsPerSearch` (type: `integer`):

How many ranked results to keep per keyword, per store, per country.

## Actor input object example

```json
{
  "apps": [
    "com.spotify.music"
  ],
  "searchTerms": [
    "music streaming"
  ],
  "countries": [
    "us"
  ],
  "language": "en",
  "maxResultsPerSearch": 50
}
```

# Actor output Schema

## `rows` (type: `string`):

App details, ranked keyword results and chart entries.

## `rowsCsv` (type: `string`):

The same results as a CSV download.

## `summary` (type: `string`):

What was requested, how many rows came back, and anything that failed.

# 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": [
        "com.spotify.music"
    ],
    "searchTerms": [
        "music streaming"
    ],
    "countries": [
        "us"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("sourcedirect/app-data-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": ["com.spotify.music"],
    "searchTerms": ["music streaming"],
    "countries": ["us"],
}

# Run the Actor and wait for it to finish
run = client.actor("sourcedirect/app-data-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 '{
  "apps": [
    "com.spotify.music"
  ],
  "searchTerms": [
    "music streaming"
  ],
  "countries": [
    "us"
  ]
}' |
apify call sourcedirect/app-data-scraper --silent --output-dataset

```

## MCP server setup

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

```

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/actors/dCAOEn1CezZUwIWJU/builds/UVvPlNe8BBnqCLxFH/openapi.json
