DEV Community

Devil Scrapes
Devil Scrapes

Posted on

255 App Store scrapers and not one of them tracks keyword rank

Quick answer

Apple's itunes.apple.com/search endpoint is keyless, public, and returns rich app metadata โ€” but it never tells you the rank. The position is implicit: it is the index of each result in the array Apple hands back. Nobody stores it, so nobody can trend it. We measured the Apify Store cluster before building: 255 rivals for "app store scraper", 85 with real users, led by one with 1,928 users and 24,794 runs in 30 days โ€” and all five leaders scrape reviews. The App Store Keyword Ranking Scraper does the other thing: keywords ร— country storefronts in, rank position out.

Why is rank the missing field? ๐Ÿ“‰

Because it isn't a field. Apple returns:

{ "resultCount": 9, "results": [ {...}, {...}, ... ] }
Enter fullscreen mode Exit fullscreen mode

The app at results[0] ranks 1 for that keyword in that storefront. The app at results[4] ranks 5. That's it โ€” the signal exists only as array order, and it evaporates the moment anything reshuffles the list or stores results in an unordered structure.

So the interesting product isn't the metadata dump every other scraper produces. It's the 1-based position, stamped per keyword and per storefront, at a point in time โ€” because that is the series an ASO consultant needs to answer "did our metadata change move us, or did a competitor just outspend us?"

We derive it explicitly and write it as rank, alongside the timestamp in scrapedAt.

The competitive read, stated plainly ๐ŸŽฏ

We ran cluster depth before writing code, because in a clone cluster traction is the tiebreak and a brand-new listing has none:

Term Rivals With real users Leader
app store scraper 255 85 1,928 users / 24,794 runs (30d)

That is enormous proven demand and a brutal place to launch another reviews scraper. Which is exactly why this one doesn't. The five apps at the top of that cluster are appstore-reviews-scraper, appstore-reviews, app-store-reviews-scraper and friends. Reviews are well served. Keyword rank is not.

We would rather tell you that openly than pretend we invented a category.

What we handle ๐Ÿ›ก๏ธ

Apple's Search API is public, so this is not an anti-bot fight โ€” it is a rate-limit and correctness fight, which is a different discipline:

  • Pacing. Apple throttles roughly per-IP. There's a minimum interval between calls rather than a burst-and-pray loop.
  • Retries on 403 / 408 / 429 / 503 and network errors, up to 5 attempts, honouring Retry-After when Apple sends one.
  • Session rotation. One curl-cffi session per browser impersonation profile, round-robined, so consecutive requests don't present an identical fingerprint.
  • Fault isolation per pair. A keyword ร— country pair that fails is skipped; the rest of the matrix still returns. A 40-pair run doesn't die because one storefront hiccupped.
  • Zero results is an answer. A keyword nobody ranks for finishes SUCCEEDED with a status message, not a failed run. resultCount: 0 is real data โ€” we captured a genuine one as a test fixture.

The limit=200 ceiling, and why it matters for ASO ๐Ÿงข

Apple caps limit at 200 results per query. For rank tracking that is rarely a constraint โ€” if your app is past position 200 for a keyword, the actionable number is "not ranking", and precision at 214 buys you nothing.

It is a constraint if you were hoping to enumerate a whole category. This is not the tool for that, and we'd rather say so up front than have you discover it on run three.

What you get per row

Verified against a live query โ€” ranks 1โ€“3 for crm on the US storefront came back as DealerSocket, HubSpot, Zoho, matching Apple's own ordering by trackId:

Field Example
keyword / country / entity crm / us / software
rank 1
trackName / trackId / bundleId CRM by DealerSocket / 1453920054 / com.dealersocket.crm
sellerName SOLERA HOLDINGS, INC
averageUserRating / userRatingCount 4.64 / 2818
price / formattedPrice 0 / Free
version / currentVersionReleaseDate 1.35.0 / 2026-08-18
primaryGenreName / genres Business / [Business, Utilities]
description / releaseNotes full text โ€” useful for keyword-density work
trackViewUrl / artworkUrl512 canonical links

releaseNotes is quietly one of the most useful columns: it's how you spot a competitor shipping an ASO metadata change in the same week your rank moved.

FAQ

What does it cost?
$0.05 per run start plus $0.003 per ranked app โ€” $3.05 per 1,000 rows. Pay per result.

Do I need an API key or account?
No. Apple's Search API is keyless and public.

Does it scrape reviews?
No, deliberately. That cluster is crowded and well served. This is rank tracking.

Can I track several countries at once?
Yes โ€” keywords ร— countries is the input shape, and it fans out across the matrix. Each row carries its own country, so ranks never get mixed between storefronts.

iPad and Mac apps too?
Yes, via entity (software, iPadSoftware, macSoftware).

How often should I run it?
Daily or weekly on a fixed keyword set. Rank is only meaningful as a series โ€” one snapshot tells you position, several tell you direction.

Is this Google Play too?
No. Apple only. Play has no comparable keyless search endpoint, and pretending otherwise would mean quietly shipping a scraper that breaks.


Built by Devil Scrapes. We do the dirty work so your dataset stays clean. ๐Ÿ˜ˆ

Top comments (0)