# App Store In-App Purchases Scraper - IAP Prices by Country (`suerte_enero/app-store-in-app-purchases-scraper`) Actor

Scrape App Store in-app purchase prices for any iOS app in up to 100 countries side by side, converted to USD: cheapest and most expensive market, price spread vs the US, subscription and IAP price change alerts.

- **URL**: https://apify.com/suerte_enero/app-store-in-app-purchases-scraper.md
- **Developed by:** [Eduard Kalyta](https://apify.com/suerte_enero) (community)
- **Categories:** Marketing, E-commerce, Developer tools
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

$2.00 / 1,000 in-app purchases

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 In-App Purchases Scraper — IAP & subscription prices by country

**App Store In-App Purchases Scraper** shows the **in-app purchase prices** of any iOS app in up to **100 App Store countries side by side**, in local currency and **converted to USD**. One record per in-app purchase: the price in every market, the **cheapest country**, the most expensive one, the **price spread** and how each country compares with the US price.

Use it for **app store regional pricing** research, to check **subscription prices by country** (Duolingo, Spotify, Calm, any app), to see if **in-app purchases are cheaper in different countries**, or run it daily as an **in-app purchase price tracker** that alerts you when a competitor reprices.

### What you get for every in-app purchase

- **Name** of the in-app purchase or subscription as listed on the App Store (e.g. "Super Duolingo", "Barrel of Gems (1200)").
- **Price in each country** as shown (`"5,99 €"`, `"¥800"`, `"R$ 29,90"`), the numeric value, the currency and the **USD price** (daily exchange rates).
- **vs US**: percent difference of each market vs the US price (`vsUsPct: 33.9` = 33.9% more expensive than in the US).
- **Cheapest and most expensive country** with their USD prices and the **spread** between them.
- **Monitoring**: with *Only new or changed prices* the next runs return only new in-app purchases and the ones whose price changed in any country, with before → after per country.

### Why this in-app purchase scraper

| | |
|---|---|
| Prices side by side | One row per IAP with every country, not one row per country to stitch together |
| USD conversion | Every price converted with daily rates, plus % vs the US price |
| Answers the question directly | `cheapestCountry`, `mostExpensiveCountry`, `spreadPct` computed for you |
| Price change alerts | Repricing of any IAP in any country as `recordType: "updated"` |
| No setup | Public App Store pages, no API key, no Apple account, no proxies |

### Quick start

```json
{
  "apps": ["https://apps.apple.com/us/app/duolingo-language-lessons/id570060128", "com.calm.calmapp"],
  "countries": ["us", "gb", "de", "jp", "br", "in", "tr"]
}
```

Leave *Countries* empty for the default 10 markets, or use `"all"` for 100 storefronts.

### Output example

Real record (Duolingo, 29 Oct 2026):

```json
{
  "appId": "570060128",
  "appName": "Duolingo: Learn Languages",
  "iapName": "Barrel of Gems (1200)",
  "countryCount": 5,
  "usPriceUsd": 4.99,
  "cheapestCountry": "us",
  "cheapestUsd": 4.99,
  "mostExpensiveCountry": "de",
  "mostExpensiveUsd": 6.68,
  "spreadPct": 33.9,
  "prices": [
    { "country": "us", "price": "$4.99", "priceValue": 4.99, "currency": "USD", "priceUsd": 4.99, "vsUsPct": 0 },
    { "country": "gb", "price": "£4.99", "priceValue": 4.99, "currency": "GBP", "priceUsd": 6.64, "vsUsPct": 33.1 },
    { "country": "de", "price": "5,99 €", "priceValue": 5.99, "currency": "EUR", "priceUsd": 6.68, "vsUsPct": 33.9 },
    { "country": "jp", "price": "¥800", "priceValue": 800, "currency": "JPY", "priceUsd": 5.07, "vsUsPct": 1.6 },
    { "country": "br", "price": "R$ 29,90", "priceValue": 29.9, "currency": "BRL", "priceUsd": 5.59, "vsUsPct": 12 }
  ]
}
```

With *Output format* = **Flat** you get `price_us`, `usd_us`, `price_de`, `usd_de`… columns, ready for a pricing spreadsheet.

### Use cases

- **App store regional pricing strategy**: see how top apps in your category price subscriptions in each country before you set your own price tiers.
- **Competitor price monitoring**: daily alerts when a competitor changes a subscription or IAP price anywhere.
- **Purchasing power research**: which App Store country is cheapest for a given app or subscription.
- **Monetization benchmarks**: typical gem packs, coin bundles and subscription prices in games and apps.
- **Journalism and consumer research**: "how much does Spotify / Netflix / ChatGPT cost by country" style comparisons for apps sold through the App Store.

### Schedule it, get alerts, use it as an API

- **Schedule**: in Apify Console open *Schedules*, pick this Actor and run it daily (or hourly). Every run is compared with the previous one automatically.
- **Slack alerts**: paste a Slack incoming webhook into *Webhook URL* and choose *Slack message*. You get a readable digest at the end of each run.
- **Zapier, Make, n8n, your backend**: choose *JSON* webhook format, or call the Actor through the [Apify API](https://docs.apify.com/api/v2) and read the dataset.
- **Google Sheets / Excel**: set *Output format* to *Flat* and export the dataset as CSV or XLSX, or connect the Google Sheets integration.
- **AI agents (MCP)**: the Actor works as a tool in Apify's MCP server; the output schema is stable and every record carries `schemaVersion`.
- **Run summary**: each run stores `RUN_SUMMARY` in the key-value store (saved, charged, requests, warnings).

### Pricing

**$2 per 1,000 in-app purchases** (one record = one IAP with its prices in all selected countries). A typical app has up to 10 listed IAPs, so comparing an app across 10 countries costs about $0.02. Apps with no in-app purchases are not charged.

### FAQ

**Which in-app purchases are included?** The ones Apple lists on the app's App Store page ("Top In-App Purchases", up to 10 per country). In-app purchases matched across countries by name.

**Are subscriptions included?** Yes, auto-renewable subscriptions listed as in-app purchases (e.g. "Super Duolingo") are included with their price.

**Are in-app purchases cheaper in different countries?** Often — that is exactly what `cheapestCountry` and `vsUsPct` show. Note that buying from another country's App Store requires an Apple ID of that country.

**Where do exchange rates come from?** Daily reference rates from open.er-api.com; the rate date is in `fxDate`.

**Why does an app show no in-app purchases?** Some apps sell subscriptions outside the App Store (for example on their website) and list none on the App Store page.

**Do I need an API key?** No.

### App Store toolkit

Seven Actors on one engine, same input style and output conventions, made to be scheduled together:

| Actor | What it answers |
|---|---|
| [App Store Scraper](https://apify.com/suerte_enero/app-store-iap-competitors-scraper) | Everything about an app: details, 1-5 star ratings histogram, in-app purchase prices, privacy labels, app events, competitors |
| [App Store In-App Purchases Scraper](https://apify.com/suerte_enero/app-store-in-app-purchases-scraper) | In-app purchase and subscription prices in 100 countries side by side, in USD |
| [App Store Competitor Finder](https://apify.com/suerte_enero/app-store-competitor-finder) | The full competitor set of an app, compared field by field |
| [App Store Privacy Labels Scraper](https://apify.com/suerte_enero/app-store-privacy-labels-scraper) | What apps track and collect, for apps, searches and whole top charts |
| [App Store Top Charts](https://apify.com/suerte_enero/app-store-top-charts) | Who is in top free / paid / grossing per country and category, and who moved since yesterday |
| [App Store Keyword Rank Tracker](https://apify.com/suerte_enero/app-store-keyword-rank-tracker) | Where your app ranks for each keyword, keyword difficulty, Apple search suggestions |
| [App Store Ratings Tracker](https://apify.com/suerte_enero/app-store-ratings-tracker) | How people rate your app right now: new ratings per day and their average, 1-2 star share, version impact |

**Also for Android:** [Google Play Download Count](https://apify.com/suerte_enero/google-play-download-count-app-data) (exact installs) · [Google Play In-App Purchases & Price Tracker](https://apify.com/suerte_enero/google-play-in-app-purchases-price-tracker) · [Google Play Similar Apps & Competitors](https://apify.com/suerte_enero/google-play-similar-apps-competitors) · [Google Play Data Safety Scraper](https://apify.com/suerte_enero/google-play-data-safety-scraper) · [Google Play Developer Email & Contacts](https://apify.com/suerte_enero/google-play-developer-email-leads)

### Changelog

- **1.0 (Oct 2026)** — In-app purchase prices for 100 countries side by side, USD conversion, cheapest / most expensive country, spread and % vs US, price change monitoring, Slack and JSON webhooks.

# Actor input Schema

## `apps` (type: `array`):

App Store URLs, ids or bundle ids.

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

App Store countries as 2-letter codes. Default: us, gb, de, fr, jp, br, in, tr, mx, au. Use "all" for 100 storefronts.

## `convertToUsd` (type: `boolean`):

Add USD prices (daily exchange rates) and compare every market with the US price.

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

App pages loaded in parallel.

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

Stop after saving this many records. You are charged only for saved records.

## `onlyNew` (type: `boolean`):

Next runs save only in-app purchases that are new or whose price changed in any country (recordType "updated" with before → after per country).

## `includeUpdated` (type: `boolean`):

In monitoring mode, also save known records whose important fields changed (date, price, sold out, venue…). They come with recordType "updated" and a list of changes.

## `monitorId` (type: `string`):

Optional name for the monitoring feed, e.g. "sf-ai-events". Runs with the same name share memory. Leave empty to derive it from the search settings.

## `memoryDays` (type: `integer`):

Monitoring memory forgets records not seen for this many days.

## `outputFormat` (type: `string`):

"full" keeps nested objects (best for JSON / API). "flat" turns them into plain columns for Excel and Google Sheets.

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

Optional. At the end of the run, POST the saved records (up to 200) to this URL: Slack incoming webhook, Zapier, Make, n8n or your own endpoint. Not sent when nothing was saved.

## `webhookFormat` (type: `string`):

"slack" sends a readable message, "json" sends the records and run summary.

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

Not needed in most cases. If the site starts throttling, the Actor switches to Apify Proxy by itself.

## Actor input object example

```json
{
  "apps": [
    "https://apps.apple.com/us/app/duolingo-language-lessons/id570060128",
    "https://apps.apple.com/us/app/spotify-music-and-podcasts/id324684580"
  ],
  "countries": [
    "us",
    "gb",
    "de",
    "jp",
    "br",
    "in",
    "tr"
  ],
  "convertToUsd": true,
  "maxConcurrency": 4,
  "maxItems": 1000,
  "onlyNew": false,
  "includeUpdated": true,
  "memoryDays": 90,
  "outputFormat": "full",
  "webhookFormat": "json",
  "proxyConfiguration": {
    "useApifyProxy": false
  }
}
```

# Actor output Schema

## `results` (type: `string`):

No description

## `allFields` (type: `string`):

No description

## `runSummary` (type: `string`):

Saved, charged, new / updated / known records, requests and warnings.

# 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 = {
    "apps": [
        "https://apps.apple.com/us/app/duolingo-language-lessons/id570060128",
        "https://apps.apple.com/us/app/spotify-music-and-podcasts/id324684580"
    ],
    "countries": [
        "us",
        "gb",
        "de",
        "jp",
        "br",
        "in",
        "tr"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("suerte_enero/app-store-in-app-purchases-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 = {
    "apps": [
        "https://apps.apple.com/us/app/duolingo-language-lessons/id570060128",
        "https://apps.apple.com/us/app/spotify-music-and-podcasts/id324684580",
    ],
    "countries": [
        "us",
        "gb",
        "de",
        "jp",
        "br",
        "in",
        "tr",
    ],
}

# Run the Actor and wait for it to finish
run = client.actor("suerte_enero/app-store-in-app-purchases-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 '{
  "apps": [
    "https://apps.apple.com/us/app/duolingo-language-lessons/id570060128",
    "https://apps.apple.com/us/app/spotify-music-and-podcasts/id324684580"
  ],
  "countries": [
    "us",
    "gb",
    "de",
    "jp",
    "br",
    "in",
    "tr"
  ]
}' |
apify call suerte_enero/app-store-in-app-purchases-scraper --silent --output-dataset

```

## MCP server setup

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