# Steam Game Data Scraper — Global Pricing, Reviews & Metadata (`slothtechlabs/steam-game-data-scraper`) Actor

Scrape Steam game data across 60 countries — pricing, user reviews, top sellers, Metacritic scores, and metadata. Browse by tag (genre). The affordable SteamDB / Gamalytic alternative for indie developers, publishers, and market researchers. Just pick a tag and click Start — zero config needed.

- **URL**: https://apify.com/slothtechlabs/steam-game-data-scraper.md
- **Developed by:** [SlothTechLabs](https://apify.com/slothtechlabs) (community)
- **Categories:** Developer tools, Automation, Other
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, NaN bookmarks
- **User rating**: No ratings yet

## Pricing

$3.00 / 1,000 game data rows

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 Game Data Scraper — Global Pricing, Reviews & Metadata

Scrape **Steam** game data across **60 countries** in a single run — regional pricing, user reviews, Metacritic scores, genres, and metadata. An affordable, export-first alternative to **SteamDB** and **Gamalytic** — pipe results straight into your spreadsheet, database, or BI tool.

### ✨ What does this scraper do?

This Actor returns Steam game listings filtered by tag (genre), enriched with regional pricing across up to 60 countries — delivered as a flat table ready for Google Sheets, BigQuery, or any CSV tool.

| Feature | Details |
|---------|---------|
| 🏷️ **Browse by tag** | 27 popular tags — Roguelike, Action, Indie, RPG, Souls-like, and more |
| 🌍 **60 countries** | US, Japan, Germany, UK, Brazil, India, and more — one row per game × country |
| 💲 **Regional pricing** | Current price, original price, discount %, and currency per country |
| ⭐ **User reviews** | Total reviews, positive %, and summary (e.g. "Very Positive") |
| 🎮 **Metadata** | Platforms, release date, tags, store URL, header image |
| 🧩 **Optional enrichment** | Developer, publisher, Metacritic, genres, description, screenshots |
| 🔍 **Filters & sort** | Min reviews, max price (USD), sort by Top Sellers / Release Date / etc. |
| ⚡ **Zero config** | Pick a tag, click Start — sensible defaults everywhere |

#### Zero-config start

Click **Start** with default settings — you'll immediately get the **Top 100 Roguelike games in the US**, fully enriched with pricing, reviews, and metadata.

### 💰 Cost comparison

| Feature | SteamDB | Gamalytic | **This Actor** |
|---------|:-------:|:---------:|:--------------:|
| 💳 No monthly commitment | ✅ (free) | ❌ subscription | ✅ |
| 📤 Bulk export (CSV / JSON / Excel) | ❌ view only | ✅ | ✅ |
| 🔗 Google Sheets / BigQuery sync | ❌ | ❌ | ✅ |
| ⏰ Automated scheduling | ❌ | ❌ | ✅ |
| **Score** | **1 / 4** | **1 / 4** | **4 / 4** |

Plus, this Actor delivers **multi-country pricing across 60 regions** in a single run — the same global coverage as Gamalytic and SteamDB, without their subscription or web-only limitations.

For users who need **structured, exportable Steam data** — not real-time sales estimates or revenue models — this Actor delivers catalog, pricing, and review data without a seat-based subscription, starting from **~$0.30 per run**.

### 🎯 Use cases

- **Indie developers** — Track competitor pricing, discount patterns, and review momentum across your genre to price your own game confidently.
- **Publishers** — Benchmark regional pricing strategies (US vs JP vs BR) for localization and launch planning.
- **Market researchers** — Analyze genre trends, review distributions, and price tiers with structured, timestamped data.
- **Steam key resellers & deal sites** — Monitor discount rotations and currency-adjusted pricing across markets.
- **Data journalists** — Build stories on platform economics (price parity, regional discounting, indie vs AAA review gaps).

### 📖 How to use

#### Step 1: Configure input

1. **Tags** — Pick one or more genres (multiple = AND filter). Default: Roguelike.
2. **Countries** — Choose regions for pricing. Default: US. Each country adds one row per game.
3. **Max games** — 1 to 10,000. Default: 100.
4. **Sort by** (optional) — Relevance / Release Date / User Reviews / Top Sellers / Name.
5. **Enriched fields** (optional) — Toggle on for developer, publisher, Metacritic, genres, description, screenshots.
6. **Filters** (optional) — Minimum reviews, Max price (USD).

#### Step 2: Run

Click **Start**. Runtime scales with `games × countries` and enrichment toggle.

#### Step 3: Export

Download as **CSV**, **JSON**, **Excel**, or auto-sync to **Google Sheets** / **BigQuery** / a **webhook** via [Apify integrations](https://docs.apify.com/platform/integrations).

#### Input example: Compare Roguelike pricing across JP / US / BR

```json
{
  "tags": ["Roguelike"],
  "countryCodes": ["us", "jp", "br"],
  "maxResults": 50,
  "sortBy": "Top Sellers",
  "includeEnrichedFields": true,
  "minReviews": 500
}
````

This produces: **50 games × 3 countries = 150 rows** with full enrichment — ready to analyze regional discount spreads and pricing parity.

### 📊 Output

Each row represents **one game in one country**. The flat structure is ideal for pivot tables, time-series tracking, and direct import into analytical tools.

| Field | Type | Description | Example |
|-------|------|-------------|---------|
| `appId` | integer | Steam App ID | `1245620` |
| `name` | string | Game title | `"ELDEN RING"` |
| `headerImage` | string | Header image URL | `"https://cdn.cloudflare.steamstatic.com/..."` |
| `storeUrl` | string | Steam store page URL | `"https://store.steampowered.com/app/1245620/"` |
| `countryCode` | string | ISO country code (lower) | `"jp"` |
| `price` | string | null | Displayed price (Free → `"Free"`) | `"¥9,020"` |
| `priceRaw` | integer | null | Price × 100 (Steam convention, currency-adjusted) | `902000` |
| `priceOriginal` | string | Pre-discount price (= `price` when no discount) | `"¥9,020"` |
| `priceOriginalRaw` | integer | Pre-discount raw value (= `priceRaw` when no discount) | `902000` |
| `currency` | string | ISO 4217 currency code | `"JPY"` |
| `discountPercent` | integer | Discount % (0 if not on sale) | `33` |
| `reviewScoreDesc` | string | Review summary (e.g. `"Very Positive"`, or `"No user reviews"`) | `"Very Positive"` |
| `reviewScorePercent` | integer | null | Positive review % | `95` |
| `totalReviews` | integer | Total user review count | `812411` |
| `releaseDate` | string | ISO date (`YYYY-MM-DD`), or original string if unparseable (e.g. `"Coming soon"`) | `"2022-02-24"` |
| `platforms` | object | `{ windows, mac, linux }` booleans | `{"windows": true, "mac": false, "linux": false}` |
| `tagIds` | integer\[] | Steam tag IDs | `[1716, 9]` |
| `tagNames` | string\[] | Human-readable tag names | `["Roguelike", "Souls-like"]` |
| `developer` | string | null | *(enriched)* Developer name | `"FromSoftware Inc."` |
| `publisher` | string | null | *(enriched)* Publisher name | `"Bandai Namco Entertainment"` |
| `genres` | string\[] | *(enriched)* Official Steam genres | `["Action", "RPG"]` |
| `metacriticScore` | integer | null | *(enriched)* Metacritic score (only for reviewed titles) | `94` |
| `shortDescription` | string | null | *(enriched)* Steam short description | `"THE CRITICALLY ACCLAIMED..."` |
| `screenshots` | string\[] | *(enriched)* Screenshot URLs | `["https://cdn/...1.jpg", ...]` |
| `scrapedAt` | string | UTC timestamp (ISO 8601) | `"2026-04-15T12:00:00.000Z"` |

> Enriched fields (marked *(enriched)*) only populate when **Include enriched fields** is ON.

#### Output example (Roguelike, Japan, on sale)

```json
{
  "appId": 646570,
  "name": "Slay the Spire",
  "headerImage": "https://cdn.cloudflare.steamstatic.com/steam/apps/646570/header.jpg",
  "storeUrl": "https://store.steampowered.com/app/646570/",
  "countryCode": "jp",
  "price": "¥1,650",
  "priceRaw": 165000,
  "priceOriginal": "¥3,300",
  "priceOriginalRaw": 330000,
  "currency": "JPY",
  "discountPercent": 50,
  "reviewScoreDesc": "Overwhelmingly Positive",
  "reviewScorePercent": 96,
  "totalReviews": 108742,
  "releaseDate": "2019-01-23",
  "platforms": { "windows": true, "mac": true, "linux": true },
  "tagIds": [1716, 3859],
  "tagNames": ["Roguelike", "Deckbuilding"],
  "developer": "Mega Crit",
  "publisher": "Mega Crit",
  "genres": ["Indie", "Strategy"],
  "metacriticScore": 89,
  "shortDescription": "We fused card games and roguelikes together to make the best single player deckbuilder we could.",
  "screenshots": ["https://cdn.cloudflare.steamstatic.com/..."],
  "scrapedAt": "2026-04-15T12:00:00.000Z"
}
```

### 📅 Daily scheduling for trend tracking

This Actor is optimized for **daily scheduled runs**. Set up an [Apify Schedule](https://docs.apify.com/platform/schedules) to build a historical pricing and review dataset.

**Recommended workflow:**

1. Configure your target tags, countries, and filters
2. Set a daily schedule (e.g. 09:00 UTC)
3. Connect a [Google Sheets or BigQuery integration](https://docs.apify.com/platform/integrations)
4. Track discount cycles, review momentum, and regional pricing shifts over weeks and months

### 💵 Pricing

This Actor uses **pay-per-event** pricing — you pay only for the rows you extract.

| Event | Charge | Description |
|-------|:------:|-------------|
| Game data row | **$0.003** | One game entry per country (price, reviews, metadata) |

#### Cost examples

| Use case | Configuration | Rows | Cost / run | Monthly (daily) |
|----------|---------------|:----:|:----------:|:---------------:|
| 🟢 Light | Roguelike, US only, Top 100 | 100 | ~$0.30 | ~$9 |
| 🔵 Standard | Roguelike, 3 countries, Top 100 | 300 | ~$0.90 | ~$27 |
| 🟣 Full catalog sweep | 3 tags, 10 countries, 1,000 games | 10,000 | ~$30 | — |

With Apify's **free tier** ($5 credit), you can run the Standard daily schedule for ~5 days — or the Light setup for ~16 days — completely free.

### 🏷️ Supported tags (27)

<details>
<summary><strong>View all supported tags</strong></summary>

Action · Adventure · Arcade · Action-Adventure · Casual · Fantasy · Fighting · Free to Play · Horror · Indie · JRPG · Massively Multiplayer · Metroidvania · Open World · Pixel Graphics · Platformer · Puzzle · RPG · Racing · Rogue-lite · Roguelike · Sandbox · Shooter · Simulation · Souls-like · Strategy · Survival

</details>

Multiple tags apply an **AND filter** — a game must match all selected tags to appear.

### 🌍 Supported countries (60)

<details>
<summary><strong>View all supported countries</strong></summary>

🇺🇸 United States · 🇬🇧 United Kingdom · 🇯🇵 Japan · 🇰🇷 South Korea · 🇨🇳 China · 🇩🇪 Germany · 🇫🇷 France · 🇦🇺 Australia · 🇨🇦 Canada · 🇧🇷 Brazil · 🇮🇳 India · 🇲🇽 Mexico · 🇮🇹 Italy · 🇪🇸 Spain · 🇳🇱 Netherlands · 🇸🇪 Sweden · 🇳🇴 Norway · 🇩🇰 Denmark · 🇫🇮 Finland · 🇨🇭 Switzerland · 🇦🇹 Austria · 🇧🇪 Belgium · 🇵🇹 Portugal · 🇮🇪 Ireland · 🇳🇿 New Zealand · 🇸🇬 Singapore · 🇭🇰 Hong Kong · 🇹🇼 Taiwan · 🇹🇭 Thailand · 🇲🇾 Malaysia · 🇵🇭 Philippines · 🇮🇩 Indonesia · 🇻🇳 Vietnam · 🇸🇦 Saudi Arabia · 🇦🇪 UAE · 🇮🇱 Israel · 🇹🇷 Turkey · 🇷🇺 Russia · 🇵🇱 Poland · 🇨🇿 Czech Republic · 🇭🇺 Hungary · 🇷🇴 Romania · 🇧🇬 Bulgaria · 🇭🇷 Croatia · 🇸🇰 Slovakia · 🇸🇮 Slovenia · 🇱🇹 Lithuania · 🇱🇻 Latvia · 🇪🇪 Estonia · 🇬🇷 Greece · 🇺🇦 Ukraine · 🇿🇦 South Africa · 🇳🇬 Nigeria · 🇰🇪 Kenya · 🇪🇬 Egypt · 🇦🇷 Argentina · 🇨🇱 Chile · 🇨🇴 Colombia · 🇵🇪 Peru · 🇵🇰 Pakistan

</details>

### 💡 Notes & tips

- **Regional result differences**: Steam ranks tag-search results per country, so selecting multiple countries may return partially different game sets — a title popular in Japan may not appear in the US top results. Raise **Max games** to improve overlap.
- **Metacritic sparseness**: Metacritic scores only populate for titles actually reviewed by Metacritic (mostly AAA). Indie titles will show `metacriticScore: null` — this is not a scraper issue; Steam has no Metacritic data for those games.
- **Free-to-play**: `price` displays `"Free"` and `priceRaw` is `0`.
- **No discount**: `priceOriginal` equals `price` (not empty) — easy to compare without null handling.
- **No reviews yet**: `reviewScoreDesc` shows `"No user reviews"` instead of null.
- **Max price filter**: Applied **per game** using the base USD price (not per country). If a game passes the filter, rows for all selected countries are returned — regardless of each country's local price.
- **No price data**: For some titles (unreleased, region-locked, or delisted) Steam returns no price. In those rows `price`, `priceRaw`, `priceOriginal`, and `priceOriginalRaw` are all `null`.

### ⚙️ Technical details

| Aspect | Details |
|--------|---------|
| **Data freshness** | Real-time — data is fetched directly from Steam at the time of each run |
| **Error handling** | Partial failure tolerance — a failure on one game or country does not abort the run; successful rows are saved |
| **Memory** | 256–2048 MB (default: 512 MB) |
| **Proxy support** | Optional Apify proxy for large-scale runs |

### 📬 Feedback & support

Have a feature request, need another tag or country added, or hit an issue? Open an issue on the Actor's page in Apify Console — we'd love to hear from you.

# Actor input Schema

## `tags` (type: `array`):

Pick one or more Steam tags. Multiple tags = AND filter (games must match all). Default: Roguelike.

## `countryCodes` (type: `array`):

Select countries for regional pricing. Each country adds one row per game (Max games × countries = total rows). Note: Steam ranks tag search results per country, so selecting multiple countries may return partially different game sets — a title popular in Japan may not appear in the US top results, and vice versa. This reflects Steam's regional popularity ordering, not a scraper issue. To maximize overlap, increase Max games.

## `maxResults` (type: `integer`):

Maximum number of games to return (1–10,000). Total rows = games × countries.

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

Sort order for browse results.

## `includeEnrichedFields` (type: `boolean`):

Fetch Steam appdetails for each game to add developer, publisher, Metacritic score, genres, description, and screenshots. Increases run time but not price per row. Note: Metacritic score is only populated for titles actually reviewed by Metacritic (mostly AAA games) — indie and smaller titles will show Metacritic as empty. This is not a scraper issue; Steam simply has no Metacritic data for those games.

## `minReviews` (type: `integer`):

Only include games with at least this many user reviews. Set to 0 for no filter. Newly released titles may have very few reviews — raise this value (e.g. 500+) to filter to games with established reputations.

## `maxPrice` (type: `integer`):

Only include games at or below this price, compared in USD (regardless of the selected countries). Set to 0 for free-to-play only. Leave empty for no filter. The filter uses the game's base price in Steam's internal USD value; rows for other currencies are still returned but filtered on the same USD reference.

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

Optional proxy to avoid rate limits at scale.

## Actor input object example

```json
{
  "tags": [
    "Roguelike"
  ],
  "countryCodes": [
    "us"
  ],
  "maxResults": 100,
  "sortBy": "Relevance",
  "includeEnrichedFields": false,
  "minReviews": 0,
  "proxyConfiguration": {
    "useApifyProxy": false
  }
}
```

# Actor output Schema

## `games` (type: `string`):

No description

# 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 = {
    "tags": [
        "Roguelike"
    ],
    "countryCodes": [
        "us"
    ],
    "maxResults": 100
};

// Run the Actor and wait for it to finish
const run = await client.actor("slothtechlabs/steam-game-data-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 = {
    "tags": ["Roguelike"],
    "countryCodes": ["us"],
    "maxResults": 100,
}

# Run the Actor and wait for it to finish
run = client.actor("slothtechlabs/steam-game-data-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 '{
  "tags": [
    "Roguelike"
  ],
  "countryCodes": [
    "us"
  ],
  "maxResults": 100
}' |
apify call slothtechlabs/steam-game-data-scraper --silent --output-dataset

```

## MCP server setup

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

```

## OpenAPI specification

```json
{
    "openapi": "3.0.1",
    "info": {
        "title": "Steam Game Data Scraper — Global Pricing, Reviews & Metadata",
        "description": "Scrape Steam game data across 60 countries — pricing, user reviews, top sellers, Metacritic scores, and metadata. Browse by tag (genre). The affordable SteamDB / Gamalytic alternative for indie developers, publishers, and market researchers. Just pick a tag and click Start — zero config needed.",
        "version": "0.1",
        "x-build-id": "Pf7iU5hnT6wVAF8mc"
    },
    "servers": [
        {
            "url": "https://api.apify.com/v2"
        }
    ],
    "paths": {
        "/acts/slothtechlabs~steam-game-data-scraper/run-sync-get-dataset-items": {
            "post": {
                "operationId": "run-sync-get-dataset-items-slothtechlabs-steam-game-data-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/slothtechlabs~steam-game-data-scraper/runs": {
            "post": {
                "operationId": "runs-sync-slothtechlabs-steam-game-data-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/slothtechlabs~steam-game-data-scraper/run-sync": {
            "post": {
                "operationId": "run-sync-slothtechlabs-steam-game-data-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": [
                    "tags"
                ],
                "properties": {
                    "tags": {
                        "title": "Steam Tags",
                        "type": "array",
                        "description": "Pick one or more Steam tags. Multiple tags = AND filter (games must match all). Default: Roguelike.",
                        "items": {
                            "type": "string",
                            "enum": [
                                "Action",
                                "Adventure",
                                "Arcade",
                                "Action-Adventure",
                                "Casual",
                                "Fantasy",
                                "Fighting",
                                "Free to Play",
                                "Horror",
                                "Indie",
                                "JRPG",
                                "Massively Multiplayer",
                                "Metroidvania",
                                "Open World",
                                "Pixel Graphics",
                                "Platformer",
                                "Puzzle",
                                "RPG",
                                "Racing",
                                "Rogue-lite",
                                "Roguelike",
                                "Sandbox",
                                "Shooter",
                                "Simulation",
                                "Souls-like",
                                "Strategy",
                                "Survival"
                            ],
                            "enumTitles": [
                                "Action",
                                "Adventure",
                                "Arcade",
                                "Action-Adventure",
                                "Casual",
                                "Fantasy",
                                "Fighting",
                                "Free to Play",
                                "Horror",
                                "Indie",
                                "JRPG",
                                "Massively Multiplayer",
                                "Metroidvania",
                                "Open World",
                                "Pixel Graphics",
                                "Platformer",
                                "Puzzle",
                                "RPG",
                                "Racing",
                                "Rogue-lite",
                                "Roguelike",
                                "Sandbox",
                                "Shooter",
                                "Simulation",
                                "Souls-like",
                                "Strategy",
                                "Survival"
                            ]
                        },
                        "default": [
                            "Roguelike"
                        ]
                    },
                    "countryCodes": {
                        "title": "Countries (for pricing)",
                        "type": "array",
                        "description": "Select countries for regional pricing. Each country adds one row per game (Max games × countries = total rows). Note: Steam ranks tag search results per country, so selecting multiple countries may return partially different game sets — a title popular in Japan may not appear in the US top results, and vice versa. This reflects Steam's regional popularity ordering, not a scraper issue. To maximize overlap, increase Max games.",
                        "items": {
                            "type": "string",
                            "enum": [
                                "us",
                                "gb",
                                "jp",
                                "kr",
                                "cn",
                                "de",
                                "fr",
                                "au",
                                "ca",
                                "br",
                                "in",
                                "mx",
                                "it",
                                "es",
                                "nl",
                                "se",
                                "no",
                                "dk",
                                "fi",
                                "ch",
                                "at",
                                "be",
                                "pt",
                                "ie",
                                "nz",
                                "sg",
                                "hk",
                                "tw",
                                "th",
                                "my",
                                "ph",
                                "id",
                                "vn",
                                "sa",
                                "ae",
                                "il",
                                "tr",
                                "ru",
                                "pl",
                                "cz",
                                "hu",
                                "ro",
                                "bg",
                                "hr",
                                "sk",
                                "si",
                                "lt",
                                "lv",
                                "ee",
                                "gr",
                                "ua",
                                "za",
                                "ng",
                                "ke",
                                "eg",
                                "ar",
                                "cl",
                                "co",
                                "pe",
                                "pk"
                            ],
                            "enumTitles": [
                                "🇺🇸 United States",
                                "🇬🇧 United Kingdom",
                                "🇯🇵 Japan",
                                "🇰🇷 South Korea",
                                "🇨🇳 China",
                                "🇩🇪 Germany",
                                "🇫🇷 France",
                                "🇦🇺 Australia",
                                "🇨🇦 Canada",
                                "🇧🇷 Brazil",
                                "🇮🇳 India",
                                "🇲🇽 Mexico",
                                "🇮🇹 Italy",
                                "🇪🇸 Spain",
                                "🇳🇱 Netherlands",
                                "🇸🇪 Sweden",
                                "🇳🇴 Norway",
                                "🇩🇰 Denmark",
                                "🇫🇮 Finland",
                                "🇨🇭 Switzerland",
                                "🇦🇹 Austria",
                                "🇧🇪 Belgium",
                                "🇵🇹 Portugal",
                                "🇮🇪 Ireland",
                                "🇳🇿 New Zealand",
                                "🇸🇬 Singapore",
                                "🇭🇰 Hong Kong",
                                "🇹🇼 Taiwan",
                                "🇹🇭 Thailand",
                                "🇲🇾 Malaysia",
                                "🇵🇭 Philippines",
                                "🇮🇩 Indonesia",
                                "🇻🇳 Vietnam",
                                "🇸🇦 Saudi Arabia",
                                "🇦🇪 UAE",
                                "🇮🇱 Israel",
                                "🇹🇷 Turkey",
                                "🇷🇺 Russia",
                                "🇵🇱 Poland",
                                "🇨🇿 Czech Republic",
                                "🇭🇺 Hungary",
                                "🇷🇴 Romania",
                                "🇧🇬 Bulgaria",
                                "🇭🇷 Croatia",
                                "🇸🇰 Slovakia",
                                "🇸🇮 Slovenia",
                                "🇱🇹 Lithuania",
                                "🇱🇻 Latvia",
                                "🇪🇪 Estonia",
                                "🇬🇷 Greece",
                                "🇺🇦 Ukraine",
                                "🇿🇦 South Africa",
                                "🇳🇬 Nigeria",
                                "🇰🇪 Kenya",
                                "🇪🇬 Egypt",
                                "🇦🇷 Argentina",
                                "🇨🇱 Chile",
                                "🇨🇴 Colombia",
                                "🇵🇪 Peru",
                                "🇵🇰 Pakistan"
                            ]
                        },
                        "default": [
                            "us"
                        ]
                    },
                    "maxResults": {
                        "title": "Max games",
                        "minimum": 1,
                        "maximum": 10000,
                        "type": "integer",
                        "description": "Maximum number of games to return (1–10,000). Total rows = games × countries.",
                        "default": 100
                    },
                    "sortBy": {
                        "title": "Sort by",
                        "enum": [
                            "Relevance",
                            "Release Date",
                            "User Reviews",
                            "Top Sellers",
                            "Name"
                        ],
                        "type": "string",
                        "description": "Sort order for browse results.",
                        "default": "Relevance"
                    },
                    "includeEnrichedFields": {
                        "title": "Include enriched fields (developer, Metacritic, genres, description)",
                        "type": "boolean",
                        "description": "Fetch Steam appdetails for each game to add developer, publisher, Metacritic score, genres, description, and screenshots. Increases run time but not price per row. Note: Metacritic score is only populated for titles actually reviewed by Metacritic (mostly AAA games) — indie and smaller titles will show Metacritic as empty. This is not a scraper issue; Steam simply has no Metacritic data for those games.",
                        "default": false
                    },
                    "minReviews": {
                        "title": "Minimum reviews",
                        "minimum": 0,
                        "type": "integer",
                        "description": "Only include games with at least this many user reviews. Set to 0 for no filter. Newly released titles may have very few reviews — raise this value (e.g. 500+) to filter to games with established reputations.",
                        "default": 0
                    },
                    "maxPrice": {
                        "title": "Max price (USD)",
                        "minimum": 0,
                        "type": "integer",
                        "description": "Only include games at or below this price, compared in USD (regardless of the selected countries). Set to 0 for free-to-play only. Leave empty for no filter. The filter uses the game's base price in Steam's internal USD value; rows for other currencies are still returned but filtered on the same USD reference."
                    },
                    "proxyConfiguration": {
                        "title": "Proxy configuration",
                        "type": "object",
                        "description": "Optional proxy to avoid rate limits at scale.",
                        "default": {
                            "useApifyProxy": false
                        }
                    }
                }
            },
            "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
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }
}
```
