Steam Reviews & Game Details Scraper — No login avatar

Steam Reviews & Game Details Scraper — No login

Pricing

from $0.28 / 1,000 reviews

Go to Apify Store
Steam Reviews & Game Details Scraper — No login

Steam Reviews & Game Details Scraper — No login

Export Steam game reviews with verdict, text, playtime, votes and date, plus price, genres, release date and review score per game. Filter by language, verdict and date. No login.

Pricing

from $0.28 / 1,000 reviews

Rating

0.0

(0)

Developer

Cliqto Media

Cliqto Media

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

6 days ago

Last modified

Categories

Share

Steam Reviews & Game Details exports Steam game reviews by app ID or store link. Each review comes with the verdict, text, language, playtime, helpful votes and date, and each game gets one row with price, genres, release date and review score.

Use it to study what players like or hate, to watch new reviews after a patch, or to compare games. The smallest run is one app ID, for example 730, and 20 reviews. No Steam login or API key is needed. That prefill run (20 reviews and one game row) costs about $0.01.

Steam Reviews & Game Details: add app IDs or store URLs, get reviews with playtime and votes, plus one game details row with price, genres, release date and review score

Table of contents

What it does

You give the Actor Steam app IDs or store links. For each game it reads the public review list of the Steam store and saves one dataset row per review. It can also save one game details row with the current store price, discount, genres, release date, developers and the whole-game review score.

You choose the review language, verdict (Recommended or Not recommended), order (newest, recently updated or most helpful), purchase type and a date period. The Actor stops at your number of reviews per game, at the end of the list, or at your maximum charge.

Good fit

  • Read player feedback for your game or a competitor's game in one table.
  • Collect only reviews written after a date, for example after a patch or sale.
  • Compare price, discount, genres and review score of many games at once.
  • Build a sentiment or topic dataset in one language.

Not a fit

  • Only the Steam store. Bundles, packages, DLC lists, workshop items and player profiles are not supported.
  • Player data stays minimal: you get the reviewer's steamId and the public review link, not names, avatars or friend lists.

👉 Try it now: open the input form

How it works

  1. The Actor reads each game's public review list from Steam's official review service, page by page, with your language, verdict, order, purchase type and date period applied by Steam.
  2. It stops a game at your review count, at the end of the list or at your start date, and asks the Steam store once per game for price, genres, release date and review score.
  3. It saves one row per review and one game row per game to the dataset, the game rows also as the GAMES record, and a RUN_SUMMARY record with the run status and a checkpoint for the next scheduled run.

👉 Try it now: open the input form

Quick start

Input form: box 1 marks the prefilled app ID 730 in Steam app IDs, box 2 the Steam store URLs field, box 3 Max reviews per game set to 20

  1. Open the Input tab. Steam app IDs already holds 730, Counter-Strike 2 (box 1 in the picture). The ID is the number in the store link: store.steampowered.com/app/730/.

  2. Keep it, or paste store links of your games into Steam store URLs (box 2).

  3. Keep Max reviews per game at the prefilled 20 (box 3), then click Start at the bottom of the form.

  4. Open the Reviews view of the output and look at the verdict, review text and hours played (box 4 in the picture below). The All rows view adds the game row with price and review score.

    Output table: box 4 marks the Recommended, Review, Language and Hours at review columns of sample review rows for Stardew Valley

Expected result: 20 review rows and 1 game row in a few seconds.

👉 Try it now: open the input form

Use cases

Buyer jobInput pathOutput entityKey fieldsNext integration
Find top complaints about a gameappIds, reviewType: negative, language: englishreview rowstext, votesUp, playtimeHoursTopic or sentiment analysis in Sheets or an LLM
Check reaction to a patchreviewsSince: "2026-10-01", reviewsUntil: "2026-10-07"review rowsrecommended, createdAtShare of positive reviews per day
Compare a genre20–100 appIds, maxReviews: 0game rowsprice, discountPercent, genres, positivePercentPrice and score table
Track a competitor's saleappIds, countryCode, scheduledgame rowsprice, initialPrice, discountPercentAlert when the discount changes

