Otto.de Listings Scraper avatar

Otto.de Listings Scraper

Pricing

from $2.50 / 1,000 results

Go to Apify Store
Otto.de Listings Scraper

Otto.de Listings Scraper

Extract product listings from Otto.de category and search pages: IDs, names, brands, prices, sale and comparative prices, delivery dates, color variants, availability and ratings, with automatic pagination. Built for German e-commerce price monitoring and assortment tracking.

Pricing

from $2.50 / 1,000 results

Rating

0.0

(0)

Developer

FalconScrape

FalconScrape

Maintained by Community

Actor stats

1

Bookmarked

26

Total users

6

Monthly active users

a day ago

Last modified

Security

Limited permissions

Share

🛒 Otto.de Listings Scraper: Otto Product, Price and Sale Data

Export Otto.de category and search listings as clean JSON, CSV or Excel. The Otto.de Listings Scraper returns each product's price, suggested retail price, sale flag, brand, rating, delivery promise and color variants from Otto, one of Germany's largest online shops. Use it as an Otto price tracker (your own Otto Preisverlauf), for Otto sale monitoring and competitor research, or as a simple alternative to an Otto API.

🎯 Use Cases

  • Otto price tracker: schedule a daily run on the same category or search and build your own Otto price history (Preisverlauf) for jeans, TVs, smartphones, sofas or any other category.
  • Otto sale monitoring: see which products are on sale (onSale) and how far the price sits below the suggested retail price, brand by brand.
  • Brand and assortment tracking: count how many products Levi's, Wrangler, Arizona or ONLY list in a category, at which price points, and how many colors each offers.
  • Sponsored vs organic placement: see which brands buy sponsored slots on Otto category and search pages and where organic products rank.
  • Delivery and availability checks: compare delivery promises ("lieferbar - in 1-2 Werktagen") and availability across brands and products.
  • Product feeds and Otto data exports: turn an Otto category into a spreadsheet or product feed for your own app, BI tool or price comparison.

✨ Features

  • Prices as numbers: current price in EUR, the "ab" (starting price) flag for products whose price depends on the size, the sale flag, and Otto's comparative and suggested retail prices when shown.
  • Discounts and coupons: originalPrice (the struck-through price), discountPercent as Otto shows it ("-26%"), and couponText for extra vouchers on the card ("-20% Extra").
  • Unit price (Grundpreis): unitPrice for products Otto prices per unit (per litre, per kg, per piece).
  • Sort and Sale filter: sort every list by price, biggest discount, newest or rating, and keep only reduced products, for categories and search queries alike.
  • Brand, name, images and URL: product name, brand, Otto's product type ("Jeans", "Fernseher"), the main image plus all card images, and a direct product link with the selected variation.
  • Ratings: average customer rating and rating count.
  • Delivery promise: Otto's delivery text and the expected delivery date as shown on the card.
  • Color variants and sizes: every color on the card (name, base color, hex code, variation ID, selected flag) plus a flag for products sold in several sizes.
  • Placement data: origin marks sponsored and organic products, and listPosition is the product's rank in the organic list (1, 2, 3 ... across all pages).
  • Product, article and variation IDs: stable identifiers to join runs over time.
  • Automatic pagination: the scraper walks the listing until it reaches your Max items or the end of the category.
  • No duplicates: a product found twice (for example on two pages, or from two start URLs) is saved once.
  • Full rows only: every saved row carries price, brand and delivery data, plus the rating when the product has reviews; products Otto returns no price data for are skipped and not charged.
  • Stops at your max charge: the run never collects more products than your maximum cost per run allows.

🛠️ How It Works

  1. Paste Otto.de category or search URLs, for example https://www.otto.de/mode/jeans/, https://www.otto.de/technik/fernseher/ or a filtered listing such as https://www.otto.de/suche/sneaker/?marke=nike, or type search queries. Optionally pick a sort order and On sale only.
  2. Set Max items: the default is 50 products across all start URLs.
  3. Run the scraper and download the results as JSON, CSV, Excel or HTML, or pull them through the Apify API.

⚙️ Input

