# Japan Used Media Prices (BOOKOFF ブックオフ) (`jpopendata/japan-used-media-bookoff`) Actor

Used & new media prices from BOOKOFF online (shopping.bookoff.co.jp): price JPY, list price, condition, stock, release date, author/artist, optional JAN for books, comics, CD, DVD, games. English schema for price research. Item facts only. Unofficial; not affiliated with BOOKOFF.

- **URL**: https://apify.com/jpopendata/japan-used-media-bookoff.md
- **Developed by:** [JP Open Data](https://apify.com/jpopendata) (community)
- **Categories:**
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $2.00 / 1,000 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?

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 Media Prices (BOOKOFF ブックオフ)

**Live used & new media prices from BOOKOFF's official online store (shopping.bookoff.co.jp) — Japan's biggest second-hand chain: selling price, list price (定価), condition, stock, release date, author/artist, and (optionally) the JAN barcode, in a clean English schema.**

This Actor browses the public product listings on shopping.bookoff.co.jp by category/genre and returns each item as English-schema JSON: item id, title, author or performing artist, category (書籍 / コミック / ＣＤ / DVD・ブルーレイ / ゲーム), sub-genre label, condition (`new` / `used`), current price (JPY), the original list price, BOOKOFF's own earlier price snapshot, in-stock flag and raw stock label, release date (ISO), image URL and product URL. Turn on **Fetch JAN / label** to also pull each item's JAN/EAN-13 barcode, publisher/label and catalog number from its product page — the join key for matching prices across catalogs. Optional condition, price-range and in-stock filters are applied client-side.

> **Note on search:** BOOKOFF has **no server-side free-text search** exposed to tools, so this Actor browses by **category / genre** (the site's reliable, robots-open listing surface). A `keyword` is optional and acts as a **relevance ranking within the chosen genre** — it surfaces matching items toward the front rather than filtering the whole store. Pair a keyword with a small *Max records* to pull the top matches.

> **Unofficial tool.** Not affiliated with or endorsed by ブックオフコーポレーション株式会社 (BOOKOFF CORPORATION LTD.). It collects **publicly available data only** (no login, no paywall), politely (strictly serial requests spaced **2 seconds apart**, hard per-run budget, no block evasion), fetches **only URLs the site's robots.txt leaves open to general bots** (robots.txt disallows only `/cart/`), and extracts **item facts only** — **no reviews, no personal data**, and (BOOKOFF being a first-party retailer) **no seller information** exists on the pages to collect (relevant e.g. under GDPR: no personal data is collected or processed). Users are responsible for ensuring their own use of the data complies with the source site's terms and applicable law.

***

### Quick start — verified input

Copy, paste, run. This exact input is verified on the platform (SUCCEEDED, items > 0):

```json
{
  "category": "comic",
  "maxItems": 10
}
```

Running with **no input at all** also works (same defaults). Add `"keyword": "ワンピース"` to rank a title to the front, `"conditionFilter": "used"` for second-hand copies only.

### Who is this for?

- **Overseas resellers & proxy-buying services (せどり / arbitrage)** — used vs new price, list price and stock across a whole category, with the JAN barcode to line BOOKOFF's prices up against eBay, Amazon, Discogs or your own catalog.
- **Collectors** — track figures-of-price for comics runs, CD/DVD back-catalogs, retro games and out-of-print books at Japan's largest second-hand inventory.
- **Price-tracking & market tools** — a stable English schema over a Japanese-only source; re-run on a schedule for time series (each record also carries BOOKOFF's own previous-price snapshot).
- **Market research** — release dates, authors/artists and price levels across an entire genre in one run.

### Sample output (dataset item)

```json
{
  "itemId": "0020897004",
  "itemTitle": "ONE PIECE(巻百十五) ジャンプC",
  "author": "尾田栄一郎",
  "category": "コミック",
  "categorySlug": "comic",
  "genreId": "11",
  "genreLabel": "ジャンプC",
  "condition": "used",
  "priceJpy": 550,
  "listPriceJpy": 594,
  "previousPriceJpy": null,
  "previousPriceAsOf": null,
  "inStock": true,
  "stockStatus": "在庫あり",
  "releaseDate": "2026-07-03",
  "jan": null,
  "label": null,
  "catalogNumber": null,
  "imageUrl": "https://content.bookoff.co.jp/goodsimages/LL/002089/0020897004LL.jpg",
  "itemUrl": "https://shopping.bookoff.co.jp/used/0020897004",
  "source": "ブックオフ公式オンラインストア (shopping.bookoff.co.jp listings)",
  "sourceUrl": "https://shopping.bookoff.co.jp/",
  "license": "Publicly available data — unofficial tool; users are responsible for compliance with the source site's terms",
  "retrievedAt": "2026-08-26T12:00:00.000Z"
}
```

`priceJpy` is BOOKOFF's current selling price and `condition` says whether the item is `new` or `used`. `listPriceJpy` is the original retail price (定価), derived from the printed "定価より…おトク" saving. `previousPriceJpy` is BOOKOFF's own earlier price snapshot when shown (with `previousPriceAsOf`). `jan`, `label` and `catalogNumber` are populated only when **Fetch JAN / label** is enabled.

### Input example

```json
{
  "category": "cd",
  "conditionFilter": "used",
  "priceMin": 300,
  "priceMax": 5000,
  "inStockOnly": true,
  "fetchDetails": true,
  "maxItems": 100,
  "maxApiRequests": 120
}
```

A `category` (or numeric `genre`) is required. `category` takes a slug — `comic`, `book`, `magazine`, `cd`, `dvd`, `game` — or a numeric BOOKOFF genre id; pass a `genre` id (e.g. `1101`, `110301`) for a finer subgenre. `keyword` is optional and ranks matching items to the front of the genre. Condition, price and in-stock filters are applied **client-side after fetching**, so tight filters discard part of what was fetched — raise `maxApiRequests` if a filtered run comes back incomplete. **Fetch JAN / label** adds one request per item.

#### Common input mistakes

| Mistake | Correct |
|---------|---------|
| `{"keyword": "ワンピース"}` with no category | add `"category": "comic"` — keyword only ranks within a genre |
| `"category": "toys"` / `"anime"` | one of `comic`, `book`, `magazine`, `cd`, `dvd`, `game` (`comics`, `manga`, `blu-ray`, `games` … are accepted aliases) |
| `"genre": "comics"` | a numeric id such as `11` or `1101` — or use `"category": "comic"` |
| `"conditionFilter": "mint"` | `"used"` or `"new"` (leave empty for both) |
| `"priceMin": "¥300"` | a whole number of yen: `300` |
| `"fetchDetails": true` with the default `maxApiRequests` | raise `maxApiRequests` (one extra request per item) or the run stops early with `complete: false` |

#### Empty results?

A run that finds nothing completes with 0 items and a warning in the log (not a failure). Typical causes: a `genre` id that BOOKOFF does not use (check it appears in a `/search/genre/{id}` URL on the site), or a price/condition/in-stock filter that discards everything fetched — remember these filters are applied **after** fetching, so a tight `priceMin`/`priceMax` on a small `maxApiRequests` budget can leave nothing. Loosen the filters or raise `maxApiRequests` and retry.

### Pricing

Pay per result — see the pricing tab. One listing request holds 30 items; enabling JAN enrichment adds one request per item.

### FAQ

**Where does the data come from?**
Live from the public, login-free category/genre listing pages on shopping.bookoff.co.jp at run time (and, with JAN enrichment on, each item's public product page). Every record embeds the source, source URL, a license note, and the retrieval timestamp.

**Is this an official BOOKOFF service?**
No. **Unofficial**, independently built and maintained, and **not affiliated with or endorsed by ブックオフコーポレーション株式会社 (BOOKOFF CORPORATION LTD.)**. It reads only publicly available pages.

**Can I search by free-text keyword?**
Not as a hard filter. BOOKOFF's online store has no server-side free-text search exposed to tools (the search box is served by a separate component this Actor does not touch). Browse by **category / genre** instead; a `keyword` re-ranks a genre's results toward matches. This is a deliberate, honest limitation, not a bug.

**Is seller information included?**
There is none to include. BOOKOFF's online store is a **first-party retailer** — every item is sold by the company itself, so there are no third-party marketplace sellers and no seller people. The Actor also never reads reviews or any personal data.

**Does it respect robots.txt?**
Yes, strictly. shopping.bookoff.co.jp's robots.txt disallows only `/cart/`; this Actor fetches only the open genre-listing and product pages, strictly serial and **2 seconds apart** (there is no Crawl-delay set, so it uses a courteous 2 s, above the fleet-wide 1.2 s floor).

**Do I need a proxy?**
Usually no — the site serves Apify's datacenter runs normally. If you ever hit an HTTP 403, set `proxyConfiguration` to Apify proxy (RESIDENTIAL, country JP, if needed). The Actor never rotates identities or evades blocks; it makes the same polite serial requests through whichever single egress you give it, and fails visibly when blocked.

**Who is responsible for how the data is used?**
You are. The Actor collects publicly available factual data politely, but the legality of your specific use (redistribution, database rights, the source site's terms) is your responsibility as the user.

**How fresh are the results?**
Prices and stock are what the site's listings return at retrieval time. Treat each run as a snapshot and re-run for fresh data.

**What about server load?**
Strictly serial requests, 2 s apart, 30 items per listing request, hard per-run request budget, exponential backoff, no CAPTCHA/login/block evasion. If the site changes its page format, the Actor stops with a clear error instead of silently mis-parsing; if it blocks persistently, the run fails visibly.

### Search terms this Actor answers

bookoff scraper · bookoff online price data · japan used books prices · japan secondhand media data · japan retro games prices · japanese used cd prices · japan used dvd data · japanese comics manga price data · japan reselling せどり data · ブックオフ 相場 データ · japan used media market research · japan JAN barcode price lookup

### More Japan data Actors by the same developer

- **Japan Hobby & Collectibles Prices (駿河屋 Suruga-ya)** — the sister Actor for suruga-ya.jp: figures, trading cards, retro games, anime goods and hobby books, new & used, with marketplace low prices. The natural companion for cross-checking second-hand media and hobby prices across Japan's two biggest used-goods retailers.
- **Yahoo Auctions Japan Sold Prices (ヤフオク落札相場)** — actual sold-item comps to compare against BOOKOFF's asking prices.
- **Japan Hotels & Ryokan Prices (jalan.net)** — hotel/ryokan prices, plans and ratings by prefecture and area.
- **Japan Government Tenders & Awards** — tender notices and award results from the kkj.go.jp portal.
- **Japan Medical Facilities** — every registered hospital, clinic, dental clinic, and pharmacy (MHLW open data).
- **Japan Government Subsidies & Grants** — open subsidy calls from the official jGrants API.
- **Japan Construction & Real-Estate Licenses** — licensed contractors and brokers from MLIT's official register.

***

*Unofficial tool; not affiliated with ブックオフコーポレーション株式会社 (BOOKOFF CORPORATION LTD.). Publicly available data only; users are responsible for compliance with the source site's terms and applicable law. No personal data and no seller data are collected.*

# Actor input Schema

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

BOOKOFF category to browse (required unless genre is given): comic, book, magazine, cd, dvd, game — aliases such as "comics"/"manga"/"books"/"music"/"blu-ray"/"games" are accepted. BOOKOFF has no server-side free-text search, so browsing is by genre; an empty input browses "comic". Example: "comic".

## `genre` (type: `string`):

Optional numeric BOOKOFF genre id for a finer subgenre (digits only), e.g. 11 = comics, 1101 = a comic subgenre, 110301 = deeper. Overrides the category's top-level id. Find ids in the site's own /search/genre/{id} URLs. Leave empty to browse the whole category.

## `keyword` (type: `string`):

Optional keyword. BOOKOFF has no server-side free-text filter, so this does NOT reduce the genre; it ranks matching items toward the front of the chosen genre. Combine with a small Max records to pull the top matches. Japanese keywords match best, e.g. "ワンピース". A keyword alone (without category/genre) is rejected.

## `conditionFilter` (type: `string`):

Keep only "new" (新品) or only "used" (中古) items. Applied client-side after fetching. Leave empty for both.

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

Optional lower bound on the selling price (priceJpy) in yen, whole number, e.g. 300. Applied client-side after fetching, so tight ranges may need a higher request budget.

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

Optional upper bound on the selling price (priceJpy) in yen, whole number, e.g. 5000. Applied client-side after fetching.

## `inStockOnly` (type: `boolean`):

Keep only items BOOKOFF currently has in stock (excludes 在庫なし). Applied client-side after fetching.

## `fetchDetails` (type: `boolean`):

Also fetch each item's product page to add its JAN/EAN barcode, publisher/label and catalog number (the cross-catalog join key for price matching). Costs one extra request per item, so raise Max upstream requests accordingly. Default off.

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

Stop after this many dataset records (1-1000, default 10).

## `maxApiRequests` (type: `integer`):

Hard budget of HTTP requests to shopping.bookoff.co.jp for this run (1-100, default 20; one list request = one 30-item page; each item's detail page, if enabled, is one more). Requests are strictly serial and spaced 2 s apart. When the budget runs out the run completes with complete=false in RUN\_SUMMARY.

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

Apify proxy settings. Default: no proxy. Never used for rotation/evasion — one client identity per run.

## Actor input object example

```json
{
  "category": "comic",
  "genre": "1101",
  "keyword": "ワンピース",
  "priceMin": 300,
  "priceMax": 5000,
  "inStockOnly": false,
  "fetchDetails": false,
  "maxItems": 10,
  "maxApiRequests": 20
}
```

# Actor output Schema

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

Structured BOOKOFF item price records with source attribution (source, sourceUrl, license, retrievedAt) on every item.

# 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 = {
    "category": "comic",
    "maxItems": 10,
    "maxApiRequests": 20
};

// Run the Actor and wait for it to finish
const run = await client.actor("jpopendata/japan-used-media-bookoff").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 = {
    "category": "comic",
    "maxItems": 10,
    "maxApiRequests": 20,
}

# Run the Actor and wait for it to finish
run = client.actor("jpopendata/japan-used-media-bookoff").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 '{
  "category": "comic",
  "maxItems": 10,
  "maxApiRequests": 20
}' |
apify call jpopendata/japan-used-media-bookoff --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,jpopendata/japan-used-media-bookoff"
        }
    }
}

```

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/VuO3ZaL0HXMNEmNAp/builds/9bk61X8nqpsC8EgEK/openapi.json
