Steam Scraper avatar

Steam Scraper

Pricing

from $0.00005 / actor start

Go to Apify Store
Steam Scraper

Steam Scraper

Scrape Steam game listings, details, pricing, reviews, news, media, developer info, and similar games. Supports pagination, search, and flexible per-game data collection.

Pricing

from $0.00005 / actor start

Rating

5.0

(4)

Developer

Salman Asu

Salman Asu

Maintained by Community

Actor stats

4

Bookmarked

2

Total users

1

Monthly active users

a day ago

Last modified

Share

Steam Game Scraper — Apify Actor

Scrape Steam game data without any API key. Six focused modes cover everything from lightweight catalog browsing to deep per-game extraction of pricing, reviews, news, media, developer info, and similar games.


Table of contents


Modes

The mode field controls everything. Each mode pre-configures which sections are enabled — no need to toggle individual flags.

ModePaginates catalogDeep-scrapes gamesSections enabled
list-liteyesnoid, name, price, discount, image, release date
list-fullyesyesall sections
specificnoyesall sections
reviewnoyesreviews only
newsnoyesnews only
medianoyesscreenshots, videos, artwork, broadcasts
searchnonokeyword search results

list-lite — fastest and cheapest. Paginates Steam's popular new catalog and saves one lightweight record per game. Good for price monitoring or collecting IDs to pass into other modes.

list-full — paginates the catalog then deep-scrapes every game found. Heavy on compute units. Use maxPages to control scope.

specific — deep-scrapes a list of gameIds you provide with all sections enabled. The most common production mode.

review — scrapes only reviews for the given gameIds. Fast and cheap per game. Supports sentiment filtering (positive / negative / all) and seven sort categories.

news — scrapes only news and announcements for the given gameIds. Works well as a scheduled daily run.

media — scrapes only screenshots, videos, artwork, and broadcasts for the given gameIds. Useful for content pipelines.

search — searches Steam by keyword using the suggest API and returns matching games with id, name, price, and image.

Advanced: you can override any individual section flag on top of a mode preset. For example, mode: "review" with "includeMedia": true added will scrape both reviews and media.


Input parameters

{
"mode": "list-lite",
"gameIds": [],
"searchQuery": "",
"startPage": 1,
"maxPages": 5,
"currency": "US",
"language": "english",
"reviewCategory": "toprated",
"reviewType": "all",
"newsCategory": "all",
"reviewsLimit": 10,
"newsLimit": 10,
"mediaLimit": 10,
"proxyConfiguration": { "useApifyProxy": true }
}
ParameterTypeDefaultUsed in modesDescription
modestringlist-liteallScraping mode. See table above.
gameIdsarray[]specific, review, news, mediaSteam App IDs. Example: [570, 730, 1091500]
searchQuerystring""searchKeyword to search for
startPageinteger1list-lite, list-fullCatalog page to start from (1-based)
maxPagesinteger5list-lite, list-fullNumber of catalog pages to scrape. Each page returns ~50 games
currencystringUSallUS for USD ($) or IN for INR (₹)
languagestringenglishspecific, list-full, review, newsLanguage for reviews and news
reviewCategorystringtopratedreview, specific, list-fullHow to sort reviews
reviewTypestringallreview, specific, list-fullSentiment filter for reviews
newsCategorystringallnews, specific, list-fullType of news to fetch
reviewsLimitinteger10review, specific, list-fullMax reviews per game (1–100)
newsLimitinteger10news, specific, list-fullMax news items per game (1–100)
mediaLimitinteger10media, specific, list-fullMax items per media type per game (1–50)
proxyConfigurationobject{}allApify proxy config. Recommended for runs over 500 games

language values

english spanish french german portuguese russian japanese koreana schinese tchinese

reviewCategory values

toprated mostrecent trendday trendweek trendmonth trendyear funny

reviewType values

all positive negative

newsCategory values

all announcements syndicated


Example inputs

Scrape catalog, basic info only (list-lite)

{
"mode": "list-lite",
"startPage": 1,
"maxPages": 10,
"currency": "US"
}

Full deep-scrape of 3 specific games (specific)

{
"mode": "specific",
"gameIds": [570, 730, 1091500],
"currency": "US",
"language": "english",
"reviewCategory": "toprated",
"reviewType": "all",
"newsCategory": "announcements",
"reviewsLimit": 20,
"newsLimit": 10,
"mediaLimit": 15
}

Negative reviews only, in German (review)

{
"mode": "review",
"gameIds": [730, 570],
"language": "german",
"reviewType": "negative",
"reviewCategory": "mostrecent",
"reviewsLimit": 50
}

Daily news run (news)

{
"mode": "news",
"gameIds": [570, 730, 1172470, 1091500],
"newsCategory": "announcements",
"newsLimit": 5,
"language": "english"
}

