# Otto.de Product Scraper (`axlymxp/otto-scraper`) Actor

Scrape otto.de product listings at scale — name, price, brand, GTIN/EAN, images, availability, ratings, and reviews. Kasada-free product detail via Android app trick. Sitemap bulk mode covers 2.85M products. Pay only for results.

- **URL**: https://apify.com/axlymxp/otto-scraper.md
- **Developed by:** [axly](https://apify.com/axlymxp) (community)
- **Categories:** AI, Automation, E-commerce
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $3.00 / 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/platform/actors/running/actors-in-store#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

## Otto.de Product Scraper

Extract product listings, full product details, and customer reviews from **otto.de** — Germany's second-largest e-commerce platform with 4M+ products across furniture, fashion, electronics, and home goods.

### Who uses this

- **E-commerce analysts & investors** — price monitoring, assortment tracking, competitive intelligence across otto.de's 4M+ catalog
- **Agencies & lead generators** — bulk product exports for clients, GTIN/EAN barcodes for catalog matching
- **PropTech & SaaS developers** — stable JSON schemas, sitemap-based incremental pipelines, webhook integrations
- **Researchers** — German consumer-goods datasets, price trends, brand presence analysis

### Output fields

| Field | Type | Description |
|---|---|---|
| `name` | string | Full product title |
| `url` | string | Product page URL |
| `product_id` | string | Short product ID (e.g. `S0OFS0ZL`) |
| `variation_id` | string | Variation ID (colour, size) |
| `brand` | string | Brand / manufacturer |
| `price` | string | Current price (e.g. `339.99`) |
| `currency` | string | Always `EUR` |
| `availability` | string | `InStock`, `OutOfStock`, or `LimitedAvailability` |
| `rating` | string | Average rating (1–5) |
| `review_count` | string | Total number of reviews |
| `image_url` | string | Primary product image URL |
| `sku` | string | Seller SKU *(requires `includeDetail`)* |
| `gtin13` | string | 13-digit GTIN / EAN barcode *(requires `includeDetail`)* |
| `description` | string | Full HTML product description *(requires `includeDetail`)* |
| `images` | array | All product image URLs *(requires `includeDetail`)* |
| `return_days` | integer | Return window in days *(requires `includeDetail`)* |
| `reviews` | array | Customer reviews with rating, title, text, verified status *(requires `includeReviews`)* |
| `scraped_at` | string | ISO-8601 UTC timestamp |

### Use cases

**Price monitoring** — track price changes daily across a product category or brand, alert when prices drop below threshold.

**Catalog enrichment** — match products by GTIN/EAN barcode, enrich internal catalogs with current availability and images.

**Competitive analysis** — compare brand presence, pricing strategy, and rating distribution across categories.

**Review mining** — aggregate verified customer reviews for sentiment analysis, product improvement, and brand reputation tracking.

**Sitemap crawl** — the 2.85M-product sitemap with daily `lastmod` timestamps enables efficient incremental scraping: only re-fetch products updated since your last run.

### Input parameters

| Parameter | Type | Default | Description |
|---|---|---|---|
| `keywords` | string | — | Search keyword(s), e.g. `ecksofa` |
| `startUrls` | array | — | Category paths (e.g. `/moebel/sofas/`) or product URLs |
| `maxItems` | integer | 100 | Max results per run |
| `sort` | enum | `topseller` | Sort: `topseller`, `price_asc`, `price_desc`, `discount`, `newest`, `rating` |
| `includeDetail` | boolean | false | Enrich with GTIN, description, all images, return policy |
| `includeReviews` | boolean | false | Append customer reviews per product |
| `maxReviewsPerProduct` | integer | 50 | Max reviews per product |
| `sitemapMode` | boolean | false | Iterate the full sitemap (~2.85M products) |
| `sitemapSince` | string | — | ISO date — skip sitemap entries older than this (incremental mode) |

### Example input

```json
{
    "keywords": "ecksofa",
    "maxItems": 50,
    "sort": "price_asc",
    "includeDetail": true
}
```

### Example output

```json
{
    "name": "VASAGLE Ecksofa L-Form, 244 cm, mit Schlaffunktion",
    "url": "https://www.otto.de/p/vasagle-ecksofa-...-S0OFS0ZL/",
    "product_id": "S0OFS0ZL",
    "variation_id": "S0OFS0ZL2K1E",
    "brand": "VASAGLE",
    "price": "339.99",
    "currency": "EUR",
    "availability": "InStock",
    "rating": "4",
    "review_count": "150",
    "image_url": "https://i.otto.de/i/otto/uuid/vasagle-ecksofa.jpg?$formatz$",
    "sku": "S0OFS0ZL2K1E",
    "gtin13": "6976119912345",
    "description": "<p>Hochwertiger Stoff, 5-Jahre-Garantie...</p>",
    "images": ["https://i.otto.de/...jpg", "https://i.otto.de/...jpg"],
    "return_days": 30,
    "reviews": null,
    "scraped_at": "2026-06-30T12:00:00Z"
}
```

### Scheduling & integrations

Schedule a daily run in the Apify Console → Tasks to keep your dataset fresh. Connect to Google Sheets, Airtable, or your own pipeline via **webhooks** — Apify fires a POST to your URL on run completion with a link to the dataset.

**Make / Zapier**: use the Apify connector to trigger downstream flows when new products appear or prices change.

**Amazon S3 / Google Cloud Storage**: export datasets directly from the Console in JSON, CSV, or XLSX.

### MCP / AI-agent integration

Use the companion [otto-mcp actor](https://apify.com/axlymxp/otto-mcp) to query otto.de live from Claude, Cursor, or any MCP-compatible AI agent. Add it as a remote MCP server in seconds — no local setup required.

### FAQ

**Does it handle all product types?** Yes — furniture, fashion, electronics, home goods, sports, and all other otto.de categories are supported.

**How fresh is the data?** Data is scraped in real time when you run the actor. For daily freshness, schedule a recurring run. The sitemap `lastmod` filter makes incremental runs efficient.

**Does it handle Kasada anti-bot on product detail pages?** Yes. Product detail enrichment (`includeDetail: true`) uses the Android app's cookie bypass — no browser or Playwright required. This is the key technical advantage over rivals.

**How many products can I get per run?** Up to 100,000 per run via `maxItems`. For the full catalog, use `sitemapMode: true` across multiple runs or with `sitemapSince` for incremental updates.

**Is this legal?** Scraping publicly available product data from otto.de for research, price monitoring, and internal use is a common and widely accepted practice. Always comply with otto.de's Terms of Service and applicable data protection laws (GDPR).

# Actor input Schema

## `keywords` (type: `string`):

Keyword(s) to search on otto.de, e.g. 'ecksofa' or 'laptop 16 zoll'. Use this OR startUrls OR sitemapMode.

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

Category paths (e.g. /moebel/sofas/) or full product URLs (e.g. https://www.otto.de/p/...). Leave empty if using keywords or sitemapMode.

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

Stop after this many results. Default 100.

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

Sort order for search and category results.

## `includeDetail` (type: `boolean`):

Fetch the full product detail page for each result — adds SKU, GTIN/EAN barcode, description, all images, and return policy. Uses Kasada bypass. Slower (~1s per product).

## `includeReviews` (type: `boolean`):

Fetch customer reviews for each product and include them in the output.

## `maxReviewsPerProduct` (type: `integer`):

Maximum number of reviews to fetch per product (only relevant if includeReviews is true).

## `sitemapMode` (type: `boolean`):

Iterate the full product sitemap (~2.85M products). Ignores keywords/startUrls. Combine with sitemapSince for incremental runs.

## `sitemapSince` (type: `string`):

ISO date (YYYY-MM-DD). Only yield sitemap entries with lastmod on or after this date. Great for daily incremental updates.

## Actor input object example

```json
{
  "keywords": "ecksofa",
  "startUrls": [
    "/moebel/sofas/ecksofas/"
  ],
  "maxItems": 100,
  "sort": "topseller",
  "includeDetail": false,
  "includeReviews": false,
  "maxReviewsPerProduct": 50,
  "sitemapMode": false,
  "sitemapSince": "2026-06-01"
}
```

# 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 = {
    "startUrls": [
        "/moebel/sofas/ecksofas/"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("axlymxp/otto-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 = { "startUrls": ["/moebel/sofas/ecksofas/"] }

# Run the Actor and wait for it to finish
run = client.actor("axlymxp/otto-scraper").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print("💾 Check your data here: https://console.apify.com/storage/datasets/" + run["defaultDatasetId"])
for item in client.dataset(run["defaultDatasetId"]).iterate_items():
    print(item)

# 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/python/docs/quick-start

```

## CLI example

```bash
echo '{
  "startUrls": [
    "/moebel/sofas/ecksofas/"
  ]
}' |
apify call axlymxp/otto-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "command": "npx",
            "args": [
                "mcp-remote",
                "https://mcp.apify.com/?tools=axlymxp/otto-scraper",
                "--header",
                "Authorization: Bearer <YOUR_API_TOKEN>"
            ]
        }
    }
}

```

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/actors/7JGer3pnzhY8KBP7q/builds/tHRoPFAHw7Geuy9Nj/openapi.json
