OTTO.de Scraper [~$0.76/1K💰] | Prices | Products | Repricing
Pricing
from $0.76 / 1,000 results
OTTO.de Scraper [~$0.76/1K💰] | Prices | Products | Repricing
The cheapest verified OTTO.de scraper — ~$0.76 per 1,000 products. Extract prices, compare-at UVP, discount %, ratings, availability, variants and product IDs from Germany's 2nd largest marketplace. Reads OTTO's tilelist JSON (no browser). Built for repricing, Preisüberwachung & market research.
Pricing
from $0.76 / 1,000 results
Rating
0.0
(0)
Developer
Ahmed Jasarevic
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
a day ago
Last modified
Categories
Share
Otto Scraper
Scrape OTTO.de (Germany's largest online department store) — search results, category listings and product pages — and extract product title, brand, price + compare-at price, discount %, rating + review count, availability, variants, images and product URL as clean structured JSON.
Built for DACH repricers, marketplace sellers, e-commerce analysts and catalog-matching pipelines. Runs on the Apify platform, so you get API access, scheduling, monitoring and proxy rotation out of the box.
Why use Otto Scraper?
- Cheap and fast — listings are pulled from OTTO's own internal JSON API (
/dundee/tilelist), not rendered in a browser. No Cloudflare/KPSDK challenge on the listing surface, no wasted compute units. - Full pricing picture — current price, strike-through compare-at price (UVP) and the site's own discount percentage, straight from OTTO's data.
- Repricer-ready identifiers — productId, variationId and articleNumber.
- Variant awareness — colour/size variant matrix with per-variant IDs and availability.
- Pagination built in — walks every result page of a search or category up to your caps, deduplicated by product/variation ID.
How to use Otto Scraper
- Open the actor's Input tab.
- Enter one or more search terms (e.g.
fernseher,kühlschrank,ecksofa), category URLs (e.g.https://www.otto.de/technik/fernseher/), and/or product URLs. - Set
maxItemsandmaxPagesPerListingto bound the run. - Click Start and download the dataset as JSON, CSV, HTML or Excel.
Example input
{"searchTerms": ["fernseher"],"categoryUrls": ["https://www.otto.de/technik/fernseher/"],"maxItems": 100,"maxPagesPerListing": 10,"sortBy": "topseller","proxyConfiguration": {"useApifyProxy": true,"proxyType": "ApifyProxy","apifyProxyGroups": []}}
Input
| Field | Type | Description |
|---|---|---|
searchTerms | array | Free-text keywords searched on OTTO.de, paginated automatically. |
categoryUrls | array | OTTO.de category/listing URLs (e.g. https://www.otto.de/technik/fernseher/). |
productUrls | array | OTTO.de product page URLs (e.g. https://www.otto.de/p/<slug>-<id>/). |
maxItems | integer | Max products returned across all inputs (default 100). Free users are capped at 10. |
maxPagesPerListing | integer | Max result pages per search/category (default 10). Each page holds ~158 tile entries, but only a subset carries the full product payload, so consecutive pages yield fewer new products. |
sortBy | enum | topseller, preisaufsteigend, preisabsteigend, rabatt, neuheit, bewertung. |
proxyConfiguration | object | Native Apify proxy editor. AUTO (datacenter) is fine for search/category listings. |
Output
Each dataset item is a flat product record. Example:
{"productId": "C2092091215","variationId": "2092091217","articleNumber": "88622148","name": "Philips 40PFS6050/12 LED-Fernseher (101 cm/40 Zoll, Full HD, Smart-TV)","brand": "Philips","price": 199.99,"compareAtPrice": 379.0,"discountPercent": 47,"isOnSale": true,"currency": "EUR","rating": 4.5,"reviewCount": 15,"availability": "AVAILABLE","availabilityText": "lieferbar - in 1-2 Werktagen bei dir","images": ["https://i.otto.de/i/otto/8baef01a-93f0-52ea-8656-3d122a16d13b?$responsive_ft2$"],"productUrl": "https://www.otto.de/p/philips-40pfs6050-12-led-fernseher-101-cm-40-zoll-full-hd-smart-tv-C2092091215/","variants": [{ "variationId": "2092091217", "color": "schwarz", "name": "unknown", "selected": true }],"topInfos": [{ "label": "Diagonale", "value": "101 cm/40 Zoll" }],"ean": null,"gtin": null,"sku": null,"source": "search:fernseher","scrapedAt": "2026-09-12T08:00:00.000Z"}
You can download the dataset in various formats such as JSON, HTML, CSV, or Excel.
Data table
| Field | Description |
|---|---|
productId / variationId / articleNumber | OTTO's internal product identifiers |
name / brand | Product title and brand |
price / compareAtPrice / discountPercent / isOnSale | Current price, UVP compare-at price, discount % and sale flag (EUR) |
rating / reviewCount | Average rating and number of reviews |
availability / availabilityText | Stock state (AVAILABLE, …) and human-readable text |
images | Array of image URLs |
productUrl | Canonical product page URL |
variants | Colour/size variant matrix with variation IDs |
topInfos | Key product attributes (e.g. screen diagonal, resolution) |
ean / gtin / sku | Barcode identifiers — best-effort via productUrls input (see known limitation) |
source / scrapedAt | Which input produced the record and when |
How much does it cost to scrape OTTO.de?
The actor is a lightweight CheerioCrawler (plain HTTP, no browser) sized at 256 MB, so compute-unit usage is minimal. A typical run of 100 products across a few search/category pages finishes in well under a minute. Product detail-page fetching is not offered — see the known limitation below.
Tips and advanced options
- Repricing / price monitoring: run a search term on a schedule and diff
price/compareAtPrice/discountPercentbetween runs. - Bigger crawls: raise
maxItemsandmaxPagesPerListing; the actor dedupes by product/variation ID so sponsored repeats never inflate the dataset.
Technical notes — which data source is used
This actor does not render pages in a browser. It uses OTTO's own internal JSON API:
- Listings (search + category):
GET https://www.otto.de/dundee/tilelist?rule=<rule>&sortiertnach=<sort>&o=<offset>returns the full tile payload as clean JSON — title, brand, price, compare-at price, discount %, rating, review count, availability, images, variants and product URL. Therulefor a search term is built as(und.(suchbegriff.<urlencoded-term>).(~.(v.1))); for category pages it is extracted from the served HTML (the page embeds the tilelist route). Pagination uses the rawooffset and steps by the number of tiles OTTO returns per page (~158). Note that OTTO only fully hydrates a subset of the ~158 tile entries per page — the rest are lightweight product cards without price/rating data and are filtered out, which is why a page can show "158 tiles" while yielding fewer products. - Product detail pages (only via the
productUrlsinput): fetched as HTML and parsed from embedded JSON-LD / devalue state to best-effort EAN/GTIN/SKU. These pages sit behind a KPSDK JS challenge, so they are fetched through the Apify proxy.
FAQ, disclaimers and support
- Is this legal? Scraping publicly available data for your own analysis is generally permitted, but you are responsible for complying with OTTO's Terms of Service and applicable law (including the German
UrhG/BDSGwhere relevant). This actor is provided as-is. - Known limitation: OTTO serves a JavaScript challenge (KPSDK) on product pages (
/p/...) that blocks plain-HTTP fetches even through residential proxies. The listing surface (search + category) is unaffected and always returns the full tile payload. This is why thefetchDetailsoption was dropped —ean/gtin/skufields therefore staynullexcept for the rareproductUrlspage that serves without the challenge. If EAN/GTIN is a hard requirement, a browser-based (Playwright + stealth) detail fetcher is the recommended enhancement — contact us for a custom build. - Feedback: open an issue on the actor's Issues tab, or contact us for custom modifications (e.g. review scraping, incremental price-change tracking, custom output formats).