App Intelligence Bundle: Listing, Charts, Reviews & Developer
Pricing
from $0.50 / 1,000 app profiles
App Intelligence Bundle: Listing, Charts, Reviews & Developer
One app in, a full profile out. Pulls the store listing, scans the country top charts for its position, samples recent reviews into a star breakdown, and lists everything else the developer ships. Four scrapers, one run, joined on the app.
Pricing
from $0.50 / 1,000 app profiles
Rating
0.0
(0)
Developer
Daniel Meshulam
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
9 days ago
Last modified
Categories
Share
Give it an app. Get back the listing, its top-chart position by country, a star breakdown of recent reviews, and everything else that developer ships.
{ "appIds": ["324684580", "com.spotify.music"], "chartCountries": ["us", "gb"] }
Four scrapers, one run, joined on the app. No key, no login.
Why this is a bundle and not four runs
You could run the four Actors separately. Two of the joins are the reason not to.
The developer name is not an input you have. It comes out of the listing, and
the two stores spell the same company differently: Apple returns Spotify,
Google returns Spotify AB. So the portfolio lookup cannot happen until the
listing has, and it has to try both spellings. That ordering is the bundle.
Chart position is not a per-app query. The charts endpoint answers "what is
in the US top-free chart", not "where is this app". Answering the question you
actually have means pulling the chart and scanning it. Here isCharting is
false when you asked and it was not there, which is a real answer, rather than
a missing field you have to interpret. It is null when no chart covering that
app was read at all, which is a different answer and says so.
What one row gives you
| Field | |
|---|---|
title, appId, platform, developer, developerId | identity |
storeRating, storeRatingCount | the store's own lifetime numbers |
price, isFree, version, updatedAt, genres | listing state |
isCharting, chartPositions | rank per country, chart and category |
reviews.starCounts, reviews.negativeShare, reviews.sampleMeanRating | the recent sample, which is where a slide shows up first |
recentNegativeReviews | the five most recent 1-2 star reviews, verbatim |
developerAppCount, developerOtherApps | the rest of the portfolio, by rating count |
incompleteParts | which step fell short, if any |
The store's lifetime rating and the recent sample mean are deliberately both present. A 4.7 lifetime average with a 2.9 recent sample is the single most useful thing this returns, and averaging them together would hide it.
Three output views
The dataset ships with Overview, Chart positions and Review sentiment tabs, so you can read the part you came for without writing a transformation.
Partial profiles are labelled, not hidden
A member Actor that fails does not fail the run. A listing without reviews is
still worth having, so the missing part is named in incompleteParts and the
rest is returned. What is never returned is a profile that looks complete and
is not.
What it costs
Each member Actor charges its own normal rate, because the runs happen under your account with your token: App Store & Google Play Scraper, App Store Top Charts Scraper, App Store & Google Play Reviews Scraper and App Store Developer Portfolio Scraper. This Actor adds one small charge per composed profile on top.
That is the honest accounting. A bundle that hides the cost of what it triggers is a trap, so: profiling two apps with charts in two countries and 100 reviews each is four member runs, and the reviews are the expensive part at $0.20 per 1,000.
Set a maximum charge per run in the run options for a hard ceiling. It is honoured, and the Actor stops cleanly rather than being killed mid-write.
Use cases
- ASO and competitive tracking: schedule it weekly on a competitor set and watch rating, version cadence and chart rank move together
- Publisher due diligence: one call tells you how many apps a developer ships and how the rest of them are rated
- Release regression:
recentNegativeReviewscarriesappVersion, so a bad release shows up as complaints clustered on one version - Market entry: run the same app across
chartCountriesto see where it charts and where it does not - Feeding an LLM: one composed JSON object per app rather than four datasets to reconcile
Notes
- Apple charts only. Google Play publishes no equivalent public chart feed, so
chartPositionscovers the iOS side of a profile. The Android listing and reviews are unaffected. - The developer portfolio is an iOS catalogue. An Android-only developer name may return nothing; that shows up in
incompletePartsrather than as a silent empty list. - Reviews are a recent sample, not the full history. Both stores expose only a recent window, and
reviewsSampledtells you how many actually came back. chartCountriescosts one chart pull per country per chart type, so three countries and two chart types is six pulls. Trim it if you only care about one market.
FAQ
Do I need an App Store or Google Play API key?
No. Every member Actor reads public store endpoints with no key and no login.
Which identifier do I pass?
The App Store takes a numeric id (324684580) or an iOS bundle id; Google Play
takes the package name (com.spotify.music). Pass both forms of the same app to
get a profile per store in one run. Passing an Android package and expecting iOS
data back returns an empty iOS side, not an error.
Why is isCharting false when I know the app is popular?
Because it was not in the charts you asked for. Charts are per country, per chart
type and per category, and a very popular app can be absent from top-free while
sitting high in top-grossing. The default scans free and paid; add
top-grossing if that is the question.
On an Android row isCharting is null rather than false. The chart feeds
read here are Apple's, so a Play package is never going to appear in one, and
saying false would claim a check that never happened.
How do I spot a bad release?
Compare storeRating, which is lifetime, against reviews.sampleMeanRating,
which is the recent window. A gap between them is a change in sentiment. Then
read recentNegativeReviews, where each entry carries the appVersion it was
written against.
Can I track this over time?
Yes, and that is the intended use. Run it on an Apify Schedule; every run appends to the dataset with its own timestamp, so a few weeks of runs is a rating and chart history that neither store publishes.
Why is one part of my profile empty?
Check incompleteParts. It names the step that fell short and why, whether that
was a timeout, a member Actor error, or an identifier that resolved on one store
and not the other.
Is it cheaper than running the four Actors myself?
No, and it does not claim to be. The member Actors charge the same either way. What you save is the ordering, the developer-name join, the chart scan, and reconciling four datasets whose fields do not line up.
