Steam Store Scraper
Pricing
from $0.79 / 1,000 game (http api)s
Steam Store Scraper
Scrape Steam games: metadata, multi-country prices, reviews and more.
Pricing
from $0.79 / 1,000 game (http api)s
Rating
0.0
(0)
Developer
Unfenced Group
Maintained by CommunityActor stats
1
Bookmarked
2
Total users
2
Monthly active users
2.8 hours
Issues response
20 days ago
Last modified
Categories
Features
Share

Extract games from store.steampowered.com at scale, in a clean, consistent structure ready for price monitoring, market research, catalogue analysis and resale tooling. No API key required.
Why this scraper?
🎯 Built for store.steampowered.com
A dedicated global scraper tuned for store.steampowered.com — its categories, price formats and currency (USD), not a generic tool pointed at it.
📄 Full item content
Complete description and title for every record, with a direct link back to the source.
Input parameters
| Parameter | Type | Default | Description |
|---|---|---|---|
searchTerms | array | ["elden ring"] | Keywords to search the Steam store (e.g. "elden ring", "roguelike"). Each term is searched and the matching games are scraped. |
browseSection | string | "none" | Instead of (or in addition to) keywords, pull games from a Steam storefront section. |
startUrls | array | (empty) | Direct Steam app URLs (e.g. https://store.steampowered.com/app/1245620/). App IDs are extracted automatically. |
appIds | array | (empty) | Steam numeric app IDs to scrape directly (e.g. 1245620). |
maxResults | integer | 5 | Maximum number of games to scrape. |
country | string | "us" | Storefront whose local currency prices are returned. Used when no multi-country selection is made. |
countries | array | (empty) | Select several storefronts to get each game's price in every chosen currency in a single run. The first selected country is the primary store. |
allCountries | boolean | false | Fetch every supported storefront's price for each game in one run (44 currencies). Overrides the country selections. |
language | string | "en" | Language for game name, description and supported-languages text. |
includeReviews | boolean | true | Add aggregate review score, sentiment label, total/positive/negative counts and positive %. |
includeDescription | boolean | true | Add short + full description as HTML, plain text and clean Markdown (LLM-ready). |
includeMedia | boolean | true | Add screenshots and trailer/video URLs. |
includeSteamSpy | boolean | false | Add owner estimate, concurrent players (CCU), average playtime and community tags from SteamSpy. |
platforms | array | (empty) | Keep only games supporting any selected OS. |
priceFilter | string | "all" | Keep only games matching this price status. |
minPrice | integer | (empty) | Minimum price (in the primary currency's major units) based on the lowest selected-country price. |
maxPrice | integer | (empty) | Maximum price (in the primary currency's major units) based on the lowest selected-country price. |
minMetacritic | integer | (empty) | Keep only games with a Metacritic score at or above this value. Games without a score are kept. |
minReviewScore | integer | (empty) | Steam review score band (0=none … 9=Overwhelmingly Positive). Requires reviews enabled. |
minPositivePercent | integer | (empty) | Keep only games whose positive review share is at or above this percentage. Requires reviews enabled. |
genres | array | (empty) | Keep only games matching any of these genres (substring match, case-insensitive). |
releasedAfter | string | (empty) | Keep only games released on/after this date (YYYY-MM-DD). Undated games are kept. |
releasedBefore | string | (empty) | Keep only games released on/before this date (YYYY-MM-DD). Undated games are kept. |
Output schema
Every field below is present on every record. Fields the source does not publish for a given item are returned as null rather than omitted.
| Field | Type | Description |
|---|---|---|
appId | number | Steam app ID |
name | string | Game title |
type | string | game, dlc, demo, etc. |
url | string | Steam store page |
primaryCountry | string | Primary country. |
isFree | boolean | Free-to-play |
comingSoon | boolean | Unreleased |
releaseDate | string | Release date |
requiredAge | number | Minimum age |
developers | array | Developers. |
publishers | array | Publishers. |
genres | array | Filter: genres |
categories | array | Categories. |
platforms | array | windows / mac / linux |
controllerSupport | string | Controller level |
currency | string | Primary-country currency |
initialPrice | number | Initial price. |
finalPrice | number | Final price. |
discountPercent | number | Discount on primary store |
isOnSale | boolean | On sale in primary store |
priceUnavailable | boolean | True when a paid game exposes no standalone Steam price (edition-only listings) |
prices | array | Per-country price blocks |
priceByCountry.us | number | Us. |
countriesPriced | number | How many storefronts priced |
isOnSaleAnywhere | boolean | On sale in any selected store |
lowestPriceValue | number | Cheapest selected-store price |
metacriticScore | string | Metacritic score |
metacriticUrl | string | Metacritic url. |
recommendationsTotal | number | Steam recommendations |
ageRatings | array | Per-board ratings (ESRB, PEGI…) |
headerImage | string | Header image. |
capsuleImage | string | Capsule image. |
background | string | Background. |
website | string | Official site |
supportedLanguagesRaw | string | Supported languages |
supportedLanguages | array | Parsed clean list of supported languages |
dlcCount | number | Dlc count. |
dlcAppIds | array | Dlc app ids. |
fullgame | string | Parent game (for DLC) |
scrapedAt | string | ISO timestamp |
reviewScore | number | Steam review band from 0 (fewer than 10 reviews) to 9 (Overwhelmingly Positive), derived from the lifetime totals below using Steam's published thresholds. |
reviewScoreDesc | string | Label for the band, e.g. "Very Positive", "Mixed", or "7 user reviews" below 10 reviews. |
totalReviews | number | Lifetime user reviews across all languages. |
totalPositive | number | Lifetime recommended reviews, all languages. |
totalNegative | number | Lifetime not-recommended reviews, all languages. |
positivePercent | number | Share of positive reviews, one decimal. |
shortDescription | string | Short description. |
descriptionHtml | string | Full item description in HTML. |
descriptionText | string | Description text. |
descriptionMarkdown | string | Description markdown. |
screenshots | array | Screenshots. |
movies | array | Movies. |
Example record
{"appId": 4704690,"name": "MECCHA CHAMELEON","type": "game","url": "https://store.steampowered.com/app/4704690/","primaryCountry": "us","isFree": false,"comingSoon": false,"releaseDate": "Jun 9, 2026","requiredAge": 0,"developers": ["lemorion_1224"],"publishers": ["lemorion_1224"],"genres": ["Casual"],"categories": ["Multi-player","PvP","Online PvP","Camera Comfort"],"platforms": ["windows"],"controllerSupport": "none","currency": "USD","initialPrice": 5.99,"finalPrice": 5.99,"discountPercent": 0,"isOnSale": false,"priceUnavailable": false,"prices": [{"country": "us","currency": "USD","initialPrice": 5.99,"finalPrice": 5.99,"discountPercent": 0,"isOnSale": false,"finalFormatted": "$5.99"}],"priceByCountry": {"us": 5.99},"countriesPriced": 1,"isOnSaleAnywhere": false,"lowestPriceValue": 5.99,"metacriticScore": null,"metacriticUrl": null,"recommendationsTotal": 21756,"ageRatings": [{"board": "dejus","rating": "14","descriptors": null},{"board": "steam_germany","rating": "12","descriptors": null},{"board": "igrs","rating": "18","descriptors": "Interaksi Daring"}],"headerImage": "https://shared.akamai.steamstatic.com/store_item_assets/steam/apps/4704690/163e2a742e5fb8e1f5d1e3a890da98f04ab809d4/header.jpg?t=1781108224","capsuleImage": "https://shared.akamai.steamstatic.com/store_item_assets/steam/apps/4704690/18d14b8bd834e30a6a25df5ccd7f0a6e644f1577/capsule_231x87.jpg?t=1781108224","background": "https://store.akamai.steamstatic.com/images/storepagebackground/app/4704690?t=1781108224","website": null,"supportedLanguagesRaw": "English, Japanese, Spanish - Spain, Simplified Chinese, Korean, French, Italian, German, Arabic, Portuguese - Brazil, Russian, Traditional Chinese","supportedLanguages": ["English","Japanese","Spanish - Spain","Simplified Chinese"],"dlcCount": 0,"dlcAppIds": [],"fullgame": null,"scrapedAt": "2026-06-24T16:34:46.375Z","reviewScore": 8,"reviewScoreDesc": "Very Positive","totalReviews": 24496,"totalPositive": 20401,"totalNegative": 4095,"positivePercent": 83.3,"shortDescription": "Paint yourself to blend in! \"Meccha Chameleon\" is a new-sensation hide-and-seek game where you paint your white body to mimic the stage. Spot, pose, and \"artistic skill\" are keys to survival. Deceive …","descriptionHtml": "<p class=\"bb_paragraph\" >Paint your own body! Blend in like a chameleon in this hide-and-seek game!</p><h2 class=\"bb_tag\" ><strong>yeah! Mechcha "Hide and Seek"</strong></h2><p class=\"bb_par …","descriptionText": "Paint your own body! Blend in like a chameleon in this hide-and-seek game!\nyeah! Mechcha \"Hide and Seek\"\n The rules are simple. Split into the Seeker team and the Hider team to play hide-and-seek. The …","descriptionMarkdown": "Paint your own body! Blend in like a chameleon in this hide-and-seek game!\n\n## **yeah! Mechcha \"Hide and Seek\"**\n The rules are simple. Split into the Seeker team and the Hider team to play hide-and-s …","screenshots": ["https://shared.akamai.steamstatic.com/store_item_assets/steam/apps/4704690/6c0a47cc2fba1b160901d1553637a764198bdc98/ss_6 …","https://shared.akamai.steamstatic.com/store_item_assets/steam/apps/4704690/0383a711ed93bf8edd848df4b63b331fc44f3ad5/ss_0 …","https://shared.akamai.steamstatic.com/store_item_assets/steam/apps/4704690/51b0a906d1767b1b5abde623350dec64c6877c93/ss_5 …","https://shared.akamai.steamstatic.com/store_item_assets/steam/apps/4704690/0a8a562016b13a349349e685f7a4d5a6cbccef3e/ss_0 …"],"movies": [{"name": "TR2","thumbnail": "https://shared.akamai.steamstatic.com/store_item_assets/steam/apps/257336777/50fa43f687913f0d5295148f5b8f2892ec3d8b08/mo …","mp4": null,"webm": null}]}
Examples
Search for strategy:
{"searchTerms": ["strategy"],"maxResults": 100}
Cap the price:
{"searchTerms": ["strategy"],"maxResults": 100,"maxPrice": 39.99}
Scrape a specific search URL:
{"startUrls": [{"url": "https://store.steampowered.com/app/1245620/ELDEN_RING/"}],"maxResults": 200}
Daily monitoring (run on a schedule):
{"searchTerms": ["strategy"],"maxResults": 500}
Schedule this input to run once a day in the Apify Scheduler to track prices, stock and new items over time.
Call this actor over HTTP
Besides normal runs, this actor exposes a REST API that answers each request in a few seconds with JSON. There is no run to start and no dataset to fetch afterwards, which suits apps, automations and AI agents that need one answer at a time. The full interactive reference is on the Endpoints tab.
| Endpoint | Returns | Billed as |
|---|---|---|
GET /app?id=… | Full record for one game, by App ID or store URL | One game |
GET /apps?ids=… | Records for up to 50 games by App ID | Per game returned |
GET /search?query=… | Games matching a keyword (up to 50) | Per game returned |
GET /browse?section=… | Top sellers, new releases, specials or coming soon | Per game returned |
Every endpoint accepts country, countries (up to 5 extra stores), language, reviews, description, media and steamspy, with the same meaning as the input fields above.
Authenticate with your Apify API token in the Authorization header:
curl -H "Authorization: Bearer <YOUR_APIFY_TOKEN>" \"https://unfenced-group--steam-store-scraper.apify.actor/app?id=1245620"
Every response has the shape { "count": N, "items": [...] }, with the same fields as the dataset records above. Errors, App IDs without a store page and empty searches return no data and are never billed. POST with a JSON body works the same as GET.
💰 Pricing
$0.99 per 1,000 results — you only pay for successfully retrieved games. Failed retries are never charged.
| Results | Cost |
|---|---|
| 100 | ~$0.10 |
| 1,000 | ~$0.99 |
| 10,000 | ~$9.9 |
| 100,000 | ~$99 |
Flat-rate alternatives typically charge $29–$49/month regardless of usage.
Subscription tiers lower the rate further, down to $0.69 per 1,000 at the highest tier. Use the Max results cap in the input to control your spend exactly.
Performance
| Run size | Typical time (reviews off) | Typical time (reviews on) |
|---|---|---|
| 100 games | about 1 minute | about 2–3 minutes |
| 500 games | about 5–6 minutes | about 11–13 minutes |
| 2,000 games | about 20–25 minutes | about 45–50 minutes |
Each extra country in countries adds one price request per game. Up to 4 concurrent runs of 500 App IDs each complete in the same time as a single run.
Large App ID lists and missing games
Every run writes a FAILED_IDS record to its key-value store (Storage tab) listing each requested App ID that was not saved, with the reason:
| Group | Meaning | What to do |
|---|---|---|
notAvailable | Steam has no store page for this ID in the chosen country: removed, hidden, region-locked, or not a valid app ID. | Nothing; Steam has no data to return. Try another country if the game is region-locked. |
failed | Steam did not give a usable answer after repeated retries. | Resubmit these IDs in a new run. |
notAttempted | The run reached its timeout before these IDs were processed. | Resubmit, or raise the run timeout. |
The run's status message and log summary show the same counts. For large collections, batches of 500 App IDs and up to 4 concurrent runs work well. The default run timeout of 60 minutes covers a 500-ID batch with reviews on and one or two countries; for many countries per game, use smaller batches or a longer timeout. If the timeout is reached, the run stops cleanly before the timeout and lists the remaining IDs under notAttempted.
Known limitations
- Some games have no store page in a given country (removed, hidden or region-locked). These are listed under
notAvailableinFAILED_IDS, never charged. - Age ratings and content descriptors are only present when the publisher has submitted them to Steam for that region; expect an empty
ageRatingsarray on many smaller titles. - Prices change constantly; records reflect the moment of scraping.
- Keyword search is bounded by Steam's own search paging (about 1,000 results per term).
Technical details
- Source: store.steampowered.com
- Coverage: any public Steam app by App ID, URL, keyword or store section
- Retry: automatic retry with backoff that waits out Steam's rate limits; unresolved IDs are retried in a second pass and reported in
FAILED_IDS
Rate this actor
If this scraper does its job, a short review on the Reviews tab helps other users find it. Something not working? Open an issue on the Issues tab instead — issues get fixed.
Need a custom scraper?
Unfenced Group builds Apify actors for any website — for free.
If the site you need isn't in our portfolio yet, just ask. We scope, build, and publish it at no cost to you. You only pay for results — we absorb the compute and proxy costs ourselves. Same pay-per-result pricing, same quality, same standards as every actor in this portfolio.
Get in touch: www.unfencedgroup.nl