👉 Try it now: open the input form

Input

Input fields

FieldPlain nameTypeRequiredDefault / prefillAllowed valuesEffectExampleRecommendation
appIdsSteam app IDsarray of stringsone of appIds/gameUrlsnone (prefill ["730"])numbers 1–2147483647Games to read["730", "570"]Easiest way to start
gameUrlsSteam store URLsarray of URLsone of appIds/gameUrlsnonestore.steampowered.com/app/…, steamcommunity.com/app/…Same as app IDs, from links["https://store.steampowered.com/app/413150/"]Paste links when you do not know the ID
maxReviewsMax reviews per gameintegerno100 (prefill 20)0–50000Stop after this many reviews for each game. 0 = only the game row200Start small, then raise
languageReview languagestringnoallSteam names (english, russian, schinese, brazilian, koreana …) or codes (en, ru, pt-br)Only reviews written in this languageenglishSet it for text analysis
reviewTypeVerdictenumnoallall, positive, negativeOnly Recommended or only Not recommendednegativenegative to find problems fast
sortByOrderenumnorecentrecent, updated, helpfulWhich reviews come firsthelpfulrecent for monitoring, helpful for the best-known opinions
reviewsSinceOnly reviews sincestringnononedate 2026-01-31, ISO time, or period 7 days / 30dSkip older reviews2026-10-01Use with scheduled runs
reviewsUntilOnly reviews untilstringnononedate 2026-03-31 (to the end of that day UTC), ISO time, or period 30 daysSkip newer reviews2026-10-31With reviewsSince for a closed period
purchaseTypePurchase typeenumnoallall, steam, non_steam_purchaseOnly Steam buyers or only keys bought elsewheresteamKeep all unless you study key resellers
includeGameDetailsAdd game details rowbooleannotruetrue, falseOne extra row per game with price, genres and scorefalseTurn off if you need reviews only
countryCodeStore countrystringnoustwo letters, e.g. us, de, gbPrice and currency of the game rowdeGames not sold there get no game row

Add at least one app ID or game URL. Up to 100 games per run; duplicates (the same game as an ID and as a link) are processed once. An entry that is not a Steam app ID or store link (for example a bundle link) is skipped with a free error row (errorCode: INVALID_INPUT), and the other games still run; the run then ends as PARTIAL with reason SOME_INPUTS_INVALID. Only when no entry is valid does the run stop with INVALID_INPUT, and you pay only the $0.001 start fee.

Interacting settings

WhenInput AInput BEffective behaviorExampleCost/result effect
MonitoringsortBy: recentreviewsSinceStops as soon as reviews get older than the date"reviewsSince": "7 days"Fast and cheap: one review page per game when nothing is new
Best reviews of a periodsortBy: helpfulreviewsSinceSteam's most helpful reviews written in that period"reviewsSince": "2026-01-01"Charged per saved review only
Closed periodreviewsSincereviewsUntilOnly reviews created between the two times; Steam applies both"reviewsSince": "2026-10-01", "reviewsUntil": "2026-10-07"Fewer rows, so cheaper
Only the game rowmaxReviews: 0includeGameDetails: trueNo reviews, one game row per game"maxReviews": 0$0.0012 per game
Filterslanguage, reviewType, purchaseTypemaxReviewsSteam applies the filters; maxReviews counts only matching reviews"language": "english"Fewer rows when few reviews match

Input examples

Recent negative English reviews of two games

{
"appIds": ["1091500"],
"gameUrls": ["https://store.steampowered.com/app/413150/Stardew_Valley/"],
"language": "english",
"reviewType": "negative",
"maxReviews": 200
}

Expected behavior: reads the newest Not recommended English reviews of both games. Expected output: up to 200 review rows per game (recommended: false, text, playtimeHours) plus 2 game rows. Limit or cost note: up to $0.16 for 400 reviews on the Free plan, plus start, game and game-row fees.

Only game details for a list of games

{
"appIds": ["730", "570", "1245620", "1086940"],
"maxReviews": 0,
"countryCode": "de"
}

