Steam Game Reviews
Pricing
from $0.50 / 1,000 results
Steam Game Reviews
Extract Steam game data: titles, prices, ratings, release dates and platforms. Search top sellers, new releases, coming soon and discounted games.
Pricing
from $0.50 / 1,000 results
Rating
0.0
(0)
Developer
Muhammad Naufal
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
0
Monthly active users
a day ago
Last modified
Categories
Share
Steam Game Reviews Scraper
Extract Steam game data: titles, prices, ratings, review counts, release dates, platforms, genres, developer, publisher, discount %, playtime stats, and app ID. Search by category with pagination support.
Sample output
{"title": "Counter-Strike 2","url": "https://store.steampowered.com/app/730/","appId": "730","originalPrice": null,"finalPrice": 0.0,"rating": "Very Positive","ratingPct": 86,"reviewCount": 2583663,"achievementsCount": 215,"website": "http://www.counter-strike.net/","isFree": true,"discountPercent": null,"metacriticScore": null,"releaseDate": "2012-08-21","hasWindows": true,"hasMac": true,"hasLinux": true,"image": "https://shared.akamai.steamstatic.com/...","headerImage": "https://shared.akamai.steamstatic.com/.../capsule_616x353.jpg","description": "Counter-Strike 2 is the largest technical leap...","shortDescription": "For over two decades, Counter-Strike has offered...","supportedLanguages": ["English", "French", "German"],"gameDetailsUrl": "https://store.steampowered.com/app/730/?l=english","genres": ["Action", "Free To Play"],"categories": ["Multi-player", "Steam Achievements"],"tags": ["Action", "FPS"],"tagIds": [113, 3859, 1663],"developer": "Valve","publisher": "Valve","playtimeForever": 1041.3,"playtimeMedian": 618.4,"playtimeTwoWeeks": 15.1,"totalPositive": 2226774,"totalNegative": 355609,"reviewScore": 8,"recentReviewCount": 100,"recentRatingPct": 84,"playtimeSampleSize": 100,"playtimeAtReviewMedian": 156.4,"priceCurrency": "HKD","contentDescriptorsNotes": "Includes intense violence and blood.","contentDescriptorsIds": [5, 6],"background": "https://store.akamai.steamstatic.com/...","type": "game","comingSoon": false,"screenshotsCount": 19,"screenshots": ["https://shared.akamai.steamstatic.com/store_item_assets/steam/apps/730/ss_...", "..."],"drmNotice": null,"legalNotice": null,"moviesCount": 4,"dlcCount": 1,"recommendations": 5206504,"requiredAge": 0,"ageRatings": {"esrb": "m", "pegi": "18"},"controllerSupport": "full","supportUrl": "","supportEmail": "","minimumRequirements": "Minimum: OS: Windows 10...","recommendedRequirements": "Recommended: OS: Windows 10...","pageIndex": 0,"totalResults": 9049,"searchUrl": "https://store.steampowered.com/search/?filter=globaltopsellers&page=1"}
Input
| Field | Type | Default | Description |
|---|---|---|---|
category | string | topsellers | topsellers, newreleases, comingsoon, specials, under10, topwishlisted |
maxResults | integer | 25 | Max games (1-100) |
fetchDetails | boolean | true | Enrich via Steam appdetails + appreviews APIs (genres, developer, publisher, description, languages, prices, authoritative review totals, playtime) |
language | string | english | Steam language/locale (e.g. english, german, french, spanish, japanese, russian, schinese, tchinese, koreana) |
Notes on data sources (Steam DOM changes, 2026)
Steam removed the data-ds-review-*, data-ds-playtime-*, data-ds-description and data-ds-languages attributes from search result rows. Current behavior:
- Reviews (always): summary / % / count are parsed from the
.search_review_summarytooltip on the search page. The summary is matched against a positive whitelist of rating descriptors (EN, German, French, and since Round 7 Indonesian + Dutch); "no user reviews" and similar no-review variants leave it empty. The rating band is resolved from any tooltip segment, so note-first tooltips ("This product has experienced off-topic review activity…
Very Positive
…") still parse. The count is parsed via a cascade (long form "of the N user reviews", compact "N user reviews", "user reviews: N", German "von den N Nutzerbewertungen", French "des N avis", bare "of N") with thousands separators normalized (./ spaces stripped, then,). Percentage parsing supports bothNN%and Turkish-style%NNplacements; no-review variants in 20+ locales are rejected from the rating field. - Pagination: both search layouts are supported — the classic
.search_result_rowrows and the newer card layout (.search_results a.result_titleanchors). Total-result parsing falls back to a "Showing 1-25 of N Results" pattern, and the page count is clamped to the parsed total so the actor never requests pages beyond what Steam has. Totals are parsed in 20+ locales (ENof, DEvon, FRsur, ES/PTde, ITdi, NLvan, PL/CSz, DAaf, NO/SVav, RU/UKиз, SR/HRod, TRsonuçtan, CJK件中/개 중/共 N 条). Note: Steam currently renders ~50 rows per request even withcount=25(25 shown + 25 prefetched); extraction takes the firstmaxrows so page boundaries stay correct, and an all-seen guard stops pagination if a page ever repeats previously scraped apps. - Review totals (fetchDetails=true): authoritative
reviewCount,totalPositive,totalNegative,rating,ratingPctandreviewScore(0-10) come from thestore.appreviewsAPI when the search-page tooltip lacks them. Search-page values take precedence when present. Ifquery_summaryis missing,reviewCountfalls back tototal_positive + total_negative.recentReviewCount/recentRatingPctare derived from the secondfilter=recentpayload'sreviews[]sample (see Round 4 below — since mid-2026query_summaryis all-time regardless offilter/day_range, so the 30-day band is computed from the sample instead).ratingPctis kept even when a game has 0 positive reviews. - Playtime (fetchDetails=true): Steam no longer exposes aggregate playtime publicly.
playtimeMedian/playtimeTwoWeeksare the median of a 100-review sample'sauthor.playtime_forever/author.playtime_last_two_weeks;playtimeForeveris the 10%-trimmed mean of the same sample (playtimeSampleSizereports the actual sample size). All three are estimates from reviewers (who skew toward heavier playtime), in hours,nullwhen unavailable. If theallfilter returns no playtime sample, therecentsample fills the gap. - Description / languages / prices / metacritic (fetchDetails=true): backfilled from the
appdetailsAPI (detailed_description,short_description,supported_languages,price_overview,metacritic). All fields are null-safe — Steam returns keys liketags/metacritic/genresas explicit nulls on some titles, and a single null no longer aborts the whole enrichment. - Extra metadata (fetchDetails=true):
type(game/demo/dlc),comingSoon,screenshotsCount,moviesCount,dlcCount,recommendations,requiredAge,controllerSupport,supportUrl,supportEmail,minimumRequirements,recommendedRequirementsfrom theappdetailsAPI. - Round 3 (2026-08-06): new
topwishlistedcategory (Steamfilter=popularwishlist) — most rows are pre-release titles, so reviews/prices are usually empty there; enrichment still fills app details (comingSoon, developer, type, release date). Playtime sample doubled from 50 to 100 reviewers per call andplaytimeSampleSizeis emitted so consumers can weigh estimate confidence. New fields:priceCurrency(storefront currency code — prices are region-relative, e.g.HKDfrom a Hong Kong IP),metacriticUrl,background(store page background art),contentDescriptorsNotes/contentDescriptorsIds(ESRB-style content descriptors, e.g. "Includes intense violence and blood."),fullgameAppId/fullgameName(parent game for DLC rows), andheaderImagenow prefers the authoritativeappdetails.header_imageURL over the search-page URL guess. Pagination backfills up to 2 extra pages (capped by the catalog size Steam reports) somaxResultsunique games are always reached even when a page repeats already-seen apps. - Round 5 (2026-08-08): new
screenshotsfield (full list of store screenshot thumbnail URLs),drmNotice(third-party DRM, e.g. "Denuvo") andlegalNotice(legal notice text) — both notices arenullwhen the game has none. - Round 6 (2026-08-08): fixed two appdetails data-loss bugs —
required_agearrives as a STRING on most titles ("18", "16") and the old int-only guard silently dropped it (requiredAgewas always null);achievementsCountnow reads the authoritativeachievements.total(the legacyachievements[]list is no longer returned by the API, so the oldlen()gave null on every game). - Round 7 (2026-08-09): Indonesian review bands added (
Sangat Positif,Mayoritas Positif,Bercampur/Lumayan Positif,Mayoritas Negatif,Sangat Negatif,Luar Biasa Positif,Luar Biasa Negatif— Steam shipsl=indonesiannatively since 2021 and mixes native + untranslated EN bands, so both are whitelisted) plus the missing Dutch "overweldigend positief" / "verdeeld" bands; the no-review regex now rejects "belum ada ulasan" / "belum ada penilaian". Pagination parsing extended to Indonesiandari, Ukrainianіз, Bulgarianот, Vietnamesetrên, HungarianN közüland the Finnish/Thai/ Nslash form — those locales previously stalled after page 1 (total parsed as 0). New appreviews fieldpositivePct: the exact 1-decimal positive fraction (e.g. 86.2) kept alongside the rounded integerratingPctfor consumers ranking near a band boundary. - Round 4 (2026-08-07): Steam changed the appreviews API in mid-2026 —
query_summaryis now all-time regardless offilter/day_range/start_date, so the oldfilter=recentsummary-based 30-day band was misleading (it duplicated the all-time totals). The recent band is now derived from thefilter=recentpayload'sreviews[]sample:recentReviewCountis the sample size (exact when under 100, since Steam returns all recent reviews up to thenum_per_pagecap) andrecentRatingPctis thevoted_upfraction of that sample. Platform flags are fixed: Steam search rows show no.platform_imgicons for Windows-only games, so absent icons now meanhasWindows=true(and any all-False row is overridden by the authoritativeappdetails.platformsdict whenfetchDetails=true). New scrape-time fieldstagIds/contentDescriptorsIdsare parsed from the search-rowdata-ds-tagids/data-ds-descidsattributes (populated even withoutfetchDetails;appdetailsstill overridescontentDescriptorsIdswhen it has data). NewageRatingsfield maps each rating system to its raw rating string (e.g.{"esrb": "m", "pegi": "18"}) fromappdetails.ratings(fetchDetails=true). NewplaytimeAtReviewMedianfield is the medianauthor.playtime_at_review(minutes at the time the review was written, in hours) across the merged reviewer sample — a less inflated metric thanplaytimeForeverfor old reviews. - Achievements / website / free status (fetchDetails=true):
achievementsCount(search row.search_achievements, orappdetails.achievements),websiteandisFreefrom theappdetailsAPI. - Enrichment speed: appdetails + appreviews now run concurrently per game (
asyncio.gather), roughly halving enrichment wall-time.
Pricing
$0.001 per game ($1.00 per 1k). Fields: title, originalPrice, finalPrice, rating, ratingPct, positivePct, reviewCount, achievementsCount, website, isFree, discountPercent, metacriticScore, releaseDate, hasWindows/Mac/Linux, image, headerImage, description, shortDescription, supportedLanguages, gameDetailsUrl, genres, categories, tags, tagIds, developer, publisher, playtimeForever, playtimeMedian, playtimeTwoWeeks, playtimeAtReviewMedian, totalPositive, totalNegative, reviewScore, recentReviewCount, recentRatingPct, type, comingSoon, screenshotsCount, moviesCount, dlcCount, recommendations, requiredAge, ageRatings, controllerSupport, supportUrl, supportEmail, minimumRequirements, recommendedRequirements, priceCurrency, metacriticUrl, background, contentDescriptorsNotes, contentDescriptorsIds, fullgameAppId, fullgameName, playtimeSampleSize, screenshots, drmNotice, legalNotice, totalResults.
Use cases
- Game price monitoring
- Market research on game trends
- Track discount percentages on specials
- Build gaming databases with developer/publisher info
- Compare review sentiment (positive vs negative totals) across titles