# Steam Reviews Scraper (`maximedupre/steam-reviews`) Actor

Collect public Steam game reviews by App ID, Steam store URL, or game name. Filter by language, recommendation, purchase status, review order, dates, and off-topic activity. Export normalized review rows with links, engagement, game details, and reviewer context when available.

- **URL**: https://apify.com/maximedupre/steam-reviews.md
- **Developed by:** [Maxime Dupré](https://apify.com/maximedupre) (community)
- **Categories:** Games, Developer tools, Marketing
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $0.25 / 1,000 reviews

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.
Since this Actor supports Apify Store discounts, the price gets lower the higher subscription plan you have.

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

### 🎮 Steam reviews for game research

Use this Actor if you are a game developer, publisher, researcher, journalist, or data analyst who needs public Steam review data. Each saved row represents a public Steam review with review text, recommendation outcome, source links, engagement, and game details. Reviewer context and developer responses appear when Steam provides them, giving you structured feedback for comparison and analysis.

**Use cases**

- Compare player feedback for a selected game with **[Steam Game Reviews](https://apify.com/maximedupre/steam-reviews/examples/steam-game-reviews)**.
- Sort reviews by helpfulness and inspect their engagement with **[Steam Review Rankings](https://apify.com/maximedupre/steam-reviews/examples/steam-review-rankings)**.
- Review humorous player feedback and funny-vote counts with **[Funny Steam Reviews](https://apify.com/maximedupre/steam-reviews/examples/funny-steam-reviews)**.
- Check recommendation outcomes and game review summaries with **[Steam Ratings](https://apify.com/maximedupre/steam-reviews/examples/steam-ratings)**.
- Collect normalized review text, source links, and reviewer context with **[Steam Reviews](https://apify.com/maximedupre/steam-reviews/examples/steam-reviews)**.

#### 🧾 Structured Steam review rows

**What you get**

Every row has a stable review ID and direct review link, review text, recommendation outcome, source language, creation and update dates, engagement counts, and game identity. Steam review context, reviewer details, and developer responses appear when the source provides them. Game details can include genres, developers, publishers, release date, free-to-play status, and review totals and label. Optional source values stay unavailable when Steam does not provide them.

#### ▶️ Collect reviews from selected games

**How to run**

1. Choose one discovery method: Steam App IDs, Steam store URLs, or game names.
2. Add one or more values only to the section for that method. Do not mix discovery methods in one run.
3. Choose a language, recommendation setting, purchase status, review order, date range, and whether to include off-topic activity.
4. Set a positive `maxReviewsPerGame` value when you want a per-game limit. The schema has no fixed upper bound. Leave it empty to get all publicly available reviews until the source is exhausted.
5. Start the run and open the `dataset` link in the output.

#### ⚙️ Input

Use one discovery method per run. Values in sections for other discovery methods are ignored. Date fields use `YYYY-MM-DD` and define an inclusive source review date range.

**Input fields**

| Field | Type | What it does |
| --- | --- | --- |
| `discoveryMethod` | select | Chooses `appIds`, `storeUrls`, or `gameNames`. The form starts with `appIds`, and only the selected method's values are used. |
| `appIds` | array of strings | Add at least one digit-only Steam App ID, such as `730`. |
| `storeUrls` | array of objects | Add at least one object with a public Steam store `/app/` URL in `url`. |
| `gameNames` | array of strings | Add at least one game name. Steam uses one best match for each submitted name. |
| `language` | select | Choose one listed Steam language or `all`. The default is `all`, and each row keeps its source language. |
| `reviewType` | select | Choose all reviews, recommended reviews, or not-recommended reviews. The default is `all`. |
| `purchaseType` | select | Choose all reviews, Steam purchases, or non-Steam purchases. The default is `all`. |
| `reviewOrder` | select | Choose recent, recently updated, or most helpful reviews. The default is `recent`. |
| `fromDate` | string | Optional inclusive start date for source reviews. Use `YYYY-MM-DD`. |
| `toDate` | string | Optional inclusive end date for source reviews. Use `YYYY-MM-DD`. |
| `includeOfftopicActivity` | boolean | Include Steam activity marked as off-topic when this is on. The default is off. |
| `maxReviewsPerGame` | integer | Optional positive limit for reviews from each game. The schema has no fixed upper bound. Leave it empty to get all publicly available reviews until the source is exhausted. The form pre-fills `100`. |

**Successful default input**

This example is copied from a successful default-input run on the current beta build.

```json
{
  "discoveryMethod": "appIds",
  "appIds": [
    "730"
  ],
  "language": "all",
  "reviewType": "all",
  "purchaseType": "all",
  "reviewOrder": "recent",
  "includeOfftopicActivity": false,
  "maxReviewsPerGame": 100
}
```

#### 🧾 Output

**Run output**

| Field | Type | What it does |
| --- | --- | --- |
| `dataset` | URL string | Opens the normalized Steam review rows in the default dataset. |

**Review row fields**

| Field | Type | What it does |
| --- | --- | --- |
| `reviewId` | string | Stable Steam ID for the review. |
| `reviewUrl` | URL string | Direct public link to the review. |
| `reviewText` | string | Text written by the Steam user. |
| `recommended` | boolean | Whether the user recommends the game. |
| `language` | string | Language selected by the user for the review. |
| `createdAt` | ISO 8601 date-time string | Date and time when the review was created. |
| `updatedAt` | ISO 8601 date-time string | Date and time when the review was last updated. |
| `engagement` | object | Vote and comment counts recorded by Steam. |
| `engagement.helpfulVotes` | integer | Number of users who marked the review helpful. |
| `engagement.funnyVotes` | integer | Number of users who marked the review funny. |
| `engagement.weightedHelpfulness` | number | Steam's weighted helpfulness score for the review. |
| `engagement.commentCount` | integer | Number of comments on the review. |
| `reviewer` | object, optional | Public reviewer details when available. |
| `reviewer.steamId` | string | Stable public Steam ID for the reviewer. |
| `reviewer.displayName` | string, optional | Public Steam display name shown for the reviewer. |
| `reviewer.profileUrl` | URL string, optional | Direct public link to the reviewer's Steam profile. |
| `reviewer.avatarUrl` | URL string, optional | Public URL of the reviewer's Steam avatar. |
| `reviewer.gamesOwned` | integer, optional | Number of games Steam reports for the reviewer's account. |
| `reviewer.reviewCount` | integer, optional | Number of reviews Steam reports for the reviewer's account. |
| `reviewer.playtimeAtReviewMinutes` | integer, optional | Minutes played before the review was posted. |
| `reviewer.playtimeMinutes` | integer, optional | Total minutes played for the game when Steam reports it. |
| `reviewer.recentPlaytimeMinutes` | integer, optional | Minutes played in the recent period reported by Steam. |
| `reviewContext` | object, optional | Purchase and access details supplied by Steam. |
| `reviewContext.steamPurchase` | boolean | Whether Steam marks the game as purchased on Steam. |
| `reviewContext.receivedForFree` | boolean | Whether Steam marks the game as received for free. |
| `reviewContext.earlyAccess` | boolean | Whether Steam marks the review as written during early access. |
| `reviewContext.steamDeck` | boolean | Whether Steam marks the review as written on Steam Deck. |
| `reviewContext.refunded` | boolean, optional | Whether Steam reports that the purchase was refunded. |
| `developerResponse` | object, optional | Official developer response shown with the review when one is present. |
| `developerResponse.text` | string | Text of the official developer response. |
| `developerResponse.createdAt` | ISO 8601 date-time string | Date and time when the developer response was posted. |
| `game` | object | Steam game associated with the review. |
| `game.appId` | integer | Steam App ID for the game. |
| `game.name` | string | Public Steam name of the game. |
| `game.storeUrl` | URL string | Direct public Steam store link for the game. |
| `game.genres` | array of strings, optional | Steam genres listed for the game. |
| `game.developers` | array of strings, optional | Developers listed by Steam for the game. |
| `game.publishers` | array of strings, optional | Publishers listed by Steam for the game. |
| `game.releaseDate` | string, optional | Release date supplied by Steam for the game. |
| `game.isFreeToPlay` | boolean, optional | Whether Steam marks the game as free to play. |
| `game.reviewSummary` | object, optional | Steam review totals and rating for the game. |
| `game.reviewSummary.positiveReviews` | integer | Number of positive reviews reported by Steam. |
| `game.reviewSummary.negativeReviews` | integer | Number of negative reviews reported by Steam. |
| `game.reviewSummary.score` | integer | Steam review score for the game. |
| `game.reviewSummary.label` | string | Steam text label for the game's review score. |

**Example review row**

This complete row is copied from a successful current-beta run. Optional fields shown here were provided by Steam.

```json
{
  "reviewId": "223696996",
  "reviewUrl": "https://steamcommunity.com/profiles/76561198934704395/recommended/1366540/?recommendationid=223696996",
  "reviewText": "很好的游戏，使我时间大把消耗。游戏好玩，但对于我这个偏向于建造的玩家而言，求求你出个功能把黑雾模式关了，我不太想花心思在对付黑雾上，好不容易建一个星际运输线结果被黑雾打没了太受挫，我能理解其他玩家想要更多的挑战，但是也请理解理解我这样的。我很喜欢之前那种纯建造的感觉，看着自己的球一点点成型，很有成就感的说，所以请出一个黑雾的开关功能。",
  "recommended": true,
  "language": "schinese",
  "createdAt": "2026-04-20T11:50:55.000Z",
  "updatedAt": "2026-04-20T11:50:55.000Z",
  "engagement": {
    "helpfulVotes": 55,
    "funnyVotes": 10,
    "weightedHelpfulness": 0.8308402895927429,
    "commentCount": 0
  },
  "reviewer": {
    "steamId": "76561198934704395",
    "profileUrl": "https://steamcommunity.com/profiles/76561198934704395/",
    "displayName": "李狗蛋",
    "gamesOwned": 23,
    "reviewCount": 1,
    "playtimeAtReviewMinutes": 1074,
    "playtimeMinutes": 17033,
    "recentPlaytimeMinutes": 701
  },
  "game": {
    "appId": 1366540,
    "name": "Dyson Sphere Program",
    "storeUrl": "https://store.steampowered.com/app/1366540/",
    "genres": [
      "Indie",
      "Simulation",
      "Strategy",
      "Early Access"
    ],
    "developers": [
      "Youthcat Studio"
    ],
    "publishers": [
      "Gamirror Games"
    ],
    "releaseDate": "Jan 20, 2021",
    "isFreeToPlay": false,
    "reviewSummary": {
      "positiveReviews": 89354,
      "negativeReviews": 2365,
      "score": 9,
      "label": "Overwhelmingly Positive"
    }
  },
  "reviewContext": {
    "steamPurchase": true,
    "receivedForFree": false,
    "earlyAccess": true,
    "steamDeck": false,
    "refunded": false
  },
  "developerResponse": {
    "text": "感谢反馈，非常理解您的挫败感。\n其实游戏已支持关黑雾或设成活靶子：\n\n新开档：不勾选“黑雾” 或 选“活靶子”难度（黑雾不攻击）。\n\n已有存档：回母星系找 “黑雾通讯器”，直接改成活靶子即可。\n\n这样就能安心纯建造了，祝您玩得开心！",
    "createdAt": "2026-04-27T11:34:01.000Z"
  }
}
```

#### 💳 Pricing

**Billing event**

Each saved public Steam review uses one `steam-review-extracted` event. The buyer-facing event is called `Review` in the pricing panel. The current pricing file uses tiered per-event prices and has no separate one-time start event. Check the live pricing panel for the price on your Apify plan.

#### 🔌 Integrations

**Dataset access**

Open the `dataset` link in the run output to browse the rows. You can export the dataset as JSON or CSV, or read it through the Apify API.

**Video guide**

https://www.youtube.com/watch?v=bNACk1\_S\_6w\&list=PLObrtcm1Kw6MUrlLNDbK9QRg8VDJg0gOW\&index=4

#### ❓ FAQ

##### How do I choose a game?

Choose one discovery method and enter App IDs, public Steam store URLs, or game names in its matching section.

##### Can I mix App IDs, store URLs, and game names?

No. Select one discovery method per run. Values in other discovery sections are ignored.

##### What happens when I submit a game name?

Steam uses one best match for each submitted game name. Use an App ID or store URL when you need to point to a specific game.

##### What does leaving Max reviews per game empty do?

It returns all publicly available reviews until the source is exhausted for each selected game. A positive value limits reviews from each game.

##### How do date filters work?

Enter `fromDate` and `toDate` as `YYYY-MM-DD` values. The selected range is inclusive of the source review dates.

##### What does the All languages choice do?

It requests reviews across the available Steam language scope. Each saved row still shows its source language in `language`.

##### Why can reviewer, context, or developer response fields be missing?

Steam does not provide every optional field for every review. The Actor keeps source values when available and does not invent missing data.

##### Do I need Steam credentials?

No buyer-supplied Steam credentials are needed. The Actor reads publicly available Steam review data.

##### How can I read or export the rows?

Open the `dataset` link in the run output, export the rows as JSON or CSV, or read them through the Apify API.

### 📝 Changelog

**v0.0** (16-09-2026)

- Initial release.

### 🆘 Support

For issues, questions, or feature requests, [file a ticket](https://console.apify.com/actors/maximedupre~steam-reviews/issues) and I'll fix or implement it in less than 24h 🫡

### 🔗 Related Actors

- **[Yelp Business Review Scraper](https://apify.com/maximedupre/yelp-business-reviews)**: Compare public business review text, ratings, dates, and source links with Steam review rows.
- **[Google Play Store Scraper](https://apify.com/maximedupre/google-play-store-scraper)**: Analyze Android app reviews, ratings, reviewer details, and developer replies alongside game feedback.
- **[Apple App Store Scraper](https://apify.com/maximedupre/apple-app-store-scraper)**: Compare public iOS App Store reviews with Steam feedback during product research.
- **[Facebook Reviews Scraper](https://apify.com/maximedupre/facebook-reviews-scraper)**: Study public Page recommendations and reviewer details alongside Steam reviews.
- **[BoardGameGeek (BGG) Board Game Reviews Scraper](https://apify.com/maximedupre/boardgamegeek)**: Collect public board game reviews and ratings for a second game community.

**Made with ❤️ by Maxime Dupré**

# Actor input Schema

## `discoveryMethod` (type: `string`):

Choose one way to find the Steam games whose reviews you want.

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

Enter one or more Steam App IDs. Use digits only, such as 730.

## `storeUrls` (type: `array`):

Enter one or more Steam store page URLs. Each URL should point to a game's /app/ page.

## `gameNames` (type: `array`):

Enter one or more game names. Steam uses its best match for each name.

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

Choose one Steam language, or All languages. Each result still shows its source language.

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

Choose all reviews, recommended reviews, or not-recommended reviews.

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

Choose all reviews, Steam purchases, or non-Steam purchases.

## `reviewOrder` (type: `string`):

Choose recent reviews, recently updated reviews, or the most helpful reviews.

## `fromDate` (type: `string`):

Optional start date for an inclusive source review date range. Use YYYY-MM-DD.

## `toDate` (type: `string`):

Optional end date for an inclusive source review date range. Use YYYY-MM-DD.

## `includeOfftopicActivity` (type: `boolean`):

Include Steam activity marked as off-topic when this is on.

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

Optional positive limit for reviews from each game. Leave this empty to get all publicly available reviews until the source is exhausted.

## Actor input object example

```json
{
  "discoveryMethod": "appIds",
  "appIds": [
    "730"
  ],
  "storeUrls": [
    {
      "url": "https://store.steampowered.com/app/730/"
    }
  ],
  "gameNames": [
    "Counter-Strike 2"
  ],
  "language": "all",
  "reviewType": "all",
  "purchaseType": "all",
  "reviewOrder": "recent",
  "includeOfftopicActivity": false,
  "maxReviewsPerGame": 100
}
```

# Actor output Schema

## `dataset` (type: `string`):

Open the Steam review rows from the default dataset.

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

// Run the Actor and wait for it to finish
const run = await client.actor("maximedupre/steam-reviews").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 = {
    "discoveryMethod": "appIds",
    "appIds": ["730"],
    "maxReviewsPerGame": 100,
}

# Run the Actor and wait for it to finish
run = client.actor("maximedupre/steam-reviews").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 '{
  "discoveryMethod": "appIds",
  "appIds": [
    "730"
  ],
  "maxReviewsPerGame": 100
}' |
apify call maximedupre/steam-reviews --silent --output-dataset

```

## MCP server setup

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

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/Zo3AXaa0qLniebzjC/builds/scAh8NLI73VrYT97F/openapi.json
