# Boekwinkeltjes — Dutch & Belgian second-hand and antiquarian books

> Search every copy on offer across 11,264 Dutch and Belgian second-hand and antiquarian bookshops and private sellers. ONE ROW IS ONE COPY from ONE seller at ONE price, not a catalogue title: the same ISBN appears once per shelf it sits on, which is what makes the price spread visible. `query` takes a title, an author, a publisher or an ISBN. 🔴 Search rows do NOT carry an ISBN — the source's result table has no ISBN column; call `book` with the row's `book_id` for ISBN, language, condition and the full seller block. 50 copies per page (measured constant on 12 sampled pages); the site's own ceiling is page 200, i.e. at most 10,000 copies per query.
> ReefAPI engine `boekwinkeltjes` · 3 endpoints · clean JSON, no scraping or browsers to manage.

## How to call
- **Endpoint:** `POST https://api.reefapi.com/boekwinkeltjes/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/boekwinkeltjes/v1/search — 2 credits
Search every copy on offer across 11,264 Dutch and Belgian second-hand and antiquarian bookshops and private sellers. ONE ROW IS ONE COPY from ONE seller at ONE price, not a catalogue title: the same ISBN appears once per shelf it sits on, which is what makes the price spread visible. `query` takes a title, an author, a publisher or an ISBN. 🔴 Search rows do NOT carry an ISBN — the source's result table has no ISBN column; call `book` with the row's `book_id` for ISBN, language, condition and the full seller block. 50 copies per page (measured constant on 12 sampled pages); the site's own ceiling is page 200, i.e. at most 10,000 copies per query.

**Parameters:**
- `query` (string, required) — Title, author, publisher or ISBN. The site matches on all of them; an ISBN-13 matches the exact edition.
- `page` (integer, optional, default 1) — 1-based page. The source refuses page 201 with a 404, so 200 is the hard ceiling.
- `sort` (enum, optional) — Sort key. Omitted = the source's own default order. [one of: title, author, publisher, particulars, price, shop, newest, updated]
- `order` (enum, optional, default "asc") — Sort direction. Only meaningful together with `sort`. [one of: asc, desc]
- `condition` (enum, optional, default "any") — Second-hand or new. Measured on query=tolkien: 1,983 used + 446 new = 2,429 unfiltered, so the two are the complete halves of the catalogue. [one of: any, used, new]
- `language` (enum, optional) — Language OF THE BOOK (not of the seller). 56 codes, the source's own. Measured on query=tolkien: GB 801, DE 61 of 2,429. [one of: NL, GB, DE, FR, MET, AF, ES, NO, SE, DK, FS, AL, AD, AR, BA, BY, BS, BG, IM, EO, EE, FO, FA, FI, GR, GM, HU, IW, IS, ID, IE, IT, JP, YH, HR, LV, LA, LT, LU, MK, MT, ZH, ME, NG, OS, UA, PL, PT, RO, RU, RS, SI, SK, CZ, TR, CY]
- `seller_country` (enum, optional) — Country the SELLER ships from. Measured on query=tolkien: NL 2,393, BE 470 of 2,429. [one of: NL, BE, FR, GB, WW]
- `price_min` (number, optional) — Minimum asking price in EUR.
- `price_max` (number, optional) — Maximum asking price in EUR.
- `zip` (string, optional) — Dutch or Belgian postcode used as the centre for `distance_km`.
- `distance_km` (enum, optional) — Only sellers within this many km of `zip`. The source offers these steps only. Measured: zip=1012 + 10 km → 72 copies of 2,429; 150 km → 1,673. [one of: 2.5, 5, 10, 25, 50, 75, 150]
- `with_image` (boolean, optional, default false) — Only listings with a photo. Measured: 1,652 of 2,429.
- `shipping_cost_listed` (boolean, optional, default false) — Only listings that DO charge shipping — the source's own switch is "show only with shipping costs", so this is the opposite of free shipping. Measured: 1,606 of 2,429.
- `added_last_week` (boolean, optional, default false) — Only copies listed in the last week. Measured: 103 of 2,429.
- `with_total` (boolean, optional, default false) — Also return `total_estimate`. The source publishes NO result count, so this is computed from its last page link plus the rows on that page and costs one extra upstream request.

**Returns:** {query, page, rows_per_page, returned, total_estimate, pages_estimate, filters_applied, books:[{book_id, url, title, author, publisher, particulars, condition, binding, price_eur, price_display, shipping_eur, shipping_display, seller_name, image_url, isbn, listing_channel}]}

**Example request body:**
```json
{
  "query": "tolkien"
}
```

### POST https://api.reefapi.com/boekwinkeltjes/v1/book — 1 credit
One copy in full: ISBN exactly as the seller printed it (ISBN-10 and ISBN-13 kept apart, never converted into each other), title, author, publisher, language, the seller's own free-text `particulars` (year / edition / binding / defects all live there), price with the source's own printed string beside it, shipping, photos, and the SELLER — shop name, town, business-or-private, slug, website, handling time and delivery terms. Accepts a book URL instead of an id. A dead id returns NOT_FOUND.

**Parameters:**
- `book_id` (string, required) — Numeric id from a book URL (https://www.boekwinkeltjes.nl/b/244885503/… → 244885503), or the whole URL.

**Returns:** {book_id, url, title, author, isbn, isbn13, isbn10, publisher, language, language_code, particulars, condition, condition_text, binding, price_eur, price_display, price_ld_json, price_witnesses_agree, currency, shipping_eur, shipping_display, shipping_region, description, availability, image_url, images, listing_channel, seller:{name, city, kind, slug, url, website, logo_url, total_books, handling_days, terms}}

**Example request body:**
```json
{
  "book_id": "244885503"
}
```

### POST https://api.reefapi.com/boekwinkeltjes/v1/seller — 2 credits
One shop's own stock page: its profile (name, town, business or private, logo, website, delivery terms) together with the TOTAL NUMBER OF BOOKS it publishes about itself — the only count this source prints anywhere — and a page of its copies in the same shape as `search`. `query` searches inside that one shop. A dead slug returns NOT_FOUND.

**Parameters:**
- `seller` (string, required) — Shop slug from a shop URL (https://www.boekwinkeltjes.nl/v/kaatjesboeken/ → kaatjesboeken), or the whole URL. `book` returns it as `seller.slug`.
- `page` (integer, optional, default 1) — 1-based page of that shop's stock.
- `query` (string, optional) — Search inside this shop only.
- `sort` (enum, optional) — Sort key, same set as `search`. [one of: title, author, publisher, particulars, price, shop, newest, updated]

**Returns:** {seller:{name, city, kind, slug, url, website, logo_url, total_books, terms}, page, rows_per_page, returned, pages_estimate, books:[… same as search …]}

**Example request body:**
```json
{
  "seller": "kaatjesboeken"
}
```

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