Steam Game Reviews avatar

Steam Game Reviews

Pricing

from $0.50 / 1,000 results

Go to Apify Store
Steam Game Reviews

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

Muhammad Naufal

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

0

Monthly active users

a day ago

Last modified

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

FieldTypeDefaultDescription
categorystringtopsellerstopsellers, newreleases, comingsoon, specials, under10, topwishlisted
maxResultsinteger25Max games (1-100)
fetchDetailsbooleantrueEnrich via Steam appdetails + appreviews APIs (genres, developer, publisher, description, languages, prices, authoritative review totals, playtime)
languagestringenglishSteam 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_summary tooltip 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 both NN% and Turkish-style %NN placements; no-review variants in 20+ locales are rejected from the rating field.
  • Pagination: both search layouts are supported — the classic .search_result_row rows and the newer card layout (.search_results a.result_title anchors). 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 (EN of, DE von, FR sur, ES/PT de, IT di, NL van, PL/CS z, DA af, NO/SV av, RU/UK из, SR/HR od, TR sonuçtan, CJK 件中/개 중/共 N 条). Note: Steam currently renders ~50 rows per request even with count=25 (25 shown + 25 prefetched); extraction takes the first max rows 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, ratingPct and reviewScore (0-10) come from the store.appreviews API when the search-page tooltip lacks them. Search-page values take precedence when present. If query_summary is missing, reviewCount falls back to total_positive + total_negative. recentReviewCount / recentRatingPct are derived from the second filter=recent payload's reviews[] sample (see Round 4 below — since mid-2026 query_summary is all-time regardless of filter/day_range, so the 30-day band is computed from the sample instead). ratingPct is kept even when a game has 0 positive reviews.
  • Playtime (fetchDetails=true): Steam no longer exposes aggregate playtime publicly. playtimeMedian / playtimeTwoWeeks are the median of a 100-review sample's author.playtime_forever / author.playtime_last_two_weeks; playtimeForever is the 10%-trimmed mean of the same sample (playtimeSampleSize reports the actual sample size). All three are estimates from reviewers (who skew toward heavier playtime), in hours, null when unavailable. If the all filter returns no playtime sample, the recent sample fills the gap.
  • Description / languages / prices / metacritic (fetchDetails=true): backfilled from the appdetails API (detailed_description, short_description, supported_languages, price_overview, metacritic). All fields are null-safe — Steam returns keys like tags / metacritic / genres as 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, recommendedRequirements from the appdetails API.
  • Round 3 (2026-08-06): new topwishlisted category (Steam filter=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 and playtimeSampleSize is emitted so consumers can weigh estimate confidence. New fields: priceCurrency (storefront currency code — prices are region-relative, e.g. HKD from 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), and headerImage now prefers the authoritative appdetails.header_image URL over the search-page URL guess. Pagination backfills up to 2 extra pages (capped by the catalog size Steam reports) so maxResults unique games are always reached even when a page repeats already-seen apps.
  • Round 5 (2026-08-08): new screenshots field (full list of store screenshot thumbnail URLs), drmNotice (third-party DRM, e.g. "Denuvo") and legalNotice (legal notice text) — both notices are null when the game has none.
  • Round 6 (2026-08-08): fixed two appdetails data-loss bugs — required_age arrives as a STRING on most titles ("18", "16") and the old int-only guard silently dropped it (requiredAge was always null); achievementsCount now reads the authoritative achievements.total (the legacy achievements[] list is no longer returned by the API, so the old len() 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 ships l=indonesian natively 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 Indonesian dari, Ukrainian із, Bulgarian от, Vietnamese trên, Hungarian N közül and the Finnish/Thai / N slash form — those locales previously stalled after page 1 (total parsed as 0). New appreviews field positivePct: the exact 1-decimal positive fraction (e.g. 86.2) kept alongside the rounded integer ratingPct for consumers ranking near a band boundary.
  • Round 4 (2026-08-07): Steam changed the appreviews API in mid-2026 — query_summary is now all-time regardless of filter / day_range / start_date, so the old filter=recent summary-based 30-day band was misleading (it duplicated the all-time totals). The recent band is now derived from the filter=recent payload's reviews[] sample: recentReviewCount is the sample size (exact when under 100, since Steam returns all recent reviews up to the num_per_page cap) and recentRatingPct is the voted_up fraction of that sample. Platform flags are fixed: Steam search rows show no .platform_img icons for Windows-only games, so absent icons now mean hasWindows=true (and any all-False row is overridden by the authoritative appdetails.platforms dict when fetchDetails=true). New scrape-time fields tagIds / contentDescriptorsIds are parsed from the search-row data-ds-tagids / data-ds-descids attributes (populated even without fetchDetails; appdetails still overrides contentDescriptorsIds when it has data). New ageRatings field maps each rating system to its raw rating string (e.g. {"esrb": "m", "pegi": "18"}) from appdetails.ratings (fetchDetails=true). New playtimeAtReviewMedian field is the median author.playtime_at_review (minutes at the time the review was written, in hours) across the merged reviewer sample — a less inflated metric than playtimeForever for old reviews.
  • Achievements / website / free status (fetchDetails=true): achievementsCount (search row .search_achievements, or appdetails.achievements), website and isFree from the appdetails API.
  • 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