# AbeBooks API — live data from abebooks.com, the world's marketplace for used, rare and out-of-print books (an Amazon company; tens of thousands of independent booksellers in 50+ countries, hundreds of millions of listings). Search the whole marketplace by keyword, title, author, publisher or ISBN with the dealers' own filters — signed, first edition, dust jacket, seller country, condition band, price, publication year, seller rating, listed-this-week — then open any ISBN for the COMPLETE ladder of competing seller offers: each copy's price, its shipping cost to the destination YOU name, its delivery window, the grade, the seller's own condition note, the shop's name, city, country and star rating, and the collectible attributes. Price and shipping are always separate fields, the currency is yours to choose, and nothing is quoted for a destination the API guessed.

> Search the marketplace. Every row is ONE SELLER'S COPY, not a product — the same edition appears once per bookseller offering it, which is the point of this source. Give at least one of `query`, `title`, `author`, `publisher` or `isbn`, then narrow with any of the dealers' own filters. Every filter here was measured against an unfiltered control and every one of them bites.
> ReefAPI engine `abebooks` · 6 endpoints · clean JSON, no scraping or browsers to manage.

## How to call
- **Endpoint:** `POST https://api.reefapi.com/abebooks/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/abebooks/v1/search — 3 credits
Search the marketplace. Every row is ONE SELLER'S COPY, not a product — the same edition appears once per bookseller offering it, which is the point of this source. Give at least one of `query`, `title`, `author`, `publisher` or `isbn`, then narrow with any of the dealers' own filters. Every filter here was measured against an unfiltered control and every one of them bites.

**Parameters:**
- `query` (string, optional) — Free text over the whole listing — title, author, publisher and the seller's own description. At least one of `query`, `title`, `author`, `publisher` or `isbn` is required, exactly as the source's own advanced search demands. Because it reaches the seller's description, it is also how you find the things only a bookseller writes: 'inscribed to', 'association copy', 'provenance', 'dust jacket chipped'.
- `title` (string, optional) — Title words only, which is how you avoid the keyword search matching an author's name or a seller's note. Measured: `author=herbert` with `title=dune` cut the catalogue to 9,489 listings.
- `author` (string, optional) — Author words. Sellers type the byline themselves, so it arrives in many shapes ('Herbert, Frank', 'Frank Herbert', 'HERBERT'); a surname is the reliable input.
- `publisher` (string, optional) — Publisher words, again seller-typed. Measured: `query=dune` plus `publisher=chilton` cut 779,501 listings to 67 — which for Dune is precisely the 1965 Chilton first edition and its relatives.
- `isbn` (string, optional) — Restrict the search to one ISBN, which turns `search` into the offer ladder for that edition. `detail` is the better call for that — it adds the agreed bibliographic record and the price summary — but this exists so you can combine an ISBN with the seller and condition filters in one request.
- `condition` (enum, optional) — Keep only copies in one of the source's own five condition BANDS. AbeBooks grades a copy on a nine-step ladder (New, As New, Fine, Near Fine, Very Good, Good, Fair, Poor, Unspecified) but it filters on bands, so these are the bands and the rows still carry the exact grade as `condition` plus the seller's own word for it as `seller_condition`. Note how large `unspecified` is (103,154 on one measured query): an antiquarian dealer often describes a copy in prose instead of picking a grade, and that prose is in `seller_note`. [one of: new, as_new_fine, very_good_good, fair_poor, unspecified]
- `seller_country` (enum, optional) — Keep only sellers in this country — the lever that actually controls what you pay to ship, because a copy in your own country is cheap to post and a copy abroad is not. These are the source's own two-letter codes, kept verbatim including its `uk` for the United Kingdom (`gb` is accepted and mapped). Measured bite: 779,501 listings -> 84,386 for `uk` and 263,033 for `de`, and 20 of 20 returned rows had the matching seller country. [one of: dz, ar, am, au, at, bb, be, br, bg, ca, cl, cn, cy, cz, dk, ee, fi, fr, ge, de, gr, gp, gu, hk, hu, in, ie, il, it, jp, kr, lv, lt, lu, mt, mx, nl, nz, no, pl, pt, ro, sg, si, za, es, se, ch, tw, th, tr, us, uk, uy]
- `seller_region` (enum, optional) — Same idea, one level up: keep only sellers in a whole region. The source offers both a European Union set and a wider Europe set, and they are not the same thing. Measured bite for `er`: 779,501 -> 647,445. [one of: ww, na, sa, eu, er, oc, as]
- `language` (string, optional) — Keep only this language, as the three-letter code the source keys on (ISO 639-2). Measured bite: `DEU` cut 779,501 listings to 4,432 and 20 of 20 returned rows were DEU. Any three-letter code the source carries is accepted; the ones listed here are the ones seen on live listings, and `language_name` in the rows is our expansion of the source's code, not something the source publishes. Be aware the source also emits a bare `N` on some listings (86 of 300 rows across six measured queries, 9 of 50 on one map search) — it is not an ISO code and carries no language, so it is passed through unchanged with `language_name: null` rather than guessed at. [one of: ENG, FRA, DEU, SPA, ITA, POR, NLD, RUS, JPN, ZHO, CHI, ARA, HEB, LAT, GRC, ELL, SWE, DAN, NOR, FIN, POL, CES, HUN, TUR, UKR, KOR, HIN, CAT, EUS, CYM, GLE, ISL, RON, BUL, HRV, SRP, SLV, SLK, LIT, LAV, EST, VIE, THA, IND, PER, FAS, SAN, ENM, FRM, ANG, EPO, MUL, UND]
- `binding` (enum, optional) — Hardcover or softcover. The source filters on these two classes but does NOT normalise what the seller typed: one measured `hardcover` page returned 'Hardback' 12 times, 'Hardcover' once, 'hardcover' twice and nothing at all 5 times across 20 rows. So the rows give you both — `binding` is the seller's own string and `binding_class` is the class this filter works on. [one of: hardcover, softcover]
- `product_type` (enum, optional) — AbeBooks sells more than books, because the dealers on it do: maps, manuscripts, art prints, photographs, periodicals, comics and sheet music all have their own filter and their own token on the listing. Measured bite on one query: 740,348 books, 2,647 sheet music, 444 maps. [one of: book, comic, mag, map, ms, music, art, photo]
- `signed` (boolean, optional) — Keep only copies the seller has flagged as signed. Measured bite: 779,501 listings -> 16,568. The rows separate `is_signed` from `is_inscribed` because the trade does: a signature and a dedication to a named person are different objects and different money, and `inscription` carries the seller's own words.
- `first_edition` (boolean, optional) — Keep only copies flagged as a first edition. Measured bite: -> 37,871. It is the seller's claim, not a verified fact, and `edition` carries whatever the seller typed ('1st Edition', 'First Edition.', '1. Auflage', '1ère édition.').
- `dust_jacket` (boolean, optional) — Keep only copies with a dust jacket — for a 20th-century hardback the jacket is often most of the value. Measured bite: -> 11,485. Where the seller graded the jacket separately, the row carries `jacket_condition`.
- `with_photos` (boolean, optional) — Keep only copies the seller photographed, i.e. a picture of THIS copy rather than a stock cover. Measured bite: -> 490,759. On antiquarian queries the proportion is far higher (138 of 150 sampled rare listings had seller photos).
- `exclude_print_on_demand` (boolean, optional) — Drop print-on-demand reprints, which otherwise flood a search for an out-of-copyright title with new-made copies of a scan. Measured bite: -> 444,264, and on a narrow query 6,319 -> 4,883. Note the honest gap this exposes: the filter clearly knows which listings are print-on-demand, but the LISTING only ever published the negative assertion — `NOT_PRINT_ON_DEMAND` appeared on 550 of 550 sampled rows and no positive marker was ever seen. So `is_print_on_demand` on a row is `false` when the source asserts it and `null` when the source says nothing; use this filter rather than the row flag to exclude them.
- `free_shipping_to` (enum, optional) — Keep only listings that ship free to one of the two destinations the source offers this filter for. Measured bite for `us`: 779,501 -> 102,649. For any other destination there is no such filter, so read `free_shipping` on the rows instead — this engine does not invent a filter the source does not have. [one of: us, de]
- `min_seller_rating` (integer, optional) — Keep only sellers rated at least this many stars out of five. The source offers 2, 3, 4 and 5 — there is no 1, because that is everybody. Measured bite: 779,501 -> 658,104 at 5 stars and 777,672 at 2.
- `min_price` (number, optional) — Lowest BOOK price, in the currency you asked for and in major units. It filters the book price, not the total — add `sort=total_price_asc` if what you care about is landed cost.
- `max_price` (number, optional) — Highest BOOK price, same units. Measured bite: 779,501 listings -> 14,170 at 5.
- `year_min` (integer, optional) — Earliest publication year, as the seller typed it. Measured bite: the window 1965-1970 cut 779,501 listings to 9,074. Sellers of antiquarian material do sometimes leave the year empty (32 of 400 sampled rows), and those rows cannot satisfy a year filter.
- `year_max` (integer, optional) — Latest publication year, same scale as `year_min`.
- `listed_within` (enum, optional) — Keep only listings added in the last N days — the one way to watch what is coming ONTO the market rather than what is sitting on it. Measured bite for `7day`: 779,501 -> 4,260. [one of: 1day, 2day, 3day, 5day, 7day, 10day, 14day, 21day, 30day, 60day, 90day]
- `sort` (enum, optional, default "relevance") — Row order. All twelve of the source's own sorts are offered, and the one worth knowing about is `total_price_asc`: it sorts by price PLUS shipping to your destination, which on this marketplace routinely reorders the ladder completely. [one of: relevance, price_asc, price_desc, total_price_asc, newest, seller_rating_desc, title_asc, title_desc, year_asc, year_desc, author_asc, author_desc]
- `page` (integer, optional, default 1) — 1-based page. The source's result window is 1800 listings per query, so `page` x `per_page` must stay at or below that — at 50 per page the last readable page is 36. Past it the source answers HTTP 200 with an empty page that looks exactly like the end of the results (measured: a full page at offset 1,780, zero rows at 1,800, 2,000, 5,000, 10,000 and 20,000), which is why this is rejected here with the real maximum instead. Narrow with a filter to reach deeper.
- `per_page` (integer, optional, default 20) — Listings per page, 1-100. The source renders its whole page per request, so a bigger page is cheaper per row but heavier per call: measured payloads are 430 KB at 10 rows, 742 KB at 30, 1.06 MB at 50 and 1.86 MB at 100.
- `currency` (enum, optional, default "USD") — Which currency to quote every price and every shipping cost in. AbeBooks converts for you — a seller's own list currency is never published on this surface, so every number you get back is a conversion and every row says so. Only these twelve work: probing nineteen codes on 2026-10-08 found that JPY, MXN, TRY, ZAR, BRL and INR are answered in USD with HTTP 200 and no warning, so an unsupported code is rejected here instead of being silently re-priced. Measured on one listing in one minute: USD 2.20 / GBP 1.71 / EUR 2.02 / CAD 3.23 / CZK 49.23. [one of: USD, GBP, EUR, CAD, AUD, CHF, DKK, SEK, NOK, NZD, PLN, CZK]
- `ship_to` (enum, optional, default "USA") — 🔴 THE MOST IMPORTANT PARAMETER ON THIS API. Shipping is quoted per destination, and AbeBooks guesses the destination from the caller's own network when nothing pins it — so this engine always pins it and always tells you which one it used. Measured on ONE listing in ONE minute, book price USD 2.20 throughout: shipping was USD 4.69 to the U.S.A., 40.00 to the United Kingdom, 35.00 to Turkey, 45.00 to Japan and 45.00 to Australia. On that listing the cheapest shipping is DOUBLE the price of the book, which is why `price` and `shipping_price` are separate fields and `total_price` is the one to sort on. ISO-3166 alpha-3; 107 codes were confirmed accepted by the source's own echo, and an unknown code is rejected here because the source answers it with the U.S.A. rate card and no warning. [one of: USA, GBR, CAN, AUS, NZL, IRL, DEU, FRA, ITA, ESP, PRT, NLD, BEL, LUX, CHE, AUT, DNK, SWE, NOR, FIN, ISL, POL, CZE, SVK, HUN, ROU, BGR, GRC, HRV, SVN, EST, LVA, LTU, MLT, CYP, TUR, RUS, UKR, ISR, ARE, SAU, QAT, KWT, ZAF, EGY, MAR, NGA, KEN, IND, PAK, BGD, LKA, CHN, HKG, TWN, JPN, KOR, SGP, MYS, THA, VNM, IDN, PHL, MEX, BRA, ARG, CHL, COL, PER, URY, CRI, PAN, JAM, BRB, TTO, VEN, ECU, BOL, PRY, GTM, SRB, BIH, MKD, ALB, MDA, GEO, ARM, AZE, KAZ, MNG, NPL, KHM, LAO, MMR, BHR, OMN, JOR, LBN, TUN, DZA, GHA, TZA, UGA, ZWE, MUS, FJI, PNG]
- `include_pii` (boolean, optional, default false) — Accepted for gateway compatibility. The seller block is a business identity — shop name, city, country, rating and storefront link — and carries no address, phone number or e-mail, so nothing is withheld either way. Some AbeBooks sellers are one-person shops trading under a personal name; that name is the trading name the marketplace itself publishes.

**Returns:** offers[]{listing_id, seller_sku, url, copies_available, title, author, authors[], illustrator, publisher, publish_year, edition, binding, binding_class, language, language_name, isbn13, isbn10, isbn_missing, barcode_ean (only when the code is not a Bookland ISBN), product_type, condition, condition_label, condition_rank, seller_condition, seller_note, jacket, jacket_condition, inscription, price, price_missing, shipping_price, free_shipping, total_price, currency, currency_symbol, ships_to, ships_to_country, shipping_options[]{price, currency, min_delivery_days, max_delivery_days}, is_first_edition, is_signed, is_inscribed, has_dust_jacket, is_rare, is_print_on_demand, has_seller_photos, attribute_codes[], images[], image_is_sellers_own, catalog_image, seller{id, name, city, state, country, country_name, rating_stars, rating_scale, storefront_url, contact_url, associations[], catalogs[]}, series{id, title, position, books_in_series, url}, listing_params{listing_id}}, summary{the price ladder on this page} + meta{total_estimate, total_is_estimate, page, per_page, max_page, currency, ship_to, filters_applied, source_url}

**Example request body:**
```json
{
  "query": "dune frank herbert",
  "per_page": 20,
  "sort": "total_price_asc",
  "currency": "USD",
  "ship_to": "USA"
}
```

### POST https://api.reefapi.com/abebooks/v1/detail — 3 credits
One ISBN, every seller offering it. This is the flagship call: the complete competing-offer ladder for an edition, with the price and the shipping cost kept apart, the landed total computed, the bibliographic record the sellers agree on, every spelling they disagree about, and a price summary over the page. Measured on ISBN 9780441172719: 129 offers from sellers in 20 countries, book prices from USD 2.20, shipping from 0.00 to 5.50 within the U.S.A. and 31 to 75 to the United Kingdom.

**Parameters:**
- `isbn` (string, required) — An ISBN-13 or an ISBN-10, dashes and spaces optional. The ISBN-10 is converted arithmetically to the ISBN-13 the source is keyed on (verified live: 0441172717 and 9780441172719 return the same 129 offers). The check digit is verified before the call, so a typo is rejected rather than answered with an empty result. A 13-digit non-Bookland barcode is accepted too. Remember that a book printed before about 1970 HAS no ISBN — for those, search by `title` and `author`.
- `condition` (enum, optional) — Keep only copies in one of the source's own five condition BANDS. AbeBooks grades a copy on a nine-step ladder (New, As New, Fine, Near Fine, Very Good, Good, Fair, Poor, Unspecified) but it filters on bands, so these are the bands and the rows still carry the exact grade as `condition` plus the seller's own word for it as `seller_condition`. Note how large `unspecified` is (103,154 on one measured query): an antiquarian dealer often describes a copy in prose instead of picking a grade, and that prose is in `seller_note`. [one of: new, as_new_fine, very_good_good, fair_poor, unspecified]
- `seller_country` (enum, optional) — Keep only sellers in this country — the lever that actually controls what you pay to ship, because a copy in your own country is cheap to post and a copy abroad is not. These are the source's own two-letter codes, kept verbatim including its `uk` for the United Kingdom (`gb` is accepted and mapped). Measured bite: 779,501 listings -> 84,386 for `uk` and 263,033 for `de`, and 20 of 20 returned rows had the matching seller country. [one of: dz, ar, am, au, at, bb, be, br, bg, ca, cl, cn, cy, cz, dk, ee, fi, fr, ge, de, gr, gp, gu, hk, hu, in, ie, il, it, jp, kr, lv, lt, lu, mt, mx, nl, nz, no, pl, pt, ro, sg, si, za, es, se, ch, tw, th, tr, us, uk, uy]
- `seller_region` (enum, optional) — Same idea, one level up: keep only sellers in a whole region. The source offers both a European Union set and a wider Europe set, and they are not the same thing. Measured bite for `er`: 779,501 -> 647,445. [one of: ww, na, sa, eu, er, oc, as]
- `min_seller_rating` (integer, optional) — Keep only sellers rated at least this many stars out of five. The source offers 2, 3, 4 and 5 — there is no 1, because that is everybody. Measured bite: 779,501 -> 658,104 at 5 stars and 777,672 at 2.
- `sort` (enum, optional, default "relevance") — Row order. All twelve of the source's own sorts are offered, and the one worth knowing about is `total_price_asc`: it sorts by price PLUS shipping to your destination, which on this marketplace routinely reorders the ladder completely. [one of: relevance, price_asc, price_desc, total_price_asc, newest, seller_rating_desc, title_asc, title_desc, year_asc, year_desc, author_asc, author_desc]
- `page` (integer, optional, default 1) — 1-based page. The source's result window is 1800 listings per query, so `page` x `per_page` must stay at or below that — at 50 per page the last readable page is 36. Past it the source answers HTTP 200 with an empty page that looks exactly like the end of the results (measured: a full page at offset 1,780, zero rows at 1,800, 2,000, 5,000, 10,000 and 20,000), which is why this is rejected here with the real maximum instead. Narrow with a filter to reach deeper.
- `per_page` (integer, optional, default 20) — Listings per page, 1-100. The source renders its whole page per request, so a bigger page is cheaper per row but heavier per call: measured payloads are 430 KB at 10 rows, 742 KB at 30, 1.06 MB at 50 and 1.86 MB at 100.
- `currency` (enum, optional, default "USD") — Which currency to quote every price and every shipping cost in. AbeBooks converts for you — a seller's own list currency is never published on this surface, so every number you get back is a conversion and every row says so. Only these twelve work: probing nineteen codes on 2026-10-08 found that JPY, MXN, TRY, ZAR, BRL and INR are answered in USD with HTTP 200 and no warning, so an unsupported code is rejected here instead of being silently re-priced. Measured on one listing in one minute: USD 2.20 / GBP 1.71 / EUR 2.02 / CAD 3.23 / CZK 49.23. [one of: USD, GBP, EUR, CAD, AUD, CHF, DKK, SEK, NOK, NZD, PLN, CZK]
- `ship_to` (enum, optional, default "USA") — 🔴 THE MOST IMPORTANT PARAMETER ON THIS API. Shipping is quoted per destination, and AbeBooks guesses the destination from the caller's own network when nothing pins it — so this engine always pins it and always tells you which one it used. Measured on ONE listing in ONE minute, book price USD 2.20 throughout: shipping was USD 4.69 to the U.S.A., 40.00 to the United Kingdom, 35.00 to Turkey, 45.00 to Japan and 45.00 to Australia. On that listing the cheapest shipping is DOUBLE the price of the book, which is why `price` and `shipping_price` are separate fields and `total_price` is the one to sort on. ISO-3166 alpha-3; 107 codes were confirmed accepted by the source's own echo, and an unknown code is rejected here because the source answers it with the U.S.A. rate card and no warning. [one of: USA, GBR, CAN, AUS, NZL, IRL, DEU, FRA, ITA, ESP, PRT, NLD, BEL, LUX, CHE, AUT, DNK, SWE, NOR, FIN, ISL, POL, CZE, SVK, HUN, ROU, BGR, GRC, HRV, SVN, EST, LVA, LTU, MLT, CYP, TUR, RUS, UKR, ISR, ARE, SAU, QAT, KWT, ZAF, EGY, MAR, NGA, KEN, IND, PAK, BGD, LKA, CHN, HKG, TWN, JPN, KOR, SGP, MYS, THA, VNM, IDN, PHL, MEX, BRA, ARG, CHL, COL, PER, URY, CRI, PAN, JAM, BRB, TTO, VEN, ECU, BOL, PRY, GTM, SRB, BIH, MKD, ALB, MDA, GEO, ARM, AZE, KAZ, MNG, NPL, KHM, LAO, MMR, BHR, OMN, JOR, LBN, TUN, DZA, GHA, TZA, UGA, ZWE, MUS, FJI, PNG]
- `include_pii` (boolean, optional, default false) — Accepted for gateway compatibility. The seller block is a business identity — shop name, city, country, rating and storefront link — and carries no address, phone number or e-mail, so nothing is withheld either way. Some AbeBooks sellers are one-person shops trading under a personal name; that name is the trading name the marketplace itself publishes.

**Returns:** book{title, author, publisher, publish_year, language, isbn13, isbn10, series, catalog_image, *_variants for every field the sellers spell differently}, offers[]{listing_id, seller_sku, url, copies_available, title, author, authors[], illustrator, publisher, publish_year, edition, binding, binding_class, language, language_name, isbn13, isbn10, isbn_missing, barcode_ean (only when the code is not a Bookland ISBN), product_type, condition, condition_label, condition_rank, seller_condition, seller_note, jacket, jacket_condition, inscription, price, price_missing, shipping_price, free_shipping, total_price, currency, currency_symbol, ships_to, ships_to_country, shipping_options[]{price, currency, min_delivery_days, max_delivery_days}, is_first_edition, is_signed, is_inscribed, has_dust_jacket, is_rare, is_print_on_demand, has_seller_photos, attribute_codes[], images[], image_is_sellers_own, catalog_image, seller{id, name, city, state, country, country_name, rating_stars, rating_scale, storefront_url, contact_url, associations[], catalogs[]}, series{id, title, position, books_in_series, url}, listing_params{listing_id}}, summary{price ladder} + meta{isbn13, total_offers, total_is_estimate, page, per_page, max_page, currency, ship_to}

**Example request body:**
```json
{
  "isbn": "9780441172719",
  "per_page": 20,
  "sort": "total_price_asc",
  "currency": "GBP",
  "ship_to": "GBR"
}
```

### POST https://api.reefapi.com/abebooks/v1/listing — 2 credits
One seller's copy in full, by `listing_id`. Adds what the ladder does not carry: every photograph the bookseller took of THIS copy, the item's size and weight, the publisher's own synopsis of the work, the work's reader rating, and the shop's founding date and accepted payment methods. Note that the seller rating on this page is a PERCENTAGE while the search surface publishes STARS out of five (measured: vendor 61505917 reads 98 here and 5 there) — both are returned under their own name and the row says which scale it is.

**Parameters:**
- `listing_id` (integer, required) — One seller's copy, by the id every `search` / `detail` row returns as `listing_id`. This is the only call that adds the things the ladder does not carry: every photograph the seller uploaded, the item's size and weight, the publisher's own synopsis of the work, the shop's founding date and the payment methods it accepts.
- `currency` (enum, optional, default "USD") — Which currency to quote every price and every shipping cost in. AbeBooks converts for you — a seller's own list currency is never published on this surface, so every number you get back is a conversion and every row says so. Only these twelve work: probing nineteen codes on 2026-10-08 found that JPY, MXN, TRY, ZAR, BRL and INR are answered in USD with HTTP 200 and no warning, so an unsupported code is rejected here instead of being silently re-priced. Measured on one listing in one minute: USD 2.20 / GBP 1.71 / EUR 2.02 / CAD 3.23 / CZK 49.23. [one of: USD, GBP, EUR, CAD, AUD, CHF, DKK, SEK, NOK, NZD, PLN, CZK]
- `ship_to` (enum, optional, default "USA") — 🔴 THE MOST IMPORTANT PARAMETER ON THIS API. Shipping is quoted per destination, and AbeBooks guesses the destination from the caller's own network when nothing pins it — so this engine always pins it and always tells you which one it used. Measured on ONE listing in ONE minute, book price USD 2.20 throughout: shipping was USD 4.69 to the U.S.A., 40.00 to the United Kingdom, 35.00 to Turkey, 45.00 to Japan and 45.00 to Australia. On that listing the cheapest shipping is DOUBLE the price of the book, which is why `price` and `shipping_price` are separate fields and `total_price` is the one to sort on. ISO-3166 alpha-3; 107 codes were confirmed accepted by the source's own echo, and an unknown code is rejected here because the source answers it with the U.S.A. rate card and no warning. [one of: USA, GBR, CAN, AUS, NZL, IRL, DEU, FRA, ITA, ESP, PRT, NLD, BEL, LUX, CHE, AUT, DNK, SWE, NOR, FIN, ISL, POL, CZE, SVK, HUN, ROU, BGR, GRC, HRV, SVN, EST, LVA, LTU, MLT, CYP, TUR, RUS, UKR, ISR, ARE, SAU, QAT, KWT, ZAF, EGY, MAR, NGA, KEN, IND, PAK, BGD, LKA, CHN, HKG, TWN, JPN, KOR, SGP, MYS, THA, VNM, IDN, PHL, MEX, BRA, ARG, CHL, COL, PER, URY, CRI, PAN, JAM, BRB, TTO, VEN, ECU, BOL, PRY, GTM, SRB, BIH, MKD, ALB, MDA, GEO, ARM, AZE, KAZ, MNG, NPL, KHM, LAO, MMR, BHR, OMN, JOR, LBN, TUN, DZA, GHA, TZA, UGA, ZWE, MUS, FJI, PNG]
- `include_pii` (boolean, optional, default false) — Accepted for gateway compatibility. The seller block is a business identity — shop name, city, country, rating and storefront link — and carries no address, phone number or e-mail, so nothing is withheld either way. Some AbeBooks sellers are one-person shops trading under a personal name; that name is the trading name the marketplace itself publishes.

**Returns:** offer{the full row, with seller.rating_percent instead of rating_stars, plus images[], size, weight}, book{synopsis, book_rating{value, count, best, about}, format, image}, seller_profile{name, url, founded, payment_accepted[]}, witnesses{schema_org_price, schema_org_currency, schema_org_availability, agrees_with_listing}

**Example request body:**
```json
{
  "listing_id": 32181107131
}
```

### POST https://api.reefapi.com/abebooks/v1/seller — 3 credits
One bookseller: the profile the marketplace states for the shop plus a page of its live inventory and the shelves it organises that inventory into. Use it to size a dealer, to watch a competitor's stock, or to pull a whole specialist catalogue. Measured: seller 61505917 ('Orion Tech', Kingwood TX, 5 stars) publishes 198,392 listings.

**Parameters:**
- `seller_id` (integer, required) — A bookseller, by the id every row returns as `seller.id`. Returns the shop's profile as the marketplace states it plus a page of its inventory and its own shelves. Measured: seller 61505917 publishes 198,392 listings.
- `query` (string, optional) — Free text over the whole listing — title, author, publisher and the seller's own description. At least one of `query`, `title`, `author`, `publisher` or `isbn` is required, exactly as the source's own advanced search demands. Because it reaches the seller's description, it is also how you find the things only a bookseller writes: 'inscribed to', 'association copy', 'provenance', 'dust jacket chipped'.
- `condition` (enum, optional) — Keep only copies in one of the source's own five condition BANDS. AbeBooks grades a copy on a nine-step ladder (New, As New, Fine, Near Fine, Very Good, Good, Fair, Poor, Unspecified) but it filters on bands, so these are the bands and the rows still carry the exact grade as `condition` plus the seller's own word for it as `seller_condition`. Note how large `unspecified` is (103,154 on one measured query): an antiquarian dealer often describes a copy in prose instead of picking a grade, and that prose is in `seller_note`. [one of: new, as_new_fine, very_good_good, fair_poor, unspecified]
- `sort` (enum, optional, default "relevance") — Row order. All twelve of the source's own sorts are offered, and the one worth knowing about is `total_price_asc`: it sorts by price PLUS shipping to your destination, which on this marketplace routinely reorders the ladder completely. [one of: relevance, price_asc, price_desc, total_price_asc, newest, seller_rating_desc, title_asc, title_desc, year_asc, year_desc, author_asc, author_desc]
- `page` (integer, optional, default 1) — 1-based page. The source's result window is 1800 listings per query, so `page` x `per_page` must stay at or below that — at 50 per page the last readable page is 36. Past it the source answers HTTP 200 with an empty page that looks exactly like the end of the results (measured: a full page at offset 1,780, zero rows at 1,800, 2,000, 5,000, 10,000 and 20,000), which is why this is rejected here with the real maximum instead. Narrow with a filter to reach deeper.
- `per_page` (integer, optional, default 20) — Listings per page, 1-100. The source renders its whole page per request, so a bigger page is cheaper per row but heavier per call: measured payloads are 430 KB at 10 rows, 742 KB at 30, 1.06 MB at 50 and 1.86 MB at 100.
- `currency` (enum, optional, default "USD") — Which currency to quote every price and every shipping cost in. AbeBooks converts for you — a seller's own list currency is never published on this surface, so every number you get back is a conversion and every row says so. Only these twelve work: probing nineteen codes on 2026-10-08 found that JPY, MXN, TRY, ZAR, BRL and INR are answered in USD with HTTP 200 and no warning, so an unsupported code is rejected here instead of being silently re-priced. Measured on one listing in one minute: USD 2.20 / GBP 1.71 / EUR 2.02 / CAD 3.23 / CZK 49.23. [one of: USD, GBP, EUR, CAD, AUD, CHF, DKK, SEK, NOK, NZD, PLN, CZK]
- `ship_to` (enum, optional, default "USA") — 🔴 THE MOST IMPORTANT PARAMETER ON THIS API. Shipping is quoted per destination, and AbeBooks guesses the destination from the caller's own network when nothing pins it — so this engine always pins it and always tells you which one it used. Measured on ONE listing in ONE minute, book price USD 2.20 throughout: shipping was USD 4.69 to the U.S.A., 40.00 to the United Kingdom, 35.00 to Turkey, 45.00 to Japan and 45.00 to Australia. On that listing the cheapest shipping is DOUBLE the price of the book, which is why `price` and `shipping_price` are separate fields and `total_price` is the one to sort on. ISO-3166 alpha-3; 107 codes were confirmed accepted by the source's own echo, and an unknown code is rejected here because the source answers it with the U.S.A. rate card and no warning. [one of: USA, GBR, CAN, AUS, NZL, IRL, DEU, FRA, ITA, ESP, PRT, NLD, BEL, LUX, CHE, AUT, DNK, SWE, NOR, FIN, ISL, POL, CZE, SVK, HUN, ROU, BGR, GRC, HRV, SVN, EST, LVA, LTU, MLT, CYP, TUR, RUS, UKR, ISR, ARE, SAU, QAT, KWT, ZAF, EGY, MAR, NGA, KEN, IND, PAK, BGD, LKA, CHN, HKG, TWN, JPN, KOR, SGP, MYS, THA, VNM, IDN, PHL, MEX, BRA, ARG, CHL, COL, PER, URY, CRI, PAN, JAM, BRB, TTO, VEN, ECU, BOL, PRY, GTM, SRB, BIH, MKD, ALB, MDA, GEO, ARM, AZE, KAZ, MNG, NPL, KHM, LAO, MMR, BHR, OMN, JOR, LBN, TUN, DZA, GHA, TZA, UGA, ZWE, MUS, FJI, PNG]
- `include_pii` (boolean, optional, default false) — Accepted for gateway compatibility. The seller block is a business identity — shop name, city, country, rating and storefront link — and carries no address, phone number or e-mail, so nothing is withheld either way. Some AbeBooks sellers are one-person shops trading under a personal name; that name is the trading name the marketplace itself publishes.

**Returns:** seller{id, name, city, state, country, country_name, rating_stars, rating_scale, storefront_url, contact_url, associations[], catalogs[]}, listings[]{listing_id, seller_sku, url, copies_available, title, author, authors[], illustrator, publisher, publish_year, edition, binding, binding_class, language, language_name, isbn13, isbn10, isbn_missing, barcode_ean (only when the code is not a Bookland ISBN), product_type, condition, condition_label, condition_rank, seller_condition, seller_note, jacket, jacket_condition, inscription, price, price_missing, shipping_price, free_shipping, total_price, currency, currency_symbol, ships_to, ships_to_country, shipping_options[]{price, currency, min_delivery_days, max_delivery_days}, is_first_edition, is_signed, is_inscribed, has_dust_jacket, is_rare, is_print_on_demand, has_seller_photos, attribute_codes[], images[], image_is_sellers_own, catalog_image, seller{id, name, city, state, country, country_name, rating_stars, rating_scale, storefront_url, contact_url, associations[], catalogs[]}, series{id, title, position, books_in_series, url}, listing_params{listing_id}}, summary{price ladder on this page} + meta{total_listings, total_is_estimate, page, per_page, max_page}

**Example request body:**
```json
{
  "seller_id": 61505917,
  "per_page": 20
}
```

### POST https://api.reefapi.com/abebooks/v1/isbn — 4 credits
Up to 6 ISBNs in one call, each answered with the market summary a pricing job needs: how many sellers have it, the cheapest book price, the cheapest LANDED price including shipping to your destination, the price range, the condition spread, how many copies are new, signed or first editions, and a link to the cheapest copy. Your order is kept and the ISBNs nobody is offering are named.

**Parameters:**
- `isbns` (array, required) — Up to 6 ISBNs in ONE call, ISBN-13 or ISBN-10 mixed freely. For each one you get the number of sellers offering it, the cheapest book price, the cheapest price INCLUDING shipping to your destination, the price range, the condition spread and a link to the cheapest copy — the shape a repricing or buy-box job actually needs. Your order is preserved and ISBNs with no offer are named. Each ISBN costs one upstream request, so this is capped deliberately.
- `currency` (enum, optional, default "USD") — Which currency to quote every price and every shipping cost in. AbeBooks converts for you — a seller's own list currency is never published on this surface, so every number you get back is a conversion and every row says so. Only these twelve work: probing nineteen codes on 2026-10-08 found that JPY, MXN, TRY, ZAR, BRL and INR are answered in USD with HTTP 200 and no warning, so an unsupported code is rejected here instead of being silently re-priced. Measured on one listing in one minute: USD 2.20 / GBP 1.71 / EUR 2.02 / CAD 3.23 / CZK 49.23. [one of: USD, GBP, EUR, CAD, AUD, CHF, DKK, SEK, NOK, NZD, PLN, CZK]
- `ship_to` (enum, optional, default "USA") — 🔴 THE MOST IMPORTANT PARAMETER ON THIS API. Shipping is quoted per destination, and AbeBooks guesses the destination from the caller's own network when nothing pins it — so this engine always pins it and always tells you which one it used. Measured on ONE listing in ONE minute, book price USD 2.20 throughout: shipping was USD 4.69 to the U.S.A., 40.00 to the United Kingdom, 35.00 to Turkey, 45.00 to Japan and 45.00 to Australia. On that listing the cheapest shipping is DOUBLE the price of the book, which is why `price` and `shipping_price` are separate fields and `total_price` is the one to sort on. ISO-3166 alpha-3; 107 codes were confirmed accepted by the source's own echo, and an unknown code is rejected here because the source answers it with the U.S.A. rate card and no warning. [one of: USA, GBR, CAN, AUS, NZL, IRL, DEU, FRA, ITA, ESP, PRT, NLD, BEL, LUX, CHE, AUT, DNK, SWE, NOR, FIN, ISL, POL, CZE, SVK, HUN, ROU, BGR, GRC, HRV, SVN, EST, LVA, LTU, MLT, CYP, TUR, RUS, UKR, ISR, ARE, SAU, QAT, KWT, ZAF, EGY, MAR, NGA, KEN, IND, PAK, BGD, LKA, CHN, HKG, TWN, JPN, KOR, SGP, MYS, THA, VNM, IDN, PHL, MEX, BRA, ARG, CHL, COL, PER, URY, CRI, PAN, JAM, BRB, TTO, VEN, ECU, BOL, PRY, GTM, SRB, BIH, MKD, ALB, MDA, GEO, ARM, AZE, KAZ, MNG, NPL, KHM, LAO, MMR, BHR, OMN, JOR, LBN, TUN, DZA, GHA, TZA, UGA, ZWE, MUS, FJI, PNG]
- `include_pii` (boolean, optional, default false) — Accepted for gateway compatibility. The seller block is a business identity — shop name, city, country, rating and storefront link — and carries no address, phone number or e-mail, so nothing is withheld either way. Some AbeBooks sellers are one-person shops trading under a personal name; that name is the trading name the marketplace itself publishes.

**Returns:** books[]{isbn13, isbn10, found, offer_count, total_is_estimate, cheapest{price, shipping_price, total_price, condition, seller, listing_id, url}, cheapest_total{same shape}, price_range, total_price_range, conditions{}, new_offers, signed_offers, first_edition_offers, free_shipping_offers, book{bibliographic record}}, not_found[] + meta{requested, found, currency, ship_to}

**Example request body:**
```json
{
  "isbns": [
    "9780441172719",
    "9780140449136",
    "0141182636"
  ],
  "currency": "USD",
  "ship_to": "USA"
}
```

### POST https://api.reefapi.com/abebooks/v1/filters — 1 credit
The refinement vocabulary this marketplace actually has, with the exact tokens every filter accepts. Read this instead of guessing. It also states, in writing, the two things AbeBooks does NOT publish: there is no subject or category tree (its search returns no facets at all — `contextualFacets` was empty on every query measured, and `subject=` was tried and does not bite), and there are no facet counts, so no filter here can tell you how many listings it will match before you run it. Answered from measurement, with no upstream call, so it costs nothing and never fails.

**Parameters:**
- `include_pii` (boolean, optional, default false) — Accepted for gateway compatibility. The seller block is a business identity — shop name, city, country, rating and storefront link — and carries no address, phone number or e-mail, so nothing is withheld either way. Some AbeBooks sellers are one-person shops trading under a personal name; that name is the trading name the marketplace itself publishes.

**Returns:** conditions[], condition_grades[], product_types[], bindings[], seller_countries[], seller_regions[], languages[], currencies[], shipping_destinations[], sorts[], listed_within[], collectible_flags[], seller_associations[], limits{result_window, max_per_page, max_isbns}, not_published{category_tree, facet_counts, seller_own_currency, seller_feedback_count}

## 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=abebooks
- Human docs page: https://reefapi.com/docs/abebooks
- Overview page: https://reefapi.com/abebooks-api
- Every ReefAPI API in one file (for your AI): https://reefapi.com/llms-full.txt
