# Apple Media Scraper (`aurenic/apple-media-scraper`) Actor

Scrape apps, podcasts, music, movies, TV shows, ebooks, and audiobooks from Apple's iTunes Store and App Store via the official public API. Includes reviews and top charts. No API key, no browser, no proxy.

- **URL**: https://apify.com/aurenic/apple-media-scraper.md
- **Developed by:** [Aurenic](https://apify.com/aurenic) (community)
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $0.80 / 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/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

## Apple Media Scraper

Scrape apps, podcasts, music, movies, TV shows, ebooks, and audiobooks from Apple's iTunes Store and App Store via the official public API. Includes customer reviews, top charts, and developer catalogs. No API key, no browser, no proxy.

### What does Apple Media Scraper do?

Scrape every Apple media catalog in one actor. Four modes:

- **Search by keyword** — search any Apple storefront by term. Returns up to 200 results per query with full metadata: name, developer, price, rating, rating count, genre, version, screenshots, description, minimum OS, and more.
- **Lookup by ID** — pass numeric Apple IDs (the number in any App Store URL), get the same full metadata. Supports batched lookups of 200 IDs per request.
- **Developer catalog** — pass a developer/artist ID, get their entire catalog in one call.
- **Top charts** — fetch Top Free, Top Paid, or Top Grossing charts for any country and genre.

Optional **App Store customer reviews** via Apple's own RSS feed — up to 500 per app per storefront, sorted by most recent or most helpful.

Every result comes from Apple's official, public, unauthenticated endpoints:

- `itunes.apple.com/search` — catalog search
- `itunes.apple.com/lookup` — by ID or developer
- `itunes.apple.com/{country}/rss/customerreviews/...` — customer reviews
- `rss.applemarketingtools.com` — top charts

No login, no App Store Connect account, no API key.

### Output fields

#### Apps and other media

| Field | Description |
|---|---|
| recordType | `app`, `song`, `album`, `podcast`, `movie`, `tvShow`, `ebook`, `audiobook` |
| trackId / collectionId | Apple numeric IDs |
| bundleId | iOS bundle identifier (apps) |
| name | Track/collection/app name |
| artistName / artistId | Developer or artist name and ID |
| url | Direct App Store / iTunes URL |
| price / formattedPrice / currency | Price in the storefront's currency |
| rating | Average user rating (0–5) |
| ratingCount / ratingCountCurrentVersion | Total ratings and ratings on the current version |
| contentRating | Age rating (4+, 9+, 12+, 17+) |
| genre / genres | Primary genre and all genres |
| version / minimumOs | App version and minimum OS |
| fileSize | Download size in bytes |
| releaseDate / currentVersionReleaseDate | Original and latest release timestamps |
| description / releaseNotes | Full text |
| artwork / artwork100 | Icon URLs at multiple resolutions |
| screenshots / ipadScreenshots | Screenshot URLs |
| supportedDevices / languageCodes | Device and language support |
| sellerName / sellerUrl | App Store seller |

#### Reviews

| Field | Description |
|---|---|
| recordType | `review` |
| appId / appName | Which app the review belongs to |
| reviewId | Apple review ID |
| rating | Star rating (1–5) |
| title / content | Review text |
| author | Reviewer pseudonym |
| version | App version reviewed |
| updatedAt | Timestamp |
| voteSum / voteCount | Helpfulness votes |

#### Chart entries

| Field | Description |
|---|---|
| recordType | `chart-entry` |
| chartType | `top-free`, `top-paid`, or `top-grossing` |
| rank | Position in the chart |
| appId / name / artistName | App identity |
| price / formattedPrice | Price in local currency |
| category / categoryId | App category |
| releaseDate / artwork | Metadata |

### Who is it for?

- **ASO specialists** tracking keyword rankings, competitor metadata, and category charts
- **App market researchers** building datasets of the App Store and iTunes catalog
- **Podcast producers** extracting podcast metadata, episode counts, and ratings across regions
- **Music and media analysts** comparing prices, release dates, and genres across storefronts
- **Product managers** monitoring competitor version history, release notes, and rating drift
- **Data scientists** feeding reviews into sentiment models and NLP pipelines

### Pricing

**$0.60 per 1,000 results.** No subscription.

| Results | Cost |
|---|---|
| 100 | $0.06 |
| 1,000 | $0.60 |
| 10,000 | $6.00 |

### How to use it

1. Pick a **Mode**.
2. Fill in the mode's inputs: search terms, Apple IDs, developer IDs, or chart type.
3. Choose the **Country** storefront (any of Apple's 175 storefronts).
4. Optionally enable **Include Reviews** for apps.
5. Click **Start**.

### Output example

```json
{
  "recordType": "app",
  "trackId": 544007664,
  "bundleId": "com.google.ios.youtube",
  "name": "YouTube: Watch, Listen, Stream",
  "artistName": "Google LLC",
  "artistId": 283311841,
  "url": "https://apps.apple.com/us/app/youtube-watch-listen-stream/id544007664",
  "price": 0,
  "formattedPrice": "0 USD",
  "currency": "USD",
  "rating": 4.68,
  "ratingCount": 45238910,
  "ratingCountCurrentVersion": 1283921,
  "contentRating": "12+",
  "genre": "Photo & Video",
  "genres": ["Photo & Video", "Entertainment"],
  "version": "19.42.1",
  "minimumOs": "15.0",
  "fileSize": "289431552",
  "releaseDate": "2012-09-11T20:19:35Z",
  "currentVersionReleaseDate": "2026-09-14T18:00:00Z",
  "description": "Get the official YouTube app on iPhone and iPad...",
  "artwork": "https://is1-ssl.mzstatic.com/image/thumb/Purple221/v4/.../512x512bb.jpg",
  "screenshots": ["https://is1-ssl.mzstatic.com/image/thumb/..."],
  "supportedDevices": ["iPhone17,1", "iPhone17,2"],
  "languageCodes": ["EN", "AR", "CA", "DE"],
  "sellerName": "Google LLC",
  "sellerUrl": "https://www.google.com",
  "country": "us",
  "query": "photo editor",
  "scrapedAt": "2026-09-21T12:00:00.000Z"
}
```

### Technical details

- Built on Apple's **official public iTunes Search/Lookup API** and RSS feeds — no browser, no proxy needed
- **~20 requests/minute per IP** rate limit handled via self-throttling + optional datacenter proxy rotation
- **No API key, no login, no App Store Connect account** — Apple's endpoints are fully public
- **Multi-storefront** — 175 App Store countries supported via the `country` parameter
- **Cross-media** — apps, podcasts, music, movies, TV, ebooks, and audiobooks through the same API
- **Reviews via Apple's RSS feed** — the same feed Apple serves on its own store pages, requested as JSON
- **Charts via Apple's marketing tools RSS** — top-free, top-paid, and top-grossing, per country and genre

### Known limits

- **~20 requests/minute per IP.** The actor self-throttles and rotates datacenter proxies. For very large runs, split across sessions or schedule multiple runs.
- **Apple deprecated its public review feed in 2026** in some regions. Where it still works, ~500 reviews per app per storefront per sort order are available.
- **Search results cap at 200 per query.** For deeper coverage, split by keyword variations or storefront.
- **Developer catalogs return in a single call.** Apple's lookup API does not paginate developer portfolios.
- **Prices are in the storefront's local currency.** Use the `country` parameter to get pricing for the region you care about.

### FAQ

**Do I need an Apple Developer account?** No. The Search and Lookup APIs are fully public.

**Do I need a proxy?** Datacenter rotation is enabled by default and helps with the ~20 req/min per-IP limit. Disable it for small runs.

**How do I get an app's numeric ID?** It's the number in the App Store URL: `apps.apple.com/us/app/youtube/id544007664` → ID is `544007664`.

**Do reviews vary by country?** Yes. Each storefront has its own reviews in its own language. Run once per country you care about.

**Can I get Google Play data too?** Not in this actor. A separate Google Play scraper covers that.

**How do I export data?** After a run, go to Storage → Export as JSON, CSV, Excel.

### Support

Open an issue on the Actor's page for bugs or feature requests.

# Actor input Schema

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

What to fetch from Apple.

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

Keywords to search (e.g. 'photo editor', 'fitness'). Used in search mode.

## `media` (type: `string`):

Which Apple catalog to search. 'software' = iOS App Store.

## `entity` (type: `string`):

Specific entity type. Examples: software, iPadSoftware, macSoftware, podcast, podcastEpisode, song, album, movie, ebook, audiobook.

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

Two-letter ISO country code (us, gb, de, jp, fr, ca, au, br, mx, in, etc.).

## `appIds` (type: `array`):

Numeric Apple IDs to look up (e.g. 544007664 for YouTube). Used in lookup mode.

## `developerIds` (type: `array`):

Apple artist IDs — pass the developer ID from any app URL to get their full catalog. Used in developer mode.

## `chartType` (type: `string`):

Which chart to fetch. Used in charts mode.

## `chartGenre` (type: `string`):

Optional Apple genre ID (e.g. 6018 for Games, 6017 for Education). Leave empty for overall charts.

## `maxResultsPerTerm` (type: `integer`):

Hard cap per search term, app ID batch, or chart.

## `includeReviews` (type: `boolean`):

Also fetch App Store customer reviews via Apple's RSS feed. Applies to apps only (recordType=app).

## `maxReviewsPerApp` (type: `integer`):

Hard cap on reviews per app. Apple's feed caps ~500 per sort order.

## `reviewSortBy` (type: `string`):

Sort order for the review feed.

## `useDatacenterRotation` (type: `boolean`):

Rotate datacenter IPs to spread Apple's ~20 req/min per-IP rate limit. Leave enabled for runs over 50 requests.

## Actor input object example

```json
{
  "mode": "search",
  "searchTerms": [
    "photo editor"
  ],
  "media": "software",
  "entity": "software",
  "country": "us",
  "appIds": [],
  "developerIds": [],
  "chartType": "top-free",
  "chartGenre": "",
  "maxResultsPerTerm": 100,
  "includeReviews": false,
  "maxReviewsPerApp": 100,
  "reviewSortBy": "mostrecent",
  "useDatacenterRotation": 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 = {
    "searchTerms": [
        "photo editor"
    ],
    "appIds": [],
    "developerIds": []
};

// Run the Actor and wait for it to finish
const run = await client.actor("aurenic/apple-media-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 = {
    "searchTerms": ["photo editor"],
    "appIds": [],
    "developerIds": [],
}

# Run the Actor and wait for it to finish
run = client.actor("aurenic/apple-media-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 '{
  "searchTerms": [
    "photo editor"
  ],
  "appIds": [],
  "developerIds": []
}' |
apify call aurenic/apple-media-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,aurenic/apple-media-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/iF4qyTTq31ZtCy9G7/builds/wso8d7a1e00zke0b6/openapi.json
