# Illum Scraper — Danish Luxury Department Store Prices (`studio-amba/illum-scraper`) Actor

Scrape product data from shop.illum.dk, the webshop of ILLUM, Denmark's flagship department store in Copenhagen. Extract names, brands, prices, stock status and images via the store's own product search.

- **URL**: https://apify.com/studio-amba/illum-scraper.md
- **Developed by:** [Studio Amba](https://apify.com/studio-amba) (community)
- **Categories:** E-commerce
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $1.20 / 1,000 result scrapeds

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?

Actors are web data automations that power AI and operations. They run on the Apify platform to scrape websites, process data, connect APIs, and automate workflows.
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.
Actors are written with capital "A".

## 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.
The best way to integrate Actors is as follows.

- **AI agents and MCP clients** — the [Apify MCP server](https://docs.apify.com/integrations/mcp.md) at `https://mcp.apify.com` (remote, streamable HTTP, OAuth on first use).
- **Agentic workflows and local Actor development** — [Agent Skills](https://apify.com/.well-known/agent-skills/index.json) with the [Apify CLI](https://docs.apify.com/cli/docs.md): `npm install -g apify-cli`, then `apify login`.
- **JavaScript/TypeScript projects** — the official [JS/TS client](https://docs.apify.com/api/client/js/docs.md): `npm install apify-client`.
- **Python projects** — the official [Python client](https://docs.apify.com/api/client/python/docs.md): `pip install apify-client`.
- **Any other language** — the [REST API](https://docs.apify.com/api/v2.md).

For usage examples, see the [API](#api) section below.

For more details, see Apify documentation as [Markdown index](https://docs.apify.com/llms.txt) and [Markdown full-text](https://docs.apify.com/llms-full.txt).

# README

## Illum Scraper

Pull product data from shop.illum.dk, the webshop of ILLUM -- Denmark's flagship luxury department store on Strøget in Copenhagen. This scraper talks directly to the store's own Shopify search, so it returns clean, structured data -- brand, price, stock, category, images -- without waiting on a browser to render a page.

### How to scrape Illum data

Give the actor a Danish search term and it runs the same search shop.illum.dk's own visitors use. There's nothing else to configure -- no category URLs to hunt down, no cookies, no login.

Under the hood, ILLUM's e-commerce catalogue is not on illum.dk itself (that's a WordPress marketing site covering store info, opening hours and brand listings). The actual webshop lives on a separate Shopify-hosted subdomain, `shop.illum.dk`, running Shopify's Dawn theme behind Cloudflare. This actor uses three of the storefront's own endpoints, in order:

1. **Predictive search** (`/search/suggest.json`) -- Shopify's fast autocomplete endpoint, capped at roughly 10 matches but already carrying price, brand, stock and tags for each one.
2. **Rendered search results** (`/search?q=...&type=product`) -- when more than ~10 results are needed, this actor paginates through the store's real search results page. Illum's search engine matches semantically, not by literal substring -- a Danish query like `"kjole"` (dress) correctly returns products whose English catalogue tags say `"Dress"`, something a naive keyword filter over the raw product feed cannot do.
3. **Full catalogue lookup** (`/products.json`) -- fetched once per run into an in-memory map so search results found in step 2 (which don't show brand on the card itself) can be enriched with brand, SKU and stock without an extra request per product.

If you don't provide any input, it defaults to searching for `"kjole"` (Danish for "dress") as a demo.

#### A note on language

Product titles, descriptions and images are in whatever language the underlying Shopify record uses -- in practice this is a mix of Danish (own-brand and Danish-market listings) and English (many international designer brands list their English product copy as-is). Search terms should be Danish to match how the store's own visitors search, but the store's semantic search also handles common English terms reasonably well.

### Input

| Field | Type | Description |
|-------|------|-------------|
| `searchQuery` | string | Search term, in Danish (e.g. `"kjole"`, `"taske"`, `"creme"`) |
| `maxResults` | integer | Cap on number of products returned (default: 100, max: 2000) |
| `proxyConfiguration` | object | Apify proxy settings. shop.illum.dk has no anti-bot challenge, but Shopify itself rate-limits by IP regardless of WAF -- RESIDENTIAL (country DK) is used by default to avoid 429s on Apify's shared proxy pool |

### What you get back

| Field | Type | Example |
|-------|------|---------|
| `name` | string | `"SKIMS Satin Mini Dress"` |
| `brand` | string | `"SKIMS"` |
| `price` | number | null | `1330.00` |
| `originalPrice` | number | null | `2680.00` (null when not currently discounted) |
| `currency` | string | `"DKK"` |
| `sku` | string | null | `"Cla_12806052001_N/A_50-Ml"` (null on the fast predictive-search tier, which doesn't expose variant SKUs) |
| `productId` | string | `"10729741844826"` |
| `inStock` | boolean | null | `true` (null only if the source gives no availability signal) |
| `url` | string | Full product page URL |
| `imageUrl` | string | null | Primary product image |
| `imageUrls` | array | Product image URLs |
| `category` | string | null | `"Lingerie"` |
| `categories` | array | Full tag list assigned to the product |
| `description` | string | Plain-text product description |
| `searchQuery` | string | The search term used to find this product (input echo) |
| `source` | string | `"illum.dk"` |
| `scrapedAt` | string | ISO timestamp |

### Sample output

```json
{
  "name": "SKIMS Satin Mini Dress",
  "brand": "SKIMS",
  "price": 1330.00,
  "currency": "DKK",
  "originalPrice": null,
  "sku": "SKI_OP-DRS-10843W-CUR_CUR-Currant",
  "productId": "10729741844826",
  "inStock": true,
  "url": "https://shop.illum.dk/products/ski_op-drs-10843w-cur_cur-currant",
  "imageUrl": "https://cdn.shopify.com/s/files/1/0577/9105/3985/files/SKIMS-LOUNGEWEAR-OP-DRS-10843W-CURRANT-FLT.jpg?v=1772462349",
  "imageUrls": ["https://cdn.shopify.com/s/files/1/0577/9105/3985/files/SKIMS-LOUNGEWEAR-OP-DRS-10843W-CURRANT-FLT.jpg?v=1772462349"],
  "category": "Lingerie",
  "categories": ["(SS2026)", "Dress", "Lingerie", "Women"],
  "description": "",
  "searchQuery": "kjole",
  "source": "illum.dk",
  "scrapedAt": "2026-09-10T09:30:00.000Z"
}
```

### Use cases

- **Price monitoring** -- track ILLUM's price changes over time on the luxury and premium brands it carries, including "was" price whenever an item is discounted.
- **Assortment research** -- ILLUM stocks hundreds of international fashion, beauty and lifestyle brands (SKIMS, Clarins, Charlotte Tilbury and more); see what it carries and at what price points.
- **Stock and availability tracking** -- `inStock` gives a live read on which items are selling through.
- **Danish/Nordic market comparison** -- as Denmark's flagship department store, ILLUM is a useful reference point against other Nordic and European luxury retailers.

### Coverage

v1 covers ILLUM's Danish webshop (`shop.illum.dk`, DKK pricing).

### Performance and cost

The scraper hits the store's own search and product feed endpoints directly -- no browser rendering, no fragile HTML selectors for the enriched fields. A run of 100 products typically completes in well under a minute. This actor charges $0.005 per run (start fee) plus $0.002 per result -- a 100-product run costs about $0.205. Your run's usage cost only settles after the run reports SUCCEEDED -- checking cost mid-run will undercount it.

### Limitations

- Keyword search only, matching ILLUM's own on-site search. It does not accept direct category or product URLs.
- The fast predictive-search tier (first ~10 results) doesn't expose a SKU; SKUs are only populated for results found via the full-catalogue lookup (`sku` is null on some records, never a fabricated value).
- Search results beyond the first ~10 are enriched by joining against a full-catalogue snapshot taken once per run -- a product added to the store in the seconds between that snapshot and the search results appearing (rare) falls back to brand `""` and `inStock: null` rather than being dropped.
- Illum's shop also lists some non-physical-product listings (masterclass tickets, gift experiences) alongside merchandise -- these come back with the same fields (price, availability, images) since they're genuine entries in the store's own search index.
- v1 targets the Danish storefront (DKK) only.

### Related scrapers

If you're covering European department-store and luxury retail more broadly, also check out:

- [Manor Scraper](https://apify.com/studio-amba/manor-scraper) -- Swiss department store chain
- [Fenwick Scraper](https://apify.com/studio-amba/fenwick-scraper) -- UK luxury department store
- [Harrods Scraper](https://apify.com/studio-amba/harrods-scraper) -- UK luxury department store
- [Selfridges Scraper](https://apify.com/studio-amba/selfridges-scraper) -- UK luxury department store
- [Liberty London Scraper](https://apify.com/studio-amba/libertylondon-scraper) -- UK department store

### Support

Found an issue or need a specific category covered? Open an issue on this actor's Apify Store page and we'll take a look.

# Actor input Schema

## `searchQuery` (type: `string`):

Search term to find products on shop.illum.dk, in Danish (e.g. "kjole" for dress, "taske" for bag, "creme" for cream)

## `maxResults` (type: `integer`):

Maximum number of products to scrape. The store's predictive search returns up to 10 fast matches; more are pulled by scanning the full catalogue (~1,700 products) and filtering by your query.

## `proxyConfiguration` (type: `object`):

Apify proxy configuration. shop.illum.dk itself has no anti-bot challenge, but Shopify rate-limits by IP regardless — RESIDENTIAL is used by default to avoid 429s from Apify's shared proxy pool.

## Actor input object example

```json
{
  "searchQuery": "kjole",
  "maxResults": 100,
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ],
    "apifyProxyCountry": "DK"
  }
}
```

# 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 = {
    "searchQuery": "kjole",
    "maxResults": 100,
    "proxyConfiguration": {
        "useApifyProxy": true,
        "apifyProxyGroups": [
            "RESIDENTIAL"
        ],
        "apifyProxyCountry": "DK"
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("studio-amba/illum-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 = {
    "searchQuery": "kjole",
    "maxResults": 100,
    "proxyConfiguration": {
        "useApifyProxy": True,
        "apifyProxyGroups": ["RESIDENTIAL"],
        "apifyProxyCountry": "DK",
    },
}

# Run the Actor and wait for it to finish
run = client.actor("studio-amba/illum-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 '{
  "searchQuery": "kjole",
  "maxResults": 100,
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ],
    "apifyProxyCountry": "DK"
  }
}' |
apify call studio-amba/illum-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,studio-amba/illum-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/sSpP6omEe4dNYIz4f/builds/Bw5oe9eJEsdGJ8X34/openapi.json