Pull media assets for a game (media)

{
"mode": "media",
"gameIds": [1091500],
"mediaLimit": 30
}
{
"mode": "search",
"searchQuery": "open world rpg",
"currency": "US"
}

Full catalog + deep scrape (list-full, small run)

{
"mode": "list-full",
"startPage": 1,
"maxPages": 2,
"currency": "US",
"reviewsLimit": 5,
"newsLimit": 5,
"mediaLimit": 5,
"proxyConfiguration": { "useApifyProxy": true }
}

Output schema

Every dataset record contains _type and _mode fields that identify which mode produced it. Records from deep-scrape modes also always include the core game fields (name, description, pricing, etc.) plus whichever section fields the mode enables.


list-lite record

Produced by list-lite mode. One record per game per page.

{
"_type": "list-lite",
"_mode": "list-lite",
"page": 1,
"id": "1091500",
"name": "Cyberpunk 2077",
"releaseDate": "10 Dec, 2020",
"image": "https://cdn.cloudflare.steamstatic.com/steam/apps/1091500/capsule_sm_120.jpg",
"price": "$29.99",
"originalPrice": "$59.99",
"discount": "-50%",
"steamUrl": "https://store.steampowered.com/app/1091500/"
}

originalPrice and discount are only present when the game is on sale.


Core game fields

All deep-scrape modes (specific, list-full, review, news, media) always fetch the core game page and produce these fields. Section-specific fields appear alongside these.

{
"_type": "specific",
"_mode": "specific",
"gameId": "570",
"scrapedAt": "2025-05-13T08:00:00.000Z",
"name": "Dota 2",
"steamUrl": "https://store.steampowered.com/app/570/",
"description": "Every day, millions of players worldwide enter battle as one of over a hundred Dota heroes.",
"releaseDate": "9 Jul, 2013",
"headerImage": "https://cdn.akamai.steamstatic.com/steam/apps/570/header.jpg",
"reviewSummary": "Overwhelmingly Positive",
"genres": ["Free to Play", "Strategy"],
"tags": ["Free to Play", "MOBA", "Strategy", "Multiplayer", "Team-Based", "Competitive"],
"languages": ["English", "French", "German", "Spanish", "Portuguese", "Russian", "Japanese"],
"developer": ["Valve"],
"publisher": ["Valve"],
"franchise": [],
"pricing": [
{
"packageTitle": "Dota 2",
"discount": "0%",
"originalPrice": "Free",
"discountPrice": "Free"
}
],
"externalLinks": [
{ "name": "website", "link": "https://www.dota2.com" },
{ "name": "X", "link": "https://x.com/DOTA2" },
{ "name": "YouTube", "link": "https://youtube.com/@dota2" }
],
"systemRequirements": {
"win": {
"minimum": {
"OS": "Windows 7",
"Processor": "Dual core from Intel or AMD at 2.8 GHz",
"Memory": "4 GB RAM",
"Graphics": "nVidia GeForce 8600/9600GT",
"Storage": "15 GB available space"
},
"recommended": {
"OS": "Windows 10",
"Processor": "Intel Core i5 at 3.0 GHz",
"Memory": "8 GB RAM",
"Graphics": "nVidia GeForce GTX 970",
"Storage": "15 GB available space"
}
},
"linux": {
"minimum": { "Storage": "15 GB available space" },
"recommended": {}
}
},
"aboutGame": "Dota is a competitive game of action and strategy, played both professionally and casually..."
}

systemRequirements contains keys win, linux, and/or mac depending on what Steam lists. Each has minimum and recommended objects whose keys are the requirement label (OS, Processor, Memory, etc.).


devInfo section

Present on specific and list-full records.

"devInfo": {
"developer": ["Valve"],
"publisher": ["Valve"],
"franchise": []
}

media section

Present on media, specific, and list-full records.

"media": {
"screenshots": [
{
"url": "https://steamcommunity.com/sharedfiles/.../116x65.jpg",
"fullUrl": "https://steamcommunity.com/sharedfiles/.../1920x1080.jpg"
}
],
"videos": [
{
"youtubeId": "dqRTiAMiCKg",
"youtubeUrl": "https://www.youtube.com/watch?v=dqRTiAMiCKg",
"thumbnail": "https://i.ytimg.com/vi/dqRTiAMiCKg/hqdefault.jpg"
}
],
"artwork": [
{
"url": "https://steamcommunity.com/sharedfiles/.../artwork.jpg"
}
],
"broadcasts": [
{
"broadcastUrl": "https://steamcommunity.com/broadcast/watch/...",
"thumbnail": "https://steamcommunity.com/broadcast/..."
}
]
}

Each array is capped at mediaLimit. fullUrl on screenshots is the original high-res version derived by replacing the thumbnail dimensions in the URL.


reviews section

