Looking for the overview — what this API returns, what it costs, and a call you can run without a key? See the PriceRunner API page →
E-commerce & Marketplaces

PriceRunner API & Scraper

PriceRunner is Klarna's price comparison site for the United Kingdom (pricerunner.com, GBP), Sweden (pricerunner.se, SEK) and Denmark (pricerunner.dk, DKK).

6 actionsLive JSON1,000 free credits$0.67–$1.50 / 1,000 creditsMCP-ready
Get a free keyOpen in playground

🤖 Using an AI assistant? Copy this link into ChatGPT / Claude / Cursor — it reads every endpoint and parameter instantly and tells you if this API fits your use case.

This API reads all three as JSON, logged out; `country` picks the market and the same product_id works in each. `search` returns catalogue products with the lowest price, the cheapest offer, the number of shops, rating, popularity rank and product group, 48 per page, plus brand, price and attribute filters with counts. `category` lists a whole category with sort by popularity, price, rating or price drop. `offers` returns every shop for one product in one call: shop name, labels and payment methods, price, shipping cost, total including shipping, stock status, delivery days and instalment, filtered by new, used or refurbished and by domestic or foreign shops. `price_history` is PriceRunner's own daily lowest price with the shop that had it, from one week to the full history. `product` adds the spec sheet, the variants of its product group, the category rank and PriceRunner's verdict on today's price; `reviews` returns user reviews, expert tests and verified-buyer reviews with the star histogram.

Reference

What a PriceRunner field actually contains

Fields that read differently from how they look. Every row was measured against live PriceRunner responses on 2026-10-15.

FieldWhat it holds
countryuk, se or dk. Prices, shops and offers are per market and in that market's currency (GBP, SEK, DKK); the same product_id (e.g. 3409202905, an iPhone 15) exists in all three.
lowest_price (search row)The lowest price PriceRunner shows on the product card. It equalled the cheapest row of offers on 12 of 12 products across the three markets, and the row's cheapest_offer_price on 672 of 672 search rows.
site_applied_filterPriceRunner narrows a free-text search to the category it guesses: "headphones" matched 14,781 products in Headphones, 53,339 with auto_category=false. This field says which category and attribute it applied.
offers[].total_pricePrice plus the shop's shipping cost, computed because PriceRunner prints no total. Shipping was published on 197 of 209 offer rows; where it is missing, total_price is null rather than guessed.
condition (offers)PriceRunner does not label each offer new or used; the list is filtered by condition. The default is new, as on the site; used, refurbished or all return the other lists. condition_counts gives the counts (an iPhone 15: new 14, refurbished 33, used 13).
summary.lowest_nationalPriceRunner's own lowest domestic price for the product. It can sit below the cheapest row of the filtered list because it also counts offers outside that stock filter (2 of 12 products).
price_history.points[]One point per day: the lowest price that day, the shop and its offer id. It spans every condition, so a refurbished offer can set the day's low.
points[].suspect_lowPriceRunner's chart keeps days far below the normal band (an iPhone 15 at 25.30 GBP and 140 GBP from one shop, against a 478.61 GBP median). Such points are returned as published and flagged; lowest_in_range_excluding_suspect leaves them out.
variants[]The other members of the product's group (colours, storage sizes), each with its own product_id and lowest price. Price history is per variant: two colours of the same phone shared 0 of 93 daily points.

The same search and offer lists came back identical from five different network locations, so the market is set by the country you ask for, not by where the request comes from.

Live example

Real request and response JSON

Captured from the indexed primary action, search, on .

