# Prisjakt & PriceSpy Scraper (`normdata/prisjakt-scraper`) Actor

Scrape Prisjakt, PriceSpy, Prisjagt, Hintaopas and LeDenicheur in 7 countries: lowest price, every store offer with shipping, specs, EAN, rating, price drop, 2 year price history. Search, categories, EAN lookup, 9 filters, price change monitoring.

- **URL**: https://apify.com/normdata/prisjakt-scraper.md
- **Developed by:** [Norm Data](https://apify.com/normdata) (community)
- **Categories:** E-commerce, Lead generation
- **Stats:** 3 total users, 2 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $12.00 / 1,000 products

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.
Since this Actor supports Apify Store discounts, the price gets lower the higher subscription plan you have.

Learn more: https://docs.apify.com/actors/running/actors-in-store.md#pay-per-event

## What's an Apify Actor?

An Actor is a serverless cloud program that runs on the Apify platform. It has two run modes.
In Batch mode, an Actor accepts a well-defined JSON input, performs an action which can take anything from a few seconds to a few hours,
and optionally produces a well-defined JSON output, datasets with results, or files in key-value store.
In Standby mode, an Actor provides a web server which can be used as a website, API, or an MCP server.

Apify vocabulary and the platform model are defined once, in the agent quickstart at https://apify.com/agents.md.

## How to integrate an Actor?

If asked about integration, you help developers integrate Actors into their projects.
You adapt to their stack and deliver integrations that are safe, well-documented, and production-ready.

Do not guess an integration path. Every one of them is in the agent quickstart at https://apify.com/agents.md: the Apify MCP server, Agent Skills with the Apify CLI, the JavaScript and Python clients, the REST API, and the account-free path for an agent with no human to sign in. It also carries the rule on stating cost before the first paid run.

For examples already wired to this Actor's own input schema, see the [API](#api) section below.

Each client library has reference documentation the quickstart does not restate: [JavaScript/TypeScript](https://docs.apify.com/api/client/js/docs.md) (`npm install apify-client`) and [Python](https://docs.apify.com/api/client/python/docs.md) (`pip install apify-client`).

# README

![Norm Data](https://raw.githubusercontent.com/FabriAV/normdata/refs/heads/main/assets/banner_norm2.png)

## 🛒 Prisjakt & PriceSpy Scraper - Prices, Store Offers & Price History

Extract product prices from **Prisjakt** and its sister sites in **7 countries**: 🇸🇪 Prisjakt.nu (Sweden), 🇳🇴 Prisjakt.no (Norway), 🇩🇰 Prisjagt.dk (Denmark), 🇫🇮 Hintaopas.fi (Finland), 🇬🇧 PriceSpy.co.uk (UK), 🇳🇿 PriceSpy.co.nz (New Zealand) and 🇫🇷 LeDenicheur.fr (France). For every product you get the **lowest price, price with shipping, highest price, cheapest refurbished and used price, the cheapest store with its rating, number of stores, price drop, rating, reviews, popularity rank, stock, category, EAN barcodes, variants and every spec on the product page**. Turn on **Every store offer** for the full list of offers (price, shipping, stock, condition, delivery days, store rating, link), and the **Price history** add-on for the **lowest price of the last 30 days, 90 days, 1 year and 2 years** and every price change. Search by words, categories or **EAN codes**, use 9 filters, paste links, or run it on a schedule to get **only price changes**.

### 🎯 Who uses it?

#### 🏪 Retailers and e-commerce teams

See what every competitor charges for the products you sell, with shipping, stock and delivery time, in 7 countries. Look up your own catalogue by EAN.

#### 🏭 Brands and manufacturers

Check how your products are priced in every store, spot sellers under your recommended price, and follow refurbished and used prices.

#### 📈 Pricing and market analysts

Compare price levels for the same product across countries (product IDs are the same on every site), follow 2 years of price history and which products are dropping in price.

#### 🛍️ Deal sites and affiliates

Find products at their 2 year low or with the biggest price drops, with the cheapest store's link.

### ✨ What it does

- **7 markets in one actor.** Pick one or several; each search, category and EAN runs in every market picked.
- **Search** by words (up to 1,000 products per search), **categories** by name in English or in the market's language (up to 10,000 products each), or **EAN / barcodes** to price your own catalogue.
- **Every store offer** (free option): store, store rating, country, price, price with shipping, shipping cost, original and member price, stock, condition (new, refurbished, used), delivery days and link.
- **Price history add-on:** lowest price of the last 30 days, 90 days, 1 year and 2 years with store and date, whether today is the 2 year low, and every price change of the last 2 years.
- **9 filters:** brands, price range, rating, reviews, price drop, number of stores, in stock only, plus 6 sort orders.
- **Or paste links.** Category pages (with any filters set on the site), search pages and product pages from any of the 7 sites. Filters are ignored with links.
- **Monitoring:** run it on a schedule with **Only new products**, or with **Only price changes** to get just the products whose price moved, with the previous price and the change.

### 🏆 Why this scraper

- **The only Apify actor for all 7 Prisjakt sites.** The others read Sweden only (October 2026).
- **More data per product.** Every spec on the product page (60+ for a phone), all EAN codes, variants, refurbished and used prices, popularity rank, and 2 years of price history.
- **Prices you can trust.** In our tests the lowest price matched the site's own list for every product, and the cheapest store for 99% (the rest were ties at the same price).
- **Fast.** About 1,000 products in 15 to 20 seconds, or 40 seconds with every store offer and price history.
- **Nothing to set up.** No proxy, no login, no browser.

### ⚖️ How it compares

| Capability | This actor | Other Prisjakt actors |
|---|:--:|:--:|
| Sweden (Prisjakt.nu) | **yes** | yes |
| Norway, Denmark, Finland, UK, New Zealand, France | **yes** | no |
| Search, categories and EAN lookup | **yes** | partly |
| Every store offer with shipping, stock and delivery days | **yes** | partly |
| Full specs, EANs, variants | **yes** | no |
| Refurbished and used prices | **yes** | no |
| 2 year price history and lowest prices | **yes** | no |
| Filters (brand, price, rating, reviews, drop, stores, stock) | **9** | few or none |
| Only new products / only price changes monitoring | **yes** | no |
| Proxy | **none needed** | varies |

### 📦 What data you get

| Field | Description |
| --- | --- |
| `imageUrl` | Product photo. |
| `productId` | Prisjakt product ID (the same in every market). |
| `name`, `brand` | Product name and brand. |
| `market`, `currency` | Market code (SE, NO, DK, FI, UK, NZ, FR) and currency of the prices. |
| `price`, `priceWithShipping` | Lowest price of a new item in stock, as the site shows it, and with shipping. Empty when no store sells it new now. |
| `previousPrice`, `priceChange` | With "Only price changes": the price in the last run and the change. |
| `highestPrice` | Highest store price for a new item. |
| `lowestRefurbishedPrice`, `lowestUsedPrice` | Cheapest refurbished and used offers. |
| `lowestPrice30Days`, `lowestPrice90Days`, `lowestPrice1Year`, `lowestPrice2Years`, `lowestPrice2YearsStore` | *(Price history)* Lowest price in the last 30 days, 90 days, 1 year and 2 years, with the store. |
| `storeCount`, `offerCount` | Stores selling it new, and all offers (new, refurbished, used). |
| `bestStore`, `bestStoreRating` | Store with the lowest price and its rating. |
| `priceDropPercent` | The site's price drop mark (how much the price fell lately). |
| `rating`, `reviewCount` | User rating (1 to 5) and number of reviews. |
| `popularityRank`, `categoryRank` | Popularity rank on the whole site and in its category. |
| `stock` | In stock, Incoming, Pre-order, Out of stock... |
| `category`, `categoryPath` | Category and its full path. |
| `ean` | Main EAN barcode. |
| `source`, `position` | The search, category or link it came from, and its place in that list. |
| `inStock` | A store has it in stock now. |
| `atLowestPrice` | *(Price history)* Today's price is the lowest of the last 2 years. |
| `url`, `categoryUrl` | Product page and category page. |
| `specs` | Every spec shown on the product page (weight, screen size, battery...). |
| `eans`, `variants` | Every EAN barcode, and the variants (color, size) with their EAN and SKU. |
| `offers` | With "Every store offer": every store offer (store, rating, country, price, price with shipping, shipping, original and member price, stock, condition, delivery days, link). |
| `priceHistory` | *(Price history)* Lowest price each time it changed in the last 2 years, with the day and the store. |
| `firstListedAt`, `releaseDate` | When the product was added to the site, and its release date. |
| `lowestPrice2YearsDate`, `historySince` | *(Price history)* Day of the 2 year low, and the first day of the history. |
| `scrapedAt` | When this row was saved. |
| `error` | Only present when a row failed. The fields that loaded are still there. |

Fields marked *Price history* only appear when that add-on is on.

#### Example row (trimmed)

```json
{
  "imageUrl": "https://pricespy-75b8.kxcdn.com/product/standard/800/15415649.jpg",
  "productId": 15415649,
  "name": "Apple AirPods Pro 3 2025",
  "brand": "Apple",
  "market": "UK",
  "currency": "GBP",
  "price": 169,
  "priceWithShipping": 169,
  "highestPrice": 219,
  "lowestRefurbishedPrice": 162.99,
  "lowestUsedPrice": 49.99,
  "lowestPrice30Days": 167,
  "lowestPrice90Days": 159.99,
  "lowestPrice1Year": 155,
  "lowestPrice2Years": 155,
  "lowestPrice2YearsStore": "CeX",
  "storeCount": 14,
  "offerCount": 18,
  "bestStore": "OnBuy",
  "rating": 3.41,
  "reviewCount": 27,
  "popularityRank": 6,
  "categoryRank": 1,
  "stock": "In stock",
  "category": "Headphones",
  "categoryPath": "Audio & Video > Headphones",
  "ean": "0195950543612",
  "source": "search: airpods pro 3",
  "position": 1,
  "inStock": true,
  "atLowestPrice": false,
  "url": "https://pricespy.co.uk/product.php?p=15415649",
  "categoryUrl": "https://pricespy.co.uk/c/headphones",
  "specs": { "Acoustic design": "Closed", "Bluetooth version": "5.3", "Release year": "2025", "Microphone": true, "Driver technology": "Dynamic", "Channels": "Stereo", "Suitable for": "Training", "Type": "In-ear headphones", "Features": "Built-in heart rate monitor, Built-in wireless charging, Buttons/controls adapted for iPhone, Charging via USB, Supports fast charging, Compatible with voice assistant, QI ...", "Bluetooth profile": "HFP, HSP, A2DP, AVRCP", "Wireless": true, "Color": "White", "IP code (dust/water resistance)": "IP57", "Control": "Play/Pause, Next song, Previous song, Volume, Answer button", "Simulated surround sound": true, "Wired": false, "Wireless connection": "Bluetooth", "Bluetooth codec": "AAC, ALAC", "Type of connector": "USB-C", "Battery life": "8 h", "Headset": true, "Popular series": "AirPods Pro", "Keyword": "Airpods Pro Gen 3, Noise-cancelling headphones", "Active Noise Cancelling (ANC)": true, "Battery life (ANC)": "8 h" },
  "eans": ["0195950543612"],
  "variants": [{ "name": "Apple AirPods Pro 3 2025 - White", "ean": "0195950543612", "sku": null, "color": "White", "size": null }],
  "offers": [
    { "store": "OnBuy", "storeId": 34388, "storeRating": null, "storeReviews": 0, "storeCountry": "GB", "price": 169, "priceWithShipping": 169, "shippingCost": 0, "originalPrice": null, "memberPrice": null, "memberProgram": null, "stock": "In stock" }
  ],
  "priceHistory": [{ "date": "2025-09-13", "price": 219, "store": "Harvey Norman" }],
  "firstListedAt": "2025-09-09",
  "lowestPrice2YearsDate": "2026-07-03",
  "historySince": "2025-09-13",
  "scrapedAt": "2026-10-24T20:19:47.938Z"
}
```

### 💡 Use cases

**Every UK store's price for the latest iPhones:**

```json
{
  "markets": ["UK"],
  "searchTerms": ["iphone 17"],
  "includeOffers": true
}
```

**The same products in all 7 countries, by EAN:**

```json
{
  "markets": ["SE", "NO", "DK", "FI", "UK", "NZ", "FR"],
  "eans": ["0195950643602", "0195950627060"],
  "includeOffers": true
}
```

**Samsung and LG TVs from 300 to 1,500 GBP, in stock, rated 4+, cheapest first:**

```json
{
  "markets": ["UK"],
  "categories": ["TVs"],
  "brands": ["Samsung", "LG"],
  "minPrice": 300,
  "maxPrice": 1500,
  "minRating": 4,
  "onlyInStock": true,
  "sort": "price"
}
```

**Headphones at a big price drop in Sweden, with 2 years of price history:**

```json
{
  "markets": ["SE"],
  "categories": ["Hörlurar"],
  "minPriceDrop": 15,
  "includePriceHistory": true
}
```

**Daily price changes for a whole category (schedule this run):**

```json
{
  "markets": ["SE"],
  "categories": ["Mobiltelefoner"],
  "onlyPriceChanges": true,
  "monitorName": "se-phones-daily"
}
```

**Links (filters are ignored):**

```json
{
  "startUrls": [
    { "url": "https://www.prisjakt.nu/c/mobiltelefoner?brand=142" },
    { "url": "https://pricespy.co.uk/product.php?p=14969878" },
    { "url": "https://ledenicheur.fr/search?query=airpods" }
  ]
}
```

### ⚙️ How the input is organised

| Section | What it's for |
| --- | --- |
| **Maximum results** | Always first, caps the whole run. Empty means no limit. |
| **What to scrape** | Markets, search, categories, barcodes (EAN, UPC), every store offer and price history (2 years). |
| **Filters** | Brands, minimum price, maximum price, minimum rating, minimum reviews, minimum price drop (%), minimum stores, only in stock and sort. |
| **Monitoring** | Only new products, only price changes and monitor name. |
| **Links** | Links instead of the fields above. Filters are ignored with links. |

### 💰 Pricing

Pay-per-event: a one-time **$0.003** when the run starts, plus a price per product saved to your dataset. The price depends on your Apify plan tier:

| Plan | Per product | Per 1,000 products |
| --- | --- | --- |
| Free | $0.018 | $18 |
| Bronze | $0.016 | $16 |
| Silver | $0.014 | $14 |
| Gold | $0.012 | $12 |

**Price history add-on:** when **Price history** is on, each product saved with its history adds one more charge:

| Plan | Per product | Per 1,000 products |
| --- | --- | --- |
| Free | $0.01 | $10 |
| Bronze | $0.009 | $9 |
| Silver | $0.008 | $8 |
| Gold | $0.007 | $7 |

**Every store offer** costs nothing extra: one row carries all the offers, so you pay once per product, not once per store. Products whose history could not be read pay only the base price, and products left out by filters are free. New Apify accounts start with $5 in free credit. On the Free plan, a run saves up to 10 products.

### 🚀 Run it

1. Create a free Apify account with $5 in credit.
2. Open the Prisjakt & PriceSpy Scraper.
3. Pick the markets, type a search, a category or an EAN, then click **Start**.
4. Export the results as CSV, Excel, JSON or XML from the Dataset tab.

### 🤖 Use with AI agents (MCP)

Connect the [Apify MCP server](https://mcp.apify.com) to Claude, ChatGPT, Cursor or any MCP client, then ask in plain words, for example: *"Find the cheapest store for the AirPods Pro 3 in Sweden, Norway and the UK, and tell me if today's price is the lowest of the last 2 years"*. The agent runs this Actor and reads the results.

### 🔧 Troubleshooting

- **The price is empty.** No store sells the product new right now. `lowestRefurbishedPrice`, `lowestUsedPrice` and the offers still show what is on sale.
- **The cheapest store differs from the site.** Several stores have the same lowest price; the site and this actor can pick a different one of them. The price is the same.
- **The 30 day low is lower than today's price.** A store had a short deal in the last 30 days. The price history shows when and which store.
- **A category was skipped.** The log says which. Use the name as shown on the site (in English or in the market's language), its link, or a broader name.
- **A search found fewer products than the site says.** The site's count includes shop offers that are not matched to a product; only products are saved.
- **EAN is empty.** The site has no barcode for that product.
- **New Zealand is slower.** PriceSpy NZ answers more slowly (about 4 products a second); the other markets are 10 times faster.

### ❓ FAQ

**How many products are there?** Each site has 3,000+ categories. A category gives up to 10,000 products and a search up to 1,000; use the price filters or the sort to reach more.

**Are prices in euros?** Each market's own currency: SEK, NOK, DKK, EUR (Finland, France), GBP and NZD. The `currency` field says which.

**Can I compare the same product across countries?** Yes. Product IDs are the same on every site, so `productId` links the rows.

**Is it legal?** It reads public price data, the same any visitor sees. Check the site's terms and your local laws for your use.

# Actor input Schema

## `maxItems` (type: `integer`):

Stop after this many products in total (over every market, search and category). Leave empty for no limit. The Apify Free plan is always capped at 10.

## `markets` (type: `array`):

The Prisjakt sites to read. Prices are in each market's own currency. Empty = Sweden.

## `searchTerms` (type: `array`):

Search words, like "iphone 17", "airpods pro" or "robot vacuum". The site finds up to 1,000 products per search (shop offers not matched to a product are left out).

## `categories` (type: `array`):

Category names, like "Mobile Phones", "TVs", "Headphones" or "Laptops", in English or in the market's language ("Mobiltelefoner"). Up to 10,000 products per category; use the sort and price filters to reach more.

## `eans` (type: `array`):

Product barcodes (EAN, UPC, GTIN, 8 to 14 digits). Each finds its product in every market picked, for price checks on your own catalogue.

## `includeOffers` (type: `boolean`):

Add the list of all store offers per product: store, rating, price, price with shipping, shipping cost, member price, stock, condition (new, refurbished, used), delivery days and link. Free.

## `includePriceHistory` (type: `boolean`):

Add the lowest price of the last 30 days, 90 days, 1 year and 2 years (with store and date), whether today is the lowest price, and every price change of the last 2 years. One extra request per product, charged as an add-on only for rows saved with it.

## `brands` (type: `array`):

Only these brands, like "Apple", "Samsung" or "Sony".

## `minPrice` (type: `integer`):

Lowest price at least this much (in the market's currency).

## `maxPrice` (type: `integer`):

Lowest price at most this much (in the market's currency).

## `minRating` (type: `number`):

Only products rated at least this much (1 to 5).

## `minReviews` (type: `integer`):

Only products with at least this many reviews.

## `minPriceDrop` (type: `integer`):

Only products whose price dropped at least this much lately (the site's price drop mark).

## `minStores` (type: `integer`):

Only products sold by at least this many stores.

## `onlyInStock` (type: `boolean`):

Only products that a store has in stock now.

## `sort` (type: `string`):

Order of the results. A search is sorted over every product it finds; for searches, most popular first is the order the site shows.

## `onlyNew` (type: `boolean`):

Skip products saved by earlier runs with the same monitor name.

## `onlyPriceChanges` (type: `boolean`):

Save only products whose lowest price changed since the last run with the same monitor name (plus products not seen before), with the previous price and the change. The first run saves everything.

## `monitorName` (type: `string`):

Runs with the same name share their history. Use a different name for each schedule.

## `startUrls` (type: `array`):

Category pages (https://pricespy.co.uk/c/mobile-phones, with any filters set on the site), search pages (https://www.prisjakt.nu/search?query=airpods) or product pages (https://pricespy.co.uk/product.php?p=14969878), from any of the 7 sites.

## Actor input object example

```json
{
  "maxItems": 10,
  "markets": [
    "UK"
  ],
  "searchTerms": [
    "iphone 17"
  ]
}
```

# Actor output Schema

## `results` (type: `string`):

No description

# API

You can run this Actor programmatically using our API. Below are code examples in JavaScript, Python, and CLI, as well as the OpenAPI specification and MCP server setup.

## JavaScript example

```javascript
import { ApifyClient } from 'apify-client';

// Initialize the ApifyClient with your Apify API token
// Replace the '<YOUR_API_TOKEN>' with your token
const client = new ApifyClient({
    token: '<YOUR_API_TOKEN>',
});

// Prepare Actor input
const input = {
    "maxItems": 10,
    "markets": [
        "UK"
    ],
    "searchTerms": [
        "iphone 17"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("normdata/prisjakt-scraper").call(input);

// Fetch and print Actor results from the run's dataset (if any)
console.log('Results from dataset');
console.log(`💾 Check your data here: https://console.apify.com/storage/datasets/${run.defaultDatasetId}`);
const { items } = await client.dataset(run.defaultDatasetId).listItems();
items.forEach((item) => {
    console.dir(item);
});

// 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/js/docs

```

## Python example

```python
from apify_client import ApifyClient

# Initialize the ApifyClient with your Apify API token
# Replace '<YOUR_API_TOKEN>' with your token.
client = ApifyClient("<YOUR_API_TOKEN>")

# Prepare the Actor input
run_input = {
    "maxItems": 10,
    "markets": ["UK"],
    "searchTerms": ["iphone 17"],
}

# Run the Actor and wait for it to finish
run = client.actor("normdata/prisjakt-scraper").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print(f"💾 Check your data here: https://console.apify.com/storage/datasets/{run.default_dataset_id}")
for item in client.dataset(run.default_dataset_id).iterate_items():
    print(item)

# 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/python/docs/quick-start

```

## CLI example

```bash
echo '{
  "maxItems": 10,
  "markets": [
    "UK"
  ],
  "searchTerms": [
    "iphone 17"
  ]
}' |
apify call normdata/prisjakt-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,normdata/prisjakt-scraper"
        }
    }
}
```

The hosted server signs you in with OAuth on first connect, so no API token belongs in this config. Clients without OAuth support can send an `Authorization: Bearer <APIFY_API_TOKEN>` header instead, using a token from API & Integrations in Apify Console (https://console.apify.com/settings/integrations).

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/actors/XfbdDCPx2rfmIIrHL/builds/iLhFX8RDnI22sTuRC/openapi.json
