Tony Wang5 min readHow to Scrape Steam in 2026 (Reviews, Charts & Player Counts)
Scrape Steam in 2026: store details, reviews, player counts, and charts — DIY against three official/unofficial APIs, or one normalized structured API.
Why scrape Steam?
Steam data is the base layer for PC-gaming research and products:
- Market and competitor research — track review scores, pricing, and tags across a genre or a competitor's catalog.
- Live rankings and trend-spotting — monitor concurrent players and the most-played and top-sellers charts as they move.
- Review and sentiment analysis — read what players actually say, and how sentiment shifts after a patch or a sale.
- Ownership and market-size estimates — SteamSpy's sampled owner counts are the closest thing to a public "how many people own this" number.
Is it legal to scrape Steam?
Option 1: DIY against three separate data sources
Steam doesn't have one unified API — you end up integrating three:
import requests
# 1. Store details — undocumented but stable, keyed by appid
app = requests.get("https://store.steampowered.com/api/appdetails", params={"appids": 570}).json()
# 2. Community reviews — a different host, different response shape, cursor pagination
reviews = requests.get("https://store.steampowered.com/appreviews/570", params={
"json": 1, "filter": "recent", "language": "english", "cursor": "*",
}).json()
# 3. SteamSpy — a third host entirely, for owner estimates
spy = requests.get("https://steamspy.com/api.php", params={"request": "appdetails", "appid": 570}).json()
Three clients for one dataset is the real cost, not any anti-bot defense:
- No single schema.
appdetailsreturns pricing/genres/platforms nested under asuccess/datawrapper;appreviewsreturns a flat list with acursoryou must round-trip for the next page; SteamSpy returns yet another shape with fields likeownersas a text range ("1,000,000 .. 2,000,000"), not a number. Normalizing all three into one record is most of the work. - SteamSpy is a sampled, unofficial estimate. It infers ownership from a public sample of Steam profiles, so counts for niche or newly-released titles can be stale, gapped, or missing entirely — build for
null, not a guaranteed number. - Reviews paginate by opaque cursor, not page number. You must persist the
cursorstring between calls; there's no "give me page 5" shortcut, so resuming a partial pull means storing your last cursor. - Live player counts and charts are separate endpoints again (
ISteamUserStats/GetNumberOfCurrentPlayersfor one app; the public charts pages for rankings), each with their own quirks and none of them documented as a stable public contract.
Option 2: No-code tools
Generic scrapers can pull individual Store or review pages, but Steam's data is inherently multi-source — a no-code tool built for one page shape doesn't help you join store details, reviews, live players, and SteamSpy estimates into one record, which is most of the actual work.
Option 3: A structured Steam API
A Steam scraping API normalizes all three sources — plus the official charts — behind one key, so app details, reviews, and rankings share one client and one response shape.
Search the store by title:
curl "https://api.crawlora.net/api/v1/steam/search?term=hollow%20knight" \
-H "x-api-key: $CRAWLORA_API_KEY"
Get one app's store details and reviews in Python:
import requests
h = {"x-api-key": "YOUR_API_KEY"}
base = "https://api.crawlora.net/api/v1/steam"
app = requests.get(f"{base}/app", headers=h, params={"appid": 570}).json()["data"]
reviews = requests.get(f"{base}/reviews", headers=h, params={
"appid": 570, "filter": "recent", "language": "english", "num_per_page": 50,
}).json()["data"]
players = requests.get(f"{base}/players", headers=h, params={"appid": 570}).json()["data"]
Pull the live charts for movers and rankings:
concurrent = requests.get(f"{base}/charts/concurrent", headers=h).json()["data"]
most_played = requests.get(f"{base}/charts/most-played", headers=h).json()["data"]
reviews accepts filter (recent/updated/all), review_type, purchase_type, and cursor for pagination — the endpoint absorbs the cursor round-trip so you page it like any other list. charts/concurrent and charts/most-played both accept an optional enrich flag to attach store metadata (name, price, genres) to each ranked row instead of a bare appid, so you don't need a second app call per row.
What you can collect
Store details (name, price, genres, platforms, release date, review summary), individual reviews (author, playtime, recommended/not, text, timestamp), current concurrent-player counts, live charts (concurrent, most-played, top-sellers by revenue), news posts, and community tags — one enriched record per app, review, or chart row, addressed by appid.
Limitations and common challenges
- No single official schema. The Store API, reviews, and SteamSpy each have their own response shape and none is formally versioned documentation — expect to normalize, not just parse.
- SteamSpy estimates, doesn't measure. Treat owner counts as directional market-size signals, not exact sales figures, especially for niche or very recent titles.
- Reviews paginate by cursor. Persist the cursor to resume a partial pull; there's no page-number shortcut.
- Charts move fast. Concurrent-player and most-played rankings change continuously — snapshot on a schedule if you need a time series, not a single pull.
Where this gets used
- App intelligence — track the app market, including PC gaming, across ratings, pricing, and rankings. See the app intelligence product page.
- Competitor and market research — benchmark review scores and player counts against comparable titles. See competitor tracking.
- The Steam Games dataset and Steam Charts dataset — the same data pre-collected and queryable without running a crawl.
Sources
Start collecting
Try it first, free: run any public URL through the Free Web Scraper, or check whether a site blocks bots with the Anti-Bot Checker — no signup.
Test the app and review endpoints in the Playground, check the schema in the API docs, and review pricing. Steam is one storefront in a market that spans three: how to scrape Google Play covers the Android catalog, listings, and ratings, and how to scrape App Store reviews covers the iOS review stream — the same title often ships on all three, and the scores rarely agree. On the console side of the same games catalog, how to scrape PlayStation Store covers pricing, editions, and deals for those same titles. For the broader toolkit, how to choose a web scraping API, and is web scraping legal.
Part of our how-to-scrape guide series — every platform we cover, in one index.
Frequently asked questions
Is it legal to scrape Steam?
The Store API and reviews are public, unauthenticated endpoints — no login to bypass, and Valve doesn't require an API key for them. Facts like price and review score aren't copyrightable; store descriptions and screenshots can be, so don't republish those verbatim. Respect rate limits.
Does Steam have one official API?
No. Data is spread across the Store API (app details), the community Reviews API, and the third-party SteamSpy (unofficial owner estimates) — each with a different response shape and its own host, plus separate endpoints for live player counts and charts.
How accurate are SteamSpy's owner counts?
They're estimates inferred from a sampled public API, not exact sales figures. Counts can lag or be missing for niche or newly-released titles — treat them as directional.
How do Steam reviews paginate?
By an opaque cursor string, not a page number. You persist the cursor between calls to get the next page, and to resume a partial pull.
What can I get from Steam without running a browser?
Store details, reviews, current player counts, and the official charts are all plain HTTP JSON endpoints — no headless browser or JavaScript rendering needed for any of them.