Apple App Store Review Alerts — New Reviews Only
Pricing
from $5.00 / 1,000 app-country checks
Apple App Store Review Alerts — New Reviews Only
Monitor new or edited Apple App Store reviews without duplicates. Filter low ratings by app and country for Slack, email, n8n, or Make alerts.
Pricing
from $5.00 / 1,000 app-country checks
Rating
0.0
(0)
Developer
Leonhardt Tools
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
14 days ago
Last modified
Categories
Share
Catch new 1–2★ App Store complaints without reprocessing or re-alerting old reviews.
Run once to build a silent baseline, schedule it daily, then connect the Dataset to Slack, email, n8n, Make, or your own workflow. Use an Apple bundle ID such as com.spotify.client, a numeric App ID, or an apps.apple.com URL. The Actor keeps independent state for each app × country and writes only new or edited reviews after the baseline.
Apple controls review availability and pagination. This Actor provides best-effort incremental monitoring from Apple's public storefront feed; it does not promise complete history, real-time delivery, or zero missed reviews.
Why this is not another review scraper
Raw review scrapers return the same recent pages every time a schedule runs. A production alert or reporting workflow then has to:
- maintain bundle ID → numeric App ID mappings;
- remember what each country returned last time;
- remove duplicates before triggering email, Slack, n8n, Make, or an AI workflow;
- avoid advancing a cursor when one target fails.
This Actor performs that recurring job. Exact identifier resolution and persistent state are the product; bulk historical scraping is not.
Quick start
{"apps": ["com.spotify.client"],"countries": ["us"],"mode": "delta","firstRun": "baseline","maxRating": 2,"maxPages": 1}
With this alert-ready example:
- the first successful run remembers up to 50 recent reviews and sends no historical alerts;
- later runs stop after reaching reviews already present in state;
- only newly observed or edited 1–2★ reviews pass to the Dataset;
- a failed target records an error in
OUTPUTand does not advance that target's state; - other targets continue.
For an initial backfill instead, set firstRun to emitAll and choose the rating range you want.
Accepted app identifiers
| Input | Example | Resolution behavior |
|---|---|---|
| Apple bundle ID | com.spotify.client | Exact Apple Lookup match only |
| Numeric App ID | 324684580 | Exact trackId match only |
| App Store URL | https://apps.apple.com/us/app/spotify/id324684580 | Numeric ID extracted, then verified |
If an identifier is missing, unavailable in a requested storefront, ambiguous, or returns incomplete metadata, that target fails closed. The Actor never substitutes a sample app, a search result, or a default App ID.
Inputs
| Field | Default | Meaning |
|---|---|---|
apps | required | Bundle IDs, numeric App IDs, or App Store URLs; maximum 25 |
countries | ["us"] | Two-letter Apple storefront codes; maximum 10 |
mode | delta | delta reads/writes state; snapshot returns the current visible window without touching delta state |
firstRun | emitAll | emitAll returns an initial backfill; baseline starts silently |
stateKey | automatic | Saved Tasks use their Task ID; direct runs use a stable direct namespace plus resolved target keys. Set an explicit unique value for another direct workflow over the same targets |
resetState | false | Rebuild this monitor's target state after successful scans; turn it off after the reset run |
maxPages | 2 | 1–10 pages per target, up to 50 reviews per page |
minRating / maxRating | 1 / 5 | Rating output range |
since | unset | ISO 8601 output filter on Apple's updated timestamp |
versions | unset | Exact reviewed app-version values |
includeKeywords | unset | Output when title or body contains any value, case-insensitively |
excludeKeywords | unset | Suppress output when title or body contains any value |
Filters affect output, not identity tracking. A review filtered out today is still remembered and does not unexpectedly become “new” when a filter changes. To intentionally backfill under a different filter, use another stateKey or a one-time resetState run.
The Actor accepts at most 25 app × country targets per run. This conservative V1 limit protects runtime and cost until larger cloud workloads are benchmarked.
Review output
The default Dataset contains only review events. Errors and run statistics are never mixed into the review rows.
{"schemaVersion": "1.0","requestedIdentifier": "com.spotify.client","bundleId": "com.spotify.client","appId": "324684580","appName": "Spotify: Music and Podcasts","country": "us","reviewId": "14289955980","rating": 1,"title": "Example title","body": "Example public review text","author": "Public reviewer name","appVersion": "9.1.62","appleUpdatedAt": "2026-07-11T12:31:00.000Z","firstSeenAt": "2026-07-13T00:10:00.000Z","fetchedAt": "2026-07-13T00:10:00.000Z","sourceUrl": "https://itunes.apple.com/us/review?id=324684580&type=Purple%20Software","dedupeKey": "324684580:us:14289955980","reviewHash": "sha256…","eventKey": "324684580:us:14289955980:sha256…","isNew": true,"isChanged": false,"changeType": "new"}
dedupeKey is the stable identity of an app × country × review. reviewHash changes when the public author, title, body, rating, app version, or Apple updated value changes. eventKey = dedupeKey + reviewHash identifies one exact delivered version: retrying the same event keeps the same eventKey, while a legitimate review edit produces a new one.
Apple's public review feed exposes updated, but no distinct creation timestamp. The Actor therefore reports appleUpdatedAt and its own firstSeenAt; it does not invent a creation date.
Apple may return the same app-level sourceUrl for multiple reviews. Do not treat it as a unique review URL.
Run summary
The default Key-Value Store record OUTPUT contains the machine-readable run summary and a result for every attempted target.
{"schemaVersion": "1.0","mode": "delta","stateKey": "mobile-products","targetsRequested": 2,"targetsAttempted": 2,"targetsSucceeded": 2,"targetsFailed": 0,"targetsSkippedDueToBudget": 0,"budgetLimitReached": false,"reviewsFetched": 100,"reviewsNew": 3,"reviewsChanged": 1,"reviewsFilteredOut": 2,"reviewsOutput": 2,"targets": [{"requestedIdentifier": "com.spotify.client","appId": "324684580","country": "us","status": "succeeded","pagesFetched": 1,"stoppedReason": "stateBoundary","stateAdvanced": true}]}
Use OUTPUT.targets[].error for target-level failures and warnings for coverage conditions. The Actor does not log public review bodies.
State and delivery semantics
- State is stored in the named Key-Value Store
app-store-review-delta-monitor-state, separately from each run's output storage. - Saved Tasks automatically include their Task ID in the state namespace when
stateKeyis blank. Direct runs usedirect; the state record still includes resolved App ID + country, so changing from bundle ID to numeric ID does not reset the monitor. Use an explicitstateKeyto isolate multiple direct workflows over the same targets. - A target's state is written only after its scan succeeds and accepted review items have been written.
- If a spending limit accepts only part of a result batch, state is marked
pendingOutput; the next run scans the configured window past already delivered rows so the remaining events can still be emitted. - Dataset writes and Key-Value Store updates are not a cross-storage transaction. A platform interruption between them can produce a duplicate on retry. Delivery is therefore at least once. Use
eventKeyfor retry-safe downstream idempotency; usededupeKeyonly when grouping all versions of one review. - Do not overlap two runs using the same
stateKeyand targets. Schedule the next run after the previous one can finish.
Reliability safeguards
- Uses the fresher first-page URL without an explicit
page=1, avoiding a stale CDN behavior reproduced during live testing. - Constructs JSON page 2–10 URLs instead of following Apple's advertised
nextlinks, which can return XML or self-loop. - Handles
feed.entryas absent, a single object, or an array. - Verifies exact app identity through Apple Lookup before reading reviews.
- Retries 429, 5xx, network, timeout, and malformed-JSON responses with bounded backoff.
- Rejects non-chronological pages and cross-page time reversal instead of publishing a potentially false delta.
- Rejects a whole review window—or one known review version—that moves backward relative to saved state.
- Deduplicates review IDs when pagination shifts during a run.
- Never advances a failed target's state.
Active PPE launch pricing
PPE pricing became active at 2026-07-13T19:04:44.648Z for build 1.0.4 (HhOSUA2ui48AXpZtM). It is designed around the monitoring job, not repeated historical rows:
apify-actor-start: $0.00005 per start (Apify synthetic event);app-country-check: $0.005 per successfully fetched app × country target;apify-default-dataset-item: $0.0001 per review event actually written.
app-country-check is the primary event. A run needs a maximum-charge allowance of at least $0.00505 for one Actor start plus one successful check. Private pre-release tests verified a full 50-item run, a budget-limited 2-item run, one invalid plus one valid target, and two identifiers resolving to the same target; event counts and spending limits behaved as designed.
At the launch price, checking 5 apps across 3 countries once per day costs about $2.25/month in successful-check events, plus $0.0001 for each emitted new/changed review and the small start event. Invalid or inconsistent targets fail before the successful-check charge.
The user's maximum cost per run is respected. Event prices shown in the Apify Console at run time are authoritative.
Four publisher-operated cloud runs verified full output, budget-limited partial output, invalid-target isolation, and resolved-target deduplication before launch. The public Store page and anonymous Actor metadata expose the active PAY_PER_EVENT pricing.
Important limits
- Apple's public storefront feed exposes at most 10 pages × 50 reviews—roughly the latest 500 reviews per app × country, not all history.
- If saved state is not reached within
maxPages, the target fails without charging or advancing state and asks the user to raisemaxPages. If the boundary is already outside Apple's 500-review window, the Actor cannot recover the missing history and requires an explicit reset/rebaseline. - Reviews can appear late, move between pages, be edited, or disappear under Apple's control.
- This is scheduled polling, not real-time delivery.
- Developer replies are not available from this feed.
- iOS storefront reviews are the tested scope. macOS-only claims are intentionally not made.
- Storefront availability varies. A valid App can be unavailable in a particular country.
- The data source is a public Apple storefront endpoint, not a private App Store Connect API and not an Apple partnership.
- Public reviewer names and text are user-generated content. Apply your own privacy, retention, moderation, and downstream escaping rules.
Local development
Requires Node.js 20+; the Actor image uses Node.js 24.
npm installnpm testnpm run test:livenpm start
For a local Actor run, place input in storage/key_value_stores/default/INPUT.json. Do not commit real review fixtures or reviewer data.