# Breuninger Product & Discount Monitor (`truenorth/breuninger-product-monitor`) Actor

Extract Breuninger product variants, prices, discounts, sizes, images, and source URLs from German search catalog pages.

- **URL**: https://apify.com/truenorth/breuninger-product-monitor.md
- **Developed by:** [TrueNorth](https://apify.com/truenorth) (community)
- **Categories:** E-commerce, Marketing
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $5.00 / 1,000 product variant extracteds

This Actor is paid per event and usage. You are charged both the fixed price for specific events and for Apify platform usage.

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

## Breuninger Product & Discount Monitor

Turn Breuninger Germany search results into structured, analysis-ready product
data. Each dataset item represents one rendered product/color variant and
includes auditable prices, discounts, sizes, images, and its source URL. Use it
for catalog research, assortment comparisons, sale discovery, and current-price
checks without maintaining a browser crawler.

### What you get

- Complete color variants rendered on Breuninger search pages, deduplicated by
  product and variant ID.
- Current German price text and integer euro cents, explicit original-price
  evidence, sale status, and calculated discount percentage.
- Brand, product name, color, available rendered sizes, badges, image URLs, and
  product URL.
- Source page, page number, position, scrape timestamp, and truncation markers
  for auditability.
- Transactional output: products reach the default dataset only after every
  requested source succeeds.

Breuninger product scraper, Breuninger price scraper, Breuninger discount
monitor, luxury fashion product data, German ecommerce data, Breuninger sale
products, Breuninger Produktdaten, Breuninger Preise, and Breuninger Angebote
all describe supported current-catalog use cases.

### Input

Use `searchTerms`, strict Breuninger Germany `startUrls`, or both.

- `searchTerms`: 1–50 search phrases.
- `startUrls`: 1–100 HTTPS URLs under
  `https://www.breuninger.com/de/suche/`. Pagination parameters are rejected.
- `sort`: `popular`, `newest`, `priceAsc`, or `priceDesc`.
- `luxuryOnly`: adds Breuninger's verified luxury-catalog parameter.
- `maxItems`: global limit of 1–10,000 unique product/color variants.
- `maxPagesPerStartUrl`: page limit of 1–100 per source.
- `maxConcurrency`: request concurrency of 1–10.
- `maxRequestRetries`: retry count of 0–10.
- `proxyConfiguration`: optional Apify or custom proxy settings. Direct access
  is default.

Example:

```json
{
  "searchTerms": ["kleid"],
  "sort": "popular",
  "luxuryOnly": false,
  "maxItems": 100,
  "maxPagesPerStartUrl": 10,
  "maxConcurrency": 3,
  "maxRequestRetries": 3,
  "proxyConfiguration": {
    "useApifyProxy": false
  }
}
```

Only same-origin pagination URLs advertised by Breuninger are followed.
Existing supported filter parameters in a supplied search URL are preserved.
Lookalike domains and off-route URLs fail validation before crawling.

### Output

Products are written to the default dataset. `RUN_SUMMARY` and `OUTPUT` in the
default key-value store contain run status and reconciled counters.

Real fixture output item:

```json
{
  "id": "1003174386:fbc79f8f0b334ce69da018e13f6a5deb",
  "productId": "1003174386",
  "variantId": "fbc79f8f0b334ce69da018e13f6a5deb",
  "url": "https://www.breuninger.com/de/marken/farm-rio/kleid-mit-volants-und-schmucksteinen/1003174386/p/?variant=fbc79f8f0b334ce69da018e13f6a5deb",
  "brand": "FARM RIO",
  "name": "Kleid mit Volants und Schmucksteinen",
  "nameAdditional": null,
  "color": "DUNKELBRAUN / BRAUN / BEIGE",
  "sizes": ["XS = 34", "S = 36", "M = 38", "L = 40"],
  "currentPriceCents": 29999,
  "currentPriceRaw": "299,99 €",
  "currency": "EUR",
  "isFromPrice": false,
  "referencePriceCents": null,
  "referencePriceRaw": null,
  "referencePriceWasStruck": null,
  "originalPriceCents": null,
  "originalPriceRaw": null,
  "isSale": false,
  "discountPercent": null,
  "badges": ["Neu"],
  "images": {
    "standard": "https://cms.brnstc.de/product_images/287x393/cpne/media/images/product/26/7/100317438615000_0_1784461538000.jpg",
    "standardRetina": "https://cms.brnstc.de/product_images/287x393_retina/cpne/media/images/product/26/7/100317438615000_0_1784461538000.jpg",
    "mouseover": "https://cms.brnstc.de/product_images/287x393/cpne/media/images/product/26/7/100317438615000_1_1784464205000.jpg",
    "mouseoverRetina": "https://cms.brnstc.de/product_images/287x393_retina/cpne/media/images/product/26/7/100317438615000_1_1784464205000.jpg",
    "colorThumbnail": "https://cms.brnstc.de/product_images/color/cpne/media/images/product/26/7/100317438615000_9_1784461536000.jpg"
  },
  "isSelectedVariant": true,
  "variantsMayBeTruncated": false,
  "position": 1,
  "searchTerm": "kleid",
  "sourcePageUrl": "https://www.breuninger.com/de/suche/?q=kleid",
  "sourcePageNumber": 1,
  "scrapedAt": "2026-07-25T06:25:12.555Z"
}
```

`currentPriceCents`, `referencePriceCents`, and `originalPriceCents` are integer
EUR cents. Breuninger's `Bestpreis` stays separate reference data. A discount
uses only an explicit struck `Ursprünglich` price; `discountPercent` is `null`
for “ab” prices.

### Pricing

Store pricing is $0.005 per emitted dataset item ($5.00 per 1,000 items) through
Apify's built-in dataset-item event. Platform compute and proxy usage costs are
paid separately by the user. Empty or failed runs emit no billable dataset
items.

### Honest limits

- This Actor extracts server-rendered search catalog data. It does not visit
  product-detail pages.
- It does not provide exact stock counts, price history, scheduled monitoring,
  alerts, notifications, arbitrary filter synthesis, undocumented interfaces,
  or browser-rendered content.
- Sizes and variants are limited to values rendered in search HTML.
  `variantsMayBeTruncated` marks products whose hidden variants may be missing.
- Site markup, access controls, or challenge pages can change. The Actor fails
  closed on blocks, selector drift, and ambiguous empty responses instead of
  returning misleading partial data.
- Multiple color variants can produce multiple paid dataset items for one
  parent product. Set `maxItems` to control result count and cost.

### Support

For a reproducible report, include run ID, sanitized input, expected result,
and observed result. Do not include account credentials or private proxy URLs.

# Actor input Schema

## `searchTerms` (type: `array`):

Search text values converted to strict Breuninger Germany search URLs.

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

Existing HTTPS Breuninger /de/suche/ URLs; pagination controls are rejected.

## `sort` (type: `string`):

Only SSR-verified Breuninger sort values are supported.

## `luxuryOnly` (type: `boolean`):

Add the verified luxus=luxus catalog parameter.

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

Global exact maximum of unique product/color composite IDs.

## `maxPagesPerStartUrl` (type: `integer`):

Maximum count of DOM-advertised pages followed for each source.

## `maxConcurrency` (type: `integer`):

Bounded CheerioCrawler request concurrency.

## `maxRequestRetries` (type: `integer`):

Bounded retry count for transport and retryable response failures.

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

Optional Apify or custom proxy configuration passed through Apify SDK.

## Actor input object example

```json
{
  "searchTerms": [
    "kleid"
  ],
  "sort": "popular",
  "luxuryOnly": false,
  "maxItems": 100,
  "maxPagesPerStartUrl": 10,
  "maxConcurrency": 3,
  "maxRequestRetries": 3,
  "proxyConfiguration": {
    "useApifyProxy": false
  }
}
```

# Actor output Schema

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

No description

## `summary` (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 = {
    "searchTerms": [
        "kleid"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("truenorth/breuninger-product-monitor").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 = { "searchTerms": ["kleid"] }

# Run the Actor and wait for it to finish
run = client.actor("truenorth/breuninger-product-monitor").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 '{
  "searchTerms": [
    "kleid"
  ]
}' |
apify call truenorth/breuninger-product-monitor --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,truenorth/breuninger-product-monitor"
        }
    }
}

```

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/3rZaoqbN7an66wM8z/builds/OJc29mS650pBliuIQ/openapi.json