Expected behavior: no review pages, one store request per game. Expected output: 4 game rows with euro price, discountPercent and reviewScoreDesc. Limit or cost note: $0.0058 in total.

👉 Try it now: open the input form

Output

All rows go to one dataset with two views: Reviews and All rows. The game rows are also saved alone as the GAMES record in the key-value store, so you get a clean game table. Every row has type, source, url and fetchedAt.

Row typeOne row perMain fields
reviewreviewrecommended, text, language, playtimeHours, votesUp, createdAt
gamegame (when includeGameDetails is on)price, discountPercent, genres, releaseDateIso, reviewScoreDesc, positivePercent
not_foundapp ID that Steam does not knowappId, message
errorgame that failed after retries, or an entry that is not a Steam app IDappId, input, errorCode, message

Output fields

Review rows (type: "review")

FieldMeaningTypeCan be empty?Example / enumSource / notes
appIdSteam app IDstringno"730"from your input
gameNameGame namestringyes, if Steam gives no name"Counter-Strike 2"store details or review totals
reviewIdSteam review ID, stable keystringno"219989924"Steam recommendationid
steamIdReviewer's public Steam ID (64-bit)stringyes"76561198351194597"
recommendedRecommended (true) or Not recommended (false)booleannofalse
textReview text as writtenstringno (may be "")"The gameplay is nice…"Steam formatting tags kept
languageSteam language namestringyes"english"
playtimeHoursHours played when the review was writtennumberyes3097.1Steam minutes ÷ 60, one decimal
playtimeForeverHoursTotal hours played nownumberyes3108.1
playtimeLastTwoWeeksHoursHours in the last two weeksnumberyes0
votesUp"Helpful" votesintegeryes940changes over time
votesFunny"Funny" votesintegeryes57
helpfulScoreSteam helpfulness score 0–1numberyes0.91
commentCountComments under the reviewintegeryes22
steamPurchaseBought on Steambooleanyestrue
receivedForFreeGot the game for freebooleanyesfalse
refundedRefundedbooleanyesfalse
writtenDuringEarlyAccessWritten in Early Accessbooleanyesfalse
primarilySteamDeckPlayed mostly on Steam Deckbooleanyesfalse
developerResponseDeveloper's replystringyes, no replynull
developerRespondedAtReply time (ISO)stringyesnull
createdAtReview time (ISO, UTC)stringyes"2026-03-06T15:36:44.000Z"
updatedAtLast edit time (ISO, UTC)stringyes"2026-03-06T15:36:44.000Z"
urlPublic review pagestringyes"https://steamcommunity.com/profiles/…/recommended/730/"
storeUrlGame store pagestringno"https://store.steampowered.com/app/730/"
source, fetchedAtData source and fetch timestringno"steam"

Game rows (type: "game")

FieldMeaningTypeCan be empty?Example / enumSource / notes
appId, gameName, appTypeID, name, Steam typestringgameName/appType yes"730", "game"
isFreeFree to playbooleanyestrue
price, initialPriceCurrent and full price in major unitsnumberyes, if not sold17.99, 59.99store of countryCode
currencyISO currencystringyes (free games)"USD"
discountPercentCurrent discountintegeryes70
priceFormattedPrice as shown in the storestringyes"$17.99"
genres, categoriesSteam genres and featuresarrayno (may be empty)["RPG"]
releaseDateRelease date as Steam shows itstringyes"Dec 9, 2020"
releaseDateIsoSame as YYYY-MM-DD when Steam gives a full datestringyes"2020-12-09"
comingSoonNot released yetbooleanyesfalse
developers, publishers, platformsWho made it, where it runsarrayno (may be empty)["windows"]
metacriticScoreMetacritic scoreintegeryes86
recommendationsTotalSteam recommendations counterintegeryes5315663
reviewScoreSteam score 1–9integeryes8
reviewScoreDescScore labelstringyes"Very Positive"
totalPositive, totalNegative, totalReviewsWhole-game review countsintegeryes9927956
positivePercentPositive share, %numberyes85.8
requiredAgeAge limitintegeryes0
shortDescription, headerImage, websiteStore text, image and sitestringyes
countryCodeStore country used for pricestringno"us"
url, source, fetchedAtStore page, source, fetch timestringno

