# Steam Scraper — Games, Prices, Reviews & Charts (`scrapesage/steam-scraper`) Actor

Scrape the Steam store: search games, full game details, prices & discounts, user reviews with sentiment, top sellers / new releases / specials charts, and SteamSpy owner & player stats. Publisher leads (website, support email), monitoring mode, any storefront. No login, no key, no browser.

- **URL**: https://apify.com/scrapesage/steam-scraper.md
- **Developed by:** [Scrape Sage](https://apify.com/scrapesage) (community)
- **Categories:** E-commerce, Developer tools, Automation
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $5.00 / 1,000 game scrapeds

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.

Learn more: https://docs.apify.com/platform/actors/running/actors-in-store#pay-per-event

## What's an Apify Actor?

Actors are a software tools running on the Apify platform, for all kinds of web data extraction and automation use cases.
In Batch mode, an Actor accepts a well-defined JSON input, performs an action which can take anything from a few seconds to a few hours,
and optionally produces a well-defined JSON output, datasets with results, or files in key-value store.
In Standby mode, an Actor provides a web server which can be used as a website, API, or an MCP server.
Actors are written with capital "A".

## How to integrate an Actor?

If asked about integration, you help developers integrate Actors into their projects.
You adapt to their stack and deliver integrations that are safe, well-documented, and production-ready.
The best way to integrate Actors is as follows.

In JavaScript/TypeScript projects, use official [JavaScript/TypeScript client](https://docs.apify.com/api/client/js.md):

```bash
npm install apify-client
```

In Python projects, use official [Python client library](https://docs.apify.com/api/client/python.md):

```bash
pip install apify-client
```

In shell scripts, use [Apify CLI](https://docs.apify.com/cli/docs.md):

````bash
# MacOS / Linux
curl -fsSL https://apify.com/install-cli.sh | bash
# Windows
irm https://apify.com/install-cli.ps1 | iex
```bash

In AI frameworks, you might use the [Apify MCP server](https://docs.apify.com/platform/integrations/mcp.md).

If your project is in a different language, use the [REST API](https://docs.apify.com/api/v2.md).

For usage examples, see the [API](#api) section below.

For more details, see Apify documentation as [Markdown index](https://docs.apify.com/llms.txt) and [Markdown full-text](https://docs.apify.com/llms-full.txt).


# README

## Steam Scraper — Games, Prices, Reviews & Charts

Extract **everything public on the [Steam store](https://store.steampowered.com)** — full **game details** (price, discount, genres, categories, platforms, Metacritic, release date, screenshots), **user reviews** with a **sentiment summary**, **top-seller / new-release / specials charts**, and **SteamSpy stats** (owner estimates, concurrent players, playtime, community tags). Built straight on Steam's own store endpoints for clean, fast, structured data.

No login, no API key, no browser — and an optional **monitoring mode** that returns only new games and new reviews on each run.

### Why this Steam scraper?

Most Steam scrapers do one narrow thing — reviews only, or a single chart. This actor rolls **four jobs into one tool** and ships the **richest dataset in the category**: the complete game record, the review stream *and* the sentiment summary, plus owner/player estimates the official API never exposes.

| Data | Typical Steam scrapers | This actor |
|---|---|---|
| Search & browse games (keyword, sort, specials) | partial | ✅ |
| Full game details (price, discount, genres, platforms, Metacritic, release date…) | basic fields | ✅ 70+ fields |
| Derived analytics (priceFinalUsd, isDiscounted, releaseYear, achievementsCount, platformList…) | ❌ | ✅ computed per game |
| **SteamSpy** owners, peak concurrent players, playtime & community tags | ❌ | ✅ |
| **Publisher leads** — developer/publisher, website, support URL & email | ❌ | ✅ when published |
| Charts — top sellers / new releases / specials / coming soon | sometimes | ✅ |
| User reviews (recommendation, text, votes, author playtime) | ✅ | ✅ |
| **Review sentiment summary** (score, % positive, totals) | ❌ | ✅ one row per app |
| App ID ⇄ store URL — both accepted | partial | ✅ |
| **Monitoring mode** — only new games / reviews | ❌ | ✅ |
| One run, four jobs (search · details · charts · reviews) | ❌ | ✅ |

### Use cases

- **Game-market & competitive research** — see who tops a category or ranks for a keyword, with price, discount, Metacritic, review counts and SteamSpy owner/player estimates; benchmark your game against its rivals.
- **Price & discount monitoring** — track prices and sales across any storefront; run the specials chart on a schedule with monitoring mode to catch new discounts the moment they go live.
- **Review intelligence** — pull the full review stream plus a sentiment summary (e.g. *Overwhelmingly Positive, 96.8%*); monitor new reviews for sentiment dashboards, bug signals and support alerts.
- **Publisher & developer lead-gen** — capture the studio/publisher, their website and support contact (where Steam publishes it) for partnerships, BD and outreach.
- **Discovery & aggregation** — power dashboards, newsletters and datasets with structured game metadata across countries, genres and charts.

### How to use

1. [Sign up for Apify](https://console.apify.com/sign-up) — the free plan is enough to try this actor.
2. Open the **Steam Scraper**, pick a **mode** (Search, App details, Charts, or Reviews), fill in the matching field, and click **Start**.
3. Watch results stream into the dataset table as each record is parsed.
4. **Export** as JSON, CSV, Excel, XML, or RSS — or pull results programmatically via the [Apify API](https://docs.apify.com/api/v2).

### Input

Search a keyword, sorted by user reviews, enriched with SteamSpy stats:

```json
{
    "mode": "search",
    "searchTerms": ["roguelike", "city builder"],
    "sortBy": "reviews",
    "maxAppsPerQuery": 50,
    "includeSteamSpy": true,
    "country": "us"
}
````

Pull the newest reviews for specific games, on a schedule, getting only new ones each run:

```json
{
    "mode": "reviews",
    "appIds": ["730", "292030", "https://store.steampowered.com/app/570/"],
    "maxReviewsPerApp": 500,
    "reviewsFilter": "recent",
    "monitorMode": true
}
```

- **mode** — `search`, `appDetails`, `charts`, or `reviews`. Each mode uses the field that matches it (`searchTerms`, `appIds`, `collection`, or `appIds`).
- **appIds** — numeric Steam app IDs (`730`) or full store URLs (`https://store.steampowered.com/app/292030/`); both are accepted.
- **collection** — for `charts`: `top_sellers`, `specials`, `new_releases`, or `coming_soon`.
- **sortBy / onlySpecials** — for `search`: order results (relevance, release date, reviews, price…) and optionally return only discounted games. Leave `searchTerms` empty with `onlySpecials` on to browse every game on sale store-wide.
- **fullDetails** *(default true)* — for charts, enrich each game with its full record; turn off for a faster, lighter list. Search always returns full records.
- **includeSteamSpy** *(default true)* — add owner/player/playtime/tag stats to each full game record.
- **maxReviewsPerApp / reviewsFilter / reviewLanguage / reviewType / purchaseType** — review controls (see **Reviews** below).
- **country / language** — storefront (`us`, `gb`, `de`, `br`…) and store-text language (`en`, `de`, `french`).
- **monitorMode / monitorStoreName** — emit only records not seen in previous runs (see **Monitoring** below).
- **proxyConfiguration** — proxy settings (Apify proxy by default).

### Output

One dataset; every row is tagged with a `type` (`game`, `review`, or `reviewSummary`). Use the **Games**, **Publisher leads**, and **Reviews** views to switch the columns.

A game record (`type: "game"`, abridged — 70+ fields in total, including all raw Steam fields, the derived analytics and optional SteamSpy block):

```json
{
    "type": "game",
    "appId": 292030,
    "title": "The Witcher 3: Wild Hunt",
    "appType": "game",
    "isFree": false,
    "priceFinalUsd": 39.99,
    "priceFormatted": "$39.99",
    "discountPercent": 0,
    "isDiscounted": false,
    "metacriticScore": 93,
    "recommendationsTotal": 871862,
    "genreList": ["RPG"],
    "categoryList": ["Single-player", "Steam Achievements", "Steam Cloud"],
    "platformList": ["windows", "mac", "linux"],
    "releaseDate": "May 18, 2015",
    "releaseYear": 2015,
    "achievementsCount": 78,
    "developer": {
        "developers": ["CD PROJEKT RED"],
        "publishers": ["CD PROJEKT RED"],
        "website": "https://www.thewitcher.com/witcher3",
        "supportUrl": "https://support.cdprojektred.com/",
        "supportEmail": ""
    },
    "steamSpy": {
        "owners": "20,000,000 .. 50,000,000",
        "peakConcurrentYesterday": 15893,
        "averagePlaytimeForeverMin": 4200,
        "positiveVotes": 800000,
        "negativeVotes": 20000,
        "tags": { "Open World": 12000, "RPG": 11000, "Story Rich": 9000 }
    },
    "url": "https://store.steampowered.com/app/292030",
    "scrapedAt": "2026-06-14T12:00:00.000Z"
}
```

A review record (`type: "review"`), plus one `reviewSummary` row per app:

```json
{
    "type": "review",
    "appId": 292030,
    "reviewId": "187654321",
    "votedUp": true,
    "review": "One of the best RPGs ever made…",
    "language": "english",
    "votesUp": 42,
    "votesFunny": 3,
    "weightedVoteScore": 0.86,
    "steamPurchase": true,
    "writtenDuringEarlyAccess": false,
    "createdAt": "2026-06-09T18:55:13.000Z",
    "author": {
        "steamId": "765611…",
        "numGamesOwned": 187,
        "numReviews": 24,
        "playtimeForeverMin": 936,
        "playtimeAtReviewMin": 720
    },
    "scrapedAt": "2026-06-14T12:00:00.000Z"
}
```

**Coverage notes.** Game data comes from Steam's own store endpoints, so core fields (title, price, genres, platforms, release date, developers/publishers) are near-universal; optional fields (Metacritic, achievements, support email) appear when Steam or the publisher provides them. SteamSpy owner/player figures are third-party *estimates*. A game that is region-locked or removed in the selected storefront is reported as skipped, not as an error. Empty results (e.g. a game with no reviews) are a successful run.

### Reviews — full stream + sentiment

Reviews mode returns **one `reviewSummary` row per app** — Steam's overall `reviewScoreDesc` (e.g. *Very Positive*), the positive percentage and totals — followed by the **individual reviews** themselves. Steam paginates 100 at a time via a cursor, so set `maxReviewsPerApp` high to walk the full history, or use `reviewsFilter: "recent"` with monitoring mode to capture only the newest reviews each run. Filter by `reviewLanguage`, `reviewType` (positive/negative) and `purchaseType` (Steam vs. key activations).

### Monitoring — get only new games & reviews

Turn on **`monitorMode`** to make repeat runs incremental. The actor remembers what it has already returned (app IDs for search/charts/details modes; review IDs for reviews mode) in a named key-value store (**`monitorStoreName`**) and emits **only records that are new since the last run**.

- Track the **specials chart** and get only *new discounts* as they appear.
- Track a **new-releases chart** or a **keyword** and capture only *new games*.
- Track a game's **reviews** and capture only the *newest reviews* each run — perfect for sentiment dashboards and support alerts.
- It works **alongside [Apify Schedules](https://docs.apify.com/platform/schedules)**, not against them: the schedule triggers the run on your cron; monitoring mode dedupes against earlier runs so each run yields only fresh data. Use a distinct `monitorStoreName` per tracked target so their histories stay separate.

### Automate & schedule

Run this actor on autopilot and pull results into your own stack:

- **[Apify API](https://docs.apify.com/api/v2)** — start runs, fetch datasets, and manage schedules over REST.
- **[apify-client for JavaScript](https://docs.apify.com/api/client/js/)** and **[apify-client for Python](https://docs.apify.com/api/client/python/)** — official SDKs.
- **[Schedules](https://docs.apify.com/platform/schedules)** — run it on a cron to keep prices, charts and reviews fresh.
- **[Webhooks](https://docs.apify.com/platform/integrations/webhooks)** — trigger downstream actions the moment a run finishes.

```js
import { ApifyClient } from 'apify-client';

const client = new ApifyClient({ token: 'MY_APIFY_TOKEN' });

const run = await client.actor('scrapesage/steam-scraper').call({
    mode: 'charts',
    collection: 'specials',
    fullDetails: true,
    maxAppsPerQuery: 50,
    country: 'us',
});

const { items } = await client.dataset(run.defaultDatasetId).listItems();
console.log(`Got ${items.length} records`);
```

### Integrate with any app

Connect the dataset to 5,000+ apps — no code required:

- **[Make](https://docs.apify.com/platform/integrations/make)** — multi-step automation scenarios.
- **[Zapier](https://docs.apify.com/platform/integrations/zapier)** — push new games or price drops straight into your CRM or sheet.
- **[Slack](https://docs.apify.com/platform/integrations/slack)** — get notified when a monitored game drops in price or gets new reviews.
- **[Google Drive / Sheets](https://docs.apify.com/platform/integrations/drive)** — auto-export every run to a spreadsheet.
- **[Airbyte](https://docs.apify.com/platform/integrations/airbyte)** — pipe results into your data warehouse.
- **[GitHub](https://docs.apify.com/platform/integrations/github)** — trigger runs from commits or releases.

### Use with AI assistants (MCP)

The output is clean, LLM-ready JSON. Call this actor from Claude, ChatGPT, or any agent framework through the **[Apify MCP server](https://docs.apify.com/platform/integrations/mcp)** — ask your assistant to "find the top 25 roguelikes on Steam by review score and summarise their prices and player counts" and let it run this scraper for you.

### More scrapers from scrapesage

Build a complete **app/game-market & competitive-intel stack** — cover every store your market lives on:

- **[Google Play Scraper](https://apify.com/scrapesage/google-play-scraper)** — the Android app market: search, app details, charts, developer portfolios, reviews and developer-contact leads.
- **[Apple App Store Scraper](https://apify.com/scrapesage/app-store-scraper)** — the iOS app market: apps, reviews, charts and developer portfolios.
- **[Product Hunt Scraper](https://apify.com/scrapesage/product-hunt-scraper)** — new product launches, makers & maker leads.
- **[Google Ads Transparency Scraper](https://apify.com/scrapesage/google-ads-transparency-scraper)** — see exactly which ads any advertiser is running.
- **[Facebook Ad Library Scraper](https://apify.com/scrapesage/facebook-ad-library-scraper)** — competitor ad creatives on Meta & Instagram.
- **[Y Combinator Scraper](https://apify.com/scrapesage/ycombinator-scraper)** — startups, founders & jobs from the YC directory.
- **[LinkedIn Jobs Scraper](https://apify.com/scrapesage/linkedin-jobs-scraper)** — job postings as hiring-intent signals.
- **[Telegram Scraper](https://apify.com/scrapesage/telegram-scraper)** — channels, messages, media & search.

### Tips

- **Charts:** pick a `collection` (top sellers / specials / new releases / coming soon), set `country`, and keep `fullDetails` on for the complete per-game record; turn it off for a faster, lighter list when you only need names, prices and discounts.
- **Browse all sales:** set `mode: "search"`, leave `searchTerms` empty and turn on `onlySpecials` to sweep every discounted game store-wide, sorted however you like.
- **Reviews at scale:** Steam walks reviews by cursor, so set `maxReviewsPerApp` high to capture the full history — or schedule with monitoring mode to keep accumulating only new reviews.
- **SteamSpy:** keep `includeSteamSpy` on for owner estimates, concurrent players and community tags — the numbers the official store API doesn't give you.
- **Localize:** set `country` (and `language`) to match the storefront you care about; pricing and availability change by country.

### FAQ

**Do I need a Steam account or API key?** No. This actor reads Steam's public store endpoints — no login, key, or cookies.

**How many reviews can I get per app?** As many as you set in `maxReviewsPerApp` — Steam paginates by cursor, so the full review history is reachable. Use monitoring mode on a schedule to keep capturing new reviews over time.

**Where do owner and player numbers come from?** From [SteamSpy](https://steamspy.com), a third-party service that *estimates* owners and tracks concurrent players, playtime and community tags. Treat them as estimates, not official figures.

**Does it include developer/publisher contact details?** It includes the developer and publisher names, the game's website, and the support URL/email **where Steam publishes them** — many studios fill these in, some leave them blank.

**Can I scrape a specific country's store?** Yes — set `country` (and optionally `language`). Pricing, discounts and availability are all storefront-specific.

**Can I export to Google Sheets, CSV, or Excel?** Yes — one click in the dataset view, or automatically on every run via the [Google Drive integration](https://docs.apify.com/platform/integrations/drive).

**Is scraping Steam legal?** This actor collects publicly available data only. You're responsible for using the data in compliance with applicable laws (e.g. GDPR/CCPA for personal data) and Steam's terms.

### Need help?

Open an issue on the actor's **Issues** tab, or visit the [Apify help center](https://help.apify.com/). Feature requests are welcome — this actor is actively maintained.

# Actor input Schema

## `mode` (type: `string`):

Pick a job. Search finds games by keyword (or browse all). App details pulls the full record for specific games. Charts lists top sellers / new releases / specials / coming soon. Reviews pulls user reviews with a sentiment summary.

## `searchTerms` (type: `array`):

Keywords to search the Steam store for, e.g. <code>roguelike</code>, <code>city builder</code>. One row per term. (Mode: Search.)

## `appIds` (type: `array`):

Numeric Steam app IDs (e.g. <code>730</code>, <code>292030</code>) or full store URLs (e.g. <code>https://store.steampowered.com/app/292030/</code>). Used by the App details and Reviews modes.

## `collection` (type: `string`):

Which Steam chart to pull. (Mode: Charts.)

## `sortBy` (type: `string`):

Ordering for the Search mode discovery results.

## `onlySpecials` (type: `boolean`):

In Search mode, return only games currently on sale. Leave Search terms empty with this on to browse ALL discounted games store-wide.

## `maxAppsPerQuery` (type: `integer`):

Cap the number of games returned per search term or chart.

## `fullDetails` (type: `boolean`):

For Charts, open each game for the complete record (full description, genres, categories, platforms, metacritic, release date, screenshots…). Off = a faster, lighter list (name, price, discount). Search always returns full records.

## `includeSteamSpy` (type: `boolean`):

Add SteamSpy enrichment to each full game record: estimated owners, peak concurrent players, average/median playtime, positive/negative votes and community tags — data the official store API does not expose.

## `maxReviewsPerApp` (type: `integer`):

How many reviews to fetch per app (Mode: Reviews). Steam paginates 100 at a time via a cursor; set high to capture the full history.

## `reviewsFilter` (type: `string`):

How reviews are ordered. <code>recent</code> = newest first (best for monitoring), <code>updated</code> = recently updated, <code>all</code> = Steam's relevance ranking. (Mode: Reviews.)

## `reviewLanguage` (type: `string`):

Steam language code to filter reviews (e.g. <code>english</code>, <code>schinese</code>, <code>russian</code>), or <code>all</code> for every language. (Mode: Reviews.)

## `reviewType` (type: `string`):

Limit reviews to positive, negative, or all. (Mode: Reviews.)

## `purchaseType` (type: `string`):

Limit reviews to Steam purchasers, non-Steam (key) activations, or all. (Mode: Reviews.)

## `country` (type: `string`):

Two-letter country code (e.g. <code>us</code>, <code>gb</code>, <code>de</code>, <code>br</code>). Affects pricing and availability.

## `language` (type: `string`):

Steam language for store text (e.g. <code>en</code>, <code>de</code>, <code>french</code>). Affects descriptions, genres and category labels.

## `monitorMode` (type: `boolean`):

Remember what was already returned and emit ONLY records not seen in previous runs (new games for a search/chart, or new reviews for an app). Pairs with Apify Schedules to track changes over time.

## `monitorStoreName` (type: `string`):

Named key-value store that holds the 'already seen' ids for monitoring mode. Use a different name per tracked target/query to keep their histories separate.

## `maxConcurrency` (type: `integer`):

Maximum parallel requests. Lower it if you hit rate limits on very large runs.

## `proxyConfiguration` (type: `object`):

Proxy settings. Steam's public store endpoints have no hard anti-bot, so the default Apify proxy is plenty; rotating IPs avoids per-IP rate limits on large runs.

## Actor input object example

```json
{
  "mode": "search",
  "searchTerms": [
    "roguelike"
  ],
  "appIds": [
    "730"
  ],
  "collection": "top_sellers",
  "sortBy": "relevance",
  "onlySpecials": false,
  "maxAppsPerQuery": 50,
  "fullDetails": true,
  "includeSteamSpy": true,
  "maxReviewsPerApp": 100,
  "reviewsFilter": "recent",
  "reviewLanguage": "all",
  "reviewType": "all",
  "purchaseType": "all",
  "country": "us",
  "language": "en",
  "monitorMode": false,
  "monitorStoreName": "steam-monitor",
  "maxConcurrency": 5,
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}
```

# Actor output Schema

## `results` (type: `string`):

All scraped records in the default dataset. Game rows carry full metadata, prices, derived analytics, publisher leads and optional SteamSpy stats; review rows carry the user feedback.

# API

You can run this Actor programmatically using our API. Below are code examples in JavaScript, Python, and CLI, as well as the OpenAPI specification and MCP server setup.

## JavaScript example

```javascript
import { ApifyClient } from 'apify-client';

// Initialize the ApifyClient with your Apify API token
// Replace the '<YOUR_API_TOKEN>' with your token
const client = new ApifyClient({
    token: '<YOUR_API_TOKEN>',
});

// Prepare Actor input
const input = {
    "searchTerms": [
        "roguelike"
    ],
    "appIds": [
        "730"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("scrapesage/steam-scraper").call(input);

// Fetch and print Actor results from the run's dataset (if any)
console.log('Results from dataset');
console.log(`💾 Check your data here: https://console.apify.com/storage/datasets/${run.defaultDatasetId}`);
const { items } = await client.dataset(run.defaultDatasetId).listItems();
items.forEach((item) => {
    console.dir(item);
});

// 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/js/docs

```

## Python example

```python
from apify_client import ApifyClient

# Initialize the ApifyClient with your Apify API token
# Replace '<YOUR_API_TOKEN>' with your token.
client = ApifyClient("<YOUR_API_TOKEN>")

# Prepare the Actor input
run_input = {
    "searchTerms": ["roguelike"],
    "appIds": ["730"],
}

# Run the Actor and wait for it to finish
run = client.actor("scrapesage/steam-scraper").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print("💾 Check your data here: https://console.apify.com/storage/datasets/" + run["defaultDatasetId"])
for item in client.dataset(run["defaultDatasetId"]).iterate_items():
    print(item)

# 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/python/docs/quick-start

```

## CLI example

```bash
echo '{
  "searchTerms": [
    "roguelike"
  ],
  "appIds": [
    "730"
  ]
}' |
apify call scrapesage/steam-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "command": "npx",
            "args": [
                "mcp-remote",
                "https://mcp.apify.com/?tools=scrapesage/steam-scraper",
                "--header",
                "Authorization: Bearer <YOUR_API_TOKEN>"
            ]
        }
    }
}

```

## OpenAPI specification

```json
{
    "openapi": "3.0.1",
    "info": {
        "title": "Steam Scraper — Games, Prices, Reviews & Charts",
        "description": "Scrape the Steam store: search games, full game details, prices & discounts, user reviews with sentiment, top sellers / new releases / specials charts, and SteamSpy owner & player stats. Publisher leads (website, support email), monitoring mode, any storefront. No login, no key, no browser.",
        "version": "0.1",
        "x-build-id": "UXg7jB97vVZgpLrch"
    },
    "servers": [
        {
            "url": "https://api.apify.com/v2"
        }
    ],
    "paths": {
        "/acts/scrapesage~steam-scraper/run-sync-get-dataset-items": {
            "post": {
                "operationId": "run-sync-get-dataset-items-scrapesage-steam-scraper",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor, waits for its completion, and returns Actor's dataset items in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK"
                    }
                }
            }
        },
        "/acts/scrapesage~steam-scraper/runs": {
            "post": {
                "operationId": "runs-sync-scrapesage-steam-scraper",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor and returns information about the initiated run in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/runsResponseSchema"
                                }
                            }
                        }
                    }
                }
            }
        },
        "/acts/scrapesage~steam-scraper/run-sync": {
            "post": {
                "operationId": "run-sync-scrapesage-steam-scraper",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor, waits for completion, and returns the OUTPUT from Key-value store in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK"
                    }
                }
            }
        }
    },
    "components": {
        "schemas": {
            "inputSchema": {
                "type": "object",
                "required": [
                    "mode"
                ],
                "properties": {
                    "mode": {
                        "title": "What to scrape",
                        "enum": [
                            "search",
                            "appDetails",
                            "charts",
                            "reviews"
                        ],
                        "type": "string",
                        "description": "Pick a job. Search finds games by keyword (or browse all). App details pulls the full record for specific games. Charts lists top sellers / new releases / specials / coming soon. Reviews pulls user reviews with a sentiment summary.",
                        "default": "search"
                    },
                    "searchTerms": {
                        "title": "Search terms",
                        "type": "array",
                        "description": "Keywords to search the Steam store for, e.g. <code>roguelike</code>, <code>city builder</code>. One row per term. (Mode: Search.)",
                        "items": {
                            "type": "string"
                        }
                    },
                    "appIds": {
                        "title": "App IDs / store URLs",
                        "type": "array",
                        "description": "Numeric Steam app IDs (e.g. <code>730</code>, <code>292030</code>) or full store URLs (e.g. <code>https://store.steampowered.com/app/292030/</code>). Used by the App details and Reviews modes.",
                        "items": {
                            "type": "string"
                        }
                    },
                    "collection": {
                        "title": "Chart",
                        "enum": [
                            "top_sellers",
                            "specials",
                            "new_releases",
                            "coming_soon"
                        ],
                        "type": "string",
                        "description": "Which Steam chart to pull. (Mode: Charts.)",
                        "default": "top_sellers"
                    },
                    "sortBy": {
                        "title": "Sort search results by",
                        "enum": [
                            "relevance",
                            "release_date",
                            "reviews",
                            "price_asc",
                            "price_desc",
                            "name"
                        ],
                        "type": "string",
                        "description": "Ordering for the Search mode discovery results.",
                        "default": "relevance"
                    },
                    "onlySpecials": {
                        "title": "Only discounted games (Search)",
                        "type": "boolean",
                        "description": "In Search mode, return only games currently on sale. Leave Search terms empty with this on to browse ALL discounted games store-wide.",
                        "default": false
                    },
                    "maxAppsPerQuery": {
                        "title": "Max games per query",
                        "minimum": 1,
                        "maximum": 500,
                        "type": "integer",
                        "description": "Cap the number of games returned per search term or chart.",
                        "default": 50
                    },
                    "fullDetails": {
                        "title": "Enrich chart games with full details",
                        "type": "boolean",
                        "description": "For Charts, open each game for the complete record (full description, genres, categories, platforms, metacritic, release date, screenshots…). Off = a faster, lighter list (name, price, discount). Search always returns full records.",
                        "default": true
                    },
                    "includeSteamSpy": {
                        "title": "Include SteamSpy stats",
                        "type": "boolean",
                        "description": "Add SteamSpy enrichment to each full game record: estimated owners, peak concurrent players, average/median playtime, positive/negative votes and community tags — data the official store API does not expose.",
                        "default": true
                    },
                    "maxReviewsPerApp": {
                        "title": "Max reviews per app",
                        "minimum": 1,
                        "maximum": 20000,
                        "type": "integer",
                        "description": "How many reviews to fetch per app (Mode: Reviews). Steam paginates 100 at a time via a cursor; set high to capture the full history.",
                        "default": 100
                    },
                    "reviewsFilter": {
                        "title": "Review order",
                        "enum": [
                            "recent",
                            "updated",
                            "all"
                        ],
                        "type": "string",
                        "description": "How reviews are ordered. <code>recent</code> = newest first (best for monitoring), <code>updated</code> = recently updated, <code>all</code> = Steam's relevance ranking. (Mode: Reviews.)",
                        "default": "recent"
                    },
                    "reviewLanguage": {
                        "title": "Review language",
                        "type": "string",
                        "description": "Steam language code to filter reviews (e.g. <code>english</code>, <code>schinese</code>, <code>russian</code>), or <code>all</code> for every language. (Mode: Reviews.)",
                        "default": "all"
                    },
                    "reviewType": {
                        "title": "Review type",
                        "enum": [
                            "all",
                            "positive",
                            "negative"
                        ],
                        "type": "string",
                        "description": "Limit reviews to positive, negative, or all. (Mode: Reviews.)",
                        "default": "all"
                    },
                    "purchaseType": {
                        "title": "Purchase type",
                        "enum": [
                            "all",
                            "steam",
                            "non_steam_purchase"
                        ],
                        "type": "string",
                        "description": "Limit reviews to Steam purchasers, non-Steam (key) activations, or all. (Mode: Reviews.)",
                        "default": "all"
                    },
                    "country": {
                        "title": "Country / storefront",
                        "type": "string",
                        "description": "Two-letter country code (e.g. <code>us</code>, <code>gb</code>, <code>de</code>, <code>br</code>). Affects pricing and availability.",
                        "default": "us"
                    },
                    "language": {
                        "title": "Language",
                        "type": "string",
                        "description": "Steam language for store text (e.g. <code>en</code>, <code>de</code>, <code>french</code>). Affects descriptions, genres and category labels.",
                        "default": "en"
                    },
                    "monitorMode": {
                        "title": "Monitoring mode — only new records",
                        "type": "boolean",
                        "description": "Remember what was already returned and emit ONLY records not seen in previous runs (new games for a search/chart, or new reviews for an app). Pairs with Apify Schedules to track changes over time.",
                        "default": false
                    },
                    "monitorStoreName": {
                        "title": "Monitor store name",
                        "type": "string",
                        "description": "Named key-value store that holds the 'already seen' ids for monitoring mode. Use a different name per tracked target/query to keep their histories separate.",
                        "default": "steam-monitor"
                    },
                    "maxConcurrency": {
                        "title": "Max concurrency",
                        "minimum": 1,
                        "maximum": 20,
                        "type": "integer",
                        "description": "Maximum parallel requests. Lower it if you hit rate limits on very large runs.",
                        "default": 5
                    },
                    "proxyConfiguration": {
                        "title": "Proxy configuration",
                        "type": "object",
                        "description": "Proxy settings. Steam's public store endpoints have no hard anti-bot, so the default Apify proxy is plenty; rotating IPs avoids per-IP rate limits on large runs.",
                        "default": {
                            "useApifyProxy": true
                        }
                    }
                }
            },
            "runsResponseSchema": {
                "type": "object",
                "properties": {
                    "data": {
                        "type": "object",
                        "properties": {
                            "id": {
                                "type": "string"
                            },
                            "actId": {
                                "type": "string"
                            },
                            "userId": {
                                "type": "string"
                            },
                            "startedAt": {
                                "type": "string",
                                "format": "date-time",
                                "example": "2025-01-08T00:00:00.000Z"
                            },
                            "finishedAt": {
                                "type": "string",
                                "format": "date-time",
                                "example": "2025-01-08T00:00:00.000Z"
                            },
                            "status": {
                                "type": "string",
                                "example": "READY"
                            },
                            "meta": {
                                "type": "object",
                                "properties": {
                                    "origin": {
                                        "type": "string",
                                        "example": "API"
                                    },
                                    "userAgent": {
                                        "type": "string"
                                    }
                                }
                            },
                            "stats": {
                                "type": "object",
                                "properties": {
                                    "inputBodyLen": {
                                        "type": "integer",
                                        "example": 2000
                                    },
                                    "rebootCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "restartCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "resurrectCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "computeUnits": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            },
                            "options": {
                                "type": "object",
                                "properties": {
                                    "build": {
                                        "type": "string",
                                        "example": "latest"
                                    },
                                    "timeoutSecs": {
                                        "type": "integer",
                                        "example": 300
                                    },
                                    "memoryMbytes": {
                                        "type": "integer",
                                        "example": 1024
                                    },
                                    "diskMbytes": {
                                        "type": "integer",
                                        "example": 2048
                                    }
                                }
                            },
                            "buildId": {
                                "type": "string"
                            },
                            "defaultKeyValueStoreId": {
                                "type": "string"
                            },
                            "defaultDatasetId": {
                                "type": "string"
                            },
                            "defaultRequestQueueId": {
                                "type": "string"
                            },
                            "buildNumber": {
                                "type": "string",
                                "example": "1.0.0"
                            },
                            "containerUrl": {
                                "type": "string"
                            },
                            "usage": {
                                "type": "object",
                                "properties": {
                                    "ACTOR_COMPUTE_UNITS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_WRITES": {
                                        "type": "integer",
                                        "example": 1
                                    },
                                    "KEY_VALUE_STORE_LISTS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_INTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_EXTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_SERPS": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            },
                            "usageTotalUsd": {
                                "type": "number",
                                "example": 0.00005
                            },
                            "usageUsd": {
                                "type": "object",
                                "properties": {
                                    "ACTOR_COMPUTE_UNITS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_WRITES": {
                                        "type": "number",
                                        "example": 0.00005
                                    },
                                    "KEY_VALUE_STORE_LISTS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_INTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_EXTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_SERPS": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }
}
```
