apihq/app-store-reviews-scraper · App Store
App Store Reviews Scraper
Export Apple App Store reviews and developer replies to JSON from an app ID or apps.apple.com URL. One record per review with rating, title, text, author, developer reply, and date.
$0.00008/review · failed items $0.0000 — on your existing Apify account, a one-item first run costs under a cent.
What does App Store Reviews Scraper do?
Scrape Apple App Store reviews to JSON by app ID or URL. No Apple account. One record per review with rating, title, text, author, developer reply, and date. Sort by recent, helpful, favorable, or critical. Empty apps cost $0. $0.08 per 1,000 reviews.
Data and AI workflows that turn app reviews into text: sentiment and brand-safety analysis, competitor and release-quality monitoring, and building review datasets for LLM pipelines. The failure-free billing matters most when the extraction runs unattended and one bad app must not take down the batch.
The review source it reads does not carry the review's app version or helpful-vote count, so those fields are not in the output. (Apple's public RSS feed exposes those two fields but is limited to about 500 reviews per country and sort.)
Example run
{ "appIds": ["324684580", "9999999999"], "sort": "critical", "maxReviews": 3 }outcome
- 3 success: true review rows from Spotify, most critical first — billed
- 1 success: false row, code: NO_REVIEWS, for the nonexistent app — not billed
- Run status: SUCCEEDED
- Charged: 3 reviews = $0.00024
Good input returns billed rows. Bad input returns free error rows in the same dataset, and the run still succeeds.
Why pipelines pick it
Developer replies included
Each review carries the developer's public response (reply_text) and when it was last updated — the field most review scrapers drop.
Sort every app four ways
Order each app's reviews by recent, helpful, favorable, or critical, so you pull the exact slice your analysis needs.
You pay only for reviews
Billing fires on an explicit per-review event, not on dataset writes. There is no per-run start fee, so an app that returns nothing costs $0.
Partial results stay usable
If Apple rate-limits a deep walk, the actor stops instead of adding pressure: delivered reviews stay in the dataset, one free diagnostic row records why, and the run still succeeds.
Best for: Data and AI workflows that turn app reviews into text: sentiment and brand-safety analysis, competitor and release-quality monitoring, and building review datasets for LLM pipelines. The failure-free billing matters most when the extraction runs unattended and one bad app must not take down the batch.
Input & output
{
"appIds": [
"324684580",
"https://apps.apple.com/us/app/instagram/id389801252"
],
"maxReviews": 500,
"sort": "recent",
"country": "us"
}{
"success": true,
"review_id": "14282988831",
"app_id": "324684580",
"user_name": "Neightfrog",
"rating": 1,
"title": "App has become unreliable",
"text": "The app has become unreliable and will stop playing randomly.",
"posted_at": "2026-07-09T18:01:47Z",
"is_edited": true,
"reply_text": "Hello. We appreciate the review. We'd recommend a clean reinstall.",
"reply_updated_at": "2026-07-08T18:15:11Z",
"url": "https://apps.apple.com/us/app/id324684580?see-all=reviews"
}{
"success": false,
"app_id": "9999999999",
"code": "NO_REVIEWS",
"error": "Apple App Store returned no reviews for app: 9999999999",
"request_id": "req_911f37d2e55644ff9d9e4a3f",
"status_code": 404
}Branch on the success field to split hits from misses. Quote the request_id in any support issue and we can trace the exact request.
output fields
| field | type | what it is |
|---|---|---|
| success | boolean | true for a review (billed). false for an unbilled diagnostic row: one bad or empty app, or a global row marking that the walk stopped early. |
| review_id | string | Apple's unique review ID. |
| app_id | string | The numeric App Store app ID the review belongs to. Copied onto every row so each row stands alone. |
| user_name | string | Reviewer display name. |
| rating | integer | Star rating, 1 to 5. |
| title | string | The review title. May be empty. |
| text | string | The review body. May be empty. |
| posted_at | string | ISO 8601 UTC timestamp the review was posted. |
| is_edited | boolean | True when the reviewer edited the review after first posting. |
| reply_text | string | The developer's reply body. Absent when there is no reply. |
| reply_updated_at | string | ISO 8601 UTC timestamp the developer reply was last modified. Absent when there is no reply. |
| url | string | App Store listing URL (Apple exposes no per-review permalink). |
Error codes, stable across releases
Every failure record carries one of these machine-readable codes. None of them are ever charged.
| code | billed | meaning |
|---|---|---|
| NO_REVIEWS | $0.0000 | The app has no reviews in the requested storefront, or the app does not exist. |
| VALIDATION_FAILED | $0.0000 | The input was not a recognizable numeric app ID or apps.apple.com URL. |
| APP_STORE_RATE_LIMITED | $0.0000 | Apple rate-limited the walk. Delivered reviews are kept; the remaining walk stops and the run still succeeds. |
| APP_STORE_OVERLOAD | $0.0000 | The extraction service shed the request under load. Early stop; delivered reviews are kept. |
| APP_STORE_UPSTREAM_UNAVAILABLE | $0.0000 | Apple was unavailable. Early stop; delivered reviews are kept. |
| APP_STORE_REVIEWS_TIMEOUT | $0.0000 | Listing the app's reviews timed out. Early stop; delivered reviews are kept. |
| DEADLINE_EXCEEDED | $0.0000 | The per-request deadline was hit. Returned as an unbilled row with status_code 504. |
| NO_INPUT | $0.0000 | No usable app ID was provided. |
What a run costs
The charge fires only when a result is delivered, and platform compute is included in the per-result price. To cap the spend of a run, set a limit in Apify's Run Limits panel. The actor stops at the cap and reports how far it got.
What this actor doesn't do
- The review source it reads does not carry the review's app version or helpful-vote count, so those fields are not in the output. (Apple's public RSS feed exposes those two fields but is limited to about 500 reviews per country and sort.)
- Reviews are per country. Apple serves a country-specific storefront (default us); to cover another market, run the app again with a different country.
- Developer replies appear only when the developer replied. Most reviews have no reply; reply_text is simply absent on those rows.
- It reads public reviews only — what a signed-out visitor sees on the App Store listing. Apple exposes no per-review permalink, so url is the app's listing page.
Frequently asked questions
- Do I need an Apple account or API key?
- No. The Actor reads public App Store reviews directly by app ID.
- How do I point it at an app?
- Use the numeric App Store ID (324684580) or an apps.apple.com URL. Both resolve to the same app; up to 50 unique apps run per job. An unrecognizable value comes back as success:false with code VALIDATION_FAILED, not a rejected run.
- How many reviews can I get per app?
- Up to your maxReviews, subject to what Apple serves and to upstream conditions. maxReviews is a target, not a guarantee: an app with fewer reviews, or an upstream rate limit, outage, or timeout, can return fewer.
- What if the Actor stops before maxReviews?
- You keep everything delivered so far. The reviews already delivered stay in the dataset and are billed, one free success:false diagnostic row records why it stopped (for example APP_STORE_RATE_LIMITED), and the run still finishes SUCCEEDED. You are never charged for reviews that were not delivered.
- Can I get reviews from other countries?
- Yes. Set country (gb, de). Apple serves a country-specific storefront, so one run covers one country; run the app again per market for wider coverage.
- How does billing know an app returned nothing?
- Billing fires on an explicit per-review charge event, not on dataset writes. The Actor only fires it when a review is delivered, so success:false records sit in your dataset for free.
Pairs with
Google Play Reviews Scraper
Export a Google Play app's reviews to JSON from a package name or store URL. One record per review with rating, text, author, developer reply, and date.
TripAdvisor Reviews Scraper
Export TripAdvisor reviews to JSON from a hotel, restaurant, or attraction URL or location ID. Filter by rating, traveler type, and date; owner replies, photos, and sub-ratings included.
Run it on the Apify account you already have
Paste one input into the actor's console and check the dataset it returns. A one-item first run costs under a cent — no new subscription, pay only for delivered results.
Get an iOS app's reviews