Steam Games Sale Prices Scraper avatar

Steam Games Sale Prices Scraper

Pricing

Pay per event

Go to Apify Store
Steam Games Sale Prices Scraper

Steam Games Sale Prices Scraper

Track regional Steam regular prices, sale prices, discounts, platforms, and timestamped source URLs by game search, app ID, or app URL.

Pricing

Pay per event

Rating

0.0

(0)

Developer

Stas Persiianenko

Stas Persiianenko

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

5 days ago

Last modified

Categories

Share

Extract current steam games sale prices for searches, exact app IDs, or Steam store app URLs. Each observation includes the regional regular price, current price, discount percentage, currency, platforms, image, source URL, and collection timestamp.

Use scheduled runs to maintain deal feeds, monitor a wishlist, compare regional storefront prices, or append price observations to a research warehouse. The Actor reads public Steam store JSON endpoints and needs no Steam login.

What does this Steam price tracker do?

The Actor resolves two practical input routes:

  1. Search Steam by game name or keyword.
  2. Check exact Steam apps by numeric ID or app URL.

Search inputs return up to ten relevant Steam apps per query. Exact IDs are useful for stable watchlists. Both routes use the same regional and language settings and produce the same typed dataset record.

Set onlyOnSale to true when you want only active discounts. Leave it false to keep full-price observations as a baseline for later scheduled comparisons.

Who is it for?

  • Deal-site operators building a current Steam discount feed.
  • Game publishers and analysts comparing public storefront prices.
  • Wishlist owners monitoring a defined set of Steam app IDs.
  • Data teams appending timestamped price observations to a warehouse.
  • Automation builders sending discounted records to Slack, email, Sheets, or a webhook.

This Actor tracks Steam store app prices. For Counter-Strike marketplace item listings, use CS2 Steam Market Price Tracker instead.

Why use this Actor?

  • Two input routes: keyword discovery and exact app watchlists.
  • Regional observations: choose the country used for currency, price, and availability.
  • Monitoring-ready output: every row includes appId, canonical URL, and scrapedAt.
  • Explicit sale state: regular price, current price, discount percentage, and isOnSale are separate fields.
  • Lightweight execution: public structured endpoints, no browser, login, or proxy configuration.
  • Typed exports: use the dataset in JSON, CSV, Excel, XML, RSS, or integrations.

What data can I extract?

FieldMeaning
appIdStable Steam application ID
nameLocalized app or game name
appTypeSteam item type such as game or dlc
storeUrlCanonical timestampable source URL
sourceInputSearch query or app ID that produced the row
sourceTypesearch or appId
searchRankOne-based result position for search inputs
countryCountry code used for the observation
languageSteam language used for metadata
currencyCurrency returned by Steam
regularPriceUndiscounted price in major currency units
salePriceCurrent checkout price in major currency units
discountPercentCurrent discount percentage, or zero
isOnSaleWhether a lower sale price is active
isFreeWhether Steam marks the app free to play
platformsWindows, macOS, and Linux availability
genresLocalized genre labels
releaseDateLocalized Steam release-date text
imageUrlSteam-hosted app image
scrapedAtUTC observation timestamp

Price fields can be null for unavailable apps, demos, free products, or store entries without a regional price.

Getting started

  1. Open the Actor input page.
  2. Enter at least one searchQueries value or one appIds value.
  3. Choose a two-letter country, such as US, GB, or DE.
  4. Keep onlyOnSale off for baseline observations, or enable it for a deal-only feed.
  5. Set maxItems to bound the dataset size.
  6. Click Start.
  7. Open the Dataset tab to preview or export records.

A safe first run is:

{
"appIds": ["620", "1091500"],
"country": "US",
"language": "english",
"onlyOnSale": false,
"maxItems": 2
}

Input parameters

ParameterTypeDefaultDescription
searchQueriesstring[][]Names or keywords sent to Steam search
appIdsstring[][]Numeric app IDs or Steam app URLs
countrystringUSTwo-letter regional storefront country
languagestringenglishSteam language name
onlyOnSalebooleanfalseKeep only active discounted apps
maxItemsinteger50Maximum unique output rows, from 1 to 500

