# Steam Recent Written Reviews by Game ID (`jpmarketdata/steam-recent-written-reviews`) Actor

Fetch recent written Steam game reviews for exact app IDs with language and recommendation filters. Return redacted text, source timestamps and review provenance without author profiles.

- **URL**: https://apify.com/jpmarketdata/steam-recent-written-reviews.md
- **Developed by:** [h ichi](https://apify.com/jpmarketdata) (community)
- **Categories:** E-commerce, Automation, Developer tools
- **Stats:** 2 total users, 1 monthly users, 90.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

$0.50 / 1,000 written review delivereds

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 Recent Written Reviews by Game ID

Fetch the newest written public reviews for exact Steam game app IDs. Game teams can review feedback after a release or schedule this feed for a bounded watchlist. Each row carries redacted review text, recommendation and source time. This is a recent sample, not a complete history, trend or quality score.

### Input

Supply one to three positive numeric `appIds`. The console prefill and canary use 620 and 570; API callers must supply `appIds`. `maxReviewsPerGame` is 1–200 (default 20). `language` is `english` (default) or `all`; `reviewType` is `all` (default), `positive` or `negative`. Duplicate app IDs collapse. No account, game-name search, arbitrary URL, date window, cursor or cookie input is accepted. Filters are applied by Steam.

### Output

One row per distinct nonblank written review in Steam's recent order. Blank-text source entries are skipped and never charged. The row includes app ID, public review ID, recommendation, language, contact-redacted text, created/updated time and helpful-vote count. `sourceLimitReached=true` means the requested cap or two-page bound stopped acquisition; it does not establish the total number of matching reviews. Steam purchase and received-for-free flags are source attributes, not verified identities. No author IDs or profiles are output. Missing/empty reviews fail rather than becoming a billable zero-result report. Source examples and counts can change. `sourceUrl` is the public Steamworks review API URL with the game ID and current language/recommendation filters in `input_json`, not an author profile. It starts at the first review page in recent order; it is not a review permalink.

### Limits and source

The Actor rechecks `api.steampowered.com/robots.txt`, uses only the official `IUserReviewsService/GetAppReviews/v1/` API with anonymous requests and does not follow redirects. At most three games, two pages per game, 100 source entries per page (blank text can reduce delivered rows), six review GETs and one robots GET, sequential with one-second spacing. Each response is capped at 2 MiB, each request at 20 seconds and the run at 180 seconds, with 256 MB memory. No proxy, browser, paid API, credential or Steam account. The [official API](https://partner.steamgames.com/doc/webapi/IUserReviewsService?l=english) replaces the retired `/appreviews` route and uses recent-order and recommendation enum filters. No publisher key is sent or accepted. Requests are restricted to this documented anonymous review method; other URLs, methods and credentials are rejected. Robots retrieval failures, HTTP 429, access failures and malformed responses fail before delivery. The output does not claim exact date-window or full historical coverage.

### Privacy

Review text is public but freeform. The Actor removes email addresses, phone-like strings, URLs and @handles before output, caps it at 2,000 characters and marks changed text. Other names can remain; do not use this feed to identify reviewers. Author objects, Steam IDs, profiles, avatars, ownership and playtime history, comments, raw JSON and cookies are excluded. No source body is logged or saved.

### Pricing

One primary `review-delivered` event at $0.0005 for each validated delivered row. No start, secondary or default-dataset event. The console prefill is capped at 40 review rows ($0.02) and the maximum input at 600 rows ($0.30). The Actor checks that available PPE event allowance covers every requested app at the requested cap before contacting Steam; insufficient allowance fails without reducing the scope. Invalid input or any source failure before delivery has no review charge. Steam terms tension and source risk are recorded in the dated scout under DR-0007.

# Actor input Schema

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

One to three positive numeric Steam app IDs. Duplicate IDs are requested once; game-name searches are not supported.

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

One to 200 recent written reviews per game. At most two pages per game. This is a recent prefix, not complete history.

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

Steam API language filter. English or all source languages.

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

All, positive or negative source recommendations.

## Actor input object example

```json
{
  "appIds": [
    620,
    570
  ],
  "maxReviewsPerGame": 20,
  "language": "english",
  "reviewType": "all"
}
```

# Actor output Schema

## `results` (type: `string`):

Each row contains a contact-redacted review, recommendation, creation time and helpful vote count.

# 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": [
        620,
        570
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("jpmarketdata/steam-recent-written-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 = { "appIds": [
        620,
        570,
    ] }

# Run the Actor and wait for it to finish
run = client.actor("jpmarketdata/steam-recent-written-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 '{
  "appIds": [
    620,
    570
  ]
}' |
apify call jpmarketdata/steam-recent-written-reviews --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,jpmarketdata/steam-recent-written-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/hstp1NmCrHcRN0zW4/builds/VRCSJfd5WVhaL0s29/openapi.json
