# Metacritic Scores Scraper (`axiomworks/metacritic-scores-scraper`) Actor

Scrape Metacritic games, movies and TV shows and return one record per title with critic and user scores, review counts, release dates and genres. Enable details for score breakdowns, platforms, developers, publishers, directors and cast; no login or API key is required.

- **URL**: https://apify.com/axiomworks/metacritic-scores-scraper.md
- **Developed by:** [Axiom Works](https://apify.com/axiomworks) (community)
- **Categories:** Other
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $2.97 / 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.
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

**Returns:** one row per game, movie or TV show with `title`, `type`, `metascore`, `criticReviewCount`, `userScore`, `releaseDate` and `sourceUrl`.
**Input:** `{"searchTerms": ["zelda"], "searchType": "game", "maxItems": 30}`
**Best for:** tracking critic and user scores over time, building ranked lists of top-rated games, movies and shows, and enriching catalogs with Metacritic scores.

```json
{
    "id": "1300494289",
    "sourceUrl": "https://www.metacritic.com/game/hades/",
    "type": "game",
    "title": "Hades",
    "metascore": 93,
    "criticReviewCount": 58,
    "userScore": 8.5
}
```

### What does Metacritic Scores Scraper do?

Metacritic Scores Scraper is a Metacritic scraper and unofficial Metacritic API for scores. It collects the Metascore (critic score), the user score, the number of critic reviews and user ratings, the positive, mixed and negative review split, genres, release dates, ratings, platforms, developers, publishers, directors and cast for games, movies and TV shows. It needs no login and reads only public pages and public data endpoints.

You choose titles in one of four ways. Give search terms such as "zelda" or "severance", paste Metacritic URLs (a title page, a browse page with your filters, or a search page), supply known title slugs, or leave URLs, slugs and search terms empty and use the browse filters: category, game platform, genres, release years and sort order. The Actor returns one record per title, with a stable `id` and the `sourceUrl` of the title page.

Use the dataset to compare critic and audience scores, build ranked watchlists, or add Metacritic metadata to an existing catalog.

### What data can you get from Metacritic?

Each record has the fields below. Fields that do not apply to a title type, or that Metacritic does not show for that title, are `null`. For example `developers` is only filled for games, `directors` and `topCast` only for movies and TV, and `userScore` is `null` for a new title that has no user ratings yet.

| Field | Description | Example |
|---|---|---|
| `id` | Stable Metacritic ID of the title as a string (same as metacriticId). Unique within a run. | `"1300501979"` |
| `sourceUrl` | Metacritic page of the title, e.g. https://www.metacritic.com/game/elden-ring/. | `"https://www.metacritic.com/game/elden-ring/"` |
| `type` | Kind of title: game, movie or tv. | `"game"` |
| `title` | Title as shown on Metacritic. | `"Elden Ring"` |
| `slug` | URL slug of the title on Metacritic. | `"elden-ring"` |
| `metascore` | Critic Metascore 0-100; null when the title has no score yet. For multi-platform games it is the default platform's score. | `96` |
| `metascoreSentiment` | Critic verdict, e.g. 'Universal acclaim'. | `"Universal acclaim"` |
| `criticReviewCount` | Number of critic reviews behind the Metascore. | `86` |
| `criticPositiveCount` | Critic reviews rated positive. | `86` |
| `criticMixedCount` | Critic reviews rated mixed. | `0` |
| `criticNegativeCount` | Critic reviews rated negative. | `0` |
| `userScore` | User score on a 0-10 scale; null when there are no user ratings yet. | `8.4` |
| `userScoreSentiment` | User verdict, e.g. 'Generally favorable'. | `"Generally favorable"` |
| `userRatingCount` | Number of user ratings (detail data only). | `24733` |
| `userPositiveCount` | User ratings that are positive (detail data only). | `20286` |
| `userMixedCount` | User ratings that are mixed (detail data only). | `1589` |
| `userNegativeCount` | User ratings that are negative (detail data only). | `2858` |
| `releaseDate` | Release date, YYYY-MM-DD. | `"2022-02-25"` |
| `releaseYear` | Release year. | `2022` |
| `platform` | Games only: the platform the scores refer to. | `"PlayStation 5"` |
| `platforms` | Games: platforms with their own Metascore and critic review count (detail data); listing data gives names only. Empty for movies and TV. | `[{"name": "PC", "metascore": 94, "criticReviewCount": 63}]` |
| `whereToWatch` | Movies and TV: streaming, rental or purchase services listed on Metacritic. Detail data includes available providers, deduplicated across offer types; without details, services come from the listing. | `["Netflix"]` |
| `genres` | Genre names. | `["Action RPG"]` |
| `rating` | Age rating such as ESRB M, MPAA R or TV-MA. | `"M"` |
| `mustPlay` | True when Metacritic marks the title Must-Play or Must-See. | `true` |
| `developers` | Games, detail data: developer companies. | `["From Software"]` |
| `publishers` | Games, detail data: publisher companies. | `["Bandai Namco Games"]` |
| `directors` | Movies and TV, detail data: directors. | `["Francis Ford Coppola"]` |
| `topCast` | Movies and TV, detail data: first 10 cast members. | `["Marlon Brando"]` |
| `network` | TV: network or streaming service. | `"HULU"` |
| `numberOfSeasons` | TV: number of seasons. | `6` |
| `durationMinutes` | Movies: running time in minutes. | `175` |
| `description` | Synopsis from Metacritic. | `"A New World Created By Hidetaka Miyazaki And George R. R. Martin"` |
| `imageUrl` | Poster or cover image URL. | `"https://www.metacritic.com/a/img/catalog/provider/6/3/6-1-824862-13.jpg"` |
| `metacriticId` | Numeric Metacritic ID of the title. | `1300501979` |
| `scrapedAt` | ISO timestamp of when the record was scraped. | `"2026-10-03T12:00:00.000Z"` |

Scores for multi-platform games are per platform. The `metascore`, `criticReviewCount` and user fields describe the platform in `platform` (Metacritic's default platform for the game), and `platforms` lists the other platforms with their own Metascore and critic review count when details are on.

Detail requests run with modest concurrency and stop at the remaining item budget, so a final batch does not fetch unused title details. If a detail request fails, the Actor keeps the listing data and logs a warning. A target that stays blocked or has no usable results is skipped; an empty run finishes successfully with a message explaining what to check or retry. Block detection uses visible page text and the page title, so embedded anti-bot scripts alone do not trigger retries.

### How to use Metacritic Scores Scraper

1. Open the Actor on Apify and go to the Input tab.
2. Pick what to scrape: add search terms, paste Metacritic URLs, supply slugs, or set the browse filters (category, platform, genres, years, sort order).
3. Set Maximum results to the number of titles you need, and decide whether to include details.
4. Click Start. Results appear in the Output tab while the run progresses.
5. Export the dataset as JSON, CSV, Excel, XML or HTML, or fetch it through the API.

Details on adds user counts, review splits and production metadata to listing results; details off returns listing fields only. Direct URLs and slugs always fetch details. All targets share one result budget, with duplicate IDs removed. Requests stay near two per second. Several genres run separate browse queries and merge their results; sort order restarts for each genre.

### Input

| Field | Type | Required | Description |
|---|---|---|---|
| `searchTerms` | array of strings | No | Titles to search, e.g. `zelda`. Each term returns matching games, movies and shows. |
| `searchType` | string | No | `all` (default), `game`, `movie` or `tv`. Applies to search terms. |
| `startUrls` | array | No | Metacritic title, browse or search URLs. Processed first. |
| `slugs` | array of strings | No | Known title slugs, default empty. Bare slugs use category; prefixes game/, movie/ or tv/ select the type. Processed after URLs and before search terms. |
| `category` | string | No | `games` (default), `movies` or `tv`. Used for bare slugs, and browsing when all target lists are empty. |
| `platform` | string | No | Games only, e.g. `ps5`, `pc`, `nintendo-switch`. Default `all`. |
| `genres` | array of strings | No | Genre names as on Metacritic, e.g. `Horror`, `Action RPG`. |
| `releaseYearFrom` | integer | No | Earliest release year when browsing. |
| `releaseYearTo` | integer | No | Latest release year when browsing. |
| `sortBy` | string | No | `metascore` (default), `userscore` or `newest`. |
| `maxItems` | integer | No | Maximum results, 1-5000, default 50. |
| `includeDetails` | boolean | No | Default `true`. Adds one request per title for the detail fields. |
| `proxyConfiguration` | object | No | Optional Apify Proxy. Off by default; the site normally needs none. |

Search for a game:

```json
{
    "searchTerms": ["zelda"],
    "searchType": "game",
    "maxItems": 30,
    "includeDetails": true
}
```

Browse top horror movies from 2020 to 2025:

```json
{
    "category": "movies",
    "genres": ["Horror"],
    "releaseYearFrom": 2020,
    "releaseYearTo": 2025,
    "sortBy": "metascore",
    "maxItems": 20
}
```

Scrape specific titles by URL:

```json
{
    "startUrls": [
        {"url": "https://www.metacritic.com/game/elden-ring/"},
        {"url": "https://www.metacritic.com/movie/the-godfather/"},
        {"url": "https://www.metacritic.com/tv/the-bear/"}
    ]
}
```

Supported URLs are title pages (`/game/<slug>/`, `/movie/<slug>/`, `/tv/<slug>/`, with or without a sub-path such as `/critic-reviews/`), browse pages (`/browse/game/...`, `/browse/movie/...`, `/browse/tv/...` with any filters in the URL) and search pages (`/search/<term>/`). Other URLs are logged and skipped. A browse URL with a platform that Metacritic does not recognise is skipped with a warning, because the site would otherwise show unrelated games.

Known slugs fetch catalog titles without a search request or full URL. For example, `{"slugs":["game/elden-ring","movie/parasite","tv/severance"],"maxItems":3}` selects three different media types in one run. To use bare slugs, set `category` explicitly: `{"category":"movies","slugs":["parasite"],"maxItems":1}`. A qualified slug overrides category for that title. Slugs use the same detail endpoint and output as title URLs, even with `includeDetails` false.

URLs run first, then slugs, then search terms. All share one `maxItems` budget and duplicate IDs are saved once. Browse filters do not run when any of these target lists is populated. A missing slug is skipped, allowing later targets to continue; if every target is missing or blocked, the run succeeds with an empty dataset and a status message explaining what to check. Use the exact `slug` returned by a previous run rather than guessing from a title: punctuation and translated names can differ from their URL spelling.

### Output

Each run writes one dataset item per title. Real examples from test runs:

```json
[
{
    "id": "1300501979",
    "sourceUrl": "https://www.metacritic.com/game/elden-ring/",
    "type": "game",
    "title": "Elden Ring",
    "slug": "elden-ring",
    "metascore": 96,
    "metascoreSentiment": "Universal acclaim",
    "criticReviewCount": 86,
    "userScore": 8.4,
    "userRatingCount": 24733,
    "releaseDate": "2022-02-25",
    "platform": "PlayStation 5",
    "genres": [
        "Action RPG"
    ],
    "rating": "M",
    "mustPlay": true,
    "developers": [
        "From Software"
    ],
    "publishers": [
        "Bandai Namco Games",
        "From Software"
    ]
},
{
    "id": "1000366416",
    "sourceUrl": "https://www.metacritic.com/tv/the-bear/",
    "type": "tv",
    "title": "The Bear",
    "metascore": 83,
    "metascoreSentiment": "Universal acclaim",
    "criticReviewCount": 181,
    "userScore": 7.7,
    "userRatingCount": 946,
    "releaseDate": "2022-06-23",
    "genres": [
        "Comedy",
        "Drama"
    ],
    "rating": "TV-MA",
    "network": "HULU",
    "numberOfSeasons": 6,
    "directors": [
        "Christopher Storer"
    ],
    "topCast": [
        "Jeremy Allen White",
        "Ebon Moss-Bachrach",
        "Ayo Edebiri"
    ]
}
]
```

Download the dataset as JSON, CSV, Excel, XML or HTML. The Output tab shows an overview table with title, type, Metascore, critic review count, user score, user rating count, release date, platform, genres and URL.

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

Metacritic Scores Scraper is charged per result: you pay for each title record saved to the dataset, nothing for titles that were not returned. Set Maximum results to cap the number of results, and so the charge, for a run. See the Pricing tab of the Actor for the current price.

### Use with AI agents (MCP)

Connect Metacritic Scores Scraper to Claude, Cursor or any MCP client through the Apify MCP server:

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

Example prompts:

1. "Get the Metascore and user score for Elden Ring, Baldur's Gate 3 and Astro Bot from Metacritic and tell me which has the biggest gap between critics and players."
2. "List the 20 best-reviewed horror movies from 2020 to 2025 on Metacritic with their Metascores and critic review counts."
3. "Search Metacritic for the TV show Severance and return its Metascore, user score, network and number of seasons."

### Integrations and API

Run Metacritic Scores Scraper from your own code with the Apify API. Set `APIFY_TOKEN` to your Apify API token (send it in the `Authorization` header, never in the URL).

**Python**

```python
from apify_client import ApifyClient

client = ApifyClient("<YOUR_API_TOKEN>")
run = client.actor("axiomworks/metacritic-scores-scraper").call(run_input={"searchTerms": ["zelda"], "searchType": "game", "maxItems": 30})
for item in client.dataset(run["defaultDatasetId"]).iterate_items():
    print(item["title"], item["metascore"], item["userScore"])
```

**JavaScript**

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

const client = new ApifyClient({ token: '<YOUR_API_TOKEN>' });
const run = await client.actor('axiomworks/metacritic-scores-scraper').call({ searchTerms: ['zelda'], searchType: 'game', maxItems: 30 });
const { items } = await client.dataset(run.defaultDatasetId).listItems();
```

**cURL**

```bash
curl -X POST "https://api.apify.com/v2/acts/axiomworks~metacritic-scores-scraper/run-sync-get-dataset-items" \
  -H "Authorization: Bearer $APIFY_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"searchTerms": ["zelda"], "searchType": "game", "maxItems": 30}'
```

You can also connect the Actor to Make, Zapier, n8n, Google Sheets and webhooks from the Integrations tab, and schedule runs from the Schedules tab to track how scores change.

### FAQ

**Why are some scores `null`?**
Metacritic shows "tbd" for titles that have too few critic reviews or no user ratings yet. The Actor returns `null` for the score instead of a zero, so you can tell "no score yet" from a real low score.

With `includeDetails: true`, the critic summary controls `metascore` and `metascoreSentiment`, including a missing score. A zero in the listing does not replace a detail summary that says the title is still awaiting enough critic reviews. Review counts and their positive, mixed and negative splits remain available when the summary provides them.

**Which platform does a game's Metascore belong to?**
Metacritic scores each platform separately. The top-level `metascore` and user fields describe the platform in `platform`. With details on, `platforms` lists the Metascore and critic review count for every platform of the game.

**Why is `userRatingCount` empty?**
User rating counts and the positive, mixed and negative splits come from the detail data. Run with `includeDetails` on to get them.

**How fresh is the data?**
Every run reads the current values from Metacritic, and `scrapedAt` records when each row was read. Schedule the Actor to build a history of scores.

**Why did my run return 0 results?**
The search term, URL or filter matched nothing on Metacritic. The run still ends successfully with a message that names the cause, and a `RUN_SUMMARY` record in the key-value store lists the warnings. Check spelling, try a shorter term, or open the same search on the site.

**Can I get movie genres or games for one platform only?**
Yes. Set `category` to `movies` with `genres`, or `category` to `games` with `platform`, for example `ps5`. These filters apply when URLs, slugs and search terms are empty.

**Do I need a proxy?**
Normally not. If requests are blocked, enable the proxy input; blocked requests are retried on a new IP.

**How many titles can one run return?**
Up to 5000 per run, set with Maximum results.

### Is it legal to scrape Metacritic?

This Actor collects publicly available information that anyone can see on Metacritic without logging in. It does not access accounts or private data, and it does not bypass any login or CAPTCHA. Review scores, titles and release data are facts, but descriptions and images may be protected by copyright, and the site's terms of use may restrict automated access, so check them for your use case. You are responsible for how you use the data, including compliance with copyright and data protection law such as GDPR. This is not legal advice. The Actor is an independent tool and is not affiliated with or endorsed by Metacritic.

### Feedback

Found a bug or need a field that isn't here? Open an issue on the Issues tab and we'll look at it.

# Actor input Schema

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

Titles to search on Metacritic, e.g. \["zelda", "the bear"]. Each term returns its matching games, movies and TV shows (narrow with searchType); results from all terms share maxItems. A term with no match is skipped and noted in the status message. Leave empty to use URLs or browse filters.

## `searchType` (type: `string`):

Restrict search terms to one kind of title: all, game, movie or tv. Default all. Applies to searchTerms only.

## `startUrls` (type: `array`):

Metacritic URLs, e.g. \[{"url": "https://www.metacritic.com/game/elden-ring/"}]. Accepts title pages (/game/, /movie/, /tv/), browse pages (/browse/game/ps5/all/all-time/metascore/) and search pages. Processed before search terms. A dead or non-Metacritic URL is skipped; if nothing matches the run ends with 0 items and a message naming the cause.

## `slugs` (type: `array`):

Known title slugs, e.g. elden-ring (category selects games, movies or tv), or game/elden-ring, movie/parasite, tv/severance for mixed media. URLs run first, then slugs, then searches. maxItems is shared; missing or blocked titles return no rows.

## `category` (type: `string`):

Category for browsing and bare slugs: games, movies or tv, default games. Qualified slugs such as movie/parasite set their own type. Browsing runs only when URLs, slugs and search terms are empty.

## `platform` (type: `string`):

Games only (category 'games'): one platform id such as 'ps5', 'pc' or 'nintendo-switch'. Default 'all'. Ignored for movies and tv.

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

Browse only. Genre names as on Metacritic, e.g. \["Horror", "Comedy", "Action RPG"] (case-insensitive). Each genre runs one browse and results are merged without duplicates, sharing maxItems.

## `releaseYearFrom` (type: `integer`):

Browse only. Earliest release year, e.g. 2020. If only the end year is set, starts at 1900.

## `releaseYearTo` (type: `integer`):

Browse only. Latest release year, e.g. 2025. If only the start year is set, ends at the current year.

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

Browse order, best first: 'metascore' (critic score), 'userscore' or 'newest' (release date). Default 'metascore'. Browse only; ignored for search terms.

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

Maximum titles returned across all URLs, slugs, search terms and browse filters combined, 1-5000, default 50. Duplicates count once; the run stops once this many are saved. Use 10 for a quick sample.

## `includeDetails` (type: `boolean`):

true (default): adds detail data for listing/search results, including user counts, review splits and per-platform scores. false: listing data only, with detail-only fields null. Direct URLs and slugs always fetch title details.

## `proxyConfiguration` (type: `object`):

Optional Apify Proxy. Default is no proxy, which works for Metacritic. Enable it if requests start getting blocked (403/429).

## Actor input object example

```json
{
  "searchTerms": [],
  "searchType": "all",
  "slugs": [],
  "category": "games",
  "platform": "ps5",
  "sortBy": "metascore",
  "maxItems": 10,
  "includeDetails": true,
  "proxyConfiguration": {
    "useApifyProxy": false
  }
}
```

# Actor output Schema

## `results` (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 = {
    "searchTerms": [],
    "category": "games",
    "platform": "ps5",
    "sortBy": "metascore",
    "maxItems": 10,
    "includeDetails": true,
    "proxyConfiguration": {
        "useApifyProxy": false
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("axiomworks/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 = {
    "searchTerms": [],
    "category": "games",
    "platform": "ps5",
    "sortBy": "metascore",
    "maxItems": 10,
    "includeDetails": True,
    "proxyConfiguration": { "useApifyProxy": False },
}

# Run the Actor and wait for it to finish
run = client.actor("axiomworks/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 '{
  "searchTerms": [],
  "category": "games",
  "platform": "ps5",
  "sortBy": "metascore",
  "maxItems": 10,
  "includeDetails": true,
  "proxyConfiguration": {
    "useApifyProxy": false
  }
}' |
apify call axiomworks/metacritic-scores-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,axiomworks/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/Vt6AfpL7WHIZT4QL5/builds/4fStnDt3lPPlLlfL6/openapi.json
