# Steam Reviews Scraper - Player Feedback & Ratings (`benthepythondev/steam-reviews-scraper`) Actor

Scrape user reviews for any Steam game: review text, thumbs up/down, helpful/funny votes, author playtime, purchase type, early-access flag and timestamps, plus the game's overall review summary. Search by game name or App ID. Fast and reliable via Steam's public API.

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

## Pricing

from $1.50 / 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 Reviews Scraper — Player Feedback & Ratings

Scrape user reviews for **any game on Steam** — the full review text, the thumbs-up/down rating, helpful and funny vote counts, the reviewer's playtime, purchase type, early-access flag and timestamps — plus the game's overall review summary on every row. Search by game name and the actor auto-resolves the Steam App ID for you, or pass App IDs directly. Pull the latest reviews, the most helpful ones, or thousands at a time for deep analysis.

The actor is powered by **Steam's public review API**, so it is fast and reliable with no browser and no login. Export to JSON/CSV/Excel, run on a schedule, call via API, or connect to Make, Zapier or n8n.

### 🔎 What is the Steam Reviews Scraper?

Steam reviews are one of the richest sources of honest player feedback anywhere — millions of gamers explaining exactly what they love and hate, alongside hard signals like how many hours they played before writing. This actor turns that into a structured dataset you can actually analyze.

Give it game names (e.g. `portal 2`) or Steam App IDs, choose a language and a sort/filter mode, and it paginates through the reviews up to your requested limit, returning one clean row per review. Each row pairs the review content and the reviewer's stats with the game's overall summary (score description, total reviews, total positive), so you always have context. It is built for sentiment analysis, competitive research, community management and building game-review datasets.

#### What data does it extract?

- **App ID** — the Steam application the review belongs to
- **Review score description** — overall rating, e.g. "Overwhelmingly Positive"
- **Total reviews** and **total positive** — the game's review summary
- **Recommendation ID** — unique review identifier
- **Author SteamID**, **games owned** and **reviews written**
- **Playtime** — total hours, and hours at the time of the review
- **Language** of the review
- **Voted up** — thumbs up (`true`) or thumbs down (`false`)
- **Votes up** (helpful) and **votes funny** counts
- **Weighted vote score** — Steam's helpfulness weighting
- **Comment count** on the review
- **Steam purchase** and **received for free** flags
- **Early access** — whether it was written during early access
- **Created** and **updated** dates
- **Review** — the full review text

### ⬇️ Input

| Field | Type | Description |
|-------|------|-------------|
| `searchTerms` | array | Game names to scrape (auto-resolves the App ID), e.g. `portal 2`. |
| `appIds` | array | Optional: scrape specific games by Steam App ID, e.g. `620`. |
| `language` | string | Review language, e.g. `all`, `english`, `german`. Default `all`. |
| `filter` | string | Which reviews to fetch: `recent`, `updated` or `all` (helpful first). Default `recent`. |
| `maxReviews` | integer | Max reviews per game. Default `50`, up to `2000`. |

#### Example input