Captured request
{
  "method": "POST",
  "url": "https://api.reefapi.com/pricerunner/v1/search",
  "headers": {
    "x-api-key": "$REEF_KEY",
    "content-type": "application/json"
  },
  "body": {
    "query": "iphone 15",
    "country": "uk"
  }
}
Captured response
{
  "ok": true,
  "meta": {
    "api": "pricerunner",
    "endpoint": "search",
    "mode": "live",
    "latency_ms": 1174.2,
    "record_count": 48,
    "bytes": 58286,
    "cache_hit": false,
    "total": 99,
    "upstream_requests": 2,
    "charged_credits": 3,
    "version": "0.1.0",
    "request_id": "820cd601c36f45a4",
    "queue_ms": 1,
    "fetched_at": "2026-10-15T17:02:59.142Z"
  },
  "data": {
    "results": [
      {
        "row_type": "product",
        "product_id": "3208336570",
        "title": "Apple iPhone 15, 128GB Blue",
        "url": "https://www.pricerunner.com/pl/1-3208336570/Mobile-Phones/Apple-iPhone-15-128GB-Blue-Compare-Prices",
        "description": "iOS",
        "category": {
          "category_id": "1",
          "name": "Mobile Phones"
        },
        "brand": null,
        "image": "https://owp.klarna.com/product/3217465789/Apple-iPhone-15-128GB-Blue.jpg",
        "lowest_price": 359.99,
        "cheapest_offer_price": 359.99,
        "cheapest_offer_merchant_id": "251843",
        "price_mismatch": false,
        "currency": "GBP",
        "price_per_unit": null,
        "shop_count": 17,
        "rating": 4.25,
        "rating_count": 3693,
        "popularity_rank": 75,
        "rank_trend": "MISSING",
        "price_drop": null,
        "ribbon": null,
        "out_of_stock": false,
        "condition": "NEW",
        "classification": "ONE",
        "product_group": null,
        "instalment": {
          "price": 119.99,
          "term_length": 3,
          "interval": "MONTHLY"
        }
      },
      {
        "row_type": "product",
        "product_id": "3409202905",
        "title": "Apple iPhone 15, 128GB Black",
        "url": "https://www.pricerunner.com/pl/1-3409202905/Mobile-Phones/Apple-iPhone-15-128GB-Black-Compare-Prices",
        "description": "iOS",
        "category": {
          "category_id": "1",
          "name": "Mobile Phones"
        },
        "brand": null,
        "image": "https://owp.klarna.com/product/3215657615/Apple-iPhone-15-128GB-Black.jpg",
        "lowest_price": 369.99,
        "cheapest_offer_price": 369.99,
        "cheapest_offer_merchant_id": "251843",
        "price_mismatch": false,
        "currency": "GBP",
        "price_per_unit": null,
        "shop_count": 14,
        "rating": 4.25,
        "rating_count": 3691,
        "popularity_rank": 78,
        "rank_trend": "MISSING",
        "price_drop": null,
        "ribbon": "WATCHED",
        "out_of_stock": false,
        "condition": "NEW",
        "classification": "ONE",
        "product_group": null,
        "instalment": {
          "price": 123.33,
          "term_length": 3,
          "interval": "MONTHLY"
        }
      },
      {
        "row_type": "product",
        "product_id": "3396782545",
        "title": "Apple iPhone 15, 128GB Yellow",
        "url": "https://www.pricerunner.com/pl/1-3396782545/Mobile-Phones/Apple-iPhone-15-128GB-Yellow-Compare-Prices",
        "description": null,
        "category": {
          "category_id": "1",
          "name": "Mobile Phones"
        },
        "brand": null,
        "image": "https://owp.klarna.com/product/3202563198/Apple-iPhone-15-128GB-Yellow.jpg",
        "lowest_price": 439,
        "cheapest_offer_price": 439,
        "cheapest_offer_merchant_id": "120",
        "price_mismatch": false,
        "currency": "GBP",
        "price_per_unit": null,
        "shop_count": 4,
        "rating": 4.25,
        "rating_count": 3691,
        "popularity_rank": 41343,
        "rank_trend": "MISSING",
        "price_drop": null,
        "ribbon": null,
        "out_of_stock": false,
        "condition": "NEW",
        "classification": "ONE",
        "product_group": null,
        "instalment": {
          "price": 146.33,
          "term_length": 3,
          "interval": "MONTHLY"
        }
      }
    ],
    "count": 48,
    "total": 99,
    "page": 1,
    "page_size": 48,
    "has_more": true,
    "categories": [
      {
        "category_filter": "cl1",
        "name": "Mobile Phones",
        "url": "https://www.pricerunner.com/cl/1/Mobile-Phones?attr_60501678=510242"
      }
    ],
    "filters": [
      {
        "filter_id": "BRAND",
        "name": "Brand",
        "unit": null,
        "type": "OPTIONS_OR",
        "options": [
          {
            "id": "[trimmed-depth]",
            "value": "[trimmed-depth]",
            "from": "[trimmed-depth]",
            "to": "[trimmed-depth]",
            "count": "[trimmed-depth]"
          },
          {
            "id": "[trimmed-depth]",
            "value": "[trimmed-depth]",
            "from": "[trimmed-depth]",
            "to": "[trimmed-depth]",
            "count": "[trimmed-depth]"
          }
        ]
      },
      {
        "filter_id": "57315476",
        "name": "Internal Memory Size",
        "unit": null,
        "type": "OPTIONS_OR",
        "options": [
          {
            "id": "[trimmed-depth]",
            "value": "[trimmed-depth]",
            "from": "[trimmed-depth]",
            "to": "[trimmed-depth]",
            "count": "[trimmed-depth]"
          },
          {
            "id": "[trimmed-depth]",
            "value": "[trimmed-depth]",
            "from": "[trimmed-depth]",
            "to": "[trimmed-depth]",
            "count": "[trimmed-depth]"
          },
          {
            "id": "[trimmed-depth]",
            "value": "[trimmed-depth]",
            "from": "[trimmed-depth]",
            "to": "[trimmed-depth]",
            "count": "[trimmed-depth]"
          }
        ]
      },
      {
        "filter_id": "PRICE",
        "name": "Price",
        "unit": "GBP",
        "type": "INTEGER_RANGE",
        "options": [
          {
            "id": "[trimmed-depth]",
            "value": "[trimmed-depth]",
            "from": "[trimmed-depth]",
            "to": "[trimmed-depth]",
            "count": "[trimmed-depth]"
          },
          {
            "id": "[trimmed-depth]",
            "value": "[trimmed-depth]",
            "from": "[trimmed-depth]",
            "to": "[trimmed-depth]",
            "count": "[trimmed-depth]"
          },
          {
            "id": "[trimmed-depth]",
            "value": "[trimmed-depth]",
            "from": "[trimmed-depth]",
            "to": "[trimmed-depth]",
            "count": "[trimmed-depth]"
          }
        ]
      }
    ],
    "site_applied_filter": {
      "af_CATEGORY": "cl1",
      "af_60501678": "510242"
    },
    "spelling_suggestion": null,
    "query": "iphone 15",
    "country": "uk",
    "currency": "GBP",
    "auto_category": true
  }
}
Actions

