# Apple App Store Scraper (`jungle_synthesizer/appstore-scraper`) Actor

Scrape Apple App Store app data using the public iTunes Search API. Search by keyword, look up apps by ID, and browse top charts. Extracts name, developer, ratings, price, genres, screenshots, and more. No auth required.

- **URL**: https://apify.com/jungle\_synthesizer/appstore-scraper.md
- **Developed by:** [BowTiedRaccoon](https://apify.com/jungle_synthesizer) (community)
- **Categories:** Developer tools, SEO tools
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, NaN bookmarks
- **User rating**: No ratings yet

## Pricing

Pay per event

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

Scrapes Apple App Store app data using the public iTunes Search API. Search by keyword, look up apps by ID, or pull top chart rankings. Returns 30+ fields per app — name, developer, ratings, price, genres, screenshots, version history, and more.

No authentication required. No browser needed. The iTunes API is public, fast, and returns everything in JSON.

### What It Does

Three modes, pick the one that fits:

- **Search** — query by keyword across the entire App Store. Paginated; handles multi-page result sets automatically.
- **Lookup** — fetch specific apps by their iTunes app ID. Useful when you already know what you want.
- **Charts** — pull top free, paid, or grossing app rankings for any country.

All modes support country targeting via the `country` field, so you can pull data for the US, Japan, Germany, or anywhere else Apple sells apps.

### Input

| Parameter | Type | Default | Description |
|-----------|------|---------|-------------|
| `mode` | string | `search` | Operation mode: `search`, `lookup`, or `charts` |
| `searchTerms` | array | — | Keywords to search. Each term runs as a separate query. Used with `mode=search`. |
| `appIds` | array | — | iTunes app IDs to look up directly. Used with `mode=lookup`. |
| `country` | string | `us` | ISO 3166-1 alpha-2 country code (e.g. `us`, `gb`, `jp`, `de`). |
| `chartType` | string | `topfreeapplications` | Chart to fetch: `topfreeapplications`, `toppaidapplications`, `topgrossingapplications`, `topfreeipadapplications`, `toppaidipadapplications`. |
| `maxResults` | integer | `50` | Max results per query (1-200). The API caps individual requests at 200. |
| `maxItems` | integer | `0` | Total result cap across all queries. Set to `0` for no limit. |

#### Example: search

```json
{
  "mode": "search",
  "searchTerms": ["photo editor", "productivity"],
  "country": "us",
  "maxResults": 50
}
````

#### Example: lookup by app ID

```json
{
  "mode": "lookup",
  "appIds": ["333903271", "544007664"],
  "country": "us"
}
```

#### Example: top charts

```json
{
  "mode": "charts",
  "chartType": "topfreeapplications",
  "country": "jp",
  "maxResults": 100
}
```

### Output

One record per app. Most scrapers give you a handful of fields. This one gives you everything the iTunes API has.

| Field | Type | Description |
|-------|------|-------------|
| `appId` | integer | iTunes app ID (numeric) |
| `bundleId` | string | App bundle identifier (e.g. `com.example.myapp`) |
| `name` | string | App name |
| `url` | string | App Store URL |
| `developer` | string | Developer / seller name |
| `developerId` | integer | Developer iTunes artist ID |
| `developerUrl` | string | Developer App Store URL |
| `developerWebsite` | string | Developer's external website URL |
| `icon` | string | App icon URL (512x512) |
| `price` | number | App price in the queried country's currency |
| `formattedPrice` | string | Human-readable price string (e.g. `Free`, `$0.99`) |
| `currency` | string | Currency code (e.g. `USD`) |
| `primaryGenre` | string | Primary genre / category name |
| `primaryGenreId` | integer | Primary genre ID |
| `genres` | string | All genre names, comma-separated |
| `genreIds` | string | All genre IDs, comma-separated |
| `rating` | number | Average user rating (all versions) |
| `ratingCount` | integer | Total number of ratings (all versions) |
| `ratingCurrentVersion` | number | Average rating for current version |
| `ratingCountCurrentVersion` | integer | Number of ratings for current version |
| `version` | string | Current app version string |
| `releaseDate` | string | Original release date (ISO-8601) |
| `currentVersionReleaseDate` | string | Current version release date (ISO-8601) |
| `releaseNotes` | string | What's new in the current version |
| `description` | string | Full app description |
| `contentRating` | string | Content advisory rating (e.g. `4+`, `17+`) |
| `minimumOsVersion` | string | Minimum iOS/macOS version required |
| `fileSizeBytes` | integer | App file size in bytes |
| `screenshotUrls` | string | iPhone screenshot URLs, pipe-separated |
| `ipadScreenshotUrls` | string | iPad screenshot URLs, pipe-separated |
| `supportedDevices` | integer | Number of supported device types |
| `languages` | string | Supported language codes, comma-separated |
| `country` | string | App Store country code queried |
| `scrapedAt` | string | ISO-8601 timestamp when the record was scraped |

### Pricing

Pay-per-event. $0.10 to start a run, $0.001 per record saved.

### Notes

- The iTunes API enforces a 200-result cap per request. For large keyword searches, the scraper pages through automatically using offset/limit pagination.
- Chart data from the RSS feed contains fewer fields than search/lookup results. The trade-off: charts are fast and single-request.
- Country targeting affects search rankings, pricing (currency), and available apps. Not all apps are available in all regions.
- The iTunes API has undocumented rate limits. The scraper uses a 200ms courtesy delay between requests and limits concurrency to 3.

***

*Powered by [OrbTop](https://orbtop.com) — Apify actor infrastructure.*

# Actor input Schema

## `sp_intended_usage` (type: `string`):

Please describe how you plan to use the data extracted by this crawler.

## `sp_improvement_suggestions` (type: `string`):

Provide any feedback or suggestions for improvements.

## `sp_contact` (type: `string`):

Provide your email address so we can get in touch with you.

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

Operation mode:

- search: Search for apps by keyword (uses searchTerms)
- lookup: Look up specific apps by iTunes app ID (uses appIds)
- charts: Fetch top free/paid/grossing app charts (uses country/chartType/limit)

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

List of search keywords. Each term is searched separately and results are merged.
Used when mode=search.

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

iTunes app IDs to look up directly (e.g. 333903271 for X/Twitter).
Used when mode=lookup.

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

ISO 3166-1 alpha-2 country code for the App Store region (e.g. us, gb, jp, de).
Affects search results, pricing, and chart rankings.

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

iTunes language code for localized metadata (e.g. en, ja, fr, de).
Defaults to the country's primary language.

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

Chart type when mode=charts.

- topfreeapplications: Top Free iPhone Apps
- toppaidapplications: Top Paid iPhone Apps
- topgrossingapplications: Top Grossing iPhone Apps
- topfreeipadapplications: Top Free iPad Apps
- toppaidipadapplications: Top Paid iPad Apps

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

Maximum number of results to return per search term or chart fetch (1-200).
The iTunes API caps individual requests at 200; pagination fetches additional pages.

## `maxItems` (type: `integer`):

Maximum total number of app records to return across all queries. Set to 0 for unlimited.

## Actor input object example

```json
{
  "sp_intended_usage": "Describe your intended use...",
  "sp_improvement_suggestions": "Share your suggestions here...",
  "sp_contact": "Share your email here...",
  "mode": "search",
  "searchTerms": [
    "productivity",
    "photo editor"
  ],
  "appIds": [
    "333903271"
  ],
  "country": "us",
  "language": "en",
  "chartType": "topfreeapplications",
  "maxResults": 50,
  "maxItems": 50
}
```

# 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 = {
    "sp_intended_usage": "Describe your intended use...",
    "sp_improvement_suggestions": "Share your suggestions here...",
    "sp_contact": "Share your email here...",
    "mode": "search",
    "searchTerms": [
        "productivity",
        "photo editor"
    ],
    "appIds": [
        "333903271"
    ],
    "country": "us",
    "chartType": "topfreeapplications",
    "maxResults": 50,
    "maxItems": 50
};

// Run the Actor and wait for it to finish
const run = await client.actor("jungle_synthesizer/appstore-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 = {
    "sp_intended_usage": "Describe your intended use...",
    "sp_improvement_suggestions": "Share your suggestions here...",
    "sp_contact": "Share your email here...",
    "mode": "search",
    "searchTerms": [
        "productivity",
        "photo editor",
    ],
    "appIds": ["333903271"],
    "country": "us",
    "chartType": "topfreeapplications",
    "maxResults": 50,
    "maxItems": 50,
}

# Run the Actor and wait for it to finish
run = client.actor("jungle_synthesizer/appstore-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 '{
  "sp_intended_usage": "Describe your intended use...",
  "sp_improvement_suggestions": "Share your suggestions here...",
  "sp_contact": "Share your email here...",
  "mode": "search",
  "searchTerms": [
    "productivity",
    "photo editor"
  ],
  "appIds": [
    "333903271"
  ],
  "country": "us",
  "chartType": "topfreeapplications",
  "maxResults": 50,
  "maxItems": 50
}' |
apify call jungle_synthesizer/appstore-scraper --silent --output-dataset

```

## MCP server setup

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

```

## OpenAPI specification

```json
{
    "openapi": "3.0.1",
    "info": {
        "title": "Apple App Store Scraper",
        "description": "Scrape Apple App Store app data using the public iTunes Search API. Search by keyword, look up apps by ID, and browse top charts. Extracts name, developer, ratings, price, genres, screenshots, and more. No auth required.",
        "version": "0.1",
        "x-build-id": "Sn5fTSg8OZp4xYGtu"
    },
    "servers": [
        {
            "url": "https://api.apify.com/v2"
        }
    ],
    "paths": {
        "/acts/jungle_synthesizer~appstore-scraper/run-sync-get-dataset-items": {
            "post": {
                "operationId": "run-sync-get-dataset-items-jungle_synthesizer-appstore-scraper",
                "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/jungle_synthesizer~appstore-scraper/runs": {
            "post": {
                "operationId": "runs-sync-jungle_synthesizer-appstore-scraper",
                "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/jungle_synthesizer~appstore-scraper/run-sync": {
            "post": {
                "operationId": "run-sync-jungle_synthesizer-appstore-scraper",
                "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": [
                    "mode"
                ],
                "properties": {
                    "sp_intended_usage": {
                        "title": "What is the intended usage of this data?",
                        "minLength": 1,
                        "type": "string",
                        "description": "Please describe how you plan to use the data extracted by this crawler."
                    },
                    "sp_improvement_suggestions": {
                        "title": "How can we improve this crawler for you?",
                        "minLength": 1,
                        "type": "string",
                        "description": "Provide any feedback or suggestions for improvements."
                    },
                    "sp_contact": {
                        "title": "Contact Email",
                        "minLength": 1,
                        "type": "string",
                        "description": "Provide your email address so we can get in touch with you."
                    },
                    "mode": {
                        "title": "Mode",
                        "enum": [
                            "search",
                            "lookup",
                            "charts"
                        ],
                        "type": "string",
                        "description": "Operation mode:\n- search: Search for apps by keyword (uses searchTerms)\n- lookup: Look up specific apps by iTunes app ID (uses appIds)\n- charts: Fetch top free/paid/grossing app charts (uses country/chartType/limit)\n",
                        "default": "search"
                    },
                    "searchTerms": {
                        "title": "Search Terms",
                        "type": "array",
                        "description": "List of search keywords. Each term is searched separately and results are merged.\nUsed when mode=search.\n",
                        "items": {
                            "type": "string"
                        }
                    },
                    "appIds": {
                        "title": "App IDs",
                        "type": "array",
                        "description": "iTunes app IDs to look up directly (e.g. 333903271 for X/Twitter).\nUsed when mode=lookup.\n",
                        "items": {
                            "type": "string"
                        }
                    },
                    "country": {
                        "title": "Country Code",
                        "type": "string",
                        "description": "ISO 3166-1 alpha-2 country code for the App Store region (e.g. us, gb, jp, de).\nAffects search results, pricing, and chart rankings.\n",
                        "default": "us"
                    },
                    "language": {
                        "title": "Language",
                        "type": "string",
                        "description": "iTunes language code for localized metadata (e.g. en, ja, fr, de).\nDefaults to the country's primary language.\n",
                        "default": "en"
                    },
                    "chartType": {
                        "title": "Chart Type",
                        "enum": [
                            "topfreeapplications",
                            "toppaidapplications",
                            "topgrossingapplications",
                            "topfreeipadapplications",
                            "toppaidipadapplications"
                        ],
                        "type": "string",
                        "description": "Chart type when mode=charts.\n- topfreeapplications: Top Free iPhone Apps\n- toppaidapplications: Top Paid iPhone Apps\n- topgrossingapplications: Top Grossing iPhone Apps\n- topfreeipadapplications: Top Free iPad Apps\n- toppaidipadapplications: Top Paid iPad Apps\n",
                        "default": "topfreeapplications"
                    },
                    "maxResults": {
                        "title": "Max Results Per Query",
                        "minimum": 1,
                        "maximum": 200,
                        "type": "integer",
                        "description": "Maximum number of results to return per search term or chart fetch (1-200).\nThe iTunes API caps individual requests at 200; pagination fetches additional pages.\n",
                        "default": 50
                    },
                    "maxItems": {
                        "title": "Max Items",
                        "type": "integer",
                        "description": "Maximum total number of app records to return across all queries. Set to 0 for unlimited.",
                        "default": 0
                    }
                }
            },
            "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
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }
}
```