Duplicate apps are emitted once per run. Exact app IDs are processed before search results, so a watchlist remains prioritized when maxItems is small.

Search Steam games

Use broad or title-specific searches:

{
"searchQueries": ["strategy games", "co-op games"],
"country": "US",
"language": "english",
"maxItems": 15
}

Steam currently returns up to ten relevant items from its structured search response for each query. This Actor does not claim exhaustive catalog search pagination.

Track an exact Steam watchlist

Exact IDs are more stable than titles for recurring schedules:

{
"appIds": [
"620",
"1091500",
"https://store.steampowered.com/app/1245620/ELDEN_RING/"
],
"country": "US",
"maxItems": 3
}

Steam app URLs are normalized to their numeric IDs. Invalid IDs or non-Steam URLs fail fast instead of producing misleading empty rows.

Output example

A current full-price observation has this shape:

{
"appId": 620,
"name": "Portal 2",
"appType": "game",
"storeUrl": "https://store.steampowered.com/app/620/",
"sourceInput": "Portal",
"sourceType": "search",
"searchRank": 1,
"country": "US",
"language": "english",
"currency": "USD",
"regularPrice": 9.99,
"salePrice": 9.99,
"regularPriceFormatted": "$9.99",
"salePriceFormatted": "$9.99",
"discountPercent": 0,
"isOnSale": false,
"isFree": false,
"platforms": ["Windows", "Linux"],
"genres": ["Action", "Adventure"],
"releaseDate": "Apr 18, 2011",
"imageUrl": "https://shared.akamai.steamstatic.com/store_item_assets/steam/apps/620/header.jpg",
"scrapedAt": "2026-08-13T12:00:00.000Z"
}

Steam can change prices at any time. Treat scrapedAt, country, and currency as part of every observation.

How much does it cost to track Steam game prices?

Pricing uses one start event per run plus one item event for each saved app. Filtered, duplicate, unavailable, and failed records are not charged as items.

The current source configuration defines a $0.0005 start event. Item prices decrease by subscription tier; the BRONZE item price is $0.0016118 per saved app. At BRONZE, before platform subscription allowances:

  • 10 saved apps: about $0.0166 total.
  • 50 saved apps: about $0.0811 total.
  • 100 saved apps: about $0.1617 total.

Apify displays the active tier and final estimated charge before a run. Steam endpoint behavior and the selected item count can affect runtime, but not the number of item events: one accepted dataset row equals one item event.

Schedule price tracking

Apify schedules can run the same input hourly, daily, or weekly. For a stable monitoring workflow:

  1. Store exact IDs in appIds.
  2. Keep country and language unchanged between observations.
  3. Leave onlyOnSale off if your downstream system needs full-price baselines.
  4. Append each dataset to a warehouse keyed by appId and scrapedAt.
  5. Compare the newest salePrice and discountPercent with the prior row.

The Actor reports current observations; it does not persist history or send alerts itself. Use Apify integrations, webhooks, or your own pipeline for comparison and notification.

Export to Sheets or a data pipeline

From the Dataset tab, export JSON, CSV, Excel, XML, or RSS. You can also:

  • Connect a Google Sheets integration after successful runs.
  • Trigger a webhook when a scheduled run finishes.
  • Pull dataset items into BigQuery, Snowflake, PostgreSQL, or a lake.
  • Filter isOnSale = true downstream for a current deal feed.
  • Join on appId to compare countries from separate runs.

Run one country per Actor execution so the regional context remains unambiguous.

Use the Apify API

Replace APIFY_TOKEN with your token.

cURL

curl -X POST \
"https://api.apify.com/v2/acts/automation-lab~steam-game-sale-price-tracker/runs?token=APIFY_TOKEN" \
-H "Content-Type: application/json" \
-d '{"appIds":["620","1091500"],"country":"US","maxItems":2}'

JavaScript

