How it will work: 3 steps
- Follow us on ApifyThe tool is built and waits in the queue for the Apify Store. Apify is the cloud platform where our tools run.
- Paste your input and press StartNo code needed: you fill in a form (the input). It already has a working example. For example:
730in Steam app IDs. Each start is one run. - Download the resultsWhen the run ends, the results are in a table (the dataset). Open Output, press Export and pick Excel or CSV. JSON and the API are there too.
This tool is an Apify Actor: a small program that runs on Apify. You can also run it on a schedule, for example every Monday. New to it? Read how it works, step by step and the 8 words you need first.
What it does
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.
Good for
- 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 good 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
steamIdand the public review link, not names, avatars or friend lists. - Steam decides which reviews it shows. Reviews that Steam hides (for example off-topic review bombs) or deletes are not returned.
Who uses it
Game developers
Read player feedback for your game or a rival game in one table.
Publishers
Compare price, discount, genres and score of many games.
Data analysts
Build a sentiment or topic dataset in one language.
Price
Prices will be shown after release.
Questions
Do I need a Steam account or API key?
No. It 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 or avatars.
Are the numbers live?
Yes. Each run reads Steam at that moment. The fetchedAt field shows when.
Does it work with DLC or bundles?
No. It supports games from the Steam store only.
Why are the playtime numbers decimals?
Steam stores minutes. The Actor turns them into hours with one decimal place.
Details
Step by step on Apify
- Open the Input tab.
- In Steam app IDs keep the prefilled
730(Counter-Strike 2) or add your own ID. The ID is the number in the store link:store.steampowered.com/app/730/. - Keep Max reviews per game at the prefilled
20. - Click Start.
- Open the Reviews view of the output and check
recommended,textandplaytimeHours. Open Game details on the Output tab for the price and review score.
Use cases
| Task | Input | You get | Key fields | Next step |
|---|---|---|---|---|
| Find top complaints about a game | appIds, reviewType: negative, language: english | review rows | text, votesUp, playtimeHours | Topic or sentiment analysis in Sheets or an LLM |
| Check reaction to a patch | reviewsSince: "2026-10-01", sortBy: recent | review rows | recommended, createdAt | Share of positive reviews per day |
| Compare a genre | 20–100 appIds, maxReviews: 0 | game rows | price, discountPercent, genres, positivePercent | Price and score table |
| Track a competitor's sale | appIds, countryCode, scheduled | game rows | price, initialPrice, discountPercent | Alert when the discount changes |
Tips for better results
- Use the date filter to get reviews after a patch or sale.
- Pick one language to keep your dataset clean.
- Playtime is in hours with one decimal place.
Limits and good to know
- 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 the default 300-second timeout should fit roughly 24,000 reviews (an estimate from that rate; an earlier 3 games × 8,000 test on a previous version took about 170 seconds). 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_SUMMARYsaysPARTIALwith reasonDEADLINEwhen rows were saved (orERRORwhen none were). Raise the timeout or split the games for long runs - If the run reaches your maximum charge, it stops, keeps all saved rows and ends as
PARTIALwith reasonCHARGE_LIMIT - If Steam fails for one game, other games continue; the failed game gets an
errorrow and the run isPARTIALwithSOME_GAMES_FAILED
For developers
Sample result
One result from a real test run, in JSON. Real values change from run to run. In Excel or CSV each field is a column.
{
"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"
}Data fields (40)
| Field | Type | Meaning |
|---|---|---|
type | string | Row kind: review, game (details), not_found or error (free status rows). |
appId | string | Steam app ID. |
gameName | string | |
reviewId | string | |
steamId | string | Reviewer's public SteamID64 only; no names or avatars. |
recommended | boolean | |
text | string | |
language | string | |
playtimeHours | number | Hours played when the review was written. |
playtimeForeverHours | number | |
playtimeLastTwoWeeksHours | number | |
votesUp | integer | |
votesFunny | integer | |
helpfulScore | number | |
commentCount | integer | |
steamPurchase | boolean | |
receivedForFree | boolean | |
refunded | boolean | |
writtenDuringEarlyAccess | boolean | |
primarilySteamDeck | boolean | |
developerResponse | string | |
developerRespondedAt | string | |
createdAt | string | |
updatedAt | string | |
storeUrl | string | |
appType | string | |
isFree | boolean | |
price | number | Current price in currency units; 0 for free games, null when not sold in the country. |
initialPrice | number | |
currency | string | |
discountPercent | integer | |
priceFormatted | string | |
genres | array | |
categories | array | |
releaseDate | string | |
releaseDateIso | string | |
comingSoon | boolean | |
developers | array | |
publishers | array | |
platforms | array |
Input settings (10)
The main fields of the input form. With the API you send them as JSON.
| Setting | Name in the API | Type | Example value |
|---|---|---|---|
| Steam app IDs | appIds | array | ["730"] |
| Steam store URLs | gameUrls | array | |
| Max reviews per game | maxReviews | integer | 20 |
| Review language | language | string | "all" |
| Verdict | reviewType | string | "all" |
| Order | sortBy | string | "recent" |
| Only reviews since | reviewsSince | string | |
| Purchase type | purchaseType | string | "all" |
| Add game details row | includeGameDetails | boolean | true |
| Store country | countryCode | string | "us" |