What the PriceRunner API does

ActionDescriptionConcrete use caseKey params
searchKeyword search on PriceRunner (pricerunner.com UK,.se Sweden,.dk Denmark). Rows are catalogue products with lowest price, cheapest offer, number of shops, rating, popularity rank and product group. The site narrows a free-text query to the category it guesses (`site_applied_filter`); `auto_category: false` searches the whole catalogue. Filter by brand, category and price (ids come from `filters` and `categories` of an earlier call).Pricing teams call search to get keyword search on PriceRunner (pricerunner.com UK,.se Sweden,.dk Denmark).query, country, page, brand_id, category_filter, ...
categoryOne PriceRunner category listing (e.g. 1 = Mobile Phones): the same rows as `search`, with sort, brand, price and attribute filters and paging, plus the category's own filter lists with counts.Marketplace operators call category to get one PriceRunner category listing (e.g.category_id, country, page, sort, brand_id, ...
productOne PriceRunner product: title, brand, category path, image, description, editorial article and FAQ, rating and count, popularity rank in its category, national lowest / highest price and offer count, international lowest price, lowest in-stock price, PriceRunner's price-level verdict with its change, the full spec sheet and every variant of its product group with its own id and price.Catalog enrichment teams call product to get one PriceRunner product.product_id, country
offersEvery shop's offer for one product on PriceRunner: shop (name, id, rating and count, labels, payment methods, return policy), offer title, price, shipping cost, total incl. shipping, campaign price, stock status, delivery days, instalment, attributes, and the click-out link; plus the national / international price summary and the sponsored placements apart. Filter by condition (new, used, refurbished), national or international shops and stock; sort by PriceRunner's recommendation, price, price with shipping or delivery time.Retail analysts call offers to get every shop's offer for one product on PriceRunner.product_id, country, sort, condition, origin, ...
price_historyPriceRunner's own price history for one product: the lowest price on each day with the shop that had it, lowest / highest / median in the range. The source's daily lowest spans every condition and contains single days far below the band (mis-matched shop offers); those are kept as published and flagged `suspect_low`.Pricing teams call price_history to get priceRunner's own price history for one product.product_id, country, time_range, merchant_id
reviewsReviews of one product on PriceRunner: user reviews PriceRunner collects from retailers, expert test reviews, or Klarna verified-buyer reviews — score, text, author, source shop or publication, date, language. Paged with `cursor`. `include_summary` adds the overall score, counts and the 1-5 star histogram.Marketplace operators call reviews to get reviews of one product on PriceRunner.product_id, country, review_type, limit, cursor, ...
Code samples

Call search from your stack

curl -X POST https://api.reefapi.com/pricerunner/v1/search \
  -H "x-api-key: $REEF_KEY" \
  -H "content-type: application/json" \
  -d '{"query":"iphone 15","country":"uk"}'
MCP one-liner
Ask your MCP-connected assistant: call reefapi.pricerunner.search with {"query":"iphone 15","country":"uk"}.
Use cases

