# BookOff 日本二手书店 Used Book & Manga Price & Stock Stats (`jpmarketdata/bookoff-market-cn`) Actor

日本二手书、二手漫画的行情一次调用即得：BookOff（ブックオフ）官方网店的二手价格分位点（最低/Q1/中位数/Q3/最高）取自整个搜索结果的母体，而不是首页样本，另附在售/售罄件数构成、售罄比例与相对定价的折扣率。适合日本旧书与漫画代购、CD/DVD/游戏选品与跨境转卖定价。Population-level used-price quantiles per keyword, from $0.02, no subscription.

- **URL**: https://apify.com/jpmarketdata/bookoff-market-cn.md
- **Developed by:** [h ichi](https://apify.com/jpmarketdata) (community)
- **Categories:** E-commerce, Lead generation
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $20.00 / 1,000 keyword market analyzeds

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

## Japan Used Book & Manga Price Stats — for Chinese-Speaking Buyers

**中文 · English · 日本語** —— 输入一个关键词，一次调用拿到 BookOff（ブックオフ）官方网店的二手行情：**整个搜索结果母体的价格分位点**、库存构成、售罄比例与相对定价的折扣率。

***

### 中文说明

#### 这是给谁用的（Who this is for）

**日本二手书、二手漫画的采买是一门成熟的中文生意**——旧书商、漫画全套代购、CD/DVD/游戏选品、动漫周边转卖，全都要先回答同一个问题：这本书在日本的二手价到底是多少。而 **BookOff（ブックオフ）自己就开着中文版的门店与页面**，中文买家对这个招牌并不陌生：它是日本最大的二手连锁（800 多家实体店共用一个官方网店目录），涵盖书籍、漫画、杂志、CD、DVD 与游戏。

这个 Actor 与市面上的 BookOff 抓取器不同的地方在于：它们返回**原始商品清单**，你按条付费然后自己去算统计；这个 Actor 直接返回**统计本身**，按关键词计价，约 8 秒完成——而且价格分位点取自**整个结果集的母体**，不是首页的样本。

- **`usedPriceJpy` —— 全母体的最低 / Q1 / 中位数 / Q3 / 最高。** 一个命中 4,893 件的关键词，给出的就是这 4,893 件真实的 25/50/75 分位，只用 5 次请求，而不是从 120 件样本里估出来的。
- **`outOfStockRatioSampled`** —— BookOff 会把售罄商品**带着最后的价格**继续挂着，所以售罄占比是动销信号，售罄价是日本二手媒体里最接近公开「成交价」的东西。
- **`stockBreakdown`** —— 有货 / 库存紧张 / 仅剩 1 件 / 无货。
- **`discountVsListPricePct`** —— 二手价相对日本定价（定価）便宜多少。
- **`newPriceJpy`**、**`genreTop`**，以及按当前汇率的美元换算。
- 可选：每一件取样商品（标题、价格、成色、库存、定价、折扣、发售日、可店取标记、链接）。

无需登录、无需 API Key，运行之间不存储任何数据。

本 Actor 是英文版 [BookOff Japan Used Media](https://apify.com/jpmarketdata/bookoff-market-checker) 的**中文语言包**：抓取逻辑与统计口径完全相同，只有标题、商店说明、文档和输入项标签改写成中文。

#### 概览 Overview

每个关键词返回一条 `market_summary` 汇总记录，核心是**带口径标注的价格分位点**（见下方「精确 / 母体分位 / 样本」一节），并附库存构成、售罄比例、折扣率、新品价格与品类构成。

#### 输入 Input

| 字段 | 示例 | 说明 |
|---|---|---|
| `keywords` | `["ガンダム"]` | 日文命中率最高——目录只有日文。每个关键词 $0.02 |
| `genreCode` | `"11"` | 可选：`12` 书籍 / `11` 漫画 / `13` 杂志 / `31` CD / `71` DVD 与蓝光 / `51` 游戏。留空 = 全部 |
| `maxItemsPerKeyword` | `120` | 用于计算库存/折扣/品类构成的检视件数（30–360，每页 120）。**不影响分位点**；低于 120 时只限制返回的单件商品数 |
| `includeIndividualItems` | `false` | 开启后每一件取样商品输出一条记录（+$0.002/件） |
| `convertToUsd` | `true` | 按当前汇率附上美元统计 |

```json
{
    "keywords": ["ガンダム", "鬼滅の刃"],
    "genreCode": null,
    "maxItemsPerKeyword": 120,
    "includeIndividualItems": false,
    "convertToUsd": true
}
```

常用日文关键词对照：高达 = `ガンダム` / 鬼灭之刃 = `鬼滅の刃` / 海贼王 = `ワンピース` / 勇者斗恶龙 = `ドラゴンクエスト` / 米津玄师 = `米津玄師` / 画集 = `画集`。

#### 输出 Output

字段名保持英文，这是 API 接口（数值取自 ガンダム 的实测）：

```json
{
  "type": "market_summary",
  "keyword": "ガンダム",
  "genre": null,
  "genreName": null,
  "totalListingsFound": 4893,
  "sampledListings": 120,
  "usedPriceJpy": {"min": 99, "q1": 330, "median": 550, "q3": 1375, "max": 77000, "count": 4893},
  "usedPriceJpyBasis": "population_quantiles",
  "newPriceJpy": {"min": 528, "q1": 660, "median": 990, "q3": 1650, "max": 6600, "count": 14},
  "stockBreakdown": {"inStock": 12, "lowStock": 6, "lastOne": 4, "outOfStock": 98},
  "outOfStockRatioSampled": 0.8167,
  "discountVsListPricePct": {"median": 78},
  "genreTop": [["コミック", 61], ["書籍", 34], ["DVD・ブルーレイ", 12]],
  "usedPriceUsd": {"min": 0.63, "q1": 2.11, "median": 3.52, "q3": 8.8, "max": 492.8},
  "exchangeRateJpyUsd": 0.0064,
  "checkedAt": "2026-07-25T09:00:00+00:00",
  "sourceUrl": "https://shopping.bookoff.co.jp/search/keyword/%E3%82%AC%E3%83%B3%E3%83%80%E3%83%A0?per-page=120&sort=50&p=1"
}
```

开启 `includeIndividualItems: true` 后，每件商品额外一条记录：

```json
{
  "type": "item",
  "keyword": "ガンダム",
  "id": "0016400324",
  "title": "閉ざされた世界 THE BACK HORN,THE BACK HORN",
  "priceJpy": 99,
  "condition": "used",
  "stockStatus": "last_one",
  "listPriceJpy": 1257,
  "discountPct": 92,
  "releaseDate": "2010/08/04",
  "storePickup": true,
  "url": "https://shopping.bookoff.co.jp/used/0016400324"
}
```

#### 精确 / 母体分位 / 样本 —— 每个数字都注明口径

每条记录都带 **`usedPriceJpyBasis`**，你永远不必猜这个数字是怎么来的：

| `usedPriceJpyBasis` | 含义 | 怎么得到的 | 什么时候出现 |
|---|---|---|---|
| **`exact`** | 对**全部命中商品**做的真实统计 | 整个结果集只有一页（≤120 件），全部读取——1 次请求 | 窄关键词 |
| **`population_quantiles`** | 最低 / Q1 / 中位数 / Q3 / 最高是**真正的母体分位点**，`count` = 全部命中数 | 按二手价升序排序，直接跳到各分位点名次所在的那一页（例如 4,893 件中的第 1,224 / 2,447 / 3,670 件 = 第 11 / 21 / 31 页），再加一页降序取最高价——共 5 次请求 | 大多数关键词 |
| **`sample`** | 对检视过的那批商品做的普通样本统计，`count` = 样本量 | 兜底。当页间的价格顺序**不再单调**，或多关键词运行触到时间预算时使用（此时同时置 `truncatedForTimeLimit: true`） | 少见 |

兜底本身就是重点：如果网店以后改了排序行为，本 Actor 会**停止自称母体分位点**，而不是悄悄返回错误的百分位。

`newPriceJpy`、`stockBreakdown`、`outOfStockRatioSampled`、`discountVsListPricePct` 与 `genreTop` **始终是样本口径**（样本量见 `sampledListings`）。在默认 `maxItemsPerKeyword: 120` 下，样本是最便宜的 120 件，所以库存构成要读成「这个市场的低价端」；把它调到 240/360，样本会自动利用本来就要抓取的分位页散布到整个价格区间——**不增加请求，也不增加时间**。

#### 本 Actor 不做什么

- **不覆盖卡牌、手办与模型。** BookOff 官方网店根本没有 TCG / 玩具品类——只有书籍、漫画、杂志、CD、DVD 与蓝光、游戏。卡牌和手办请用万代书店（Mandarake）这类来源。
- **不做时间序列。** BookOff 是定价销售的二手零售商，价格是「挂牌价」；售罄商品的价格是「最后一次挂出的价格」，是很好的准成交价，但它是商品主数据上的价格，不是逐笔成交记录，也不带成交日期。
- **不做英文关键词匹配。** 目录是日文的，英文关键词大多不命中。
- **不做服务端的「仅看有货」筛选。** 站内 UI 里有这些筛选，但其查询参数并不公开稳定，因此 v1 用样本报告库存构成，而不是在服务端过滤。
- **不处理个人数据。** BookOff 是第一方零售商，没有卖家。

#### 价格 Pricing —— 每个关键词 $0.02 起，无订阅

| 计费事件 | 价格 | 何时发生 |
|---|---|---|
| 关键词行情汇总（`keyword-analyzed`） | **$0.02** | 每分析一个关键词 |
| 单件商品记录（`item-scraped`） | **$0.002** | 仅当开启「输出单件商品」时 |

默认运行（1 个关键词、只要汇总）花费 **$0.02**，约 8 秒完成。**零结果的关键词绝不收费。** Apify 每月赠送 $5 免费额度。

#### 注意事项 Notes & limits

- `totalListingsFound` 统计所有命中商品，无论是否有货。
- 网店默认排序是「人気順」（人气顺，带畅销/广告加权），因此本 Actor **总是显式发送排序参数**，以免统计被带偏。
- 只读且限速（1 请求 / 1.5 秒），每个关键词 5 次请求。多关键词运行有 95 秒软预算：超出预算的关键词仍会返回汇总，但会标记 `truncatedForTimeLimit` 且 `usedPriceJpyBasis: "sample"`。
- 与ブックオフコーポレーション株式会社无任何关联。数据用于市场调研，大额交易前请自行核实。

#### 用途 Use cases

- **进口与转卖选品** —— 通过代购下单前，先看日本的二手价格带，再与 eBay / 煤炉的成交价对比。
- **给自己的库存定价** —— **整个**结果集的中位数与 Q3 才是日本市场实际的收费水平，而不是最吵的那条挂牌。
- **动销筛选** —— 售罄比例高、在售件数薄，说明这个题材在走货；反之就是压仓。
- **目录 / 版权调研** —— 某个系列、某个厂牌、某位歌手的二手供给有多深，相对定价打几折。
- **重定价与监测** —— 定时运行，跟踪每个关键词的中位数随时间的变化。

***

### English

#### Overview

Used-price statistics for any keyword on BookOff's official Japanese online store, in one call: **population quartiles (min/Q1/median/Q3/max) of the whole result set** — not a first-page sample — plus the stock split, the out-of-stock share and the discount against list price.

This listing is the **Chinese-language package** of our English Actor [BookOff Japan Used Media](https://apify.com/jpmarketdata/bookoff-market-checker). The scraping and the statistics are identical; the documentation, store copy and input labels are written for Chinese-speaking buyers (日本二手书 / 二手漫画).

#### Input

| Field | Example | Notes |
|---|---|---|
| `keywords` | `["ガンダム"]` | Japanese works best — the catalog is Japanese-only. $0.02 per keyword |
| `genreCode` | `"11"` | Optional: `12` Books / `11` Comics / `13` Magazines / `31` CD / `71` DVD & Blu-ray / `51` Games |
| `maxItemsPerKeyword` | `120` | Listings inspected for the stock / discount / genre mix (30–360). Does **not** affect the quartiles |
| `includeIndividualItems` | `false` | Enable to also get each sampled listing as a record (+$0.002 each) |
| `convertToUsd` | `true` | Adds USD stats at the current exchange rate |

#### Output

One `type: "market_summary"` record per keyword — `usedPriceJpy` with **`usedPriceJpyBasis`** (`exact` / `population_quantiles` / `sample`), `newPriceJpy`, `stockBreakdown`, `outOfStockRatioSampled`, `discountVsListPricePct`, `genreTop`, USD conversion — see the JSON example in the Chinese section — plus optionally one `item` record per sampled listing.

#### Pricing

| Event | Price |
|---|---|
| Keyword market summary (`keyword-analyzed`) | **$0.02** |
| Individual listing record (`item-scraped`) | **$0.002** each |

Individual listings are OFF by default, so a default run is a flat **$0.02** per keyword and takes about 8 seconds. A keyword that returns zero listings is never charged. No subscription.

#### Notes & limits

- **Trading cards, figures and hobby goods are out of scope** — BookOff's official online store has no TCG / hobby genre. Use a Mandarake source for those.
- BookOff is a fixed-price retailer: prices are **asks**, and a sold-out product's price is the last price it was offered at — a good pseudo sold comp, but a product-master price with no sale date, so no time series.
- The store's default order is 人気順 (popularity, ad/best-seller weighted); this Actor always sends an explicit sort.
- `newPriceJpy`, `stockBreakdown`, `outOfStockRatioSampled`, `discountVsListPricePct` and `genreTop` are always **sample**-based (`sampledListings`).
- Read-only and throttled (1 request / 1.5 s), 5 requests per keyword, 95-second soft budget. No personal data — BookOff is a first-party retailer, there are no sellers.

***

### 日本語

#### 概要 Overview

ブックオフ公式オンラインストアの中古相場を、キーワード1件につき1レコードで返します。特徴は先頭ページのサンプル統計ではなく**検索結果の母集団そのものの分位点**（中古価格の安い順に並べ替え、各分位点の順位が載っているページへ直接ジャンプ）。あわせて在庫内訳、在庫なし比率、定価に対する割引率、新品価格、ジャンル内訳、USD換算。中国語圏の利用者（日本二手书 / 二手漫画）向けに中国語で書き直したパッケージで、英語版は [BookOff Japan Used Media](https://apify.com/jpmarketdata/bookoff-market-checker)（取得・統計処理は同一）。

#### 入力 Input

`keywords`（**日本語**推奨、カタログが日本語のため）／`genreCode`（12=書籍 / 11=コミック / 13=雑誌 / 31=CD / 71=DVD・ブルーレイ / 51=ゲーム）／`maxItemsPerKeyword`（既定 120、30〜360）／`includeIndividualItems`（既定 OFF）／`convertToUsd`（既定 ON）。

#### 出力 Output

キーワードごとに `market_summary` を1件。**数値の根拠は必ず明示**します：`usedPriceJpyBasis` が `exact`（全件が1ページに収まり全数集計）/ `population_quantiles`（母集団分位点）/ `sample`（サンプル統計）のどれかを示し、ページ間で価格順が単調でない場合や時間予算（95秒）を超えた場合は**母集団分位点を名乗らず** `sample` に落ちます。在庫内訳・割引率・ジャンル内訳・新品価格は常にサンプル基準です。

#### 料金 Pricing

キーワードサマリー（`keyword-analyzed`）**$0.02**／個別商品レコード（`item-scraped`）**$0.002 / 件**。個別明細は**既定 OFF** なので既定実行は $0.02 固定です。**0件のキーワードには課金されません。** サブスクリプション不要。

#### 注意 Notes

**トレカ・ホビー・フィギュア系のジャンルは公式オンラインストアに存在しないため対象外**です（書籍・コミック・雑誌・CD・DVD・ゲームのみ）。ブックオフは定価販売の中古小売であり、価格は「出品価格」、売り切れ商品の価格は「最後に提示されていた価格」で販売日時は取得できません（時系列分析は不可）。既定の並び順（人気順）は広告・売れ筋バイアスがあるため常にソートを明示します。リクエストは1.5秒間隔・キーワードあたり5リクエスト。ブックオフコーポレーション株式会社とは無関係です。

# Actor input Schema

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

一个或多个搜索关键词。日文命中率最高——BookOff 的商品目录只有日文（ガンダム、ワンピース、ドラゴンクエスト、米津玄師）。每个关键词 $0.02。

## `genreCode` (type: `string`):

把搜索限定到某一个 BookOff 品类：12=书籍（書籍）、11=漫画（コミック）、13=杂志（雑誌）、31=CD、71=DVD 与蓝光、51=游戏（ゲーム）。留空表示搜索全部品类。注意：官方网店没有卡牌与手办/模型品类。

## `maxItemsPerKeyword` (type: `integer`):

每个关键词检视多少件商品，用于计算库存构成、折扣率与品类构成。二手价格的分位点取自整个结果集的母体，不受此项影响。结果每页 120 件，因此大于 120 的取值只是把本来就要抓取的分位页一起用上——样本自动散布在整个价格区间，不增加请求也不增加时间；小于 120 的取值只会限制开启「输出单件商品」时返回（并计费）的件数（+$0.002/件）。

## `includeIndividualItems` (type: `boolean`):

默认关闭：一次运行每个关键词汇总固定 $0.02。开启后还会输出每一件取样商品（标题、价格、成色、库存状态、定价、折扣率、发售日、可店取标记、链接），费用 +$0.002/件。

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

按当前汇率（open.er-api.com）在日元统计旁边附上美元统计。

## Actor input object example

```json
{
  "keywords": [
    "ガンダム"
  ],
  "maxItemsPerKeyword": 120,
  "includeIndividualItems": 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 = {
    "keywords": [
        "ガンダム"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("jpmarketdata/bookoff-market-cn").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": ["ガンダム"] }

# Run the Actor and wait for it to finish
run = client.actor("jpmarketdata/bookoff-market-cn").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print("💾 Check your data here: https://console.apify.com/storage/datasets/" + run["defaultDatasetId"])
for item in client.dataset(run["defaultDatasetId"]).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": [
    "ガンダム"
  ]
}' |
apify call jpmarketdata/bookoff-market-cn --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "command": "npx",
            "args": [
                "mcp-remote",
                "https://mcp.apify.com/?tools=jpmarketdata/bookoff-market-cn",
                "--header",
                "Authorization: Bearer <YOUR_API_TOKEN>"
            ]
        }
    }
}

```

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/actors/jm4ygrtjs6IkXVYLc/builds/zvxjnuv0HvmKopL40/openapi.json
