# Lidl.de Products Scraper (`stone_jadex/lidl-de-products-scraper`) Actor

Public Lidl.de online-shop products from the official sitemap: price, struck-through price and discount, unit price, EAN/GTIN, brand, category, stock, rating, images, attributes, variants. $1.00 per 1,000 products, no start fee. HTTP only, robots.txt respected.

- **URL**: https://apify.com/stone_jadex/lidl-de-products-scraper.md
- **Developed by:** [Stone Jade](https://apify.com/stone_jadex) (community)
- **Security:** Limited permissions
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

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

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.de Products Scraper

Lidl.de Products Scraper gives German retail and assortment analysts structured results from public pages. Start with search queries, product IDs or URLs, or the product sitemap and export name, brand, EUR price, reference price, availability and category.

### What you can do

- Compare current EUR prices with published reference prices and discount amounts.
- Group online products by brand and category to review a German retail assortment.
- Use online availability and incremental results to focus a later comparison on new products or price and stock changes.

### Who uses it

- A retail analyst can collect a product category and compare prices, brands and available reference prices.
- A pricing team can reuse a named incremental store to export changed products for its own review process.

### Result preview

**Illustrative only:** invented examples show the shape of the data; they are not real results. A dash indicates an unavailable value.

| Product | Brand | Price | Reference price | Online available |
| --- | --- | --- | --- | --- |
| Example coffee | Example | 4.99 EUR | 5.99 EUR | Yes |
| Example tool | Example | 29.99 EUR | — | Yes |
| Example tea | Example | 2.49 EUR | 2.99 EUR | Yes |

Fields may be absent when the source does not publish them.

### Why choose this Actor

- Discover products through search or the sitemap, or target product URLs and IDs directly.
- Incremental mode stores product ID, price and stock state; stock and sale filters can exclude products before delivery.

### Pricing

Prices in **USD**, verified on 4 November 2026. Check the current Pricing tab before running.

| Result type | Event price |
| --- | ---: |
| Product | $1 per 1,000 results |

For example, 1,000 results at the product rate incur $1 in result-event charges. This calculation covers Actor event charges. Review Pricing for any separately listed platform usage; later access to stored data follows Apify's applicable storage pricing.

### Try it in three steps

1. Enter search queries, product IDs or URLs, or the product sitemap. Set a small result limit for your first run.
2. Choose any stock or sale filters; enable incremental mode and choose a named store if you want later runs to return new or changed products. Run the Actor.
3. Inspect the dataset and export the results in your preferred available format.

### Coverage and FAQ

**What are the limits?** This covers Lidl.de online products, not a complete picture of individual store inventory. Reference prices and other fields can be missing. Incremental comparisons depend on the selected store and prior state. Products excluded by stock, sale or unchanged-item filters do not incur a product event charge.

The requested result limit defaults to 100 and can be set up to 100,000 per run.

**Is this a live feed?** Each run is a snapshot of available source information. Listings, prices and other details may change after collection; a requested maximum is a ceiling, not a promise of that many results.

**Can I use the data for ongoing analysis?** Yes, export it to your own workflow. Scheduling repeated runs or acting on the exported results requires your own workflow.

# Changelog

This Actor's version history is a separate document: https://apify.com/stone_jadex/lidl-de-products-scraper/changelog.md

# Actor input Schema

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

Optional Lidl.de product page URLs (https://www.lidl.de/p/{slug}/p{id}). When set (or Product IDs are set), only these products are read and the sitemap is skipped. Search, category and filter page URLs are not accepted here; use Search keywords / Search category instead.

## `productIds` (type: `array`):

Optional Lidl product ids (the number after /p in the URL, e.g. 100161286). Each is opened as https://www.lidl.de/p/p{id}, which Lidl redirects to the product page.

## `slugKeywords` (type: `array`):

Keep only products whose URL slug contains any of these words (case-insensitive, e.g. parkside, rotwein, lupilu). Works on the sitemap (default) and on search results. Filtering happens before any product page is opened, so it costs nothing. Empty = no filter.

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

Optional. Find products through Lidl.de's search (e.g. kaffee, parkside akku) instead of reading the whole product sitemap. Each keyword's results are paged until Max products product URLs are found, then the product pages are read as usual. Up to 20 keywords (extra ones are ignored). A keyword with no real results on Lidl.de (Lidl then shows unrelated fallback products) is skipped and not charged. Leave empty to use the product sitemap (default). Ignored when Product URLs or Product IDs are set.

## `searchCategory` (type: `string`):

Optional. Limit search results to one Lidl.de category exactly as Lidl names it (e.g. Essen & Trinken, Wein & Spirituosen, Küche & Haushalt). Can be used alone (all products of that category) or together with Search keywords. Leave empty to use the product sitemap (default).

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

Stop after this many products have been delivered (and charged).

## `inStockOnly` (type: `boolean`):

Deliver only products that can be ordered online right now. Skipped products are not charged.

## `onSaleOnly` (type: `boolean`):

Deliver only products showing a struck-through reference price above the current price. Skipped products are not charged.

## `compact` (type: `boolean`):

Leave out the long description HTML/text fields (descriptionHtml, longDescriptionText) for smaller rows.

## `incremental` (type: `boolean`):

Remember product id + price + stock in a named key-value store and, on later runs, deliver only products that are new or whose price/stock changed. Unchanged products are not charged.

## `incrementalStoreName` (type: `string`):

Name of the key-value store used by incremental mode. Use different names for different watch lists.

## `shuffleSitemap` (type: `boolean`):

Sitemap mode: visit products in random order instead of sitemap order (useful for quick samples with a small Max products).

## `requestDelayMs` (type: `integer`):

Minimum gap between request starts. Never below 1000 ms; a robots.txt Crawl-delay, if Lidl adds one, is honoured when larger.

## `concurrency` (type: `integer`):

Requests in flight at once (1-3). Request starts are still spaced by the delay above.

## `maxRunSeconds` (type: `integer`):

Stop cleanly after this many seconds and write a free run-notice row.

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

Direct connection by default. Optionally Apify Proxy with a datacenter group. Residential proxies and custom proxy URLs are rejected.

## Actor input object example

```json
{
  "maxItems": 20,
  "inStockOnly": false,
  "onSaleOnly": false,
  "compact": false,
  "incremental": false,
  "incrementalStoreName": "lidl-de-products-state",
  "shuffleSitemap": false,
  "requestDelayMs": 1500,
  "concurrency": 2,
  "maxRunSeconds": 3500,
  "proxyConfiguration": {
    "useApifyProxy": false
  }
}
```

# Actor output Schema

## `products` (type: `string`):

Product rows and the optional free run-notice row saved in the default dataset. Compact mode omits descriptionHtml and longDescriptionText; fields Lidl does not publish are null or empty.

## `summary` (type: `string`):

The OUTPUT record: echoed input, pricing, pushed and charged counts, errors, robots and HTTP statistics, incremental-mode details, unavailable fields, and the stop reason. An early input-validation failure writes a smaller summary with the raw input.

# 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": 20
};

// Run the Actor and wait for it to finish
const run = await client.actor("stone_jadex/lidl-de-products-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": 20 }

# Run the Actor and wait for it to finish
run = client.actor("stone_jadex/lidl-de-products-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": 20
}' |
apify call stone_jadex/lidl-de-products-scraper --silent --output-dataset

```

## MCP server setup

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