Steam Store Games Scraper avatar

Steam Store Games Scraper

Pricing

from $1.05 / 1,000 results

Go to Apify Store
Steam Store Games Scraper

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

Ibnu Adzim

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

a day ago

Last modified

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:

RequestPrices returned
no regionRp 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.