# Prisjakt / PriceSpy API — Nordic, UK and NZ price comparison: search, category listings, every shop's price with shipping, price history and full specs

> Keyword search on one Prisjakt / PriceSpy market. Rows are catalogue products (lowest price, number of offers, rating, category) and, mostly in price-sorted searches, single-shop items Prisjakt has not matched to a product (`row_type: offer`, with the shop and a link to it). Filter by category and brand (ids from the facets this action returns), rating bucket and in-stock. The source lists at most 1000 products per query (`total`); the true match count is `matching_total`.
> ReefAPI engine `prisjakt` · 5 endpoints · clean JSON, no scraping or browsers to manage.

## How to call
- **Endpoint:** `POST https://api.reefapi.com/prisjakt/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/prisjakt/v1/search — 2 credits
Keyword search on one Prisjakt / PriceSpy market. Rows are catalogue products (lowest price, number of offers, rating, category) and, mostly in price-sorted searches, single-shop items Prisjakt has not matched to a product (`row_type: offer`, with the shop and a link to it). Filter by category and brand (ids from the facets this action returns), rating bucket and in-stock. The source lists at most 1000 products per query (`total`); the true match count is `matching_total`.

**Parameters:**
- `query` (string, required) — Search words, e.g. `iphone 16`, `dammsugare`, `coffee machine`.
- `country` (enum, optional, default "se") — Which Prisjakt / PriceSpy market: se = prisjakt.nu (SEK), no = prisjakt.no (NOK), fi = hintaopas.fi (EUR), uk = pricespy.co.uk (GBP), nz = pricespy.co.nz (NZD). Product ids are shared across markets; prices, shops and currency come from the market chosen. [one of: se, no, fi, uk, nz]
- `category_filter` (string, optional) — Category facet id from `category_facets` (e.g. `pc:horlurar`). An unknown id returns no rows.
- `brand_id` (string, optional) — Brand id from `brand_facets` (e.g. 142 = Apple). An unknown id returns no rows.
- `rating` (enum, optional) — Rating bucket: products whose user rating is N.x (4 = 4.0-4.99). From `rating_facets`. [one of: 1, 2, 3, 4]
- `in_stock_only` (boolean, optional, default false) — Only products some shop has in stock.
- `sort` (enum, optional, default "relevance") — Result order. [one of: relevance, popularity, price_asc, price_desc]
- `page` (integer, optional, default 1) — Result page, 48 rows per page; the source serves at most 21 pages.

**Returns:** results[]{row_type (product|offer), product_id (product rows), offer_id (offer rows), title, url, image, category{id, name}, category_path[], lowest_price (= the product page headline), lowest_price_any_condition, offer_count, currency, rating, rating_count, deal_percentage, shop{id, name, featured} (offer rows), outbound_url (offer rows)} + total (capped at 1000), pages, matching_total, matching_in_stock, page, has_more, category_facets[]{id, name, count}, brand_facets[]{id, name, count}, rating_facets[]{value, count}, categories[]{category_id, name, url, product_count}, country

**Example request body:**
```json
{
  "query": "iphone 16",
  "country": "se"
}
```

### POST https://api.reefapi.com/prisjakt/v1/category — 1 credit
One category listing on a Prisjakt / PriceSpy market: every product in the category with its lowest price, lowest price including shipping, number of offers, rating and popularity rank, 24 per page. Filter by brand; sort by popularity, price, price including shipping, user-review ranking or name.

**Parameters:**
- `category_id` (string, required) — Numeric Prisjakt category id: `category.category_id` of `product`, a search row's `category.id`, `categories[]` of `search`, or the number in kategori.php?k=<id> (103 = Mobiltelefoner / Mobile phones).
- `country` (enum, optional, default "se") — Which Prisjakt / PriceSpy market: se = prisjakt.nu (SEK), no = prisjakt.no (NOK), fi = hintaopas.fi (EUR), uk = pricespy.co.uk (GBP), nz = pricespy.co.nz (NZD). Product ids are shared across markets; prices, shops and currency come from the market chosen. [one of: se, no, fi, uk, nz]
- `brand_id` (string, optional) — Numeric brand id (e.g. 142 = Apple).
- `sort` (enum, optional, default "popularity") — Result order. [one of: popularity, price_asc, price_desc, price_incl_shipping_asc, user_reviews, name]
- `page` (integer, optional, default 1) — Result page, 24 products per page.

**Returns:** category{category_id, name, url, product_count, path[]} + results[]{row_type=product, product_id, title, url, brand, image, lowest_price, lowest_price_any_condition, lowest_price_incl_shipping, offer_count, currency, rating, rating_count, popularity_rank_in_category, deal_percentage} + page, has_more, sort_applied, country

**Example request body:**
```json
{
  "category_id": "103",
  "country": "se"
}
```

### POST https://api.reefapi.com/prisjakt/v1/product — 1 credit
One product on a Prisjakt / PriceSpy market: title, brand, category path, image, release date, the lowest price (new) and lowest in any condition, the highest price, number of offers and shops, user rating, popularity rank, every variant with its GTIN / EAN, and the full spec sheet (headline specs marked). The lowest price is checked against three of the source's own witnesses.

**Parameters:**
- `product_id` (integer, required) — Prisjakt product id: the `product_id` of a search / category row, or the number in a product URL (…/produkt.php?p=<id>). The same id works on every market.
- `country` (enum, optional, default "se") — Which Prisjakt / PriceSpy market: se = prisjakt.nu (SEK), no = prisjakt.no (NOK), fi = hintaopas.fi (EUR), uk = pricespy.co.uk (GBP), nz = pricespy.co.nz (NZD). Product ids are shared across markets; prices, shops and currency come from the market chosen. [one of: se, no, fi, uk, nz]

**Returns:** product{product_id, title, url, country, brand{id, name, url}, category{category_id, name, url}, category_path[], description, image, image_count, release_date, stock_status, lowest_price (the page's headline price), summary_price, lowest_price_any_condition, cheapest_new_offer, highest_price, currency, price_mismatch, main_offer_count, offer_count, shop_count, rating, rating_count, popularity_rank{overall, in_category}, gtins[], variants[]{variant_id, name, gtin, sku, attributes}, core_specs[], specs[]{id, group, name, value, unit, is_core}}

**Example request body:**
```json
{
  "product_id": 13854649,
  "country": "se"
}
```

### POST https://api.reefapi.com/prisjakt/v1/offers — 1 credit
Every shop offer for one product on a Prisjakt / PriceSpy market, in Prisjakt's order (cheapest first, new before used / refurbished): shop (name, rating, marketplace, country), condition, price, shipping cost, price including shipping, delivery days, stock status, original and member price, and the link to the shop. Shipping and the price including shipping are null where the shop publishes no shipping cost.

**Parameters:**
- `product_id` (integer, required) — Prisjakt product id: the `product_id` of a search / category row, or the number in a product URL (…/produkt.php?p=<id>). The same id works on every market.
- `country` (enum, optional, default "se") — Which Prisjakt / PriceSpy market: se = prisjakt.nu (SEK), no = prisjakt.no (NOK), fi = hintaopas.fi (EUR), uk = pricespy.co.uk (GBP), nz = pricespy.co.nz (NZD). Product ids are shared across markets; prices, shops and currency come from the market chosen. [one of: se, no, fi, uk, nz]

**Returns:** product{product_id, title, url, country, lowest_price, summary_price, lowest_price_any_condition, cheapest_new_offer, cheapest_new_offer_incl_shipping, highest_price, currency, price_mismatch, offer_count, shop_count} + offers[]{position, offer_id, title, condition (new|used|refurbished), price, shipping_cost, price_incl_shipping, total_mismatch, original_price, member_price, membership_program, price_valid_until, currency, stock_status, availability_date, delivery_days_min, delivery_days_max, carrier, shipping_options[], variant_id, variant, shop{id, name, featured, marketplace, country, market, url, rating, rating_count, review_count_total}, primary_market, outbound_url} + count + by_condition

**Example request body:**
```json
{
  "product_id": 13854649,
  "country": "se"
}
```

### POST https://api.reefapi.com/prisjakt/v1/price_history — 2 credits
Prisjakt's price history (the price chart) for one product on one market: every change of the lowest price, with its date, the shop that set it and that shop's offer title; plus the lowest and highest price in the range and every shop that appears in the history. A price holds until the next point.

**Parameters:**
- `product_id` (integer, required) — Prisjakt product id: the `product_id` of a search / category row, or the number in a product URL (…/produkt.php?p=<id>). The same id works on every market.
- `country` (enum, optional, default "se") — Which Prisjakt / PriceSpy market: se = prisjakt.nu (SEK), no = prisjakt.no (NOK), fi = hintaopas.fi (EUR), uk = pricespy.co.uk (GBP), nz = pricespy.co.nz (NZD). Product ids are shared across markets; prices, shops and currency come from the market chosen. [one of: se, no, fi, uk, nz]
- `time_range` (enum, optional, default "1y") — How far back. [one of: 3m, 6m, 1y, 2y, all]

**Returns:** product{product_id, title, url, country, lowest_price_now} + time_range + currency + points[]{date, price, shop{id, name}, offer_title, member_price, paid_membership, shop_still_listed} + count + first_date + last_date + lowest_in_range{price, date, shop} + highest_in_range + history_starts + history_updated + shops_in_history[]{id, name}

**Example request body:**
```json
{
  "product_id": 13854649,
  "country": "se",
  "time_range": "1y"
}
```

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