# Edeka Scraper — German Grocery Products, Prices & EANs (`studio-amba/edeka-scraper`) Actor

Scrape products, prices, EANs, unit prices and weekly offers from edeka24.de, EDEKA's German online shop. Search by keyword or browse a category. No login or cookies.

- **URL**: https://apify.com/studio-amba/edeka-scraper.md
- **Developed by:** [Studio Amba](https://apify.com/studio-amba) (community)
- **Categories:** E-commerce
- **Stats:** 9 total users, 2 monthly users, 99.5% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $2.00 / 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.

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

## Edeka Scraper — German Grocery Products, Prices & EANs

Know EDEKA's current prices, stock, and weekly offers on any product without checking [edeka24.de](https://www.edeka24.de) by hand. This scraper turns EDEKA's national online shop — Germany's largest supermarket group — into structured JSON, including EAN barcodes, unit prices, brands, and stock status. No login, no cookies, no browser automation.

Search by keyword or browse a category. Built for price monitoring, competitor analysis, assortment tracking and market research.

### What it does

This actor reads the edeka24.de online shop directly, including the machine-readable product data embedded in each product page (GoodRelations RDFa). You get the same prices a shopper sees, plus the EAN barcode and Germany's legally-required "lowest price in the last 30 days" note.

- **Keyword search** — pass a term (`kaffee`, `nudeln`, `schokolade`) and get matching products.
- **Category browse** — pass a category path (e.g. `Lebensmittel/Beilagen/Nudeln`) to pull a whole department.
- **Offers** — use the `reduzierte-artikel` category to scrape current reduced items with their discount and validity dates.

> Note on scope: `edeka24.de` is EDEKA's national shipping shop (groceries, drinks, drugstore, wine). It is not the regional click-and-collect fresh-produce shops on edeka.de — those are not covered.

### Output

Each product is one record:

```json
{
  "name": "Barilla Nudeln Fusilli 500G",
  "brand": "Barilla",
  "ean": "8076802085981",
  "sku": "128840007",
  "price": 1.29,
  "currency": "EUR",
  "unit": "500G",
  "unitPrice": "2,58 €/kg",
  "promotionPrice": 1.29,
  "lowestPrice30d": "2,19 €",
  "offerValidUntil": "2026-06-25T11:24:04Z",
  "category": "Nudeln",
  "url": "https://www.edeka24.de/Lebensmittel/Beilagen/Nudeln/Barilla-Nudeln-Fusilli-500G.html",
  "imageUrl": "https://www.edeka24.de/out/pictures/generated/product/1/400_400_90/barilla_nudeln_fusilli_500_g.jpg",
  "inStock": true,
  "scrapedAt": "2026-06-24T09:30:00.000Z"
}
```

#### Fields

| Field | Description |
|-------|-------------|
| `name` | Product name |
| `brand` | Brand / manufacturer (derived from the product name) |
| `ean` | EAN-13 barcode |
| `sku` | edeka24 article number |
| `price` | Current price as a number |
| `currency` | Always `EUR` |
| `unit` | Pack size (e.g. `500G`, `1L`) |
| `unitPrice` | Base price (Grundpreis, e.g. `2,58 €/kg`) |
| `promotionPrice` | Sale price when the product is discounted, otherwise `null` |
| `lowestPrice30d` | Lowest price in the last 30 days (German price-display law) |
| `offerValidUntil` | Offer validity date when present |
| `category` | Product category |
| `url` | Link to the product page |
| `imageUrl` | Product image URL |
| `inStock` | Whether the product is available |
| `scrapedAt` | ISO timestamp of the scrape |

### How to scrape Edeka data

1. Open the actor and set your **Search Query** (for example `kaffee`) — or leave it empty and set a **Category Path** to browse a department.
2. Set **Max Results** to the number of products you want.
3. Keep the default **Proxy Configuration**. edeka24.de has no geo lock, so the default datacenter proxy works — do not set a proxy country, it has no German pool and the run fails with a 407 error.
4. Click **Start**. When the run finishes, download the dataset as JSON, CSV or Excel, or pull it from the API.

#### Input example

```json
{
  "searchQuery": "kaffee",
  "maxResults": 100,
  "proxyConfiguration": { "useApifyProxy": true }
}
```

#### Browsing a category or offers

```json
{
  "category": "Lebensmittel/Beilagen/Nudeln",
  "maxResults": 500,
  "proxyConfiguration": { "useApifyProxy": true }
}
```

Use `"category": "reduzierte-artikel"` to scrape current offers with discount and validity dates. Category paths are visible in the edeka24.de URLs.

### Common use cases

- **Price monitoring** — track EDEKA prices over time and compare against other German grocers.
- **Promotion tracking** — capture reduced items, discounts and offer windows.
- **Assortment analysis** — see which products and brands a category carries, keyed by EAN.
- **Market research** — build a dataset of German grocery prices and barcodes for analysis.

### Cost estimate

This actor is billed $0.02 per run plus $0.002 per result — **1,000 results cost about $2.02**. Usage cost only settles once a run reports **SUCCEEDED** — reading a dataset mid-run will show a cost far below the real total.

### Tips

- For a full category, set a higher **Max Results** and use the **Category Path** input.
- The EAN barcode makes it easy to match edeka24 products against other retailers' catalogs.
- Prices change often; run on a schedule to keep your data fresh.

### FAQ

**Does this need a login?**
No. The actor only reads public catalog data. No account, password or cookies are required.

**Does it include the EAN barcode?**
Yes. Each product page exposes its EAN-13, which this actor extracts.

**Is this the full EDEKA assortment?**
It is the edeka24.de national online shop (shipping goods, drinks, drugstore, wine). Fresh produce sold via regional click-and-collect shops is not part of this catalog.

**Is this legal?**
The actor collects publicly available product information. You are responsible for using the data in line with EDEKA's terms and applicable law.

### Disclaimer

This actor is an independent tool and is not affiliated with, endorsed by, or connected to EDEKA or edeka24.de. All product data belongs to its respective owners.

# Actor input Schema

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

Search for products by name or keyword (e.g., 'kaffee', 'nudeln', 'schokolade'). Leave empty and set a Category to browse a category instead.

## `category` (type: `string`):

Browse a category instead of searching. Use the edeka24.de category path, e.g. 'Lebensmittel/Beilagen/Nudeln' or 'reduzierte-artikel' for current offers. When set, Search Query is ignored.

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

Maximum number of products to return.

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

Proxy settings. The default Apify Proxy works fine — edeka24.de has no geo lock or anti-bot.

## Actor input object example

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

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

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

# Run the Actor and wait for it to finish
run = client.actor("studio-amba/edeka-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 '{
  "searchQuery": "kaffee",
  "maxResults": 20,
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ]
  }
}' |
apify call studio-amba/edeka-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,studio-amba/edeka-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/aX4K02giAGlLQvJ7S/builds/e7zEIB0Vif72WsHuC/openapi.json
