# World of Books API — live data from wob.com / worldofbooks.com, the UK's largest second-hand bookseller (Coventry; over 100 million books rehomed, ships to 66 countries). Search roughly 8 million used and new books by keyword, ISBN, author, publisher, category, binding, language, publication year, price and condition, then open one edition for every physical COPY on the shelf: World of Books' own grade (New, Like New, Very Good, Good, Well Read), its own price, which warehouse it sits in and whether it can be bought right now. ISBN-10 and ISBN-13 are first-class keys, and up to 20 ISBNs can be looked up in a single call. Two storefronts with separate catalogues and currencies: United Kingdom (GBP) and United States (USD). No login, no API key.

> Search the World of Books catalogue of one storefront. Free text over title, author, publisher and both ISBNs, plus filters on author, publisher, the store's own three-level category tree, cosmetic condition, binding, language, product type, publication year, price and stock depth, and four sort orders. One row per EDITION (one barcode) carrying the identifiers a book buyer actually keys on — ISBN-13 AND ISBN-10 as separate fields — plus the author, publisher, publication year, binding, language, the full category path, the cheapest live price in that storefront's currency, the list price, which of the five conditions are in stock, a real unit count and the store's own sales rank. Every filter offered here was measured against an unfiltered call in the same run and really changes the result; filters the source accepts and then ignores are not exposed, and the engine re-checks the returned rows against the filter you asked for and reports any disagreement in meta.warnings instead of letting it pass. The result window is 1,000 records per query and the engine says so rather than looping past it.
> ReefAPI engine `worldofbooks` · 4 endpoints · clean JSON, no scraping or browsers to manage.

## How to call
- **Endpoint:** `POST https://api.reefapi.com/worldofbooks/v1/<action>` with a JSON body.
- **Auth:** header `x-api-key: <YOUR_REEFAPI_KEY>` — create one free (1,000 credits, no card): https://reefapi.com/signup
- **Response (every call):** `{ ok: boolean, data: ..., meta: { record_count, credits, ... }, error: { code, message } }` — branch on `ok`. Failed calls are free except verified SHEIN NOT_FOUND on product/detail and price (4 credits).
- **One key + one shared credit pool** across every ReefAPI API. Per-call credits are listed on each endpoint below.
- **Use it from an AI agent (MCP):** connect `https://api.reefapi.com/mcp` (remote streamable-http). Send the key as `Authorization: Bearer <key>`, or put it in the URL (`?key=<key>`) when the client has no header field, as ChatGPT does.

## Endpoints

### POST https://api.reefapi.com/worldofbooks/v1/search — 1 credit
Search the World of Books catalogue of one storefront. Free text over title, author, publisher and both ISBNs, plus filters on author, publisher, the store's own three-level category tree, cosmetic condition, binding, language, product type, publication year, price and stock depth, and four sort orders. One row per EDITION (one barcode) carrying the identifiers a book buyer actually keys on — ISBN-13 AND ISBN-10 as separate fields — plus the author, publisher, publication year, binding, language, the full category path, the cheapest live price in that storefront's currency, the list price, which of the five conditions are in stock, a real unit count and the store's own sales rank. Every filter offered here was measured against an unfiltered call in the same run and really changes the result; filters the source accepts and then ignores are not exposed, and the engine re-checks the returned rows against the filter you asked for and reports any disagreement in meta.warnings instead of letting it pass. The result window is 1,000 records per query and the engine says so rather than looping past it.

