# Steam Scraper: game prices, details and Steam reviews (`bepolabs/steam`) Actor

Feed spreadsheets or AI agents with store pages of games: tags, critic scores, regions and written feedback from owners, found by search term or app number.

- **URL**: https://apify.com/bepolabs/steam.md
- **Developed by:** [BEPO Labs](https://apify.com/bepolabs) (community)
- **Categories:** E-commerce, Developer tools, AI
- **Features:** Limited permissions
- **Stats:** 2 total users, 1 monthly users, 82.4% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

Pay per event

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/actors/running/actors-in-store.md#pay-per-event

## What's an Apify Actor?

An Actor is a serverless cloud program that runs on the Apify platform. It has two run modes.
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.

Apify vocabulary and the platform model are defined once, in the agent quickstart at https://apify.com/agents.md.

## 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.

Do not guess an integration path. Every one of them is in the agent quickstart at https://apify.com/agents.md: the Apify MCP server, Agent Skills with the Apify CLI, the JavaScript and Python clients, the REST API, and the account-free path for an agent with no human to sign in. It also carries the rule on stating cost before the first paid run.

For examples already wired to this Actor's own input schema, see the [API](#api) section below.

Each client library has reference documentation the quickstart does not restate: [JavaScript/TypeScript](https://docs.apify.com/api/client/js/docs.md) (`npm install apify-client`) and [Python](https://docs.apify.com/api/client/python/docs.md) (`pip install apify-client`).

# README

### 🎮 What is Steam Scraper?

Know what sells on Steam: this Actor turns the store entries of any games into tidy records. Compare Metacritic and the platform's own rating totals, then read the verdicts in the reviews. Hand it ids, links or title fragments.

- **Game market research**: compare prices, discounts, genres and review scores across a genre or a publisher
- **Player feedback analysis**: pull thousands of negative reviews and find what players complain about, with AI or in a sheet
- **Price and sale tracking**: schedule daily runs and catch discounts in any store country
- **Studio and publisher reports**: follow your own titles and rival ones, scores compared every seven days
- **AI agents**: let Claude or ChatGPT read Steam reviews and details through MCP

![Steam Scraper: Game prices, details and player reviews from the Steam store, by app id, store URL or game name.](https://api.apify.com/v2/key-value-stores/wdeAWGooHdIhvFgSY/records/steam-hero.png)

#### ✨ Why use this Actor?

- ✅ **Details and reviews in one run**: one record per title plus one per review, each billed on its own
- ✅ **Search by name**: type "stardew valley" and the Actor finds the app id for you
- ✅ **Sharp review filters**: positive or negative only, any Steam language, newest, recently updated or most helpful first, since a date
- ✅ **Game-wide review totals**: Steam's rating label and positive share across all languages sit on every game row
- ✅ **Any store country**: currency and availability exactly as shoppers in that region see them
- ✅ **Gentle on Steam**: one title at a time with a pause and retries; an unknown id never stops the run

### 📦 What data can you get with Steam Scraper?

| | | |
|---|---|---|
| 🎮 Name, app id and store URL | 💲 Price, currency and discount | 📅 Release date |
| 🏢 Developers and publishers | 🏷️ Genres and categories | 🖥️ Platforms |
| ⭐ Metacritic score | 👍 Review score and positive share | 💬 Review text |
| ⏱️ Playtime at review | 🗳️ Helpful and funny votes | 🌐 Review language and date |

### 🚀 How to use Steam Scraper

Steam Scraper works in a few clicks, no coding needed:

1. [Create a free Apify account](https://console.apify.com/sign-up) (the free plan includes 5 USD of monthly credit).
2. Open [Steam Scraper](https://apify.com/bepolabs/steam) and click **Try for free**.
3. Enter ids, links or titles, then choose game details, opinions or both.
4. Click **Start** and wait for the run to finish (most runs take seconds).
5. Download your data as JSON, CSV, Excel, XML or HTML, or send it straight to Google Sheets, Make, Zapier or your AI agent.

![How Steam Scraper works](https://api.apify.com/v2/key-value-stores/wdeAWGooHdIhvFgSY/records/steam-workflow.png)

### ⬇️ Input

Give app ids, store URLs or search terms (up to 200 together). Game details and reviews are on by default.

##### App id, URL or name?

An **app id** (`620`) or a **store URL** (`https://store.steampowered.com/app/1145360/Hades/`) reads that game. A **search term** (`stardew valley`) takes the top store matches, up to `maxGamesPerSearch`.

##### Reviews

Cap them with `maxReviewsPerGame` (up to 10,000). Pick the order with `reviewFilter`, positive or negative with `reviewType`, a Steam language such as `english` or `schinese` with `reviewLanguage`, and a start date with `since`.

##### Country and language

`country` sets the store country for prices and availability (`us`, `de`, `gb` ...); `language` the language of descriptions and genres.

| Field | Type | What it does | Default |
|---|---|---|---|
| **App ids or store URLs** (`appIds`) | array | Steam app ids or store page URLs (e.g. | `["620"]` |
| **Search terms** (`searchTerms`) | array | Game names to look up in the Steam store search (e.g. |  |
| **Games per search term** (`maxGamesPerSearch`) | integer | How many store search matches to take per term. | `5` |
| **Game details** (`includeDetails`) | boolean | One row per game: price, discount, release date, developers, genres, platforms, Metacritic, review score and totals. | `true` |
| **Player reviews** (`includeReviews`) | boolean | One row per player review: text, recommended or not, playtime, helpful votes, language, date. | `true` |
| **Maximum reviews per game** (`maxReviewsPerGame`) | integer | Cap per game. | `100` |
| **Review order** (`reviewFilter`) | string | Newest written, newest updated, or most helpful first (Steam's own order). | `"recent"` |
| **Positive or negative** (`reviewType`) | string | All reviews, only recommending ones, or only not recommending ones. | `"all"` |
| **Review language** (`reviewLanguage`) | string | Steam language name (english, german, schinese, ...) or all. | `"all"` |
| **Reviews since** (`since`) | string | Keep reviews written (or, with Recently updated, updated) on or after this date, e.g. |  |
| **Store country** (`country`) | string | Two-letter country code for prices and availability (us, de, gb, ...). | `"us"` |
| **Store language** (`language`) | string | Language of descriptions and genre names (english, german, ...). | `"english"` |
| **Maximum text length** (`maxTextLength`) | integer | Long reviews and descriptions are cut to this many characters. | `5000` |
| **Retries per request** (`maxRetries`) | integer | Retries with exponential backoff on network errors, 429 and 5xx. | `3` |

![Steam Scraper input form](https://api.apify.com/v2/key-value-stores/wdeAWGooHdIhvFgSY/records/steam-input.png)

#### Input example

```json
{
    "appIds": [
        "620",
        "https://store.steampowered.com/app/1145360/Hades/"
    ],
    "maxReviewsPerGame": 20
}
```

### ⬆️ Output

Each game gets a `type: "game"` entry, each review a `type: "review"` one. The Console shows two views, Games and Reviews. The run summary in the key-value store (`OUTPUT`) lists every app with its reviews and any error.

![Steam Scraper output table](https://api.apify.com/v2/key-value-stores/wdeAWGooHdIhvFgSY/records/steam-output.png)

#### Output example

One game row (Portal 2, long text shortened):

```json
{
    "name": "Portal 2",
    "price": 9.99,
    "reviewScore": "Overwhelmingly Positive",
    "positiveShare": 98.7,
    "reviewsTotal": 468494,
    "metacriticScore": 95,
    "releaseDate": "Apr 18, 2011",
    "type": "game",
    "query": "620",
    "appId": 620,
    "url": "https://store.steampowered.com/app/620/",
    "appType": "game",
    "isFree": false,
    "initialPrice": 9.99,
    "currency": "USD",
    "discountPercent": 0,
    "comingSoon": false,
    "developers": [
        "Valve"
    ],
    "publishers": [
        "Valve"
    ],
    "genres": [
        "Action",
        "Adventure"
    ],
    "categories": [
        "Single-player",
        "Multi-player",
        "Co-op",
        "Online Co-op"
    ],
    "platforms": [
        "windows",
        "linux"
    ],
    "recommendations": 391982,
    "reviewsPositive": 462425,
    "reviewsNegative": 6069,
    "requiredAge": 0,
    "controllerSupport": "full",
    "dlcCount": 1,
    "achievements": 51,
    "shortDescription": "The \"Perpetual Testing Initiative\" has been expanded to allow you to design co-op puzzles for you and your friends!",
    "website": "http://www.thinkwithportals.com/",
    "headerImage": "https://shared.akamai.steamstatic.com/store_item_assets/steam/apps/620/faffc0f560786e2f05104a8d2fac837c6969bf13/header.jpg?t=1790187113"
}
```

#### Review row example

One player review of Stardew Valley (negative reviews in English, newest first):

```json
{
    "type": "review",
    "query": "stardew valley",
    "appId": 413150,
    "name": "Stardew Valley",
    "reviewId": "237522395",
    "url": "https://steamcommunity.com/profiles/76561198871833476/recommended/413150/",
    "recommended": false,
    "review": "One of the most painfully boring and overhyped games I have ever tried to play.",
    "language": "english",
    "createdAt": "2026-10-12T04:32:30.000Z",
    "updatedAt": "2026-10-12T04:32:30.000Z",
    "votesUp": 22,
    "votesFunny": 4,
    "helpfulScore": 0.5074126720428467,
    "comments": 0,
    "playtimeAtReviewHours": 7.6,
    "playtimeTotalHours": 7.6,
    "authorSteamId": "76561198871833476",
    "authorGamesOwned": 0,
    "authorReviews": 153,
    "steamPurchase": true,
    "receivedForFree": false,
    "earlyAccess": false,
    "steamDeck": true
}
```

#### ⚠️ Unknown apps and failed searches

An id Steam does not know, or one not sold in your store country, yields no row and is free; `OUTPUT` names it with the reason (in a real run: `no such app on the Steam store (or not sold in this country)` for id 1). A search term without matches is noted likewise. The run fails only when nothing at all answered.

View the results as a table or JSON in the Output tab and download them as JSON, CSV, Excel, XML, HTML or RSS, all fields or only those you pick.

### 💰 How much does Steam Scraper cost?

Steam Scraper is priced **per event**: **1.16 USD per 1,000 games** (0.00116 USD each), with no monthly rental. Failed apps and searches cost nothing.

| You get | You pay |
|---|---|
| 100 games | 0.12 USD |
| 1,000 games | 1.16 USD |
| 10,000 games | 11.6 USD |
| 100,000 games | 116 USD |

Player reviews (on by default, switch off `includeReviews` for game rows only) are charged per review:

- **Review**: 0.29 USD per 1,000

💡 Apify's free plan gives you 5 USD of credit every month, enough for about **4,310 games** at no cost. Set a spending limit per run and the Actor stops there.

### ⚖️ Steam Scraper vs. the alternatives

| | Steam Scraper | Copying from Steam by hand | Typical Steam scrapers |
|---|---|---|---|
| **Game details and reviews in one run** | ✅ | ❌ | often one or the other |
| **Search by game name** | ✅ | ✅ | often ids only |
| **Positive or negative, language and date filters** | ✅ | partly | varies |
| **Prices in any store country** | ✅ | one country | varies |
| **Export, schedule, API and MCP** | ✅ | ❌ | ✅ |

### 🔌 Integrations, API and MCP

#### Connect Steam Scraper to your AI agent (MCP)

Give Claude, ChatGPT, Cursor or any MCP client direct access to Steam Scraper through the [Apify MCP server](https://mcp.apify.com). Add this URL to its settings:

```text
https://mcp.apify.com/?actors=bepolabs/steam
```

For Claude Desktop, add it under `mcpServers` in `claude_desktop_config.json`:

```json
{
    "mcpServers": {
        "steam": {
            "command": "npx",
            "args": [
                "-y",
                "@apify/actors-mcp-server",
                "--actors",
                "bepolabs/steam"
            ],
            "env": {
                "APIFY_TOKEN": "<your Apify API token>"
            }
        }
    }
}
```

Then ask: *"Get the 100 newest negative English reviews of Stardew Valley and summarise the top complaints."*

#### Run it from your code

Python (`pip install apify-client`):

```python
from apify_client import ApifyClient

client = ApifyClient("<YOUR_APIFY_TOKEN>")
run = client.actor("bepolabs/steam").call(run_input={"appIds":["620","https://store.steampowered.com/app/1145360/Hades/"],"maxReviewsPerGame":20})
for item in client.dataset(run["defaultDatasetId"]).iterate_items():
    print(item)
```

JavaScript (`npm install apify-client`):

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

const client = new ApifyClient({ token: '<YOUR_APIFY_TOKEN>' });
const run = await client.actor('bepolabs/steam').call({"appIds":["620","https://store.steampowered.com/app/1145360/Hades/"],"maxReviewsPerGame":20});
const { items } = await client.dataset(run.defaultDatasetId).listItems();
console.log(items);
```

#### No-code integrations

Send results to **Google Sheets, Slack, Airtable, HubSpot, Make, Zapier, n8n** and more from the Integrations tab, start runs on a **schedule**, or trigger your own endpoint with a **webhook** when a run finishes. The [Apify API](https://docs.apify.com/api/v2) gives you full control over runs and datasets.

### ❓ FAQ

##### Why does `reviewsTotal` differ from the number of reviews I got?

The totals on the game row are Steam's game-wide figures in all languages. The review rows follow your filters and cap.

##### Why is a game missing?

Some apps are not sold in the chosen store country or are age-gated. Try another `country`; `OUTPUT` names the app and why.

##### Can I get only reviews, without game rows?

Yes: skip details for reviews alone, or drop reviews to keep only games.

##### How many reviews can I get?

Up to 10,000 per game per run (`maxReviewsPerGame`), up to 200 games per run.

##### Do I need a Steam API key?

No. The Actor uses the public JSON endpoints the Steam store page itself uses.

##### Is it legal to use Steam Scraper?

The Actor reads store and community data from the JSON endpoints the Steam store page itself calls, one title at a time and far below the rate limits. It collects no personal profile data beyond the Steam id shown on each review. Not affiliated with or endorsed by its owner; Steam is a trademark of Valve Corporation. Opinions are written by players: you are responsible for how you use and republish them.

##### What if something is missing or does not work?

Open an issue on the **Issues** tab; we read each one and reply. Feature requests are welcome too.

### 💬 Your feedback

Tell us what Steam Scraper should add on the **Issues** tab or leave a review; your notes decide what we work on next.

### 🔗 Related Actors

| Actor | What it does |
|---|---|
| ⭐ [App Store Reviews](https://apify.com/bepolabs/app-store-reviews) | iOS App Store reviews with stars, text, app version and date, plus the app's rating and details, for any store country. |
| 🧩 [Chrome Web Store Scraper](https://apify.com/bepolabs/chrome-web-store) | Users, rating, version, last update, developer, category and permissions of any Chrome extension. |
| 🛍️ [Shopify Products](https://apify.com/bepolabs/shopify-products) | Any Shopify store URL to every product, with variants, prices, sale prices, SKUs, stock and images. |
| 📦 [npm and PyPI Package Data](https://apify.com/bepolabs/npm-pypi) | Versions, downloads, licences, maintainers and release history of npm and PyPI packages in one table. |
| 📢 [Google Ads Transparency Scraper](https://apify.com/bepolabs/google-ads-transparency) | Every ad a company runs on Google, by domain, advertiser ID or name, from the Ads Transparency Center. |
| 📊 [Google Sheets Import and Export](https://apify.com/bepolabs/google-sheets) | Send any Apify dataset or JSON to a Google Sheet (append, replace or upsert by key), or read a sheet back as clean rows. |
| 📈 [Google Trends Scraper](https://apify.com/bepolabs/google-trends) | Interest over time for up to five keywords on one 0 to 100 scale, any country or worldwide, plus top and rising related queries. |
| 📈 [Wikipedia Pageviews](https://apify.com/bepolabs/wikipedia-pageviews) | Daily or monthly views of any Wikipedia article in any language, with totals and averages, from the official Wikimedia API. |

# Changelog

This Actor's version history is a separate document: https://apify.com/bepolabs/steam/changelog.md

# Actor input Schema

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

Steam app ids or store page URLs (e.g. 620, https://store.steampowered.com/app/1145360/Hades/). Up to 200 together with the search terms.

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

Game names to look up in the Steam store search (e.g. stardew valley). Each term takes the top matches, see the next field.

## `maxGamesPerSearch` (type: `integer`):

How many store search matches to take per term. Default 5, at most 25.

## `includeDetails` (type: `boolean`):

One row per game: price, discount, release date, developers, genres, platforms, Metacritic, review score and totals.

## `includeReviews` (type: `boolean`):

One row per player review: text, recommended or not, playtime, helpful votes, language, date.

## `maxReviewsPerGame` (type: `integer`):

Cap per game. Default 100, at most 10,000.

## `reviewFilter` (type: `string`):

Newest written, newest updated, or most helpful first (Steam's own order).

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

All reviews, only recommending ones, or only not recommending ones.

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

Steam language name (english, german, schinese, ...) or all. Default all.

## `since` (type: `string`):

Keep reviews written (or, with Recently updated, updated) on or after this date, e.g. 2026-01-01.

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

Two-letter country code for prices and availability (us, de, gb, ...). Default us.

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

Language of descriptions and genre names (english, german, ...). Default english.

## `maxTextLength` (type: `integer`):

Long reviews and descriptions are cut to this many characters. Default 5,000.

## `maxRetries` (type: `integer`):

Retries with exponential backoff on network errors, 429 and 5xx. Default 3.

## Actor input object example

```json
{
  "appIds": [
    "620"
  ],
  "maxGamesPerSearch": 5,
  "includeDetails": true,
  "includeReviews": true,
  "maxReviewsPerGame": 100,
  "reviewFilter": "recent",
  "reviewType": "all",
  "reviewLanguage": "all",
  "country": "us",
  "language": "english",
  "maxTextLength": 5000,
  "maxRetries": 3
}
```

# Actor output Schema

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

Dataset items, one row per result, in the overview table view.

# 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": [
        "620"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("bepolabs/steam").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": ["620"] }

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

# Fetch and print Actor results from the run's dataset (if there are any)
print(f"💾 Check your data here: https://console.apify.com/storage/datasets/{run.default_dataset_id}")
for item in client.dataset(run.default_dataset_id).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": [
    "620"
  ]
}' |
apify call bepolabs/steam --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,bepolabs/steam"
        }
    }
}
```

The hosted server signs you in with OAuth on first connect, so no API token belongs in this config. Clients without OAuth support can send an `Authorization: Bearer <APIFY_API_TOKEN>` header instead, using a token from API & Integrations in Apify Console (https://console.apify.com/settings/integrations).

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/actors/vhtP27zVnocgJ4BeW/builds/SZFzX2SiJ8HIyHomb/openapi.json
