Steam Reviews Scraper – Steam API, Steam Player Count, Playtime avatar

Steam Reviews Scraper – Steam API, Steam Player Count, Playtime

Pricing

from $0.30 / 1,000 result items

Go to Apify Store
Steam Reviews Scraper – Steam API, Steam Player Count, Playtime

Steam Reviews Scraper – Steam API, Steam Player Count, Playtime

Steam reviews API, Steam store API and Steam review data to JSON/CSV: review text, playtime, thumbs up/down, helpfulness votes, purchase type. Filter by playtime, keyword, language or review type, or include off-topic review bombs Steam hides; games mode adds price, genres, player count and tags.

Pricing

from $0.30 / 1,000 result items

Rating

0.0

(0)

Developer

Fetch Smith

Fetch Smith

Maintained by Community

Actor stats

0

Bookmarked

1

Total users

1

Monthly active users

17 hours ago

Last modified

Share

Steam Reviews Scraper

Scrape Steam player reviews and Steam store data into JSON, CSV or Excel — no login, no browser, no proxy needed.

It doubles as a video game data API: point it at any Steam app and pull the store record — price, discount, genres, developers, Metacritic score — plus Steam player stats such as live concurrent players, peak concurrency yesterday and an estimated owner range.

Give it Steam store URLs, numeric App IDs, or just game names to search for. You get every review with its full text, the reviewer's playtime, whether they recommend the game, helpfulness votes, and (optionally) the game's name, developer, publisher, genres and release date attached to every row.

Pay per result: $0.000575 per review or game record on the free plan, dropping to $0.0003 on Gold and above (Bronze $0.0005, Silver $0.00039). No start fee — a run that returns nothing costs nothing.

Source change (2026-10-23): Valve retired the review API this Actor used to call. Reviews now come from Steam's own community review pages instead — same review text, recommendation, playtime, author and votes, but a few fields Valve's old API alone exposed are gone for good: steamPurchase, receivedForFree, refunded, steamDeck, weightedVoteScore, updatedAt, playtimeAtReviewHours, playtimeLastTwoWeeksHours, authorNumReviews, authorLastPlayedAt, every hardware* field, and per-review language are now always null. createdAt is now day-resolution, not an exact timestamp. purchaseType, dayRange and includeOffTopic no longer filter anything (every review is scanned regardless — see the Input table). Everything else — review text, recommended, playtime, author identity, votesUp/votesFunny, writtenDuringEarlyAccess, watch mode, reviewId stability — is unaffected.

What you can do with it

  • Track sentiment after a patch or a price change — pull reviews sorted by most recent, filter to negative, and diff week over week.
  • Find bug reports in the wild — set keyword to crash, stutter, controller or refund and get only the reviews that mention it.
  • Filter out drive-by reviews — minPlaytimeHours: 10 keeps only reviewers who actually played the game.
  • Pull reviews from an exact historical window — reviewsAfter/reviewsBefore (e.g. a specific patch, a controversy, a launch week years ago) reach any point in a game's history, not just the last year.
  • Study a review bomb — Steam's own review-bomb filtering (includeOffTopic) has no equivalent on the community pages this Actor now reads, so every review is scanned regardless of this flag (currently a no-op — see the notice above and the Off-topic section below).
  • Competitive research — dataType: "games" returns price, discount, genres, developer, Metacritic score, the full review-score summary (total positive/negative, % positive) and, optionally, the live concurrent player count.
  • Build a steam games list from any batch of titles — put dozens of App IDs or search terms in one run and dataType: "games" returns price, discount, genres and review score for every match.
  • Size a market, not just a game — includeOwnerEstimates: true adds an estimated owner range, peak concurrent players yesterday and Steam's crowd-voted tags with vote counts to every game row. Those tags are what players actually call a game (Hades: Action Roguelike, Rogue-lite, Hack and Slash) rather than the three broad genres the store API returns (Action, Indie, RPG).
  • Localised research — language: "schinese", "russian", "brazilian" … or "all" for every language at once.
  • Feed an LLM / dataset pipeline — clean flat rows, stable reviewId, ISO-8601 timestamps.
  • Alert on new reviews only — set watchLabel and schedule it; see Watch mode below.

Input

FieldTypeDefaultDescription
dataTypestringreviewsreviews = player reviews; games = store record for each game
appsarray—Steam store URLs (https://store.steampowered.com/app/1145360/Hades/) or numeric App IDs (1145360)
searchTermsarray—Find games by name instead of / as well as URLs
maxReviewsPerAppinteger200Reviews to scan per game before moving to the next one (max 5000) — counted before keyword/minPlaytimeHours filtering, see FAQ
maxResultsinteger2000Hard cap on rows pushed — also caps what you are charged
languagestringenglishSteam language code, or all
reviewTypestringallpositive / negative to keep only thumbs-up / thumbs-down
purchaseTypestringallCurrently a no-op (2026-10-23 source change — see notice above). Kept in the input schema in case Steam's community pages grow this filter back.
includeOffTopicbooleanfalseCurrently a no-op (2026-10-23 source change — see notice above and the Off-topic section below)
sortBystringrecentrecent, updated, all (Steam's helpfulness ranking) or funny (Steam's "Funny" tab — most funny votes, all-time)
dayRangeinteger—Currently a no-op (2026-10-23 source change — see notice above). Use reviewsAfter/reviewsBefore with sortBy: "recent" for a date window instead.
reviewsAfterstring—ISO date (2024-01-01) — keep only reviews created on/after this date. Reaches any point in history, forces sortBy to recent.
reviewsBeforestring—ISO date — keep only reviews created before this date. Combine with reviewsAfter for an exact window.
minPlaytimeHoursinteger—Keep only reviewers with at least this many hours in the game
keywordstring—Keep only reviews whose text contains this word/phrase
countrystringusTwo-letter code for store prices and availability
includeGameInfobooleantrueAttach game name/developer/publisher/genres/release date to every review
includePlayerCountbooleanfalsegames mode: also fetch the live concurrent player count
includeOwnerEstimatesbooleanfalsegames mode: add estimated owner range, peak concurrent players yesterday, and Steam's crowd-voted tags with vote counts — see below
searchLimitinteger10Games taken from each search term
watchLabelstring—Turns this run into a watch — only reviews posted since the last run under this label are returned and charged. Reviews mode only. Leave empty for normal runs.
watchEventsarray(both)Watch mode only. Which change types to report: new and/or recommendationChanged (an already-delivered review whose thumbs-up/thumbs-down flipped). Leave empty for both.
webhookUrlstring—Optional. An http(s) URL to POST a small JSON completion summary to when the run finishes — see FAQ.

Off-topic review bombs (includeOffTopic)

Currently unavailable, as of the 2026-10-23 source change above. Valve's old review API let this Actor ask for the unfiltered set when it hid reviews from a flagged off-topic period (a publisher decision, a storefront policy, a controversy — not the game itself); the retired API's replacement, Steam's own community review pages, has no such control at all, in either direction. includeOffTopic is kept in the input schema (currently a no-op) in case that changes. The table below is historical — it describes how the old API behaved, not this Actor's current output.

GameReviews with the flag hidden (old API default)With includeOffTopic: true on the old API
Total War: ROME II (214950)88,33494,228
War Thunder (236390)784,322910,013
NARAKA: BLADEPOINT (1203220)302,783343,134

Watch mode — only new reviews since the last run

Set watchLabel to any name and this Actor stops re-delivering the same reviews on every scheduled run:

  1. The first run for a label is a free baseline. It records which reviews already exist for every game in your input and returns zero rows — you are charged nothing.
  2. Every run after that returns only reviews that weren't in the baseline, and adds them to it. Nothing new → zero rows → zero charge.
  3. An already-delivered review isn't necessarily done changing. Steam lets a reviewer edit their own review in place — same reviewId, but the thumbs-up/thumbs-down (and the review's own updatedAt) can flip. Set watchEvents to control which of new/recommendationChanged you get charged for (default: both). A re-delivered row carries two extra fields not shown in the sample above: watchEvent: "recommendationChanged" and previousRecommended (the prior true/false value before the flip) — a plain new review has neither field.

