# Korea Game Rating Lookup (GRAC) (`antonio_aleph/korea-game-rating`) Actor

Look up official South Korean game age ratings (GRAC / GCRB) as clean English JSON: rating, platform, genre, content descriptors, cancellations. Data refreshed daily from the GRAC Open API.

- **URL**: https://apify.com/antonio\_aleph/korea-game-rating.md
- **Developed by:** [Antonio Aleph](https://apify.com/antonio_aleph) (community)
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $3.00 / 1,000 rating records

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

**Korea Game Rating Lookup** gives you South Korea's official game age-rating records as **clean English JSON**. Search by game title, company, rating number or date and get the rating (ALL / 12+ / 15+ / 18+ / Refused / Revoked), platform, genre, content descriptors and cancellation status. The source data is published only in Korean by the Game Rating and Administration Committee (GRAC). This Actor translates it and keeps the original Korean next to every English value.

- 📋 **33,000+ rating decisions** from GRAC and the Game Content Rating Board (GCRB)
- 🔄 **Refreshed daily** from the official GRAC Open API
- 💸 **Pay only for records delivered**. No results, errors or invalid input cost nothing.
- 🤖 **Built for AI agents and automations**: flat, predictable JSON and one record per rating decision

> This is an **unofficial tool**. It is not affiliated with, endorsed by, or operated by GRAC, GCRB or any Korean government body.

### What can you use Korea Game Rating Lookup for?

- **Launching a game in Korea**: check how comparable titles were rated, which content descriptors triggered 15+ or 18+, and whether any were refused.
- **Localization and compliance teams**: confirm the Korean rating, rating number and rating body of a title before store submission or marketing.
- **Market research and investment analysis**: track rating volume by platform, genre or company over time, for example every console title rated in the last quarter.
- **Monitoring**: schedule a daily run filtered by company or date to catch new ratings, refusals and revocations.
- **AI agents**: answer "Is this game rated in Korea, and what rating did it get?" with one call.

### Sample output

Each rating decision is one record. English fields are always paired with the original Korean (`ko`) so nothing is lost in translation.

```json
{
  "ratingNumber": "GC-CC-NP-220401-011",
  "ratedDate": "2022-04-01",
  "titleKo": "Overwatch (오버워치)",
  "company": "주식회사 넥슨코리아",
  "ratingBody": "GCRB",
  "rating": { "code": "15+", "ko": "15세이용가" },
  "genre": { "en": "FPS/TPS", "ko": "FPS/TPS" },
  "platform": { "en": "PC/Online", "ko": "PC/온라인 게임" },
  "contentDescriptors": [{ "en": "Violence", "ko": "폭력성" }],
  "summaryKo": "기존 오버워치 세계관을 이어서 분쟁의 세계를 무대로 영웅들이 팀을 구성하여 전투하는 액션 슈팅 게임",
  "isCancelled": false,
  "cancelledDate": null,
  "source": "GRAC Open API (grac.or.kr)",
  "fetchedAt": "2026-09-27T08:01:17+00:00"
}
```

When a rating is later revoked, GRAC publishes a **second record** with the same rating number, the revocation date and `rating.code: "REVOKED"`. Both records are returned, so you see the full history:

```json
{
  "ratingNumber": "CC-NP-221124-001",
  "ratedDate": "2025-01-16",
  "titleKo": "AA 맞고(AA Matgo)",
  "rating": { "code": "REVOKED", "ko": "등급취소" },
  "isCancelled": true,
  "cancelledDate": "2025-01-16"
}
```

You can download results as JSON, CSV, Excel or HTML, or fetch them via the Apify API.

#### Output fields

| Field | Description |
|---|---|
| `ratingNumber` | Official rating number. `null` for refused ratings, which GRAC publishes without a number. |
| `ratedDate` | Date of the decision (rating, refusal or revocation), `YYYY-MM-DD` |
| `titleKo` | Title exactly as registered in Korea. Often Korean, sometimes English or both. |
| `company` | Applicant company (publisher or local distributor), as registered |
| `ratingBody` | `GRAC` (Game Rating and Administration Committee) or `GCRB` (Game Content Rating Board) |
| `rating.code` | `ALL`, `12+`, `15+`, `18+`, `REFUSED`, `REVOKED`, `REVOCATION_PENDING` |
| `genre`, `platform` | English label + Korean original. Platform is `PC/Online`, `Console`, `Mobile`, `Arcade`, or `Online` (legacy category). |
| `contentDescriptors` | Sexual Content, Violence, Fear/Horror, Inappropriate Language, Drugs, Crime, Gambling |
| `summaryKo` | Short Korean description of the game, when provided |
| `isCancelled`, `cancelledDate` | Whether and when the rating was cancelled |
| `source`, `fetchedAt` | Data source and the time of the daily sync that produced the record |

### How to search

All filters are optional and combined with AND. Results are sorted newest first.

| Input | Example | Notes |
|---|---|---|
| `gameTitle` | `"Overwatch"`, `"젤다의 전설"` | Partial match. Ignores case and spaces (`"엘든링"` finds `"엘든 링"`). Use the title as registered in Korea. Many titles include both Korean and English. |
| `company` | `"닌텐도"`, `"넥슨"` | Partial match on the applicant name, usually in Korean |
| `ratingNumber` | `"GC-CC-NP-220401-011"` | Exact match |
| `dateFrom`, `dateTo` | `"2026-01-01"` | Decision date range, inclusive |
| `maxResults` | `100` (default) | Maximum records returned. You are charged only for what is delivered. |
| `includeCancelled` | `true` (default) | Set to `false` to hide cancelled ratings |

Example input, every console and PC rating for a company in 2025:

```json
{
  "company": "닌텐도",
  "dateFrom": "2025-01-01",
  "dateTo": "2025-12-31",
  "maxResults": 500
}
```

**Tip:** if an English title returns nothing, try the Korean title or a distinctive part of it. Korean registrations often use the Korean title first.

### Pricing

This Actor uses **pay per event** pricing, with no platform usage fee on top:

| Event | Price | When |
|---|---|---|
| **Rating record** | **$0.003** per record | For each record delivered to your dataset |
| Lookup fee | $0.01 per run | Once per run, **only if at least one record was delivered** |

Examples:

- Check one game (3 records): 3 × $0.003 + $0.01 = **$0.019**
- Every rating from one company in a year (200 records): **$0.61**
- No matching records: **$0**

You are **not charged anything** when:

- the search returns no results,
- the input is invalid,
- the data source is temporarily unavailable.

Set a maximum cost per run in the run options and the Actor stops at that limit.

### Coverage: what is and isn't included

Please read this before relying on "no result" as an answer.

- ✅ **PC, console and arcade games** are well covered. This includes most major releases distributed in Korea by publishers or local distributors.
- ✅ **18+ (adults-only) mobile games** are included. These must be rated by GRAC directly.
- ⚠️ **Most other mobile games are NOT included.** Since 2017, app stores such as Google Play and ONE store act as **self-classification operators** and issue ratings through IARC. Those ratings are not published in GRAC's data. For example, Genshin Impact (mobile), Brawl Stars and Blue Archive have no GRAC record.
- ⚠️ Some PC and console titles may also be missing if they were rated through a self-classification operator.

**No result does not mean a game is unavailable or unrated in Korea.** When nothing matches, the run ends with a notice explaining this, and you are not charged.

### FAQ

**How fresh is the data?**
The full GRAC dataset is re-synced once a day. The `fetchedAt` field shows when each record was synced. If a daily sync fails, the previous day's data is kept.

**Why do I see two records for the same rating number?**
The first is the original rating. The second is a later revocation (`REVOKED`) with its own date. Set `includeCancelled: false` to hide cancelled ratings.

**Why are some fields `null`?**
Refused ratings (`REFUSED`) are published without a rating number, genre or platform. Summaries are optional in the source.

**Are the English labels official?**
No. Rating codes, genres, platforms and content descriptors are translated with a fixed mapping. The Korean original is always included next to them.

**Can AI agents use this Actor?**
Yes. It runs as a standard batch Actor with limited permissions, and output is predictable JSON. Agents can call it through the Apify API or Apify MCP server.

**Is this legal to use?**
The data is official public information. GRAC publishes it through its Open API, which is registered on Korea's Public Data Portal (data.go.kr) with no restriction on commercial use. The Actor collects no personal data beyond the applicant company names that GRAC itself publishes.

**Found a problem or need a custom dataset?**
Please open an issue in the **Issues** tab.

### Data source and attribution

- Source: **Game Rating and Administration Committee (게임물관리위원회, GRAC) Open API**, [grac.or.kr](https://www.grac.or.kr/), listed on the [Korea Public Data Portal](https://www.data.go.kr/data/15120667)
- Includes decisions by GRAC and the Game Content Rating Board (게임콘텐츠등급분류위원회, GCRB)
- This Actor is an independent, **unofficial** tool and is not affiliated with GRAC, GCRB or the Government of the Republic of Korea. Always check critical decisions against the official GRAC website.

# Actor input Schema

## `gameTitle` (type: `string`):

Part of the game title as registered in Korea, in Korean or English (e.g. "Overwatch", "젤다의 전설").

## `company` (type: `string`):

Part of the applicant (publisher/distributor) name, usually in Korean (e.g. "닌텐도", "넥슨").

## `ratingNumber` (type: `string`):

Exact GRAC/GCRB rating number (e.g. "GC-CC-NP-220401-010").

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

Only records with a rating/decision date on or after this day (YYYY-MM-DD).

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

Only records with a rating/decision date on or before this day (YYYY-MM-DD).

## `maxResults` (type: `integer`):

Maximum number of records to return (newest first). You are charged only for records delivered.

## `includeCancelled` (type: `boolean`):

Include records whose rating was later cancelled/revoked.

## Actor input object example

```json
{
  "gameTitle": "Overwatch",
  "maxResults": 100,
  "includeCancelled": true
}
```

# 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 = {
    "gameTitle": "Overwatch"
};

// Run the Actor and wait for it to finish
const run = await client.actor("antonio_aleph/korea-game-rating").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 = { "gameTitle": "Overwatch" }

# Run the Actor and wait for it to finish
run = client.actor("antonio_aleph/korea-game-rating").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 '{
  "gameTitle": "Overwatch"
}' |
apify call antonio_aleph/korea-game-rating --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,antonio_aleph/korea-game-rating"
        }
    }
}
```

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/oMeJCzxWWfnxxb4zZ/builds/ZxcfTJ79k07GE75Gf/openapi.json
