App Store Listing Change Feed - iOS ASO & Price Change Tracker
Pricing
from $12.00 / 1,000 listing change detecteds
App Store Listing Change Feed - iOS ASO & Price Change Tracker
Watches iOS apps across App Store storefronts and emits only what changed since the last run: renamed title, edited description (word-level diff), new version and release notes, price change, new icon or screenshots, category move, delisting or new storefront.
Pricing
from $12.00 / 1,000 listing change detecteds
Rating
0.0
(0)
Developer
Mikkel Bech-Hansen
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
20 days ago
Last modified
Share
Give this actor a list of iOS apps and the App Store storefronts you care about, and it tells you what changed since the last time it ran. Not a snapshot of the listing — the diff. Every other App Store scraper hands you today's title, description and price and leaves you to store the results and compare them yourself; this one keeps that memory for you and returns only the edits: a competitor renamed their app, rewrote their description, shipped a new version, dropped their price, replaced their icon or screenshots, moved category, raised their minimum iOS, got delisted from a storefront, or launched in a new one. Each change comes with the value before, the value after, a word-level diff for text edits, and the rating and review count at the moment the change was spotted. Schedule it daily and it becomes a competitor ASO alert feed.
How it works
On the first run the actor records what each app's listing looks like in each storefront and returns one baseline record per app so you can confirm the watchlist is right. From then on, every run compares against what it saw last time and returns only what moved. On a quiet watchlist an empty dataset is the correct, expected result — that is the point of a change feed. It reads Apple's public iTunes Lookup endpoint, batching up to 100 apps per request, so a 500-app watchlist is a handful of HTTP calls.
Input
Every field has a working default. Run it with no configuration at all and it watches Facebook, Calm and ChatGPT in the US storefront.
| Field | Type | Default | Notes |
|---|---|---|---|
appIds | array of strings | Facebook, Calm, ChatGPT | App Store URLs (https://apps.apple.com/us/app/id284882215), bare IDs (284882215) or id284882215 fragments — all accepted |
countries | array of strings | ["us"] | Two-letter storefront codes: us, gb, de, jp, br… Each app is diffed separately per storefront |
seedFromChart | select | none | Also watch the current Apple top-free / top-paid / top-grossing chart for the first storefront |
chartSize | integer | 25 | Chart positions to take, 1–200 |
searchTerms | array of strings | [] | Keywords, e.g. habit tracker. Adds the top App Store search results for each to the watchlist |
maxAppsPerSearchTerm | integer | 25 | 1–200 |
maxAppsPerRun | integer | 200 | Hard cap on app × storefront checks per run, 1–5000. 50 apps × 3 storefronts = 150 checks |
trackedFields | multi-select | all except supportedDevices | title, description, version, price, icon, screenshots, genres, minimumOs, supportedDevices, seller, availability |
minDescriptionWordsChanged | integer | 1 | Report a description edit only when at least this many words moved. Raise it to silence typo fixes |
storefrontLanguage | string | "" (storefront default) | Locale for returned text, e.g. en_us, de_de, ja_jp |
maxChangeEvents | integer | 500 | Cap on change events returned and charged per run |
markDelistedAfterMisses | integer | 2 | Consecutive runs an app must be missing before a delisted event fires |
includeBaselineRecords | boolean | true | Emit one uncharged baseline record the first time an app is seen |
forceBaseline | boolean | false | Discard stored state and treat every app as new. Use after changing storefrontLanguage |
stateKeyValueStoreName | string | app-store-change-feed-state | Named key-value store holding the memory. Change it to run two independent watchlists |
requestsPerMinute | integer | 18 | Apple rate-limits at roughly 20/min per IP. 1–60 |
requestTimeoutSecs | integer | 30 | 5–120 |
maxRequestRetries | integer | 3 | 0–10. A batch that fails every retry is skipped — not charged, and never read as a delisting |
proxyConfiguration | object | no proxy | Optional. Apple's public endpoints do not IP-block; most watchlists never need this |
Output
One record per typed change, per app, per storefront. changeType is one of title, description, version, price, icon, screenshots, genres, minimumOs, supportedDevices, seller, delisted, appeared, or baseline.
A real record, from a run where the watched app had shipped a new version since the previous run:
{"changeType": "version","appId": 571800810,"appName": "Calm","bundleId": "com.calm.calmapp","country": "us","appStoreUrl": "https://apps.apple.com/us/app/calm/id571800810","developerName": "Calm.com","developerId": 571800813,"field": "version","previousValue": "6.9.0","newValue": "7.0.5","addedWords": [],"removedWords": [],"wordsAdded": 0,"wordsRemoved": 0,"wordDiff": null,"addedItems": [],"removedItems": [],"version": "7.0.5","previousVersion": "6.9.0","releaseNotes": "Thanks for using Calm, the #1 app to help you sleep more, stress less and live mindfully...\n\nThis update contains multiple bug fixes and performance improvements.","currentVersionReleaseDate": "2026-08-30T04:19:50Z","price": 0,"formattedPrice": "Free","currency": "USD","iconUrl": "https://is1-ssl.mzstatic.com/image/thumb/Purple211/v4/68/23/11/6823110c-7640-5606-1cae-0a453864343e/AppIcon-0-0-1x_U007emarketing-0-11-0-85-220.png/512x512bb.jpg","ratingAtChange": 4.77282,"userRatingCountAtChange": 1977970,"previousObservedAt": "2026-09-02T23:35:00.688Z","observedAt": "2026-09-02T23:35:13.955Z"}
Field notes:
previousValue/newValue— the before and after, as text, for every change type.wordDiff— inline word-level rendering fortitleanddescriptionedits, e.g.Calm is the [-number one-] {+#1+} app for [-sleep-] {+sleep, meditation,+} and relaxation. Find anxiety relief, stress …. Long unchanged stretches are elided.addedWords/removedWords— the individual words, capped at 60 each;wordsAdded/wordsRemovedcarry the true counts.addedItems/removedItems— for list fields: the screenshot URLs added and removed, the genres gained and lost, the device identifiers added and dropped.ratingAtChange/userRatingCountAtChange— the star rating and review count at the moment the change was observed. Ratings are never a change trigger (they move constantly); they are context for the change.delistedrecords carry the last known listing values;newValueisnull.baselinerecords are the first sighting and are never billed as a change event.
Cost
Two pay-per-event charges: app-checked ($0.0008) for each app polled in each storefront, and change-detected ($0.012) for each change event delivered. baseline records are free.
| Run | Charges |
|---|---|
| Zero-config first run (3 apps, 1 storefront) | 3 × app-checked = $0.0024 |
| 100 apps, 1 storefront, quiet day | 100 × app-checked = $0.08 |
| 100 apps, 1 storefront, typical day (~4 changes) | $0.08 + 4 × $0.012 = $0.13 |
| 100 apps, 3 storefronts, daily for a month | ~300 checks/day → $7.20/mo + changes |
| 500 apps, 1 storefront, weekly | 500 × $0.0008 = $0.40 per run |
A first run never charges a change event — it has nothing to compare against, so it charges only for the polling.
Known limitations
Read these before you buy; they are the honest edges of what the public endpoint exposes.
- No subtitle, promotional text, in-app purchase list or keyword field. Apple's Lookup endpoint does not return them. Getting them would mean scraping and parsing the App Store's client-rendered web page, which is fragile; this actor deliberately does not. If the subtitle is the ASO field you care about most, this is not your tool.
- Price is the base price only. Subscription and in-app purchase price changes are not visible to this endpoint, so an app going from a $9.99/mo to a $4.99/mo subscription shows no
priceevent. - The first run for any app in any storefront cannot report a change. It records a baseline. Real change events start on the second run.
- Detection is only as fine-grained as your schedule. A title that is changed and changed back between two runs is invisible. Daily is the useful cadence; hourly rarely finds more.
- Screenshot changes are detected by URL. Apple issues a new URL when a developer re-uploads an image, which is the signal used here. Re-uploading a byte-identical screenshot therefore counts as a change, and the actor cannot tell you what is visually different — only which URLs appeared and disappeared.
delistedis inferred from absence, not announced. An app pulled from a storefront and an app that has become region-locked look identical from here. The actor waits formarkDelistedAfterMissesconsecutive runs before reporting, and a failed HTTP request is never read as a delisting — but a genuinely long Apple outage could still produce a falsedelisted.supportedDevicesis noisy and off by default. Apple adds a new device identifier to most apps at once when new hardware ships, which produces a change event for the whole watchlist on the same day.- Rate limits. Apple allows roughly 20 requests per minute per IP on the Lookup endpoint. Because each request carries 100 app IDs, the default of 18/minute covers a 1,800-app watchlist per minute. Very large, very frequent watchlists may need the proxy input.
- Chart and search seeding occasionally returns an ID the Lookup endpoint will not resolve. Those apps are skipped, not charged for, and never reported as delisted.
- iOS and iPadOS apps only. Mac App Store, tvOS-only apps, and Google Play are out of scope.
- Changing
storefrontLanguagere-baselines every localised field. Turn onforceBaselinefor the run where you change it, or you will get one wave of bogus "edits".
Legal
This actor is not affiliated with, endorsed by, or sponsored by Apple Inc. "App Store", "iTunes", "iOS" and "iPadOS" are trademarks of Apple Inc.
It reads two public, unauthenticated Apple endpoints — the iTunes Lookup/Search API at itunes.apple.com and the Apple Marketing Tools RSS chart feed at rss.marketingtools.apple.com. Both are documented by Apple, but they are published for Apple's affiliate and marketing-tools programs, and Apple's terms for those programs and for its websites generally restrict automated access, impose request-rate limits, and constrain how the returned data may be stored, redistributed and displayed. Using this actor may not comply with those terms, regardless of the fact that the underlying listing data is publicly visible on the App Store — "public" and "permitted by the terms of service" are separate questions. You are responsible for reviewing Apple's applicable terms, for your own compliance with them, and for how you use, store and redistribute the data this actor returns.
The actor returns product and company information only: app listings and the developer entity that publishes them. It does not collect reviews, reviewer names, or any other personal data, and it does not access anything behind a login.