# Metacritic Scraper: Metascores, Games, Movies & TV (`recordsdata/metacritic-scores-scraper`) Actor

Scrape Metacritic metascores for 14,000+ games, 17,000+ movies and 3,400+ TV shows. Get ranked lists, search, user scores, sentiment breakdowns and critic review quotes. Filter by year and sort. Export CSV, Excel, JSON, XML. No login or API key, public data only.

- **URL**: https://apify.com/recordsdata/metacritic-scores-scraper.md
- **Developed by:** [RecordsData](https://apify.com/recordsdata) (community)
- **Categories:** Videos, Games
- **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>

> Metacritic Scraper by RecordsData exports metascores, user scores, critic and user reviews, cast and crew for games, movies, TV shows and music albums from metacritic.com. Filter by platform, genre, year and minimum or maximum score, search by title, or fetch full records by slug. 62 output fields, onlyNew monitoring, CSV, Excel, JSON or XML. No login, no API key. Updated for build 0.1.13 on 2026-10-10.

Metacritic Scraper reads the same structured data service the Metacritic website uses, so ranked lists paginate cleanly and every score matches the site. Movies alone hold 17,420 titles and the list pages through all of them. It suits store owners, analysts, journalists and studios that need review data as a table.

### 🎬 What does Metacritic Scraper do?

- **Metascore lists** for games, movies, TV and music, sorted by metascore, user score or release date, with year range and genre filters.
- **Score filters**: `minMetascore`, `maxMetascore` and `minUserScore`, so "PC games rated 85 or more" is one input.
- **Platform filter for games**: 23 platforms, and each row carries the score of that platform.
- **Search by title** across games, movies and TV, or **fetch full records by slug** with sentiment split, platform scores, cast and crew, awards and where to watch.
- **Critic and user reviews** as separate rows, filtered by positive, mixed or negative sentiment.
- **Monitor mode**: `onlyNew` skips titles and reviews you already received.
- **Export** as CSV, Excel, JSON, XML or HTML, or via the API.

### 📊 What data can you extract from Metacritic?

The output has 62 fields (61 data fields plus `error`). Fields that do not exist for a record type are left out.

| Record type | Main fields |
|---|---|
| `browse-title`, `search-result` | `title`, `slug`, `mediaType`, `year`, `releaseDate`, `metaScore`, `reviewCount`, `userScore`, `genres`, `platforms`, `contentRating`, `mustPlay`, `description`, `imageUrl`, `url`. Music rows add `artist`. |
| `detail` | The fields above plus `criticSentiment`, `criticPositive`, `criticMixed`, `criticNegative`, `userSentiment`, `userReviewCount`, `platformScores`. Games add `developers`, `publishers`, `franchises`, `regions`. |
| `detail` (movies, TV) | `directors`, `writers`, `cast` and `crew` (up to 20 each), `awards`, `tags`, `tagline`, `imdbId`, `officialSite`, `streamingServices`, `rentServices`, `buyServices`, `networks`, `seasons`, `seasonCount`, `duration`, `inTheaters` |
| `critic-review` | `titleSlug`, `titleName`, `publication`, `author`, `score`, `quote`, `date`, `externalUrl`, `platform` |
| `user-review` | `reviewId`, `author`, `score`, `quote`, `date`, `spoiler`, `thumbsUp`, `thumbsDown`, `platform` |
| all | `recordType`, `metacriticId`, `scrapedAt`, `error` |

### 🧾 Sample output of the Metacritic scraper

Real row from a cloud run on 2026-10-03 (games):

```json
{
  "recordType": "browse-title",
  "metacriticId": 1300001290,
  "title": "The Legend of Zelda: Ocarina of Time (1998)",
  "slug": "the-legend-of-zelda-ocarina-of-time",
  "mediaType": "games",
  "year": 1998,
  "metaScore": 99,
  "reviewCount": 22,
  "contentRating": "E",
  "platforms": ["Nintendo 64"],
  "genres": ["Open-World Action"],
  "mustPlay": false,
  "description": "As a young boy, Link is tricked by Ganondorf, the King of the Gerudo Thieves...",
  "url": "https://www.metacritic.com/game/the-legend-of-zelda-ocarina-of-time/",
  "scrapedAt": "2026-10-04T03:53:20.933Z"
}
```

This sample comes from an earlier build; current runs add more columns. A full record for `elden-ring` returned metascore 96, "Universal acclaim", 86 critic reviews, user score 8.4 from 24,740 ratings, developer From Software and five platforms.

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

Pay per event, only for rows saved to the dataset. Error rows, "title not found" rows, empty searches and failed runs cost nothing.

| Event | What you get | Price |
|---|---|---|
| Title row | One ranked or searched title, also a music album | $0.01 on every plan |
| Full title record | One title with user score, platform scores, cast and crew | $0.012 on the free plan, $0.0115 Bronze, $0.011 Silver, $0.0105 Gold and above |
| Critic review | One critic review row | $0.01 on every plan |
| User review | One Metacritic user review row | $0.005 on every plan |

Worked examples on the free plan: 1,000 ranked title rows cost 1,000 x $0.01 = $10.00. 1,000 full title records cost 1,000 x $0.012 = $12.00 ($10.50 on Gold). One game with a full record and 100 critic reviews costs $0.012 + 100 x $0.01 = $1.012, and 300 user reviews add 300 x $0.005 = $1.50, for $2.512. A test run of 5 PC games with minMetascore 85 was billed 5 title events, $0.05. A maximum cost per run stops the actor cleanly. Free users get a 10-row preview.

### 🚀 How to scrape Metacritic (3 steps)

1. Choose a media type, sort and filters, or type a search keyword, or paste title slugs such as `elden-ring`.
2. Click **Start**, then download the dataset as CSV, Excel, JSON or XML.

### ⚙️ Metacritic Scraper input

| Field | Meaning | Default |
|---|---|---|
| `includeBrowse` | Scrape the ranked list for the media type | `true` |
| `productType` | `games`, `movies`, `tv` or `music` | `games` |
| `sortBy` | `-metaScore` (best first), `metaScore` (worst), `-userScore`, `userScore`, `-releaseDate` | `-metaScore` |
| `yearMin`, `yearMax` | Release year range | none |
| `platforms` | Games only: pc, ps5, ps4, switch, xbox-series-x and 18 more | empty |
| `genres` | Metacritic genre names, any match | empty |
| `minMetascore`, `maxMetascore` | Metascore range, 0 to 100 | none |
| `minUserScore` | Minimum user score, 0 to 10 | none |
| `searchQuery` | Title keyword, replaces the browse list | empty |
| `searchOnlySelectedType` | Only the chosen media type in search | `false` |
| `titleSlugs` | Slugs or URLs for full records | empty |
| `includeCriticReviews`, `maxReviewsPerTitle` | Critic review rows per slug (1 to 5,000) | `false`, `40` |
| `includeUserReviews`, `maxUserReviewsPerTitle` | User review rows per slug (1 to 5,000, $0.005 each) | `false`, `40` |
| `reviewSentiment` | `all`, `positive`, `mixed` or `negative` | `all` |
| `onlyNew`, `stateKey`, `resetSeen` | Monitor mode, name, clear memory | `false`, empty, `false` |
| `maxItems` | Maximum rows for the whole run | `10` |

Invalid inputs, such as platforms on a movie run, fail in seconds before any charge.

PC games with a minimum score:

```json
{
  "productType": "games",
  "platforms": ["pc"],
  "minMetascore": 85,
  "maxItems": 50
}
```

Negative user reviews of one title, plus its full record:

```json
{ "includeBrowse": false, "titleSlugs": ["elden-ring"], "includeUserReviews": true, "reviewSentiment": "negative" }
```

### 📦 Metacritic Scraper output

If a search or slug finds nothing, the run finishes as succeeded with a clear status message and charges nothing. If Metacritic cannot be reached and no rows were delivered, the run fails instead of pretending to be healthy. Music limits: no genre filter, search, album details or reviews, and the source is HTML list pages.

### ⚖️ Metacritic scraper vs alternatives

Store pages read on 2026-10-10; "not listed" means the page does not show the feature.

| Capability | This actor | cryptosignals | tortuga |
|---|---|---|---|
| Media types | Games, movies, TV, music lists | Games, movies, TV, music | Games, movies, TV |
| Score filters | Min and max metascore, min user score | Not listed | Not listed |
| Platform filter | 23 platforms, platform score per row | Not listed | Yes, games |
| User reviews | Yes, sentiment filter, up to 5,000 per title | Yes, in detail mode | Yes |
| Monitor mode | `onlyNew` for titles and reviews | Not listed | Yes, new or changed |
| Price per 1,000 | $10 title, $12 full record, $10 critic review, $5 user review | $5 per result | $4 title, $2 list row, $2 review |

parseforge ($19 per 1,000) lists a platform and minMetascore filter but no user reviews, cast or monitoring. goat255 (from $4 per 1,000 titles) lists slugs and full records but no filters or reviews. We charge about twice cryptosignals and 2.5 times tortuga per title, and the pages of both did not list our score filters. The higher price buys server-side score and platform filters, 62 fields and sentiment-filtered reviews. If you only need a flat title list, a cheaper actor fits better.

### 🧩 Use cases

Shortlists of best PC games, release monitoring with `onlyNew`, sentiment mining of user reviews, storefront enrichment with metascores, critic quote roundups and score analysis by year, genre or platform.

### 🔌 Run Metacritic Scraper via API and integrations

```js
import { ApifyClient } from 'apify-client';

const client = new ApifyClient({ token: process.env.APIFY_TOKEN });
const run = await client.actor('RecordsData/metacritic-scores-scraper').call({
    productType: 'games', platforms: ['pc'], minMetascore: 85, maxItems: 100,
});
const { items } = await client.dataset(run.defaultDatasetId).listItems();
```

Schedule runs weekly, or connect the dataset to Make, Zapier, n8n, Google Sheets or Slack.

### 🤖 Metacritic Scraper MCP server for AI agents

AI agents can call this Actor through the Apify MCP server at `https://mcp.apify.com?tools=RecordsData/metacritic-scores-scraper`. The URL loads only this Actor as a tool. Choose it when an agent needs Metacritic metascores, user scores, critic or user reviews, or cast and crew as structured data.

Add this to your MCP client configuration (Claude Desktop, Cursor, VS Code or any client that supports remote MCP servers):

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

Example agent prompt:

> Use the Metacritic Scraper to list the 10 best-rated PC games from 2024 with a metascore of at least 85, then get the full record for elden-ring including 3 critic reviews and 3 negative user reviews, and compare the metascore with the user score.

It returns title rows, full records, critic review rows or user review rows.

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

The actor collects publicly visible scores and review metadata at a respectful request rate and does not log in or bypass access controls. Quotes stay the property of their publications. Review Metacritic's terms before commercial use.

### ❓ Frequently asked questions

#### What is a Metacritic metascore?

A Metacritic metascore is a weighted average of professional critic reviews on a 0 to 100 scale. Metacritic Scraper returns it for every title, and full records add the critic sentiment label and the positive, mixed and negative review counts behind the score.

#### How do I get a title slug?

A Metacritic title slug is the last part of the title URL. For metacritic.com/game/elden-ring/ the slug is elden-ring. Browse and search rows include a slug field that you can paste straight into the titleSlugs input to fetch full records or critic reviews.

#### Does it include user scores?

Yes. Full title records fetched by slug include the user score on a 0 to 10 scale, the user sentiment and the user review count. Ranked list rows carry the user score too, and the minUserScore filter works on them. Search rows carry the metascore only. Full records cost $0.012 each on the free plan.

#### Why did I get 0 results?

A search keyword has no match, a year range or score filter contains no titles, or a slug does not exist on metacritic.com. The run still finishes as succeeded with a status message and charges nothing. Check the spelling and loosen the filters.

#### Am I charged for errors or missing titles?

No. Error rows and "title not found" rows are saved without a charge event. Duplicate titles are removed before charging, and a run that fails costs no result events. You pay only for rows that are saved to the dataset, nothing else.

#### How many rows can I get?

Browse lists run past the old 10,000-row stop, so movies alone return all 17,420 titles, and keyword search returns up to 1,000 rows. Free Apify users get 10 rows per run as a preview. Use maxItems to cap the total rows for the run.

#### Can I get only games, only movies or only TV?

Yes. Set the productType input to games, movies, tv or music, and the ranked list covers only that media type. Combine it with a year range and a sort order. Keyword search returns all media types mixed unless searchOnlySelectedType is on.

#### Can I limit my spend?

Yes. Set a maximum cost per run in the Apify run options and the actor stops cleanly with the status "Stopped at your max charge limit". You can also lower maxItems. On the free plan, a title row costs $0.01 and a full title record $0.012.

#### How do the score filters work?

There are minMetascore, maxMetascore and minUserScore. A minimum stops paging as soon as scores drop below it. A maximum or a worst-first read uses a binary search of about 14 one-row requests to find where to start. Titles without a score are never returned when a score filter is set.

#### Does the platform filter change the score?

Yes, for games. The platforms you pick are sent to Metacritic as slugs such as pc, ps5, switch and xbox-series-x, and each ranked row carries the score of that platform, because the PC and PS5 scores of one game differ. Full records add platformScores.

#### Can I get user reviews?

Yes. Turn on includeUserReviews and set maxUserReviewsPerTitle from 1 to 5,000 for the slugs you give. Rows carry reviewId, author, score, text, date, spoiler flag, thumbs and platform. reviewSentiment filters by sentiment and applies to critic reviews too. Each user review row is billed at $0.005 on every plan, so 1,000 cost $5.00.

#### What does music support cover?

Music reads the public album list pages: sort by metascore, user score or newest, with year range and score limits. Rows carry title, artist, release date, scores, description, image and link. There is no genre filter, search, album detail or album reviews. The source is HTML, so a layout change on Metacritic can break it.

#### How much cast and crew do I get?

For movies and TV, full records carry cast with roles, crew with roles and departments, directors and writers. Metacritic's service returns at most 20 cast and 20 crew entries per title, so long credit lists are cut there. Games have no cast; their records carry developers, publishers, franchises and regions instead.

#### Can I monitor for new titles or reviews?

Yes. Turn on onlyNew and optionally set stateKey to name the memory. Titles and reviews seen in earlier runs are skipped before the maxItems cap and before charging, so a repeat run with nothing new returns 0 rows and costs nothing. Set resetSeen to start over.

#### Why did the sort order change?

The old metaScore sort was meant to be worst first but returned the best-first list. It is fixed, so metaScore now really starts with the lowest scores. TV full records were also always reported as not found and now work, and search rows no longer show a reviewCount of 0.

### 🎮 Want more entertainment data? Other RecordsData scrapers

- [OpenCritic Games Scraper](https://apify.com/RecordsData/opencritic-games-scraper) for game review scores.
- [Rotten Tomatoes Scraper](https://apify.com/RecordsData/rotten-tomatoes-scraper) for movie and TV Tomatometer data.
- [Steam Reviews Scraper](https://apify.com/RecordsData/steam-reviews-scraper) for player reviews.

### 🆘 Support

Found a bug? Open the Issues tab or write to contact.punkrecordsdata@gmail.com.

Last updated: 2026-10-11

# Actor input Schema

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

Scrape the ranked Metacritic list (metascore, review count, platforms, genres, user score, image) for the selected media type. Ignored when a search query is set.

## `productType` (type: `string`):

Choose which Metacritic catalog to list: games, movies, TV shows or music (albums). Music supports year, score and sort filters; genre and platform filters apply to the other catalogs.

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

Order of the ranked list. Metascore and user score can be read best first or worst first; titles without a score are left out of the worst-first lists.

## `yearMin` (type: `integer`):

Only include titles released in this year or later, for example 2020.

## `yearMax` (type: `integer`):

Only include titles released in this year or earlier, for example 2025.

## `platforms` (type: `array`):

Games only. Keep titles released on any of these platforms; in the ranked list the metascore of each row is the one for the platform you pick (the PC score and the PS5 score of the same game differ), in search results it only filters. Leave empty for all platforms.

## `genres` (type: `array`):

Keep titles with any of these genres, using the Metacritic name, for example "Action RPG", "Open-World", "Drama", "Comedy", "Sci-Fi". Names are not case sensitive. Leave empty for all genres.

## `minMetascore` (type: `integer`):

Only titles with a metascore of at least this value (0 to 100), for example 85 for universal acclaim. Titles without a metascore are left out.

## `maxMetascore` (type: `integer`):

Only titles with a metascore of at most this value (0 to 100), for example 50 to find the worst-rated titles.

## `minUserScore` (type: `number`):

Only titles with a user score of at least this value (0 to 10, decimals allowed), for example 8.5. Applies to the ranked list; search results do not carry a user score.

## `searchQuery` (type: `string`):

Search Metacritic by title keyword, for example zelda or batman. Returns games, movies and TV shows mixed, with metascores. People and companies in the results are skipped.

## `searchOnlySelectedType` (type: `boolean`):

Keep only results of the media type chosen above (for example only games) instead of games, movies and TV shows mixed.

## `titleSlugs` (type: `array`):

Slugs or URLs for full records with user score, critic and user review breakdown, platform scores, cast and crew, awards and where to watch (e.g. elden-ring, or https://www.metacritic.com/movie/dune-part-two/). A bare slug is looked up under the media type above first, then under the other two.

## `includeCriticReviews` (type: `boolean`):

Also extract one row per critic review (publication, author, score, quote, date, link) for each title slug above.

## `maxReviewsPerTitle` (type: `integer`):

Maximum critic review rows extracted per title slug, from 1 to 5,000.

## `includeUserReviews` (type: `boolean`):

Also extract one row per user review (author, score, text, date, thumbs up and down, spoiler flag) for each title slug above. Billed as its own event, see the Pricing tab.

## `maxUserReviewsPerTitle` (type: `integer`):

Maximum user review rows extracted per title slug, from 1 to 5,000.

## `reviewSentiment` (type: `string`):

Which critic and user reviews to extract: all of them, or only the positive, mixed or negative ones.

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

Return only titles 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 title and review counts as new again.

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

Maximum number of rows to return across the whole run. Free users are limited to 10 items (preview). Paid users: optional, max 1,000,000.

## Actor input object example

```json
{
  "includeBrowse": true,
  "productType": "games",
  "sortBy": "-metaScore",
  "platforms": [],
  "genres": [],
  "searchQuery": "",
  "searchOnlySelectedType": false,
  "titleSlugs": [],
  "includeCriticReviews": false,
  "maxReviewsPerTitle": 40,
  "includeUserReviews": false,
  "maxUserReviewsPerTitle": 40,
  "reviewSentiment": "all",
  "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 = {};

// Run the Actor and wait for it to finish
const run = await client.actor("recordsdata/metacritic-scores-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 = {}

# Run the Actor and wait for it to finish
run = client.actor("recordsdata/metacritic-scores-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 '{}' |
apify call recordsdata/metacritic-scores-scraper --silent --output-dataset

```

## MCP server setup

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