Steam Scraper - Game Details, Stats & Reviews
Pricing
$2.00 / 1,000 item returneds
Steam Scraper - Game Details, Stats & Reviews
Valve publishes a game's price, genres and review count, but never how many copies it sold. The owners figure here is SteamSpy's estimate. Search finds app IDs, app mode adds discount, developers, Metacritic and platforms, reviews mode pulls recent English player reviews. $2.00 per 1,000 rows.
Pricing
$2.00 / 1,000 item returneds
Rating
5.0
(1)
Developer
Dami's Studio
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
2 days ago
Last modified
Categories
Share
Steam Scraper
Valve publishes a game's price, its genres and its own review count, but never how many copies it has sold. The owners field in an app row is therefore SteamSpy's estimate, given as a range, sitting beside Steam's own numbers rather than pretending to be one of them.
Three modes over Steam's public JSON endpoints: find app IDs by name, pull full store details for those IDs, or pull recent player reviews. No API key, no login.
The usual sequence is search first to get IDs, then feed the IDs into app or reviews.
Mode 1 — search
{ "mode": "search", "query": "portal", "maxItems": 10 }
Returns only what Steam's app-search endpoint carries, which is three fields:
{ "ok": true, "appId": "620", "name": "Portal 2", "icon": "https://shared.fastly.steamstatic.com/..." }
That's it. No price, no genres. Search exists to get you IDs.
Mode 2 — app details
{ "mode": "app", "appIds": ["400", "620"] }
This is the fat row. Store details plus SteamSpy stats merged into one record:
{"ok": true,"appId": "620","name": "Portal 2","type": "game","isFree": false,"price": "$9.99","discountPct": 0,"developers": ["Valve"],"publishers": ["Valve"],"genres": ["Action", "Adventure"],"categories": ["Single-player", "Steam Achievements"],"releaseDate": "18 Apr, 2011","metacriticScore": 95,"recommendations": 353210,"owners": "20,000,000 .. 50,000,000","positiveReviews": 341022,"negativeReviews": 8114,"shortDescription": "The 'Perpetual Testing Initiative' has been expanded...","headerImage": "https://shared.fastly.steamstatic.com/store_item_assets/steam/apps/620/header.jpg","platforms": ["windows", "mac", "linux"],"url": "https://store.steampowered.com/app/620"}
Mode 3 — reviews
{ "mode": "reviews", "appIds": ["620"], "maxItems": 300 }
{"ok": true,"appId": "620","reviewId": "168442901","review": "Still the best puzzle game ever made.","votedUp": true,"votesUp": 14,"playtimeForeverMin": 1842,"gamesOwned": 312,"createdAt": "2026-08-14T09:22:41.000Z","url": "https://store.steampowered.com/app/620"}
playtimeForeverMin is the reviewer's total minutes in that game, which is the quickest way to separate a considered review from a twenty-minute refund rant.
Input
| Field | Default | Notes |
|---|---|---|
mode | search | search, app or reviews. |
query | empty | Search mode only. |
appIds | empty | Numeric app IDs for app and reviews. Ignored in search. |
maxItems | 50 | 1 to 1,000. Counts output rows, whatever the mode. |
proxyConfiguration | off | These endpoints are public and have no anti-bot. Off saves you proxy credits. |
The Console form arrives with portal in query and 400, 620 in appIds so it runs on first click. An API call sends neither unless you put them in the payload.
Limits
- Prices are the US storefront, in dollars. The store endpoint is called with
cc=us&l=en. A different region's price is not something this returns. - Reviews are recent English ones. The filter is
recentand the language isenglish, 100 per page. It is not the full review history and it is not every language. ownersis a range, not a number. SteamSpy estimates it, and it comes back as a string like"20,000,000 .. 50,000,000".positiveReviewsandnegativeReviewscome from the same place. If SteamSpy doesn't answer for an app, all three arenulland the rest of the row is still fine.- An app ID that's unknown or region-locked returns
success: falsefrom Steam. You get aNOT_FOUNDdiagnostic row for that ID and the run carries on with the others. Not billed. - In
reviewsmodemaxItemsis the total across every ID you passed, not per game.
Billing
$2.00 per 1,000 rows, so $0.002 each, with no run-start fee. Same price whether the row is a search hit, an app record or a review. Only successful rows count. Diagnostics are free.
One thing to watch: a search row costs the same as a full app record, and it carries three fields where the app record carries twenty-odd. Search narrow, then spend on app.
Delivery
Dataset export as JSON, CSV, Excel or XML. Optional Notion delivery through notionConnector and notionParentId. Authorize the connector once under Settings → API & Integrations → MCP connectors. Leave them empty and it's skipped.
What it's good for
Price tracking is the obvious one. Keep a list of app IDs, run app mode on a schedule, and watch price and discountPct. The store endpoint returns the discounted price, so a sale shows up as a change in both fields on the next run.
For market sizing, owners and metacriticScore across a list of competitor app IDs gives you a rough shape of a genre. Rough is the operative word, since owners is a range estimate and not a number.
Reviews mode is for reading complaints. Sort your export by playtimeForeverMin and the top of the list is people who actually played the thing.