BOOK-OFF Online API

Japan's largest second-hand chain as JSON, 6,152,410 items deep

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.

no credit card1,000 free credits · instant API key · pay by card or crypto
Missing a BOOK-OFF Online endpoint, or need a source we don't have yet?Contact us real people · same-day reply.
B
/bookoff/v1

3 active endpoints, on 2 and 3 credit tiers.

  • POST/bookoff/v1/search
  • POST/bookoff/v1/product
  • POST/bookoff/v1/set

What BOOK-OFF Online endpoints does ReefAPI ship?

3 live read endpoints. Read-only data API: no writes, no account actions, no dashboard access on the target site.

3 endpoints

search

3 cr

Search BOOK-OFF Online's 6,152,410-item catalogue.

required
—
optional
keyword, exclude_keyword, author, publisher, genre, genre_code, in_stock_only, used_only, store_pickup_only, price_min, price_max, released_from, released_to, sort, per_page, page, sets_only

product

2 cr

One BOOK-OFF product in full.

required
product_id
optional
condition

set

2 cr

One of BOOK-OFF's 61,208 multi-volume SETS.

required
set_id
optional
—

Every parameter, every allowed value →

BOOK-OFF Online API

3 of 3 endpoints, ready to run

View docs ↗

Live BOOK-OFF listings with the ten-digit item number and URL, title and author, BOOK-OFF's own category and sub-genre, whether the row is the second-hand or the new offer, the price in whole yen with BOOK-OFF's printed string beside it, the publisher's list price, BOOK-OFF's own discount and pre-markdown price with its date, loyalty points, the stock line, the release date and the set the item belongs to.

3 credits0 required · 5 optional
POST/bookoff/v1/search
idle
// Press "Try it" and this pane shows exactly what the
// live site returned this second — including an empty
// result, if that is the truth. No key, no account.

How the BOOK-OFF Online API works

BOOK-OFF Online is a normal ReefAPI surface — the same four rules that hold for every other engine on the key.

01
Authenticate
x-api-key header

No OAuth app, no request signing, no per-site account. One key covers all 438 engines.

02
Call
POST /bookoff/v1/…

Every route is a POST with a JSON body. Parameters are validated against the published schema before anything is charged.

03
Pay
2 or 3 credits per call

Credits, not seats. Failed and blocked calls are never charged, and cache hits cost nothing.

04
Read
{ ok, data, meta, error }

One envelope everywhere. meta carries latency_ms, record_count and the endpoint that answered.

From a Japanese barcode to a price history point and the shops that hold it

Two calls: search, then product.

01search
POST/bookoff/v1/search

Call search with the 13-digit JAN or ISBN-13 as the keyword. BOOK-OFF is one retailer, so an exact barcode returns exactly one row — measured on three barcodes, one row each. The row already carries the price in yen, which of the two offers it is, the publisher's list price and BOOK-OFF's own discount.

02product
POST/bookoff/v1/product

Take the row's product_id and surface and call product with both. You now have the barcode, publisher, release date, the category-specific rows, and the two figures the row cannot carry: BOOK-OFF's pre-markdown price with the date it applied, and store stock with its per-prefecture breakdown.

03product
POST/bookoff/v1/product

Read other_condition_url, or call product again with the other condition, to get the second price for the same item number. That pair — second-hand against new, both set by the chain on the same day — is the comparison this source exists for.

04product
POST/bookoff/v1/product

To watch the price rather than read it once, re-run step 1 on a schedule and keep previous_price_jpy with its date. It is BOOK-OFF's own prior price, so a change is a repricing event you did not have to infer. Measured prevalence: 18 of 223 rows carried one.

Nine credits for the 4 calls: search 3, product 2, product 2, product 2. Failed calls are free: a timeout, a block or a capacity error costs nothing.

request
curl -X POST https://api.reefapi.com/bookoff/v1/search \
  -H "x-api-key: $REEF_KEY" \
  -H "content-type: application/json" \
  -d '{"keyword":"ワンピース"}'
