
Website Content Crawler
scrape.ly/store/querystone/website-content-crawlerAIDeveloper tools
1 monthly user

Scrape public Steam game reviews by app ID, store URL or game name. Filter by language, sentiment, purchase type, date and playtime; get text, votes, playtime and Steam review scores.
Scrape public Steam game reviews in seconds: review text, recommendation, helpful and funny votes, playtime, language, purchase type and Steam's review score. Paste app IDs, store URLs or just game names, pick your filters, and export clean rows to JSON, CSV or Excel. No Steam account, no API key, and a low price per review.
730), store or community URLs, or plain game names that are resolved through Steam search.| Field | What it does |
|---|---|
games | App IDs, store or community URLs, or game names |
maxReviewsPerGame | Reviews per game (default 20, 0 = all) |
sort | recent, updated or helpful |
languages | Steam languages such as english, german, schinese (empty = all) |
reviewType | all, positive or negative |
purchaseType | all, steam or non_steam_purchase |
startDate / endDate | Posted between these dates (YYYY-MM-DD, UTC) |
dayRange | Only the last N days |
minPlaytimeHours / maxPlaytimeHours | Reviewer's playtime when the review was written |
includeGameInfo | Attach store details to every review |
includeSummary | Add one free summary row per game |
{
"games": ["730", "https://store.steampowered.com/app/1145360/Hades/", "Elden Ring"],
"maxReviewsPerGame": 100,
"sort": "recent",
"languages": ["english"],
"reviewType": "negative",
"dayRange": 30,
"includeSummary": true
}
One row per review (type: "review"), plus one row per game (type: "summary") when summary rows are on.
| Field | Description |
|---|---|
appId, gameName, gameUrl | The game |
reviewId, reviewUrl | The review and its Steam Community link |
steamId, authorName, authorProfileUrl, authorAvatarUrl | Public reviewer profile |
review, language | Review text (Steam BBCode) and language |
positive, sentiment | Recommended or not |
votesUp, votesFunny, commentCount, score | Engagement and Steam's helpfulness score |
createdAt, updatedAt | Posted and edited times (ISO 8601) |
playtimeForeverMinutes, playtimeAtReviewMinutes, playtimeLastTwoWeeksMinutes, playtimeDeckMinutes | Playtime |
gamesOwned, totalReviewsByAuthor, authorLastPlayedAt | Reviewer activity |
steamPurchase, receivedForFree, refunded, earlyAccess, steamDeck | Flags |
developerResponse, developerRespondedAt | Developer reply, when there is one |
gameInfo | Genres, developers, publishers, price, release date, Metacritic score, review score (optional) |
Example review row (sample data):
{
"type": "review",
"appId": 1145360,
"gameName": "Hades",
"reviewId": "170000001",
"reviewUrl": "https://steamcommunity.com/profiles/76561190000000001/recommended/1145360/?recommendationid=170000001",
"gameUrl": "https://store.steampowered.com/app/1145360",
"steamId": "76561190000000001",
"authorName": "SampleReviewer",
"authorProfileUrl": "https://steamcommunity.com/profiles/76561190000000001",
"authorAvatarUrl": "https://avatars.steamstatic.com/0000000000000000000000000000000000000000_full.jpg",
"authorLastPlayedAt": "2026-09-30T20:15:00.000Z",
"language": "english",
"review": "Tight combat, great music and every run feels different. Easy recommendation.",
"positive": true,
"sentiment": "positive",
"score": 0.54,
"votesUp": 12,
"votesFunny": 1,
"commentCount": 0,
"createdAt": "2026-09-28T18:02:11.000Z",
"updatedAt": "2026-09-28T18:02:11.000Z",
"playtimeForeverMinutes": 2410,
"playtimeAtReviewMinutes": 2275,
"playtimeLastTwoWeeksMinutes": 340,
"playtimeDeckMinutes": null,
"gamesOwned": 214,
"totalReviewsByAuthor": 9,
"steamPurchase": true,
"receivedForFree": false,
"refunded": false,
"earlyAccess": false,
"steamDeck": false,
"developerResponse": null,
"developerRespondedAt": null,
"inputSource": "https://store.steampowered.com/app/1145360/Hades/"
}
Example summary row:
{
"type": "summary",
"appId": 1245620,
"gameName": "ELDEN RING",
"gameUrl": "https://store.steampowered.com/app/1245620",
"reviewScore": 8,
"reviewScoreDesc": "Very Positive",
"totalPositive": 1078237,
"totalNegative": 80562,
"totalReviews": 1158799,
"positiveRatio": 0.9305,
"reviewsScraped": 10,
"filters": {"language": "all", "reviewType": "all", "purchaseType": "all", "sort": "recent", "startDate": null, "endDate": null, "minPlaytimeHours": null, "maxPlaytimeHours": null},
"inputSource": "Elden Ring"
}
You pay $0.40 per 1,000 reviews ($0.0004 per review), plus a small amount of platform usage (compute and datacenter proxy traffic). Summary rows are free.
Worked example: 1,000 reviews cost $0.40 in review fees plus roughly a tenth of a cent of platform usage.
Is it legal to scrape Steam reviews? The actor reads only public reviews that anyone can open on the Steam store without logging in. You are responsible for how you use the data, including personal data rules such as GDPR for reviewer names and profile links.
Do I need a Steam account or a proxy? No account. Datacenter proxies are the default and work well; the actor switches to residential proxies on its own if datacenter addresses are refused.
How many reviews can I get? Every review Steam lists for your filters. Popular games have millions; set maxReviewsPerGame to 0 to read them all, or a number to cap the cost.
Why are some fields empty? Steam only fills developerResponse, playtimeDeckMinutes and some reviewer stats when they exist or when the reviewer's profile makes them public.
What if a game name matches the wrong game? Names go through Steam's store search and the exact title wins. For full control, use the app ID or store URL.
Can I schedule it or use the API? Yes. Schedule runs to monitor new reviews daily, and read results through the API or integrations.
[h1] and [spoiler].gameInfo) come from the US store in English.Every field below can be set in the run form, passed through the API, or saved as a task. Unset fields fall back to the defaults shown.
gamesarrayOptionalGames
Steam app IDs (730), store or community URLs (https://store.steampowered.com/app/1245620/ELDEN_RING/) or game names (Elden Ring). Names are matched with Steam's store search.
maxReviewsPerGameintegerOptionaldefault 20Max reviews per game
Stop after this many reviews for each game. 0 reads every review that matches the filters.
Steam applies these filters on its side, so you only pay for matching reviews.
sortenumOptionaldefault "recent"Sort order
Most recent first, recently updated first, or most helpful first (all time, or inside the date range).
languagesarrayOptionaldefault []Languages
Only reviews written in these languages. Leave empty for all languages.
reviewTypeenumOptionaldefault "all"Review type
Recommended (positive), not recommended (negative), or both.
purchaseTypeenumOptionaldefault "all"Purchase type
Reviews from players who bought the game on Steam, got it elsewhere (keys, gifts), or both.
startDatestringOptionalPosted from
Only reviews posted on or after this date (YYYY-MM-DD, UTC).
endDatestringOptionalPosted until
Only reviews posted on or before this date (YYYY-MM-DD, UTC).
dayRangeintegerOptionaldefault 0Last N days
Shortcut for a rolling window: only reviews from the last N days. 0 turns it off. Combined with 'Posted from', the later start wins.
minPlaytimeHoursintegerOptionaldefault 0Min playtime (hours)
Only reviewers with at least this many hours in the game when they wrote the review. 0 turns it off.
maxPlaytimeHoursintegerOptionaldefault 0Max playtime (hours)
Only reviewers with at most this many hours in the game when they wrote the review. 0 means no upper limit.
includeGameInfobooleanOptionaldefault falseAdd game details to each review
Attach the game's store details (genres, developers, publishers, price, release date, Metacritic score, review score) to every review row.
includeSummarybooleanOptionaldefault falseAdd a summary row per game
Add one row per game with type 'summary': Steam's review score and total positive and negative counts for your filters. Summary rows are free.
proxyConfigurationobjectOptionaldefault {"useScrapelyProxy":true,"scrapelyProxyGroups":["DATACENTER…Proxy configuration
Datacenter proxies work well for Steam. The actor switches to residential automatically if datacenter addresses are refused.
Every run writes its results to a dataset. Preview it in the dashboard, then export it or read it through the API.
| Field | Type | Description |
|---|---|---|
| type | string | null | Row type: review or summary |
| appId | integer | null | Steam app ID |
| gameName | string | null | Game name |
| reviewId | string | null | Steam recommendation ID |
| reviewUrl | string | null | Review URL on Steam Community |
| gameUrl | string | null | Steam store URL |
| steamId | string | null | Reviewer SteamID64 |
| authorName | string | null | Reviewer display name |
| authorProfileUrl | string | null | Reviewer profile URL |
| authorAvatarUrl | string | null | Reviewer avatar URL |
| authorLastPlayedAt | string | null | When the reviewer last played (ISO 8601) |
| language | string | null | Steam language code |
| review | string | null | Review text (Steam BBCode) |
| positive | boolean | null | True when the reviewer recommends the game |
| sentiment | string | null | positive or negative |
| score | number | null | Steam's weighted helpfulness score |
| votesUp | integer | null | Helpful votes |
| votesFunny | integer | null | Funny votes |
| commentCount | integer | null | Comments on the review |
| createdAt | string | null | Posted at (ISO 8601) |
| updatedAt | string | null | Last edited at (ISO 8601) |
| playtimeForeverMinutes | integer | null | Reviewer's total playtime in minutes |
| playtimeAtReviewMinutes | integer | null | Playtime when the review was written, in minutes |
| playtimeLastTwoWeeksMinutes | integer | null | Playtime in the last two weeks, in minutes |
| playtimeDeckMinutes | integer | null | Steam Deck playtime at review time, in minutes |
| gamesOwned | integer | null | Games the reviewer owns |
| totalReviewsByAuthor | integer | null | Reviews the reviewer has written |
| steamPurchase | boolean | null | Bought on Steam |
| receivedForFree | boolean | null | Got the game for free |
| refunded | boolean | null | Reviewer refunded the game |
| earlyAccess | boolean | null | Written during Early Access |
| steamDeck | boolean | null | Played mainly on Steam Deck |
| developerResponse | string | null | Developer's reply, if any |
| developerRespondedAt | string | null | Developer reply time (ISO 8601) |
| gameInfo | object | null | Store details when 'Add game details' is on |
| reviewScoreDesc | string | null | Summary rows: Steam review score label |
| totalPositive | integer | null | Summary rows: positive reviews for the filters |
| totalNegative | integer | null | Summary rows: negative reviews for the filters |
| totalReviews | integer | null | Summary rows: total reviews for the filters |
| positiveRatio | number | null | Summary rows: share of positive reviews |
| reviewsScraped | integer | null | Summary rows: reviews saved in this run |
| inputSource | string | null | The input this row came from |
You pay for the events the actor reports, such as each result or page it produces. Platform usage is included in the event prices.
| Event | Charged when | Price |
|---|---|---|
| Review | One saved Steam review. | $0.0004 |
Run this actor from your own code. Swap in your API token and the examples work as-is.
import { ScrapelyClient } from 'scrapely-client'
const client = new ScrapelyClient({ token: process.env.SCRAPELY_TOKEN })
// Start the actor and wait for the run to finish.
const run = await client.actor('shelfbright/steam-reviews-scraper').call({
"games": [
"730",
"https://store.steampowered.com/app/1145360/Hades/",
"Elden Ring"
],
"maxReviewsPerGame": 20,
"proxyConfiguration": {
"useScrapelyProxy": true,
"scrapelyProxyGroups": [
"DATACENTER"
]
}
})
// Read the dataset the run produced.
const { items } = await client.dataset(run.defaultDatasetId).listItems()
console.log(items)Tokens live in your account settings. Keep them server-side: a token carries the full permissions of your account.
Connect the Scrape.ly MCP server once and your agent can run this actor as a tool. Pick your tool:
Fetch scrape.ly/agents.md and run shelfbright/steam-reviews-scraperPaste into Claude Code, Codex, Cursor or any AI agent. It signs you in once in the browser.
{
"mcpServers": {
"scrapely": {
"url": "https://api.scrape.ly/mcp?tools=actors,runs,storage,docs&actors=shelfbright/steam-reviews-scraper"
}
}
}No key in the file: your client opens the browser to sign you in the first time it connects.
Inputs the developer prepared for common jobs. Open one to see its input, then copy it to your account to run it as-is or adjust it.
Negative English reviews with game info and a review summary.
Reviews found by game name within a date range.
Newest reviews from players with 10+ hours played.
Scrape.ly gives you the infrastructure, the tooling, and the team to extract, process, and operationalize web data at any scale. Setup takes minutes. The advantage lasts forever.