Disclosure: I built the app store scraper used in this post and earn money when people run it. Free options are below.
Sometimes you just want the list: what's in the top 10 free apps right now, and is it the same on iPhone and Android? The store apps show you one chart at a time on one device, and you can't sort or save them. This post gets both charts into one CSV.
Free options first
- Just looking? The Top Charts pages in the App Store and Google Play apps are free. If you only need a glance, stop here.
- Apple only: Apple publishes free RSS feeds of its top charts at rss.marketingtools.apple.com. No key needed.
- Android: the
google-play-scraperpackages for Python and Node are free. They're unofficial, so they can break when Google changes its pages.
I use the method below when I want both stores in one table, with the same columns, on a schedule.
Setup
You need Python 3 and a free Apify account (no credit card; it includes $5 of usage a month). There's nothing to install. Copy your token from Apify Console > Settings > API & Integrations:
export APIFY_TOKEN=your_token_here The code
import csv import json import os import urllib.request URL = ("https://api.apify.com/v2/acts/zahidthani~app-store-google-play-scraper" "/run-sync-get-dataset-items") run_input = { "charts": ["top-free"], # or top-paid, top-grossing "countries": ["us"], "maxResults": 10, # per store and country } request = urllib.request.Request( URL, data=json.dumps(run_input).encode(), headers={ "Authorization": "Bearer " + os.environ["APIFY_TOKEN"], "Content-Type": "application/json", }, ) with urllib.request.urlopen(request, timeout=120) as response: apps = json.load(response) columns = ["store", "rank", "name", "developer", "rating", "price", "genre", "url"] with open("top_apps.csv", "w", newline="", encoding="utf-8-sig") as f: writer = csv.DictWriter(f, fieldnames=columns, extrasaction="ignore") writer.writeheader() writer.writerows(apps) print(f"Saved {len(apps)} apps to top_apps.csv") for store in ("apple", "google"): rows = [a for a in apps if a["store"] == store] print(store, [a["name"] for a in rows[:3]]) The utf-8-sig encoding is there so Excel shows app names with accents and symbols correctly when you open the file.
Real output
This is the top free chart in the US from a real run on 1 November 2026:
| Rank | App Store | Google Play |
|---|---|---|
| 1 | New York Road Runners | Muse from Meta |
| 2 | TikTok Pro - Events | ChatGPT |
| 3 | Muse from Meta | TikTok Pro - Events |
| 4 | Vinted: Pre-loved marketplace | TikTok - Videos, Shop & LIVE |
| 5 | ChatGPT | |
| 6 | Capital One Mobile | FreeReels - Dramas & Reels |
| 7 | Netflix Game Controller | PineDrama - Short Dramas |
| 8 | Uber - Rides, Eats, Hotels | Settings Home |
| 9 | PineDrama - Short Dramas | DealSeek: Coupons & Discounts |
| 10 | Kalshi: Trade Sports & Events | Vinted: Shop & sell pre-loved |
Google Play rows also include a rating. App Store chart rows came back without one, so add "includeDetails": true if you need Apple ratings (it's charged at the higher details price).
What stood out: ChatGPT, Muse from Meta, TikTok Pro - Events and PineDrama are on both lists (Vinted too, under slightly different names), but about half of each top 10 isn't on the other. If you only watch one store, you miss a lot of what's moving. Charts also change daily, so your list will look different.
Adapting it
- Another country or several:
"countries": ["us", "gb", "de"] - Top grossing games:
"charts": ["top-grossing"], "category": "games" - Only one store:
"stores": ["google"] - Up to 200 per chart:
"maxResults": 200(Google Play goes up to 200, the App Store up to 100) - Track changes: run it daily with cron and add the date to the filename.
What it costs
$0.50 per 1,000 chart rows, plus $0.005 per run. This example (20 rows) costs about $0.015.
Limitations
- Charts are a snapshot of what the stores show at that moment, and the two stores don't count things the same way, so a rank isn't an install count.
- It reads public chart data only. There are no download numbers for the App Store.
- The script waits for the result. Big multi-country jobs are better started with the Apify Python client and picked up afterwards.
Try it
- App Store & Google Play Scraper on the Apify Store: https://apify.com/zahidthani/app-store-google-play-scraper
- Runnable Python, Node.js and n8n examples: https://github.com/zahidthani/apify-data-tools-examples
- Need reviews instead of charts? See my post on exporting app reviews to Excel: https://dev.to/zahidthani/export-app-store-and-google-play-reviews-to-excel-and-find-the-top-complaints-27m3
- Rather have it set up for you? Details on my website.


