# Japan Resale Price Comps (Yahoo Auctions, Flea Market, BOOKOFF) (`jpopendata/japan-resale-price-comps`) Actor

Price comps for Japan resale: keywords in, Yahoo Auctions sold prices plus Yahoo Flea Market, BOOKOFF and Hareruya listings out, with min/median/max stats per keyword. A Mercari-free comps tool. Item facts only, no seller data. Unofficial; not affiliated with any site.

- **URL**: https://apify.com/jpopendata/japan-resale-price-comps.md
- **Developed by:** [JP Open Data](https://apify.com/jpopendata) (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 per results

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

## Japan Resale Price Comps (Yahoo Auctions sold, Flea Market, BOOKOFF, Hareruya)

**Type in product keywords and get two things back: what the items actually sold for in Japan, and what they are listed for right now. Each keyword also gets a price summary with count, min, quartiles, median, max and mean, kept separate for sold and listed prices.**

This Actor is a price comps tool for Japanese second-hand markets. You do not need Mercari data. One run queries:

| Source | What you get | Status |
|---|---|---|
| **Yahoo! Auctions** (ヤフオク! closed search) | Final sold prices with sale time, bids, condition and category | `sold` |
| **Yahoo! Flea Market** (Yahoo!フリマ, ex-PayPay Flea Market) | Current asking prices from individual sellers | `listed` (rarely `sold`) |
| **BOOKOFF online store** | Shop prices for used and new games, comics, books, CDs and DVDs | `listed` |
| **Hareruya** (晴れる屋) | Shop prices for Magic: The Gathering singles, with card grade | `listed` |
| **Suruga-ya** (駿河屋), opt-in | Shop prices for figures, games and hobby goods | `listed` |

Resellers, importers, appraisers and pricing teams usually check these sites one by one. This Actor does it in a single run and returns one English-schema dataset.

> **Unofficial tool. Not affiliated with LY Corporation, BOOKOFF, Hareruya or Suruga-ya.** It collects only publicly available listing pages. It requests only URLs that each site's robots.txt allows. Requests to each site are made one at a time and spaced 1.2 to 30 seconds apart, under a hard request budget. It does not try to get around blocks. It extracts **item facts only**: no seller IDs, names, ratings or locations, no reviews and no personal data. You are responsible for making sure your own use of the data complies with each site's terms and the law.

***

### Quick start: verified input

The input below was run successfully on 2026-10-04. It needed about 10 requests and took about 7 seconds without a proxy.

```json
{
  "keywords": ["Nintendo Switch", "ポケモンカード"],
  "maxItemsPerSource": 20
}
```

You get up to 20 items per keyword from each source plus one summary record per keyword. The same summaries are saved to the key-value store record `OUTPUT`.

#### Common input mistakes

| Wrong | Right | Why |
|---|---|---|
| `"keywords": ["pokemon cards"]` | `["ポケモンカード"]` | These are Japanese sites. English works for brand and model names (`Nintendo Switch`, `Nikon F3`). For anything else, use Japanese. |
| `"keywords": ["Switch"]` | `["Switch 有機EL 本体"]`, plus `"excludeWords": ["ジャンク", "ケース"]` | Broad keywords mix consoles, games and accessories, so the median means nothing. Be specific, and use `priceMin` / `excludeWords`. |
| `"sources": ["mercari"]` | `["yahoo-auctions-sold", "yahoo-flea-market"]` | Mercari is not supported. The run stops right away and lists the valid sources. |
| `"bookoffCategory": "toys"` | `"game"`, `"comic"`, `"book"`, `"magazine"`, `"cd"`, `"dvd"` or a numeric genre id | BOOKOFF is browsed by category (see the FAQ). |

#### Empty results?

- **Hareruya returns 0** for anything that is not a Magic: The Gathering card. That is expected.
- **BOOKOFF returns 0** when no title in the chosen category contains every word of your keyword. Change `bookoffCategory` or shorten the keyword.
- If every source returns 0, the run still succeeds with `complete: true` and empty summaries. Try a Japanese keyword.

### Output

**Item record** (`recordType: "item"`):

```json
{
  "recordType": "item",
  "keyword": "Nintendo Switch",
  "sourceId": "yahoo-auctions-sold",
  "title": "Nintendo Switch2 ドンキーコングバナンザ　2本セット",
  "priceJpy": 10750,
  "status": "sold",
  "soldAt": "2026-10-04T12:48:50+09:00",
  "listedAt": null,
  "condition": "used",
  "conditionDetail": "USED20",
  "inStock": null,
  "categoryPath": ["おもちゃ、ゲーム", "ゲーム", "テレビゲーム", "ニンテンドースイッチ", "ニンテンドースイッチソフト"],
  "url": "https://page.auctions.yahoo.co.jp/jp/auction/z697899140",
  "details": { "bidCount": 1, "buyNowPriceJpy": 10750, "isFleaMarket": true, "watchCount": 0 },
  "source": "ヤフオク! 落札相場 (auctions.yahoo.co.jp closed search)",
  "sourceUrl": "https://auctions.yahoo.co.jp/",
  "license": "Publicly available data — unofficial tool; users are responsible for compliance with the source site's terms",
  "retrievedAt": "2026-10-04T03:54:54.836Z"
}
```

**Summary record** (`recordType: "summary"`, one per keyword, pushed after all items):

```json
{
  "recordType": "summary",
  "keyword": "Nintendo Switch",
  "soldCount": 20, "soldMedianJpy": 4340,
  "listedCount": 40, "listedMedianJpy": 5605,
  "soldWindowFrom": "2026-10-04T12:31:25+09:00", "soldWindowTo": "2026-10-04T12:54:47+09:00",
  "overall": {
    "sold":   { "count": 20, "min": 40,  "p25": 2093, "median": 4340, "p75": 8838,  "max": 43900, "mean": 6894 },
    "listed": { "count": 40, "min": 600, "p25": 3740, "median": 5605, "p75": 15125, "max": 54000, "mean": 12038 }
  },
  "bySource": { "yahoo-auctions-sold": { "itemCount": 20, "sold": { "count": 20, "median": 4340 }, "requests": 1, "complete": true, "stopReason": null } },
  "complete": true
}
```

Quartiles use linear interpolation (the same method as Excel PERCENTILE.INC) and are rounded to whole yen. The sold window shows how recent the sold items are. Yahoo lists the latest sales first, so for a popular keyword 20 sold items may cover only the last half hour. Raise `maxItemsPerSource` and `maxPagesPerSource` to cover a longer period. The example above uses a deliberately broad keyword, which is why games and consoles are mixed together.

### Input

Every field is optional, and `{}` runs the Quick start. Main fields: `keywords` (up to 200), `sources`, `maxItemsPerSource` (20), `maxPagesPerSource` (2, one page is one request), `soldWithinDays` (0 = no cutoff), `condition`, `priceMin` / `priceMax`, `excludeWords`, `bookoffCategory` (`game`). The four default sources need no proxy. Suruga-ya uses its own `surugayaProxyConfiguration` (RESIDENTIAL, JP).

### Pricing

Pay per event: a small run start fee, a fee per result written to the dataset (item and summary records alike), and a fee per keyword summary. A keyword is billed only when at least one priced item backs its summary. See the Pricing tab for current prices.

### FAQ

**Does it include Mercari?** No. This Actor uses only sources whose robots.txt and terms the developer has reviewed. On these sites, Yahoo! Auctions sold prices are the main reference for real transaction prices in Japan.

**Why is BOOKOFF limited?** BOOKOFF's store has no server-side keyword search. The keyword only re-orders a category. The Actor browses the category you choose and keeps an item only if every word of your keyword appears in its title, author or genre label. Results are relevant, but you will not get every match.

**Are Yahoo Flea Market prices sale prices?** Mostly not. The publicly allowed search lists items that are on sale, so they are `listed` prices. For sold prices, use Yahoo! Auctions. Its closed search also includes items sold on the flea market (`details.isFleaMarket`).

**Why is Suruga-ya opt-in?** suruga-ya.jp blocks datacenter IPs, and its robots.txt asks for 30 seconds between requests. It needs a Japanese RESIDENTIAL proxy, which is billed by Apify as platform usage. Even then, some proxy exits are refused. If the first request is refused, the Actor retries once on a different exit. If that also fails, it skips Suruga-ya while the other sources continue.

**What if one site blocks the run?** That source is marked with a `stopReason`, and the run still succeeds with `complete: false` as long as other sources returned items. It fails only when nothing at all was collected and a source errored.

**Are duplicates removed across sources?** Within a source, yes. Across sources, no. A flea-market item that also appears in Yahoo Auctions results can be counted once in each source.

### Related Actors by the same developer

Single-source versions with more filters: Yahoo Auctions Japan Sold Prices, Yahoo Flea Market Japan, BOOKOFF Used Media Prices, Hareruya MTG Card Prices, Suruga-ya Hobby Prices.

# Actor input Schema

## `keywords` (type: `array`):

Products to price, one per line, e.g. "ポケモンカード 151", "PS5 本体", "Nikon F3". Japanese titles match best (the sources are Japanese marketplaces). Each keyword gets its own price summary record. Up to 200 keywords per run. If empty, the Quick start keywords are used.

## `sources` (type: `array`):

Which marketplaces to query. Valid values: yahoo-auctions-sold (Yahoo! Auctions SOLD prices / ヤフオク落札相場), yahoo-flea-market (Yahoo! Flea Market / ex-PayPay Flea Market current listings), bookoff (BOOKOFF online store: books, comics, CDs, DVDs, games), hareruya (Hareruya: Magic: The Gathering singles), surugaya (Suruga-ya hobby shop — OPT-IN: needs a Japanese RESIDENTIAL proxy, waits 30 s between requests and fails on some proxy exits). Case and spelling are forgiving (e.g. "yahoo", "paypay", "ヤフオク"). Empty = the four default sources.

## `maxItemsPerSource` (type: `integer`):

Item records kept per keyword per source (1..500; values outside are clamped). 20 gives a usable median; raise it for tighter statistics. Each item record is one billable `record` event.

## `maxPagesPerSource` (type: `integer`):

Upper bound on result pages requested per keyword per source (1..10; clamped). One page = one polite request (Yahoo Auctions 50 items, Yahoo Flea Market ~100, BOOKOFF 30, Suruga-ya 24; Hareruya always uses one request). Requests are serial per site and spaced like the original single-source actors.

## `soldWithinDays` (type: `integer`):

Keep only sales that completed within the last N days (0 = no cutoff). Applies to sold items with a known sale time (Yahoo Auctions). Listing prices are never filtered by this.

## `condition` (type: `string`):

any (default), new or used — Japanese labels (新品, 未使用, 中古) work too. Applied after fetching. Hareruya card grades (NM/EX/...) have no new/used meaning, so a new/used filter excludes Hareruya.

## `priceMin` (type: `integer`):

Optional. Drop items cheaper than this (e.g. 3000 to drop accessories and parts). Applied after fetching.

## `priceMax` (type: `integer`):

Optional. Drop items more expensive than this. Applied after fetching.

## `excludeWords` (type: `array`):

Optional. Items whose title contains any of these words are dropped before statistics, e.g. "ジャンク" (junk), "ケース" (case), "箱のみ" (box only). Case- and width-insensitive.

## `bookoffCategory` (type: `string`):

BOOKOFF has no free-text search, so it is browsed by category and only items whose title/author/genre contain every keyword word are kept. One of: game (default), comic, book, magazine, cd, dvd — or a numeric BOOKOFF genre id (the /search/genre/<id> URL also works).

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

Optional. These four sources answer Apify datacenter IPs directly, so no proxy is used by default. If you set one, each source keeps a single sticky session for the whole run.

## `surugayaProxyConfiguration` (type: `object`):

suruga-ya.jp blocks datacenter IPs, so Suruga-ya needs Apify RESIDENTIAL proxies in Japan (billed as Apify platform usage). One sticky session per run; if the first request is refused, the actor retries once on a different exit and then gives up on Suruga-ya while the other sources continue.

## Actor input object example

```json
{
  "keywords": [
    "Nintendo Switch",
    "ポケモンカード"
  ],
  "sources": [
    "yahoo-auctions-sold",
    "yahoo-flea-market",
    "bookoff",
    "hareruya"
  ],
  "maxItemsPerSource": 20,
  "maxPagesPerSource": 2,
  "soldWithinDays": 0,
  "condition": "any",
  "priceMin": 3000,
  "priceMax": 100000,
  "excludeWords": [],
  "bookoffCategory": "game",
  "proxyConfiguration": {
    "useApifyProxy": false
  },
  "surugayaProxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ],
    "apifyProxyCountry": "JP"
  }
}
```

# Actor output Schema

## `records` (type: `string`):

One record per item (recordType item: source, keyword, title, priceJpy, sold/listed, soldAt, condition, url) and one per keyword (recordType summary: count/min/p25/median/p75/max/mean, sold vs listed, per source and overall).

## `summary` (type: `string`):

All keyword summaries plus per-source request counts and stop reasons.

# 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 = {
    "keywords": [
        "Nintendo Switch",
        "ポケモンカード"
    ],
    "sources": [
        "yahoo-auctions-sold",
        "yahoo-flea-market",
        "bookoff",
        "hareruya"
    ],
    "maxItemsPerSource": 20,
    "maxPagesPerSource": 2,
    "soldWithinDays": 0,
    "condition": "any",
    "excludeWords": [],
    "bookoffCategory": "game",
    "proxyConfiguration": {
        "useApifyProxy": false
    },
    "surugayaProxyConfiguration": {
        "useApifyProxy": true,
        "apifyProxyGroups": [
            "RESIDENTIAL"
        ],
        "apifyProxyCountry": "JP"
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("jpopendata/japan-resale-price-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 = {
    "keywords": [
        "Nintendo Switch",
        "ポケモンカード",
    ],
    "sources": [
        "yahoo-auctions-sold",
        "yahoo-flea-market",
        "bookoff",
        "hareruya",
    ],
    "maxItemsPerSource": 20,
    "maxPagesPerSource": 2,
    "soldWithinDays": 0,
    "condition": "any",
    "excludeWords": [],
    "bookoffCategory": "game",
    "proxyConfiguration": { "useApifyProxy": False },
    "surugayaProxyConfiguration": {
        "useApifyProxy": True,
        "apifyProxyGroups": ["RESIDENTIAL"],
        "apifyProxyCountry": "JP",
    },
}

# Run the Actor and wait for it to finish
run = client.actor("jpopendata/japan-resale-price-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 '{
  "keywords": [
    "Nintendo Switch",
    "ポケモンカード"
  ],
  "sources": [
    "yahoo-auctions-sold",
    "yahoo-flea-market",
    "bookoff",
    "hareruya"
  ],
  "maxItemsPerSource": 20,
  "maxPagesPerSource": 2,
  "soldWithinDays": 0,
  "condition": "any",
  "excludeWords": [],
  "bookoffCategory": "game",
  "proxyConfiguration": {
    "useApifyProxy": false
  },
  "surugayaProxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ],
    "apifyProxyCountry": "JP"
  }
}' |
apify call jpopendata/japan-resale-price-comps --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,jpopendata/japan-resale-price-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/VcaVldiFSGYm7SHIb/builds/xEc2NgHqVXUDQZEly/openapi.json