Issue rows (type: "not_found" or "error")

appId, gameName, input (what you entered), errorCode, message, url, source, fetchedAt. On an INVALID_INPUT row appId and url are null, because the entry was not a Steam app ID. Issue rows are not charged; each app ID the run starts costs only the $0.0002 game-processed fee.

Output entities and surfaces

SituationDataset/API/KVS/live viewResult shapeUser action
Normal itemDataset views Reviews and All rows, GAMES recordreview and game rowsOpen, export or read reviewId
Domain-empty resultDataset and RUN_SUMMARYno review rows, stopReason: end_of_reviews or since_reachedWiden filters or the date
Unknown app IDDataset, RUN_SUMMARYnot_found row, status NOT_FOUND when every ID is unknownFix the ID
Partial resultRUN_SUMMARYstatus PARTIAL with reason CHARGE_LIMIT, DEADLINE, SOME_GAMES_FAILED or SOME_INPUTS_INVALIDRead the reason and the issue rows
Technical failure or retryDataset error rows, RUN_SUMMARYerrorCode, message; saved rows keptRun the failed games again later

The RUN_SUMMARY record has the run status (COMPLETE, PARTIAL, NOT_FOUND, ERROR, INVALID_INPUT), the reason, counts, and one line per game with the number of reviews, why it stopped and newestReviewAt.

Output example

A review row (real, from the Counter-Strike 2 review list):

{
"type": "review",
"appId": "730",
"gameName": "Counter-Strike 2",
"reviewId": "219989924",
"steamId": "76561198351194597",
"recommended": false,
"text": "The gameplay is nice but the game is infested with cheaters :(",
"language": "english",
"playtimeHours": 3097.1,
"playtimeForeverHours": 3108.1,
"playtimeLastTwoWeeksHours": 0,
"votesUp": 940,
"votesFunny": 57,
"helpfulScore": 0.9106771349906921,
"commentCount": 22,
"steamPurchase": true,
"receivedForFree": false,
"refunded": false,
"writtenDuringEarlyAccess": false,
"primarilySteamDeck": false,
"developerResponse": null,
"developerRespondedAt": null,
"createdAt": "2026-03-06T15:36:44.000Z",
"updatedAt": "2026-03-06T15:36:44.000Z",
"url": "https://steamcommunity.com/profiles/76561198351194597/recommended/730/",
"storeUrl": "https://store.steampowered.com/app/730/",
"source": "steam",
"fetchedAt": "2026-10-17T11:57:22.670Z"
}

A game row (trimmed: categories and shortDescription shortened):

{
"type": "game",
"appId": "730",
"gameName": "Counter-Strike 2",
"appType": "game",
"isFree": true,
"price": 0,
"initialPrice": 0,
"currency": null,
"discountPercent": null,
"priceFormatted": "Free",
"genres": ["Action", "Free To Play"],
"categories": ["Multi-player", "Steam Workshop", "In-App Purchases"],
"releaseDate": "Aug 21, 2012",
"releaseDateIso": "2012-08-21",
"comingSoon": false,
"developers": ["Valve"],
"publishers": ["Valve"],
"platforms": ["windows", "linux"],
"metacriticScore": null,
"recommendationsTotal": 5315663,
"reviewScore": 8,
"reviewScoreDesc": "Very Positive",
"totalPositive": 8517496,
"totalNegative": 1410460,
"totalReviews": 9927956,
"positivePercent": 85.8,
"requiredAge": 0,
"shortDescription": "For over two decades, Counter-Strike has offered an elite competitive experience…",
"headerImage": "https://shared.akamai.steamstatic.com/store_item_assets/steam/apps/730/…/header.jpg",
"website": "http://counter-strike.net/",
"countryCode": "us",
"url": "https://store.steampowered.com/app/730/",
"source": "steam",
"fetchedAt": "2026-10-17T11:46:53.575Z"
}

