DEV Community

Cover image for How to scrape VS Code Marketplace extension stats in Python — installs, trending, reviews (no API key)
Freshactors
Freshactors

Posted on

How to scrape VS Code Marketplace extension stats in Python — installs, trending, reviews (no API key)

The VS Code Marketplace is the de-facto market map of developer tools — 80,000+ extensions with install counts, ratings, and trending scores. But there's no official stats dashboard and no documented bulk API. Here's the part most people miss: the Marketplace website itself runs on a public gallery JSON service that answers plain HTTP — no API key, no login, no headless browser. In this tutorial we'll pull extension stats, search a category sorted by installs, and fetch reviews — as clean structured JSON, in a few lines of Python.

The endpoint

The Marketplace's own search and listing pages call:

POST https://marketplace.visualstudio.com/_apis/public/gallery/extensionquery
Content-Type: application/json
Accept: application/json;api-version=3.0-preview.1
Enter fullscreen mode Exit fullscreen mode

with a JSON body of filter criteria (search text, exact extension name, or category) plus a flags bitmask that controls what comes back (statistics, versions, categories). The response carries installs, averagerating, ratingcount, and even trendingdaily/weekly/monthly velocity scores per extension. A separate public endpoint serves the newest reviews:

GET https://marketplace.visualstudio.com/_apis/public/gallery/publishers/{publisher}/extensions/{name}/reviews?count=50
Enter fullscreen mode Exit fullscreen mode

So why not just requests.post() it yourself? You can — but then you own the contract: the right flag bits, the statistics-array parsing, the sort codes, the 100-per-page pagination, and fixing it the day Microsoft shifts the payload and your pipeline goes quietly empty. A cleaner path: call an actor that returns one stable schema and is canary-monitored daily. Here's how with the VS Code Marketplace Scraper.

Step 1 — Install the Apify client

pip install apify-client
export APIFY_TOKEN="apify_api_xxx"
Enter fullscreen mode Exit fullscreen mode

(Token: Apify Console → Settings → Integrations.)

Step 2 — Get full stats for specific extensions

import os
from apify_client import ApifyClient

client = ApifyClient(os.environ["APIFY_TOKEN"])

run = client.actor("freshactors/vscode-marketplace-scraper").call(run_input={
    "mode": "details",
    "extensionIds": ["ms-python.python", "esbenp.prettier-vscode", "github.copilot"],
})

for item in client.dataset(run["defaultDatasetId"]).iterate_items():
    print(item["extensionId"], item["installs"], item["averageRating"], item["trendingMonthly"])
Enter fullscreen mode Exit fullscreen mode

A real record looks like this:

{
  "extensionId": "ms-python.python",
  "name": "Python",
  "publisher": "ms-python",
  "publisherDisplayName": "Microsoft",
  "publisherVerified": true,
  "installs": 222361795,
  "averageRating": 4.2,
  "ratingCount": 630,
  "trendingDaily": 0.00215,
  "trendingWeekly": 0.41544,
  "trendingMonthly": 2.05958,
  "version": "2026.5.2026061001",
  "lastUpdated": "2026-06-10T11:13:22.933Z",
  "categories": ["Programming Languages", "Debuggers", "Data Science", "Machine Learning"],
  "repositoryUrl": "https://github.com/Microsoft/vscode-python",
  "marketplaceUrl": "https://marketplace.visualstudio.com/items?itemName=ms-python.python"
}
Enter fullscreen mode Exit fullscreen mode

Step 3 — Map a category by install count

run = client.actor("freshactors/vscode-marketplace-scraper").call(run_input={
    "mode": "search",
    "category": "Data Science",
    "sortBy": "installs",
    "maxSearchResults": 50,
})
Enter fullscreen mode Exit fullscreen mode

Fifty rows, biggest extensions first — instant competitive map of a niche. searchTerms works the same way for keywords (combine both to filter a category).

Step 4 — Reviews

run = client.actor("freshactors/vscode-marketplace-scraper").call(run_input={
    "mode": "reviews",
    "extensionIds": ["ms-python.python"],
    "maxReviewsPerExtension": 100,
})
Enter fullscreen mode Exit fullscreen mode

Each review carries the rating, text, reviewer display name, extension version, and date. (The public endpoint serves the 100 most recent per extension — that's the endpoint's hard window, so the actor caps honestly.)

Pricing & reliability

Pay-per-result: extension details $0.0025, search rows $0.001, reviews $0.0001 — no subscription, no per-run fee. The actor is monitored by a daily canary (installs numeric, sorts working, reviews parsing) and patched fast when the gallery shifts — the listing shows a "last verified working" date that's actually real.

Three more app-store scrapers share the same shape if you need cross-store data: Apple App Store, Google Play, and Microsoft Store.

Questions or a field you're missing? Open an issue on the actor page — issues are answered fast.

Top comments (0)