# Tweakers Pricewatch API — Dutch tech price comparison: search, category listings, every shop's price with shipping and total, price history and full specs

> Keyword search in tweakers.net Pricewatch (the Netherlands). Filter by tweakers category id and brand id (both from the facets this action returns), price range and sort. Each row is one product edition with its lowest shop price ('vanaf'), number of shops, half-star rating and review count. Needs `query` OR `category_id` (either one is enough). By default only products that some shop sells right now are counted (`priced_only`); tweakers' own search also counts discontinued and announced products.
> ReefAPI engine `tweakers` · 6 endpoints · clean JSON, no scraping or browsers to manage.

## How to call
- **Endpoint:** `POST https://api.reefapi.com/tweakers/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/tweakers/v1/search — 3 credits
Keyword search in tweakers.net Pricewatch (the Netherlands). Filter by tweakers category id and brand id (both from the facets this action returns), price range and sort. Each row is one product edition with its lowest shop price ('vanaf'), number of shops, half-star rating and review count. Needs `query` OR `category_id` (either one is enough). By default only products that some shop sells right now are counted (`priced_only`); tweakers' own search also counts discontinued and announced products.

**Parameters:**
- `query` (string, optional) — Search words (Dutch or English product names, e.g. `rtx 5070`, `ssd 2tb`, `iphone 17`). Optional when `category_id` is given.
- `category_id` (integer, optional) — Tweakers category id from `category_facets` (e.g. 49 = Videokaarten, 496 = Laptops). An unknown id is refused by tweakers (INVALID_PARAM).
- `brand_id` (integer, optional) — Tweakers brand id, as returned in `brand_facets` (e.g. 5 = ASUS). An unknown id is refused by tweakers (INVALID_PARAM).
- `min_price` (number, optional) — Lowest shop price in EUR (VAT included).
- `max_price` (number, optional) — Highest shop price in EUR (VAT included).
- `priced_only` (boolean, optional, default true) — Count only products that some shop sells right now (true, default) or every product ever listed, including discontinued and announced ones without a price (false). Ignored when `min_price` is given.
- `sort` (enum, optional, default "relevance") — Result order. [one of: relevance, price_asc, price_desc, rating, newest]
- `page` (integer, optional, default 1) — Result page, 40 products per page. A page past the last one returns no rows with `page_beyond_last: true`.

**Returns:** results[]{row_type (product|unsorted), product_id (catalogue rows), unsorted_id (unsorted shop-feed rows: pass to offers), title, url, image, summary (spec line), tested, rating_stars (rounded to half stars), review_count, price_from, price_display, currency=EUR, shop_count, price_status ('Wordt verwacht' when there is no price yet)} + total, page, last_page, has_more, page_beyond_last, category_facets[]{id, name, count}, brand_facets[]{id, name, count}, country=NL

**Example request body:**
```json
{
  "query": "rtx 5070"
}
```

### POST https://api.reefapi.com/tweakers/v1/category — 3 credits
One tweakers Pricewatch category listing (the site's own 'vergelijken' page): every product edition in a category, or in a brand / product family inside it, with its lowest price, number of shops, rating and the two spec columns tweakers shows for that category. Lists what tweakers lists: products with a shop price plus announced ones without a price yet (`price_status: Wordt verwacht`). Filter by brand id and price range; sort by popularity, price, rating or newest.

**Parameters:**
- `category` (string, required) — Category path as in tweakers' URL: `videokaarten`, `laptops`, `smartphones`, or deeper (a brand or product family, e.g. `consoles/sony/playstation-5-pro_p1573800`), or the full tweakers.net/…/vergelijken/ URL. `product` returns it as `category.path` and `family.path`.
- `brand_id` (integer, optional) — Tweakers brand id, as returned in `brand_facets` (e.g. 5 = ASUS). An unknown id is refused by tweakers (INVALID_PARAM).
- `min_price` (number, optional) — Lowest shop price in EUR (VAT included).
- `max_price` (number, optional) — Highest shop price in EUR (VAT included).
- `sort` (enum, optional, default "popularity") — Result order. [one of: popularity, price_asc, price_desc, rating, newest]
- `page` (integer, optional, default 1) — Result page, 40 products per page. A page past the last one returns no rows with `page_beyond_last: true`.

**Returns:** results[]{row_type, product_id, unsorted_id, title, url, image, summary, tested, rating_stars, review_count, price_from, price_display, currency=EUR, shop_count, price_status, shown_specs[]{label, value}} + category, title, total, page, last_page, has_more, page_beyond_last, spec_columns[], brand_facets[]{id, name, count}, country=NL

**Example request body:**
```json
{
  "category": "videokaarten"
}
```

### POST https://api.reefapi.com/tweakers/v1/product — 3 credits
One Pricewatch product page: title, brand, images, EAN and SKU codes, category and product family (pass `category.path` / `family.path` to `category`), the lowest and highest shop price, the number of offers, the exact review score and review count, how many users want / have it, the headline specs and whether Tweakers' lab tested it. The lowest price is checked against the offer table. Use `offers` for every shop, `specs` for the full sheet, `price_history` for the chart.

**Parameters:**
- `product_id` (string, optional) — Tweakers product id (the 'Tweakers ID' of one product edition, digits only): the `product_id` of a `search` or `category` row, also the number in a product URL tweakers.net/pricewatch/<id>/…. Provide product_id OR url.
- `url` (string, optional) — A tweakers.net Pricewatch product URL; alternative to product_id.

**Returns:** product{product_id, title, brand, brand_url, url, summary, image, images[], ean[], sku[], category{name, path, url}, category_path[]{name, url}, family{id, name, path, url}, lowest_price, highest_price, offer_count, refurbished_offer_count, currency=EUR, price_mismatch, status, rating, rating_header, review_count, want_count, have_count, tested, editorial_review_url, spec_highlights[]{label, value}, price_history_url} + country=NL

**Example request body:**
```json
{
  "product_id": "2158394"
}
```

### POST https://api.reefapi.com/tweakers/v1/offers — 3 credits
Every shop selling one product in the Netherlands, in Pricewatch's order (cheapest TOTAL first — price plus shipping plus payment cost): the shop (id, name, slogan or the marketplace seller, half-star rating and review count), the price, and tweakers' own cost breakdown for that shop — shipping line and amount, payment method and its cost, and the total. Delivery promise text per shop. Refurbished offers come apart in `refurbished[]`. The whole table comes in one call. Takes a catalogue `product_id` (or `url`), or the `unsorted_id` of an unsorted search row.

**Parameters:**
- `product_id` (string, optional) — Tweakers product id (the 'Tweakers ID' of one product edition, digits only): the `product_id` of a `search` or `category` row, also the number in a product URL tweakers.net/pricewatch/<id>/…. Provide product_id OR url.
- `url` (string, optional) — A tweakers.net Pricewatch product URL; alternative to product_id.
- `unsorted_id` (string, optional) — Id of an 'unsorted' row (`row_type: unsorted` in search / category): a shop-feed item tweakers lists with prices before it is added to its catalogue. Only `offers` accepts it; such items have no spec sheet or price chart.

**Returns:** product{product_id, unsorted_id, title, url, lowest_price, highest_price, offer_count, currency=EUR, price_mismatch} + offers[]{position, condition, seller{id, name, tagline, marketplace_seller, rating_stars, review_count, reviews_url}, price, price_display, currency, shipping_cost, shipping_label, shipping_display, payment_method, payment_cost, total_price, total_mismatch, cost_breakdown[]{label, amount, display}, delivery_text, delivery_indicator} + refurbished[] (same shape) + count + country=NL

**Example request body:**
```json
{
  "product_id": "2158394"
}
```

### POST https://api.reefapi.com/tweakers/v1/specs — 2 credits
The full specification sheet of one product (Specificaties), grouped as tweakers groups it, in tweakers' own Dutch wording; yes/no specs are true / false. Includes the 'Meer informatie' group (category, brand, series, EAN, SKU, maker link).

**Parameters:**
- `product_id` (string, optional) — Tweakers product id (the 'Tweakers ID' of one product edition, digits only): the `product_id` of a `search` or `category` row, also the number in a product URL tweakers.net/pricewatch/<id>/…. Provide product_id OR url.
- `url` (string, optional) — A tweakers.net Pricewatch product URL; alternative to product_id.

**Returns:** product{product_id, url} + groups[]{group, specs[]{label, value, url}} + specs[]{group, label, value, url} + highlights[]{label, value} + count

**Example request body:**
```json
{
  "product_id": "2158394"
}
```

### POST https://api.reefapi.com/tweakers/v1/price_history — 1 credit
Daily price history of one product on Pricewatch (the price chart): the lowest shop price and the average shop price for every day tweakers recorded, from the day it was listed, plus tweakers' own chart markers (e.g. lowest price in 6 months). The chart is daily; its last point is the last completed day.

**Parameters:**
- `product_id` (string, optional) — Tweakers product id (the 'Tweakers ID' of one product edition, digits only): the `product_id` of a `search` or `category` row, also the number in a product URL tweakers.net/pricewatch/<id>/…. Provide product_id OR url.
- `url` (string, optional) — A tweakers.net Pricewatch product URL; alternative to product_id.

**Returns:** product{product_id, url} + points[]{date, lowest_price, average_price} + count + first_date + last_date + all_time_lowest{price, date} + markers[]{label, price} + currency=EUR + country=NL

**Example request body:**
```json
{
  "product_id": "2158394"
}
```

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