response envelope
{
  "ok": true,
  "data": { … },
  "meta": {
    "api": "bookoff",
    "endpoint": "search",
    "mode": "live",
    "latency_ms": …,
    "record_count": …
  },
  "error": null
}

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.

FieldWhat it isHow often it was filled
price_jpyWhat 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
conditionWhich 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_jpyThe 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_pctBOOK-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_dateBOOK-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
janThe thirteen-digit barcode BOOK-OFF prints for every item, book or not.6 of 6 detail records
isbn13The 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_stockHow 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_availableSet 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).

What is covered, and what BOOK-OFF simply does not publish

Every figure on this page was read off the live source in the run recorded for it, not estimated.

6,152,410 items in BOOK-OFF's own count on 2026-10-02

books 2,881,854, manga 420,838, magazines 118,669, CD 1,946,281, DVD and Blu-ray 739,409, games 45,359, plus 61,208 multi-volume sets on their own surface.

Japan only, in Japanese, one retailer

There is no seller field anywhere in this API because BOOK-OFF is the only seller.

Both offers for the same item

second-hand and new, as two prices on one item number, each labelled.

Coverage

Page size 30, 60 or 120 and exact; hard ceiling page 999, so 119,880 items is the deepest a single query reaches whatever its total. Narrow the query rather than paging further.

No condition grade

A second-hand item is marked 中古 and there is no A/B/C grade on the public page. If per-copy condition is your requirement, this source does not have it.

No per-shop price and no shop names

Store stock is a count of shops plus a per-prefecture breakdown, and BOOK-OFF states in its own words that in-shop prices differ from online prices.

No ISBN-10

BOOK-OFF prints one barcode; it is returned as the JAN and flagged as ISBN-13 when it genuinely is one. A derived ISBN-10 check digit would be our number, not BOOK-OFF's, so it is left null.

No trading-card category

cards are reachable by name only and are filed under the six existing genres.

One search parameter is published with a negative measurement

used_only on its own does not reduce the result count, and the API says so in the parameter description and again in the response.

What people build with BOOK-OFF Online

The jobs this data is most often used for.

3

endpoints

2/3

credits per call

01

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.

02

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.

03

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.

04

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.

What BOOK-OFF Online data costs

The cheapest call here is 2 credits, so $15/mo (Pro) buys 5,000 of them — $1.50 per 1,000 credits. Credits roll over and never expire, and failed or blocked calls are not charged.

Full pricing →
$0.67–$1.50 / 1,000 credits
  • 1,000 free credits on signup, no card
  • One key, all 438 APIs, one credit pool
  • Failed and blocked calls are never charged
  • Credits roll over and never expire

Call it in two lines

Sign up, get 1,000 credits and one key that works on every engine. Then this is the whole protocol.

curl
curl -X POST https://api.reefapi.com/bookoff/v1/search \
  -H "x-api-key: $REEF_KEY" \
  -H "content-type: application/json" \
  -d '{"keyword":"ワンピース"}'
python
import requests

r = requests.post(
    "https://api.reefapi.com/bookoff/v1/search",
    headers={"x-api-key": REEF_KEY},
    json={
  "keyword": "ワンピース"
},
)
print(r.json()["data"])
FAQ

Have a question? We got answers.

The questions people actually ask before wiring up BOOK-OFF Online.

Get a free key →
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.

Need something this API does not do?

Name the endpoint, the field, or a source we do not carry yet. We ship new APIs every week and you would be first to get the key. Real people read every message and reply the same day.

0/4000

No account needed · we reply from [email protected]

Try it on your own data before you pay anything

The call above is the real endpoint, not a recording. A free key gives you 1,000 credits, the other 437 APIs, and the same envelope everywhere.

Endpoints, parameters and credit costs on this page are read from the live catalog and cannot drift from what the API accepts. Field notes were captured on 2026-10-02.