null means Steam did not give a value (for example no Metacritic score, or no currency for a free game). 0 is a real zero. Review text is kept exactly as written, including Steam formatting tags like [b] or [spoiler]. Steam decides which reviews it shows: reviews that Steam hides (for example off-topic review bombs) or deletes are not returned.

Use case → fields

Buyer jobInput pathOutput entityKey fieldsNext integration
Sentiment datasetlanguage, maxReviewsreview rowsrecommended, textLLM or classifier
Patch monitoringsortBy: recent, reviewsSincereview rowscreatedAt, recommendedDaily chart
Price and score tablemaxReviews: 0game rowsprice, positivePercentSheets or BI

👉 Try it now: open the input form

Pricing

Pricing unit

Pay per event: you pay for each saved review and game row, plus a small start and per-game fee. Apify platform usage is included.

EventWhenPrice (USD)
Actor startonce per run; the fee is counted per GB of run memory (one fee at the default 256 MB)0.001
Game processedper app ID the run starts, also an unknown ID0.0002
Reviewper saved review0.0004 Free · 0.00036 Bronze · 0.00032 Silver · 0.00028 Gold and above
Game details rowper game row (includeGameDetails: true)0.001

A valid run with no matching reviews (a filter or a date with nothing new) costs the start fee plus $0.0002 per game, plus the game row if it is on. An unknown app ID costs only the $0.0002 game-processed fee. Issue rows (not_found, error) and entries that are not Steam app IDs are free. A failed game is never charged more than a successful one: you pay only for the rows that were saved.

Cost examples

ScenarioInput scopeExpected item/event countBase chargeOptional chargeStop/cap behavior
Prefill1 game, 20 reviews20 reviews + 1 game row$0.0102 Free, $0.0078 Goldgame row includedstops at 20
One game in depth1 game, 1,000 reviews1,000 reviews + 1 game row$0.40 Free, $0.28 Goldgame row includedstops at 1,000
Ten games10 games, 100 reviews each1,000 reviews + 10 game rows$0.41 Free, $0.29 Goldgame rows includedstops at 100 per game
Game rows only100 games, maxReviews: 0100 game rows$0.12none—
Unknown IDs100 unknown app IDs100 not_found rows$0.021noneNOT_FOUND

Set Maximum cost per run in the run options to cap a run: the Actor stops before a charge would go above it and returns what it already paid for (status PARTIAL, reason CHARGE_LIMIT).

👉 Try it now: open the input form

Limits

  • Only the Steam store: no bundles, packages, DLC lists, workshop items or player profiles. Such links are skipped with an INVALID_INPUT row.
  • Up to 100 games per run and up to 50,000 reviews per game in the input. In our tests 1,000 reviews took about 6 seconds and 5,551 reviews about 38 seconds (roughly 145 reviews per second), so at that rate the default 300-second timeout fits about 40,000 reviews (an estimate: our largest tested run saved 24,000 reviews per game); Steam rate limits can make it fewer. For more reviews, raise the run timeout or split the games over several runs.
  • Steam limits the request rate. The Actor waits between requests and slows down on rate limits, so big runs take minutes, not seconds.
  • If the run reaches its time limit, it stops about 15 seconds before the timeout and keeps all saved rows. The Apify run then shows FAILED, while RUN_SUMMARY says PARTIAL with reason DEADLINE when rows were saved (or ERROR when none were).
  • If the run reaches your maximum charge, it stops, keeps all saved rows and ends as PARTIAL with reason CHARGE_LIMIT.
  • If Steam fails for one game, other games continue; the failed game gets an error row and the run is PARTIAL with SOME_GAMES_FAILED.
  • A reviewsSince date without a time means midnight UTC, and only reviews created strictly after it are returned. A reviewsUntil date without a time means the end of that day (23:59:59 UTC), and reviews created up to it are included.
  • Steam shows brand-new reviews with a short delay (its own cache; in our tests about 10 minutes), so a review written just before a run may only appear in the next one.

👉 Try it now: open the input form

Scheduled runs: only new reviews

  1. Run once with sortBy: recent.
  2. In RUN_SUMMARY, copy newestReviewAt of the game.
  3. In the schedule input, set reviewsSince to that time.