```json
{
  "searchTerms": ["portal 2"],
  "language": "english",
  "filter": "all",
  "maxReviews": 200
}
````

### ⬆️ Output

Each review is one clean row (view as a **table**, or export **JSON / CSV / Excel**):

```json
{
  "app_id": "620",
  "review_score_desc": "Overwhelmingly Positive",
  "total_reviews": 286140,
  "total_positive": 282900,
  "recommendation_id": "123456789",
  "author_steamid": "76561198000000000",
  "author_num_games": 214,
  "author_num_reviews": 37,
  "playtime_forever_hours": 42.3,
  "playtime_at_review_hours": 18.7,
  "language": "english",
  "voted_up": true,
  "votes_up": 12,
  "votes_funny": 1,
  "weighted_vote_score": "0.529411792755126953",
  "comment_count": 0,
  "steam_purchase": true,
  "received_for_free": false,
  "early_access": false,
  "created_date": "2024-11-02",
  "updated_date": "2024-11-02",
  "review": "Still one of the best puzzle games ever made. The co-op campaign alone is worth it."
}
```

### 💡 Use cases

- 💬 **Sentiment analysis** — mine thousands of reviews to quantify what players love or complain about and track sentiment over time.
- 🎮 **Player & competitor research** — study feedback on your game or a rival's to guide roadmap, balance and marketing decisions.
- 📊 **Review datasets & NLP** — build labelled corpora (voted-up/down, playtime, language) for machine-learning and analytics.
- 🤖 **Community & QA pipelines** — feed structured reviews into dashboards, Make/Zapier/n8n flows or LLM summarizers.

### ❓ FAQ

**How do I scrape Steam reviews?** Enter game names in `searchTerms` (or App IDs in `appIds`), set `maxReviews`, and Run. You get one structured row per review plus the game's overall summary.

**Do I need an API key or login?** No. It uses Steam's public review API — just provide game names or App IDs.

**Can I search by game name?** Yes — the actor auto-resolves the Steam App ID from the name, so you don't have to look it up.

**Can I filter by language?** Yes — set `language` (e.g. `english`, `german`) or use `all` for every language.

**How do I get the most helpful reviews vs the newest?** Use `filter`: `recent` for the latest, `updated` for recently edited, or `all` for Steam's helpful-first ordering.

**How many reviews can I get?** Up to `maxReviews` per game (up to 2000) — the actor paginates automatically through Steam's cursor.

**Does it include the reviewer's playtime?** Yes — both total playtime and playtime at the moment the review was written, in hours.

**Can I run it on a schedule or via API?** Yes — schedule recurring runs on Apify, call it via the API/SDK, or connect it to Make, Zapier or n8n.

**How does pricing work?** Pay per review returned — no subscription, no fixed monthly fee.

**Is it legal?** It uses Steam's public review API and returns publicly visible review content. Use the data responsibly and in line with Valve's terms.

### 🔗 You might also like

- **[Steam Games Scraper](https://apify.com/benthepythondev/steam-games-scraper)** — game prices, tags & metadata.
- **[App Store Reviews Scraper](https://apify.com/benthepythondev/app-store-reviews-scraper)** — Apple App Store ratings & reviews.
- **[Google Play Reviews Scraper](https://apify.com/benthepythondev/google-play-reviews-scraper)** — Android app reviews.
- **[Google Maps Reviews Scraper](https://apify.com/benthepythondev/google-maps-reviews-scraper)** — local business reviews.

***

**Keywords:** steam reviews scraper, game reviews, steam sentiment analysis, player feedback, review scraper, steam api, game review dataset, sentiment analysis, voted up, gaming reviews, steam comments, review mining, game opinions, user reviews, steam app reviews, video game reviews, steam playtime data, review text scraper, steam store reviews, game feedback data

# Actor input Schema

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

Game names to scrape reviews for (auto-resolves the App ID), e.g. 'portal 2'.

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

Optional: scrape reviews for specific games by Steam App ID (e.g. '620').

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

Review language, e.g. 'all', 'english', 'german'.

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

Which reviews to fetch.

## `maxReviews` (type: `integer`):

Maximum reviews to return per game.

## Actor input object example

```json
{
  "searchTerms": [
    "portal 2"
  ],
  "language": "all",
  "filter": "recent",
  "maxReviews": 50
}
```

# 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 = {
    "searchTerms": [
        "portal 2"
    ],
    "language": "all",
    "filter": "recent"
};

// Run the Actor and wait for it to finish
const run = await client.actor("benthepythondev/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 = {
    "searchTerms": ["portal 2"],
    "language": "all",
    "filter": "recent",
}

# Run the Actor and wait for it to finish
run = client.actor("benthepythondev/steam-reviews-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 '{
  "searchTerms": [
    "portal 2"
  ],
  "language": "all",
  "filter": "recent"
}' |
apify call benthepythondev/steam-reviews-scraper --silent --output-dataset

```

## MCP server setup

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

```

## OpenAPI specification

```json
{
    "openapi": "3.0.1",
    "info": {
        "title": "Steam Reviews Scraper - Player Feedback & Ratings",
        "description": "Scrape user reviews for any Steam game: review text, thumbs up/down, helpful/funny votes, author playtime, purchase type, early-access flag and timestamps, plus the game's overall review summary. Search by game name or App ID. Fast and reliable via Steam's public API.",
        "version": "1.0",
        "x-build-id": "B8pUrXYrAah9kfOh6"
    },
    "servers": [
        {
            "url": "https://api.apify.com/v2"
        }
    ],
    "paths": {
        "/acts/benthepythondev~steam-reviews-scraper/run-sync-get-dataset-items": {
            "post": {
                "operationId": "run-sync-get-dataset-items-benthepythondev-steam-reviews-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/benthepythondev~steam-reviews-scraper/runs": {
            "post": {
                "operationId": "runs-sync-benthepythondev-steam-reviews-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/benthepythondev~steam-reviews-scraper/run-sync": {
            "post": {
                "operationId": "run-sync-benthepythondev-steam-reviews-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": {
                    "searchTerms": {
                        "title": "Game names",
                        "type": "array",
                        "description": "Game names to scrape reviews for (auto-resolves the App ID), e.g. 'portal 2'.",
                        "items": {
                            "type": "string"
                        }
                    },
                    "appIds": {
                        "title": "App IDs",
                        "type": "array",
                        "description": "Optional: scrape reviews for specific games by Steam App ID (e.g. '620').",
                        "items": {
                            "type": "string"
                        }
                    },
                    "language": {
                        "title": "Review language",
                        "type": "string",
                        "description": "Review language, e.g. 'all', 'english', 'german'.",
                        "default": "all"
                    },
                    "filter": {
                        "title": "Sort / filter",
                        "enum": [
                            "recent",
                            "updated",
                            "all"
                        ],
                        "type": "string",
                        "description": "Which reviews to fetch.",
                        "default": "recent"
                    },
                    "maxReviews": {
                        "title": "Max reviews per game",
                        "minimum": 1,
                        "maximum": 2000,
                        "type": "integer",
                        "description": "Maximum reviews to return per game.",
                        "default": 50
                    }
                }
            },
            "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
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }
}
```
