# Aldi Supermarket, Flyers & Price Scraper (6 Countries) (`silver_petalfall/aldi-catalog-price-scraper`) Actor

Fast Aldi scraper for 6 European countries (ES, DE, FR, PT, PL, NL). Extract 100% verified shelf prices, weekly in-store flyer discounts, grocery & catalog items with photos and barcodes. Pay-Per-Event ($2.50/1k).

- **URL**: https://apify.com/silver_petalfall/aldi-catalog-price-scraper.md
- **Developed by:** [Javi Face](https://apify.com/silver_petalfall) (community)
- **Stats:** 1 total users, 0 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $2.50 / 1,000 results

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

## 🛒 Aldi Scraper & Weekly Flyers (6 European Countries)

#### Extract Verified In-Store Leaflets, Supermarket Groceries & Online Assortment with 100% Real Shelf Prices

[![Apify Actor](https://img.shields.io/badge/Apify-Actor-FF9000?style=for-the-badge\&logo=apify\&logoColor=white)](https://apify.com) [![Pay Per Event](https://img.shields.io/badge/Pricing-Pay--Per--Event%20\($2.50%2F1k\)-2ECC71?style=for-the-badge)](https://apify.com) [![Speed](https://img.shields.io/badge/Speed-100%20items%20%2F%203s-0050AA?style=for-the-badge)](https://apify.com) [![Coverage](https://img.shields.io/badge/Markets-6%20EU%20Countries-E60A14?style=for-the-badge)](#market-coverage) [![Data Quality](https://img.shields.io/badge/Shelf%20Prices-100%25%20Verified-F1C40F?style=for-the-badge)](#commercial-differentiation)

> **High-speed European retail intelligence engine for Aldi.** Automatically extract verified in-store weekly leaflet promotions, supermarket grocery assortments, and catalog pricing across 6 European countries (Spain, Germany, France, Portugal, Netherlands, Poland) into a standardized, unified schema.

***

### 🎯 Commercial Differentiation (B2B Value)

Most grocery scrapers rely on slow, heavy browser emulation (Playwright/Puppeteer) that repeatedly breaks or gets blocked by perimeter firewalls. Other scrapers rely on crowdsourced data with missing shelf prices and restrictive open-database licenses.

This Actor leverages **direct, first-party intelligence pipelines** (official Algolia DSN search endpoints and Next.js / iPaper digital flyer viewers) to deliver 100% verified shelf prices with sub-second latency:

| Capability                                                |        Generic Scrapers        |                **Aldi Enterprise Intelligence (This Actor)**                |
| :-------------------------------------------------------- | :----------------------------: | :-------------------------------------------------------------------------: |
| **In-Store Weekly Promotions** (Leaflets & Special Deals) |         ❌ Unavailable         |   **✅ Full Coverage (Promotional dates, discount %, and HD page scans)**   |
| **Supermarket Assortment** (Food, Cleaning, Cosmetics)    |    ❌ Incomplete / Blocked     | **✅ Comprehensive (Fresh food, private labels, pack sizes, shelf prices)** |
| **Price Data Completeness**                               |      ⚠️ Frequently `null`      |            **✅ 100% Verified Shelf Prices (Zero null prices)**             |
| **Anti-Bot Resilience**                                   |    ❌ Repeated HTTP 403/429    |       **✅ Advanced Browser Fingerprint Spoofing & Session Rotation**       |
| **Infrastructure Overhead**                               |      ⚠️ Heavy (2GB+ RAM)       |           **✅ Ultra-Lightweight (256MB – 512MB RAM container)**            |
| **Data Licensing**                                        | ⚠️ Restrictive Copyleft (ODbL) |        **✅ 100% First-Party Data (Clean for B2B & Commercial Use)**        |
| **Visual Validation**                                     |    ❌ Raw text / JSON only     |      **✅ High-Resolution Product Photos & In-Store Leaflet Scans**         |

***

### 🌍 Market Coverage

Seamlessly toggle between 6 regional Aldi operations with zero configuration:

|         Market          | Domain            | Primary Currency | Assortment Scope                                    |
| :---------------------: | :---------------- | :--------------: | :-------------------------------------------------- |
|     **Spain (ES)**      | `aldi.es`         |     EUR (€)      | Weekly Leaflets, Supermarket Assortment (Península) |
|    **Germany (DE)**     | `aldi-nord.de`    |     EUR (€)      | Weekly Leaflets & Supermarket Assortment            |
|     **France (FR)**     | `aldi.fr`         |     EUR (€)      | Weekly Leaflets & Supermarket Assortment            |
|    **Portugal (PT)**    | `aldi.pt`         |     EUR (€)      | Weekly Leaflets & Supermarket Assortment            |
|  **Netherlands (NL)**   | `aldi.nl`         |     EUR (€)      | Weekly Leaflets & Supermarket Assortment            |
|     **Poland (PL)**     | `aldi.pl`         |     PLN (zł)     | Weekly Leaflets & Supermarket Assortment            |

***

### 🛡️ Enterprise-Grade Architecture & Resilience

- **First-Party Algolia DSN Integration**: Direct API queries with dedicated regional credentials for instant product data extraction without HTML scraping fragility.
- **Next.js & iPaper Flipbook Decoders**: Extracts digital leaflets directly from viewer settings (`window.staticSettings`), providing high-resolution page scans and OCR offer data.
- **Advanced Browser Fingerprint Spoofing**: Proprietary client TLS layer mimics genuine browser connection characteristics to bypass perimeter traffic inspection without the latency and memory overhead of headless browsers.
- **Strict Data Integrity Contracts**: Every extracted data point passes through schema-level sanitization (decimal normalization, HTML stripping, automated discount percentage calculation).
- **Enterprise Security & Zero PII**: Strict URL allowlisting protects against SSRF vulnerabilities. Extracts strictly public product catalog data; zero customer reviews, personal names, or account data are ever processed (GDPR compliant).

***

### ⚡ Zero-Config Quick Start

1. Open this Actor on the Apify Console and click **Start**.
2. By default, it extracts a balanced sample of **100 products** and **10 weekly flyer pages** with verified prices, discounts, package sizes, and high-resolution photographs.
3. Export to **JSON**, **CSV**, or **Excel**, or inspect the live photo catalog in the **Visual Overview** tab.

#### Sample Input

```json
{
  "country": "ES",
  "categories": ["weekly_flyers", "food", "cleaning", "cosmetics"],
  "searchQueries": ["milsani", "special", "gut bio", "esselt"],
  "maxItems": 100,
  "maxFlyerPages": 10
}
```

#### Sample Output Record

```json
{
  "product_id": "872200",
  "name": "Leche entera sin lactosa",
  "brand": "MILSANI",
  "category_macro": "food",
  "subcategory": "Leche y bebidas vegetales",
  "price": 1.03,
  "currency": "EUR",
  "unit_price_text": "1.03 EUR / L",
  "package_size": "1 l unidad",
  "availability": "IN_STORE",
  "country": "ES",
  "source_vector": "web_catalog",
  "product_url": "https://www.aldi.es/producto/leche-entera-sin-lactosa-872200.html",
  "image_url": "https://s7g10.scene7.com/is/image/aldinord/8722_pack_0_0_es_es_leche_entera_sin_lactosa_2024_cw21",
  "valid_from": "2026-05-01",
  "valid_to": "2026-10-31",
  "scraped_at": "2026-10-15T15:00:00Z"
}
```

***

### 💰 Pay-Per-Event (PPE) Pricing Model

| Event                       | Price     | Description                                                   |
| :-------------------------- | :-------- | :------------------------------------------------------------ |
| `apify-actor-start`         | **$0.01** | Charged once per run to cover cold-start infrastructure.      |
| `apify-default-dataset-item`| **$0.0025**| Per verified shelf product saved ($2.50 per 1,000 products).  |
| `flyer-page-processed`      | **$0.005**| Per processed weekly flyer page scan (HD scan + dates).       |

***

### 🤝 Support & Maintenance

Need custom integrations, dedicated regional endpoints, or enterprise bulk volume? Contact support via the Apify Console.

# Actor input Schema

## `country` (type: `string`):

Select the country store you want to extract products and prices from.

## `categories` (type: `array`):

Choose which sections of Aldi's catalog to include. <b>weekly_flyers</b> = in-store weekly leaflet offers & discounts; <b>food / cleaning / cosmetics</b> = supermarket groceries with verified shelf prices & photos; <b>bazaar_online</b> = non-food online assortment.

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

Filter by specific terms or Aldi private brands (e.g., 'leche', 'queso', 'milsani', 'special', 'esselt', 'tandil', 'gut bio'). Leave empty to automatically use comprehensive built-in keywords with guaranteed real shelf prices.

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

Limit the total number of products to control your run cost. You are never charged above this limit.

## `maxFlyerPages` (type: `integer`):

How many weekly-flyer pages (HD image, PDF link, keywords) to save in the FLYER_PAGES record. Set 0 to only get flyer products.

## `fullCatalogMode` (type: `boolean`):

Crawl entire catalog via sitemap or full index dump. Slower but exhaustive. Ignores keywords.

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

Direct Aldi product URLs (…/producto/…), flyer URLs (…/folleto/…) or digital viewer URLs. Only official *.aldi.* domains are accepted.

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

Datacenter proxies or direct requests are enough in most cases. Switch to Residential only if you see repeated 403 errors.

## Actor input object example

```json
{
  "country": "ES",
  "categories": [
    "weekly_flyers",
    "food",
    "cleaning",
    "cosmetics"
  ],
  "searchQueries": [
    "milsani",
    "special",
    "esselt"
  ],
  "maxItems": 100,
  "maxFlyerPages": 10,
  "fullCatalogMode": false,
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}
```

# Actor output Schema

## `overview` (type: `string`):

Primary dataset containing verified grocery and catalog products with shelf prices, discounts, and high-res photos.

## `offers` (type: `string`):

Dataset view filtered for active promotions, flyer page references, and validity date ranges.

## `flyer_pages` (type: `string`):

Key-value store record containing in-store weekly flyer page images, PDF links, and promotion dates.

## `run_stats` (type: `string`):

Key-value store record containing execution summary, items counted, and country metrics.

# 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": [
        "milsani",
        "special",
        "esselt"
    ],
    "proxyConfiguration": {
        "useApifyProxy": true
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("silver_petalfall/aldi-catalog-price-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": [
        "milsani",
        "special",
        "esselt",
    ],
    "proxyConfiguration": { "useApifyProxy": True },
}

# Run the Actor and wait for it to finish
run = client.actor("silver_petalfall/aldi-catalog-price-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": [
    "milsani",
    "special",
    "esselt"
  ],
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}' |
apify call silver_petalfall/aldi-catalog-price-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,silver_petalfall/aldi-catalog-price-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/xxo045t3Wdb0KupYC/builds/PjHpjKwMkPg2IZ6b4/openapi.json
