# 📱 App Store & Google Play Metadata Scraper — One Schema (`nexgenwatch/app-store-metadata`) Actor

Scrape public Apple App Store and Google Play app metadata by app ID — title, developer, description, category, price, rating, rating count, version, icon, screenshots. Watch mode returns changed records. Public, logged-out.

- **URL**: https://apify.com/nexgenwatch/app-store-metadata.md
- **Developed by:** [NexGen Watch](https://apify.com/nexgenwatch) (community)
- **Categories:** Business, AI
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $2.00 / 1,000 app records

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/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 Metadata Scraper — One Schema

ASO teams and analysts pay for one normalized app record across both major mobile stores — not two brittle scrapers with mismatched fields.

### What you get

- Public catalog metadata from Apple and Google Play in one 17-field app-record schema
- Title, developer, description, category, price, currency, rating, and rating count
- Current version, last-updated date, icon URL, and screenshot URLs
- Store, country, source URL, and collection timestamp on every record
- Optional watch mode that emits only records that changed since the last run

### Use cases by team

- **ASO teams:** Benchmark your listing's metadata against competitors across both stores at once.
- **Analysts:** Pull a clean cross-store app record for dashboards without normalizing fields by hand.
- **Growth:** Watch competitor price, rating, and version changes and react when they move.
- **Data engineering:** Get one contract for iOS and Android instead of maintaining two parsers.

### Example inputs

*Both stores in one run*

```json
{
  "app_ids": [
    "284882215",
    "com.spotify.music"
  ],
  "watchMode": false
}
```

*Apple only*

```json
{
  "app_ids": [
    "284882215"
  ],
  "country": "us"
}
```

*Watch for metadata changes*

```json
{
  "app_ids": [
    "com.spotify.music"
  ],
  "watchMode": true
}
```

### 📊 Sample Output

```json
{
  "store": "apple",
  "app_id": "284882215",
  "title": "Facebook",
  "developer": "Meta Platforms, Inc.",
  "category": "Social Networking",
  "price": 0,
  "currency": "USD",
  "rating": 4.1,
  "rating_count": 21500000,
  "version": "500.0",
  "updated_at": "2026-07-15",
  "icon_url": "https://.../icon.png",
  "country": "us",
  "source_url": "https://apps.apple.com/us/app/id284882215",
  "collected_at": "2026-07-21T00:00:00Z"
}
```

### How it works

Pass a mix of Apple numeric IDs and Google Play package names in one `app_ids` list. It queries Apple's public Search/Lookup surface and Google Play, then normalizes both into a single app-record contract so downstream code never has to branch per store. Public catalog surfaces only.

### Pricing

| Event | FREE | BRONZE | SILVER | GOLD+ |
|---|---|---|---|---|
| Actor start (`apify-actor-start`) | $0.02 | $0.02 | $0.02 | $0.02 |
| App record (`app-record`) | $0.003 | $0.0027 | $0.0024 | $0.002 |
| Watch check (`watch-check`) | $0.10 | $0.09 | $0.08 | $0.067 |

Prices are the filed pay-per-event amounts per plan tier (PLATINUM/DIAMOND match GOLD). Worked example (FREE tier): 1,000 × `app-record` = $0.02 start + 1,000 × $0.003 = **$3.02**. Blocked or zero-result runs do not intentionally charge; watch runs with no delta charge only the watch check. New to Apify? [Start free](https://apify.com/fpr=2ayu9b).

### Run it — API, CLI, MCP

API:

```bash
curl -X POST "https://api.apify.com/v2/acts/nexgenwatch~app-store-metadata/runs?token=$APIFY_TOKEN" \
  -H "Content-Type: application/json" -d @input.json
```

CLI:

```bash
apify call nexgenwatch/app-store-metadata -i @input.json
```

MCP: expose `nexgenwatch/app-store-metadata` through Apify's MCP server, select it as a tool, and pass the same input object.

### Related actors — App Intelligence cluster

| Actor | What it does |
|---|---|
| [Review Sentiment Analyzer](https://apify.com/nexgenwatch/review-sentiment-analyzer?fpr=2ayu9b) | Turn any review set into themes, complaints, sentiment % and trends. |
| [Apple App Store Reviews](https://apify.com/nexgenwatch/ios-app-reviews?fpr=2ayu9b) | Scrape public Apple App Store reviews for any app. |
| [Google Play Reviews](https://apify.com/nexgenwatch/google-play-reviews?fpr=2ayu9b) | Scrape public Google Play reviews for any app. |
| [App Rankings Tracker](https://apify.com/nexgenwatch/app-rankings-tracker?fpr=2ayu9b) | Track Apple App Store top-chart rankings by country. |
| [ASO Keyword Tracker](https://apify.com/nexgenwatch/aso-keyword-tracker?fpr=2ayu9b) | Track keyword rankings across App Store & Google Play. |

### Compliance & honest limits

- Public catalog metadata only — no login, CAPTCHA, paywall, or access-control defeating.
- Fields reflect what each store exposes publicly; a field absent at the source is returned empty, not guessed.
- A source-confirmed empty result is `SUCCEEDED-0: GENUINE_EMPTY`; exhausted retries fail and truncated runs are `PARTIAL`.

### FAQ

**Can I mix iOS and Android IDs?**

Yes — that is the point. Put Apple numeric IDs and Play package names in the same `app_ids` list; both normalize to one schema.

**Which fields come back?**

17: store, app\_id, title, developer, description, category, price, currency, rating, rating\_count, version, updated\_at, icon\_url, screenshots, country, source\_url, collected\_at.

**Does zero mean blocked?**

No. A confirmed-empty lookup is `GENUINE_EMPTY`; only exhausted retries fail.

**How does watch mode work?**

Set `watchMode: true`. Later runs emit only records whose metadata changed since the baseline.

**How is it priced?**

$0.02 per run start plus $0.0015 per app record; watch checks with no change cost $0.05.

**Can I get screenshots and icons?**

Yes — `icon_url` and `screenshots` URLs are included where the store exposes them.

**Does it pair with rankings and keywords?**

Yes — it's the metadata anchor for the App Store Rankings Tracker and ASO Keyword Tracker.

### Troubleshooting

- **Missing fields?** A store not exposing a field returns it empty by design — it is never fabricated.
- **Wrong country's record?** Set `country`; it defaults to US.
- **Play app not found?** Use the exact package name from the store URL's `id=` parameter.
- **Watch mode emitting everything?** The first run seeds the baseline; change-only deltas start on the second run.
- **Need the reviews too?** Pair with the Apple or Google Play reviews scrapers.

### About

Part of the NexGenData App Intelligence cluster — the normalized cross-store anchor the ranking and keyword actors build on. Built by NexGenData. Questions or need a custom feed? Open an issue on the Actor page.

# Actor input Schema

## `app_ids` (type: `array`):

Apple numeric IDs or Google Play package IDs.

## `search_terms` (type: `array`):

Optional discovery terms.

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

Storefronts to query.

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

Two-letter storefront country code.

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

Two-letter result language code.

## `max_items` (type: `integer`):

Hard cap on records delivered by this run.

## `watchMode` (type: `boolean`):

Seed a named KV baseline on first run, then emit only new or changed records.

## `proxy_configuration` (type: `object`):

Optional Apify proxy settings; a fresh session is requested for every retry.

## Actor input object example

```json
{
  "app_ids": [
    "284882215",
    "com.spotify.music"
  ],
  "search_terms": [],
  "stores": [
    "apple",
    "google_play"
  ],
  "country": "us",
  "language": "en",
  "max_items": 100,
  "watchMode": false,
  "proxy_configuration": {
    "useApifyProxy": true
  }
}
```

# Actor output Schema

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

No description

# 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 = {};

// Run the Actor and wait for it to finish
const run = await client.actor("nexgenwatch/app-store-metadata").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 = {}

# Run the Actor and wait for it to finish
run = client.actor("nexgenwatch/app-store-metadata").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 '{}' |
apify call nexgenwatch/app-store-metadata --silent --output-dataset

```

## MCP server setup

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

```

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/acts/li86xqpDUOiwcbxhe/builds/4ssQ3iuHrwMlCz8ox/openapi.json
