BOOK-OFF Online API & Scraper
The BOOK-OFF Online API turns shopping.bookoff.co.jp, the online store of Japan's largest second-hand chain, into clean JSON in three actions.
🤖 Using an AI assistant? Copy this link into ChatGPT / Claude / Cursor — it reads every endpoint and parameter instantly and tells you if this API fits your use case.
search covers BOOK-OFF's whole catalogue — 6,152,410 items on 2026-10-02, the figure BOOK-OFF's own category panel prints for all categories — across the six genres it publishes (books 2,881,854, manga 420,838, magazines 118,669, CD 1,946,281, DVD and Blu-ray 739,409, games 45,359) and across its 61,208 multi-volume sets, narrowed by free-text keyword, an excluded keyword, author or artist, publisher or label, genre or one of BOOK-OFF's own sub-genre codes, a yen price band, a release year-month band, in-stock only and shop-collectable only. Every row carries the ten-digit item number and its canonical URL, the title and author, BOOK-OFF's own category and sub-genre labels, whether the row is the second-hand or the new offer, the price in whole yen with BOOK-OFF's own printed string beside it, the publisher's list price, BOOK-OFF's own discount in yen and per cent, its own pre-markdown price with the date that price applied, the loyalty points, the stock line, the release date, the lead image and the set the item belongs to if it belongs to one. product adds the whole item page: the thirteen-digit JAN with ISBN-13 flagged when the barcode really is one, the publisher, the release date, BOOK-OFF's written description where it has one, the category-specific rows the source prints, each read by its own label rather than by position — catalogue number on CD, DVD and games, disc count and the full track list on CD and DVD, cast and the director/writer/composer credit row on DVD — the star rating and review count BOOK-OFF publishes, the photo set, and STORE STOCK: how many BOOK-OFF shops have received the item together with the per-prefecture breakdown. set resolves one of the 61,208 multi-volume sets: its own price and discount, how many of its component items are available right now split into second-hand and new, and every component as an id and a URL you can resolve with product. One ReefAPI key, no BOOK-OFF account, and the standard { ok, data, meta, error } envelope.
One item number, two prices — and the four other money figures on the page
BOOK-OFF is one retailer, not a marketplace, so an item has one second-hand price and, while it is still stocked new, one new price. Those two live on two separate addresses for the SAME ten-digit item number, and they are genuinely different numbers: item 0020673438 is 1,760 yen second-hand and 2,200 yen new, same title, same barcode, measured in both runs. That is why every row and every detail record says which of the two it is, and why the detail record hands you the other one's URL. Fill rates below are over 223 distinct live rows across seven category samples (books, manga, magazines, CD, DVD, games and a trading-card keyword) plus the set surface, and over the six detail records.
| Field | What it is | How often it was filled |
|---|---|---|
| price_jpy | What you pay today, in whole yen — the yen has no minor unit, so this is an integer and nothing is ever divided or multiplied. The number was checked against the string BOOK-OFF itself printed in the same row on every row parsed, and on detail against the structured data the item page publishes as well: 6 of 6 agreed, 0 disagreed, and the search row's price matched the item page's on 6 of 6. | 223 of 223 |
| condition | Which of the two offers this is: used or new. Not cosmetic — it is the difference between 1,760 and 2,200 yen for the same item number. A set row says set. | 223 of 223 |
| list_price_jpy | The publisher's or label's list price, printed by BOOK-OFF as 定価. Only printed when BOOK-OFF is selling below it, which is why 18 rows do not have one: those are new-condition rows priced at list. Never derived when the source does not print it. | 205 of 223 |
| discount_jpy / discount_pct | BOOK-OFF's own saving figure, exactly as it states it ("440 yen, 20% off list"). The arithmetic is checked rather than trusted — price plus discount must equal the list price — and the result travels with the record. | 205 of 223 |
| previous_price_jpy + previous_price_date | BOOK-OFF's own price for this item before it marked it down, with the date that price applied ("1,980 yen, as of 9/10"). Only marked-down items have one, so the low fill rate is the source's, not a gap. | 18 of 223 |
| jan | The thirteen-digit barcode BOOK-OFF prints for every item, book or not. | 6 of 6 detail records |
| isbn13 | The same barcode, republished as an ISBN-13 only when it really is a 978 or 979 Bookland code. The one record without it is a CD, whose barcode is a plain product JAN. ISBN-10 is never returned: BOOK-OFF does not print one, and a computed check digit would be our number, not theirs. | 5 of 6 detail records |
| store_stock.stores_with_stock | How many BOOK-OFF shops have received this item, with the per-prefecture breakdown beside it. The breakdown is checked against the headline on every call: one CD came back as 8 shops, Tokyo 6 plus Osaka 2, which sums exactly. Zero is returned as zero; an item BOOK-OFF publishes no shop figure for is null, not zero. Shop NAMES are not on the page and are never invented, and BOOK-OFF's own note that in-shop prices differ from online prices travels with the field. | 5 of 6 detail records |
| items_total / items_available | Set rows and set records only: how many items the set bundles and how many are in stock, split into second-hand and new ("1 of 2 items, 1 used, 0 new"). One ONE PIECE set measured 115 of 115 available. | 13 of 13 set rows |
What BOOK-OFF does not publish, probed rather than assumed: no condition grade — a second-hand item is marked 中古 and there is no A/B/C or "like new" anywhere on the public page; no per-shop price, and the source says in its own words that in-shop prices differ from online ones; no shop names; no stock quantity, only in stock, out of stock, or for a set "partly out of stock" with counts; no ISBN-10; and no trading-card category — the public taxonomy has exactly six genres and cards are reachable by name only (ポケモンカード returned 1,729 items, which BOOK-OFF's own panel splits books 1,032, manga 318, CD 131, DVD 79, games 169, summing to exactly 1,729).
Real request and response JSON
Captured from the indexed primary action, search, on .
{
"method": "POST",
"url": "https://api.reefapi.com/bookoff/v1/search",
"headers": {
"x-api-key": "$REEF_KEY",
"content-type": "application/json"
},
"body": {
"keyword": "ワンピース"
}
}{
"ok": true,
"meta": {
"api": "bookoff",
"endpoint": "search",
"mode": "live",
"latency_ms": 2388.4,
"record_count": 30,
"bytes": 246643,
"cache_hit": false,
"stop_reason": "more_pages",
"upstream_requests": 1,
"tiles_without_id": 0,
"charged_credits": 1,
"version": "1.0.0",
"request_id": "0f67469bb0ad4fc6",
"queue_ms": 1.2
},
"data": {
"page": 1,
"per_page": 30,
"returned": 30,
"total": 2181,
"pages_estimate": 73,
"page_ceiling": 999,
"order_is_stable": true,
"filters_applied": {
"keyword": "ワンピース"
},
"facet_counts": {
"すべてのカテゴリ": 2181,
"書籍": 649,
"コミック": 394,
"CD": 272,
"DVD・ブルーレイ": 775,
"ゲーム": 91
},
"result_line": "1件~30件(全2,181件)",
"items": [
{
"product_id": "0020695349",
"surface": "used",
"url": "https://shopping.bookoff.co.jp/used/0020695349",
"title": "ONE PIECE(巻百十三) ジャンプC",
"author": "尾田栄一郎",
"category": "コミック",
"genre_label": "ジャンプC",
"condition": "used",
"price_jpy": 495,
"price_display": "¥495 円 定価より77円(13%)おトク",
"list_price_jpy": 572,
"discount_jpy": 77,
"discount_pct": 13,
"previous_price_jpy": null,
"previous_price_date": null,
"points": 4,
"in_stock": true,
"stock_text": "在庫あり",
"store_pickup": true,
"release_date": "2025/11/04",
"image_url": "https://content.bookoff.co.jp/goodsimages/LL/002069/0020695349LL.jpg",
"tags": [
"中古",
"店舗受取可"
],
"set_id": "8800042627",
"items_total": null,
"items_available": null,
"price_unit_verified": true
},
{
"product_id": "0011420785",
"surface": "used",
"url": "https://shopping.bookoff.co.jp/used/0011420785",
"title": "ONE PIECE(巻一) 東の海編 ジャンプC",
"author": "尾田栄一郎",
"category": "コミック",
"genre_label": "ジャンプC",
"condition": "used",
"price_jpy": 440,
"price_display": "¥440 円 定価より44円(9%)おトク",
"list_price_jpy": 484,
"discount_jpy": 44,
"discount_pct": 9,
"previous_price_jpy": null,
"previous_price_date": null,
"points": 4,
"in_stock": false,
"stock_text": "残り1点 ご注文はお早めに",
"store_pickup": true,
"release_date": "1997/12/24",
"image_url": "https://content.bookoff.co.jp/goodsimages/LL/001142/0011420785LL.jpg",
"tags": [
"中古",
"店舗受取可"
],
"set_id": null,
"items_total": null,
"items_available": null,
"price_unit_verified": true
},
{
"product_id": "0020897004",
"surface": "used",
"url": "https://shopping.bookoff.co.jp/used/0020897004",
"title": "ONE PIECE(巻百十五) ジャンプC",
"author": "尾田栄一郎",
"category": "コミック",
"genre_label": "ジャンプC",
"condition": "used",
"price_jpy": 550,
"price_display": "¥550 円 定価より44円(7%)おトク",
"list_price_jpy": 594,
"discount_jpy": 44,
"discount_pct": 7,
"previous_price_jpy": null,
"previous_price_date": null,
"points": 5,
"in_stock": true,
"stock_text": "在庫あり",
"store_pickup": true,
"release_date": "2026/07/03",
"image_url": "https://content.bookoff.co.jp/goodsimages/LL/002089/0020897004LL.jpg",
"tags": [
"中古",
"店舗受取可"
],
"set_id": "8800042627",
"items_total": null,
"items_available": null,
"price_unit_verified": true
}
]
}
}What the BOOK-OFF Online API does
| Action | Description | Concrete use case | Key params |
|---|---|---|---|
| search | Search BOOK-OFF Online's 6,152,410-item catalogue — Japan's largest second-hand chain — across its six genres (books, comics/manga, magazines, CD, DVD & Blu-ray, games) or its 61,208 multi-volume sets. ONE ROW IS ONE CATALOGUE PRODUCT, not a copy: BOOK-OFF is a single retailer, so each product has one second-hand price and, where it is still published, one new price (measured: searching an exact ISBN-13/JAN returns exactly one row, 3 of 3 tried). Each row carries which condition surface it is (`surface` = used/new/set) together with the price, the publisher's list price, BOOK-OFF's own discount figure and its own pre-markdown price with the date it applied. 🔴 Send at least one of keyword, author, publisher, genre, genre_code or sets_only. Page size is the source's own 30, 60, 120 and is exact. The hard ceiling is page 999 (page 1000 → HTTP 404), so at most 119,880 items are reachable per query. Past the last real page the source returns an EMPTY grid, not filler rows, and `stop_reason` says `past_last_page`. | Pricing teams call search to search BOOK-OFF Online's 6,152,410-item catalogue. | keyword, exclude_keyword, author, publisher, genre, ... |
| product | One BOOK-OFF product in full: title, author, category and sub-genre, the 13-digit JAN (republished as `isbn13` when it really is a 978/979 Bookland code — ISBN-10 is never derived from it), publisher, release date, description, and the category-specific rows the source prints — catalogue number on CD, DVD and games, disc count and the full track list on CD and DVD, cast and the director/writer/composer credit row on DVD (enumerated over 18 live pages, three per genre; artist and platform are NOT published as rows and are therefore absent rather than permanently null). FOUR money figures are kept apart: the price you pay, the publisher's list price, BOOK-OFF's own discount, and BOOK-OFF's own pre-markdown price with the date it applied — each cross-checked against the page's own schema.org offer. Plus STORE STOCK: how many BOOK-OFF shops have received the item and the per-prefecture breakdown. 🔴 An id alone does NOT identify an offer: `/used/<id>` and `/new/<id>` are the same product at different prices (measured 1,760 vs 2,200). Pass `condition` to choose; with it omitted the second-hand surface is tried first and then the new one, and the answer always reports which one replied. A dead id returns NOT_FOUND. | Marketplace operators call product to get one BOOK-OFF product in full. | product_id, condition |
| set | One of BOOK-OFF's 61,208 multi-volume SETS: its own price and discount, how many of its component items are available right now split into second-hand and new (the source's own "全2点中 1点(中古1点 / 新品0点)" = 1 of 2 items, 1 used and 0 new), and the component products themselves as ids and URLs you can resolve with `product`. Set pages publish NO schema.org data, so every field here is parsed from the printed page. A dead set id returns NOT_FOUND. | Catalog enrichment teams call set to get one of BOOK-OFF's 61,208 multi-volume SETS. | set_id |
Call search from your stack
curl -X POST https://api.reefapi.com/bookoff/v1/search \
-H "x-api-key: $REEF_KEY" \
-H "content-type: application/json" \
-d '{"keyword":"ワンピース"}'import requests
r = requests.post(
"https://api.reefapi.com/bookoff/v1/search",
headers={"x-api-key": REEF_KEY},
json={
"keyword": "ワンピース"
},
)
print(r.json()["data"])const res = await fetch("https://api.reefapi.com/bookoff/v1/search", {
method: "POST",
headers: {
"x-api-key": process.env.REEF_KEY,
"content-type": "application/json",
},
body: JSON.stringify({
"keyword": "ワンピース"
}),
});
const { ok, data, meta, error } = await res.json();Ask your MCP-connected assistant: call reefapi.bookoff.search with {"keyword":"ワンピース"}.Who uses this API and why
- Japanese second-hand pricing and residual-value work: pull a publisher or an author with a release-month band and read the second-hand price against the publisher's list price on every row, both printed by BOOK-OFF itself. Measured on one book: 1,760 yen used against a 2,200 yen list, with BOOK-OFF's own 20% saving figure and its own pre-markdown price of 1,980 yen as of 9/10 — three dated points on one item without computing anything.
- Catalogue reconciliation by barcode: search a thirteen-digit JAN or ISBN-13 and get the single exact row, then resolve it for the full record. Useful for matching a Japanese ISBN list against live second-hand availability and price — three barcodes tried, three single exact rows.
- Markdown and repricing monitoring: previous_price_jpy and previous_price_date are BOOK-OFF's own pre-markdown price and the date it applied, so a daily sweep of a genre identifies what the chain has actually repriced rather than inferring it. Measured prevalence: 18 of 223 rows carried one, so a markdown feed is a small, high-signal slice of the catalogue.
- Physical-shop availability for Japanese retail and resale: the detail record says how many BOOK-OFF shops have received an item and breaks it down by prefecture, so you can see where stock physically sits — one CD came back as 8 shops, 6 in Tokyo and 2 in Osaka. BOOK-OFF states that in-shop prices differ from online prices, and that note travels with the data.
- Manga, CD, DVD and game set-completion tooling: the set surface gives you a bundle's component list and how many of those components are in stock as second-hand or new, which is exactly the question a collector completing a 115-volume run asks. 61,208 sets are searchable by name.
Questions developers ask before integrating
Is one row one copy of a book, or one title?
One catalogue item, which on this source is the same thing as one copy for sale. BOOK-OFF is a single retailer: searching an exact barcode returns exactly one row, measured on three — a novel's ISBN-13, a CD's JAN and a manga volume's ISBN-13 all returned 1 row each. So there is no price spread across sellers to collect here, unlike a marketplace. The spread BOOK-OFF does publish is second-hand against new for the same item, and against the publisher's list price.
Why does the same item number return two different prices?
Because BOOK-OFF sells the same catalogue item on two surfaces: second-hand and new, each with its own price. Item 0020673438 is 1,760 yen used and 2,200 yen new. Pass condition to choose; leave it out and the API tries second-hand first, then new, and always tells you which one answered in condition and url, lists the surfaces that exist in offer_surfaces, and hands you the other one's address in other_condition_url. Nothing in this API treats an item number on its own as an offer.
Can I search in English, or do I need Japanese?
Both work, but they are not equivalent, because the keyword matches what BOOK-OFF printed. A Japanese title or author finds far more: ワンピース returned 2,181 items. Latin-script titles, artist names and catalogue numbers also match where BOOK-OFF prints them in Latin script — Blu-ray and DVD付 are two of the tags BOOK-OFF's own search page links. If you are after a specific item and have its barcode, search the thirteen-digit JAN: that returns the single exact row.
How deep can I page, and does the order stay the same between calls?
Page size is BOOK-OFF's own 30, 60 or 120 and it is exact — ask for 120 and you get 120. The hard ceiling is page 999, so a single query reaches at most 119,880 items however large its total; beyond the last real page you get an empty page with stop_reason past_last_page, never filler rows. The totals are honest: a 2,181-item query returned exactly 21 rows on page 73, which is 72 times 30 plus 21. And the default order is reproducible — three identical calls returned the same 30 items in the same order, so order_is_stable is true. That is worth asking about, because on many sources it is not.
Which filters actually reduce the result count?
All of the ones this API exposes, each measured against the unfiltered total in the same run. From keyword ワンピース at 2,181: books 649, manga 394, CD 272, DVD 775, games 91 — which sum to exactly 2,181, BOOK-OFF's own panel agreeing with its own total — in-stock only 1,383, shop-collectable only 1,095, under 300 yen 680, 5,000 yen and up 51, released from 2025-01 105, released in 2025 only 60, excluding カード 2,168, publisher 集英社 436, and five filters at once 197. One parameter is published with the opposite measurement: used_only on its own does NOT reduce the count — it returned the same 2,181 items in the same order and only switched each row to its second-hand offer — so it says so in its own description and the API puts a warning in the response when you use it alone. Combine it with in-stock only and it does filter, 1,383 to 1,326.
Does it cover trading cards?
Only as keyword matches, and the API is explicit about it. BOOK-OFF Online's public genre taxonomy has exactly six categories and none of them is trading cards. Cards are in the catalogue — トレーディングカード returned 110 items and ポケモンカード 1,729 — but BOOK-OFF files them under books, manga, CD, DVD or games, and that is what the category field reports. If you need cards, search the card or set name rather than a category.
What are sets, and how do I get what is inside one?
A set is BOOK-OFF's own bundle SKU for a multi-volume work, and there are 61,208 of them with their own ten-digit numbers and their own prices. Search them with sets_only, then call set with the id: you get the set's price and discount, how many of its component items are available right now split into second-hand and new, and every component as an id and URL you can resolve with product. A measured example: a 115-volume ONE PIECE set at 22,594 yen with 115 of 115 components available, and a two-volume set at 550 yen with 1 of 2 available, 1 second-hand and 0 new.
What happens with a dead or mistyped item number?
You get NOT_FOUND, not a wrong record. That matters more than it sounds, because BOOK-OFF answers a dead item number with an empty page under a success status, and it silently drops trailing characters — asking for 0020673438x returns the page of 0020673438. This API refuses anything that is not exactly a ten-digit number or a URL containing one, and after fetching it checks the item page's own structured identifier against the number you asked for, so another product's record can never arrive labelled as yours.
What is the BOOK-OFF Online API?
BOOK-OFF Online API is a ReefAPI endpoint group for japan's largest second-hand chain as json: 6,152,410 items across books, manga, magazines, cd, dvd and games plus 61,208 multi-volume sets, with the second-hand and the new price of the same item kept apart, the publisher's list price, book-off's own pre-markdown price with its date, the 13-digit jan, and how many book-off shops hold the item. It returns live JSON through POST requests under /bookoff/v1.
Is the BOOK-OFF Online API free to try?
Yes. ReefAPI starts with 1,000 free credits, no card required. BOOK-OFF Online calls use the same shared credit balance as every other ReefAPI engine.
Do I need a BOOK-OFF Online login or account?
No login to BOOK-OFF Online is needed for the API response. You call ReefAPI with your x-api-key header, and the playground can run live examples before you create a production key.
How fresh is the BOOK-OFF Online data?
The page example is captured from a live search call, and production requests fetch live data through ReefAPI rather than a static sample.
How many credits does the BOOK-OFF Online API use?
BOOK-OFF Online actions currently cost 2-3 credits per successful call. Failed or blocked calls are free. All APIs draw from one credit pool.
Can I call BOOK-OFF Online from an AI assistant or MCP client?
Yes. Connect ReefAPI once through MCP and your assistant can call bookoff actions with the same key, credit pool and JSON envelope used by normal REST requests.