Steam store data from Python or the command line: search games by name, or pull the full store detail of a list of app ids, with price and discount, developers and publishers, genres and categories, release date, Metacritic score, Steam recommendations, platforms, languages, DLC and achievement counts, screenshots and trailer, as JSON or CSV. The code is free and open source (MIT). It runs on the QuanticData Data API, so there is no Steam API key to request and no proxy to rotate: sign in once and run a command.
pip install git+https://github.com/quantumproxies/steam-scraper
steam-scraper login
steam-scraper games portal --max-results 20 -o portal.csvlogin opens the QuanticData sign-in page in your browser. New accounts get $2 of free usage every month, no card required: create one.
| Command | Input | Returns | Per run |
|---|---|---|---|
steam-scraper games |
search term, or --app-ids | Price, discount, genres, developers, release date, Metacritic, platforms, 41 fields per row (fields and price) | up to 50 |
Two modes: steam-scraper games portal searches the store (rank, name, price, Metacritic, platforms, images); steam-scraper games --app-ids 620 400 returns the full store detail of each game. --country sets the storefront for prices and currency.
A real row from steam-scraper games portal --max-results 3 (2026-10-23):
{
"url": "https://store.steampowered.com/app/620",
"icon": "https://shared.akamai.steamstatic.com/community_assets/images/apps/620/25a5a16b2423bf7487ac5340b5b0948cef48c5f8.jpg",
"logo": "https://shared.akamai.steamstatic.com/store_item_assets/steam/apps/620/bd23943dcd0280aa2cdc066e2f86d2185cfd4cce/capsule_231x87.jpg?t=1790187113",
"name": "Portal 2",
"rank": 1,
"type": "app",
"price": 9.99,
"app_id": "620",
"is_free": false,
"currency": "USD",
"platforms": [
"windows",
"linux"
],
"list_price": 9.99,
"metacritic": 95,
"discount_pct": null,
"controller_support": "full"
}from quanticdata_steam_scraper import SteamScraper
steam = SteamScraper() # saved login, or QUANTICDATA_API_KEY
found = steam.games("portal", max_results=10)
for g in found:
print(g["app_id"], g["name"], g["price"], g["metacritic"])
details = steam.games(app_ids=["620", "400"], country="us")
for g in details:
print(g["name"], g["release_date"], g["genres"], g["recommendations"])
details.to_csv("portal_details.csv")Each call returns a Run: iterate it for the rows (plain dicts), take len(), or save it with to_csv(), to_json(), to_jsonl() or to_dataframe() (pandas). Errors are specific: InsufficientCredit, RateLimited, InvalidInput, JobFailed, AuthError.
- Price and discount tracking: Check the price, list price and discount of a list of games on every run and keep the history in a CSV, to catch every sale. See
examples/price_tracker.py. - Game comparison table: Developers, publishers, genres, release date, Metacritic, recommendations, price, DLC and achievement counts of a list of games side by side, in one CSV sorted by Metacritic. See
examples/compare_games.py. - From search to full detail: Search the store for a few terms, then pull the full detail of every game found, de-duplicated by app id. See
examples/search_to_details.py.
Results print as a table; -o file.csv, -o file.json or -o file.jsonl writes a file. List inputs take a b c, a,b,c, @file.txt (one per line) or - (stdin). --no-wait starts a long run in the background and prints its id; steam-scraper run <id> -o out.csv collects it later.
Steam store data: search games by name, or pull the full store detail of a list of app ids (price, discount, genres, developers, publishers, release date, Metacritic, platforms).
steam-scraper games [QUERY] [options]
| Option | Type | Default | Description |
|---|---|---|---|
QUERY |
string | Search term, e.g. "portal". Omit it when you pass --app-ids. | |
--app-ids |
string[] | Steam app ids (620) or store URLs, for the full store detail of each game. | |
--country |
string | Storefront country for prices and currency (default us). | |
--include-reviews |
boolean | True |
Detail mode: also read Steam's review verdict and totals for each app (one small extra request per app). |
--max-results |
integer | 20 |
How many apps to deliver at most (1–50). You pay only for delivered apps. |
steam-scraper games: 41 fields
| Field | Type | Description |
|---|---|---|
rank |
integer | 1-based position. |
app_id |
string | Steam appid. |
name |
string or null | Game/app title. |
type |
string or null | game, dlc, demo… (detail mode). |
is_free |
boolean | Free-to-play (detail mode). |
price |
number or null | Final price (detail mode). |
price_formatted |
string or null | Price as shown (detail mode). |
discount_pct |
integer or null | Discount % (detail mode). |
currency |
string or null | Price currency (detail mode). |
developers |
string[] | Developers (detail mode). |
publishers |
string[] | Publishers (detail mode). |
genres |
string[] | Genres (detail mode). |
categories |
string[] | Store categories (detail mode). |
release_date |
string or null | Release date as shown (detail mode). |
metacritic |
integer or null | Metacritic score (detail mode). |
recommendations |
integer or null | Total recommendations (detail mode). |
platforms |
string[] | windows/mac/linux (detail mode). |
header_image |
string or null | Header image URL. |
icon |
string or null | Icon URL (search mode). |
short_description |
string or null | Short description (detail mode). |
url |
string | Store page URL. |
logo |
string or null | Capsule image (search rows). |
coming_soon |
boolean or null | Not yet released (detail rows). |
required_age |
integer or null | Minimum age (detail rows). |
list_price |
number or null | Price before discount. |
controller_support |
string or null | full / partial, from the store record or, when that omits it, from its controller-support category. |
review_summary |
string or null | Steam's review verdict (Very Positive, Mixed…) — detail rows. Null, with the review counts, when Steam's review summary does not answer for the app; the run notes say how many rows that is. |
reviews_total |
integer or null | Total user reviews. |
reviews_positive |
integer or null | Positive reviews. |
reviews_negative |
integer or null | Negative reviews. |
reviews_positive_pct |
number or null | Share of positive reviews (%). |
website |
string or null | Official website. |
languages |
string[] or null | Supported languages. |
dlc_count |
integer or null | Number of DLCs. |
achievements |
integer or null | Number of achievements. |
age_rating |
string or null | ESRB / PEGI rating. |
content_notes |
string or null | Mature-content note from the store page. |
screenshots |
string[] or null | Screenshot URLs (up to 5). |
trailer |
string or null | First trailer stream URL. |
metacritic_url |
string or null | Metacritic page. |
support_url |
string or null | Support page. |
steam-scraper loginsigns you in with OAuth 2.1 and PKCE in the browser. The token is stored in~/.config/quanticdata/credentials.json(readable only by you) and refreshed automatically. One login serves every QuanticData tool on the machine.- No browser on the machine (SSH, Docker, Colab): run
steam-scraper login --no-browser, open the link anywhere, then paste back the address the browser ends on. - Scripts and CI: set
QUANTICDATA_API_KEYto a key from the dashboard, or store one withsteam-scraper login --api-key. steam-scraper logoutrevokes the token. The connection is listed under API keys in the dashboard as "API · QuanticData CLI"; deleting that key disconnects every machine that uses it.
The code is free and MIT-licensed. Runs are billed to your QuanticData account per delivered row, at the price shown on each collector page linked above; $2 of usage is free every month and failed runs are never billed. Plans with higher limits: pricing.
The same data over plain HTTP:
curl -X POST https://api.quanticdata.io/v1/scraper/collectors/steam/run \
-H "Authorization: Bearer $QUANTICDATA_API_KEY" \
-H "Content-Type: application/json" \
-d '{"input": {"query": "portal", "max_results": 3}}'- API reference with Python, Node, PHP and curl examples.
- MCP server to give Claude, Cursor or any MCP client the same tools.
- n8n node for no-code workflows.
Is this Steam scraper free?
The code is free and MIT-licensed. Scraping runs on your QuanticData account: $2 of usage is free every month with no card, then you pay per delivered row at the price shown on each collector page. Failed runs are never billed.
Do I need a Steam API key or proxies?
No. There is no Steam Web API key to request and no proxy to configure: you send a search term or app ids and get rows back; the requests run on QuanticData's side.
Search or app ids: what is the difference?
A search term returns the store's search results with rank, name, price, Metacritic and platforms. --app-ids returns the full store page of each game: developers, publishers, genres, release date, languages, recommendations, DLC and achievements, screenshots and trailer.
How many games can one run return?
Up to 50 per run; ask for fewer with --max-results and you pay only for what is delivered.
Can I export to CSV or Excel?
Add -o games.csv (or .json, .jsonl). Lists such as genres, developers and platforms are joined with '; ', so the CSV opens cleanly in Excel or Google Sheets.
Can I run it on a schedule?
Yes. Set QUANTICDATA_API_KEY in the environment and call the CLI or examples/price_tracker.py from cron, GitHub Actions or any scheduler.
- App Store Scraper: App Store scraper for Python and the command line.
- Google Play Scraper: Google Play scraper for Python and the command line.
- Reddit Scraper: Reddit scraper for Python and the command line.
MIT. Built and maintained by QuanticData.