FieldTypeDefaultWhat it does
Start URLsarraynoneOtto.de category, search or filtered listing URLs, e.g. https://www.otto.de/technik/fernseher/. Each one is paginated automatically.
Search queriesarraynonePlain search terms. Each one becomes an Otto.de search URL (https://www.otto.de/suche/{term}/).
Max itemsinteger50Maximum number of unique products saved across all start URLs. 0 = no limit.
Sort bystringtopsellerOtto's order: topseller, preis-aufsteigend (price low to high), preis-absteigend, hoechste-reduzierung (biggest discount), neuheiten (newest), bewertung (best rated). A start URL with its own sortiertnach= keeps it.
On sale onlybooleanfalseOnly products Otto marks as reduced (its Sale filter).

Provide at least one start URL or search query; an empty input scrapes the example category https://www.otto.de/mode/jeans/.

{
"startUrls": [{ "url": "https://www.otto.de/mode/jeans/" }, { "url": "https://www.otto.de/technik/fernseher/" }],
"searchQueries": ["levis jeans"],
"sort": "hoechste-reduzierung",
"onSaleOnly": true,
"maxItems": 240
}

💰 Pricing

Pay only for the products you get. No monthly rental.

EventPriceWhat you get
Result$0.0025 per product ($2.50 per 1,000)One product row with the fields below.
Actor start$0.00005 per runCharged once when the run starts (1 GB).

Examples:

  • 50 products (the default) = $0.125 + $0.00005 = $0.12505
  • 1,000 products = $2.50 + $0.00005 = $2.50005
  • A daily price tracker of 200 products for 30 days = 6,000 products = $15.00 + 30 starts ($0.0015) = $15.0015

Every saved row is charged as one result, and every saved row is a full product row. Set a maximum cost per run in Run options and the scraper stops when it is reached.

📊 Sample Output Data

A real row from a run on https://www.otto.de/mode/jeans/ (the colors array is trimmed):

{
"productId": "1869770203",
"articleNumber": "59507824",
"variationId": "1866955995",
"listPosition": 15,
"origin": "organic",
"name": "Levi's® Weite Jeans Jeans 318 SHAPING im Five-Pocket Style",
"url": "https://www.otto.de/p/levis-weite-jeans-jeans-318-shaping-im-five-pocket-style-1869770203/?variationId=1866955995",
"image": "https://i.otto.de/i/otto/78e0b039-2a90-5784-a1e8-46c0feedfc7c?$responsive_ft2$",
"images": ["https://i.otto.de/i/otto/78e0b039-2a90-5784-a1e8-46c0feedfc7c?$responsive_ft2$", "…"],
"brand": "Levi's®",
"price": 77.99,
"currency": "EUR",
"availability": "AVAILABLE",
"ratingValue": 4.5,
"ratingCount": 398,
"dataCompleteness": "full",
"deliveryText": "lieferbar - in 1-2 Werktagen bei dir",
"deliveryDate": "bis morgen, 21. Okt. bei dir",
"isStartingPrice": true,
"onSale": true,
"comparativePrice": null,
"suggestedRetailPrice": 99.95,
"originalPrice": 99.95,
"discountPercent": 22,
"couponText": null,
"unitPrice": null,
"productType": "Jeans",
"sustainabilityBadges": [],
"colors": [
{ "variationId": "1866955995", "name": "soft black", "baseColor": "schwarz", "hexCode": "100F11", "selected": true },
{ "variationId": "1866954601", "name": "clever gir", "baseColor": "blau", "hexCode": "293E5E", "selected": false },
"…"
],
"multipleSizes": true,
"source": "listing",
"scrapedAt": "2026-10-20T06:04:05.994Z"
}

isStartingPrice: true means Otto shows the price as "ab" (from): the cheapest size or variant. suggestedRetailPrice is the manufacturer's suggested price Otto shows next to sale prices; comparativePrice is the comparison price Otto shows on some products and is empty on most. A color's variationId is the variant Otto shows for that color, which is not necessarily the same size as the selected variant. deliveryText and deliveryDate are German text exactly as Otto shows them. originalPrice is the comparative price, else the suggested retail price, and only when it is above price; discountPercent is Otto's own sale tag, else computed from the two. unitPrice is { value, amount, unit }, e.g. 5.80 per 1 "Stk".

🔁 Schedule and Integrate the Otto Price Tracker

For an Otto price tracker, run it once a day with the same start URLs: every run is a dated snapshot (scrapedAt), and together they form your price history. Join runs on productId and variationId to see price changes, new sale flags and products that disappear. Set it up in Apify Schedules. Send the results to Google Sheets, Zapier, Make, n8n or a webhook with Apify integrations, so new prices land where your team already works.

🤖 Use with AI Agents (MCP)

This Actor works as a tool in Claude, ChatGPT, Cursor and other MCP clients through the Apify MCP server (https://mcp.apify.com). An agent can call it with:

{ "startUrls": [{ "url": "https://www.otto.de/mode/jeans/" }], "maxItems": 20 }

❓ Otto API and Data FAQ

Does Otto have an official API? Otto offers the Otto Market API for registered marketplace sellers. It is for managing your own products, orders and shipments, and it needs a partner account. There is no public API for browsing Otto's catalog. This Actor needs no key or account and returns the public listing data a shopper sees: prices, sale flags, suggested retail prices, ratings, delivery promises and colors.

How do I track Otto prices over time (Otto Preisverlauf)? Otto doesn't show past prices. Schedule this Actor daily on the same category URLs and keep each run's dataset, or append them to a Google Sheet, to build the price history yourself.

Do I need an Otto account? No. The scraper reads public category and search listings only.

Why are some fields empty? On full rows, originalPrice and discountPercent are empty for products that are not reduced, couponText only appears with an extra voucher, unitPrice only for products Otto prices per unit, and sustainabilityBadges is an empty list for most products. ratingValue and ratingCount are empty for products without reviews (most products deep in a big category). comparativePrice is empty unless Otto shows a comparison price, suggestedRetailPrice is empty when there is no manufacturer price, and deliveryDate can be missing when Otto only shows a delivery window. articleNumber is empty for products Otto matched by meaning rather than by keyword (common on search results), because Otto sends no article number for them; productId and variationId are always set. Sponsored products have no listPosition. dataCompleteness is always "full": products without price data are skipped, not saved.

Why did my run return no products? Make sure the URL opens a product grid on otto.de in your browser. A filter value Otto no longer uses returns nothing: for example Levi's is now ?marke=levis, and ?marke=levi-s shows only Otto's "similar products". The run status names such URLs. Category URLs that are not in Otto's menu (very deep or renamed categories) are scraped as a search for the category name, and the status says so; use the category link from Otto's menu for exact results.

Are there any limits? Max items counts unique products across all start URLs. Big categories hold tens of thousands of products, so for 0 (no limit) runs raise the run timeout in Run options. On a walk of many thousand products in Otto's default Topseller order, Otto can re-rank the list mid-run, and products that move onto pages already read are missed (about 1 in 10 on one full run of a 28,759-product category). Prices are in EUR from the German shop.

What are alternatives to Otto for German product price data? Kaufland, Zalando and the price comparison site Idealo cover overlapping German assortments; see the related scrapers below.