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

Export Steam user reviews for any game: review text, recommended or not, language, dates, votes, playtime at review, reviewer stats, developer replies and the game's review score. No login. $0.50 per 1,000 reviews, down to $0.24 on higher Apify plans, no start fee.

- **URL**: https://apify.com/tidyharvest/steam-reviews-scraper.md
- **Developed by:** [TidyHarvest](https://apify.com/tidyharvest) (community)
- **Categories:** E-commerce, Other
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $0.24 / 1,000 review scrapeds

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: Game Reviews, Playtime and Scores

Export **Steam user reviews** for any game as clean structured data: **review text, recommended or not, language, dates, helpful and funny votes, playtime at review, reviewer stats, developer responses, and the game's overall review score**. **$0.50 per 1,000 reviews** (less on paid plans), no start fee.

Enter app ids, Steam store links or plain game names. **No login, API key, cookies or proxy.** Fast, and it pages cleanly through tens of thousands of reviews per game.

### What you can do with it

- **Sentiment analysis and NLP:** build labelled datasets (text + recommended/not recommended) in any of 30 languages.
- **Game developers and publishers:** track what players say after a patch, filter negative reviews since a date, and see which ones you have answered.
- **Competitor research:** compare review volume, score and complaints across rival games.
- **Market and investment research:** monitor launches and review momentum over time with scheduled runs.
- **Community and support teams:** pipe new reviews into Slack, Sheets or a helpdesk with Apify integrations.

### How to use it

1. Add one or more games to **Steam games**: `730`, `https://store.steampowered.com/app/1245620/ELDEN_RING/` or `Hades II`.
2. Pick the sort, language, positive/negative and an optional **Reviews since** date or keywords.
3. Set **Max reviews per game**, click **Start**, then download JSON, CSV or Excel, or use the API.

### Input

```json
{
  "apps": ["730", "https://store.steampowered.com/app/1245620/ELDEN_RING/", "Hades II"],
  "filter": "recent",
  "language": "english",
  "reviewType": "negative",
  "dateFrom": "2026-09-01",
  "maxReviewsPerApp": 1000
}
```

| Field | What it does |
|---|---|
| `apps` | App ids, store or community links, or game names (first Steam search match). Default `730`. |
| `filter` | `recent` (newest first), `updated` (recently edited) or `all` (most helpful, last 365 days). |
| `language` | One Steam language code, or `all`. Default `english`. |
| `reviewType` | `all`, `positive` or `negative`. |
| `purchaseType` | `all`, `steam` (bought on Steam) or `non_steam_purchase`. |
| `dateFrom` | Only reviews created on or after this date (UTC). |
| `keywords` | Keep reviews whose text contains any of these words. |
| `maxReviewsPerApp`, `maxItems` | Caps per game and for the whole run (they also cap your cost). |

### Output

One item per review:

```json
{
  "recommendationId": "237525538",
  "reviewUrl": "https://steamcommunity.com/profiles/76561199787227344/recommended/730/",
  "appId": 730, "appName": "Counter-Strike 2",
  "votedUp": true, "reviewText": "...", "language": "english",
  "createdAt": "2026-10-12T05:54:20Z", "updatedAt": "2026-10-12T05:54:20Z",
  "votesUp": 1, "votesFunny": 0, "weightedVoteScore": 0.52, "commentCount": 0,
  "steamPurchase": true, "receivedForFree": false, "refunded": false,
  "writtenDuringEarlyAccess": false, "primarilySteamDeck": false,
  "authorSteamId": "76561199787227344", "authorName": "...", "authorProfileUrl": "https://steamcommunity.com/profiles/76561199787227344/",
  "authorNumGamesOwned": 1, "authorNumReviews": 1,
  "authorPlaytimeForeverMinutes": 29626, "authorPlaytimeAtReviewMinutes": 29626, "authorPlaytimeLastTwoWeeksMinutes": 2115,
  "authorLastPlayedAt": "2026-10-12T05:50:17Z",
  "developerResponse": null, "developerRespondedAt": null,
  "appReviewScoreDesc": "Very Positive", "appTotalReviews": 2630401, "appTotalPositive": 2259378, "appTotalNegative": 371023,
  "source": "Steam"
}
```

The `appReviewScoreDesc` and `appTotal*` fields are the game's overall score for the language and purchase type you chose. They repeat on every row at no extra cost. A per-game summary is also saved in the run's key-value store as `SUMMARY`.

### Pricing

**$0.50 per 1,000 reviews** on the Free plan, down to $0.24 on higher plans (`review-scraped`), no start fee. Keyword, date and per-game caps apply before you are charged, so you pay only for the reviews you get.

| Apify plan tier | Free | Bronze | Silver | Gold | Platinum | Diamond |
|---|---|---|---|---|---|---|
| per 1,000 reviews | $0.50 | $0.42 | $0.32 | $0.24 | $0.24 | $0.24 |

### Limits and notes

- Public reviews only. Steam itself filters off-topic "review bomb" reviews out of this feed.
- `Most helpful` only looks back up to 365 days (a Steam limit). Use `Most recent` with `Reviews since` for full history.
- Game names are matched to the first Steam store search result. Use the app id when a name is ambiguous.
- Very large exports (100k+ reviews) take a while (around 5,000 reviews per minute).
- Data comes from Steam and is provided as is. Not affiliated with, endorsed by or sponsored by Valve Corporation or Steam. Steam and the Steam logo are trademarks of Valve Corporation.

# Actor input Schema

## `apps` (type: `array`):

One game per line: a Steam app id (`730`), a store link (`https://store.steampowered.com/app/1245620/ELDEN_RING/`), a community link (`https://steamcommunity.com/app/570`) or a game name (`Hades II`, matched to the first Steam store search result). Up to 200 per run.

## `filter` (type: `string`):

`Most recent` (newest first, can page through every review), `Recently updated`, or `Most helpful` (Steam's helpfulness ranking, limited to the last 365 days).

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

Only reviews written in this language, or `All languages`.

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

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

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

All reviewers, only those who bought the game on Steam, or only those who got it elsewhere (keys, gifts).

## `dateFrom` (type: `string`):

Only reviews created on or after this date (UTC), e.g. `2026-01-01`. With `Recently updated`, the last-updated date is used. With `Most helpful`, Steam searches at most 365 days back.

## `keywords` (type: `array`):

Keep a review only if its text contains one of these words (case-insensitive). You are billed only for reviews that match. Empty = all.

## `maxReviewsPerApp` (type: `integer`):

Maximum reviews returned for each game.

## `maxItems` (type: `integer`):

Hard cap on reviews for the whole run (also caps your cost). 0 or empty = no limit beyond the per-game cap.

## Actor input object example

```json
{
  "apps": [
    "730"
  ],
  "filter": "recent",
  "language": "english",
  "reviewType": "all",
  "purchaseType": "all",
  "maxReviewsPerApp": 100
}
```

# Actor output Schema

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

Steam user reviews, one item per review.

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

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

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

```

## MCP server setup

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

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/z95Fd4UjfS4OCV8VJ/builds/GZTG9g9nKGvAsSiDZ/openapi.json
