# OpenCritic Scraper: Game Scores & Critic Reviews (`recordsdata/opencritic-games-scraper`) Actor

Scrape OpenCritic top critic scores, tiers, percent recommended and full game details, plus individual critic reviews with outlet, score and snippet. Browse 20 games per page by platform, year and sort, or Hall of Fame. Export CSV, Excel, JSON or XML. No login or API key.

- **URL**: https://apify.com/recordsdata/opencritic-games-scraper.md
- **Developed by:** [RecordsData](https://apify.com/recordsdata) (community)
- **Categories:** Games, News
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

Pay per event

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

<p align="center">
  <img src="https://api.apify.com/v2/key-value-stores/AAm3a1h3Z9nYfrvh9/records/banner?v=3" alt="RecordsData" width="100%" />
</p>

## 🎮 OpenCritic Scraper: Scores, Tiers & Critic Reviews

> The OpenCritic Scraper extracts game review data from opencritic.com: top critic score, tier (Mighty, Strong, Fair, Weak), percent recommended, review count, platforms, tags and release date for ranked lists, home page lists and games by name, plus full game records (review summary, trailers, store prices) and critic reviews with outlet, score and snippet. Filter by platform, year, tag, minimum score and minimum reviews, or run in only-new mode to watch for new games. Export CSV, Excel, JSON or XML. No login and no API key. Last verified 2026-10-10 against the live site.

OpenCritic ranks games by the average of top critic scores, and its official API is behind a paid key. This actor reads the public pages instead: 18 of 18 small cloud test runs on build 0.1.9 succeeded (median 4.1 seconds). It is built for game stores, deal sites and games media.

### 🔎 What does the OpenCritic Scraper do?

- Scrapes the OpenCritic **browse list** by platform (15), timeframe, sort order and **tag** (39 tags such as Roguelike), with **minimum top critic score** and **minimum review count** filters.
- Finds games **by name** with `gameNames`, matched against the public OpenCritic sitemaps (about 9,000 games), not its search box, which needs a key. About 94 percent of scored games were found in our sample; the newest may be missing, and `gameIds` still reaches them.
- Scrapes **full game records** for any game ID, URL or name, and **individual critic reviews** with outlet, author, score, snippet and URL.
- Adds the current **Hall of Fame** and the **home page lists** popular, deals, reviewed today, recently released and upcoming.
- **Only-new mode** (`onlyNew`, `stateKey`) skips rows you already received, so scheduled runs deliver and charge only new rows.

### 📋 What data can you extract from OpenCritic?

51 fields plus `error`, in a fixed order.

| Field | Where it appears |
|---|---|
| `recordType` | all rows (`game`, `browse-game`, `hall-of-fame`, `popular-game`, `deal-game`, `review` and more list types) |
| `rank`, `gameId`, `name`, `url`, `searchQuery` | list and game rows |
| `topCriticScore`, `tier`, `releaseDate`, `platforms`, `genres`, `tags` | game rows (score 0 to 100; -1 means Not Rated) |
| `percentRecommended`, `numReviews`, `numTopCriticReviews`, `recentReviewCount` | browse and full game rows (not home page list rows) |
| `medianScore`, `percentile`, `developers`, `publishers`, `platformReleaseDates`, `isMajorTitle`, `hasLootBoxes` | full game records |
| `description`, `reviewSummary`, `reviewHighlights`, `trailers`, `storePrices`, `biggestDiscountPercent` | full game records and Deals rows |
| `gameName`, `outlet`, `authors`, `score`, `scoreFormat`, `snippet`, `language`, `publishedDate` | review rows |
| `scrapedAt` | all rows |

Empty optional fields are left out. The `error` field exists only on error rows, which are never billed. There is no ESRB rating column.

### 📊 Sample output of the OpenCritic scraper

A real row from a cloud run on 2026-10-03 (older build; newer columns such as `tags` and `trailers` not shown):

```json
{
  "recordType": "game",
  "gameId": 1548,
  "name": "The Legend of Zelda: Breath of the Wild",
  "topCriticScore": 95.8,
  "tier": "Mighty",
  "percentRecommended": 95.7,
  "percentile": 100,
  "numReviews": 168,
  "platforms": ["Wii U", "Nintendo Switch"],
  "releaseDate": "2017-03-03",
  "scrapedAt": "2026-10-04T04:07:35.214Z"
}
```

### 💰 How much does it cost to scrape OpenCritic?

Pay per event, read from the live listing on 2026-10-10, only for rows saved.

| Event | What it covers | Free | Bronze | Silver | Gold and above |
|---|---|---|---|---|---|
| Full game record | One complete game record, including a game found by name | $0.022 | $0.0215 | $0.021 | $0.02 |
| Game summary row | One browse, Hall of Fame or home page list row | $0.01 | $0.01 | $0.01 | $0.01 |
| Critic review | One critic review | $0.01 | $0.01 | $0.01 | $0.01 |

- 1,000 full game records cost $22.00 on Free ($20.00 on Gold); 1,000 list rows or critic reviews cost $10.00.
- Worked example: 30 list rows cost 30 x $0.01 = $0.30. One game found by name with 3 critic reviews costs $0.022 + 3 x $0.01 = $0.052 on the Free plan.
- **You are not charged for error rows, bad game IDs, empty lists, rows skipped by only-new mode, or failed runs.** Duplicates are removed before billing.
- The main rival, omkar-cloud, lists $1 per 1,000 games ($2 with full details), so our rows cost about 10 times as much.

### 🚀 How to scrape OpenCritic in 3 steps

1. Click **Try for free**.
2. Choose a platform, timeframe and sort, or paste game IDs. Turn on **Critic reviews per game** for quotes.
3. Click **Start** and download CSV, Excel, JSON or XML.

### ⚙️ OpenCritic scraper input

| Field | Default | Purpose |
|---|---|---|
| `gameNames`, `matchesPerName` | empty, 1 | Titles to find (Hades 2 finds Hades II); 1 to 5 matches |
| `gameIds` | empty | Game IDs or URLs for full records, for example 1548 |
| `includeReviews`, `maxReviewsPerGame` | false, 40 | Critic reviews per game (1 to 500) |
| `browsePlatform` | all | all, pc, ps5, xbox-series-x, switch, switch-2, ps4, xbox-one, quest, psvr, vive, wii-u, 3ds, vita, stadia |
| `browseTimeframe` | all-time | all-time, last90, upcoming, or a year such as 2026 |
| `browseSortBy` / `browseOrder` | score / default | score, date, num-reviews, percent-recommended; or reverse |
| `includeBrowse`, `browseTag` | true, all | Browse list on or off; one of 39 tags, for example roguelike |
| `minTopCriticScore`, `minReviews` | none | Keep only games at or above these |
| `maxPagesWithoutMatch` | 15 | Stop a tag or filter scan after this many empty pages |
| `includeHallOfFame`, `homeLists` | false, empty | Current Hall of Fame; popular, deals, reviewed-today, recently-released, upcoming |
| `onlyNew`, `stateKey`, `resetSeen` | false, empty, false | Only-new mode and its saved state |
| `maxItems` | 10 | Maximum rows for the whole run |

```json
{
  "gameNames": ["Hades 2"],
  "includeReviews": true,
  "browseTag": "roguelike",
  "browseTimeframe": "2025",
  "minTopCriticScore": 80,
  "maxItems": 8
}
```

An invalid `browseTimeframe` fails the run at once with nothing charged. Free users get 10 rows per run; paid users up to 1,000,000.

### 📦 OpenCritic scraper output

One dataset with four views: Overview, Full game records, Browse and home page lists, and Critic reviews. An empty list succeeds with a status message; if nothing could be read, the run fails. Neither is charged.

### ⚖️ OpenCritic scraper vs alternatives

Read on 2026-10-10 from the Apify Store listings, Free plan price. "Not stated" means the listing does not show it.

| Feature | This actor | omkar-cloud | parseforge |
|---|---|---|---|
| Price per 1,000 | $10 list, $22 full record, $10 review | $1 list, $2 with full details | $19 header, $21 README |
| Critic reviews | Yes, one row per review | Not stated | Not stated |
| Name search | Yes, from sitemaps, about 94% coverage | Yes, best match | Not stated |
| Hall of Fame | Current year only | Any year from 2016 | Not stated |
| Monitor mode | Yes (only-new) | Not stated | Not stated |
| ESRB, catalogs | No | Yes, ESRB and Game Pass catalogs | Not stated |

omkar-cloud is about 10 times cheaper per row and covers Hall of Fame by year, ESRB and catalog collections, which we do not. We add critic review rows, only-new monitoring, review summaries, trailers and store prices. parseforge costs about the same as our full record. Pick omkar-cloud for bulk scores at the lowest price; pick this actor for reviews, monitoring and richer records.

### 💡 OpenCritic data use cases

- **Deal sites and games media:** add score and tier beside every price, or build roundups with quotes.
- **Alerts and publishers:** schedule only-new runs on a tag or the upcoming list, and benchmark percentile.

### 🔌 Run the OpenCritic scraper via API and integrations

```bash
curl -X POST "https://api.apify.com/v2/acts/RecordsData~opencritic-games-scraper/runs?token=YOUR_APIFY_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"browsePlatform":"pc","browseSortBy":"score","maxItems":50}'
```

Schedule runs and send the dataset to Make, Zapier, n8n or Sheets.

### 🤖 OpenCritic Scraper MCP server for AI agents

AI agents can call this Actor through the Apify MCP server at `https://mcp.apify.com?tools=RecordsData/opencritic-games-scraper`. The URL loads only this Actor as a tool (Claude Desktop, Cursor, VS Code):

```json
{
  "mcpServers": {
    "apify": {
      "url": "https://mcp.apify.com?tools=RecordsData/opencritic-games-scraper"
    }
  }
}
```

Example agent prompt:

> Use the OpenCritic Scraper to list the top 20 PS5 games of 2026 by top critic score with their tier and percent recommended, then fetch 5 critic reviews for the best one. Also find Hades 2 by name and summarize its review summary and trailers.

Tool description: choose this Actor when an agent needs OpenCritic review data: ranked lists by platform, year, tag and minimum score, games by name, home page lists, full game records, or critic reviews with outlet and snippet. It takes the same fields as the Input table.

### 🛡️ Is it legal to scrape OpenCritic?

The actor reads public pages at a polite rate (about one request per second) and collects no private data. Review OpenCritic's terms and local rules. The official API is the licensed alternative.

### ❓ Frequently asked questions

#### How do I get an OpenCritic game ID for the OpenCritic Scraper?

The game ID is the number in the game page URL, for example 1548 in opencritic.com/game/1548/the-legend-of-zelda-breath-of-the-wild. Browse rows also return gameId, so you can browse first and fetch full records second. A full URL works too, so you can copy it straight from your browser.

#### Does the OpenCritic Scraper need an API key or login?

No. It reads the public pages of opencritic.com, so no OpenCritic account, login or API key is required, while the official OpenCritic API sits behind a paid key. You only need an Apify account to run it, and free Apify users get a 10-row preview.

#### Why did my OpenCritic scrape return 0 results?

A browse filter with no games, for example a year with no releases yet, or game IDs that do not exist on OpenCritic return an empty dataset. The run then finishes as succeeded with a status message and charges nothing. Check the platform, timeframe and game IDs.

#### Why did my OpenCritic Scraper run fail?

It fails only when OpenCritic could not be read, because of an HTTP or parse failure, and no rows were delivered. In that case you are not charged anything. Retry later, and if it keeps failing write to the support address below.

#### What score formats do OpenCritic critic reviews use?

Each critic review keeps its outlet's native scale in the scoreFormat field, and the score field is normalized to a 0 to 100 scale. For example, a 10 out of 10 review from IGN appears as 100 in the score field, so outlets can be compared.

#### Which platforms and timeframes can I browse with the OpenCritic Scraper?

All platforms, PC, PS5, PS4, Xbox Series X, Xbox One, Switch, Switch 2, Meta Quest, PlayStation VR, HTC Vive, Wii U, 3DS, Vita and Stadia. Timeframes are all-time, last90, upcoming or a year such as 2026, sorted by score, date, review count or percent recommended.

#### How many OpenCritic rows can I get for free?

Free Apify users get up to 10 rows per run, enough to check the fields on your own filter. Paid plans allow up to 1,000,000 rows per run. You can also set a maximum cost per run in Apify, and the run stops cleanly at that limit.

#### Am I charged for duplicates or error rows in the OpenCritic Scraper?

No. Duplicate rows are removed before billing, and error rows, bad game IDs, empty lists and failed runs are never billed. You pay only for rows saved to your dataset: $0.022 per full game record, $0.01 per list row and $0.01 per critic review on the Free plan.

#### Can I search OpenCritic by game name, and what is the limit?

Yes. Put titles in gameNames and you get a full game record per match, with your typed text in searchQuery. It matches against the public OpenCritic sitemaps (about 9,000 games), and Hades 2 finds Hades II. About 94 percent of scored games were found. A name with no match charges nothing; very new releases may be missing, so use gameIds.

#### How do the tag and score filters work in the OpenCritic Scraper?

Set browseTag to one of 39 tags, such as roguelike, horror or souls-like, and add minTopCriticScore or minReviews. OpenCritic has no server side tag filter, so the scraper reads list pages and keeps the matching games. It stops after maxPagesWithoutMatch empty pages (default 15, up to 25).

#### Which OpenCritic home page lists can I scrape?

Use homeLists with popular, deals, reviewed-today, recently-released or upcoming; all are fetched with one request. Deals rows include store, price, base price and percent off. Each row is billed as a game summary row at $0.01 and carries no numReviews or percentRecommended.

#### What extra data do full game records have in the OpenCritic Scraper?

A full game record adds reviewSummary (one sentence), reviewHighlights (up to 3 pro or con labels), tags, trailers with YouTube links, screenshotUrls, images, storePrices and platformReleaseDates. All of it comes at the same game record price, with no extra event or flag to switch on.

#### How does the only-new monitor mode work in the OpenCritic Scraper?

Turn on onlyNew and give a stateKey. The scraper remembers the IDs it delivered and skips them on the next run before the item cap and before charging, so an empty run costs nothing. It works for games, list rows and reviews. Use resetSeen to start over.

#### Which platform bugs were fixed in the OpenCritic Scraper?

Before build 0.1.9, the platform options Xbox Series X, Xbox One and Switch 2 returned no rows, because OpenCritic names them differently in its browse path. They now return data. Home page list rows also showed 0 reviews and N/A recommended; those columns are now left out.

#### Does the OpenCritic Scraper return ESRB ratings?

No. The ESRB rating is not in any OpenCritic page the scraper reads, so there is no ESRB column and nothing to filter on. The scraper returns tier, score, percentile, tags, genres, platforms and store prices instead, all from public pages.

#### Can I get the OpenCritic Hall of Fame for past years?

Not with this version. OpenCritic publishes only the current Hall of Fame in its public pages, so includeHallOfFame adds the current list only. For a close substitute, use a year as browseTimeframe, sort by score and set minReviews, which gives the best rated games of that year.

### 🕹️ Want more game data? Other RecordsData scrapers

[Steam Reviews Scraper](https://apify.com/RecordsData/steam-reviews-scraper), [GOG Scraper](https://apify.com/RecordsData/gog-games-scraper) and [Epic Games Store Scraper](https://apify.com/RecordsData/epic-games-store-scraper).

### 📬 Support

Open the Issues tab on this actor's page or write to contact.punkrecordsdata@gmail.com. Custom solutions on request.

Last updated: 2026-10-11

# Actor input Schema

## `gameNames` (type: `array`):

Look games up by title, for example Elden Ring or Hades II. Each name is matched against the public OpenCritic game index and returns the full game record (scores, critics, tags, review summary, trailers, images, store prices). Use Game IDs instead when you already know the exact id.

## `matchesPerName` (type: `integer`):

How many games to return for each name (best match first). 1 returns only the closest title; raise it to also get sequels and editions that contain the name.

## `gameIds` (type: `array`):

OpenCritic game IDs or URLs for full game records (e.g. 1548 or https://opencritic.com/game/1548/god-of-war). Get IDs from the browse list output.

## `includeReviews` (type: `boolean`):

Also scrape individual critic reviews (outlet, score, snippet) for each game found through Game names or Game IDs.

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

Maximum number of individual critic reviews to collect for each game (outlet, score, snippet, date). Only used when Critic reviews per game is on.

## `includeBrowse` (type: `boolean`):

Scrape the OpenCritic browse list (20 games per page) with score, tier, platforms, genres and tags. Switch it off when you only want the games you named above.

## `browsePlatform` (type: `string`):

OpenCritic platform filter for the browse list. Xbox Series X|S, Xbox One and Nintendo Switch 2 now return data (they returned nothing before).

## `browseTimeframe` (type: `string`):

Time window for the browse list: all-time, last90 (last 90 days), upcoming (not yet released), or a four-digit release year such as 2025.

## `browseSortBy` (type: `string`):

Sort order of the browse list.

## `browseOrder` (type: `string`):

Default shows the highest values and newest dates first. Reverse shows the lowest scores or oldest releases first.

## `browseTag` (type: `string`):

Keep only games that carry this OpenCritic tag. The site cannot filter by tag on its own, so the actor reads the list page by page and keeps matching games; it stops after the number of pages set in Pages without a match.

## `minTopCriticScore` (type: `integer`):

Keep only games with a top critic score at or above this value (0 to 100). Leave empty for no minimum.

## `minReviews` (type: `integer`):

Keep only games with at least this many critic reviews. Leave empty for no minimum.

## `maxPagesWithoutMatch` (type: `integer`):

Stop the browse scan after this many consecutive pages (20 games each) that add no new matching game. This keeps runs with a rare tag or a strict filter cheap and bounded. Up to 25.

## `includeHallOfFame` (type: `boolean`):

Add the current-year Hall of Fame list (highest-rated games of the year). OpenCritic publishes only the current year.

## `homeLists` (type: `array`):

Add these OpenCritic home page lists as extra rows: popular, deals (discounted games with store prices), reviewed today, recently released, upcoming. Leave empty for none.

## `onlyNew` (type: `boolean`):

Return only games and reviews that earlier runs of the same search have not delivered. Schedule the actor to track new releases and new reviews; already seen rows are skipped and not charged. The memory is kept in your own account.

## `stateKey` (type: `string`):

Name for the memory of previous results. Leave empty to derive it from your inputs. Use the same name to share memory between runs, or a different name to keep separate monitors.

## `resetSeen` (type: `boolean`):

Clear the memory for this monitor before the run, so every game and review counts as new again.

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

Maximum number of rows to return across game records, critic reviews, browse and home page lists. Free Apify users are limited to 10 rows (preview); paid users can set up to 1,000,000.

## Actor input object example

```json
{
  "gameNames": [],
  "matchesPerName": 1,
  "gameIds": [
    "1548"
  ],
  "includeReviews": false,
  "maxReviewsPerGame": 40,
  "includeBrowse": true,
  "browsePlatform": "all",
  "browseTimeframe": "all-time",
  "browseSortBy": "score",
  "browseOrder": "default",
  "browseTag": "all",
  "maxPagesWithoutMatch": 15,
  "includeHallOfFame": false,
  "homeLists": [],
  "onlyNew": false,
  "stateKey": "",
  "resetSeen": false,
  "maxItems": 10
}
```

# Actor output Schema

## `overview` (type: `string`):

Key fields per row

## `fullData` (type: `string`):

Complete dataset with all fields

# 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 = {
    "gameIds": [
        "1548"
    ],
    "maxItems": 10
};

// Run the Actor and wait for it to finish
const run = await client.actor("recordsdata/opencritic-games-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 = {
    "gameIds": ["1548"],
    "maxItems": 10,
}

# Run the Actor and wait for it to finish
run = client.actor("recordsdata/opencritic-games-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 '{
  "gameIds": [
    "1548"
  ],
  "maxItems": 10
}' |
apify call recordsdata/opencritic-games-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,recordsdata/opencritic-games-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/zLCCDwaXPu1KyXyTR/builds/Mifoyh0kaY64rrIQA/openapi.json