The baseline lives in your own Apify account, in a named key-value store called fetchsmith-steam-reviews-watch, keyed by your label plus a fingerprint of apps/searchTerms/searchLimit/country/language/reviewType/purchaseType/includeOffTopic/sortBy/dayRange and every keyword/minPlaytimeHours/reviewsAfter/reviewsBefore filter — all of them decide what "new" means, so changing any of them gives you a fresh baseline rather than a silently wrong one. Delete the record to start over; use different labels to watch several filter sets in parallel.

Details worth knowing:

  • Use sortBy: "recent" (the default). sortBy: "all" (helpfulness) and sortBy: "funny" (funny votes) are not chronological orderings, so a brand-new review isn't necessarily inside the scanned window and can be missed; the run logs a warning if you watch with either of them anyway.
  • maxReviewsPerApp is your scan-depth budget on incremental runs and is left exactly as you set it — with recent, new reviews sort to the top, so your own cap doesn't hide them. If every matching review inside that window turned out to be new, the run warns you that reviews posted since the last run may sit further back — raise maxReviewsPerApp or run the watch more often.
  • maxReviewsPerApp and maxResults are not part of the fingerprint (they are budgets, not filters), and neither are includeGameInfo/includePlayerCount (they change a row's contents, never which reviews count as new).
  • If a searchTerms query resolves to a different game than last time, that game is baselined on the spot rather than having its entire review history delivered as "new".
  • If Steam serves an incomplete review response for a game (see the FAQ below), that game is not baselined and the run says so — you never end up with a baseline built from an upstream fault.
  • Watch mode applies to dataType: "reviews" only. In games mode a row is the same snapshot of the same game on every run, not a stream of new events, so watchLabel is ignored with a warning.
  • Don't combine a fixed reviewsBefore with watchLabel — see "why has my watch stopped finding anything new" in the FAQ.
  • Baseline size cap: the saved baseline holds at most 40,000 review ids across all your apps/searchTerms (the oldest drop off first). A watch this large is rare, but if it happens, the dropped ids will be delivered and charged again as "new" on a future run — the run's log and status message name the count when it occurs. Split a very large watch across several labels (e.g. one per game) to stay under the cap.

Example input

{
"dataType": "reviews",
"apps": ["https://store.steampowered.com/app/1145360/Hades/"],
"maxReviewsPerApp": 200,
"language": "english",
"reviewType": "negative",
"minPlaytimeHours": 5,
"keyword": "crash"
}

Output

Review row (dataType: "reviews")

{
"type": "review",
"appId": 1145360,
"reviewId": "234888482",
"review": "Best roguelike I have ever played, and the story actually lands.",
"language": null,
"recommended": true,
"createdAt": "2026-09-10T00:00:00.000Z",
"updatedAt": null,
"votesUp": 0,
"votesFunny": 0,
"weightedVoteScore": null,
"commentCount": 0,
"steamPurchase": null,
"receivedForFree": null,
"writtenDuringEarlyAccess": false,
"refunded": null,
"steamDeck": null,
"playtimeForeverHours": 3.9,
"playtimeAtReviewHours": null,
"playtimeLastTwoWeeksHours": null,
"authorSteamId": "76561197974061804",
"authorName": "BobbyRunout",
"authorProfileUrl": "https://steamcommunity.com/profiles/76561197974061804/",
"authorNumGamesOwned": 1180,
"authorNumReviews": null,
"authorLastPlayedAt": null,
"reviewUrl": "https://steamcommunity.com/profiles/76561197974061804/recommended/1145360/",
"hardwareOs": null,
"hardwareCpu": null,
"hardwareGpu": null,
"hardwareRamMb": null,
"hardwareVramMb": null,
"gameName": "Hades",
"developers": ["Supergiant Games"],
"publishers": ["Supergiant Games"],
"genres": ["Action", "Indie", "RPG"],
"releaseDate": "Sep 17, 2020",
"storeUrl": "https://store.steampowered.com/app/1145360/",
"scrapedAt": "2026-09-10T06:03:39.139Z"
}

Game row (dataType: "games")

A game row is a store snapshot, not a set of reviews, so the review-selection inputs have nothing to select and are ignored here: keyword, minPlaytimeHours, reviewType, reviewsAfter/ reviewsBefore, sortBy, dayRange and maxReviewsPerApp. Set any of them alongside dataType: "games" and the run names them in a warning rather than quietly dropping them. Separately, reviewScore / reviewScoreDesc / totalReviews are deliberately the game's own all-language, all-purchase-type totals — language and purchaseType do not narrow them (also warned when you set them). If you want a filtered set of individual reviews, use dataType: "reviews".

{
"type": "game",
"appId": 367520,
"name": "Hollow Knight",
"appType": "game",
"storeUrl": "https://store.steampowered.com/app/367520/",
"isFree": false,
"priceCurrency": "GBP",
"price": 12.79,
"priceInitial": 12.79,
"discountPercent": 0,
"releaseDate": "24 Feb, 2017",
"developers": ["Team Cherry"],
"publishers": ["Team Cherry"],
"genres": ["Action", "Adventure", "Indie"],
"platforms": ["windows", "mac", "linux"],
"metacriticScore": 90,
"reviewScore": null,
"reviewScoreDesc": null,
"totalReviews": 560648,
"totalPositive": 543211,
"totalNegative": 17437,
"positivePercent": 96.9,
"currentPlayers": 4132,
"country": "gb"
}

Owner estimates & tags (includeOwnerEstimates: true)

Six extra fields are added to each game row. Real output for Hades (1145360):

{
"ownersEstimate": "5,000,000 .. 10,000,000",
"ownersMin": 5000000,
"ownersMax": 10000000,
"peakConcurrentYesterday": 2253,
"steamSpyTags": ["Action Roguelike", "Rogue-lite", "Hack and Slash", "Indie", "Mythology"],
"steamSpyTagVotes": { "Action Roguelike": 1330, "Rogue-lite": 954, "Hack and Slash": 936 }
}

steamSpyTags is ordered by vote count, highest first, and steamSpyTagVotes gives the raw votes behind it. These come from the free public SteamSpy API — Steam's own store API exposes none of them. One extra request per game, paced to SteamSpy's 1 request/second limit, and no extra charge: the fields ride along on the game row you are already paying for.

Pricing

Pay per result: $0.000575 per row (review or game record) at the FREE tier, dropping to $0.0005 (BRONZE), $0.00039 (SILVER) and $0.0003/row on GOLD and above. No Actor-start fee — an empty or filtered-out run costs you nothing. Set maxResults/maxReviewsPerApp to cap any run.

The closest Store competitor by users is automation-lab (111 users, re-verified live 2026-10-16, automation-lab/steam-game-reviews-scraper) — it matches our per-row price exactly on FREE ($0.000575), BRONZE ($0.0005), SILVER ($0.00039) and GOLD ($0.0003), then keeps tapering where we flatten: $0.0002 on PLATINUM and $0.00014 on DIAMOND, against our $0.0003. It also bills a $0.003 one-time Actor-start fee on every run that we don't, which is what decides small pulls: on FREE through GOLD an equal-sized pull costs strictly more there, and on PLATINUM/DIAMOND its start fee only pays for itself past roughly 30,000 / 19,000 rows per run — above that, it is genuinely cheaper than us and we do not claim otherwise. Checked its live input schema directly (build still the 2026-09-02 rebuild, unchanged), not its listing copy — a prior version of this paragraph claimed it has no purchaseType/reviewType filters, no exact date window and no game-metadata attachment, all three of which its schema has actually carried since that rebuild (purchaseType, reviewType, startDate/endDate, and includeGameInfo — the last one under the identical property name). It genuinely still has no keyword or minimum-playtime filter, no off-topic review-bomb toggle (currently unavailable on our side too, as of the 2026-10-23 source change above), no games mode (so no live player counts or owner-estimate enrichment either), no watch mode, and no webhook, all of which this Actor ships at no extra charge. Verified live 2026-10-03.

A newer, faster-growing competitor is memo23/steam-reviews-scraper (created 2026-09-07 — every one of its users joined in the last 30 days, the fastest growth in this niche by far). It pitches an exact review-date window and no required Steam API key; this Actor already has both (reviewsAfter/reviewsBefore, and never needed a key). Its schema is thin next to ours — still the same 8 properties (app ids, a review cap, language, reviewType, purchaseType, the date window, and the off-topic toggle) vs. this Actor's 22, confirmed unchanged against its latest build despite a same-day version bump — with no search-by-name, no keyword or playtime filter, no games mode, no watch mode, no webhook. It's also pricier: a $0.005 one-time start fee (none here) plus a flat $0.001/review with no volume tiers, vs. this Actor's tiered $0.000575 down to $0.0003 and no start fee. Verified live 2026-10-03.

A full Store sweep for "steam reviews" found three more rival listings bigger than memo23 that had never been named here. easyapi/steam-reviews-scraper (60 users) charges a flat $0.00299/result plus a $0.09 one-time Actor-start fee — that start fee alone costs more than 150 of our rows, on top of a per-row rate already ~5x our free-tier price. logiover/steam-game-reviews-scraper (54 users) charges $0.003/result tapering to $0.0015 on Gold and above, plus a $0.00005 start fee — pricier than us at every tier. danek/steam-reviews-ppr (52 users) charges $0.0015/result tapering to $0.0005 on Gold and above, no start fee — still 1.7x-2.6x our tiered rate. None of the three beats this Actor's $0.000575-$0.0003 rate at any volume or plan, and none offers games mode, watch mode, or a webhook. Verified live 2026-10-02.

A wider 4-term sweep ("steam reviews", "steam game reviews", "steam player reviews", "steam api scraper") turned up one more rival with real traction that had never been named: shahidirfan/steam-reviews-scraper charges a flat $0.00099/review plus a $0.0005 start fee — pricier than this Actor's $0.000575-$0.0003 tiered rate at every plan, and its listing shows no search-by-name, keyword, playtime, games mode, watch mode or webhook. Three smaller listings were checked and are not real threats: scrapestorm/steam-reviews-scraper---cheap (named "cheap" but actually $0.00299/review, over 5x our rate), crawlerbros/steam-review-scraper ($0.003 tapering to $0.002/review plus a $0.005 start fee) and powerai/steam-reviews-scraper ($0.00499/review plus a $0.09 Actor-start fee, the dearest start fee found in this niche). Verified live 2026-10-03.

A still-wider sweep (adding "steam review export" and re-running "steam api scraper") priced every remaining listing live and found three genuine undercutters we do not claim to beat. angaba92/steam-reviews-scraper (titled "$0.10/1K") charges a flat $0.0001/review plus a $0.00005 start fee — cheaper than our cheapest rate ($0.0003) from the first row, at every plan. fetch_cat/steam-reviews-scraper tiers from $0.00023/review (FREE) down to $0.000056/review (DIAMOND) — cheaper than us at every matching tier — but carries a $0.005 one-time start fee we don't, so it only overtakes us past ~15 rows on our FREE tier and past ~20 rows against our own cheapest $0.0003; below that, our no-start-fee pricing still wins. maximedupre/steam-reviews tiers $0.0005 (FREE), $0.00045 (BRONZE), $0.00035 (SILVER) and $0.00025 (GOLD and above) with no start fee — that is cheaper than us at every single tier, with no volume threshold to cross. It is the one listing in this niche that beats our price outright; what it does not have is search-by-name, the keyword/playtime filters, the off-topic review-bomb toggle, games mode, watch mode or a webhook. One smaller listing ties rather than beats: lafuan/steam-game-reviews charges a flat $0.0005/review plus a $0.00005 start fee, which undercuts our FREE tier, exactly matches our BRONZE rate, and is pricier than every tier below that. None of the four offers games mode, watch mode, a webhook, or game-metadata enrichment, and none handles the keyword/playtime/date-window filters this Actor does. Nine more listings from that pass were originally logged by bare owner handle with no slug — exactly the cycle-1224 "bare handle reads as unnamed again" trap — so a 2026-10-05 re-check re-priced each one live and now names it in full: datawell/steam-reviews-scraper (flat $0.005/review), scrapers_lat/steam-game-reviews-scraper (tiered $0.008 FREE -> $0.0068 DIAMOND), foo121/steam-reviews-scraper (flat $0.001/review), bakos_bence/steam-app-reviews (tiered $0.00299 -> $0.001495/review plus a $0.02 -> $0.003 Actor-start fee), alleserojje/steam-reviews-scraper (flat $0.001/review plus a $0.00005 start fee), delectable_incubator/steam-reviews-scraper-low-cost (tiered $0.00098 FREE/BRONZE/SILVER -> $0.00068 GOLD+ plus a $0.00005 start fee — dearer than us at every tier despite the "low-cost" name), joseolmedosotoaguirre/steam-game-reviews (flat $0.0012/review plus a $0.00005 start fee) and benthepythondev/steam-reviews-scraper (tiered $0.0015 FREE -> $0.00105 DIAMOND plus a small tiered start fee, $0.00005 FREE -> $0.000035 DIAMOND) — all eight confirmed pricier than us at every tier, no crossover. The ninth, 67-labs/steam-reviews-scraper, has a real nuance the old bare-handle note missed: it flat-rates $0.0005/review (tying our BRONZE rate exactly) but adds a $0.01 Actor-start fee we don't charge, so our no-start-fee FREE tier ($0.000575) stays cheaper up to ~133 reviews in one run — above that 67-labs' flat rate pulls ahead of our FREE tier only, never of BRONZE/SILVER/GOLD+, since $0.0005 flat never beats our $0.0003-$0.00039 paid-tier rates. (sync-network from the same original bare list is already named with its full handle in the seventh sweep below, so it needed no fix.) Also structurally different: pappy-dev/steam-review-intelligence (bundles optional $0.03-$0.05 AI-analysis add-ons on top of a $0.0002/review base — cheaper than us on the base row alone at every tier, but not a plain per-row comparison once any AI event is used). Verified live 2026-10-05.

A sixth sweep widened the search terms past the word "reviews" to cover this Actor's other half — games mode, which returns Steam price, genres, tags, live player count and SteamSpy owner estimates — and found 13 listings never named here, every one of them priced live, and not one of them cheaper than this Actor's $0.000575–$0.0003 per-row rate at any tier or volume. The closest feature match is maydit/steam-game-intelligence-scraper, which merges store details, reviews, live player counts and SteamSpy owner estimates into one row per game exactly as games mode does — at $0.003/row tapering to $0.0018 from SILVER up, plus a $0.00005 start fee, so 5x our FREE rate and 6x our cheapest rate. By users, the biggest of the 13 are shahidirfan/Steam-Store-Scraper (33 users, $0.0009/row + $0.00005 start — the cheapest of the group and still 1.6x our FREE rate, 3x our cheapest rate) and automation-lab/steam-scraper (28 users, re-verified live 2026-10-16, same owner as this niche's biggest review scraper; $0.001 start fee plus a tiered $0.0023 FREE → $0.00056 DIAMOND per game, 1.9x-4x us depending on tier). Verified live 2026-10-04.

The rest of that group, for completeness: sallbro/steam-scraper bills both its start event and every row at a tiered $0.10 FREE → $0.01 GOLD-and-above — the dearest per-row price found anywhere in this niche, ~174x our FREE rate; easyapi/steam-store-search-scraper charges $0.00299/row plus a $0.09 start fee; cloud9_ai/steam-game-scraper $0.003/row + $0.00005 start; cryptosignals/steam-scraper a flat $0.01/result; trovevault/steam-game-price-tracker $0.0015 → $0.001275/row plus a $0.001 → $0.00085 start fee; scrapestorm/steam-game-search-scraper---cheap is this niche's second "Cheap"-titled name trap at $0.00299/row; viralanalyzer/steam-game-intelligence $0.05 → $0.00945 per game; bovi/steam-scraper $0.00205 → $0.0019475/game; omao/steam a flat $0.002/game; and logiover/steamspy-scraper $0.003 → $0.0015/row, SteamSpy-only — it carries no Steam review text at all. jungle_synthesizer fields three Steam listings in this niche (jungle_synthesizer/steam-store-upcoming-release-calendar-scraper, jungle_synthesizer/steam-store-game-catalog-metadata-scraper, jungle_synthesizer/steam-charts-player-count-topsellers-scraper), each billing a $0.10 flat Actor-start fee plus $0.0005–$0.001/record — that start fee alone costs more than 170 of our rows before a single record is returned. One listing was read and ruled out as a different product class rather than a rival: nexgendata/social-content-mcp-server is an MCP server billing $0.02 per tool call, not a per-row Steam scraper. Two more games-mode listings surfaced while re-pricing the bare-handle fixes above (same owners, different slugs from their review-scraper listings checked there): benthepythondev/steam-games-scraper tiers $0.0025 FREE -> $0.00175 DIAMOND plus a small tiered start fee — 4.3x-5.8x our cheapest games-mode rate — and delectable_incubator/steam-games-scraper-low-cost tiers $0.00199 FREE -> $0.00049 GOLD+ plus a $0.00005 start fee, still 1.6x our cheapest rate despite the "low-cost" name. benthepythondev/steam-scraper (0 new/30d, dormant) tiers $0.002 FREE -> $0.0014 DIAMOND plus the same start fee shape — dearer and the least active listing in this sweep. Verified live 2026-10-04 (original games sweep) and 2026-10-05 (these three).

A seventh sweep re-checked the whole niche (306 listings seen, 150 matching) and live-priced every match with 3+ users that was not already named here by full handle. Four, none of them an undercutter: sync-network/steam-reviews-scraper charges $0.001/result plus a $0.00005 start fee — 1.7x our FREE rate and 3.3x our cheapest; slothtechlabs/steam-game-data-scraper a flat $0.003/row with no start fee — 5.2x FREE, 10x our cheapest; ninhothedev/steam-search-scraper (Steam store search plus app details) charges $0.0005/row plus a $0.00005 start fee, which undercuts our FREE tier, exactly ties our BRONZE rate and is pricier than every tier below it — the same tie-not-beat shape as lafuan/steam-game-reviews above; and devilscrapes/steam-regional-price charges $0.001/row on top of a $0.20 flat Actor-start fee, the dearest start fee found anywhere in this niche — it alone costs more than 340 of our FREE-tier rows before a single row is returned. Verified live 2026-10-04.

An eighth sweep (151 listings matched, 104 of them never named here) live-priced the entire unnamed tail rather than just the 3-plus-user slice, because by 2026-10-06 that slice was empty — every unnamed listing in this niche now sits at 1-2 users. Seventeen came in under our $0.000575 FREE rate; eight of those are not review products at all and are excluded on scope, read from their live Store descriptions rather than their titles (fetch_cat/steam-store-games-scraper at $0.0000454/item plus a $0.005 start fee — store metadata, prices and aggregate review summaries, no review rows; glasswing/steam-store-scraper and fortuitous_pirate/steam-scraper — store/top-seller/catalog data, review score counts only; ninhothedev/steam-games-scraper and ninhothedev/steam-charts-scraper — prices and live player counts; gio21/steam-spy-scraper — SteamSpy owner ranges and tags; maximedupre/protondb and jungle_synthesizer/protondb-steamdeck-linux-compatibility-scraper — ProtonDB Linux/Steam Deck compatibility tiers). That leaves nine genuine review-row undercutters, every one verified against its full live pricingInfos before being named here.

One beats us outright at every tier: gazidev/steam-reviews-scraper charges a flat $0.0002/review plus a $0.00005 start fee — below even our cheapest $0.0003 GOLD+ rate, effectively from the first row. Its per-game app-summary event costs $0.002, so attaching game metadata is dearer there than our free includeGameInfo, but on review rows alone it is cheaper than us everywhere and we do not claim otherwise. ninhothedev/steam-reviews-scraper (titled "$0.35/1K") charges a flat $0.00035/review plus a $0.00005 start fee: cheaper than our FREE, BRONZE and SILVER tiers from the first row, and never cheaper than our $0.0003 GOLD+ rate. superslowsloth/steam-reviews-scraper charges $0.0004/review but carries a $0.002 start fee, so it only overtakes our FREE tier past ~11 reviews per run and our BRONZE rate past ~20; against SILVER ($0.00039) and GOLD+ its per-row rate never wins at any volume.

The remaining six all flat-rate $0.0005/review — which undercuts our FREE tier but exactly ties our BRONZE rate and loses to SILVER and GOLD+, the same tie-not-beat shape as lafuan/steam-game-reviews above. Three carry a token $0.00005 start fee (chorelet/steam-reviews-scraper, literate_universe/steam-reviews-scraper) or none at all (forevertools/steam-reviews, which advertises the rate as "$0.50 per 1,000 reviews"). tortuga/steam-scraper matches that $0.0005 review rate with no start fee, but bills its other two shapes separately at $0.003 per app-details row and $0.001 per search result. jpmarketdata/steam-recent-written-reviews is narrower by design — exact app IDs only, recent written reviews, with text returned redacted and author profiles deliberately omitted — so it cannot serve a full-history or author-level pull at any price. jungle_synthesizer/steam-store-game-reviews-full-history-scraper is the one whose headline rate is misleading: the same $0.0005/record sits on top of a $0.10 flat Actor-start fee, so it needs roughly 1,300 reviews in a single run before it overtakes even our FREE tier, and it never overtakes BRONZE or below. None of the nine offers games mode, watch mode, a webhook, or the keyword/playtime/off-topic-review-bomb filters this Actor ships at no extra charge. Verified live 2026-10-06.

A ninth sweep re-ran every search term and matched 152 listings (up from 151), with the README now naming 64 of them — up from 47 before the eighth sweep shipped. That left 88 unnamed, every one capped at 2 users (no listing cleared the usual 3-user cohort cutoff), so per the standing full-cohort rule all 88 were live-priced end to end. Completeness holds outright: not one of the 88 beats us at any tier, in scope or out. The cheapest listing overall, bgfc97/steam-games-scraper ($0.0006/row), is a store-metadata product with no review rows at all — genres, price, Metacritic score and platforms, plus a reviews summary count, not review text — the same games-mode exclusion already applied above. The cheapest genuine review-row product in the 88 is huggable_quote/steam-reviews-scraper at a flat $0.00065/review, still 1.1x our FREE rate and 2.2x our cheapest GOLD+ rate, with no start fee to create a volume crossover either way. Verified live 2026-10-07. (Retracted 2026-10-09 — the completeness claim in this paragraph was wrong. It priced each listing by its headline charge event only; pricing every event against every tier found three real undercutters in that same tail of 88. See the tenth sweep below.)

2026-10-07 cleanup: dropped every sub-20-user rival count from this README per the standing rule (an exact count is only published at 20+ users, since totalUsers churns in both directions and a one-user tick under 20 is automatically STALE at the checker's 10% tolerance) — 26 bare counts removed across the sweeps above, every price claim and feature comparison left intact. No live re-check was needed for this edit: it only removes numbers, it doesn't restate any.

A tenth sweep (308 listings seen, 154 matching, 88 of them still unnamed) re-priced the entire unnamed tail with one method change, and it retracts the ninth sweep's completeness claim above. That sweep read each rival's headline charge event — the one Apify flags primary, or else the cheapest — and on that reading none of the 88 undercut us. Pricing every charge event on every listing against every tier instead found three that do, all of them multi-mode store-plus-reviews scrapers whose review event is a secondary charge sitting behind a dearer per-game event: a one-event read picks up the per-game price, the listing scores as several times dearer than us, and its review ladder goes unseen underneath ours. The 2026-10-07 claim was wrong and the correction is here. Verified live 2026-10-09.

scrapesage/steam-scraper is the deepest rung-for-rung tiered undercutter found in this niche to date (corrected 2026-10-23 — the eleventh sweep below caught that highbrow_fame/steam-games-reviews, named two sentences later in this same paragraph, is actually cheaper in absolute terms at $0.0001 flat and deeper against our floor at 3x vs. scrapesage's 2.3x; the "deepest" label was misapplied to the wrong listing). Its review event tiers $0.0005 (FREE), $0.00043 (BRONZE), $0.00035 (SILVER), $0.00028 (GOLD), $0.00019 (PLATINUM), $0.00013 (DIAMOND) with no start fee — under our $0.000575–$0.0003 ladder at every single tier, no volume threshold to cross, and 2.3x under our cheapest rate at DIAMOND. Its per-game event, $0.0025 tapering to $0.00063, is what hid it. highbrow_fame/steam-games-reviews flat-rates $0.0001/review with no start fee — 5.75x under our FREE rate and 3x under even our cheapest GOLD+ rate, from the first row (its game rows cost $0.001). tagadanar/steam-scraper tiers reviews $0.0004 → $0.00028 (GOLD and above), under us at every tier on the per-row rate, but charges a $0.001 Actor-start fee we don't, so it only overtakes us past roughly 6 reviews per run on FREE, 8 on BRONZE, 15 on SILVER and 50 on GOLD+ — in practice always, since review pulls run to hundreds. A fourth undercuts us only part-way: eiv/steam-scraper flat-rates $0.0004/review, which is under our FREE and BRONZE rates but above our SILVER ($0.00039) and GOLD+ ($0.0003) rates at any volume, and its $0.005 start fee means it does not overtake even our FREE tier until about 29 reviews per run (about 50 against BRONZE). None of the four ships games mode's live player counts and SteamSpy owner estimates, watch mode, a webhook, or the keyword / minimum-playtime / off-topic-review-bomb filters this Actor charges nothing extra for — but on review-row price alone three of them beat us, and we do not claim otherwise. Verified live 2026-10-09.

Three further listings tripped the every-event scan and are not undercutters, recorded here because two of them are the same trap twice over: a charge event whose unit is a container, not a review row. neverempty/steam-reviews-price-monitor (the newest listing in this niche, created 2026-10-05) bills $0.0003 per game-checked "monitoring check" — one charge per game polled, however many reviews that poll returns; its actual review row, review-returned, costs $0.001 on FREE tapering to $0.0007, which is 1.7x–2.3x dearer than us at every tier. datacach/steam-listing-search-by-keyword bills $0.0005 per search_term — per keyword searched, not per result — while its rows cost $0.0025 each on top of a $0.005 start fee, 4.3x our FREE rate, and it returns store listings with no review text at all. reviewly/stream-reviews-scraper is the ambiguous one: the only event it labels "Review" costs $0.0018 on FREE tapering to $0.00095, 3.1x dearer than us at every tier, but it also sets Apify's reserved apify-default-dataset-item event to $0.0001 and the listing does not say which of the two fires for a review row — if both do, a review costs $0.0019 there, on top of a $0.0005 start fee. On the only rate it names for a review, it is dearer than us everywhere. Verified live 2026-10-09.

An eleventh sweep (2,840 listings seen, 173 matching, up from 154 — the niche nearly doubled) live-priced the entire unnamed tail (107 unnamed of 173, 106 once our own listing is excluded) every-event × every-tier. Six genuine new undercutters, four caught by the automated below-floor scan and two more that only a hand-read of the AMBIGUOUS multi-event listings exposed: tubetext/steam-reviews-scraper tiers $0.0002 (FREE) → $0.00015 (GOLD and above) plus a $0.00005 start fee — under our $0.0003 floor at every tier, 2x under our cheapest rate, the start fee paying for itself inside the first row. deriverge/steam-reviews-scraper tiers $0.00045 → $0.000225 (GOLD+) with no start fee — under us rung-for-rung at every tier, 1.33x under at GOLD+. tidyharvest/steam-reviews-scraper tiers $0.0005 → $0.00024 (GOLD+), also no start fee and under us at every tier (1.25x at GOLD+; its own listing advertises the rate as "$0.50 per 1,000 down to $0.24"). One is marginal: s_actors/steam-reviews-scraper tiers $0.00049 / $0.00049 / $0.00038 / $0.00029 behind a $0.001 start fee — only $0.00001 under us per paid tier, so it needs roughly 12 reviews/run to overtake our FREE tier and over 100 to overtake BRONZE, SILVER or GOLD+.

From the hand-read: pushbuild/steam-store bills its review event at a flat $0.0002 with no start fee (a separate result row costs $0.001) — below our floor from the first row, invisible to the automated scan because the listing has two recurring events with no primary flag set. mediapro-tools/steam-game-reviews-store-data bills reviews at a flat $0.0003, no start fee — exactly ties our GOLD+ floor and undercuts FREE, BRONZE and SILVER from row one (its app-record event is priced separately at $0.002). Two more tie rather than beat outright: olsols4/steam-reviews-game-data ($0.0004/review, no start fee — under our FREE and BRONZE rates but above SILVER, so it never reaches our paid floor) and joey001/steam-scraper ($0.0003/review + $0.005 start fee — overtakes our FREE tier past ~18 rows, BRONZE past ~25, SILVER past ~56, never GOLD+). Ruled out after a live hand-read: best_apis/steam-reviews-scraper ($0.0012/review, 2.1x dearer) and both recordsdata/steam-charts-scraper and recordsdata/steam-reviews-scraper ($0.01+/row, 17x+ dearer).

Two listings carry future-dated pricing we have not seen before in this niche — a pricingInfos entry with a startedAt after today that most listing views miss entirely: luminar/steam-reviews-scraper-change-monitor prices at $0.00085 → $0.0008075 today (dearer than us at every tier) but its schedule flips to the FREE model on 2026-10-24 — from tomorrow it is a direct reviews-plus-change-monitor substitute at $0, unbeatable on price. entrogix_works/steam-store-search similarly flips FREE on 2026-10-25, but it is store search with a review-score/Wilson-bound field and no review rows, so it stays out of scope on this README's standing games-mode exclusion (named here for completeness, not as a threat). Two more charge a flat run fee with no per-row cost at all: brilliant_gum/steam-insights-scraper bills $0.021/run all-in, cheaper than us below ~36 reviews against our FREE tier and ~70 against GOLD+, dearer above that volume; remarkable_whipscorpion/steam-review-mix-change-review bills $0.10005/run (crossover ~174 rows against FREE, ~334 against GOLD+) but is an input-only aggregate-analysis product, not a scraper, so it is excluded on scope. None of the six real undercutters above offers games mode, watch mode, a webhook, or the keyword/playtime/off-topic-review-bomb filters this Actor ships at no extra charge. Verified live 2026-10-23.

FAQ

Why has my watch stopped finding anything new? Check whether you set a fixed reviewsBefore alongside watchLabel. reviewsBefore is applied against each review's own createdAt (its post timestamp, both server-side via Steam's end_date and client-side), which for a brand-new review is always "now". So once today's real calendar date passes a fixed reviewsBefore, no newly-posted review can ever be dated before that cutoff again, and the watch goes permanently quiet while still reporting the reassuring "nothing new" status every run. This run logs a warning (and sets RUN_SUMMARY.watchDeadDateBound: true) when it detects the combination. Drop reviewsBefore from a watched query (reviewsAfter alone is fine) or drop watchLabel if you actually want a one-off historical window instead of an ongoing alert.

How accurate are the owner estimates, and why is there no playtime estimate? ownersEstimate is a bucketed range (e.g. "5,000,000 .. 10,000,000"), not a precise number — that is how SteamSpy publishes it, and ownersMin/ownersMax are just that string parsed into integers so you can sort and filter on it. There is deliberately no playtime estimate: SteamSpy's average_forever / median_forever / 2-week playtime fields return a flat 0 for every game we checked (verified 2026-09-18 across Dota 2, CS:GO, Cyberpunk 2077, Stardew Valley, Monster Hunter Wilds, Call of Duty MWII and Schedule I), because Valve stopped exposing the profile data they were derived from. We don't ship a field that is always zero. If you want real playtime, use dataType: "reviews" — playtimeForeverHours and playtimeAtReviewHours are per-reviewer numbers that come straight from Steam.

Some rows came back with ownersEstimate: null — why? SteamSpy didn't have that app. The rest of the row is unaffected — every Steam-sourced field is still complete — and the run log names the App IDs that were missing. It is most common for unreleased apps, non-game items and very new releases. Note that "0 .. 20,000" is a real bucket for a genuinely small game, not a "no data" marker; when SteamSpy has nothing the Actor returns null rather than passing that floor through as if it were an estimate.

Is this only a review scraper, or can I use it as a general gaming data API? Both — set dataType: "games" and skip reviews entirely: you get price, discount, genres, developers, Metacritic score, the review-score summary and (optionally) live player count and owner estimates for a batch of Steam apps in one call, no review scraping involved.

Do I need a Steam API key or a proxy? No. This Actor only reads Steam's public store endpoints over plain HTTP. No login, no key, no residential proxy, so runs are fast and cheap.

Can I get all reviews of a huge game? Yes — the Actor paginates with Steam's review cursor. Set maxReviewsPerApp (up to 5000 per game) and maxResults for the overall cap. Remember you are charged per row returned, so set both deliberately.

Why did I get fewer reviews than maxReviewsPerApp? maxReviewsPerApp is a scan cap, not a match count — it stops Steam pagination after that many reviews have been looked at, and keyword/minPlaytimeHours are applied after that, per review. So a narrow filter combined with a low cap can miss real matches sitting deeper in the feed: on Dota 2 (appId 570) with keyword: "toxic", maxReviewsPerApp: 20 scans 20 reviews and keeps 0, but raising it to 50 finds 1 and 200 finds 2 — the matches were always there, just unscanned. When this happens the log carries a WARN naming the cap and how many scanned reviews were dropped, and the run's status message says the same — raise maxReviewsPerApp to search deeper. (reviewsAfter/reviewsBefore don't have this problem: newest-first paging stops cleanly at the date boundary instead of relying on the scan cap.) Filtered-out reviews are not charged either way.

I searched for an accented word (like "très" or "café") and got zero results even though I can see matching reviews in the Steam UI — why? This was a real bug, fixed in v0.1.16. keyword is matched with a plain substring check, and Unicode represents the same accented letter two different ways — "composed" (é as one code point) and "decomposed" (e + a separate accent mark) — which look identical but don't string-match each other. Verified live on CS2 (appId 730, French reviews): searching "très" typed in composed form returned 24 matches, the same query typed in decomposed form returned 0, even though both are the same word. keyword (and the review text it's matched against) are now Unicode-normalized before comparing, so it no longer matters which form you type.

How is webhookUrl different from Apify's own platform webhooks? Apify's platform webhooks are configured separately per Task/Actor via the Console or the Webhooks API — useful if you already live in the Apify Console, but extra setup if you're calling this Actor's API directly and just want a completion ping. webhookUrl is a plain input field: set it on the run itself and it POSTs a JSON body (actorRunId, defaultDatasetId, finishedAt, pushed, summary — see the RUN_SUMMARY entry below — and, if watchLabel is set, watchSeeding/watchNewCount/watchSkipped) once the run finishes and every row has already been pushed and charged. It's best-effort — a slow or failing webhook only logs a warning, it never fails the run, changes the result set, or affects billing.

Is there a machine-readable record of whether a run got everything, or stopped short? Yes — every run writes a RUN_SUMMARY record to its key-value store (GET /v2/actor-runs/<runId>/key-value-store/records/RUN_SUMMARY, no webhook needed). It carries delivered, complete (a boolean — a run can SUCCEED and still be short), and when complete is false, incompleteReason — one of upstream-error (Steam had an outage), charge-limit, max-results, seed-cap (watch baseline capped before finishing), upstream-degraded (some apps hit a Steam data fault, others delivered fine), depth-cap (maxReviewsPerApp was hit while a filter was still discarding matches) or watch-saturated (the whole scanned window was new — older new reviews may sit unread) — plus incompleteDetail with the specifics. It also carries the per-app buckets behind those reasons, so you can tell apart apps that need different fixes: emptyIds (Steam returned nothing at all), allFiltered (the app's whole returned feed was rejected by your keyword/minPlaytimeHours/date filters — loosen the filter), depthCapped (maxReviewsPerApp was hit mid-filter — raise the cap), upstreamDegraded (a Steam-side fault — re-run later) and emptySearches (search terms that matched no game). The run's status message names every one of these that applied, not just the first, so a multi-app run tells you the cause for each app rather than hiding all but one. Watch-mode runs also carry baselineSaved/baselineSize/baselineTruncated. A run that hits an upstream fault on every app no longer fails silently mid-script: the error is recorded, the watch baseline and RUN_SUMMARY are still written, and only then does the run end FAILED — so a failed incremental run's baseline still reflects every row it already delivered and charged.

I'm watching a game and a review I already got paid for is coming back again — is that a bug? No — it's recommendationChanged. Steam keeps a review's id stable when its author edits it in place, and editing is exactly how a player flips their own thumbs-up/thumbs-down (verified live 2026-09-26: real reviews on appId 570 show the same recommendationid with timestamp_updated well after timestamp_created). A watch baseline built before this feature existed carries no recommendation state, so recommendationChanged only starts firing from the second run after you get it — the log says so explicitly. Set watchEvents: ["new"] if you never want to pay for a flip, only for genuinely new reviews.

What is sortBy: "funny" and how is it different from all? It's Steam's fourth review ordering — the "Funny" tab on a store page's review list, ranked by funny votes rather than helpfulness. It returns a genuinely different set of reviews, not a re-sort of the same ones: on Dota 2 the top funny reviews have 5,000–15,000 funny votes each and date from 2013–2017, while the top helpful reviews are from the last 30 days with double-digit funny votes. Use it to pull a game's best-known community jokes and copypastas (community-management, marketing and meme-research work) rather than its buying-decision feedback. Two things to know: it is always all-time (Steam offers no date control for it, so dayRange is ignored and the run says so), and it is not chronological, so it's a poor choice for watch mode.

Does dayRange work with the "most recent" sort? No — Steam only honours a day range in its helpfulness ranking, so set sortBy: "all" when you use dayRange. Verified against Steam's API: in the other three modes dayRange changes nothing at all, so this Actor withholds it and logs a warning instead of letting you believe a window was applied. For any other historical window, use reviewsAfter/reviewsBefore instead — the Actor forces chronological order and sends the window straight to Steam's own date filter, so it works arbitrarily far back, not just the last 365 days.

Can I pull reviews from a specific week/month years ago, like a launch controversy? Yes — set reviewsAfter and reviewsBefore to that exact window (e.g. "2024-01-15" / "2024-02-01"). Steam's public UI only exposes a rolling dayRange capped at 365 days (the helpfulness sort), but its review API itself accepts a real date-range filter (start_date/end_date) that this Actor sends server-side whenever reviewsAfter/reviewsBefore is set — Steam does the filtering on its end instead of us paging back from today and discarding everything outside your window, so a narrow window years back is fast even on a huge game.

I set sortBy: "all" and got way fewer reviews than expected — why? Steam silently caps its helpfulness ranking to the last 30 days if you don't also set dayRange. For a true all-time "most helpful" pull, set dayRange: 365 explicitly alongside sortBy: "all".

My search term matched a soundtrack or DLC, not the game — is that a bug? No, that's Steam's own search behaviour: storesearch returns soundtracks and some DLC as regular type: "app" results alongside the base game. If you're using searchTerms, check the name/appId in your results, or switch to apps with the exact App ID to avoid ambiguity.

Which languages can I ask for? Any Steam language code: english, schinese, tchinese, japanese, koreana, russian, german, french, spanish, latam, brazilian, polish, turkish, italian, thai, vietnamese, … or all.

What happens if a game is delisted or region-locked? The run finishes successfully with a clear status message naming the App IDs Steam returned nothing for, instead of failing. You are only charged for rows you actually receive.

Do reviews say whether they were written on Steam Deck, or when the reviewer last played? Yes — every review row includes steamDeck (true if the review was primarily written on Steam Deck) and authorLastPlayedAt (ISO timestamp of the author's last session in the game), straight from Steam's own review API.

My run returned zero reviews for a game I know has thousands. What happened? Steam's review API occasionally serves an incomplete response — HTTP 200, success: 1, but no reviews and no review totals — for hours at a time, across games and IP ranges. The Actor recognises that specific shape, retries it twice with a delay, and if Steam is still returning it, fails the run with a status message naming the upstream fault rather than quietly reporting "no reviews found". So a zero-row successful run always means your filters or the game, never a silent Steam outage — and since billing is per row, a degraded run costs you nothing. Just re-run it later.

Can I see the reviewer's PC specs? When Steam has them, yes: hardwareOs, hardwareCpu, hardwareGpu, hardwareRamMb, hardwareVramMb come straight from the reviewer's Steam Hardware Survey opt-in, attached to the review itself. It's only present on a minority of reviews (roughly 1 in 5–25, game-dependent) — everyone else gets null on all five fields, never a guess. No other Steam reviews Actor exposes this.

A row came back with fewer fields than usual, or ownersEstimate/review totals were null when they shouldn't be — could that be a transient network blip? It used to be able to. Every request to Steam and SteamSpy now retries automatically (up to 3 attempts, short backoff) on a connection-establishment fault before giving up, not just once. Before this, a single dropped connection on one of these secondary calls silently shipped that row with a missing field and only a log warning — the run still succeeded, you just got less than you paid for. A field is still null when Steam/SteamSpy genuinely has nothing to say (see the two FAQ entries above), never as a side effect of a network hiccup.


Source code: https://github.com/Fetchsmith/fetchsmith/tree/main/actors/steam-reviews-scraper More tools: fetchsmith.com · Built and maintained with AI assistance.

Engineering write-ups behind this Actor:

More tools: fetchsmith.com/tools