Who uses this API and why

  • Track every UK, Swedish or Danish shop's price, shipping and stock for a product list.
  • Pull PriceRunner's daily price history to judge whether today's price is a good one.
  • Compare one product's price across the UK, Sweden and Denmark with the same id.
  • Map a category with prices, ratings, brands and popularity rank.
  • Collect user and expert reviews with scores per product.
FAQ

Questions developers ask before integrating

Do I need a PriceRunner or Klarna account?

No. Everything is read logged out.

Which countries are covered?

The United Kingdom (pricerunner.com), Sweden (pricerunner.se) and Denmark (pricerunner.dk). Set country to uk, se or dk; prices come in GBP, SEK or DKK.

How many shops does offers return?

All of them in one call, up to max_offers (default 100). An iPhone 15 in the UK had 26 orderable new offers and 103 offers in every condition and stock status on 2026-10-15.

Is shipping included?

Every offer carries the shipping cost and total_price, price plus shipping. sort=price_with_shipping ranks by what the buyer pays.

How far back does price_history go?

1w, 1m, 3m (93 daily points), 1y, 2y or all. For an iPhone 15 all went back to 13 September 2023, 1,129 daily points.

Which filters are there?

Brand, price range and attribute filters (category), brand, category and price range (search), checked against the unfiltered count in the same run: Mobile Phones 8,644 → Apple 881, 300 to 500 GBP 1,846, series Apple iPhone 17 78. The ids come back in the filters of the same response.

Why does my search return fewer products than I expected?

PriceRunner narrows many queries to a category it guesses; site_applied_filter shows which. Send auto_category=false to search the whole catalogue. A filter you send yourself replaces the guess.

What reviews are available?

review_type=user returns reviews PriceRunner collects from retailers (an iPhone 15 had 3,679), pro returns expert tests (14), customer returns Klarna verified-buyer reviews. include_summary adds the score and the 1-5 star histogram.

What is the PriceRunner API?

PriceRunner API is a ReefAPI endpoint group for uk, swedish and danish price comparison: every shop's price with shipping, the daily price history, specs, variants and reviews. It returns live JSON through POST requests under /pricerunner/v1.

Is the PriceRunner API free to try?

Yes. ReefAPI starts with 1,000 free credits, no card required. PriceRunner calls use the same shared credit balance as every other ReefAPI engine.

Do I need a PriceRunner login or account?

No login to PriceRunner is needed for the API response. You call ReefAPI with your x-api-key header, and the playground can run live examples before you create a production key.

How fresh is the PriceRunner data?

The page example is captured from a live search call, and production requests fetch live data through ReefAPI rather than a static sample.

How many credits does the PriceRunner API use?

PriceRunner actions currently cost 2-3 credits per successful call. Failed or blocked calls are free. All APIs draw from one credit pool.

Can I call PriceRunner from an AI assistant or MCP client?

Yes. Connect ReefAPI once through MCP and your assistant can call pricerunner actions with the same key, credit pool and JSON envelope used by normal REST requests.

docs / pricerunner

PriceRunner

UK, Swedish and Danish price comparison: every shop's price with shipping, the daily price history, specs, variants and reviews.

base /pricerunner/v16 endpoints
post/pricerunner/v1/category2 credits

One PriceRunner category listing (e.g. 1 = Mobile Phones): the same rows as `search`, with sort, brand, price and attribute filters and paging, plus the category's own filter lists with counts.

ParameterAllowed / rangeDescription
category_idrequired—Numeric PriceRunner category id: the number in /cl/<id>/…, `category.category_id` of a search row or `category_path` of `product`.
country = ukoptionaluk · se · dkWhich PriceRunner: uk = pricerunner.com (GBP), se = pricerunner.se (SEK), dk = pricerunner.dk (DKK). Product ids are shared across the three; prices, shops and offers are per market.
page = 1optional1–100Result page, 48 rows each. A page past the last returns no rows.
sort = popularityoptionalpopularity · price_asc · price_desc · rating · price_drop · nameResult order.
brand_idoptional—Brand id from the BRAND entry of `filters` of an earlier call (uk: 162 = Apple).
price_minoptional0–Lowest price in the market's currency (the site's own price index, matched against the product's lowest price).
price_maxoptional0–Highest price in the market's currency.
attribute_filteroptional—One attribute filter as `<filter_id>:<option_id>` from `filters` of an earlier call (uk category 1: 60501678:510242 = Series Apple iPhone 15).
Try in playground →
post/pricerunner/v1/product3 credits

