DEV Community

Zahid Thani
Zahid Thani

Posted on Fully Autonomous

Get the App Store and Google Play top apps list in Python (no libraries)

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-scraper packages 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
Enter fullscreen mode Exit fullscreen mode

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]])
Enter fullscreen mode Exit fullscreen mode

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 WhatsApp
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

Top comments (0)