Read App Store and Google Play reviews with one API
The App Store Reviews API returns unified Apple App Store and Google Play data as clean JSON.
7 active endpoints, on 0 and 1 credit tiers.
- POST/app-store/v1/reviews
- POST/app-store/v1/search
- POST/app-store/v1/topCharts
- POST/app-store/v1/listCategories
- POST/app-store/v1/appDetails
- POST/app-store/v1/developerApps
- POST/app-store/v1/similarApps
What App Store endpoints does ReefAPI ship?
7 live read endpoints. Read-only data API: no writes, no account actions, no dashboard access on the target site.
App Store API
3 of 7 endpoints, ready to run
Reviews for an app — star rating, title, body, date, app version and the developer's reply where the store carries one. Pass a list of apps instead of one id and it reads both stores at once.
{ "ok": true, "meta": { "api": "app-store", "endpoint": "reviews", "mode": "live", "latency_ms": 2779.4, "record_count": 50, "cache_hit": false }, "data": { "kind": "reviews", "results": [ { "store": "apple", "app_id": "310633997", "query": "310633997", "profile": { "store": "apple", "app_id": "310633997", "bundle_id": "net.whatsapp.WhatsApp", "name": "WhatsApp Messenger", "subtitle": null, "developer": "WhatsApp Inc.", "developer_email": null, "developer_website": "http://www.whatsapp.com/", "avg_rating": 4.68485, "rating_count": 18479903, "review_count": null, "histogram": { "1": 629867, "2": 249322, "3": 559297, "4": 1437931, "5": 15603486, "total": 18479903 }, "current_version_score": 4.68485, "current_version_rating_count": 18479903, "installs": null, "price": 0, "currency": "USD", "free": true, "content_rating": "12+", "contains_ads": null, "description": "WhatsApp from Meta is a free messaging and calling app used by over 2 billion people across 180+ countries. It's super simple, reliable and private, making it perfect for staying in touch with your friends and family worldwide. WhatsApp works across mobile, tablet, and desktop even on slow connections, with no subscription fees*.\n\nPrivate messaging and calls across the world\n\nYour privacy is our priority. With end-to-end encryption, you can be sure that your personal messages and calls stay between you and who you send them to. And no one, not even WhatsApp, can read or listen to them.\n\nSimple and secure connections, right away\n\nAll you need is your phone number - no usernames or logins needed. Easily view your contacts on WhatsApp and start messaging. And what's more, you can easily link your other devices, including iPads, for seamless connectivity.\n\nHigh quality voice and video calls\n\nEnjoy free, secure video and voice calls with up to 32 people for free. Your calls work across devices, even on slower connections, using your phone or tablet’s Internet service.\n\nGroup chats to keep you in contact\n\nStay close to friends and family through end-to-end encrypted group chats and calls. Share messages, photos, videos and documents across mobile, tablet, and desktop. You can also use call links and screen-sharing to make group calls and collaboration easy.\n\nStay connected in real time\n\nYou can share your location with those in your individual or group chats while using WhatsApp on your mobile phone. Or record a voice message for those moments when just text isn't good enough.\n\nShare daily moments through Status\n\nShare your everyday life with those who matter. With Status you can share text, photos, video, and GIF updates that disappear after 24 hours. You're always in control of who sees your status. Just choose who you want to share it with - all your contacts or selected ones. And bring your everyday to life.\n\n*Data charges may apply. Contact your provider for details.\n\n\n---------------------------------------------------------------------------\n\nIf you have any feedback or questions, please go to WhatsApp > Settings > Help > Contact Us\n\nTerms of Service: https://www.whatsapp.com/legal/terms-of-service \n\nLearn more about messaging privately: https://www.whatsapp.com/privacy \n\nLearn more about WhatsApp safety: https://www.whatsapp.com/security", "release_notes": "We update the app regularly to fix bugs, optimize performance and improve the experience. Thanks for using WhatsApp!", "released": "2009-05-04T02:43:49Z", "updated": "2026-08-25T15:51:23Z", "version": "26.33.73", "size_bytes": 394596352, "min_os": "15.1", "languages": [ "AR", "BN", "CA" ], "screenshots": [ "https://is1-ssl.mzstatic.com/image/thumb/PurpleSource211/v4/d8/95/88/d89588dd-ce20-0f5b-95bc-f99814bf9a6c/6.9__Display_1-en_US.png/320x480bb.jpg", "https://is1-ssl.mzstatic.com/image/thumb/PurpleSource221/v4/60/0f/39/600f39e2-82c1-d2dd-eb76-d9c58d88e1f9/6.9__Display_2-en_US.png/320x480bb.jpg", "https://is1-ssl.mzstatic.com/image/thumb/PurpleSource221/v4/4e/64/6b/4e646b15-085c-ab69-957f-790f1e17475b/6.9__Display_3-en_US.png/320x480bb.jpg" ], "privacy_policy": null, "icon_url": "https://is1-ssl.mzstatic.com/image/thumb/Purple211/v4/60/12/b8/6012b8e5-12b6-e819-2a54-f2ad93d02145/AppIcon-0-0-1x_U007epad-0-0-0-1-0-0-sRGB-0-85-220.png/512x512bb.jpg", "url": "https://apps.apple.com/us/app/whatsapp-messenger/id310633997?uo=4", "categories": [ "Social Networking", "Utilities" ] }, "reviews": [ { "store": "apple", "review_id": "14474184827", "app_id": "310633997", "app_name": "WhatsApp Messenger", "country": "us", "rating": 1, "score_text": "1", "title": "PITA", "text": "This app is a PITA to use. Keeps asking for ALL my contacts. Screw u Zuckerberg. Not doing it!", "language": null, "review_date": "2026-08-26T13:02:15+00:00", "app_version": "26.33.73", "sub_ratings": null, "thumbs_up": null, "vote_sum": 0, "vote_count": 0, "reply_text": null, "reply_date": null, "review_url": "https://itunes.apple.com/us/review?id=310633997&type=Purple%20Software", "scraped_at": "2026-08-27T21:03:08.333238+00:00", "scraped_at_page": 1, "is_new": null }, { "store": "apple", "review_id": "14474001707", "app_id": "310633997", "app_name": "WhatsApp Messenger", "country": "us", "rating": 5, "score_text": "5", "title": "Add a loop feature!", "text": "I like the voice note function, but I wish it had a loop feature so I could replay the same one", "language": null, "review_date": "2026-08-26T12:05:34+00:00", "app_version": "26.33.73", "sub_ratings": null, "thumbs_up": null, "vote_sum": 0, "vote_count": 0, "reply_text": null, "reply_date": null, "review_url": "https://itunes.apple.com/us/review?id=310633997&type=Purple%20Software", "scraped_at": "2026-08-27T21:03:08.333238+00:00", "scraped_at_page": 1, "is_new": null }, { "store": "apple", "review_id": "14473979618", "app_id": "310633997", "app_name": "WhatsApp Messenger", "country": "us", "rating": 1, "score_text": "1", "title": "م", "text": "يوجد مشكلة في إشعارات البرنامج", "language": null, "review_date": "2026-08-26T11:58:31+00:00", "app_version": "26.33.73", "sub_ratings": null, "thumbs_up": null, "vote_sum": 0, "vote_count": 0, "reply_text": null, "reply_date": null, "review_url": "https://itunes.apple.com/us/review?id=310633997&type=Purple%20Software", "scraped_at": "2026-08-27T21:03:08.333238+00:00", "scraped_at_page": 1, "is_new": null } ], "scraped_count": 50, "new_count": null, "total_available": 18479903, "fetchable_ceiling": 500, "completeness_pct": 0, "countries": [ "us" ], "status": "PARTIAL", "attempts": 1, "next_cursor": { "latest_date": "2026-08-26T13:02:15+00:00", "latest_ids": [ "14474184827", "14474001707", "14473979618" ] }, "notes": null } ], "summary": { "units": 1, "succeeded": 1, "not_found": 0, "blocked": 0, "success_rate_pct": 100, "total_reviews": 50, "total_new": 0, "avg_completeness_pct": 0, "by_store": { "apple": 1, "google_play": 0 }, "error_breakdown": {}, "retries_used": 0 } } }
How the App Store API works
App Store is a normal ReefAPI surface — the same four rules that hold for every other engine on the key.
No OAuth app, no request signing, no per-site account. One key covers all 185 engines.
Every route is a POST with a JSON body. Parameters are validated against the published schema before anything is charged.
Credits, not seats. Failed and blocked calls are never charged, and cache hits cost nothing.
One envelope everywhere. meta carries latency_ms, record_count and the endpoint that answered.
Categories are free, so start there
listCategories costs nothing, which makes chart-walking the cheapest discovery path on this engine: browse a genre, take the ids, then pay only for the reviews you actually want.
{"stores": ["apple", "google_play"]}Zero credits. The genre ids differ between the two stores, so read both rather than assuming.
{"stores": ["apple"], "country": "us", "category": "health_and_fitness"}One credit for the ranked list, with each app's id already attached.
{"apps": [{"apple": "...", "google": "..."}], "stores": ["apple", "google_play"], "maxReviews": 500}Both stores at once. maxReviews is per store, so this asks for up to a thousand rows in total.
Reviews are metered per 50 rows across both stores together, so a thousand rows is 20 credits and the discovery that found the apps was 1.
curl -X POST https://api.reefapi.com/app-store/v1/reviews \
-H "x-api-key: $REEF_KEY" \
-H "content-type: application/json" \
-d '{"apps":[{"name":"WhatsApp","apple":"310633997"}],"stores":["apple"],"countries":["us"],"maxReviews":100}'{
"ok": true,
"data": { … },
"meta": {
"api": "app-store",
"endpoint": "reviews",
"mode": "live",
"latency_ms": …,
"record_count": …
},
"error": null
}Apple app id vs Google Play package, and what each store leaves null
This engine answers for the Apple App Store and Google Play behind one set of actions, so the same field name can be filled by one store and empty on the other. Every value below is a live read on 2026-08-27: appDetails for Spotify (Apple id 324684580) and WhatsApp (Play package com.whatsapp), plus topCharts for the US and DE storefronts.
| Field | Apple App Store | Google Play |
|---|---|---|
| app_id | Numeric string, e.g. 324684580 (Spotify). bundle_id is separate: com.spotify.client | The package name itself, e.g. com.whatsapp. app_id and bundle_id hold the same value |
| released / updated | ISO 8601 UTC: 2011-07-14T11:22:37Z and 2026-08-20T07:42:38Z | Human date strings: "Oct 18, 2010" and "Aug 21, 2026". Parse them, do not compare them |
| price / currency | 0.0 and "USD" on a free app; 6.99 USD in the US chart, 6.99 EUR in the German one | Both null even when free is true. Read the free boolean instead |
| installs | null, since Apple publishes no install count | A formatted string with separators: "10,000,000,000+" |
| version, size_bytes, min_os, languages | 9.1.76, 295870464, "16.1", 61 language codes | null, null, null and an empty array |
| rating_count vs review_count | 41,731,636 ratings, review_count null | 242,088,177 ratings against 1,953,376 written reviews |
| histogram | Keys "5" down to "1" plus a "total" key | Keys "1" to "5", no total key |
| topCharts category | Numeric genre id: 6014 Games, 6000 Business, 6017 Education. listCategories returns 26 | String constant: GAME, SOCIAL, ART_AND_DESIGN. listCategories returns 52 |
appDetails takes one appId, so a numeric Apple id sent with stores ["apple","google_play"] returns the Apple profile and a google_play result with status "EMPTY" rather than an error. Note also that meta.record_count counts apps[] rows only: it reads 0 on appDetails and listCategories even when a full profile or a 52-entry category list came back. Check data.results[].status, which was "COMPLETE" on both successful reads.
Where Apple stops, and which fields only one store fills
Measured on 2026-08-27 against one app present in both stores (18.5 million Apple ratings), by raising maxReviews until each store stopped.
Ask for 50 across two stores and 100 rows come back. Ask for 1,000 and you get 1,500: Apple 500, Play 1,000. Budget in rows, not in apps — the credit meter counts the combined rows.
In our favour: at maxReviews 1,000 the Apple result came back with exactly 500 rows and status CAPPED, while the Play result came back with 1,000 and status PARTIAL. You are told which of the two you hit without having to compare counts yourself.
Metered per 50 rows returned across both stores: a thousand rows is 20 credits, and the 1,500-row two-store pull above was 30. listCategories is free and every discovery call is 1.
Against us: Play reviews have no title — empty on all 1,000 Play rows, filled on all 500 Apple rows. The language field came back empty on all 1,500 rows of both stores, and no developer reply was populated in this run. Star rating, body, date, review id and app version were filled throughout.
Against us, and reproduced: passing both an Apple id and a Play package returned the Apple profile and an EMPTY Play result; passing the package alone returned Play and an empty Apple. Call it once per store. The reviews endpoint has no such problem.
What people build with App Store
The jobs this data is most often used for.
endpoints
credits per call
App teams call reviews to monitor new ratings and feedback for their app across both stores.
Competitor-intelligence tools use topCharts and similarApps to track rivals' rankings.
Product teams use appDetails and reviews to analyze feature requests and sentiment by version.
What App Store data costs
The cheapest call here is 0 credits, so $15/mo (Pro) buys 10,000 of them — $1.50 per 1,000 credits. Credits roll over and never expire, and failed or blocked calls are not charged.
Full pricing →- 1,000 free credits on signup, no card
- One key, all 185 APIs, one credit pool
- Failed and blocked calls are never charged
- Credits roll over and never expire
Call it in two lines
Sign up, get 1,000 credits and one key that works on every engine. Then this is the whole protocol.
curl -X POST https://api.reefapi.com/app-store/v1/reviews \
-H "x-api-key: $REEF_KEY" \
-H "content-type: application/json" \
-d '{"apps":[{"name":"WhatsApp","apple":"310633997"}],"stores":["apple"],"countries":["us"],"maxReviews":100}'import requests
r = requests.post(
"https://api.reefapi.com/app-store/v1/reviews",
headers={"x-api-key": REEF_KEY},
json={
"apps": [
{
"name": "WhatsApp",
"apple": "310633997"
}
],
"stores": [
"apple"
],
"countries": [
"us"
],
"maxReviews": 100
},
)
print(r.json()["data"])Have a question? We got answers.
The questions people actually ask before wiring up App Store.
Get a free key →Does this API cover Google Play as well as the Apple App Store?▾
Both. The stores parameter takes ["apple","google_play"] and accepts aliases like ios, app_store, play, android and google; unknown names are ignored rather than rejected, and omitting the parameter queries both. A live appDetails call on 2026-08-27 for Apple id 324684580 came back with apple:us status COMPLETE and google_play:us status EMPTY, because a numeric Apple id is not a Play package.
What does an app id look like for each store?▾
Apple uses a numeric id, 324684580 for Spotify, which is the digits after /id in an apps.apple.com URL. Google Play uses the Java-style package name, com.whatsapp, which is the id query parameter on a Play URL. appDetails, developerApps and similarApps all take a single appId parameter that accepts either form, with appleAppId and googlePlayPackage as aliases.
Does the country parameter change the price and the currency?▾
Yes, and it changes more than the money. topPaid for country us on 2026-08-27 returned Minecraft at 6.99 USD; the same chart for country de returned it at 6.99 EUR, with the name shortened to "Minecraft" and the category localized to "Spiele". The German chart's rank 1 was Blitzer.de PRO at 0.49 EUR, an app that does not appear in the US chart at all. Treat every country as a separate catalog.
Why are the ratings null in a topCharts or search result?▾
Chart and search rows come from Apple's ranked feeds, which carry rank, name, developer, price, currency, category, icon and URL, but not ratings. On a live topPaid read every row had avg_rating null, rating_count null and content_rating null. Call appDetails with the app_id from the chart row to get avg_rating, rating_count and the star histogram.
What is the difference between rating_count and review_count?▾
rating_count is everyone who tapped a star; review_count is the subset who also typed something. Measured on WhatsApp on Google Play: 242,088,177 ratings against 1,953,376 written reviews. Apple does not split the two, so on an Apple profile review_count is null and rating_count carries the whole number.
How deep does a chart go?▾
Apple's chart feed is capped at roughly 100 apps per request, and each result carries that limit back to you in results[].notes as "Apple RSS feed caps at ~100 apps per request". The count parameter has no documented upper bound but cannot get you past the feed's own ceiling, so treat 100 as the practical maximum per chart, category and country combination.
Which category values does topCharts accept?▾
Apple wants a numeric genre id and Google Play wants a string constant, and they are not interchangeable. listCategories returned 26 Apple genres on 2026-08-27, from 6000 Business through 6027 Graphics & Design, with 6014 Games and 6017 Education in between; the same call returned 52 Play categories such as SOCIAL, TOOLS, ART_AND_DESIGN and the 18 GAME_ sub-categories. Pass the id that matches the store you are querying.
Which fields does a free app leave empty?▾
On Google Play a free app returns free true but price null and currency null, so a null price does not mean the app is missing a price, it means Play never publishes one. Apple fills price 0.0 and currency "USD" for the same case. On Apple, installs and contains_ads are always null; on Play, version, size_bytes and min_os are null and languages is an empty array.
What is the App Store API?▾
App Store API is a ReefAPI endpoint group for app details, rankings, ratings and reviews. It returns live JSON through POST requests under /app-store/v1.
Is the App Store API free to try?▾
Yes. ReefAPI starts with 1,000 free credits, no card required. App Store calls use the same shared credit balance as every other ReefAPI engine.
Do I need an App Store login or account?▾
No login to App Store is needed for the API response. You call ReefAPI with your x-api-key header, and the playground can run live examples before you create a production key.
How fresh is the App Store data?▾
The page example is captured from a live reviews call, and production requests fetch live data through ReefAPI rather than a static sample.
How many credits does the App Store API use?▾
App Store actions currently cost 1 credit per successful call. Failed or blocked calls are free, and all APIs draw from one credit pool.
Can I call App Store from an AI assistant or MCP client?▾
Yes. Connect ReefAPI once through MCP and your assistant can call app-store actions with the same key, credit pool and JSON envelope used by normal REST requests.
14 Reputation & Reviews APIs on the same key
One key, one credit pool, one response envelope. If you are pulling App Store, you are one call away from the rest of the category — no second contract, no second integration.
Try it on your own data before you pay anything
The call above is the real endpoint, not a recording. A free key gives you 1,000 credits, the other 184 APIs, and the same envelope everywhere.
Endpoints, parameters and credit costs on this page are read from the live catalog and cannot drift from what the API accepts. Field notes were captured on 2026-08-27.