import { ApifyClient } from 'apify-client';
const client = new ApifyClient({ token: process.env.APIFY_TOKEN });
const run = await client.actor('automation-lab/steam-game-sale-price-tracker').call({
searchQueries: ['strategy games'],
country: 'US',
onlyOnSale: false,
maxItems: 10,
});
const { items } = await client.dataset(run.defaultDatasetId).listItems();
console.log(items);

Python

from apify_client import ApifyClient
client = ApifyClient(token="APIFY_TOKEN")
run = client.actor("automation-lab/steam-game-sale-price-tracker").call(run_input={
"appIds": ["620", "1091500"],
"country": "US",
"maxItems": 2,
})
items = client.dataset(run["defaultDatasetId"]).list_items().items
print(items)

Use with MCP and AI agents

Add the Actor to Claude Code through Apify MCP:

claude mcp add --transport http apify \
"https://mcp.apify.com?tools=automation-lab/steam-game-sale-price-tracker"

Claude Desktop

Add this server in Claude Desktop's MCP configuration:

{
"mcpServers": {
"apify": {
"url": "https://mcp.apify.com?tools=automation-lab/steam-game-sale-price-tracker"
}
}
}

Cursor

Add the same mcpServers.apify entry to Cursor's MCP settings.

VS Code

Add the same Apify MCP URL through your VS Code MCP extension or workspace MCP configuration.

Example prompts:

  • “Check these Steam app IDs in the US store and return current discounts.”
  • “Search Steam for co-op games and export a spreadsheet-ready price table.”
  • “Run my Steam watchlist for Great Britain and show only active sales.”

Limits and freshness

  • Results are a snapshot of public Steam data at run time, not historical prices.
  • Search returns the current bounded Steam search response, up to ten apps per query.
  • Regional availability can differ; an app may be unavailable in the selected country.
  • Steam may omit price data for free apps, demos, unreleased products, or bundles.
  • onlyOnSale can legitimately return zero rows when none of the resolved apps is discounted.
  • Store titles, release dates, genres, and formatted prices follow the selected Steam language.
  • The Actor does not access wishlists or account-specific data and does not require login.

Reliability and retries

Transient network failures, HTTP 429 responses, and temporary Steam 5xx responses are retried up to three times with backoff. Stable invalid input and unavailable apps are not retried blindly.

For large watchlists, split IDs across scheduled runs if Steam begins rate-limiting. The implementation intentionally uses conservative sequential detail requests and 256 MB memory.

Legality and responsible use

The Actor accesses public Steam store endpoints. You are responsible for complying with Steam terms, Apify policies, and laws that apply to your use case. Do not use output to misrepresent Steam, Valve, publishers, or regional offers.

Prices and discounts can change between observation and purchase. Always link users to the canonical storeUrl and let Steam present the final current checkout terms.

Troubleshooting

Why did a run return no rows?

Confirm that at least one query or app ID is supplied. If onlyOnSale is enabled, the resolved apps may not currently be discounted. Disable the filter to inspect baseline observations.

Why is a price null?

The selected country may not offer the app, or Steam may classify it as free, unreleased, a demo, or an item without a standard price. Try the canonical app page in the same regional context.

Why does search not return every matching game?

Steam's structured search surface returns a bounded set of relevant apps. Use exact app IDs for complete watchlists and stable scheduled monitoring.

Can I compare countries in one run?

A run has one country setting. Run the Actor once per country and join records by appId in your pipeline so each observation has clear regional context.

FAQ

Does it require a Steam API key?

No. It uses public Steam store JSON responses and requires no Steam account.

Does it store price history?

No. Each row is a timestamped current observation. Schedule runs and persist datasets in your destination to build history.

Can it monitor a wishlist?

Yes, if you provide the wishlist's public app IDs as appIds. The Actor does not log in or read private wishlist pages.

Are sale prices guaranteed at checkout?

No. Steam prices and availability can change. The dataset records what Steam returned at scrapedAt; users should verify the linked store page.

What counts as a charged item?

One accepted row saved to the default dataset. Duplicates, filtered full-price apps, unavailable apps, and request failures do not produce item charges.