Steam Store Games Scraper
Pricing
from $1.05 / 1,000 results
Steam Store Games Scraper
Scrapes the Steam store: search or browse by tag, genre, feature, OS and language. Returns price and discount in your chosen store currency, review score and count, release date, developers, publishers, genres, Metacritic score and achievements.
Pricing
from $1.05 / 1,000 results
Rating
0.0
(0)
Developer
Ibnu Adzim
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
a day ago
Last modified
Categories
Share
Scrapes the Steam store catalogue — search by keyword, or browse by tag, content type, player mode, feature, OS and language.
Returns price and discount in the store currency you choose, review score and count, release date, developers, publishers, genres, Metacritic score, achievement counts and full descriptions.
What you get
One row per app, plus a SEARCH_SUMMARY row per search telling you Steam's own
total, which filters actually resolved, and every honesty flag.
From the store search (always)
appId · name · storeUrl · releasedText · priceText ·
originalPriceText · discountPctText · reviewSummary ("Very Positive") ·
reviewPositivePct (87) · reviewCount (835,393) · tagIds · platforms
From Valve's appdetails API (includeAppDetails, on by default)
appType · isFree · priceInitial / priceFinal (integer cents) ·
priceCurrency · priceFormatted · discountPercent · releaseDate ·
comingSoon · developers · publishers · genres · metacriticScore ·
recommendationsTotal · achievementsTotal · requiredAge ·
shortDescription · website · supportsWindows / supportsMac /
supportsLinux · screenshotCount · movieCount — plus the complete raw
payload in appDetails.
Input
{"searchTerms": ["roguelike"],"tags": ["RPG", "Souls-like"], // by NAME, combined with AND"contentTypes": ["Games"],"country": "us", // sets the currency — read below"sortBy": "_ASC","maxItems": 100,"includeAppDetails": true}
Filters are typed by name, not by id
You write "RPG", not 122. All 430 tags and 103 languages Steam
publishes are resolved live at run time, so new tags work without an actor
update.
A name Steam doesn't know is refused with suggestions, before any request. That matters more than it sounds: Steam answers an unknown filter value with the complete unfiltered catalogue (274,412 items) and a healthy HTTP 200. A scraper that passed your typo straight through would return a successful- looking run that quietly ignored your filter entirely.
Tags combine with AND — measured: RPG (59,235) + Action (110,871) → 21,818 for both.
Read this before you trust the prices
Steam prices in whatever currency the requesting IP resolves to, unless you tell it otherwise. Same query, same moment, different exit IP:
| Request | Prices returned |
|---|---|
| no region | Rp 359 999, Rp 39 549 |
country: "us" | $39.99, $4.19 |
country: "gb" | £24.99, £3.49 |
country: "de" | 29,99€, 4,19€ |
This actor always sends your chosen region, so a rotating proxy pool can't change the currency midway through a crawl. An unknown region is refused up front, because Steam does not reject one — it silently falls back to the IP.
storeCurrencySeen on the summary row reports the ISO code Steam actually
priced in, so you can verify rather than assume. (It's null when the detail
pass is off — the search page carries only formatted strings like "$59.99",
and putting one of those in a field called "currency" would be worse than
leaving it empty. The raw sample lands in samplePriceText instead.)
Known limits
1. Two sort orders are secretly filters. Sorting by release date drops
items with no usable date (63,610 → 49,845 on one measured query); sorting by
review score drops everything with no reviews (→ 18,752). When it happens the
summary reports sortImplicitlyFiltered: true and the unsorted total, so
the missing rows are visible instead of mysterious. An unknown sort is refused,
because Steam silently ignores one.
2. Steam repeats a few promoted rows across page boundaries (2 of 50 in one
measurement). The actor de-duplicates and keeps fetching until it has the
number of unique apps you asked for, so maxItems: 250 returns exactly 250 —
occasionally taking one extra request to get there.
3. Details cost one request per app. The appdetails endpoint takes a
plural appids parameter but a comma-separated list answers HTTP 400. Turn the
detail pass off for fast list-only crawls.
4. Region-locked and delisted apps answer success: false with HTTP 200.
Those rows keep their search fields and carry _detailError, never a silently
blank record.
5. Pagination is honest — past the last page Steam returns zero rows rather
than re-serving page 1 — so an unlimited crawl terminates correctly. But a
broad query can be tens of thousands of rows at 100 per request; size
maxItems accordingly.
Anti-bot posture
None. Steam runs no bot mitigation on these public store endpoints: 5/5 TLS profiles clean, and several hundred recon requests across both surfaces drew zero challenges. An unpaced burst of 199 sequential detail calls sustained 2.6 req/s with no rejection at all — considerably more permissive than the widely repeated "200 requests per 5 minutes" folklore.
The actor still ships a rotating profile pool, a retry ladder and challenge-marker detection, and paces requests by default. A WAF-free surface is worth keeping that way.
Policy
Steam's robots.txt is unusually permissive: User-agent: * disallows only
/share/, /news/externalpost/, /email/, /widget/, /account/ackgift/
and some tokenised account URLs. Neither the store search nor /app/ nor
api/appdetails is restricted, and no query parameter is disallowed — so
unlike several other actors in this portfolio, this one uses the site's own
filter query string directly. appdetails is Valve's own public API.