# Steam Review Sampler — Player Feedback Research (`axelhu/steam-review-sampler`) Actor

Sample public Steam reviews using Steam's current IUserReviewsService API. Filter positive or negative reviews by language, date, playtime, helpful votes and phrases; export bounded review rows without reviewer profile identifiers.

- **URL**: https://apify.com/axelhu/steam-review-sampler.md
- **Developed by:** [Axel Hu](https://apify.com/axelhu) (community)
- **Categories:** Developer tools, Automation
- **Security:** Limited permissions
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $0.10 / 1,000 review collecteds

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

## Steam Review Sampler

Private-first Actor for researching what players like and dislike about competitor games. Input app IDs from Steam Market Scout, select positive/negative reviews, language, recent/helpful/funny ordering, and cap output at 100 reviews per game per run.

Useful workflow: first discover comparable titles, then sample both helpful negative and positive reviews; group recurring complaints into onboarding, balance, performance, content depth, monetization and UX. Review text is user-generated and non-representative. This Actor emits no profile URL or SteamID, uses public endpoints without login, and has a hard per-game sample limit with delays.

Example: appIds=\["588650"], reviewType="negative", sortBy="helpful", maxReviewsPerGame=40, language="english". The schema pre-fills Dead Cells (588650) with a small 10-review, one-page sample so Apify Store automated QA can verify a non-empty dataset within its five-minute limit; replace the app ID for normal use.

### Filters and limitations

Optional filters include review date range, minimum/maximum playtime at review, minimum helpful votes, minimum text length, and required/excluded phrases. Set maxPagesPerGame and maxReviewsPerGame to control the workload. Results are sampled from public endpoints and are not a representative survey. Uses Steam’s current official IUserReviewsService/GetAppReviews endpoint. The old Store appreviews route was retired in October 2026, so this Actor deliberately does not use that legacy endpoint. Steam may rate-limit anonymous calls; the Actor applies delays and reports partial failures rather than treating them as zero reviews. This Actor does not require Steam login and does not output profile URLs or Steam IDs.
\nBy default the current Steam API excludes reviews marked as off-topic/review-bomb activity; set includeOfftopicReviews=true to include them for a separate research pass. Playtime filters are applied locally in minutes so they are not rounded to the API's whole-hour filters.\n

# Actor input Schema

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

One to ten Steam app IDs; use appId from Steam Market Scout.

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

Use all for all languages, or english, schinese, etc.

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

Review polarity; see README for usage and limitations.

## `sortBy` (type: `string`):

Steam official review sort: helpful, recent, updated or funny; use recent/updated for chronological pagination.

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

Maximum reviews per game; see README for usage and limitations.

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

Purchase type; see README for usage and limitations.

## `requestDelayMs` (type: `integer`):

Delay between pages (ms); see README for usage and limitations.

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

Optional inclusive review date, YYYY-MM-DD.

## `dateTo` (type: `string`):

Optional inclusive review date, YYYY-MM-DD.

## `minPlaytimeMinutes` (type: `integer`):

Keep reviews from players with at least this much playtime when exposed.

## `maxPlaytimeMinutes` (type: `integer`):

Optional upper playtime bound; null disables it.

## `minHelpfulVotes` (type: `integer`):

Optional minimum helpful-vote threshold.

## `minReviewLength` (type: `integer`):

Ignore shorter review texts; zero disables this filter.

## `includeKeywords` (type: `array`):

Keep reviews containing at least one of these case-insensitive phrases.

## `excludeKeywords` (type: `array`):

Exclude reviews containing any of these case-insensitive phrases.

## `maxPagesPerGame` (type: `integer`):

Hard page limit per game, further limiting requests.

## `includeOfftopicReviews` (type: `boolean`):

Include reviews Steam classifies as off-topic or review-bomb activity. Defaults to excluding them.

## Actor input object example

```json
{
  "appIds": [
    "588650"
  ],
  "language": "english",
  "reviewType": "all",
  "sortBy": "recent",
  "maxReviewsPerGame": 10,
  "purchaseType": "all",
  "requestDelayMs": 500,
  "dateFrom": "",
  "dateTo": "",
  "minPlaytimeMinutes": 0,
  "minHelpfulVotes": 0,
  "minReviewLength": 0,
  "includeKeywords": [],
  "excludeKeywords": [],
  "maxPagesPerGame": 1,
  "includeOfftopicReviews": false
}
```

# Actor output Schema

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

No description

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

No description

# 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": [
        "588650"
    ],
    "language": "english",
    "reviewType": "all",
    "sortBy": "recent",
    "maxReviewsPerGame": 10,
    "purchaseType": "all",
    "requestDelayMs": 500,
    "maxPagesPerGame": 1,
    "includeOfftopicReviews": false
};

// Run the Actor and wait for it to finish
const run = await client.actor("axelhu/steam-review-sampler").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": ["588650"],
    "language": "english",
    "reviewType": "all",
    "sortBy": "recent",
    "maxReviewsPerGame": 10,
    "purchaseType": "all",
    "requestDelayMs": 500,
    "maxPagesPerGame": 1,
    "includeOfftopicReviews": False,
}

# Run the Actor and wait for it to finish
run = client.actor("axelhu/steam-review-sampler").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": [
    "588650"
  ],
  "language": "english",
  "reviewType": "all",
  "sortBy": "recent",
  "maxReviewsPerGame": 10,
  "purchaseType": "all",
  "requestDelayMs": 500,
  "maxPagesPerGame": 1,
  "includeOfftopicReviews": false
}' |
apify call axelhu/steam-review-sampler --silent --output-dataset

```

## MCP server setup

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

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/IXtGfK5D6oDe6y6de/builds/RIe6hveEK1yInWmOF/openapi.json
