# Steam Reviews Scraper & Monitor (`firehazard/steam-review-monitor`) Actor

Get Steam game reviews from Valve's official API. Filter by language, positive/negative and playtime, and schedule it to get only new reviews since your last run.

- **URL**: https://apify.com/firehazard/steam-review-monitor.md
- **Developed by:** [Fire Hazard](https://apify.com/firehazard) (community)
- **Stats:** 2 total users, 1 monthly users, 50.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $0.28 / 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 Scraper & Monitor

Get **Steam game reviews through Valve's official reviews API**: recommendation, full text, playtime at review, helpful votes, Steam Deck flag and developer replies. Paste store links, filter by language, positive/negative, playtime or date, and switch on **"Only new reviews"** to get just the reviews posted since your last run. Schedule it daily and you have a review alert system that only charges for new reviews.

### What you can use it for

- **Track your own game**: catch negative reviews and bug reports the day they're posted, especially after a patch.
- **Watch competitors**: see what players praise and complain about in similar games, by language.
- **Feed AI and analytics**: sentiment analysis, feature-request mining, patch QA dashboards.
- **Publisher and agency reporting**: one dataset for every title you manage.

### Why this one

- **Official API, no browser.** Uses Valve's documented `IUserReviewsService/GetAppReviews` endpoint, so it's fast (hundreds of reviews per second) and doesn't break when the store page changes.
- **Incremental monitoring.** The actor remembers the newest review it has seen per game and filter, so scheduled runs return only new reviews.
- **Useful filters**: positive or negative only, languages, minimum playtime at review, Steam purchases only, date, and an option to include reviews Steam hides as off-topic (review bombs).
- **Game score in every run**: Steam's rating label and positive/negative totals are saved to the run summary.
- **Privacy by default**: reviewer Steam IDs and profile links are left out unless you switch them on.

### Input

| Field | What it does |
|---|---|
| `games` | Steam store links, community links or app IDs (`730`) |
| `maxReviewsPerGame` | Newest first (default 100) |
| `onlyNewReviews` | Return only reviews newer than the last run |
| `reviewType` | `all`, `positive` or `negative` |
| `languages` | Steam language names (`english`, `schinese`, ...) or `all` |
| `sinceDate` | Only reviews after this date |
| `minPlaytimeHours` | Skip reviews written with less playtime |
| `purchaseType` | `all` or `steam` (bought on Steam) |
| `includeOffTopicReviews` | Include review-bomb periods Steam hides by default |
| `includeSteamIds` | Off by default |

```json
{
  "games": ["https://store.steampowered.com/app/1145360/Hades/", "730"],
  "maxReviewsPerGame": 500,
  "onlyNewReviews": true,
  "reviewType": "negative",
  "languages": ["english"]
}
```

### Output

One item per review:

```json
{
  "platform": "steam",
  "gameId": "1145360",
  "gameName": "Hades",
  "reviewId": "238658291",
  "recommended": false,
  "text": "I'll never finish this one",
  "language": "english",
  "date": "2026-10-27T04:46:27+00:00",
  "updatedDate": "2026-10-27T04:46:27+00:00",
  "votesHelpful": 0,
  "votesFunny": 0,
  "helpfulnessScore": 0.486,
  "commentCount": 0,
  "playtimeAtReviewHours": 12.2,
  "playtimeTotalHours": 12.2,
  "authorReviewCount": 19,
  "steamPurchase": true,
  "receivedForFree": false,
  "writtenDuringEarlyAccess": false,
  "primarilySteamDeck": true,
  "refunded": false,
  "developerReply": null,
  "developerReplyDate": null,
  "scrapedAt": "2026-10-28T04:43:54+00:00"
}
```

The `SUMMARY` record in the run's key-value store lists each game's status, reviews returned, Steam rating (e.g. "Overwhelmingly Positive") and total positive/negative reviews.

### Pricing

Pay per event: a small fee per game checked plus a fee per review returned. With "Only new reviews" on, a daily schedule only pays for reviews that are actually new. Set a maximum charge per run in the run options and the actor stops cleanly when it's reached.

### Notes

- Steam caches anonymous responses for up to 10 minutes, so a review posted a few minutes ago may appear in the next run.
- Reviews are public content on Steam; this actor does not log in or access anything private.

# Actor input Schema

## `games` (type: `array`):

Steam store links (store.steampowered.com/app/...), community links or numeric app IDs such as 730.

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

Newest reviews first. Steam returns every review, so popular games can have millions.

## `onlyNewReviews` (type: `boolean`):

Remembers the newest review seen for each game and returns only newer ones next time. Ideal for scheduled monitoring: you pay only for new reviews.

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

All reviews, only positive (recommended) or only negative (not recommended).

## `languages` (type: `array`):

Steam language names such as english, schinese, russian, spanish, brazilian. Use all for every language.

## `sinceDate` (type: `string`):

Optional. ISO date such as 2026-10-01.

## `minPlaytimeHours` (type: `integer`):

Optional. Skip reviews from players with less playtime than this when they wrote the review.

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

All reviews, or only from players who bought the game on Steam.

## `includeOffTopicReviews` (type: `boolean`):

Steam hides reviews from periods it marks as off-topic activity (review bombs). Turn on to include them.

## `includeSteamIds` (type: `boolean`):

Off by default. Steam IDs identify individual players; only turn this on if you have a lawful reason to process them.

## Actor input object example

```json
{
  "games": [
    "https://store.steampowered.com/app/730/CounterStrike_2/"
  ],
  "maxReviewsPerGame": 20,
  "onlyNewReviews": false,
  "reviewType": "all",
  "languages": [
    "all"
  ],
  "purchaseType": "all",
  "includeOffTopicReviews": false,
  "includeSteamIds": false
}
```

# Actor output Schema

## `reviews` (type: `string`):

All reviews returned by this run, newest first per game.

## `summary` (type: `string`):

Per game: name, status, reviews returned, Steam's overall score and positive/negative totals.

# 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 = {
    "games": [
        "https://store.steampowered.com/app/730/CounterStrike_2/"
    ],
    "maxReviewsPerGame": 20,
    "languages": [
        "all"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("firehazard/steam-review-monitor").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 = {
    "games": ["https://store.steampowered.com/app/730/CounterStrike_2/"],
    "maxReviewsPerGame": 20,
    "languages": ["all"],
}

# Run the Actor and wait for it to finish
run = client.actor("firehazard/steam-review-monitor").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 '{
  "games": [
    "https://store.steampowered.com/app/730/CounterStrike_2/"
  ],
  "maxReviewsPerGame": 20,
  "languages": [
    "all"
  ]
}' |
apify call firehazard/steam-review-monitor --silent --output-dataset

```

## MCP server setup

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

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/1TCe6twaEBdahiGDV/builds/c14KTYEZjdRUdISOY/openapi.json
