# 🍏 Apple App Store Scraper (`taroyamada/apple-app-store-intelligence`) Actor

Extract iOS app metadata, user reviews, aggregate ratings, and pricing directly from the App Store. Perfect for ASO tracking and competitor analysis.

- **URL**: https://apify.com/taroyamada/apple-app-store-intelligence.md
- **Developed by:** [太郎 山田](https://apify.com/taroyamada) (community)
- **Categories:** Marketing, SEO tools
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, NaN bookmarks
- **User rating**: No ratings yet

## Pricing

from $9.00 / 1,000 results

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 a software tools running on the Apify platform, for all kinds of web data extraction and automation use cases.
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.

In JavaScript/TypeScript projects, use official [JavaScript/TypeScript client](https://docs.apify.com/api/client/js.md):

```bash
npm install apify-client
```

In Python projects, use official [Python client library](https://docs.apify.com/api/client/python.md):

```bash
pip install apify-client
```

In shell scripts, use [Apify CLI](https://docs.apify.com/cli/docs.md):

````bash
# MacOS / Linux
curl -fsSL https://apify.com/install-cli.sh | bash
# Windows
irm https://apify.com/install-cli.ps1 | iex
```bash

In AI frameworks, you might use the [Apify MCP server](https://docs.apify.com/platform/integrations/mcp.md).

If your project is in a different language, use 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

## Apple App Store Intelligence API | Ratings, Reviews & Pricing

Extract structured mobile application details and essential metadata straight from the Apple App Store to power your App Store Optimization (ASO) and market research. This highly efficient data scraper leverages the public iTunes Lookup API to scrape deep profiles using standard web urls or app IDs. Because it operates without requiring heavy browser automation, it ensures fast, reliable results that easily integrate into your other mobile marketing tools.

ASO professionals and mobile developers run this scraper to monitor iOS app pages, track category rankings, and analyze how competitors position their products globally. By choosing to schedule the website extraction daily or weekly, you can build a historical database of app changes, track pricing fluctuations across different regional stores, and monitor aggregate ratings immediately after new version releases.

Every successful run delivers precisely scraped data ready for immediate analysis. Concrete outputs include extensive app metadata such as the official application name, developer contact information, genres, bundle ID, supported devices, age ratings, pricing configurations, and comprehensive aggregate ratings. Export these actionable search results to refine your own listings and spot emerging trends in the iOS ecosystem.

### Store Quickstart

- Start with 1–3 app URLs or numeric app IDs and set `country` to the storefront you actually care about.
- Keep `reviewLimit` at 25–50 for a fast first pass, then raise it only for deeper theme analysis.
- Use `dryRun: true` before enabling scheduled webhook delivery.

### What it does

For each App Store URL or numeric app ID you provide, the actor:

1. **Fetches app metadata** via Apple's public iTunes Lookup API — name, developer, bundle ID, genres, icon, screenshots, age rating, supported devices, languages, version, release notes, and storefront pricing.
2. **Extracts the aggregate rating** — overall average, total review count, and current-version rating/count.
3. **Extracts pricing** — free/paid indicator, price, currency, and formatted price string.
4. **Samples individual reviews** from Apple's public RSS customer review feed (up to 500 per storefront) — title, body, star rating, author, app version, date, and helpfulness votes.
5. **Builds keyword-based rollups** — top themes (crashes, performance, UI, ads, privacy, etc.) and feature-request excerpts.

If any surface is unavailable, the actor returns explicit `warnings` instead of failing silently.

### Data sources

| Surface | Source | Method |
|---------|--------|--------|
| App metadata | iTunes Lookup API (`itunes.apple.com/lookup`) | JSON API |
| Rating | iTunes Lookup API | JSON API |
| Pricing | iTunes Lookup API | JSON API |
| Reviews | RSS feed (`itunes.apple.com/{cc}/rss/customerreviews`) | JSON RSS |
| Theme rollups | Review text | Keyword matching |

### Use Cases

| Who | Why |
|---|---|
| **ASO teams** | Track rating drift, pricing, and storefront metadata by market |
| **Product managers** | Review public feedback after releases without App Store Connect access |
| **Mobile analysts** | Compare App Store positioning and review themes across competitors |
| **Support teams** | Pull review samples for issue triage and customer-voice summaries |

### Input

| Field | Type | Default | Description |
|-------|------|---------|-------------|
| `appUrls` | string[] | *required* | Apple App Store URLs or numeric app IDs |
| `country` | string | `"us"` | Two-letter storefront code (e.g. `us`, `gb`, `jp`) |
| `reviewLimit` | integer | 100 | Max reviews per app (1–500) |
| `timeoutMs` | integer | 20000 | HTTP timeout per API call in ms |
| `delivery` | string | `"dataset"` | `"dataset"` or `"webhook"` |
| `webhookUrl` | string | — | Webhook URL when delivery=webhook |
| `dryRun` | boolean | false | Skip dataset/webhook writes |

#### Accepted URL formats

- Full URL: `https://apps.apple.com/us/app/spotify-music-and-podcasts/id324684580`
- Short URL: `https://apps.apple.com/app/id324684580`
- Numeric ID: `324684580`
- Prefixed ID: `id324684580`

### Output

```jsonc
{
  "meta": {
    "generatedAt": "2025-01-01T00:00:00.000Z",
    "implementationStatus": "live",
    "totalSources": 1,
    "totals": { "apps": 1, "ok": 1, "partial": 0, "errors": 0, "warningCount": 0, "totalReviewsSampled": 50 },
    "notes": ["..."]
  },
  "apps": [
    {
      "appId": "324684580",
      "slug": "spotify-music-and-podcasts",
      "url": "https://apps.apple.com/us/app/spotify-music-and-podcasts/id324684580",
      "status": "ok",
      "app": {
        "name": "Spotify: Music and Podcasts",
        "developer": "Spotify AB",
        "bundleId": "com.spotify.client",
        "primaryGenre": "Music",
        "icon": "https://...",
        "version": "8.9.80",
        "ageRating": "12+",
        "languageCodes": ["EN", "FR", "DE", "JA"],
        "..."
      },
      "rating": { "overall": 4.5, "totalReviews": 12345678, "currentVersionRating": 4.3, "currentVersionReviews": 5432 },
      "pricing": { "isFree": true, "price": 0, "currency": "USD", "formattedPrice": "Free" },
      "reviewSamples": [{ "reviewId": "...", "title": "...", "body": "...", "rating": 5, "author": "...", "date": "...", ... }],
      "rollups": { "themes": [{ "theme": "ease of use", "count": 5 }], "featureRequests": [...] },
      "warnings": [],
      "endpointStatuses": { "lookup": "ok", "reviews": "ok" },
      "error": null
    }
  ]
}
````

### Known limitations

- **Reviews are storefront-specific.** Only reviews from the requested `country` storefront are returned. To get global reviews, run the actor multiple times with different country codes.
- **Review cap: ~500 per storefront.** Apple's RSS feed provides at most 10 pages of 50 reviews (most-recent first). This is a platform limitation.
- **No per-star distribution.** The iTunes Lookup API provides only the aggregate average — no per-star breakdown (1★, 2★, etc.).
- **RSS feed availability.** Apple's RSS review feed may occasionally be unavailable or return empty results for some apps/storefronts. The actor surfaces this as a warning.
- **No private/auth data.** This actor uses only public endpoints — no App Store Connect data, no developer-only metrics.

### Local run

```bash
npm start          ## Uses input.json
npm test           ## Run unit tests
```

### Docker

```bash
docker build -t apple-app-store-intelligence .
docker run --rm apple-app-store-intelligence
```

### Related Actors

Pair this actor with other flagship intelligence APIs in the same portfolio:

- [Google Play Intelligence API](https://apify.com/taroyamada/google-play-intelligence) — compare Android listing signals and public review samples with the same schema style.
- [App Review Intelligence API | App Store + Google Play Summary](https://apify.com/taroyamada/app-review-cross-platform-intelligence) — use the cross-platform flagship when you need one executive summary across both stores.
- [Shopify Store Intelligence API](https://apify.com/taroyamada/shopify-store-intelligence) — pair app feedback with public storefront and merchandising signals.
- [Domain Security Audit API](https://apify.com/taroyamada/domain-trust-monitor) — connect app reputation monitoring with security and trust posture checks on the same brand domains.

### Pricing & Cost Control

Apify Store pricing is usage-based, so total cost mainly follows how many apps and storefronts you analyze plus how many reviews you sample. Check the Store pricing card for the current per-event rates.

- Start with a few app IDs or URLs.
- Keep `reviewLimit` modest unless you need deeper theme rollups.
- Run separate storefronts only for markets that matter.
- Use `dryRun: true` before scheduled runs or webhook delivery.

### ⭐ Was this helpful?

If this actor saved you time, please [**leave a ★ rating**](https://apify.com/taroyamada/apple-app-store-intelligence/reviews) on Apify Store. It takes 10 seconds, helps other developers discover it, and keeps updates free.

Bug report or feature request? Open an issue on the [Issues tab](https://apify.com/taroyamada/apple-app-store-intelligence/issues) of this actor.

# Actor input Schema

## `appUrls` (type: `array`):

One or more Apple App Store URLs (e.g. https://apps.apple.com/us/app/spotify/id324684580) or numeric app IDs (e.g. 324684580).

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

Two-letter storefront code (e.g. us, gb, jp). Controls which country's reviews are fetched and which pricing/availability is returned.

## `reviewLimit` (type: `integer`):

Maximum reviews to collect per app (1–500). Reviews come from Apple's public RSS feed, limited to ~500 per storefront.

## `timeoutMs` (type: `integer`):

HTTP request timeout per API call in milliseconds.

## `delivery` (type: `string`):

Where to send results: dataset or webhook.

## `webhookUrl` (type: `string`):

Webhook URL to POST results to when delivery=webhook.

## `dryRun` (type: `boolean`):

Run without saving results to dataset or webhook.

## Actor input object example

```json
{
  "appUrls": [
    "https://apps.apple.com/us/app/spotify-music-and-podcasts/id324684580"
  ],
  "country": "us",
  "reviewLimit": 100,
  "timeoutMs": 20000,
  "delivery": "dataset",
  "dryRun": false
}
```

# 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 = {
    "appUrls": [
        "https://apps.apple.com/us/app/spotify-music-and-podcasts/id324684580"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("taroyamada/apple-app-store-intelligence").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 = { "appUrls": ["https://apps.apple.com/us/app/spotify-music-and-podcasts/id324684580"] }

# Run the Actor and wait for it to finish
run = client.actor("taroyamada/apple-app-store-intelligence").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 '{
  "appUrls": [
    "https://apps.apple.com/us/app/spotify-music-and-podcasts/id324684580"
  ]
}' |
apify call taroyamada/apple-app-store-intelligence --silent --output-dataset

```

## MCP server setup

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

```

## OpenAPI specification

```json
{
    "openapi": "3.0.1",
    "info": {
        "title": "🍏 Apple App Store Scraper",
        "description": "Extract iOS app metadata, user reviews, aggregate ratings, and pricing directly from the App Store. Perfect for ASO tracking and competitor analysis.",
        "version": "0.1",
        "x-build-id": "5Vj0nSjc8bhDaXPxD"
    },
    "servers": [
        {
            "url": "https://api.apify.com/v2"
        }
    ],
    "paths": {
        "/acts/taroyamada~apple-app-store-intelligence/run-sync-get-dataset-items": {
            "post": {
                "operationId": "run-sync-get-dataset-items-taroyamada-apple-app-store-intelligence",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor, waits for its completion, and returns Actor's dataset items in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK"
                    }
                }
            }
        },
        "/acts/taroyamada~apple-app-store-intelligence/runs": {
            "post": {
                "operationId": "runs-sync-taroyamada-apple-app-store-intelligence",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor and returns information about the initiated run in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/runsResponseSchema"
                                }
                            }
                        }
                    }
                }
            }
        },
        "/acts/taroyamada~apple-app-store-intelligence/run-sync": {
            "post": {
                "operationId": "run-sync-taroyamada-apple-app-store-intelligence",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor, waits for completion, and returns the OUTPUT from Key-value store in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK"
                    }
                }
            }
        }
    },
    "components": {
        "schemas": {
            "inputSchema": {
                "type": "object",
                "required": [
                    "appUrls"
                ],
                "properties": {
                    "appUrls": {
                        "title": "App URLs",
                        "type": "array",
                        "description": "One or more Apple App Store URLs (e.g. https://apps.apple.com/us/app/spotify/id324684580) or numeric app IDs (e.g. 324684580).",
                        "items": {
                            "type": "string"
                        }
                    },
                    "country": {
                        "title": "Country / Storefront",
                        "minLength": 2,
                        "type": "string",
                        "description": "Two-letter storefront code (e.g. us, gb, jp). Controls which country's reviews are fetched and which pricing/availability is returned.",
                        "default": "us"
                    },
                    "reviewLimit": {
                        "title": "Review Limit",
                        "minimum": 1,
                        "maximum": 500,
                        "type": "integer",
                        "description": "Maximum reviews to collect per app (1–500). Reviews come from Apple's public RSS feed, limited to ~500 per storefront.",
                        "default": 100
                    },
                    "timeoutMs": {
                        "title": "Timeout (ms)",
                        "minimum": 5000,
                        "maximum": 60000,
                        "type": "integer",
                        "description": "HTTP request timeout per API call in milliseconds.",
                        "default": 20000
                    },
                    "delivery": {
                        "title": "Delivery",
                        "enum": [
                            "dataset",
                            "webhook"
                        ],
                        "type": "string",
                        "description": "Where to send results: dataset or webhook.",
                        "default": "dataset"
                    },
                    "webhookUrl": {
                        "title": "Webhook URL",
                        "type": "string",
                        "description": "Webhook URL to POST results to when delivery=webhook."
                    },
                    "dryRun": {
                        "title": "Dry Run",
                        "type": "boolean",
                        "description": "Run without saving results to dataset or webhook.",
                        "default": false
                    }
                }
            },
            "runsResponseSchema": {
                "type": "object",
                "properties": {
                    "data": {
                        "type": "object",
                        "properties": {
                            "id": {
                                "type": "string"
                            },
                            "actId": {
                                "type": "string"
                            },
                            "userId": {
                                "type": "string"
                            },
                            "startedAt": {
                                "type": "string",
                                "format": "date-time",
                                "example": "2025-01-08T00:00:00.000Z"
                            },
                            "finishedAt": {
                                "type": "string",
                                "format": "date-time",
                                "example": "2025-01-08T00:00:00.000Z"
                            },
                            "status": {
                                "type": "string",
                                "example": "READY"
                            },
                            "meta": {
                                "type": "object",
                                "properties": {
                                    "origin": {
                                        "type": "string",
                                        "example": "API"
                                    },
                                    "userAgent": {
                                        "type": "string"
                                    }
                                }
                            },
                            "stats": {
                                "type": "object",
                                "properties": {
                                    "inputBodyLen": {
                                        "type": "integer",
                                        "example": 2000
                                    },
                                    "rebootCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "restartCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "resurrectCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "computeUnits": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            },
                            "options": {
                                "type": "object",
                                "properties": {
                                    "build": {
                                        "type": "string",
                                        "example": "latest"
                                    },
                                    "timeoutSecs": {
                                        "type": "integer",
                                        "example": 300
                                    },
                                    "memoryMbytes": {
                                        "type": "integer",
                                        "example": 1024
                                    },
                                    "diskMbytes": {
                                        "type": "integer",
                                        "example": 2048
                                    }
                                }
                            },
                            "buildId": {
                                "type": "string"
                            },
                            "defaultKeyValueStoreId": {
                                "type": "string"
                            },
                            "defaultDatasetId": {
                                "type": "string"
                            },
                            "defaultRequestQueueId": {
                                "type": "string"
                            },
                            "buildNumber": {
                                "type": "string",
                                "example": "1.0.0"
                            },
                            "containerUrl": {
                                "type": "string"
                            },
                            "usage": {
                                "type": "object",
                                "properties": {
                                    "ACTOR_COMPUTE_UNITS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_WRITES": {
                                        "type": "integer",
                                        "example": 1
                                    },
                                    "KEY_VALUE_STORE_LISTS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_INTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_EXTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_SERPS": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            },
                            "usageTotalUsd": {
                                "type": "number",
                                "example": 0.00005
                            },
                            "usageUsd": {
                                "type": "object",
                                "properties": {
                                    "ACTOR_COMPUTE_UNITS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_WRITES": {
                                        "type": "number",
                                        "example": 0.00005
                                    },
                                    "KEY_VALUE_STORE_LISTS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_INTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_EXTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_SERPS": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }
}
```
