# 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
- **Features:** Limited permissions
- **Stats:** 6 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**.

> 👉 **Try it now:** press **Start**. The ready-made input gives you 10 products in a few seconds.<br>
> 💰 **$0.018 per product** on the Free plan (10 products per run), from $0.016 on paid plans. [See pricing](#-pricing)

### ✨ Why this scraper?

> - **The only Apify actor for all 7 Prisjakt sites**<br>
>   The others read Sweden only (October 2026).
>
> - **More data per product**<br>
>   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**<br>
>   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**<br>
>   About 1,000 products in 15 to 20 seconds, or 40 seconds with every store offer and price history.
>
> - **Nothing to set up**<br>
>   No proxy, no login, no browser.
>
> - **7 markets in one actor**<br>
>   Pick one or several; each search, category and EAN runs in every market picked.
>
> - **Apify platform**<br>
>   Schedule runs, get only new products, export to Excel or CSV, use the API, or connect Google Sheets, Zapier and Make.

### ⚖️ 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 |

### 🚀 How to scrape Prisjakt & PriceSpy

1. Create a free Apify account.
2. Pick the filters you need, or keep the ready-made input.
3. Click **Start**.
4. Download the products as Excel, CSV or JSON from the **Output** tab.

### 💰 Pricing

#### How much does it cost to scrape Prisjakt & PriceSpy?

You pay a one-time **$0.003** per run, plus a price for each product saved (and for each add-on you turn on):

| Charged for | Free | Bronze | Silver | Gold+ |
| --- | --- | --- | --- | --- |
| **Product**: One product with its lowest price, cheapest store, ratings and specs. | 0.018 | 0.016 | 0.014 | 0.012 |
| **Price history**: Lowest prices of the last 2 years for one product (add-on). | 0.01 | 0.009 | 0.008 | 0.007 |

Example: 1,000 products cost about **$16** on Bronze. No proxy or compute costs on top.

### 📦 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"
}
```

### ⚙️ Input

| 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. |

#### Input examples

**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" }
  ]
}
```

### 🔗 Related scrapers

> - [8891 Scraper](https://apify.com/normdata/auto8891-scraper): Taiwan Used Cars: Prices, Mileage, Dealers.
> - [Autoline, Machineryline & Agroline Scraper](https://apify.com/normdata/autoline-scraper)
> - [AutoScout24 Scraper](https://apify.com/normdata/autoscout24-scraper)
> - [AutoTempest Scraper](https://apify.com/normdata/autotempest-scraper)

### ❓ FAQ and troubleshooting

#### Is there a Prisjakt & PriceSpy API? Do I need an API key?

> Prisjakt & PriceSpy has no public data API for this. This Actor works as a Prisjakt & PriceSpy API alternative: it reads the public pages and gives you clean JSON, CSV or Excel, with no API key, no login and no code to maintain. You can also call it from your own code with the Apify API, or from an AI agent through MCP.

#### Why do I get only 10 products?

> On the Apify free plan each run saves up to 10 results, so you can try it before paying. Any paid plan removes the limit.

#### 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.

#### 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.

#### Is this an official Prisjakt & PriceSpy tool?

> No. It is independent and not affiliated with Prisjakt & PriceSpy. It reads only data Prisjakt & PriceSpy publishes on its public pages, at a moderate pace. Use the data in line with Prisjakt & PriceSpy's terms and the laws that apply to you.

### 📧 Contact

Need a scraper for a different site, or found something wrong with this one? norm.data.scrapers@gmail.com

# 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/JNhmcQWbRGH74jLdw/openapi.json
