# Steam Game Scraper - Reviews, Players & Owners (`maydit/steam-game-intelligence-scraper`) Actor

Steam game scraper with no API key: merge store details, reviews, live player counts, and SteamSpy owner estimates into one row per game. Export CSV or JSON.

- **URL**: https://apify.com/maydit/steam-game-intelligence-scraper.md
- **Developed by:** [Brandt May](https://apify.com/maydit) (community)
- **Categories:** Business, Developer tools
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $5.00 / 1,000 results

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 Scraper - Reviews, Players & Ownership in One Dataset

> The only Steam game scraper that merges store details, reviews, live concurrent players, and SteamSpy ownership estimates into a single row per game - no API key required.

### What it does

This Steam game scraper pulls a complete market-intelligence snapshot for any Steam title and returns it as one clean row per game. Instead of a single-purpose price-and-reviews export, it merges **four public Steam data sources** - store details, user reviews, live concurrent player counts, and SteamSpy ownership estimates - so you get pricing, ratings, player activity, and owner estimates together in one dataset. Run it with no API key, query by Steam app ID or by search term, and export everything to CSV or JSON for market research, competitor analysis, or investment due diligence.

Use it as a Steam data API alternative: it returns game details, reviews, player counts, and ownership figures in one call, ready to drop into a spreadsheet, BI tool, or dashboard.

### Who it's for

- **Indie game developers** benchmarking competitors, genres, and pricing before launch
- **Publishers** tracking portfolio performance and rival titles
- **Game-market analysts** building genre, pricing, and player-trend datasets
- **Investors and VCs** running due diligence on studios and titles
- **Marketing and UA teams** sizing audiences and monitoring review sentiment
- **Competitive-research teams** watching what similar games do on discounts, tags, and player retention

### What you get (output)

Each game returns one merged row with the fields below. Review rows are returned separately when review enrichment is enabled.

| Field | Description |
|---|---|
| `name` | Game title |
| `gameType` | Type of app (game, DLC, etc.) |
| `isFree` | Whether the title is free-to-play |
| `price` | Current price |
| `discountPercent` | Active discount percentage |
| `releaseDate` | Store release date |
| `developers` | Developer(s) |
| `publishers` | Publisher(s) |
| `genres` | Steam genres |
| `categories` | Steam categories (e.g., multiplayer, controller support) |
| `shortDescription` | Store short description |
| `metacriticScore` | Metacritic score |
| `reviewScoreDesc` | Steam review summary label (e.g., "Very Positive") |
| `totalPositive` | Count of positive reviews |
| `totalNegative` | Count of negative reviews |
| `currentPlayers` | Live concurrent player count |
| `ownersEstimate` | SteamSpy owner estimate |
| `ownersEstimateMin` | Lower bound of the owner estimate |
| `ownersEstimateMax` | Upper bound of the owner estimate |
| `steamSpyCcu` | SteamSpy concurrent-user figure |
| `topTags` | Top community tags |
| `headerImage` | Store header image URL |
| `storeUrl` | Steam store page URL |

**Review rows** (when reviews are enabled): individual review records tied to each game, so you can export Steam reviews to CSV or JSON for sentiment work.

### Input / how to query

Two ways to select games, plus optional enrichment toggles:

**Modes**
- **By app ID** - pass one or more Steam app IDs to scrape exactly the titles you want
- **By search term** - pass search terms to discover matching games, then scrape them

**Filters and options**
- `app IDs` - target specific Steam titles directly
- `search terms` - discovery mode for finding games by keyword
- `include reviews` - add per-game review rows and review counts
- `include SteamSpy` - add owner estimates and SteamSpy CCU
- `include player count` - add live concurrent player counts
- `country` - set the country/region for pricing

Enable only the enrichment you need. Turn everything on for a full market-intelligence snapshot; keep it minimal for a fast price-and-rating pull.

### Example use cases

1. **Indie competitor benchmark** - feed a list of 50 rival app IDs, enable reviews + SteamSpy + player count, and export a single CSV comparing price, discount, review score, owner estimates, and live players across your genre.
2. **Sales and revenue estimation** - combine SteamSpy owner estimates with price and review counts to model a title's approximate sales and revenue for a pitch deck or investment memo.
3. **Genre trend dataset** - use search-term discovery to pull every game matching a keyword (e.g., "roguelike deckbuilder"), then build a dataset of tags, pricing, and player activity.
4. **Live player-count monitoring** - schedule daily runs on a watchlist of app IDs to track concurrent players over time and spot momentum shifts.
5. **Review sentiment export** - enable reviews on a set of titles to export Steam reviews to JSON for sentiment analysis or feature-request mining.

### Recurring use and scheduling

For monitoring, run this on a schedule (Apify **Schedules**) - daily or weekly against a fixed list of app IDs. Live `currentPlayers`, `discountPercent`, review counts, and SteamSpy figures all change over time, so recurring runs build a trend history for prices, players, ratings, and ownership.

To keep a single growing table clean, use **dataset deduplication** by keying on the game (app ID) so each scheduled run updates rather than duplicates rows, or append timestamped snapshots when you want a time series. Point the output at your storage, BI tool, or webhook to feed dashboards automatically.

### FAQ

#### How do I scrape Steam game data without an API key?
Run this actor - it reads public Steam storefront and SteamSpy data directly, so no Steam API key is required. Just provide app IDs or search terms and it returns the merged dataset.

#### How can I export Steam reviews to CSV or JSON?
Enable the **include reviews** option. The actor returns individual review rows alongside each game, and every Apify dataset exports to CSV, JSON, Excel, and other formats.

#### How do I estimate a Steam game's sales and revenue from reviews?
Enable **include SteamSpy** to get `ownersEstimate` (with min/max bounds). Combine those owner estimates with `price` and the positive/negative review counts to model approximate sales and revenue in your own spreadsheet.

#### How do I get SteamSpy owner estimates in bulk?
Pass a list of app IDs (or discover them with search terms), enable **include SteamSpy**, and each row returns `ownersEstimate`, `ownersEstimateMin`, `ownersEstimateMax`, and `steamSpyCcu`.

#### How can I track live concurrent player counts for Steam games?
Enable **include player count** to get `currentPlayers` per title, then schedule the run daily or hourly on a watchlist to track concurrent players over time.

#### What is the best tool to research Steam competitors for my indie game?
Use search-term discovery to find rival titles in your genre, then enable reviews, SteamSpy, and player count to compare pricing, discounts, ratings, owner estimates, and live players side by side in one export.

#### How do I pull Steam price, discount, and Metacritic data for many games at once?
Pass multiple app IDs (or search terms) in a single run. Each row returns `price`, `discountPercent`, and `metacriticScore` along with the rest of the store details - no per-game API calls to manage.

#### How do I get Steam store, reviews, players, and ownership data in one dataset?
That is exactly what this scraper is built for. Enable all three enrichments and each game row merges store details, review counts, live `currentPlayers`, and SteamSpy ownership estimates together.

#### Is there a Steam API alternative that returns game details, reviews, and player counts together?
Yes - this actor merges Steam store details, review data, live player counts, and SteamSpy ownership into one row per game, without requiring a Steam API key, so it works as a drop-in data source for research pipelines.

#### How do I collect Steam data for market analysis or investment research?
Query the titles or genres you care about, enable SteamSpy and player-count enrichment, and export the merged dataset. The owner estimates, pricing, review scores, and player counts give you the inputs for market sizing and due diligence.

### Data source and notes

- **Sources:** Public Steam storefront endpoints (`appdetails`, `appreviews`, and current-players data) plus **SteamSpy** for ownership estimates. No Steam API key is used.
- **Public data:** All fields come from publicly accessible Steam and SteamSpy data.
- **Estimates are estimates:** `ownersEstimate`, `ownersEstimateMin/Max`, and `steamSpyCcu` are SteamSpy's modeled figures, not official Steam sales numbers. Treat them as directional, not exact.
- **Live values change:** `currentPlayers`, `price`, `discountPercent`, and review counts are point-in-time; schedule recurring runs to build history.
- **Regional pricing:** set the `country` option to control the currency/region of price fields.

# Actor input Schema

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

Steam app IDs to analyze, e.g. 730 (CS2), 292030 (The Witcher 3). Find the ID in any Steam store URL: store.steampowered.com/app/<ID>/.
## `searchTerms` (type: `array`):

Alternatively (or additionally), search the Steam store by term — e.g. 'roguelike deckbuilder'. Each term resolves to Steam's top 10 matching games.
## `includeReviews` (type: `boolean`):

Also output the most recent written reviews for each game as separate records (with playtime, votes, language, refunded flag).
## `maxReviewsPerGame` (type: `integer`):

How many recent reviews to fetch per game (when review texts are enabled).
## `includeSteamSpy` (type: `boolean`):

Enrich each game with SteamSpy data: estimated owner range, daily peak CCU, and top community tags. Adds ~1s per game (SteamSpy rate limit).
## `includePlayerCount` (type: `boolean`):

Fetch the current number of in-game players for each game.
## `country` (type: `string`):

Two-letter country code for pricing (e.g. 'us', 'de', 'jp').
## `maxResults` (type: `integer`):

Upper bound on total records (games + reviews) per run.

## Actor input object example

```json
{
  "appIds": [
    "730"
  ],
  "searchTerms": [],
  "includeReviews": false,
  "maxReviewsPerGame": 20,
  "includeSteamSpy": true,
  "includePlayerCount": true,
  "country": "us",
  "maxResults": 1000
}
````

# 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 = {
    "appIds": [
        "730"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("maydit/steam-game-intelligence-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 = { "appIds": ["730"] }

# Run the Actor and wait for it to finish
run = client.actor("maydit/steam-game-intelligence-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 '{
  "appIds": [
    "730"
  ]
}' |
apify call maydit/steam-game-intelligence-scraper --silent --output-dataset

```

## MCP server setup

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

```

## OpenAPI specification

```json
{
    "openapi": "3.0.1",
    "info": {
        "title": "Steam Game Scraper - Reviews, Players & Owners",
        "description": "Steam game scraper with no API key: merge store details, reviews, live player counts, and SteamSpy owner estimates into one row per game. Export CSV or JSON.",
        "version": "1.0",
        "x-build-id": "ZfKJdjwgZM3WLwdxT"
    },
    "servers": [
        {
            "url": "https://api.apify.com/v2"
        }
    ],
    "paths": {
        "/acts/maydit~steam-game-intelligence-scraper/run-sync-get-dataset-items": {
            "post": {
                "operationId": "run-sync-get-dataset-items-maydit-steam-game-intelligence-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/maydit~steam-game-intelligence-scraper/runs": {
            "post": {
                "operationId": "runs-sync-maydit-steam-game-intelligence-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/maydit~steam-game-intelligence-scraper/run-sync": {
            "post": {
                "operationId": "run-sync-maydit-steam-game-intelligence-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",
                "properties": {
                    "appIds": {
                        "title": "Steam app IDs",
                        "type": "array",
                        "description": "Steam app IDs to analyze, e.g. 730 (CS2), 292030 (The Witcher 3). Find the ID in any Steam store URL: store.steampowered.com/app/<ID>/.",
                        "items": {
                            "type": "string"
                        }
                    },
                    "searchTerms": {
                        "title": "Search terms",
                        "type": "array",
                        "description": "Alternatively (or additionally), search the Steam store by term — e.g. 'roguelike deckbuilder'. Each term resolves to Steam's top 10 matching games.",
                        "default": [],
                        "items": {
                            "type": "string"
                        }
                    },
                    "includeReviews": {
                        "title": "Include review texts",
                        "type": "boolean",
                        "description": "Also output the most recent written reviews for each game as separate records (with playtime, votes, language, refunded flag).",
                        "default": false
                    },
                    "maxReviewsPerGame": {
                        "title": "Max reviews per game",
                        "minimum": 1,
                        "maximum": 2000,
                        "type": "integer",
                        "description": "How many recent reviews to fetch per game (when review texts are enabled).",
                        "default": 20
                    },
                    "includeSteamSpy": {
                        "title": "Include ownership estimates (SteamSpy)",
                        "type": "boolean",
                        "description": "Enrich each game with SteamSpy data: estimated owner range, daily peak CCU, and top community tags. Adds ~1s per game (SteamSpy rate limit).",
                        "default": true
                    },
                    "includePlayerCount": {
                        "title": "Include live player count",
                        "type": "boolean",
                        "description": "Fetch the current number of in-game players for each game.",
                        "default": true
                    },
                    "country": {
                        "title": "Price region",
                        "type": "string",
                        "description": "Two-letter country code for pricing (e.g. 'us', 'de', 'jp').",
                        "default": "us"
                    },
                    "maxResults": {
                        "title": "Max results",
                        "minimum": 1,
                        "type": "integer",
                        "description": "Upper bound on total records (games + reviews) per run.",
                        "default": 1000
                    }
                }
            },
            "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
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }
}
```
