Steam Reviews Scraper
Pricing
Pay per event
Steam Reviews Scraper
Collect public Steam reviews from multiple games with language, sentiment, and date filters-without exposing reviewer identities.
Pricing
Pay per event
Rating
0.0
(0)
Developer
OrbitData Labs
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
2 days ago
Last modified
Categories
Share
Privacy-first bulk Steam review collection with predictable cost controls.
Collect public Steam reviews from one or many games using app IDs or Steam Store URLs. Filter by language, recommendation type, sorting, and date range, set a hard result or cost limit, and export clean review, game-summary, and error records from one run. No login, no Steam API key, no browser, and no proxy by default. You are charged only for successfully stored results — never for failed runs, error records or skipped duplicates. A game with zero matching reviews stores (and charges) only its summary record, if enabled — the summary itself carries the rating data.
Why this scraper
- Full date-range filter —
dateFrom/dateTowork on the newest-first walk with inclusive day bounds, so "reviews between the last two updates" is a first-class query. - Multi-game batches — mix store URLs and app IDs in one run; one failing game never kills the others (it becomes an
errorrecord instead). - Privacy-minimal by default — no author Steam ID, username, profile URL, avatar or status is ever output. Anonymous statistics (playtime, games owned) are kept, and can be disabled too.
- Honest billing — no actor-start fee; per-review and per-summary events are charged only after the record is stored in the dataset.
Input
| Field | Default | Notes |
|---|---|---|
games (required) | — | Steam store URLs (https://store.steampowered.com/app/1245620/...) or app IDs ("1245620"), mixed freely |
maxReviewsPerGame | 1000 | per-game cap |
maxTotalReviews | 10000 | whole-run cap |
languages | ["all"] | Steam language codes (english, koreana, japanese, …) |
reviewType | all | all / positive / negative |
sortBy | recent | recent (newest first) or helpful |
dateFrom, dateTo | — | YYYY-MM-DD, UTC, both inclusive. Requires sortBy: "recent" |
purchaseType | all | all / steam / non_steam_purchase |
includeGameSummary | true | one game_summary record per game |
includePlaytimeStats | true | anonymous reviewer statistics on each review |
debugLog | false | one diagnostic log line per fetched page (anonymized cursor hashes) |
proxyConfiguration | off | Steam usually needs no proxy; enable datacenter proxies only if you see blocking |
Example 1 — simplest possible run
{ "games": ["https://store.steampowered.com/app/1245620/ELDEN_RING/"] }
Example 2 — multiple games, negative Korean/English reviews only
{"games": ["1245620", "570"],"languages": ["english", "koreana"],"reviewType": "negative","maxReviewsPerGame": 500}
Example 3 — reviews between two game updates
{"games": ["1245620"],"sortBy": "recent","dateFrom": "2026-06-01","dateTo": "2026-06-30"}
Example 4 — daily rating tracking with minimal review collection
{"games": ["1245620", "570", "730"],"maxReviewsPerGame": 1,"includeGameSummary": true}
You pay for 1 review + 1 summary per game and get each game's current review score, totals and positive/negative counts in the game_summary records.
Output
All records go to the default dataset with a recordType discriminator: review, game_summary, error. To export only reviews as CSV, filter recordType = review in the export dialog (or in your integration).
review record (flat, CSV-friendly)
{"recordType": "review","appId": 1245620,"gameName": "ELDEN RING","reviewId": "1234500001","reviewText": "Synthetic sample review written for this documentation — it does not quote any real Steam user.","language": "english","votedUp": true,"votesUp": 12,"votesFunny": 0,"weightedVoteScore": 0.65,"commentCount": 0,"steamPurchase": true,"receivedForFree": false,"writtenDuringEarlyAccess": false,"refunded": false,"primarilySteamDeck": false,"createdAt": "2026-08-22T09:15:14.000Z","updatedAt": null,"developerResponse": null,"developerRespondedAt": null,"playtimeForeverMinutes": 8123,"playtimeAtReviewMinutes": 6210,"playtimeLast2WeeksMinutes": 340,"lastPlayedAt": "2026-08-20T18:02:11.000Z","authorNumGamesOwned": 42,"authorNumReviews": 7}
game_summary record
Per game: reviewScore, reviewScoreDesc, totalReviews, totalPositive, totalNegative (as reported by Steam for your applied filters — a languages filter changes the totals), plus collectedReviews, duplicatesSkipped, stoppedReason and the filters used.
error record
Per failed input: errorType (INVALID_INPUT, NOT_FOUND_OR_UNAVAILABLE, BLOCKED, HTTP_ERROR), message, httpStatus. Error records are never charged.
Pricing (pay per event)
| Event | Price |
|---|---|
| Review stored | $0.00065 |
| Game summary stored | $0.002 |
| Actor start | free |
Reviews cost $0.00065 each and stored game summaries cost $0.002 each. There is no start fee. Empty results and error records are not charged.
| Run | Cost |
|---|---|
| 100 reviews + 1 summary | $0.067 |
| 1,000 reviews + 1 summary | $0.652 |
| 10,000 reviews + 1 summary | $6.502 |
| 100,000 reviews + 1 summary | $65.002 |
| 10 games x 1,000 reviews + 10 summaries | $6.52 |
Upper bound for any run: maxTotalReviews x $0.00065 + games x $0.002.
Set a maximum cost per run in the Apify UI; the actor stops gracefully at the limit and reports exactly how many results were stored and charged. If storage and billing ever disagree, the run reports an explicit WARNING in its status — never a silent success.
FAQ
Why is there no author information?
This Actor intentionally excludes direct reviewer identifiers such as Steam ID, persona name, profile URL, avatar, and persona status. Public non-identifying review statistics, including playtime and purchase flags, may still be included when Steam returns them. reviewId is the review's own public identifier (needed for deduplication); it is not an author identifier, though the review it points to is public on Steam.
What do the summary totals mean?
They are Steam's totals for your applied filters at scrape time — e.g. with languages: ["koreana"] you get Korean-review totals.
Are review bombs included?
Yes — off-topic review activity is included (filter_offtopic_activity=0), because complete data matters for analysis. Deduplication is by reviewId.
Which games work?
Anything with public reviews — including delisted games that still have review pages (their gameName may be null). Age-gated games work without cookies. Invalid IDs and games with no data produce error records, not charges.
Limits & fairness Requests are rate-limited (~2.5 req/s max) with exponential backoff on errors; sustained blocking aborts the run gracefully with everything collected so far intact. You are responsible for complying with Steam's Terms of Service, GDPR and applicable laws when using extracted data.