# Lidl Product Scraper (`scraptivo/lidl-scraper`) Actor

Collect Lidl supermarket product listings across 16 European countries by search query or category/product URL. Optionally include full product-page details such as descriptions, EANs, variants, and images.

- **URL**: https://apify.com/scraptivo/lidl-scraper.md
- **Developed by:** [Scraptivo](https://apify.com/scraptivo) (community)
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $0.90 / 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

**Lidl Product Scraper** collects Lidl supermarket product listings from 16 European country shops and turns them into structured data for catalog building, price monitoring, and market research. Provide search queries or category/product URLs, run the Actor, and export titles, prices, images, availability, and optional full product-page details to JSON, CSV, Excel, or your preferred integration. Use it to monitor prices and stock, build assortment feeds, and schedule recurring collection across Lidl's European markets. Product rows are billed at $1 per 1,000, or $3 per 1,000 with full product details.

### What can you automate with Lidl Product Scraper?

- **Build product catalogs** — collect listings with titles, prices, images, categories, and article numbers.
- **Monitor prices and availability** — track price changes, stock levels, and online availability across Lidl markets.
- **Enrich with product details** — add descriptions, EANs, variants, delivery info, energy labels, and media galleries.
- **Search by keyword or category** — collect from search terms such as "heissluftfritteuse" or entire category pages.
- **Cover 16 countries** — collect from lidl.de, lidl.fr, lidl.es, lidl.co.uk, and 12 more shops.
- **Export in any format** — download JSON, CSV, or Excel, or connect via the API to your pipeline.

### Who is this scraper for?

| Team | Workflow |
|---|---|
| Grocery and retail analysts | Analyze Lidl's assortment and pricing strategy across Europe |
| Competitive-intelligence teams | Track price fluctuations and product availability over time |
| Data-automation teams | Replace manual copy-paste with structured, API-ready product data |
| Market researchers | Compare product lines and new arrivals across multiple country shops |
| Automation builders | Trigger runs from the API or webhooks for recurring pipelines |

### What data can you collect from Lidl?

| Data group | Example fields | How it helps |
|---|---|---|
| Product identity | `title`, `fullTitle`, `brand`, `erpNumber`, `productId` | Stable identifiers and titles for catalog feeds |
| Pricing and availability | `price`, `currency`, `currencySymbol`, `availability`, `onlineAvailable` | Price and stock monitoring |
| Visuals and categories | `image`, `images`, `category`, `categoryPath` | Assortment and gallery analysis |
| Ratings and signals | `ratingAverage`, `ratingCount`, `countryCode`, `sourceQuery` | Review signals and source tracking |
| Detail enrichment | `description`, `eans`, `variants`, `variantOptions`, `delivery` | Full product-page data when details are enabled |

Detail-level fields are populated when `fetchProductDetails` is enabled and the product page returns them.

### How to use Lidl Product Scraper

1. Open the Actor on Apify.
2. Enter search queries or paste category/product URLs from any Lidl country shop.
3. Choose a country code for search, or let the URL host set it.
4. Optionally enable `fetchProductDetails` for descriptions, EANs, and variants.
5. Run the Actor, then export results to JSON, CSV, Excel, or the API.

```json
{
  "searchQueries": ["heissluftfritteuse"],
  "startUrls": [{ "url": "https://www.lidl.de/h/garten-balkon/h10067558" }],
  "fetchProductDetails": true,
  "countryCode": "DE",
  "maxItems": 100,
  "proxyConfiguration": { "useApifyProxy": true, "apifyProxyGroups": ["RESIDENTIAL"] }
}
```

### Example workflow

#### Build a weekly Lidl price-monitoring feed

1. Run the Actor on a fixed category URL every Monday.
2. Enable `fetchProductDetails` to capture EANs and variants.
3. Keep rows with a price change or an availability change in your downstream step.
4. Deduplicate on `erpNumber` plus `countryCode`, then push the result to a spreadsheet or database.

### Automate and integrate your results

- **Schedule** runs daily or weekly from the Apify Schedules tab, or create one schedule per search term or category.
- **Webhooks** can notify Slack, Zapier, or your warehouse when a run succeeds.
- **Connect** results to Google Sheets, Make, Zapier, a CRM, or cloud storage.
- **Deduplicate** downstream using the stable `erpNumber` + `countryCode` pair; use `maxItems` to cap output.

### Input reference

| Field | Type | Required | Default | What it controls |
|---|---|---:|---|---|
| `searchQueries` | array | No\* | — | Product search terms (use the selected country shop) |
| `startUrls` | array | No\* | — | Lidl category, search, or product URLs |
| `fetchProductDetails` | boolean | No | `false` | Whether to enrich each product from its detail page |
| `countryCode` | string | No | — | Lidl country shop for search (ignored when a URL sets the host) |
| `maxItems` | integer | No | `25` | Maximum products to collect |
| `proxyConfiguration` | object | No | — | Proxy settings; residential is enabled by default |

\*Provide at least one of `searchQueries` or `startUrls`.

### Output example

```json
{
  "productId": "276353",
  "erpNumber": "276353",
  "title": "SilverCrest® Heißluftfritteuse",
  "fullTitle": "SilverCrest® Heißluftfritteuse XXL 6,5 l",
  "brand": "SilverCrest",
  "price": 49.99,
  "currency": "EUR",
  "currencySymbol": "€",
  "url": "https://www.lidl.de/p/silvercrest-heissluftfritteuse-xxl-6-5-l/p276353",
  "image": "https://www.lidl.de/media/product/.../silvercrest-heissluftfritteuse-xxl-6-5-l--1.jpg",
  "category": "Küche & Haushalt",
  "ratingAverage": 4.5,
  "ratingCount": 1287,
  "availability": "Online verfügbar",
  "onlineAvailable": true,
  "countryCode": "DE",
  "sourceQuery": "heissluftfritteuse",
  "detailsFetched": true,
  "eans": ["4056234567890"]
}
```

### How much does it cost to scrape Lidl?

Lidl Product Scraper uses pay-per-event pricing. You are billed per result you receive.

- **`dataset-item`** — $1 per 1,000 product rows written to the dataset.
- **`product-details`** — $2 per 1,000 products enriched when `fetchProductDetails` is enabled.

A listing-only run charges only the `dataset-item` event. With details enabled, a row charges `dataset-item` plus `product-details` when enrichment succeeds ($3 per 1,000 combined). Apify subscription-plan discounts apply automatically. A small one-time `apify-actor-start` event ($0.00005) is also billed per run.

### Reliability and responsible use

- Residential proxies are enabled by default for reliable collection.
- Detail fields are conditional; some pages may not return descriptions, EANs, or variants.
- Country detection is automatic from URL hosts; `countryCode` is used for search queries.
- Collection is intended for public product data within your lawful-use scope; you remain responsible for complying with the site's terms.

### Frequently asked questions

#### Can I collect full product details?

Yes. Enable `fetchProductDetails` to add descriptions, EANs, variants, delivery info, energy labels, and media. Enriched rows are billed under a separate `product-details` event.

#### Which Lidl countries are supported?

The Actor covers 16 Lidl country shops, including Germany, France, Spain, and the UK. For search queries, set `countryCode`; for URLs, the host is detected automatically.

#### What counts as one result?

Each product row written to the dataset counts as one `dataset-item` result. Rows enriched with details also trigger `product-details`.

#### Why are some fields empty?

Detail fields depend on the product page returning them. If a page omits a field, that field is left empty rather than invented.

#### How do I avoid duplicate records?

Key your pipeline on `erpNumber` plus `countryCode`. Use `maxItems` to cap output during testing.

#### Can I search and use URLs together?

Yes. The Actor processes search queries and start URLs in the same run.

### Related Scraptivo automations

- [Instacart Scraper](https://apify.com/scraptivo/instacart-scraper) — collect grocery and delivery platform data.
- [Publix Scraper](https://apify.com/scraptivo/publix-scraper) — collect grocery product data from Publix.
- [Amazon Search Scraper](https://apify.com/scraptivo/amazon-scraper) — collect Amazon product and price data for competitor monitoring.
- [eBay Product Scraper](https://apify.com/scraptivo/ebay-scraper) — collect eBay listings, prices, and seller data.
- [Costco Product Scraper](https://apify.com/scraptivo/costco-scraper) — collect Costco product data and pricing.

### Support and custom workflows

Need a different field, source, or delivery workflow? Contact Scraptivo at scraptivo@gmail.com. Include the Actor name, a sample URL, required fields, and expected volume so we can assess the request.

# Actor input Schema

## `searchQueries` (type: `array`):

Product search terms (e.g. "heissluftfritteuse", "garden lights"). Uses the selected country shop. Provide searchQueries and/or startUrls.

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

Lidl category, section, search, or product URLs (e.g. https://www.lidl.de/h/garten-balkon/h10067558 or https://www.lidl.de/q/search?q=philips). Country/locale are inferred from the host.

## `fetchProductDetails` (type: `boolean`):

When enabled, opens each product page to extract full details (description, summary, EANs, variants, media, delivery info). When disabled, returns listing/card fields only (faster).

## `countryCode` (type: `string`):

Lidl country shop used for searchQueries when no start URL sets the host. Ignored for startUrls (host wins).

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

Maximum number of products to scrape (0 = unlimited)

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

Proxy settings for anti-bot protection

## Actor input object example

```json
{
  "searchQueries": [
    "heissluftfritteuse"
  ],
  "startUrls": [
    {
      "url": "https://www.lidl.de/h/garten-balkon/h10067558"
    }
  ],
  "fetchProductDetails": false,
  "countryCode": "DE",
  "maxItems": 25,
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ]
  }
}
```

# Actor output Schema

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

Dataset containing scraped Lidl products

## `runStats` (type: `string`):

Aggregate scrape statistics for this run

# 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 = {
    "searchQueries": [
        "heissluftfritteuse"
    ],
    "startUrls": [
        {
            "url": "https://www.lidl.de/h/garten-balkon/h10067558"
        }
    ],
    "maxItems": 25,
    "proxyConfiguration": {
        "useApifyProxy": true,
        "apifyProxyGroups": [
            "RESIDENTIAL"
        ]
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("scraptivo/lidl-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 = {
    "searchQueries": ["heissluftfritteuse"],
    "startUrls": [{ "url": "https://www.lidl.de/h/garten-balkon/h10067558" }],
    "maxItems": 25,
    "proxyConfiguration": {
        "useApifyProxy": True,
        "apifyProxyGroups": ["RESIDENTIAL"],
    },
}

# Run the Actor and wait for it to finish
run = client.actor("scraptivo/lidl-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 '{
  "searchQueries": [
    "heissluftfritteuse"
  ],
  "startUrls": [
    {
      "url": "https://www.lidl.de/h/garten-balkon/h10067558"
    }
  ],
  "maxItems": 25,
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ]
  }
}' |
apify call scraptivo/lidl-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,scraptivo/lidl-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/bTYczgNzWAopHorKy/builds/QanVUd15nhZtAgUyg/openapi.json
