# App Store Scraper & ASO: Ranked Keywords, Rank Tracker (`s_actors/app-store-scraper`) Actor

Find every keyword an iOS app ranks for and where competitors outrank you, with no keyword list needed. Track App Store keyword rankings, suggestions, top charts (200 deep), reviews, and competitor page changes: subtitle, in-app purchase prices, screenshots, version. Only-changes mode for alerts.

- **URL**: https://apify.com/s\_actors/app-store-scraper.md
- **Developed by:** [Superior Actors](https://apify.com/s_actors) (community)
- **Categories:** Developer tools, SEO tools, Automation
- **Stats:** 2 total users, 1 monthly users, 0.0% runs succeeded, 1 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.

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

### App Store Scraper & ASO: Ranked Keywords, Rank Tracker

Give it an iPhone app and get **every keyword it ranks for in App Store search**, no keyword list needed. Add competitors and see **where they outrank you** and which keywords they rank for that you don't. The same Actor tracks **keyword rankings**, **search suggestions**, **top charts 200 deep**, **reviews**, and **competitor page changes**: subtitle, in-app purchase prices, screenshots, description and version.

Schedule it with **Only report changes** and get just the news: keywords gained or lost, ranking moves, a competitor's new subtitle or price, new reviews.

Export as **JSON, CSV, Excel or HTML**, or use it as an **App Store API**. No browser, no Apple account, no API key.

#### How it works

1. Choose what to do: **Ranked keywords**, **Keyword rankings**, **Keyword suggestions**, **Top charts**, **App details & competitor changes** or **Reviews**
2. Add apps: App Store links, numeric IDs (`570060128`) or bundle IDs. For ranked keywords, **your app first**, then competitors
3. Add countries: `us`, `gb`, `de`, `jp`, `br`... (rankings differ by country; 115 App Store countries)
4. Optional: switch on **Only report changes** and schedule the task daily

#### Why this Actor

| | |
|---|---|
| 🔎 **Ranked keywords** | Which keywords an app ranks for (top 50 or deeper), found from its title, subtitle, description and App Store suggestions. Other trackers need you to bring the keywords |
| ⚔️ **Keyword gap** | Keywords where a competitor ranks and you don't, or ranks higher: `gap`, `behind`, `ahead`, `only_you` |
| 📈 **Rank tracking** | Positions for your keyword list; the first ~12 places exactly as on the App Store, deeper ones up to 200 |
| 🕵️ **Competitor changes** | Subtitle, title, description, screenshots, icon, price, in-app purchase prices, version, rating, chart position, Editors' Choice |
| 🔑 **Keyword research** | App Store search suggestions for any seed, with A-Z expansion, in any country |
| 🏆 **Top charts** | Top free and paid (200 deep) and grossing (100), all 43 categories and game genres |
| 🔔 **Only changes** | Scheduled runs return only moves, new keywords, lost keywords, page changes and new reviews |
| 💰 **Cheaper than ASO tools** | Pay per result instead of a $70-500 monthly ASO subscription |

#### Use cases

- **ASO audit**: see every keyword your app already ranks for, and which ones are worth pushing into the top 10
- **Competitor research**: find the keywords a competitor ranks for, including your brand name
- **Rank tracking**: daily positions for your target keywords in every market
- **Competitor monitoring**: know the day a rival changes its subtitle, screenshots or subscription price
- **Market research**: top charts by category and country, new apps entering the charts
- **Review monitoring**: new reviews of your app or competitors every day
- **AI agents**: give your assistant live App Store data through the Apify MCP server

#### Ranked keywords

One row per keyword where your app or a competitor ranks. Real example, Duolingo vs Babbel, US, September 2026: 200 candidate keywords checked in 54 seconds, 98 ranked.

| Keyword | Duolingo | Babbel | Status | In suggestions |
|---|---|---|---|---|
| language learning | 1 | 2 | ahead | yes |
| learn spanish | 1 | 3 | ahead | yes |
| piano lessons | 22 | - | only\_you | yes |
| babbel spanish | 2 | 1 | behind | yes |
| real-life conversations | - | 1 | gap | no |
| learn spanish | vocabulary | - | 10 | gap | yes |

| Field | Description |
|---|---|
| `keyword`, `country` | The search |
| `position` | Place of your app (the first app in the list), empty if not in the top N |
| `status` | `ahead` (you rank higher), `behind`, `gap` (only a competitor ranks), `only_you`; `ranked` with one app |
| `bestCompetitor`, `bestCompetitorPosition` | The highest-ranking competitor |
| `positions` | Positions of all listed apps, e.g. `{"Duolingo": 1, "Babbel": 2}` |
| `suggested` | The keyword appears in App Store search suggestions, so people really type it |
| `source` | Where the keyword came from: `title/subtitle`, `description`, `suggestion`, `your keywords` |
| `topApp`, `topAppId` | Who is #1 for this keyword |
| `searchUrl` | The search on the App Store |

**Candidate keywords per app** (default 100) controls how many keywords are tested. You pay only for rows, that is keywords where one of the apps ranks. Add your own keywords in **Keywords** to test them too.

#### Keyword rankings

One row per keyword, country and app.

| Field | Description |
|---|---|
| `keyword`, `country`, `position` | Place in App Store search |
| `apiPosition` | Place in the iTunes Search API. The first ~12 places are taken from the App Store website, so `position` matches what users see; deeper places come from the API |
| `inResults`, `isTrackedApp` | Found in results; one of your listed apps |
| `appId`, `bundleId`, `title`, `subtitle`, `developer`, `rating`, `ratingsCount`, `price`, `genre` | The app as shown in results (subtitle for the first ~12) |
| `inAppEventShown` | The app shows an in-app event card in these results |
| `resultsCount`, `searchUrl`, `url` | Results received; links |

#### App details & competitor changes

| Field | Description |
|---|---|
| `title`, `subtitle`, `appId`, `bundleId`, `url` | The app and its 30-character subtitle |
| `rating`, `ratingsCount`, `ratingHistogram`, `ratingCurrentVersion` | e.g. `4.72`, `5,470,741`, stars 5-1 counts |
| `chartPosition`, `chartCategory`, `editorsChoice` | e.g. `#1` in `Education`, Editors' Choice |
| `inAppPurchases` | Top in-app purchases with local prices, e.g. `Super Duolingo $9.99` |
| `price`, `currency`, `genre`, `genres`, `contentRating` | Pricing and category |
| `version`, `updatedAt`, `releaseNotes`, `releaseDate` | Current version and "What's new" |
| `description`, `icon`, `screenshots`, `ipadScreenshots`, `languages`, `sizeMb`, `minimumOsVersion` | Listing content |
| `developer`, `developerId`, `seller`, `developerWebsite`, `privacyTypes` | Developer and privacy labels |

With **Only report changes**, the first run returns the full details; later runs return one row per changed field (illustrative example):

| App | Field | Before | After |
|---|---|---|---|
| Headspace | subtitle | Meditation & Sleep | Mental Health, Stress, Anxiety |
| Calm | inAppPurchases | Annual $69.99 | Annual $79.99 |
| Babbel | version | 21.40.0 | 21.41.0 |

Watched fields: title, subtitle, description, icon, screenshots, price, in-app purchases, version, release notes, rating (moves of 0.1+), Editors' Choice, chart position, content rating, category, developer, languages.

#### Keyword suggestions

One row per keyword idea from the App Store search box. Example for `habit tracker` (US): `habit tracker free`, `habit tracker widget`, `daily habit tracker`, `streaks habit tracker`... With **Expand suggestions A-Z** one seed gave 197 keywords.

| Field | Description |
|---|---|
| `seed`, `keyword`, `rank` | Your seed, the suggested keyword and its order |
| `suggestedFor` | The query that produced it, e.g. `habit tracker w` |

#### Top charts

| Chart | Category | # | App |
|---|---|---|---|
| Top free | All apps | 1 | Muse from Meta |
| Top paid | All apps | 1 | Shadowrocket |
| Top grossing | All apps | 1 | ChatGPT |
| Top grossing | Puzzle games | 1 | Royal Match |

Fields: `chart`, `chartCategory`, `country`, `position`, `chartSize` and the app fields. Categories: `ALL`, `BOOKS`, `BUSINESS`, `DEVELOPER_TOOLS`, `EDUCATION`, `ENTERTAINMENT`, `FINANCE`, `FOOD_AND_DRINK`, `GAMES`, `GRAPHICS_AND_DESIGN`, `HEALTH_AND_FITNESS`, `LIFESTYLE`, `MAGAZINES_AND_NEWSPAPERS`, `MEDICAL`, `MUSIC`, `NAVIGATION`, `NEWS`, `PHOTO_AND_VIDEO`, `PRODUCTIVITY`, `REFERENCE`, `SHOPPING`, `SOCIAL_NETWORKING`, `SPORTS`, `TRAVEL`, `UTILITIES`, `WEATHER`, and games: `GAMES_ACTION`, `GAMES_ADVENTURE`, `GAMES_CASUAL`, `GAMES_BOARD`, `GAMES_CARD`, `GAMES_CASINO`, `GAMES_FAMILY`, `GAMES_MUSIC`, `GAMES_PUZZLE`, `GAMES_RACING`, `GAMES_ROLE_PLAYING`, `GAMES_SIMULATION`, `GAMES_SPORTS`, `GAMES_STRATEGY`, `GAMES_TRIVIA`, `GAMES_WORD`.

#### Only report changes: how monitoring works

Monitoring turns a scheduled run into alerts. It works in three steps:

1. **Switch on** **Only report changes** and pick a **Monitor name** (one name per project)
2. **Save as a task and schedule it**, for example every morning (Actor page → Save as a new task → Schedule)
3. **First run** saves the current state and returns everything marked `change: new`. **Every later run** compares with the previous run and returns only the differences. An empty result means nothing changed

What you get on later runs:

| Mode | What counts as a change | Example row |
|---|---|---|
| Ranked keywords | A keyword gained (`entered`), lost (`dropped_out`) or moved | `learn spanish`: `down`, was 1, now 3 |
| Keyword rankings, top charts | An app moved at least **Minimum position change** places, entered or dropped out | `language learning`: `up`, was 6, now 1 |
| App details | A changed field on a competitor's page | `subtitle`: before `Meditation & Sleep`, after `Mental Health, Stress` |
| Reviews | Only reviews newer than the last run | new 1-star review |

| Field | Description |
|---|---|
| `change` | `up`, `down`, `entered` (appeared in results, chart or ranked keywords), `dropped_out`, `new` (first run) |
| `position`, `previousPosition`, `positionChange` | Now, at the last run, places gained (+) or lost (-) |
| `changes` | Ranked keywords: the change for every listed app |
| `field`, `oldValue`, `newValue` | App details: what changed on the page |

Use a different **Monitor name** for each task, otherwise two tasks overwrite each other's memory. You pay for the checks, not for the changes found.

#### Reviews

| Field | Description |
|---|---|
| `reviewId`, `userName`, `at` | The review, its author and date |
| `score`, `reviewTitle`, `text` | Stars 1-5, title and text |
| `version`, `voteSum`, `voteCount` | App version reviewed, helpful votes |

Apple gives the 500 newest or most helpful reviews per app and country.

#### Pricing

Pay per result, no subscription:

| Event | Price |
|---|---|
| Run start | $0.003 |
| Ranked keyword (a keyword where one of your apps ranks; tested keywords without a match are free) | $0.002 |
| Keyword ranking check (1 keyword × 1 country) | $0.002 |
| Keyword suggestion query (up to 10 ideas) | $0.0005 |
| Top chart (1 chart × category × country, up to 200 apps) | $0.003 |
| App details | $0.002 per app |
| Review | $0.10 per 1,000 |

| Task | Cost |
|---|---|
| Ranked keywords for your app and 1 competitor, 1 country (~100 keywords) | ~$0.20 |
| 20 keywords × 3 countries, checked daily for 30 days | ~$3.70 per month |
| 5 competitors' pages watched daily for 30 days | ~$0.40 per month |
| Top 200 free and paid in 10 categories, 1 country | ~$0.06 |
| 10,000 reviews (e.g. 20 apps × 500) | ~$1.00 |

#### Ready-made tasks

Open one, change the apps or keywords, and run:

| Task | What you get |
|---|---|
| [Find Every Keyword an iOS App Ranks For in the App Store](https://apify.com/s_actors/app-store-scraper/examples/ios-app-ranked-keywords) | Every keyword one app ranks for |
| [App Store Keyword Gap: Keywords Competitors Rank For](https://apify.com/s_actors/app-store-scraper/examples/app-store-keyword-gap) | Keywords a competitor ranks for and you don't |
| [App Store ASO Keyword Rank Tracker: You vs Competitors](https://apify.com/s_actors/app-store-scraper/examples/app-store-aso-rank-tracker) | Daily positions for your keyword list |
| [Competitor App Store Listing Changes: Daily Alerts](https://apify.com/s_actors/app-store-scraper/examples/competitor-app-store-listing-changes) | Alerts when a competitor changes its page |
| [App Store Keyword Research: iOS Search Suggestions](https://apify.com/s_actors/app-store-scraper/examples/app-store-keyword-research) | 150+ keyword ideas per seed |
| [App Store Top Charts: Top Free, Paid and Grossing iPhone Apps](https://apify.com/s_actors/app-store-scraper/examples/app-store-top-charts) | Top free, paid and grossing |
| [App Store Reviews Scraper: iOS App Reviews to CSV](https://apify.com/s_actors/app-store-scraper/examples/app-store-reviews-scraper) | Up to 500 reviews per app and country |
| [App Store Ranking Alerts: Keywords Gained and Lost](https://apify.com/s_actors/app-store-scraper/examples/app-store-ranking-alerts) | Keywords gained, lost or moved, daily |
| [iOS In-App Purchase and Subscription Prices by Country](https://apify.com/s_actors/app-store-scraper/examples/in-app-purchase-prices-by-country) | Subscription prices in 6 countries |
| [New App Store Reviews Every Day: iOS Review Monitoring](https://apify.com/s_actors/app-store-scraper/examples/new-app-store-reviews-alerts) | Only new reviews, daily |

#### Input example

```json
{
    "mode": "ranked_keywords",
    "appIds": [
        "https://apps.apple.com/us/app/duolingo-language-lessons/id570060128",
        "https://apps.apple.com/us/app/babbel-language-learning/id829587759"
    ],
    "countries": ["us", "gb"],
    "onlyChanges": true,
    "monitorName": "language-apps"
}
```

#### Tips

- **App ID** is the number after `id` in the App Store link: `apps.apple.com/us/app/duolingo/id570060128` → `570060128`. Links and bundle IDs work too.
- Ranked keywords are found, not guessed: every row was checked in App Store search at run time. Apple publishes no list of all ranked keywords, so very long-tail keywords that appear nowhere in the listing or suggestions can be missed; add them in **Keywords**.
- Rankings differ by country: add each market you care about.
- For daily tracking, create a task per project, switch on **Only report changes** and add a schedule. Send results to email, Slack or [Google Sheets](https://apify.com/s_actors/google-sheets-import-export) with integrations.
- Android too: [Google Play Scraper & ASO Rank Tracker](https://apify.com/s_actors/google-play-scraper) has the same fields and monitoring.

#### Use with the API and AI agents

Run it via the [Apify API](https://docs.apify.com/api/v2) from Python, Node.js or any HTTP client, or connect it to Claude, ChatGPT and other AI agents through the [Apify MCP server](https://mcp.apify.com): "Which keywords does Calm rank for in the US App Store that Headspace doesn't?"

#### Is it legal?

The Actor collects only public data shown on the App Store to any visitor, without logging in. Reviews contain user names chosen by their authors; if you store or process them, make sure you comply with GDPR and other applicable laws.

# Actor input Schema

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

Ranked keywords: find every keyword an app ranks for in App Store search (no keyword list needed), and where competitors outrank it. Keyword rankings: positions for your own keyword list. Keyword suggestions: App Store search suggestions (keyword research). Top charts: top free, paid and grossing by category. App details: subtitle, in-app purchases, chart position, ratings; with "Only report changes" it tracks competitor page changes. Reviews: latest or most helpful reviews.

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

App Store links, numeric IDs (570060128) or bundle IDs (com.duolingo.DuolingoMobile). Ranked keywords: your app first, then competitors. Keyword rankings and charts: apps to track (leave empty to get every ranked app). App details and reviews: the apps to scrape.

## `keywords` (type: `array`):

Keyword rankings: the search terms to check. Keyword suggestions: seed keywords. Ranked keywords: extra keywords to check on top of the ones found automatically.

## `countries` (type: `array`):

Two-letter App Store country codes, one per line: us, gb, de, fr, jp, br... Rankings, suggestions, charts and prices differ by country. Default: us.

## `maxPosition` (type: `integer`):

How deep to look in App Store search results (up to 200). Ranked keywords: a keyword counts if an app is within this position. Keyword rankings: how many results per keyword.

## `maxKeywordsPerApp` (type: `integer`):

Ranked keywords: how many candidate keywords to test per app (from its title, subtitle, description and App Store suggestions). More finds more long-tail keywords and takes longer. You pay only for keywords where an app ranks.

## `onlyTrackedApps` (type: `boolean`):

Keyword rankings and top charts with apps listed: one row per tracked app (its position, or empty if not ranked). Turn off to get every ranked app with a tracked flag.

## `expandSuggestions` (type: `boolean`):

Keyword suggestions: also ask for "seed a", "seed b" ... "seed z" to find long-tail keywords (27 queries per seed instead of 1).

## `chartTypes` (type: `array`):

Top charts mode: which charts to get. Top free and paid go 200 deep, top grossing 100.

## `chartCategories` (type: `array`):

Top charts mode: categories, one per line. ALL = all apps, GAMES = all games, or e.g. EDUCATION, FINANCE, GAMES\_PUZZLE. Full list: ALL, BOOKS, BUSINESS, DEVELOPER\_TOOLS, EDUCATION, ENTERTAINMENT, FINANCE, FOOD\_AND\_DRINK, GAMES, GRAPHICS\_AND\_DESIGN, HEALTH\_AND\_FITNESS, LIFESTYLE, MAGAZINES\_AND\_NEWSPAPERS, MEDICAL, MUSIC, NAVIGATION, NEWS, PHOTO\_AND\_VIDEO, PRODUCTIVITY, REFERENCE, SHOPPING, SOCIAL\_NETWORKING, SPORTS, TRAVEL, UTILITIES, WEATHER, GAMES\_ACTION, GAMES\_ADVENTURE, GAMES\_CASUAL, GAMES\_BOARD, GAMES\_CARD, GAMES\_CASINO, GAMES\_FAMILY, GAMES\_MUSIC, GAMES\_PUZZLE, GAMES\_RACING, GAMES\_ROLE\_PLAYING, GAMES\_SIMULATION, GAMES\_SPORTS, GAMES\_STRATEGY, GAMES\_TRIVIA, GAMES\_WORD.

## `chartSize` (type: `integer`):

Top charts mode: how many positions to get (up to 200; top grossing up to 100).

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

Reviews mode: how many reviews per app and country (Apple gives up to 500).

## `reviewSort` (type: `string`):

Reviews mode: order of the reviews. With "Only report changes" reviews are always newest first.

## `onlyChanges` (type: `boolean`):

For scheduled runs. The first run saves the current state; later runs return only what changed: keyword positions that moved, keywords gained or lost, chart moves, new reviews, and competitor page changes (title, subtitle, description, screenshots, price, in-app purchases, version, rating, chart position).

## `minPositionChange` (type: `integer`):

Report a ranking or chart move only if the app moved at least this many places.

## `monitorName` (type: `string`):

Separate monitors keep separate memory. Use a different name for each scheduled task.

## `maxConcurrency` (type: `integer`):

How many requests run at the same time.

## `proxyConfiguration` (type: `object`):

Requests go direct first; the proxy is used only when the App Store rate-limits a request.

## Actor input object example

```json
{
  "mode": "ranked_keywords",
  "appIds": [
    "https://apps.apple.com/us/app/duolingo-language-lessons/id570060128",
    "https://apps.apple.com/us/app/babbel-language-learning/id829587759"
  ],
  "keywords": [
    "language learning",
    "learn spanish"
  ],
  "countries": [
    "us"
  ],
  "maxPosition": 50,
  "maxKeywordsPerApp": 100,
  "onlyTrackedApps": true,
  "expandSuggestions": false,
  "chartTypes": [
    "top_free"
  ],
  "chartCategories": [
    "ALL"
  ],
  "chartSize": 100,
  "maxReviewsPerApp": 100,
  "reviewSort": "newest",
  "onlyChanges": false,
  "minPositionChange": 1,
  "monitorName": "default",
  "maxConcurrency": 8,
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}
```

# Actor output Schema

## `rankedKeywords` (type: `string`):

Every keyword an app ranks for, with competitor positions and gaps.

## `rankings` (type: `string`):

One row per keyword, country and app: position in App Store search.

## `suggestions` (type: `string`):

Keyword ideas from App Store search suggestions.

## `charts` (type: `string`):

Top free, paid or grossing apps by position.

## `changes` (type: `string`):

Only ranking and chart moves, apps entering or dropping out (monitoring).

## `apps` (type: `string`):

Subtitle, in-app purchases, chart position, ratings, version.

## `appChanges` (type: `string`):

What changed on app pages since the last run (monitoring).

## `reviews` (type: `string`):

User reviews with rating and app version.

## `all` (type: `string`):

Every field of every row.

# 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 = {
    "appIds": [
        "https://apps.apple.com/us/app/duolingo-language-lessons/id570060128",
        "https://apps.apple.com/us/app/babbel-language-learning/id829587759"
    ],
    "keywords": [
        "language learning",
        "learn spanish"
    ],
    "countries": [
        "us"
    ],
    "chartCategories": [
        "ALL"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("s_actors/app-store-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 = {
    "appIds": [
        "https://apps.apple.com/us/app/duolingo-language-lessons/id570060128",
        "https://apps.apple.com/us/app/babbel-language-learning/id829587759",
    ],
    "keywords": [
        "language learning",
        "learn spanish",
    ],
    "countries": ["us"],
    "chartCategories": ["ALL"],
}

# Run the Actor and wait for it to finish
run = client.actor("s_actors/app-store-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 '{
  "appIds": [
    "https://apps.apple.com/us/app/duolingo-language-lessons/id570060128",
    "https://apps.apple.com/us/app/babbel-language-learning/id829587759"
  ],
  "keywords": [
    "language learning",
    "learn spanish"
  ],
  "countries": [
    "us"
  ],
  "chartCategories": [
    "ALL"
  ]
}' |
apify call s_actors/app-store-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,s_actors/app-store-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/YlJjeodE9c508xQIW/builds/M86Zixhq3xkLmCwQA/openapi.json
