Busabase
Busabase is an open-source (MIT) database and workspace for AI agents — data, docs, skills, and apps in one place. Run it locally, self-host it inside your network, or use Busabase Cloud, and turn age
Scrape public app reviews from the Apple App Store and Google Play in one run: rating, text, author, version, date, developer reply. Pay per review.
DataTypeScript · DockerfileGitHub @josh99smithOnlineOwner unconfirmed
Have you tried it? One tap is enough. No sign-in needed.
No updates detected yet. GitHub releases will appear here.
Owners of public repositories under a personal GitHub account can sign in to verify ownership and manage the introduction themselves. No administrator approval is needed.
Sign in, generate a verification file, and commit it to this repository’s default branch within 30 minutes. Files on other branches or forks do not count. Then check the file below to manage the project without administrator approval. Keep the file to retain your access.
If needed, you will go to sign-in. After signing in, return here and press your chosen verification button again.
Run /nomorevibe verify in your project folder to verify ownership and manage the introduction yourself.
Verify in one minuteAsk about other verification options
Scrape App Store and Google Play reviews in a single run: rating, text, author, app version, date and developer reply, for any country and sort order. One clean dataset at a flat price per review. Runs on Apify Store: https://apify.com/josh99smith/app-reviews-scraper
Taken from the repository README
Loading the full README. The saved excerpt is shown below.
An App Store and Google Play reviews scraper that collects public user reviews from both stores in a single run. Paste app links or ids from either store and get back every review as a clean JSON record: star rating, title, text, reviewer display name, app version, date, helpful votes and the developer's reply where one exists. Apps that cannot be found are reported free of charge; you pay a small flat price per review.
Built for product managers, app marketers, researchers and developers who need review data as an API rather than copied from store pages.Read the full README ↗An App Store and Google Play reviews scraper that collects public user reviews from both stores in a single run. Paste app links or ids from either store and get back every review as a clean JSON record: star rating, title, text, reviewer display name, app version, date, helpful votes and the developer's reply where one exists. Apps that cannot be found are reported free of charge; you pay a small flat price per review.
Built for product managers, app marketers, researchers and developers who need review data as an API rather than copied from store pages.
For Apple the Actor reads the public customer-reviews feed that the App Store publishes for every app and country, plus the public lookup API for the app name, developer, average rating and rating count. For Google Play it uses the public web endpoints behind the Play store page (via the MIT-licensed google-play-scraper library). No login, no browser, low request rates: a run for two apps with 200 reviews each finishes in a few seconds.
Limits you should know: Apple exposes at most 500 reviews per app per country (10 pages of 50) and does not filter by language; the Apple feed also has no developer replies. Google Play returns reviews in pages of 150 and can go much deeper.
{
"apps": ["https://apps.apple.com/us/app/spotify-music-and-podcasts/id324684580", "com.spotify.music"],
"country": "us",
"language": "en",
"sort": "newest",
"maxReviewsPerApp": 200,
"minRating": 1,
"maxRating": 5
}
Start a run and get the reviews back in one HTTP call:
curl -X POST "https://api.apify.com/v2/acts/josh99smith~app-reviews-scraper/run-sync-get-dataset-items?token=<YOUR_API_TOKEN>" \
-H "Content-Type: application/json" \
-d '{"apps": ["com.spotify.music"], "maxReviewsPerApp": 50}'
Python, with the apify-client package:
from apify_client import ApifyClient
client = ApifyClient("<YOUR_API_TOKEN>")
run = client.actor("josh99smith/app-reviews-scraper").call(
run_input={"apps": ["com.spotify.music", "324684580"], "maxReviewsPerApp": 50, "minRating": 1, "maxRating": 2}
)
for review in client.dataset(run["defaultDatasetId"]).iterate_items():
print(review["rating"], review["text"])
JavaScript or TypeScript, with the apify-client package:
import { ApifyClient } from "apify-client";
const client = new ApifyClient({ token: "<YOUR_API_TOKEN>" });
const run = await client.actor("josh99smith/app-reviews-scraper").call({
apps: ["com.spotify.music", "324684580"],
maxReviewsPerApp: 50,
});
const { items } = await client.dataset(run.defaultDatasetId).listItems();
console.log(items);
The Actor is exposed as a tool by the Apify MCP server, so an AI agent can call it by name. Add this to your MCP client configuration (Claude Desktop, Claude Code, Cursor, VS Code, Windsurf and others):
{
"mcpServers": {
"apify": {
"url": "https://mcp.apify.com?tools=josh99smith/app-reviews-scraper",
"headers": { "Authorization": "Bearer <YOUR_API_TOKEN>" }
}
}
}
Then ask, for example: "Pull the 100 newest 1-2 star Google Play reviews of com.spotify.music with josh99smith/app-reviews-scraper and summarise the complaints." The agent fills in the input, runs the Actor and reads the dataset back; you pay the same per-result price as in the Console.
The Actor can also be scheduled, or connected to Zapier, Make, n8n and Google Sheets in the Integrations tab.
One record per review, identical shape for both stores:
{
"store": "google",
"appId": "com.spotify.music",
"appName": "Spotify: Music and Podcasts",
"developer": "Spotify AB",
"reviewId": "4cac1797-5266-4c68-b3f6-f86f63b2c5f5",
"title": null,
"text": "too much ad",
"rating": 2,
"authorName": "HIMANSHU RANJAN BEHERA",
"version": "9.1.30.1993",
"date": "2026-09-17T19:23:03.181Z",
"helpfulVotes": 0,
"developerReply": {
"text": "Hi! We welcome your feedback and we'll pass it along to the ads team. ...",
"date": "2026-09-17T19:45:13.542Z"
},
"country": "us",
"language": "en",
"url": "https://play.google.com/store/apps/details?id=com.spotify.music&reviewId=4cac1797-5266-4c68-b3f6-f86f63b2c5f5",
"fetchedAt": "2026-09-18T19:46:00.886Z"
}
{
"store": "apple",
"appId": "324684580",
"appName": "Spotify: Music and Podcasts",
"developer": "Spotify",
"reviewId": "14560977347",
"title": "Excelente servicio",
"text": "Todo es mejor sin comerciales",
"rating": 5,
"authorName": "MoruXx",
"version": "9.1.82",
"date": "2026-09-17T16:18:01.000Z",
"helpfulVotes": 0,
"developerReply": null,
"country": "us",
"language": null,
"url": "https://apps.apple.com/us/app/id324684580?see-all=reviews",
"fetchedAt": "2026-09-18T19:46:00.626Z"
}
Apps that could not be processed are recorded too, so nothing silently disappears from your list:
{
"success": false,
"input": "com.this.package.does.not.exist",
"store": "google",
"appId": "com.this.package.does.not.exist",
"errorType": "not-found",
"error": "App not found (404)",
"fetchedAt": "..."
}
The SUMMARY record in the key-value store lists, for every app, the name, developer, average rating, total rating count and how many reviews were fetched and stored.
| Field | Description |
|---|---|
store | apple or google. |
appId / appName / developer | Apple track id or Android package name, plus the store listing name and developer. |
reviewId | Store-assigned review id, unique per store. |
title | Review headline (Apple only; always null on Google Play). |
text / rating | Review body and star rating 1-5. |
authorName | The public display name shown next to the review. |
version | App version the review was written for, when the store provides it. |
date | ISO 8601 timestamp of the review. |
helpfulVotes | Helpful votes (Apple voteSum, Google Play thumbs-up). |
developerReply | { text, date } when the developer answered (Google Play only), otherwise null. |
country / language | Store country of the review; language is the requested Play language and null for Apple. |
url | Direct review link on Google Play, or the app's reviews page on the App Store. |
errorType | Failures only: invalid-url, not-found, blocked, rate-limited, timeout, http-error, network or other. |
You pay a flat price per review stored (shown next to the Start button); 1,000 reviews cost well under a dollar. Invalid identifiers, apps that do not exist and store errors are never charged, and there is no start-up fee. The Actor stops as soon as the maximum cost you set for the run is reached, so a long app list never produces a surprise bill.
How it compares (September 2026). Per-review pricing here is $0.00015, in line with the cheapest single-store Actors, and unlike them this Actor covers both stores in one run with one fixed output schema. Apps that cannot be found are free, an error on one app never stops the run, and reviews filtered out by rating or date are never billed.
country set to gb, de, fr, jp and so on (or several runs on a schedule) and merge the datasets by reviewId.minRating 1 and maxRating 2 to collect negative reviews; the Actor keeps paging until it finds enough or the store runs out.Up to 500 per app and country from the App Store (the limit of Apple's public feed) and up to 10,000 per app from Google Play, controlled by Max reviews per app. Runs are also capped by the maximum cost you set.
Apple's feed serves up to 500 of the most recent (or most helpful) reviews per country, fewer for apps that do not have that many. Run per country for wider coverage.
language null for Apple reviews?The App Store feed does not accept a language parameter; it returns reviews in whatever language reviewers used in that country's store.
No. Only the public display name shown on the store page is stored, exactly as the store publishes it. Reviewer names are personal data in many jurisdictions; you are responsible for using the results in compliance with the privacy laws that apply to you (GDPR, CCPA and similar) and with the store terms.
The Actor only reads pages and feeds that Apple and Google publish to everyone without a login, at low request rates, and stores what the stores show publicly. Using the data lawfully and within the store terms is your responsibility.
No. Output fields are stable: existing fields are never renamed or removed without a major version bump announced in the changelog, and new fields are only ever added. You can build integrations on the schema without checking it after every run.
Best Damn App Reviews Scraper plugs into the tools you already use through Apify integrations, so results can flow on without anyone downloading a file. Ready-made connectors include:
You can also attach webhooks to trigger your own endpoint whenever a run succeeds, fails or times out. For example, post new one-star reviews to a Slack channel, or open a GitHub issue for every bug report users leave.
Found an app that is not parsed correctly or need an extra field? Open a ticket in the Issues tab of this Actor. The source code is MIT licensed. If this Actor saved you time, a review on its Store page helps other people find it.
The full source code is on GitHub: josh99smith/app-reviews-scraper. Stars and pull requests are welcome.