# Japanese Pokemon Card Sold Comps — Japan TCG Sold Prices (`jpmarketdata/japan-tcg-sold-comps`) Actor

What did this card actually sell for in Japan? Sold comps from Yahoo! Auctions and Mercari, resolved to set code + collector number + rarity, with raw and PSA/BGS graded medians kept apart — they differ 1.6x to 5x. Coverage always published. From $0.02 — no subscription. 日本の落札実売を1コールで。

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

## Pricing

from $20.00 / 1,000 card sold comps

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/platform/actors/running/actors-in-store#pay-per-event

## What's an Apify Actor?

Actors are web data automations that power AI and operations. They run on the Apify platform to scrape websites, process data, connect APIs, and automate workflows.
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.
Actors are written with capital "A".

## 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.
The best way to integrate Actors is as follows.

- **AI agents and MCP clients** — the [Apify MCP server](https://docs.apify.com/integrations/mcp.md) at `https://mcp.apify.com` (remote, streamable HTTP, OAuth on first use).
- **Agentic workflows and local Actor development** — [Agent Skills](https://apify.com/.well-known/agent-skills/index.json) with the [Apify CLI](https://docs.apify.com/cli/docs.md): `npm install -g apify-cli`, then `apify login`.
- **JavaScript/TypeScript projects** — the official [JS/TS client](https://docs.apify.com/api/client/js/docs.md): `npm install apify-client`.
- **Python projects** — the official [Python client](https://docs.apify.com/api/client/python/docs.md): `pip install apify-client`.
- **Any other language** — the [REST API](https://docs.apify.com/api/v2.md).

For usage examples, see the [API](#api) section below.

For more details, see Apify documentation as [Markdown index](https://docs.apify.com/llms.txt) and [Markdown full-text](https://docs.apify.com/llms-full.txt).

# README

## Japanese Pokemon Card Sold Comps — Japan TCG Sold Prices

**What did this card actually sell for in Japan?** Not what a shop is asking —
what buyers paid.

One call returns the **realized Japanese sale prices** for a card, pulled from
Yahoo! Auctions and Mercari, **resolved down to individual cards** (set code +
collector number + rarity), and split into **raw** and **PSA/BGS graded**
copies — because the same card sells for **1.6× to 5× more slabbed**, and a
third of Japanese listings are slabbed.

`pokemontcg.io` gives TCGplayer and Cardmarket prices away for free, so Western
prices are not a gap. **Japanese realized prices are.** Nothing public joins a
free-text Japanese marketplace title to a typed card identity — that join is
this Actor.

### What you get

| | |
|---|---|
| **`cards[]`** | One entry per identified card: `setCode`, `cardNumber`, `rarity`, `name`, and **separate raw and graded** sold statistics (min / p25 / median / p75 / max / average, each with its own `n`) |
| **`gradedPremium`** | `graded median ÷ raw median` per card, with both sample sizes. Measured range on real data: **×1.6 to ×5.03** |
| **`shopAsk`** | What a Japanese retailer (Yuyu-tei 遊々亭) asks for the same card **today**, and the gap to the realized median — **only when the row is in stock** (see below) |
| **`keywordBand`** | The price band of the whole search term, raw vs graded, over *every* comparable listing — the denominator |
| **`coverage`** | `matchedCount` / `unmatchedCount` / `coverageRate`, overall **and per marketplace** |
| **`sources`** | Per-source availability, hit count, sample size and source URL |

USD conversion included. No login, no API key, nothing stored between runs.

### Three bases, tagged on every single statistic

Every block in the output states all three. Ignoring them is how a price
product becomes a lie:

| Tag | Values | Why it matters |
|---|---|---|
| `priceBasis` | `sold` / `asking` | Yahoo! and Mercari are realized sales; the shop catalog is an asking price |
| `gradingBasis` | `raw` / `graded` | **Never pooled.** `sv10 114/098` measured raw ¥2,999 vs graded ¥15,100 = **×5.03**. 32–49 % of listings are graded, so one blended median describes no card that exists |
| `identityBasis` | `card` / `keyword` | A keyword band for `リザードン` spans forty different cards. It is a useful denominator, never a card price |

**Out-of-stock shop prices are shown but never differenced.** An out-of-stock
提示価格 keeps its last value and drifts far above the market — `xy08bs 062/059`
asked **¥178,000 against a ¥17,750 sold median (×10.03)**. Publishing that gap
would invent an arbitrage that does not exist, so `shopAsk.usable` goes false
and no difference is computed. (In the live run below, three cards hit this —
including one asking ¥128,000 with no stock.)

### Coverage is published, not hidden

Marketplace titles are free text, so **not every listing can be resolved to a
card**. Measured over 360 real listings:

| | Resolved to exactly one card |
|---|---|
| Yahoo! Auctions | **80.4 %** of comparable listings |
| Mercari | **48.9 %** (shorter titles, usually no collector number) |
| Combined | **62.6 %** of comparable listings — 55.3 % of all listings |

Identification precision, hand-audited: **99.0 %**.

Unresolved listings are **not discarded** — they fall back to `keywordBand`
with their own `n`, and `coverage.coverageRate` always tells you how much of
the sample made it. The only listings dropped from every statistic are **lots**
(`まとめ` / `オリパ` / `N枚` / …) and non-Japanese printings, counted as
`excludedListings`: a 30-card lot at ¥30,000 is not a comp for one card.

### Pricing — from $0.02 per call, no subscription

| Event | Price | When |
|---|---|---|
| `card-analyzed` | **$0.02** | Once per card name analyzed |
| `listing-scraped` | **$0.002** | Only if you enable **Include individual listings** |

A default run (one card name) costs **$0.02** and takes about 5 seconds.
**A card name that returns no realized sale price is never charged.**

Apify's **$5/month free credit covers ~250 default runs**. No subscription, no
minimum.

### Input

| Field | Example | Notes |
|---|---|---|
| `cardNames` | `["リザードン"]` | Japanese. **Search broadly** — see below. Max 10 per run, $0.02 each |
| `game` | `"poc"` | `poc` Pokemon (measured default) / `ygo` / `opc` / `dm` / `ws` / `ua` / `vg` / `digi` / `bs` / `gcg` |
| `maxSoldPerSource` | `100` | Sold listings sampled per marketplace (30–300) |
| `minSoldPerCard` | `1` | Hide thin cards from `cards[]`. Never changes a denominator — `coverage` and `keywordBand` are unfiltered |
| `includeIndividualListings` | `false` | Every listing with the card it resolved to **and why** (+$0.002 each) |
| `convertToUsd` | `true` | Adds USD next to JPY |

**Search broadly, not narrowly.** Use `リザードン`, not `リザードンex`. The shop
catalog is fetched with the same word, and a narrow word leaves prints like
`メガリザードンXex` out of it — 11 sales were lost that way when measured.
Individual cards are separated afterwards, locally, at **no extra request cost**.

### Output example

Measured live on 2026-08-07 — `cardNames: ["リザードン"]`, `maxSoldPerSource: 100`,
`minSoldPerCard: 2`. 200 sold listings sampled, 38 lots excluded, 162
comparable, 80 resolved to 26 distinct cards.

```json
{
  "type": "card_sold_comps",
  "query": "リザードン",
  "game": "poc",
  "coverage": {
    "soldListings": 200,
    "excludedListings": 38,
    "comparableListings": 162,
    "matchedCount": 80,
    "unmatchedCount": 82,
    "coverageRate": 0.4938,
    "identifiedCards": 26,
    "byVerdict": {"NO_HANDLE": 66, "MATCH_NUM": 49, "REJECT_LOT": 38,
                  "MATCH_NAME": 31, "AMBIGUOUS_NAME": 10, "NO_MATCH": 5,
                  "AMBIGUOUS_NUM": 1},
    "bySource": {
      "yahoo_auction": {"soldListings": 100, "comparableListings": 79,
                        "matchedCount": 49, "coverageRate": 0.6203},
      "mercari":       {"soldListings": 100, "comparableListings": 83,
                        "matchedCount": 31, "coverageRate": 0.3735}
    }
  },
  "keywordBand": {
    "identityBasis": "keyword",
    "raw":    {"gradingBasis": "raw", "priceBasis": "sold", "n": 108,
               "soldJpy": {"min": 420, "p25": 2075, "median": 4800,
                           "p75": 14500, "max": 320000, "average": 23260}},
    "graded": {"gradingBasis": "graded", "priceBasis": "sold", "n": 54,
               "soldJpy": {"min": 5780, "p25": 15050, "median": 27800,
                           "p75": 84150, "max": 900000, "average": 78529},
               "grades": {"PSA10": 49, "PSA9": 3, "ARS10": 1, "ARS9": 1}},
    "gradedShare": 0.3333
  },
  "cardsReported": 18,
  "cards": [
    {
      "cardKey": "m02a|223/193|MA",
      "setCode": "m02a", "cardNumber": "223/193", "rarity": "MA",
      "name": "メガリザードンXex",
      "soldListings": 10,
      "raw":    {"identityBasis": "card", "gradingBasis": "raw",
                 "priceBasis": "sold", "n": 4,
                 "soldJpy": {"min": 4350, "p25": 4688, "median": 4800,
                             "p75": 4825, "max": 4900, "average": 4712},
                 "bySource": {"yahoo_auction": 4, "mercari": 0}},
      "graded": {"identityBasis": "card", "gradingBasis": "graded",
                 "priceBasis": "sold", "n": 6,
                 "soldJpy": {"min": 6600, "p25": 15275, "median": 15800,
                             "p75": 15950, "max": 16200, "average": 14250},
                 "grades": {"PSA10": 5, "PSA9": 1},
                 "bySource": {"yahoo_auction": 5, "mercari": 1}},
      "gradedShare": 0.6,
      "gradedPremium": {"multiple": 3.29, "rawMedianJpy": 4800, "rawN": 4,
                        "gradedMedianJpy": 15800, "gradedN": 6,
                        "basis": "graded_sold_median / raw_sold_median"},
      "shopAsk": {"priceJpy": 7980, "stockStatus": "in_stock",
                  "priceBasis": "asking", "usable": true,
                  "detailUrl": "https://yuyu-tei.jp/sell/poc/card/m02a/10459",
                  "vsRawSoldMedian": {"basis": "asking_vs_sold",
                                      "diffJpy": 3180, "diffPct": 66.2}}
    }
  ]
}
```

`メガリザードンXex` is exactly the card a narrow catalog query would have missed.

### Who this is for

- **Resellers and arbitrage** — the Japanese realized price is the number that
  decides whether an import is worth it, and `gradedPremium` tells you whether
  the margin is in the card or in the slab
- **Graders** — is submitting this card worth the fee? `gradedPremium` with both
  `n` values answers it per card, not per set
- **Collectors** — what a card really goes for in its home market, not the
  asking price of the one listing you found
- **Card shops and marketplaces** — pricing against realized Japanese comps

### How it works

Three sources, three separate infrastructures, fetched in parallel; paging
inside each stays sequential and throttled to one request per 1.5 s. **No
browser, no login.**

1. **Yuyu-tei (遊々亭)** — one request returns the whole catalog for the search
   word (no paging), giving `setCode` / `cardNumber` / `rarity` as typed fields
2. **Yahoo! Auctions** — closed auctions; an auction counts as **sold** only
   with `bidCount >= 1`, so ended-unsold buy-it-nows never reach a median
3. **Mercari** — sold-out listings only

Then the join runs locally: collector number first (`114/098`, `001/SV-P`
promo numbers canonicalized), then card name **plus an explicit rarity**. A
title with neither is left unresolved rather than guessed. `EX` (2012) and `ex`
(2023) are treated as different cards — case is the only thing separating
`ミュウツーEX` from `ミュウツーex`, and conflating them put eleven ¥30,000 sales
onto a ¥500 card.

### Limits

- **Japanese-language catalog.** Card names must be in Japanese
- **Coverage is 37–80 % per source** and varies with how specific the listings
  are. It is always reported; it is never silently assumed to be 100 %
- **Pokemon is the measured default.** The collector-number match works for any
  game, but the Japanese set-name and series tables are Pokemon-tuned, so other
  games resolve fewer listings — visible in `coverage.coverageRate`
- Sampled statistics, not a full census: `sources[].totalListingsFound` is what
  the marketplace reports, `sampledListings` is what was actually read
- No image URLs and no description text are collected from the shop catalog
  (its terms of service forbid reuse of images and copy)

***

**日本語**: ポケモンカードが日本で実際にいくらで落札されたか(出品価格ではなく成約価格)を、ヤフオク・メルカリから型番(セット/カード番号/レアリティ)単位で集計し、PSA/BGS鑑定品と生カードを分けて返します。遊々亭の在庫あり提示価格との差も付きます。1コール $0.02、サブスクなし。

**中文**: 一次调用即可获得宝可梦卡牌在日本的**实际成交价**(而非挂牌价),按卡编号/稀有度归集,并将 PSA/BGS 鉴定卡与裸卡分开统计。$0.02 起,无订阅。

# Actor input Schema

## `cardNames` (type: `array`):

One or more card names, in Japanese. Search BROADLY — 'リザードン' rather than 'リザードンex': the shop catalog is fetched with the same word, and a narrow word leaves prints like 'メガリザードンXex' out of it (11 sales lost when measured). Individual cards are separated afterwards, locally, at no extra cost. Each name costs $0.02.

## `game` (type: `string`):

Which Yuyu-tei catalog section supplies the card identities. Pokemon (poc) is the measured default: the collector-number match works for any game, but the Japanese set-name and series tables are Pokemon-tuned, so other games resolve fewer listings. Whatever happens, the achieved rate is reported as coverage.coverageRate.

## `maxSoldPerSource` (type: `integer`):

How many listings to sample from Yahoo! Auctions and from Mercari before computing the statistics. Larger samples give more cards a usable n, but cost time: Yahoo returns 50 per request, Mercari 120, and requests are throttled to one per 1.5 s.

## `minSoldPerCard` (type: `integer`):

Drop identified cards backed by fewer than this many sold listings from the `cards` array. They are still counted in `coverage` and in the keyword band, so raising this never changes a denominator — it only hides thin cards. Every card keeps its own `n` either way.

## `includeIndividualListings` (type: `boolean`):

Off by default: a run costs a flat $0.02 per card name. Enable to also get every sampled sold listing with the card it was resolved to and WHY (match verdict and reason), so you can audit which listings produced each median. +$0.002 per listing.

## `convertToUsd` (type: `boolean`):

Adds USD statistics next to JPY using the current exchange rate (open.er-api.com, looked up once per run).

## Actor input object example

```json
{
  "cardNames": [
    "リザードン"
  ],
  "game": "poc",
  "maxSoldPerSource": 100,
  "minSoldPerCard": 1,
  "includeIndividualListings": false,
  "convertToUsd": true
}
```

# 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 = {
    "cardNames": [
        "リザードン"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("jpmarketdata/japan-tcg-sold-comps").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 = { "cardNames": ["リザードン"] }

# Run the Actor and wait for it to finish
run = client.actor("jpmarketdata/japan-tcg-sold-comps").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 '{
  "cardNames": [
    "リザードン"
  ]
}' |
apify call jpmarketdata/japan-tcg-sold-comps --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,jpmarketdata/japan-tcg-sold-comps"
        }
    }
}

```

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/s9TMPPGKdyznfaM0C/builds/ltjb7v1sXp3r4OIIm/openapi.json
