App Store Reviews Scraper: Apple Reviews to Structured JSON
Scrape Apple App Store reviews into clean JSON with the Apify Apple App Store Reviews API. Give it a numeric product ID or just an app name, pick a country store and a sort order, and get one flat row per review: rating, title, body text, author, reviewed version, and dates.
When to use this skill
- The user wants to scrape App Store reviews (to JSON, CSV, a sheet, or a database).
- They want the reviews for a specific iOS or macOS app as a dataset.
- They want reviews from a specific country store, or the most critical or most helpful reviews first.
- They ask for an "app store reviews scraper", "apple reviews scraper", or "iOS review export".
Not for: App Store keyword rankings or app search results (use the Apple App Store Search Actor), app listing metadata such as price or screenshots (use the Apple App Store Product API Actor), or Google Play reviews (different store, different Actor).
What you get (one row per review)
review_id, review_title, review_text, rating (integer 1 to 5), review_date (locale string) plus review_date_iso, reviewed_version, author_name, author_id, product_id, app_platform (ios or macos), app_country, sort_order, page_number, position_on_page, position_global, total_page_count, reviews_for_current_version, fetch_timestamp. When a review carries helpfulness votes and parse_helpfulness is on, helpful_count and total_helpful_count are added; most rows do not have them.
Prerequisites
The Actor
Run it with the Apify CLI
Scrape by app name (the Actor resolves the top App Store search match):
apify actors call "johnvc/apple-app-store-reviews-api" -i '{"app_name":"spotify","country":"us","sort":"mostrecent","max_reviews":100}' \
--json \
--user-agent apify-awesome-skills/apify-app-store-reviews-scraper \
2>/dev/null
Scrape exact apps by product ID, most critical first, from the UK store:
apify actors call "johnvc/apple-app-store-reviews-api" -i '{"product_ids":["534220544","363590051"],"country":"gb","sort":"mostcritical","max_reviews":200}' \
--json \
--user-agent apify-awesome-skills/apify-app-store-reviews-scraper \
2>/dev/null
Every call carries the three flags this repo expects: --json, --user-agent apify-awesome-skills/apify-app-store-reviews-scraper, and 2>/dev/null.
Run it from Claude or another AI agent (MCP)
The Actor is MCP-ready. Add the hosted server URL:
https://mcp.apify.com/?tools=actors,docs,johnvc/apple-app-store-reviews-api
Then ask, for example: "Scrape the 100 most recent App Store reviews for Duolingo in the US and export them as JSON." MCP setup docs: https://docs.apify.com/platform/integrations/mcp
Workflow
- Identify the app. Prefer
product_ids (the number after id in an App Store URL: apps.apple.com/us/app/slug/idNNNNNNNN) for exact targeting. app_name is fine when the user only knows the name; the Actor reviews the top search match.
- Pick the store and order.
country (two-letter code, 52 stores, default us) drives the storefront and the locale of review text and dates. sort is mostrecent, mosthelpful, mostfavorable, or mostcritical (iOS only; macOS always returns most recent).
- Bound the volume.
max_reviews caps rows per app (default 100). Setting 0 means unlimited up to 50 pages, about 1,250 reviews on iOS or 500 on macOS.
- Estimate cost, then confirm with the user if the run is large. See
references/gotchas.md.
- Run the Actor and read the dataset. Deliver rows as JSON or CSV, or hand back the dataset link. Dedupe across runs on
review_id.
Inputs
product_ids (array of strings): numeric Apple product IDs, fetched sequentially in one run
app_name (string): free-form app name, auto-resolved to the top search match when product_ids is empty (one of the two is required)
country (enum, 52 codes, default us): Apple country store
sort (enum, default mostrecent): mostrecent, mosthelpful, mostfavorable, mostcritical
max_reviews (integer, default 100): cap per app; 0 = unlimited up to 50 pages
start_page (integer, default 1): resume a long run
include_macos (boolean, default true): set false to skip macOS apps without charges
normalize_dates (boolean, default true): adds review_date_iso
parse_helpfulness (boolean, default true): adds helpfulness counts when a review has votes
Cost
Billing is per review returned plus a small one-time setup fee per run. A 100-review run is well under a dollar; even the 1,250-review iOS maximum for one app stays around two dollars. Batch multiple product_ids into one run so the setup fee is paid once. Live prices and estimates are in references/gotchas.md.
Honest limits
sort applies to iOS apps only; macOS apps always return most recent.
app_name resolution takes the top search match, which can be the wrong app for generic names; use product_ids when it matters.
review_date_iso is best-effort parsing and can be null for unfamiliar locale formats; the raw review_date string is always there.
- Helpfulness counts appear only on reviews that have votes; do not promise them on every row.
- Apple serves a bounded review window per app (about 50 pages), not the full historical archive.
Troubleshooting
- Empty dataset: wrong
product_id, an app with no reviews in that country store, or a macOS app with include_macos false.
- Wrong app came back:
app_name matched a different app; rerun with the exact product_ids.
- Fewer rows than
max_reviews: the store had fewer reviews; total_page_count on each row shows what was available.
- Run stops around 1,250 rows per iOS app: the 50-page cap; use
start_page to continue in a follow-up run.
See references/gotchas.md for cost guardrails and error recovery, and references/actor-index.md for the Actor routing table.
Related Apple App Store Actors
1---2name: apify-app-store-reviews-scraper3description: Scrape Apple App Store reviews into structured JSON with the Apify Apple App Store Reviews API Actor (johnvc/apple-app-store-reviews-api). Give it a numeric Apple product ID or just an app name and get one row per review with rating, review_title, review_text, author_name, reviewed_version, review_date_iso, and app context, across 52 country stores, sorted by most recent, most helpful, most favorable, or most critical. Use when the user wants an app store reviews scraper, wants to scrape App Store reviews or iOS app reviews, export Apple app reviews to JSON or CSV, build a review dataset for one or more apps, or pull the reviews behind a competitor's App Store listing. Pay-per-review billing, MCP-ready for Claude and other AI agents.4license: MIT5---67# App Store Reviews Scraper: Apple Reviews to Structured JSON89Scrape Apple App Store reviews into clean JSON with the Apify Apple App Store Reviews API. Give it a numeric product ID or just an app name, pick a country store and a sort order, and get one flat row per review: rating, title, body text, author, reviewed version, and dates.1011## When to use this skill1213- The user wants to scrape App Store reviews (to JSON, CSV, a sheet, or a database).14- They want the reviews for a specific iOS or macOS app as a dataset.15- They want reviews from a specific country store, or the most critical or most helpful reviews first.16- They ask for an "app store reviews scraper", "apple reviews scraper", or "iOS review export".1718Not for: App Store keyword rankings or app search results (use the Apple App Store Search Actor), app listing metadata such as price or screenshots (use the Apple App Store Product API Actor), or Google Play reviews (different store, different Actor).1920## What you get (one row per review)2122`review_id`, `review_title`, `review_text`, `rating` (integer 1 to 5), `review_date` (locale string) plus `review_date_iso`, `reviewed_version`, `author_name`, `author_id`, `product_id`, `app_platform` (ios or macos), `app_country`, `sort_order`, `page_number`, `position_on_page`, `position_global`, `total_page_count`, `reviews_for_current_version`, `fetch_timestamp`. When a review carries helpfulness votes and `parse_helpfulness` is on, `helpful_count` and `total_helpful_count` are added; most rows do not have them.2324## Prerequisites2526- Apify account (sign up at https://apify.com?fpr=9n7kx3&fp_sid=skillrepo).27- Authentication via `apify login`, or an `APIFY_TOKEN` environment variable (Apify Console, Settings, Integrations).2829## The Actor3031- Store page: https://apify.com/johnvc/apple-app-store-reviews-api?fpr=9n7kx3&fp_sid=skillrepo32- Actor ID: `johnvc/apple-app-store-reviews-api`33- Pricing: pay per review returned, plus a small per-run setup fee (see `references/gotchas.md`).3435## Run it with the Apify CLI3637Scrape by app name (the Actor resolves the top App Store search match):3839```bash40apify actors call "johnvc/apple-app-store-reviews-api" -i '{"app_name":"spotify","country":"us","sort":"mostrecent","max_reviews":100}' \41 --json \42 --user-agent apify-awesome-skills/apify-app-store-reviews-scraper \43 2>/dev/null44```4546Scrape exact apps by product ID, most critical first, from the UK store:4748```bash49apify actors call "johnvc/apple-app-store-reviews-api" -i '{"product_ids":["534220544","363590051"],"country":"gb","sort":"mostcritical","max_reviews":200}' \50 --json \51 --user-agent apify-awesome-skills/apify-app-store-reviews-scraper \52 2>/dev/null53```5455Every call carries the three flags this repo expects: `--json`, `--user-agent apify-awesome-skills/apify-app-store-reviews-scraper`, and `2>/dev/null`.5657## Run it from Claude or another AI agent (MCP)5859The Actor is MCP-ready. Add the hosted server URL:6061`https://mcp.apify.com/?tools=actors,docs,johnvc/apple-app-store-reviews-api`6263Then ask, for example: "Scrape the 100 most recent App Store reviews for Duolingo in the US and export them as JSON." MCP setup docs: https://docs.apify.com/platform/integrations/mcp6465## Workflow66671. Identify the app. Prefer `product_ids` (the number after `id` in an App Store URL: apps.apple.com/us/app/slug/idNNNNNNNN) for exact targeting. `app_name` is fine when the user only knows the name; the Actor reviews the top search match.682. Pick the store and order. `country` (two-letter code, 52 stores, default `us`) drives the storefront and the locale of review text and dates. `sort` is `mostrecent`, `mosthelpful`, `mostfavorable`, or `mostcritical` (iOS only; macOS always returns most recent).693. Bound the volume. `max_reviews` caps rows per app (default 100). Setting 0 means unlimited up to 50 pages, about 1,250 reviews on iOS or 500 on macOS.704. Estimate cost, then confirm with the user if the run is large. See `references/gotchas.md`.715. Run the Actor and read the dataset. Deliver rows as JSON or CSV, or hand back the dataset link. Dedupe across runs on `review_id`.7273## Inputs7475- `product_ids` (array of strings): numeric Apple product IDs, fetched sequentially in one run76- `app_name` (string): free-form app name, auto-resolved to the top search match when `product_ids` is empty (one of the two is required)77- `country` (enum, 52 codes, default `us`): Apple country store78- `sort` (enum, default `mostrecent`): `mostrecent`, `mosthelpful`, `mostfavorable`, `mostcritical`79- `max_reviews` (integer, default 100): cap per app; 0 = unlimited up to 50 pages80- `start_page` (integer, default 1): resume a long run81- `include_macos` (boolean, default true): set false to skip macOS apps without charges82- `normalize_dates` (boolean, default true): adds `review_date_iso`83- `parse_helpfulness` (boolean, default true): adds helpfulness counts when a review has votes8485## Cost8687Billing is per review returned plus a small one-time setup fee per run. A 100-review run is well under a dollar; even the 1,250-review iOS maximum for one app stays around two dollars. Batch multiple `product_ids` into one run so the setup fee is paid once. Live prices and estimates are in `references/gotchas.md`.8889## Honest limits9091- `sort` applies to iOS apps only; macOS apps always return most recent.92- `app_name` resolution takes the top search match, which can be the wrong app for generic names; use `product_ids` when it matters.93- `review_date_iso` is best-effort parsing and can be null for unfamiliar locale formats; the raw `review_date` string is always there.94- Helpfulness counts appear only on reviews that have votes; do not promise them on every row.95- Apple serves a bounded review window per app (about 50 pages), not the full historical archive.9697## Troubleshooting9899- Empty dataset: wrong `product_id`, an app with no reviews in that country store, or a macOS app with `include_macos` false.100- Wrong app came back: `app_name` matched a different app; rerun with the exact `product_ids`.101- Fewer rows than `max_reviews`: the store had fewer reviews; `total_page_count` on each row shows what was available.102- Run stops around 1,250 rows per iOS app: the 50-page cap; use `start_page` to continue in a follow-up run.103104See `references/gotchas.md` for cost guardrails and error recovery, and `references/actor-index.md` for the Actor routing table.105106## Related Apple App Store Actors107108- Apple App Store Search (keyword rankings and search results): https://apify.com/johnvc/apple-app-store-search?fpr=9n7kx3&fp_sid=skillrepo109- Apple App Store Product API (listing details for an app ID): https://apify.com/johnvc/apple-app-store-product-api?fpr=9n7kx3&fp_sid=skillrepo