Present on review, specific, and list-full records.

"reviews": {
"reviews": [
{
"reviewId": "someusername_570",
"title": "Recommended",
"content": "Best MOBA out there. The learning curve is steep but absolutely worth it.",
"date": "Posted: 10 January",
"userName": "SteamPlayer123",
"userProfile": "https://avatars.steamstatic.com/abc123_full.jpg"
}
],
"category": "toprated",
"type": "all",
"language": "english",
"limit": 10,
"offset": 0,
"total": 10
}

reviewId is {username}_{gameId} derived from the review URL. userProfile is always the full-size avatar (suffix _full.jpg).


news section

Present on news, specific, and list-full records.

"news": {
"news": [
{
"title": "Dota 2 Update — The Crownfall Act IV",
"date": "8 Jan",
"content": "Crownfall Act IV is now live. New hero Ringmaster has been added to the roster...",
"likes": "2.4k",
"category": "announcements"
}
],
"category": "announcements",
"language": "english",
"limit": 10,
"offset": 0,
"total": 10
}

similarGames section

Present on specific and list-full records.

"similarGames": {
"similarGames": [
{
"id": "1046930",
"name": "Dota Underlords",
"price": "Free to Play",
"image": "https://cdn.cloudflare.steamstatic.com/steam/apps/1046930/capsule_sm_120.jpg",
"steamUrl": "https://store.steampowered.com/app/1046930/"
}
],
"total": 8
}

search record

Produced by search mode. One record per result.

{
"_type": "search",
"_mode": "search",
"query": "open world rpg",
"id": "1091500",
"name": "Cyberpunk 2077",
"image": "https://cdn.cloudflare.steamstatic.com/steam/apps/1091500/capsule_sm_120.jpg",
"price": "$29.99",
"steamUrl": "https://store.steampowered.com/app/1091500/"
}

Error fields

When a section fails for a game, the actor logs the error and saves an error field instead of skipping the record entirely. The run continues.

FieldWhen present
detailsErrorCore game page failed to load
devInfoErrorDeveloper info section failed
mediaErrorMedia section failed
reviewsErrorReviews section failed
newsErrorNews section failed
similarGamesErrorSimilar games section failed

Project structure

steam-game-scraper/
├── .actor/
│ ├── actor.json # Actor name, version, dataset table view
│ └── INPUT_SCHEMA.json # Input form rendered in Apify console
├── src/
│ ├── main.js # Entry point — mode presets, orchestration
│ │
│ ├── scrapers/
│ │ ├── gameList.js # Catalog pagination (50/page, JSON response)
│ │ ├── gameDetails.js # Full store page — all core fields
│ │ ├── gameMedia.js # Screenshots, videos, artwork, broadcasts
│ │ ├── gameReviews.js # Reviews with sentiment + sort filtering
│ │ ├── gameNews.js # News and announcements
│ │ ├── devInfo.js # Developer, publisher, franchise
│ │ ├── similarGames.js # More Like This recommendations
│ │ └── search.js # Keyword search via Steam suggest API
│ │
│ └── utils/
│ ├── http.js # All Steam URLs + Axios client (cookies, retry, backoff)
│ └── logger.js # Console logger
├── apify_storage/ # Local dev storage — gitignored
│ └── key_value_stores/default/INPUT.json
├── Dockerfile
├── package.json
├── .gitignore
└── README.md

URL source of truth

All Steam endpoint URLs are defined in src/utils/http.js under the URLS object, mapped exactly from the project .env. The appHubSubSection values used for the /homecontent/ endpoint are:

SectionappHubSubSection
Screenshots2
Videos3
Artwork4
Workshop6
Official announcements8
Guides9
All reviews10
Broadcasts13
All news14
Positive reviews16
Negative reviews17

Run locally

# Install dependencies
npm install
# Install Apify CLI (once)
npm install -g apify-cli
# Login
apify login
# Edit test input
nano apify_storage/key_value_stores/default/INPUT.json
# Run
npm run start:dev

Output saves to apify_storage/datasets/default/.


Publish to Apify

$apify push

Then in Apify Console → your actor → Publication tab:

  1. Set title, description, and categories (Web Scraping, Gaming)
  2. Upload a cover image
  3. Set pricing tiers
  4. Click Publish to Store

Rate limiting and proxy

Built-in protections:

  • 1200ms delay between games in all deep-scrape modes
  • 400ms delay between pagination requests within each scraper
  • 3× retry with exponential backoff (1.5s → 3s → 4.5s) on failed requests
  • Steam age-gate bypass via birthtime cookie on every request
  • 404 responses are not retried — the game is skipped and the run continues

For runs over 500 games, enable proxy:

{
"proxyConfiguration": {
"useApifyProxy": true,
"apifyProxyGroups": ["RESIDENTIAL"]
}
}