# Konzum.hr Scraper — Croatia Grocery Products (`studio-amba/konzum-hr-scraper`) Actor

Scrape grocery products from konzum.hr, Croatia's dominant grocery chain. Get product names, brands, prices, unit prices, categories, stock status and images by search keyword. No login required.

- **URL**: https://apify.com/studio-amba/konzum-hr-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/platform/actors/running/actors-in-store#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

## Konzum.hr Scraper

Extract **grocery products from [konzum.hr](https://www.konzum.hr/)**, the webshop of Konzum — Croatia's dominant grocery chain. Search by keyword and get product names, brands, prices, unit prices, categories, stock status, ratings and images — all in structured, ready-to-use data.

This Actor pulls data directly from the site's server-rendered search results. No login, no session, no browser automation. It reads the same product data the page itself renders on the server, so runs are fast and stable.

### What does Konzum.hr Scraper do?

Give it a Croatian keyword (for example `mlijeko`, `kruh`, `kava`, or `sir`) and the Actor pages through konzum.hr's search results, extracting the full product listing for every match: name, brand, current price, unit price, the legally mandated reference/anchor price, category, internal SKU, image, product URL, stock status and customer rating.

Because it runs on the Apify platform, you also get scheduling, monitoring, proxy rotation, and integrations (webhooks, Make, Zapier, Google Sheets) out of the box.

### Why use Konzum.hr Scraper?

- **First mover on Croatian grocery data.** Konzum is Croatia's largest grocery chain, and there was no Apify actor covering it before this one — a fully dark market for grocery price data.
- **Price monitoring.** Track Konzum prices over time, including the reference/anchor price the site publishes under Croatia's price-transparency rules.
- **Market research.** Compare product ranges and pricing against other European grocery retailers already in our catalogue (Kaufland, Billa, Interspar, Spar).
- **Assortment tracking.** See which brands and products are listed under a given category or keyword.
- **No anti-bot headaches.** The search page is plain server-rendered HTML behind nginx — no CAPTCHAs, no browser fingerprinting to work around.

### How to scrape Konzum data

1. Open the Actor and go to the **Input** tab.
2. Enter a **Search Query** in Croatian (e.g., `mlijeko`, `kruh`, `sir`, `kava`, `čokolada`).
3. Set **Max Results** to control how many products you want (the site serves 25 products per results page).
4. Click **Start**. When the run finishes, open the **Output** tab and download your data as JSON, CSV, Excel, or HTML.
5. To track prices over time, schedule the Actor to run daily or weekly and compare exports.

That's it — no account, no API key, no store selection needed.

### Input

| Field | Type | Description |
| --- | --- | --- |
| `searchQuery` | string | Croatian search keyword. Defaults to `mlijeko` if left empty. |
| `maxResults` | integer | Maximum number of products to return. Default `100`. |
| `proxyConfiguration` | object | Apify Proxy settings. Datacenter proxies work fine — the search page has no anti-bot protection. |

Example input:

```json
{
  "searchQuery": "mlijeko",
  "maxResults": 20,
  "proxyConfiguration": { "useApifyProxy": true }
}
```

### Output

Each item in the dataset looks like this:

```json
{
  "productName": "Z bregov Trajno mlijeko 2,8% m.m. 6x1 l",
  "brand": "VINDIJA D.D.",
  "price": 6.12,
  "currency": "EUR",
  "unitPrice": 1.02,
  "unitPriceUnit": "l",
  "referencePrice": 5.34,
  "referencePriceDate": "02.05.2025.",
  "category": "/mlijecni-proizvodi-i-jaja/mlijeko",
  "sku": "90405484",
  "imageUrl": "https://d17zv3ray5yxvp.cloudfront.net/variants/JxRzQ5H5pbWDQJrtBeUfJvTN/ffd34786a36ca626615eda2d8de97b04783d9d485ae465873974c880ea46220f",
  "url": "https://www.konzum.hr/web/products/z-bregov-trajno-mlijeko-2-8-m-m-6x1-l",
  "inStock": true,
  "rating": 5,
  "reviewCount": 8,
  "scrapedAt": "2026-08-04T14:19:15.428Z"
}
```

| Field | Description |
| --- | --- |
| `productName` | Full product name as listed on the site |
| `brand` | Brand/manufacturer name, when provided |
| `price` | Current selling price |
| `currency` | Always `EUR` |
| `unitPrice` | Price per `unitPriceUnit` (e.g. per l or per kg), as published by Konzum |
| `unitPriceUnit` | Unit the unit price is expressed in |
| `referencePrice` | Legally mandated reference/anchor price under Croatia's price-transparency law (typically the lowest price in the 30 days before a promotion). Not present for every product. |
| `referencePriceDate` | Date the reference price refers to, as published by the site |
| `category` | Category slug path from the site's own tagging |
| `sku` | Konzum internal product code |
| `imageUrl` | Main product photo URL |
| `url` | Direct product page link |
| `inStock` | Whether the product is currently available |
| `rating` | Average customer rating, 0-5 scale |
| `reviewCount` | Number of customer reviews backing the rating |
| `scrapedAt` | ISO 8601 timestamp of when the item was collected |

### How it works

`konzum.hr` runs on a server-rendered Spree-Commerce-based Ruby storefront — no client-side app, no anti-bot layer, just plain nginx. The search results page (`/web/search?search[term]={query}&page={n}`) renders 25 product cards per page, and each card embeds everything this Actor needs directly in its markup: `data-ga-*` attributes (the site's own Google Analytics ecommerce tagging — product ID, name, price, brand, category, currency) plus the visible price-details block ("Cijena za j.m." = unit price, and for many products "Cijena DD.MM.YYYY." = the reference/anchor price Croatian law requires retailers to display).

This means one HTTP request retrieves 25 fully-detailed products — no per-product detail-page fetch needed. The Actor fetches the search page with a plain HTTP GET, parses the product cards with pattern matching, and pages forward until it hits `maxResults` or runs out of results.

### Is it legal to scrape Konzum.hr?

This Actor only collects publicly available product listing data (names, prices, categories) that anyone can see by browsing konzum.hr. It doesn't access any account data, doesn't bypass paywalls or logins, and doesn't collect personal information. Always check the target site's terms of service and applicable law (e.g. GDPR if you plan to process personal data) before scraping, and use the data responsibly.

### Tips

- Croatian keywords return the most results — try `mlijeko`, `kruh`, `sir`, `kava`, `čokolada`, `deterdžent`.
- A broader keyword returns more pages; a narrow one is faster if you only need a specific product line.
- `referencePrice` only appears on products the retailer has flagged with a fixed anchor date — treat a missing value as "no anchor price published," not as "always full price."
- Re-run periodically if you're tracking price changes; Konzum updates prices and promotions frequently.

### Cost

Billed per result plus a small per-run start fee — see the Actor's Pricing tab for the exact rate. Usage cost only settles once a run reports **SUCCEEDED**; if you read the dataset from a still-running run, the cost shown will be incomplete until it finishes.

### Related Scrapers

Looking for grocery data from other European chains? Check out our other actors:

- **Kaufland (DE, CZ, PL, SK)** — grocery products across four countries
- **Billa Austria** — Austrian grocery products
- **Interspar Austria** — Austrian hypermarket products
- **Spar Slovenia** — Slovenian grocery products
- **Edeka** — German grocery products

### Support

Found a product field missing or a page that doesn't scrape correctly? Open an issue on the Actor's Apify Store page and we'll take a look.

# Actor input Schema

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

Keyword to search for on konzum.hr, in Croatian. Examples: 'mlijeko' (milk), 'kruh' (bread), 'kava' (coffee), 'sir' (cheese).

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

Maximum number of products to return. The site serves 25 products per search results page.

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

Proxy settings. The search page is open, server-rendered HTML with no anti-bot protection — Apify datacenter proxies work fine.

## Actor input object example

```json
{
  "searchQuery": "mlijeko",
  "maxResults": 20,
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ],
    "apifyProxyCountry": "HR"
  }
}
```

# 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": "mlijeko",
    "maxResults": 20,
    "proxyConfiguration": {
        "useApifyProxy": true,
        "apifyProxyGroups": [
            "RESIDENTIAL"
        ],
        "apifyProxyCountry": "HR"
    }
};

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

# Run the Actor and wait for it to finish
run = client.actor("studio-amba/konzum-hr-scraper").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print("💾 Check your data here: https://console.apify.com/storage/datasets/" + run["defaultDatasetId"])
for item in client.dataset(run["defaultDatasetId"]).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": "mlijeko",
  "maxResults": 20,
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ],
    "apifyProxyCountry": "HR"
  }
}' |
apify call studio-amba/konzum-hr-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "command": "npx",
            "args": [
                "mcp-remote",
                "https://mcp.apify.com/?tools=studio-amba/konzum-hr-scraper",
                "--header",
                "Authorization: Bearer <YOUR_API_TOKEN>"
            ]
        }
    }
}

```

## OpenAPI specification

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