App Store Price & Rating Monitor
Pricing
from $1.04 / 1,000 app records
App Store Price & Rating Monitor
Apple App Store Monitor that returns price, star rating, rating count and version. Up to 26 typed fields per record. Watch a competitor's price on a schedule. Export to JSON, CSV or Excel, run it on a schedule, or call it from the Apify API.
Pricing
from $1.04 / 1,000 app records
Rating
0.0
(0)
Developer
angel nguyen
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
12 days ago
Last modified
Categories
Share
What this Actor does
Apple App Store data you can query on a schedule: give this Actor a list of App IDs and get back price, star rating, rating count and version as one typed row per app. It reads Apple's own public iTunes Lookup API directly, so there is no account to create, no API key to hold and no browser to drive.

The point of it is the diff. Turn on changesOnly and the Actor compares each app against the snapshot it kept from your previous run and emits a row only when a field you are watching actually moved — so a daily schedule over fifty competitor apps produces a handful of rows on a normal day and a loud one on the day somebody drops their price to free.
Key features
- Three ways in. Numeric App IDs, reverse-DNS bundle IDs, or a free-text search term. IDs and bundle IDs resolve through Apple's
/lookupendpoint; search is opt-in and off by default. - 26 fields per record, counted from a real run — price and currency, aggregate rating and rating count, version and release notes, developer, category, content rating, size, languages, screenshots, icon and store URL.
- Change detection built in.
changesOnlyemits a row only when a watched field differs from the previous run, and attacheschangedFields,previousandpreviousSeenAtso the row explains itself. - You choose what counts as a change.
watchFieldsdefaults toprice,ratingandversion; any output field is fair game. - Any storefront.
countrytakes an ISO-2 code, and prices and availability genuinely differ between Apple's storefronts. - Aggregates only, never people. Apple's published rating and rating count. No individual review text, no user names, no device identifiers.
- Polite by construction. The disallowed search path is capped at one request per second regardless of
maxConcurrency, and the Actor backs off on 403 and 429 rather than retrying hard.
How it works
- You supply App IDs, bundle IDs or search terms, plus a storefront.
- Search terms (if you used any) are resolved to App IDs at no more than one request per second, because
/search*is disallowed by Apple's robots.txt. - Every resolved ID is fetched from
/lookup, which robots.txt allows, and mapped to a flat typed record. - If
changesOnlyis off, every record is pushed to the dataset. - If
changesOnlyis on, each record is compared field-by-field against the previous run's snapshot — held in the Actor's own key-value store, keyed by App ID and storefront — and only genuine movements are pushed. - The snapshot is rewritten, so the next run diffs against this one.
The first run in changesOnly mode has no baseline to compare against, so it emits everything and says so in the log. That is deliberate: a silent empty first run looks identical to a broken one.
Input
At least one of appIds, bundleIds or searchTerms must be non-empty. If all three are blank the Actor stops with a clear message instead of writing an empty dataset.
Input fields
| Field | Type | Default | What it does |
|---|---|---|---|
appIds | array | ["284882215","310633997"] (prefilled) | Apple numeric track IDs, e.g. 284882215 (Facebook). The fastest and most reliable input — resolved via Apple's /lookup endpoint. |
bundleIds | array | [] | Reverse-DNS bundle identifiers, e.g. com.facebook.Facebook. Also resolved via /lookup. |
searchTerms | array | [] | Free-text app search. Optional and off by default: itunes.apple.com/robots.txt disallows /search*, so this actor keeps search opt-in, rate-limits it to 1 request/second, and uses it only to resolve terms to app IDs. Prefer App IDs or Bundle IDs where you can. |
country | string | "us" | ISO-2 storefront code. Apple operates 175 storefronts; prices and availability differ between them. |
limit | integer | 20 | Max apps returned per search term. Ignored for App ID / Bundle ID lookups. |
includeRatings | boolean | true | Include Apple's published aggregate rating and rating count. These are aggregates only — no individual user reviews are collected. |
changesOnly | boolean | false | Compare each app against the previous run's snapshot and emit a row ONLY when a watched field changed. The first run has no baseline, so it emits everything and logs that it did. |
watchFields | array | ["price","rating","version"] | Fields compared when 'Emit changes only' is on. |
maxConcurrency | integer | 5 | Concurrent requests to Apple. Deliberately conservative. The search path is separately capped at 1 request/second regardless of this value. |
Example input
Two real App IDs — 284882215 is Facebook, 310633997 is WhatsApp Messenger — in the US storefront, with ratings on.
{"appIds": ["284882215","310633997"],"country": "us","includeRatings": true}
Output
One dataset item per app per run. The record below is a real row from a real run of this Actor, copied unedited.
Example output
{"appId": 284882215,"appName": "Facebook","bundleId": "com.facebook.Facebook","developer": "Meta Platforms, Inc.","developerId": 284882218,"category": "Social Networking","genres": ["Social Networking"],"price": 0,"currency": "USD","formattedPrice": "Free","version": "575.0.0","releaseDate": "2019-02-05T08:00:00Z","lastUpdated": "2026-08-18T23:16:40Z","releaseNotes": "Our teams have solved many crashes, fixed issues you’ve reported and made the app faster.","description": "Where real people propel your curiosity. Whether you’re thrifting gear, showing reels to that group who gets it, or sharing laughs over fun images reimagined by AI, Facebook helps you make things happen like no other social network.\n\nExplore and expand your interests: \n* Shop Marketplace for hidden gems and take your hobbies to the next level\n* Personalize your Feed to see more of what you like, less of what you don’t\n* Ask Meta AI for information and get answers instantly\n* Drive into reels that reflect the things you're interested in\n* Search Facebook on any topic and get more interactive results\n\nConnect with people and communities:\n* Join groups to learn tips from real people who’ve been there, done that\n* Get inspired by creators, or catch up with Friends\n* Add new Friends to your world, but also decide how closely to keep up with them\n* Privately message relatable posts that only your BFF will get or that reels trend everyone’s talking about\n\nShare your world:\n* Use generative AI to create custom stickers and images to delight friends\n* Customize your profile to choose how you show up and who sees your posts\n* Effortlessly create reels from trending templates, or showcase your creativity with a full suite of editing tools\n* Capture moments on the fly with stories\n\nSome features may not be available in your country or region. \n\nTerms & Policies: https://www.facebook.com/policies_center\nPrivacy Policy: https://www.facebook.com/privacy\n\nLearn how we're working to help keep our communities safe across Meta technologies at the Meta Safety Center: https://about.meta.com/actions/safety","contentRating": "12+","size": 491387904,"languages": ["AR","HR","CS","DA","NL","EN","FI","FR","DE","EL","HE","HI","HU","ID","IT","JA","KO","MS","NB","PL","PT","RO","RU","ZH","SK","ES","SV","TH","ZH","TR","UK","VI"],"screenshots": ["https://is1-ssl.mzstatic.com/image/thumb/PurpleSource221/v4/e2/c0/fa/e2c0faf7-2613-0ead-3c3a-193d992e3930/f254967c-6ef9-4cc6-b4bf-e89cf016337c_1-iOS-5.5-Home.png/392x696bb.png","https://is1-ssl.mzstatic.com/image/thumb/PurpleSource211/v4/6a/d9/9b/6ad99bf8-e769-1fd2-0ac7-f9f0553978a2/c795c58d-ec37-463c-9ab9-ba0b8bc00ddd_2-iOS-5.5-Reels.png/392x696bb.png","https://is1-ssl.mzstatic.com/image/thumb/PurpleSource211/v4/f4/96/e9/f496e921-c05e-ade9-ef3c-c37949d0e6aa/0130e841-7bad-4f8c-83c9-61ea0bac7d7b_3-iOS-5.5-Stories.png/392x696bb.png","https://is1-ssl.mzstatic.com/image/thumb/PurpleSource221/v4/a5/c9/20/a5c9207f-2eb4-ccf1-6573-bda3c3e089cb/9b761f68-4cd1-4c66-b5f2-76de4f58005f_4-iOS-5.5-Groups.png/392x696bb.png","https://is1-ssl.mzstatic.com/image/thumb/PurpleSource221/v4/e9/40/05/e9400518-1876-dbdd-89aa-a2f88916f117/68c29824-a52c-4766-8aea-0a70c7a2f86f_5-iOS-5.5-Profile.png/392x696bb.png","https://is1-ssl.mzstatic.com/image/thumb/PurpleSource211/v4/40/b2/5c/40b25ca0-8eee-0e9c-b068-08ec6741908b/28ff37e9-d855-4e6e-a8b4-fb2d585bb9ca_6-iOS-5.5-Marketplace.png/392x696bb.png","https://is1-ssl.mzstatic.com/image/thumb/PurpleSource221/v4/df/a0/d6/dfa0d6c7-a1a2-873f-953c-4997aab4acbb/691c88f4-f976-46bb-92e1-5f088e8aa47f_7-iOS-5.5-Share.png/392x696bb.png","https://is1-ssl.mzstatic.com/image/thumb/PurpleSource211/v4/32/50/41/325041cd-f718-ba5b-5c05-3c930a8af80c/d49c0719-9500-4504-8a4c-3124b914bafa_8-iOS-5.5-Search_with_AI.png/392x696bb.png","https://is1-ssl.mzstatic.com/image/thumb/PurpleSource211/v4/02/29/3e/02293e8a-d565-25b2-2405-31389c8a6e6e/ee650e7b-1eaa-4de6-81a2-0b35dac16446_9-iOS-5.5-Write_with_AI.png/392x696bb.png","https://is1-ssl.mzstatic.com/image/thumb/PurpleSource221/v4/f6/b2/32/f6b2327b-e56b-7c4c-b41b-2ee19340e8d5/89fe27f2-ff0a-4a61-a502-73c2bd05da89_10-iOS-5.5-Notifications.png/392x696bb.png"],"icon": "https://is1-ssl.mzstatic.com/image/thumb/Purple211/v4/c4/f1/cb/c4f1cb18-b290-388f-2a08-dc590d5fd457/Icon-Production-0-0-1x_U007epad-0-1-0-sRGB-85-220.png/512x512bb.jpg","storeUrl": "https://apps.apple.com/us/app/facebook/id284882215?uo=4","country": "us","scrapedAt": "2026-08-22T07:33:37.025Z","rating": 4.52508,"ratingsCount": 27932348,"currentVersionRating": 4.52508}
Output fields
Every field below is taken from that same real record. Values are truncated for width, never invented.
| Field | Type | Value from a real run |
|---|---|---|
appId | number | 284882215 |
appName | string | Facebook |
bundleId | string | com.facebook.Facebook |
developer | string | Meta Platforms, Inc. |
developerId | number | 284882218 |
category | string | Social Networking |
genres | array | ["Social Networking"] |
price | number | 0 |
currency | string | USD |
formattedPrice | string | Free |
version | string | 575.0.0 |
releaseDate | string | 2019-02-05T08:00:00Z |
lastUpdated | string | 2026-08-18T23:16:40Z |
releaseNotes | string | Our teams have solved many crashes, fixed issues you’ve reporte… |
description | string | Where real people propel your curiosity. Whether you’re thrifti… |
contentRating | string | 12+ |
size | number | 491387904 |
languages | array | ["AR","HR","CS","DA","NL","EN","FI","FR","DE","EL","HE","HI","H… |
screenshots | array | ["https://is1-ssl.mzstatic.com/image/thumb/PurpleSource221/v4/e… |
icon | string | https://is1-ssl.mzstatic.com/image/thumb/Purple211/v4/c4/f1/cb/… |
storeUrl | string | https://apps.apple.com/us/app/facebook/id284882215?uo=4 |
country | string | us |
scrapedAt | string | 2026-08-22T07:33:37.025Z |
rating | number | 4.52508 |
ratingsCount | number | 27932348 |
currentVersionRating | number | 4.52508 |
When changesOnly is on, three more fields ride along on every emitted row: changedFields (the names that moved), previous (their prior values) and previousSeenAt (when that baseline was taken).
Pricing
Pay-per-event. You are charged for what a run delivers, not for how long it takes, and platform compute is not billed on top.
| Event | Price | Charged when |
|---|---|---|
| App record | $0.0011 | One typed App Store record - price, rating, version, developer, 30 fields - resolved live from Apple. |
| Actor start | $0.00001 | Starting a run is charged at the platform minimum of $0.00001 - effectively free. You pay for what the run actually delivers. |
| Change detected | $0.004 | Fires in changesOnly mode when a watched field on an app you monitor actually moved. You pay for the signal, not the polling. |
What a run actually costs
Worked from the prices in the table above:
- 50 apps, once a day, full snapshot. 50 records x $0.0011 = $0.055 per run, about $1.65 a month on a daily schedule.
- 50 apps, once a day,
changesOnly. You still pay per record delivered, and on a quiet day almost nothing is delivered. A day on which three apps move costs 3 x $0.0011 in records plus 3 x $0.004 for the change events = $0.0153. - A single lookup. One app, one run: $0.00001 to start plus $0.0011 for the record = $0.00111.
The Actor-start charge is the platform minimum of $0.00001 — a run that resolves nothing costs a hundredth of a cent.
FAQ
Do I need an Apple developer account or an API key?
No. The Actor calls Apple's public iTunes Lookup and Search endpoints over plain HTTPS. There is no account, no key, no session cookie and no CAPTCHA in the path.
Does it read user reviews?
No. It returns Apple's published aggregate rating and ratingsCount, and the aggregate for the current version. Individual review text and reviewer identities are never collected.
Why is search off by default?
itunes.apple.com/robots.txt allows /lookup?id= and disallows /search*. So search is opt-in, capped at one request per second regardless of maxConcurrency, and used only to turn a term into App IDs — the record itself still comes from /lookup.
How do I get alerts instead of a table?
Turn on changesOnly, schedule the Actor, and attach a webhook or a Slack/Zapier/Make integration to the run. On a normal day the dataset is empty and nothing fires; on the day a price moves you get the row.
What happens on the very first changesOnly run?
It emits every app, because there is no previous snapshot to diff against, and it logs that this is why. From the second run on it emits only movements.
Can I watch a non-US storefront?
Yes — set country to any ISO-2 storefront code. Price, currency and availability genuinely differ between storefronts, so a competitor can be free in one and paid in another.
Is this affiliated with Apple?
No. See "Legal and responsible use" below.
Limits and error handling
limitcaps results per search term at 200; it is ignored for App ID and bundle ID lookups, which return one record each.maxConcurrencyis capped at 20 and defaults to 5. The search path ignores it and stays at one request per second.- The Actor backs off exponentially on 403 and 429 rather than retrying hard.
- If every identifier fails to resolve, the run finishes with an empty dataset and says so in the log rather than failing silently.
- Snapshots for
changesOnlylive in the Actor's own named key-value store, so they survive between runs but are per-Actor, not shared across accounts.
Integrations and API
Everything below works on any Apify account, including the free tier.
Run it from the Apify API
Start a run and wait for the dataset in one call. Replace <YOUR_TOKEN> with your own Apify API token.
curl -X POST "https://api.apify.com/v2/acts/praise-most-high~app-store-intelligence/run-sync-get-dataset-items?token=<YOUR_TOKEN>" \-H "Content-Type: application/json" \-d '{"appIds":["284882215","310633997"],"country":"us","includeRatings":true}'
Use it from JavaScript or Python
import { ApifyClient } from 'apify-client';const client = new ApifyClient({ token: '<YOUR_TOKEN>' });const run = await client.actor('praise-most-high/app-store-intelligence').call({"appIds":["284882215","310633997"],"country":"us","includeRatings":true});const { items } = await client.dataset(run.defaultDatasetId).listItems();
Schedules, webhooks and integrations
Run it on a schedule — hourly, daily, or a cron expression — and have the output pushed where you already work. Apify ships first-party integrations for Zapier, Make, n8n, Slack, Google Drive, GitHub and generic webhooks, and any run can fire a webhook on success or failure. The dataset is also readable directly as JSON, CSV, XLSX, XML or RSS from its own URL, so a spreadsheet or a BI tool can point straight at it.
Where the data comes from
Apple's own public iTunes Lookup and Search API (itunes.apple.com/lookup and /search), read live on every run. Nothing is cached between runs, so a record is as fresh as the moment the run made the request.
The Actor does not scrape the App Store website, does not drive a headless browser, does not rotate proxies and does not bypass anything. robots.txt was checked live: /lookup?id= is allowed, /search* is disallowed, and the Actor's default path (appIds / bundleIds) never touches /search at all.
Legal and responsible use
Unofficial. This Actor is not affiliated with, endorsed by, or sponsored by Apple Inc. "Apple", "App Store" and "iTunes" are trademarks of Apple Inc., used here only to describe the public data source this Actor reads.
No personal data. No user names, no individual review text, no device identifiers, no purchase history. The rating fields are Apple's published aggregates, never per-person records.
Your obligations. App descriptions, screenshots and icons are copyrighted by their developers, and the aggregate ratings are Apple's. This is a research and monitoring tool, not a redistribution pipeline — do not republish that material as your own content.
Support and feedback
Found a bug, a wrong field, or a source that changed shape? Open an issue on the Issues tab of this Actor and it goes straight to the maintainer. Feature requests are welcome on the same tab. If a run failed, include the run ID — the log is what makes it fixable.