One PriceRunner product: title, brand, category path, image, description, editorial article and FAQ, rating and count, popularity rank in its category, national lowest / highest price and offer count, international lowest price, lowest in-stock price, PriceRunner's price-level verdict with its change, the full spec sheet and every variant of its product group with its own id and price.

ParameterAllowed / rangeDescription
product_idrequired—PriceRunner product id: `product_id` of a search / category row, or the number after the dash in a product URL (/pl/1-<id>/…).
country = ukoptionaluk · se · dkWhich PriceRunner: uk = pricerunner.com (GBP), se = pricerunner.se (SEK), dk = pricerunner.dk (DKK). Product ids are shared across the three; prices, shops and offers are per market.
Try in playground →
post/pricerunner/v1/offers2 credits

Every shop's offer for one product on PriceRunner: shop (name, id, rating and count, labels, payment methods, return policy), offer title, price, shipping cost, total incl. shipping, campaign price, stock status, delivery days, instalment, attributes, and the click-out link; plus the national / international price summary and the sponsored placements apart. Filter by condition (new, used, refurbished), national or international shops and stock; sort by PriceRunner's recommendation, price, price with shipping or delivery time.

ParameterAllowed / rangeDescription
product_idrequired—PriceRunner product id: `product_id` of a search / category row, or the number after the dash in a product URL (/pl/1-<id>/…).
country = ukoptionaluk · se · dkWhich PriceRunner: uk = pricerunner.com (GBP), se = pricerunner.se (SEK), dk = pricerunner.dk (DKK). Product ids are shared across the three; prices, shops and offers are per market.
sort = recommendedoptionalrecommended · price · price_with_shipping · deliveryOffer order.
condition = newoptionalnew · used · refurbished · allWhich offers by condition (the site's default view is new).
origin = nationaloptionalnational · international · allShops in the market's own country, foreign shops selling into it, or both.
stock = availableoptionalavailable · in_stock · allStock filter.
max_offers = 100optional1–300Cap on the rows returned (PriceRunner sends the whole list in one response).
Try in playground →
post/pricerunner/v1/price_history2 credits

PriceRunner's own price history for one product: the lowest price on each day with the shop that had it, lowest / highest / median in the range. The source's daily lowest spans every condition and contains single days far below the band (mis-matched shop offers); those are kept as published and flagged `suspect_low`.

ParameterAllowed / rangeDescription
product_idrequired—PriceRunner product id: `product_id` of a search / category row, or the number after the dash in a product URL (/pl/1-<id>/…).
country = ukoptionaluk · se · dkWhich PriceRunner: uk = pricerunner.com (GBP), se = pricerunner.se (SEK), dk = pricerunner.dk (DKK). Product ids are shared across the three; prices, shops and offers are per market.
time_range = 3moptional1w · 1m · 3m · 1y · 2y · allHow far back (one point per day).
merchant_idoptional—Only this shop's line (`merchant.merchant_id` of an `offers` row).
Try in playground →
post/pricerunner/v1/reviews2 credits

Reviews of one product on PriceRunner: user reviews PriceRunner collects from retailers, expert test reviews, or Klarna verified-buyer reviews — score, text, author, source shop or publication, date, language. Paged with `cursor`. `include_summary` adds the overall score, counts and the 1-5 star histogram.

ParameterAllowed / rangeDescription
product_idrequired—PriceRunner product id: `product_id` of a search / category row, or the number after the dash in a product URL (/pl/1-<id>/…).
country = ukoptionaluk · se · dkWhich PriceRunner: uk = pricerunner.com (GBP), se = pricerunner.se (SEK), dk = pricerunner.dk (DKK). Product ids are shared across the three; prices, shops and offers are per market.
review_type = useroptionaluser · pro · customerWhich reviews.
limit = 10optional1–50Reviews per call.
cursoroptional—`next_cursor` of the previous call, for the next batch.
include_summary = falseoptional—Also return the overall score, counts and star histogram (one more request).
Try in playground →
Built for volume
5M+ requests a day

Measured at 60 requests a second across the fleet, with no central bottleneck. Volume pricing is on request, and per-key limits are raised for high-volume accounts.

Missing a source?
We build it

Tell us a site we do not cover yet and it becomes an engine. A customer asked for bestprice.gr on a Sunday and it was in the catalog the next day.

Support
2 minute median reply

Median time from a question in the live chat to the first answer, measured across every answered conversation. Setup help included, no support tier to buy.

One key, one balance
Every API included

No per-site plans and no separate subscriptions. One key and one credit pool across the whole catalog, so adding a source costs nothing up front.

Planning something large? Tell us the volume and the sources and we will come back with what it costs and what we would have to build.