# App Store Data Extractor - Scrape reviews too! (`epctex/appstore-scraper`) Actor

Discover a vast collection of apps, movies, podcasts, reviews, and more on iTunes and the App Store. Extract comprehensive data including images, ISBN, author, description, title, language, user ratings, and reviews focused on countries without limitations. Unlimited and extremely fast!

- **URL**: https://apify.com/epctex/appstore-scraper.md
- **Developed by:** [epctex](https://apify.com/epctex) (community)
- **Categories:** E-commerce
- **Stats:** 1,012 total users, 14 monthly users, 67.0% runs succeeded, 19 bookmarks
- **User rating**: 4.98 out of 5 stars

## Pricing

$25.00/month + usage

To use this Actor, you pay a monthly rental fee to the developer. The rent is subtracted from your prepaid usage every month after the free trial period.You also pay for the Apify platform usage, which gets cheaper the higher Apify subscription plan you have.

Learn more: https://docs.apify.com/platform/actors/running/actors-in-store#rental-actors

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

## Actor - App Store Scraper

### App Store scraper

Since Apple Store doesn't provide a good and valid API, this actor should help you to retrieve data from it.

The App Store data scraper supports the following features:

-   Get reviews - Get reviews of anything from iTunes! No limits, extremely fast!

-   Search any keyword - You can search any keyword you would like to have and get the results

-   Scrape and media types - Scrape any type of media type that you need to get from the Apple Store

-   Scrape iTunes or App Store URLs - Get any iTunes or App Store URLs from their detail page.

-   Scrape publishers - You can gather intelligence from your rivals by gathering information from them

-   Scrape by filters - Media type, country, or keyword. You can customize the results

-   Lookup by multiple ids - If you need to scrape multiple media or multiple competitors you can retrieve them at once.

### Bugs, fixes, updates, and changelog

This scraper is under active development. If you have any feature requests you can create an issue from [here](https://github.com/epctex-support/appstore-scraper/issues).

### Input Parameters

The input of this scraper should be JSON containing the list of pages on the App Store that should be visited. Possible fields are:

- `term`: (Optional) (String) Keyword that you want to search on App Store.

- `startUrls`: (Optional) (Array) List of Apple Store URLs. You should only provide detailed URLs from iTunes or App Store.

- `country`: (Optional) (String) Country of the App Store that you'd like to scrape on.

- `mediaType`: (Optional) (String) Media Type of the assets that you will get from the App Store.

- `mode`: (Optional) (String) Mode of the actor. It can be "search" or "lookup".

- `includeReviews`: (Optional) (Boolean) If you want to include the reviews per each of the applications, you can enable this option. Please keep in mind that reviews will be retrieved in a paginated manner. Therefore the number of requests proportionally increases.

- `endPage`: (Optional) (Number) Final number of page that you want to scrape. The default is `Infinite`. This applies to all `search` requests and `startUrls` individually.

- `maxItems`: (Optional) (Number) You can limit scraped items. This should be useful when you search through the big lists or search results.

- `proxy`: (Required) (Proxy Object) Proxy configuration.

- `customMapFunction`: (Optional) (String) Function that takes each object's handle as an argument and returns the object with executing the function.

This solution requires the use of **Proxy servers**, either your own proxy servers or you can use [Apify Proxy](https://www.apify.com/docs/proxy).

#### Tip

If you want to scrape a specific id or media, always use Lookup mode. Lookup mode is suggested for searching up specific values or assets on the App Store or iTunes. For example; if you want to search for the id of `400763833`, then select Lookup mode and enter `400763833` into the `Term` section.

On the other hand, if you want to search over specific keywords or filters, Search mode will do the job for you.

#### Compute Unit Consumption

The actor is optimized to run blazing fast and scrape many listings as possible. Therefore, it forefronts all listing detail requests. If the actor doesn't block very often it'll scrape 100 listings in 2 minutes with ~0.01-0.02 compute units.

#### App Store Scraper Input example

```json
{
    "startUrls": [
        "https://itunes.apple.com/us/movie/inception/id400763833",
        "https://apps.apple.com/us/app/angry-birds-2/id880047117"
    ],
    "term": "game dev",
    "country": "us",
    "mediaType": "all",
    "mode": "search",
    "includeReviews":true,
    "maxItems": 3
}
````

### During the Run

During the run, the actor will output messages letting you know what is going on. Each message always contains a short label specifying which page from the provided list is currently specified.
When items are loaded from the page, you should see a message about this event with a loaded item count and total item count for each page.

If you provide incorrect input to the actor, it will immediately stop with a failure state and output an explanation of what is wrong.

### App Store Export

During the run, the actor stores results into a dataset. Each item is a separate item in the dataset.

You can manage the results in any language (Python, PHP, Node JS/NPM). See the FAQ or <a href="https://www.apify.com/docs/api" target="blank">our API reference</a> to learn more about getting results from this Appstore actor.

### Scraped App Store Media

The structure of each item that you'll receive from the App Store looks like this:

#### Item Detail

```json
{
    "wrapperType": "track",
    "kind": "podcast",
    "collectionId": 1043547750,
    "trackId": 1043547750,
    "artistName": "Game Dev Unchained",
    "collectionName": "Game Dev Unchained",
    "trackName": "Game Dev Unchained",
    "collectionCensoredName": "Game Dev Unchained",
    "trackCensoredName": "Game Dev Unchained",
    "collectionViewUrl": "https://podcasts.apple.com/us/podcast/game-dev-unchained/id1043547750?uo=4",
    "feedUrl": "https://anchor.fm/s/651ae57c/podcast/rss",
    "trackViewUrl": "https://podcasts.apple.com/us/podcast/game-dev-unchained/id1043547750?uo=4",
    "artworkUrl30": "https://is5-ssl.mzstatic.com/image/thumb/Podcasts125/v4/3e/ea/04/3eea0406-7b9f-30f6-c626-6b9a4cef5597/mza_16385274979335913443.jpg/30x30bb.jpg",
    "artworkUrl60": "https://is5-ssl.mzstatic.com/image/thumb/Podcasts125/v4/3e/ea/04/3eea0406-7b9f-30f6-c626-6b9a4cef5597/mza_16385274979335913443.jpg/60x60bb.jpg",
    "artworkUrl100": "https://is5-ssl.mzstatic.com/image/thumb/Podcasts125/v4/3e/ea/04/3eea0406-7b9f-30f6-c626-6b9a4cef5597/mza_16385274979335913443.jpg/100x100bb.jpg",
    "collectionPrice": 0,
    "trackPrice": 0,
    "trackRentalPrice": 0,
    "collectionHdPrice": 0,
    "trackHdPrice": 0,
    "trackHdRentalPrice": 0,
    "releaseDate": "2021-11-02T23:11:00Z",
    "collectionExplicitness": "cleaned",
    "trackExplicitness": "cleaned",
    "trackCount": 332,
    "country": "USA",
    "currency": "USD",
    "primaryGenreName": "Video Games",
    "contentAdvisoryRating": "Clean",
    "artworkUrl600": "https://is5-ssl.mzstatic.com/image/thumb/Podcasts125/v4/3e/ea/04/3eea0406-7b9f-30f6-c626-6b9a4cef5597/mza_16385274979335913443.jpg/600x600bb.jpg",
    "genreIds": ["1509", "26", "1502"],
    "genres": ["Video Games", "Podcasts", "Leisure"],
    "reviews": [
        {
            "id": "9519350766",
            "userName": "ultrageoffe",
            "userUrl": "https://itunes.apple.com/us/reviews/id212958678",
            "version": "2.3",
            "score": 1,
            "title": "Ad nightmare",
            "text": "Ads every few seconds. Don’t waste your time",
            "url": "https://itunes.apple.com/us/review?id=1660464064&type=Purple%20Software"
        },
        {
            "id": "9519118710",
            "userName": "blake42059",
            "userUrl": "https://itunes.apple.com/us/reviews/id1241179837",
            "version": "2.3",
            "score": 1,
            "title": "To many adds and pop ups trash game don’t recommend to anyone.",
            "text": "To many adds and pop ups trash game don’t recommend to anyone.",
            "url": "https://itunes.apple.com/us/review?id=1660464064&type=Purple%20Software"
        },
        {
            "id": "9518589385",
            "userName": "Skinny1K",
            "userUrl": "https://itunes.apple.com/us/reviews/id1339960005",
            "version": "2.3",
            "score": 1,
            "title": "Found a bug😂",
            "text": "The game stopped working before I could finish level 1",
            "url": "https://itunes.apple.com/us/review?id=1660464064&type=Purple%20Software"
        },
        {
            "id": "9516124853",
            "userName": "Epictrollcreeper",
            "userUrl": "https://itunes.apple.com/us/reviews/id351259271",
            "version": "2.3",
            "score": 3,
            "title": "Rating",
            "text": "Good concept, too many ads.",
            "url": "https://itunes.apple.com/us/review?id=1660464064&type=Purple%20Software"
        },
        {
            "id": "9515904349",
            "userName": "ORION THA GREAT",
            "userUrl": "https://itunes.apple.com/us/reviews/id1400556177",
            "version": "2.3",
            "score": 1,
            "title": "No sound.",
            "text": "The app has no sound ? Why ?",
            "url": "https://itunes.apple.com/us/review?id=1660464064&type=Purple%20Software"
        },
        {
            "id": "9515358167",
            "userName": "aj12ski",
            "userUrl": "https://itunes.apple.com/us/reviews/id1159671746",
            "version": "2.3",
            "score": 1,
            "title": "Not good",
            "text": "So many ads and it bothers you and says you gotta click on these little things that bring you to a obvious scam for a gift card. Also, pistons don’t all fire at the same time. Very bad game.",
            "url": "https://itunes.apple.com/us/review?id=1660464064&type=Purple%20Software"
        },
        {
            "id": "9512381960",
            "userName": "86spence",
            "userUrl": "https://itunes.apple.com/us/reviews/id889838843",
            "version": "2.3",
            "score": 5,
            "title": "I thought this would be bad but it’s way better than that",
            "text": "i genuinely think this game is fun!",
            "url": "https://itunes.apple.com/us/review?id=1660464064&type=Purple%20Software"
        },
        {
            "id": "9512157356",
            "userName": "K.video",
            "userUrl": "https://itunes.apple.com/us/reviews/id1320845055",
            "version": "2.3",
            "score": 3,
            "title": "Wow",
            "text": "A fun game but to much ads",
            "url": "https://itunes.apple.com/us/review?id=1660464064&type=Purple%20Software"
        },
        {
            "id": "9511169577",
            "userName": "bruh dis is broke",
            "userUrl": "https://itunes.apple.com/us/reviews/id455293667",
            "version": "2.3",
            "score": 1,
            "title": "Crazy ads",
            "text": "This game is absolutely an ad farm. It feeds you a ridiculous amount of ads. Most games it gives you the option to receive a reward for watching an ad and some ads mixed in here and there. This game forces you to watch an ad every few seconds, no option to pay for no ads, i wonder how much they make for selling your data. I deleted this game after 5 minutes, its a shame because it is really fun.",
            "url": "https://itunes.apple.com/us/review?id=1660464064&type=Purple%20Software"
        },
        {
            "id": "9510639374",
            "userName": "Zeus Zeus 1",
            "userUrl": "https://itunes.apple.com/us/reviews/id532959786",
            "version": "2.3",
            "score": 1,
            "title": "less pop ups to make the game fun",
            "text": "to many pops of stuff we can see along side to even enjoy the game cause after all that we have ads to watch",
            "url": "https://itunes.apple.com/us/review?id=1660464064&type=Purple%20Software"
        },
        {
            "id": "9509057238",
            "userName": "fhfhghhhhg fun",
            "userUrl": "https://itunes.apple.com/us/reviews/id1395367311",
            "version": "2.3",
            "score": 5,
            "title": "Fun",
            "text": "I like it",
            "url": "https://itunes.apple.com/us/review?id=1660464064&type=Purple%20Software"
        },
        {
            "id": "9507809623",
            "userName": "boodclaws0",
            "userUrl": "https://itunes.apple.com/us/reviews/id874642291",
            "version": "2.3",
            "score": 2,
            "title": "eh",
            "text": "way too many ads",
            "url": "https://itunes.apple.com/us/review?id=1660464064&type=Purple%20Software"
        },
        {
            "id": "9504616350",
            "userName": "Fell in love with a girl",
            "userUrl": "https://itunes.apple.com/us/reviews/id363783248",
            "version": "2.3",
            "score": 2,
            "title": "Stupid ad's",
            "text": "This game has way to many pop ups/ad's and makes the games a little ridiculous to play and I don't recommend. They are just looking for their money.",
            "url": "https://itunes.apple.com/us/review?id=1660464064&type=Purple%20Software"
        },
        {
            "id": "9504002907",
            "userName": "gcpwilson",
            "userUrl": "https://itunes.apple.com/us/reviews/id261803549",
            "version": "2.3",
            "score": 1,
            "title": "Way too many ads",
            "text": "For too many ads for anyone’s liking, in my opinion. The app is development and the game is seemingly repetitive to other games out there.",
            "url": "https://itunes.apple.com/us/review?id=1660464064&type=Purple%20Software"
        },
        {
            "id": "9503418821",
            "userName": "Regulator1988",
            "userUrl": "https://itunes.apple.com/us/reviews/id114773095",
            "version": "2.3",
            "score": 1,
            "title": "Just ads",
            "text": "Nothing more than an ad generator",
            "url": "https://itunes.apple.com/us/review?id=1660464064&type=Purple%20Software"
        },
        {
            "id": "9502409312",
            "userName": "isyounoob",
            "userUrl": "https://itunes.apple.com/us/reviews/id1269971507",
            "version": "2.3",
            "score": 4,
            "title": "Good",
            "text": "It’s good but it’s not a online game if it was it would be better",
            "url": "https://itunes.apple.com/us/review?id=1660464064&type=Purple%20Software"
        },
        {
            "id": "9500880396",
            "userName": "Ahmet İkbal Adlığ",
            "userUrl": "https://itunes.apple.com/us/reviews/id1281714308",
            "version": "2.3",
            "score": 5,
            "title": "Engine pistons",
            "text": "Watching engine pistons has never been this fun 😍",
            "url": "https://itunes.apple.com/us/review?id=1660464064&type=Purple%20Software"
        },
        {
            "id": "9500687874",
            "userName": "Honest review of games",
            "userUrl": "https://itunes.apple.com/us/reviews/id1487869741",
            "version": "2.3",
            "score": 2,
            "title": "It’s meh",
            "text": "Very pushy with “2x speed for 15 seconds” and similar boosts, the buttons are already on the side, and covering the screen while you need to tap to go fast and “be satisfying” is just a bit irritating. Another problem is how some upgrades have a level cap and cannot upgrade further other than pistons and cars from then on. I do not know if this changes on further levels because after level one, my car turned invisible, has infinite nitro, and cannot pass cars. The floating pistons just keeps passing the same place of a rival car over and over. Other than that, the game is alright with designs and the engine “building” is quite fun. Overall, not worth investing a lot of time into and seems like this game was just made with the sole purpose to have people watch ads rather than have more of a balance between a fun game and watching ads like the game “Mob Control” or “Cats and Soup” and other games I love where things aren’t shoved in my face and are more of an option. Then again, I am not the target audience of a young child.",
            "url": "https://itunes.apple.com/us/review?id=1660464064&type=Purple%20Software"
        },
        {
            "id": "9499867302",
            "userName": "Noahthegamer5",
            "userUrl": "https://itunes.apple.com/us/reviews/id428324534",
            "version": "2.2",
            "score": 1,
            "title": "Cool concept",
            "text": "This game is fun but literally not 10 seconds passes between ads. It’s unplayable due to how greedy the devs are.",
            "url": "https://itunes.apple.com/us/review?id=1660464064&type=Purple%20Software"
        },
        {
            "id": "9497199859",
            "userName": "berrymckokner",
            "userUrl": "https://itunes.apple.com/us/reviews/id104183840",
            "version": "2.2",
            "score": 1,
            "title": "Not good",
            "text": "This game is terrible nothing is correct and it’s nothing like the ads",
            "url": "https://itunes.apple.com/us/review?id=1660464064&type=Purple%20Software"
        },
        {
            "id": "9496484784",
            "userName": "Mk//z06",
            "userUrl": "https://itunes.apple.com/us/reviews/id1487454997",
            "version": "2.1",
            "score": 1,
            "title": "Too many ads",
            "text": "Game is an ad-trap. The game is even insistent that it needs Wi-Fi to be played. Constant pop-ups with videos that you have to watch. Then, even in-game, constant pop ups and buttons all over the side that get you to watch an ad. Giant waste of time, with little developer effort.",
            "url": "https://itunes.apple.com/us/review?id=1660464064&type=Purple%20Software"
        },
        {
            "id": "9491770410",
            "userName": "×͜× ☻︎",
            "userUrl": "https://itunes.apple.com/us/reviews/id1314706716",
            "version": "2.1",
            "score": 1,
            "title": "Ads",
            "text": "Way to many ads barely even playable because every 30 seconds there’s a ad",
            "url": "https://itunes.apple.com/us/review?id=1660464064&type=Purple%20Software"
        },
        {
            "id": "9491177174",
            "userName": "Kennyotter",
            "userUrl": "https://itunes.apple.com/us/reviews/id1451044140",
            "version": "2.1",
            "score": 1,
            "title": "Ads the game",
            "text": "Not even one minute into the game I got ten different pop ups asking if I wanted to increase my speed, or have auto tap, or merge for free. Right after clicking away from all of those an ad force played. Don’t forget the ad at the bottom either.",
            "url": "https://itunes.apple.com/us/review?id=1660464064&type=Purple%20Software"
        },
        {
            "id": "9486738863",
            "userName": "BrennanXSMax",
            "userUrl": "https://itunes.apple.com/us/reviews/id596576786",
            "version": "2.1",
            "score": 1,
            "title": "Ads",
            "text": "Yet another game on the App Store that fills games with so many ads the game is rendered unplayable.",
            "url": "https://itunes.apple.com/us/review?id=1660464064&type=Purple%20Software"
        },
        {
            "id": "9482862225",
            "userName": "daniel casaus",
            "userUrl": "https://itunes.apple.com/us/reviews/id1258520205",
            "version": "2.1",
            "score": 5,
            "title": "Anazing game",
            "text": "Ive always loved how pistons moved up and down and this game pretty much answered that and i knew i had to download it",
            "url": "https://itunes.apple.com/us/review?id=1660464064&type=Purple%20Software"
        },
        {
            "id": "9482806686",
            "userName": "TheKnight2468",
            "userUrl": "https://itunes.apple.com/us/reviews/id446572279",
            "version": "2.1",
            "score": 2,
            "title": "Levels break after level 1",
            "text": "The game was great until I finished level 1 and it wouldn’t let me get the reward and move to level 2. I then tried closing and re-opening the game but then I was just sent to the end of the next level where I still had the same issue.",
            "url": "https://itunes.apple.com/us/review?id=1660464064&type=Purple%20Software"
        },
        {
            "id": "9425759392",
            "userName": "BOOMXD8642",
            "userUrl": "https://itunes.apple.com/us/reviews/id482243206",
            "version": "1.0",
            "score": 2,
            "title": "Waste of time",
            "text": "Wasted 40mins to get to the end and not be able to beat the 1st place car.",
            "url": "https://itunes.apple.com/us/review?id=1660464064&type=Purple%20Software"
        }
    ]
}
```

### Contact

Please visit us through [epctex.com](https://epctex.com) to see all the products that are available for you. If you are looking for any custom integration or so, please reach out to us through the chat box in [epctex.com](https://epctex.com). In need of support? <business@epctex.com> is at your service.

# Actor input Schema

## `startUrls` (type: `array`):

URLs to start with. It should be detail URL

## `term` (type: `string`):

The keyword that you can search on App Store

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

The country that you would like to search on media.

## `mediaType` (type: `string`):

Select your media type

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

Select search mode. If you want to get a specific media, Lookup mode is suggested. Otherwise Search mode always return the results in multiple.

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

Including reviews for apps

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

Maximum number of listing items that you want as output. Default is all

## `customMapFunction` (type: `string`):

Function that takes each of the objects as argument and returns data that will be mapped by the function itself.

## `proxy` (type: `object`):

Select proxies to be used by your crawler.

## Actor input object example

```json
{
  "startUrls": [
    "https://itunes.apple.com/us/movie/inception/id400763833",
    "https://apps.apple.com/us/app/angry-birds-2/id880047117"
  ],
  "term": "game",
  "country": "us",
  "mediaType": "all",
  "mode": "search",
  "includeReviews": false,
  "maxItems": 20,
  "customMapFunction": "(object) => { return {...object} }",
  "proxy": {
    "useApifyProxy": true
  }
}
```

# 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 = {
    "startUrls": [
        "https://itunes.apple.com/us/movie/inception/id400763833",
        "https://apps.apple.com/us/app/angry-birds-2/id880047117"
    ],
    "term": "game",
    "maxItems": 20,
    "customMapFunction": (object) => { return {...object} },
    "proxy": {
        "useApifyProxy": true
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("epctex/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 = {
    "startUrls": [
        "https://itunes.apple.com/us/movie/inception/id400763833",
        "https://apps.apple.com/us/app/angry-birds-2/id880047117",
    ],
    "term": "game",
    "maxItems": 20,
    "customMapFunction": "(object) => { return {...object} }",
    "proxy": { "useApifyProxy": True },
}

# Run the Actor and wait for it to finish
run = client.actor("epctex/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 '{
  "startUrls": [
    "https://itunes.apple.com/us/movie/inception/id400763833",
    "https://apps.apple.com/us/app/angry-birds-2/id880047117"
  ],
  "term": "game",
  "maxItems": 20,
  "customMapFunction": "(object) => { return {...object} }",
  "proxy": {
    "useApifyProxy": true
  }
}' |
apify call epctex/appstore-scraper --silent --output-dataset

```

## MCP server setup

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

```

## OpenAPI specification

```json
{
    "openapi": "3.0.1",
    "info": {
        "title": "App Store Data Extractor - Scrape reviews too!",
        "description": "Discover a vast collection of apps, movies, podcasts, reviews, and more on iTunes and the App Store. Extract comprehensive data including images, ISBN, author, description, title, language, user ratings, and reviews focused on countries without limitations. Unlimited and extremely fast!",
        "version": "0.0",
        "x-build-id": "sFfc6o8Z9WuTsbnSL"
    },
    "servers": [
        {
            "url": "https://api.apify.com/v2"
        }
    ],
    "paths": {
        "/acts/epctex~appstore-scraper/run-sync-get-dataset-items": {
            "post": {
                "operationId": "run-sync-get-dataset-items-epctex-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/epctex~appstore-scraper/runs": {
            "post": {
                "operationId": "runs-sync-epctex-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/epctex~appstore-scraper/run-sync": {
            "post": {
                "operationId": "run-sync-epctex-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",
                "properties": {
                    "startUrls": {
                        "title": "Start URLs",
                        "type": "array",
                        "description": "URLs to start with. It should be detail URL",
                        "items": {
                            "type": "string"
                        }
                    },
                    "term": {
                        "title": "Search term",
                        "type": "string",
                        "description": "The keyword that you can search on App Store"
                    },
                    "country": {
                        "title": "Country",
                        "enum": [
                            "us",
                            "af",
                            "al",
                            "dz",
                            "ao",
                            "ai",
                            "ag",
                            "ar",
                            "am",
                            "au",
                            "at",
                            "az",
                            "bs",
                            "bh",
                            "bb",
                            "by",
                            "be",
                            "bz",
                            "bj",
                            "bm",
                            "bt",
                            "bo",
                            "ba",
                            "bw",
                            "br",
                            "vg",
                            "bn",
                            "bg",
                            "bf",
                            "kh",
                            "cm",
                            "ca",
                            "cv",
                            "ky",
                            "td",
                            "cl",
                            "cn",
                            "co",
                            "cd",
                            "cg",
                            "cr",
                            "ci",
                            "hr",
                            "cy",
                            "cz",
                            "dk",
                            "dm",
                            "do",
                            "ec",
                            "eg",
                            "sv",
                            "ee",
                            "sz",
                            "fj",
                            "fi",
                            "fr",
                            "ga",
                            "gm",
                            "ge",
                            "de",
                            "gh",
                            "gr",
                            "gd",
                            "gt",
                            "gw",
                            "gy",
                            "hn",
                            "hk",
                            "hu",
                            "is",
                            "in",
                            "id",
                            "iq",
                            "ie",
                            "il",
                            "it",
                            "jm",
                            "jp",
                            "jo",
                            "kz",
                            "ke",
                            "kr",
                            "xk",
                            "kw",
                            "kg",
                            "la",
                            "lv",
                            "lb",
                            "lr",
                            "ly",
                            "lt",
                            "lu",
                            "mo",
                            "mg",
                            "mw",
                            "my",
                            "mv",
                            "ml",
                            "mt",
                            "mr",
                            "mu",
                            "mx",
                            "fm",
                            "md",
                            "mn",
                            "me",
                            "ms",
                            "ma",
                            "mz",
                            "mm",
                            "na",
                            "nr",
                            "np",
                            "nl",
                            "nz",
                            "ni",
                            "ne",
                            "ng",
                            "mk",
                            "no",
                            "om",
                            "pk",
                            "pw",
                            "pa",
                            "pg",
                            "py",
                            "pe",
                            "ph",
                            "pl",
                            "pt",
                            "qa",
                            "ro",
                            "ru",
                            "rw",
                            "st",
                            "sa",
                            "sn",
                            "rs",
                            "sc",
                            "sl",
                            "sg",
                            "sk",
                            "si",
                            "sb",
                            "za",
                            "es",
                            "lk",
                            "kn",
                            "lc",
                            "vc",
                            "sr",
                            "se",
                            "ch",
                            "tw",
                            "tj",
                            "tz",
                            "th",
                            "to",
                            "tt",
                            "tn",
                            "tr",
                            "tm",
                            "tc",
                            "ug",
                            "ua",
                            "ae",
                            "gb",
                            "uy",
                            "uz",
                            "vu",
                            "ve",
                            "vn",
                            "ye",
                            "zm",
                            "zw"
                        ],
                        "type": "string",
                        "description": "The country that you would like to search on media.",
                        "default": "us"
                    },
                    "mediaType": {
                        "title": "Media Type",
                        "enum": [
                            "all",
                            "software",
                            "movie",
                            "podcast",
                            "music",
                            "musicVideo",
                            "audiobook",
                            "shortFilm",
                            "tvShow",
                            "ebook"
                        ],
                        "type": "string",
                        "description": "Select your media type",
                        "default": "all"
                    },
                    "mode": {
                        "title": "Mode",
                        "enum": [
                            "search",
                            "lookup"
                        ],
                        "type": "string",
                        "description": "Select search mode. If you want to get a specific media, Lookup mode is suggested. Otherwise Search mode always return the results in multiple.",
                        "default": "search"
                    },
                    "includeReviews": {
                        "title": "Include Reviews",
                        "type": "boolean",
                        "description": "Including reviews for apps",
                        "default": false
                    },
                    "maxItems": {
                        "title": "Maximum number of listing items",
                        "type": "integer",
                        "description": "Maximum number of listing items that you want as output. Default is all"
                    },
                    "customMapFunction": {
                        "title": "Custom map function",
                        "type": "string",
                        "description": "Function that takes each of the objects as argument and returns data that will be mapped by the function itself."
                    },
                    "proxy": {
                        "title": "Proxy configuration",
                        "type": "object",
                        "description": "Select proxies to be used by your crawler."
                    }
                }
            },
            "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
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }
}
```