**Parameters:**
- `market` (enum, required, default "uk") — Which World of Books storefront to read. This is NOT a language switch: the two storefronts are two separate catalogues with their own prices, their own stock and their own editions. Measured on 2026-10-08 for ISBN 9781408855652, the UK store published GBP 3.70 over 1,855 units while the US store published USD 3.48 over 875, and a keyword search for 'harry potter' returned the UK 'Philosopher's Stone' on one and the US 'Sorcerer's Stone' on the other. These are the only two storefronts the site publishes (its own hreflang list is en-GB and en-US); the 66 countries World of Books ships to are served from one of them. [one of: uk, us]
- `query` (string, optional) — Free-text search over title, author, publisher and both ISBNs. An ISBN works as a query and resolves to exactly one record (measured: 9781408855652 -> 1 hit, and its ISBN-10 1408855658 -> the same 1 hit). Leave it out to browse the whole catalogue with filters only. A query that matches nothing returns an honest empty answer with the source's own total of 0, not an error.
- `author` (string, optional) — Keep only this author, matched against the catalogue's own author string, which is normalised and sometimes abbreviated ('Jk Rowling', 'Cgp Books', 'Various'). Use `categories` to read the exact spellings with their counts. Measured on the UK store in one run: 'Jk Rowling' cut 7,173,373 records to 388.
- `publisher` (string, optional) — Keep only this publisher, as the catalogue spells it — the IMPRINT, not the group: 'Penguin Books Ltd' (309,931 records), 'Hodder Paperbacks', 'Scribner'. The product page itself often names the parent group instead ('Simon & Schuster' for a Scribner title, measured on 8 of 30 products), so use the value this filter and `publisher` in the rows give you. Measured: 'Penguin' cut the UK catalogue to 1,372 records, which is why the exact imprint matters.
- `category` (string, optional) — Keep only this branch of World of Books' own three-level category tree. Pass one level exactly as the source writes it: 'Fiction Books', 'Fiction Books > Modern Fiction', or 'Non-Fiction Books > Biography and True Stories > Biography: general'. The depth is taken from the number of ' > ' separators. Measured on the UK store: 'Fiction Books' 1,979,203 records, 'Fiction Books > Modern Fiction' 577,395. `categories` returns the whole tree with its counts.
- `condition` (enum, optional) — Keep only editions with at least one copy in this cosmetic grade. These are World of Books' own five grades in its own order, carried verbatim and never remapped. Measured on the UK store against 7,173,373 unfiltered records in the same run: NEW 5,950,961, WELL_READ 1,633,679; the index's facet counts for the same day were VERY_GOOD 7,992,943, NEW 4,766,521, GOOD 1,621,381, WELL_READ 1,495,895, LIKE_NEW 354,420. It filters EDITIONS, not copies: use `detail` to see which copy in which grade carries which price. [one of: NEW, LIKE_NEW, VERY_GOOD, GOOD, WELL_READ]
- `format` (enum, optional) — Binding, in the catalogue's own words. Only these two have a real count on the live index (Paperback 6,006,141, Hardback 1,895,749). Note the vocabulary split: the product page says 'Hardcover' for what the catalogue calls 'Hardback' (measured on 7 of 30 products) — `detail` returns the catalogue word as `format` and the page's word as `format_raw` rather than picking one silently. Measured bite on the UK store: 7,173,373 -> 1,716,351 for Hardback. [one of: Paperback, Hardback]
- `language` (string, optional) — Keep only books in this language, as the catalogue names it. English dominates (5,230,100 records) but the non-English shelf is real and measurable: French 16,764, Welsh 10,549, Spanish 6,313, German 4,156, Italian 2,926. Measured bite on the UK store in one run: 'French' cut 7,173,373 records to 37,091. Any other language the index carries is accepted; an unknown one returns an honest 0. [one of: English, French, Welsh, Spanish, German, Italian]
- `product_type` (enum, optional) — World of Books is overwhelmingly books, but it also resells discs and games: Book 8,222,289 records, Music 1,351, DVD 785, Games 168 on 2026-10-08. On a non-book the two ISBN keys hold something else — the catalogue puts an EAN or UPC in the ISBN-13 slot and an Amazon ASIN in the ISBN-10 slot — so this engine publishes those as `barcode_ean` and `asin` and leaves `isbn13`/`isbn10` null rather than passing a UPC off as an ISBN. [one of: Book, DVD, Music, Games]
- `year_min` (integer, optional) — Earliest publication year. Measured on the UK store: 7,173,373 records -> 3,974,346 at year_min 2020 and 611,245 for the single year 2024. Beware the source's own edges: the live index's year statistics run from 1 to 9999, so a handful of records carry a junk year — this engine publishes a year only when it is between 1400 and next year and keeps the raw value in `year_published_raw`.
- `year_max` (integer, optional) — Latest publication year, same scale as `year_min`. Use both for a window.
- `min_price` (number, optional) — Lowest from-price, in the storefront's own currency and MAJOR units (20 = GBP 20 on `uk`, USD 20 on `us`). It filters on the cheapest copy of an edition, which is the number `from_price` returns. Measured on the UK store: 65,501 records at min_price 50 out of 6.7 M.
- `max_price` (number, optional) — Highest from-price, same units. Measured on the UK store: 533 records at max_price 3 — the catalogue floor sits just under GBP 2 (the index's own price statistics on 2026-10-08: min 1.99, mean 7.92, max 1,050).
- `min_stock` (integer, optional) — Keep only editions with at least this many physical copies on hand. World of Books publishes a real unit count per edition, not an in-stock flag — the measured sample ran from single copies to 1,855 for one Harry Potter printing. Measured bite on the UK store: 790,215 records at min_stock 100.
- `sort` (enum, optional, default "relevance") — Row order. Only these four exist: the storefront's theme advertises thirteen sort options, but probing every one of them on both storefronts on 2026-10-08 found that only the base ranking and these three have a live index behind them — the other nine answer 'index does not exist'. The missing ones are not offered here rather than failing at call time. [one of: relevance, price_asc, price_desc, title_asc]
- `page` (integer, optional, default 1) — 1-based page. The source's result window is 1,000 records per query, so `page` x `per_page` must stay at or below 1,000 — at 50 per page that is page 20. Going past it is rejected with the exact maximum for your page size, because the source answers an out-of-window page with HTTP 200 and an empty body that looks like a legitimate end-of-results. Narrow with a filter or sort by price to reach deeper stock.
- `per_page` (integer, optional, default 20) — Rows per page, 1-100. Measured payload: 20 rows = 25.6 KB, 100 rows = 118.7 KB.
- `include_pii` (boolean, optional, default false) — Accepted for gateway compatibility. There is no personal data on this source: World of Books Group is the only seller, it is a company, and it is returned in full on every response.

**Returns:** books[]{isbn13, isbn10, isbn10_derived, barcode_ean, asin, title, full_title, catalogue_title, author, publisher, year_published, year_published_raw, date_published, date_published_raw, format, languages[], product_type, series, genre_code, reading_age, categories[], category_path, category_lvl0, from_price, best_condition_price, list_price, list_price_usd|list_price_gbp (the OTHER market's list price, when the source has it), currency, currency_symbol, price_bands[], available_conditions[], condition_count, in_stock, stock_quantity, stock_level, has_used_copies, has_new_copies, stocked_in_uk, stocked_in_us, sales_rank, review_rating, review_count, image_url, handle, url, product_id, edition_family, market, detail_params{market, handle} (+ director/artist/platform/console/region_code on discs and games)} + seller{} + meta{market, country, currency, total_estimate, total_is_estimate, returned, page, per_page, pages_available, result_window, max_page, has_more, sort, filters_applied{}, filter_check{}, price_range{min,max}}

**Example request body:**
```json
{
  "market": "uk",
  "query": "dune",
  "per_page": 20,
  "sort": "price_asc"
}
```

### POST https://api.reefapi.com/worldofbooks/v1/detail — 3 credits
Everything World of Books publishes about one edition on one storefront, read from the product page itself and from the catalogue record behind it. The bibliography is complete: ISBN-13, ISBN-10, title, author, publisher and the publishing group, binding, PAGE COUNT, publication date, language, the full category breadcrumb, the series, the publisher's list price and the description the store prints. Then the part no catalogue page gives you in one object: every physical COPY on the shelf as its own row — World of Books' grade (New, Like New, Very Good, Good, Well Read), that copy's own price, whether it can be bought, which country's warehouse holds it and which supply route it came in on — with a cheapest-price-per-grade summary on top. Each copy's price is cross-checked against the page's own published offer for the same SKU and the agreement is published, and a copy with no price is returned as null rather than as 0.00. Takes the `handle` every search row hands you, or an ISBN-10/ISBN-13.

**Parameters:**
- `market` (enum, required, default "uk") — Which World of Books storefront to read. This is NOT a language switch: the two storefronts are two separate catalogues with their own prices, their own stock and their own editions. Measured on 2026-10-08 for ISBN 9781408855652, the UK store published GBP 3.70 over 1,855 units while the US store published USD 3.48 over 875, and a keyword search for 'harry potter' returned the UK 'Philosopher's Stone' on one and the US 'Sorcerer's Stone' on the other. These are the only two storefronts the site publishes (its own hreflang list is en-GB and en-US); the 66 countries World of Books ships to are served from one of them. [one of: uk, us]
- `handle` (string, optional) — The product's own url slug. Every `search` and `isbn` row returns it as `handle` and as a ready-made `detail_params`. Either `handle` or `isbn` is required; `handle` is one request cheaper because it needs no lookup.
- `isbn` (string, optional) — An ISBN-13 or an ISBN-10, with or without dashes and spaces. An ISBN-10 is converted arithmetically to the ISBN-13 the catalogue is keyed on (verified live: 1408855658 and 9781408855652 resolve to the same record). A 13-digit non-ISBN barcode is accepted too, which is how a DVD or CD is looked up. The check digit is verified before the call, so a typo is rejected rather than answered with NOT_FOUND. Either `handle` or `isbn` is required.
- `include_pii` (boolean, optional, default false) — Accepted for gateway compatibility. There is no personal data on this source: World of Books Group is the only seller, it is a company, and it is returned in full on every response.

**Returns:** isbn13, isbn10, barcode_ean, asin, title, subtitle, author, publisher, publisher_group, format, format_raw, pages, date_published, year_published, languages[], description, categories[], category_path, breadcrumbs[], series, genre_code, reading_age, images[], image_url, handle, url, product_id, product_type, market, country, currency, list_price, catalogue_from_price, stock_quantity, sales_rank, review_rating, review_count, free_shipping_over, seller{}, copies[]{sku, condition, condition_label, condition_rank, is_new, price, price_minor, currency, price_missing, available, ships_from, ships_from_country, held_in_market, supply_route, supply_route_label, weight_grams, barcode, variant_id, url, page_price, page_availability, page_price_agrees}, summary{copy_count, available_copy_count, conditions_in_stock[], price_by_condition{}, cheapest_price, cheapest_condition, cheapest_sku, price_range{min,max}, copies_held_in_market, copies_held_abroad, supply_routes[]} + meta{placeholder_variants_dropped, page_price_disagreements, catalogue_price_matches_page}

**Example request body:**
```json
{
  "market": "uk",
  "handle": "harry-potter-and-the-philosopher-s-stone-book-jk-rowling-9781408855652"
}
```

### POST https://api.reefapi.com/worldofbooks/v1/isbn — 1 credit
Look up to 20 ISBNs up in ONE request — the fastest way to price a shelf, a reading list or a whole wishlist against the UK's biggest second-hand bookseller. ISBN-13, ISBN-10 and 13-digit barcodes may be mixed; every ISBN-10 is converted arithmetically to the ISBN-13 the catalogue is keyed on, and every check digit is verified before the call so a typo comes back as a rejected input rather than as a missing book. The answer keeps your order and separates the three outcomes you care about: found, not carried by this storefront, and not a valid ISBN. Each found row is the full catalogue record — title, author, publisher, year, binding, language, categories, the cheapest live price, the list price, which of the five conditions are in stock and how many physical copies there are.

**Parameters:**
- `market` (enum, required, default "uk") — Which World of Books storefront to read. This is NOT a language switch: the two storefronts are two separate catalogues with their own prices, their own stock and their own editions. Measured on 2026-10-08 for ISBN 9781408855652, the UK store published GBP 3.70 over 1,855 units while the US store published USD 3.48 over 875, and a keyword search for 'harry potter' returned the UK 'Philosopher's Stone' on one and the US 'Sorcerer's Stone' on the other. These are the only two storefronts the site publishes (its own hreflang list is en-GB and en-US); the 66 countries World of Books ships to are served from one of them. [one of: uk, us]
- `isbns` (array, required) — Up to 20 ISBNs in ONE call — ISBN-13, ISBN-10 or a 13-digit barcode, mixed freely, with or without dashes. Every ISBN-10 is converted to its ISBN-13 before the lookup. The answer keeps your order, tells you which ISBNs the catalogue does not have, and returns the full catalogue record for the ones it does: title, author, publisher, year, binding, the conditions in stock, the cheapest price in that storefront's currency and the unit count.
- `include_pii` (boolean, optional, default false) — Accepted for gateway compatibility. There is no personal data on this source: World of Books Group is the only seller, it is a company, and it is returned in full on every response.

**Returns:** books[]{isbn13, isbn10, isbn10_derived, barcode_ean, asin, title, full_title, catalogue_title, author, publisher, year_published, year_published_raw, date_published, date_published_raw, format, languages[], product_type, series, genre_code, reading_age, categories[], category_path, category_lvl0, from_price, best_condition_price, list_price, list_price_usd|list_price_gbp (the OTHER market's list price, when the source has it), currency, currency_symbol, price_bands[], available_conditions[], condition_count, in_stock, stock_quantity, stock_level, has_used_copies, has_new_copies, stocked_in_uk, stocked_in_us, sales_rank, review_rating, review_count, image_url, handle, url, product_id, edition_family, market, detail_params{market, handle} (+ director/artist/platform/console/region_code on discs and games)}, not_found[]{isbn, lookup_key}, invalid[]{isbn, reason} + meta{market, currency, requested, found, not_found, invalid}

**Example request body:**
```json
{
  "market": "uk",
  "isbns": [
    "9781408855652",
    "9780441172719"
  ]
}
```

### POST https://api.reefapi.com/worldofbooks/v1/categories — 1 credit
The shape of the catalogue in one request: World of Books' own three-level category tree with a record count on every node, plus the top authors, publishers, bindings, languages, product types, cosmetic conditions and price bands, and the live minimum, mean and maximum price. This is the resolver for `search` — it gives you the exact spellings the filters take ('Jk Rowling', 'Penguin Books Ltd', 'Non-Fiction Books > Lifestyle, Cooking and Leisure') so you never have to guess one. Narrow it with `query` or `category` to get the breakdown of a single search or a single branch. One honest caveat, measured and repeated in the response: these counts are index-wide while `search` runs behind the storefront's own hygiene rule, so a facet count is an upper bound on what a search will return (measured the same minute: in-stock facet 8,224,496, search total 7,173,373).

**Parameters:**
- `market` (enum, required, default "uk") — Which World of Books storefront to read. This is NOT a language switch: the two storefronts are two separate catalogues with their own prices, their own stock and their own editions. Measured on 2026-10-08 for ISBN 9781408855652, the UK store published GBP 3.70 over 1,855 units while the US store published USD 3.48 over 875, and a keyword search for 'harry potter' returned the UK 'Philosopher's Stone' on one and the US 'Sorcerer's Stone' on the other. These are the only two storefronts the site publishes (its own hreflang list is en-GB and en-US); the 66 countries World of Books ships to are served from one of them. [one of: uk, us]
- `query` (string, optional) — Optional. Restrict the counts to the editions matching this text, which turns `categories` into a 'what is this search made of' breakdown — top authors, publishers, bindings, languages and categories for one keyword in one request.
- `category` (string, optional) — Optional. Restrict the counts to one branch of the tree, so you get its sub-categories and its own top authors and publishers rather than the whole catalogue's.
- `top` (integer, optional, default 20) — How many values to return per facet (1-100, default 20). The category levels are always returned in full.
- `include_pii` (boolean, optional, default false) — Accepted for gateway compatibility. There is no personal data on this source: World of Books Group is the only seller, it is a company, and it is returned in full on every response.

**Returns:** category_tree[]{name, path, count, children[]}, conditions[]{value, label, count}, formats[]{value, count}, languages[]{value, count}, product_types[]{value, count}, authors[]{value, count}, publishers[]{value, count}, price_bands[]{value, count}, years[]{value, count}, price_stats{min, avg, max} + meta{market, currency, total_estimate, counts_are_index_wide}

**Example request body:**
```json
{
  "market": "uk",
  "top": 20
}
```

## At scale
- **Volume:** 5M+ requests a day, measured at 60 requests a second across the fleet with no
  central bottleneck. Per-key limits are raised for high-volume accounts; volume pricing on request.
- **Missing a source:** tell us a site we do not cover and it becomes an engine. A customer asked
  for bestprice.gr on 21 Sep 2026 and it was in the catalog on 22 Sep.
- **Support:** 2 minute median time from a question in the live chat to the first answer. Setup
  help included, no support tier to buy.
- **One key, one credit pool** across every API. No per-site plans, no separate subscriptions.

## More
- Try it live, no code: https://reefapi.com/playground?engine=worldofbooks
- Human docs page: https://reefapi.com/docs/worldofbooks
- Overview page: https://reefapi.com/worldofbooks-api
- Every ReefAPI API in one file (for your AI): https://reefapi.com/llms-full.txt