Only reviews created strictly after reviewsSince are returned, so the checkpoint review itself does not come back and a run with no new reviews returns no review rows. Steam itself filters by creation date in recent and helpful order, so such a run reads the game details and one review page per game; in updated order the Actor checks update times and stops at the first older one. Use newestReviewAt as a checkpoint only with sortBy: recent; in helpful order it is just the newest of the returned reviews.

A review that Steam shows late (see Limits) normally comes in the next scheduled run, because it is newer than the checkpoint.

👉 Try it now: open the input form

API, export and AI agents

  • Export: the dataset downloads as JSON, CSV, Excel, XML or HTML. The Reviews view shows review columns (game and status rows appear there too; filter by type = review for a pure review table); GAMES gives the game table as JSON.
  • API: start a run with POST https://api.apify.com/v2/acts/cliqtomedia~steam-reviews/runs and the input JSON; read rows from the run's dataset.
  • Scheduling, webhooks, Make, Zapier, n8n: use the standard Apify integrations; the next system reads review rows by reviewId.

Use with AI agents (MCP)

  • MCP server with only this Actor: https://mcp.apify.com?tools=cliqtomedia/steam-reviews
  • Smallest useful input: {"appIds": ["730"], "maxReviews": 20}
  • Key output fields: recommended (true = Recommended), text (review), playtimeHours (hours played at review time), votesUp (helpful votes), createdAt (UTC time). Game rows have price, reviewScoreDesc and positivePercent.
  • The smallest run takes a few seconds and costs about $0.01; 1,000 reviews take about 6 seconds and cost $0.28–$0.40. Keep maxReviews small for quick answers.

👉 Try it now: open the input form

Troubleshooting

I got a not_found row

Symptom: no reviews and a not_found row. Likely reason: the ID is wrong, or the app has no store page (removed games, some tools and servers). Check: open store.steampowered.com/app/<id>/ in a browser. Action: fix the ID or use the store link.

I got an error row with INVALID_INPUT

Symptom: an error row with appId: null and the run is PARTIAL with SOME_INPUTS_INVALID. Likely reason: the entry is not a Steam app ID or a store link with /app/<id>/ (for example a bundle, package or profile link, or a typo). Check: the input and message of the row. Action: replace it with the app ID or the game's store link.

Fewer reviews than I asked for

Symptom: a game has fewer rows than maxReviews. Likely reason: the filters (language, reviewType, purchaseType, reviewsSince) leave fewer reviews, or Steam has no more. Check: stopReason for the game in RUN_SUMMARY (end_of_reviews, since_reached, max_reviews). Action: widen the filters.

No game row for a game

Symptom: reviews are there, the game row is missing. Likely reason: the game is not sold in countryCode. Check: detailsMissing in RUN_SUMMARY counts. Action: try us or another country.

The run ended with SOURCE_ERROR or SOME_GAMES_FAILED

Symptom: error rows for some games. Likely reason: Steam did not answer after several retries. Check: errorCode of the error rows; saved rows are kept. Action: run the failed games again later.

👉 Try it now: open the input form

FAQ

Do I need a Steam account or API key?

No. The Actor reads public Steam store data. No login, cookies or key.

Is personal data included?

Only the public steamId and the public review link. No names, avatars or profile details.

Are the numbers live?

Yes, each run reads Steam at that moment; fetchedAt shows when. Counters like votesUp and totalReviews change over time.

Why are the playtime numbers decimals?

Steam stores minutes. The Actor turns them into hours with one decimal place.

👉 Try it now: open the input form

👉 Try it now: open the input form

Support

For a bug, question or feature request, open an issue on the Actor's Issues tab. Add the run ID and your input. Never post tokens or private data.

Data comes from the official Steam Web API review service and the public Steam store (Valve Corporation). Your use of the data is subject to the Steam Web API Terms and the Steam Subscriber Agreement. Review texts belong to their authors. This Actor is not affiliated with or endorsed by Valve.

👉 Try it now: open the input form