OTTO.de Scraper
Pricing
from $1.38 / 1,000 products
OTTO.de Scraper
Delivers structured OTTO.de product, product-detail, and review records, queried by search term or category/product URL, with optional product details and per-review records.
Pricing
from $1.38 / 1,000 products
Rating
0.0
(0)
Developer
Farhan Ali
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
3 days ago
Last modified
Categories
Share
OTTO.de Scraper creates a structured dataset of OTTO.de product and review records collected from search queries and category, search, or product URLs. Each dataset item can include the product name, brand, price, suggested price, discount label, rating, review count, availability, category, and identifiers, or one customer review with its rating, title, text, reviewer, and review date. Query the source using a search term or URL with optional filters, control the result limit with maxItems, and retrieve records through the Apify Dataset API or export them as JSON, CSV, Excel, or XML.
Dataset at a glance
| Property | Value |
|---|---|
| Source | otto.de |
| Record unit | One product, product detail, or customer review |
| Input methods | Search queries, start URLs, optional filters |
| Main identifiers | productId, variationId, articleNumber, url |
| Delivery | Apify Dataset and API |
| Export formats | JSON, CSV, Excel, XML |
| Update model | Fresh records per Actor run |
| Pricing | Pay per event, from $1.50 per 1,000 events |
Coverage and available records
The Actor returns three record types:
product— product listing records from search or category pages.product-details— fuller product records whenincludeProductDetailsis enabled, adding description, identifiers, selected size, stock, and shipping.product-review— one dataset row per customer review whenincludeReviewsis enabled.
The Actor supports a wide set of OTTO filters including brand, color, size, shoe size (EU/UK/US), target group, promotion, minimum discount percent, price range, rating, material, seller, season, style, and additional custom filters via additionalFilters. Results can be sorted with sortBy.
Data dictionary
Product and product-detail fields:
| Field | Type | Nullable | Description | Example |
|---|---|---|---|---|
recordType | string | No | product or product-details | product |
imageUrl | string | No | Product image | https://i.otto.de/... |
name | string | No | Product name | Nike Air Max 270 |
brand | string | Yes | Brand name | Nike |
price | number | No | Current price in EUR | 129.99 |
currency | string | Yes | Currency code | EUR |
suggestedPrice | number | Yes | List/suggested price | 149.99 |
discountLabel | string | Yes | Discount label | -13% |
rating | number | Yes | Average rating | 4.6 |
reviewCount | integer | Yes | Number of reviews | 128 |
availability | string | Yes | Availability status | Lieferbar |
color | string | Yes | Color | schwarz |
category | string | Yes | Category name | Sneaker |
url | string | No | Product page URL | https://www.otto.de/... |
productId | string | No | OTTO product identifier | 12345678 |
variationId | string | Yes | Variation identifier | 87654321 |
articleNumber | string | Yes | Article number | ABC123 |
detailsIncluded | boolean | Yes | Whether details were fetched | true |
description | string | Yes | Product description (details) | — |
gtin | string | Yes | GTIN (details) | — |
selectedSize | string | Yes | Selected size (details) | 42 |
inStock | boolean | Yes | Stock status (details) | true |
shippingPrice | number | Yes | Shipping price (details) | 3.95 |
Review fields:
| Field | Type | Nullable | Description | Example |
|---|---|---|---|---|
recordType | string | No | product-review | product-review |
productName | string | Yes | Reviewed product name | Nike Air Max 270 |
rating | number | Yes | Review rating | 5 |
title | string | Yes | Review title | Toller Schuh |
text | string | Yes | Review body | — |
verifiedPurchase | boolean | Yes | Verified purchase flag | true |
reviewer | string | Yes | Reviewer name | Anna |
location | string | Yes | Reviewer location | Berlin |
reviewedAt | string | Yes | Review date | 2025-03-14 |
variantSize | string | Yes | Reviewed variant size | 42 |
variantColor | string | Yes | Reviewed variant color | schwarz |
seller | string | Yes | Seller name | OTTO |
helpfulVotes | integer | Yes | Helpful votes | 12 |
helpfulVotesTotal | integer | Yes | Total helpful votes | 15 |
productUrl | string | Yes | Reviewed product URL | https://www.otto.de/... |
reviewId | string | Yes | Review identifier | — |
productId | string | Yes | Product identifier | 12345678 |
Example dataset record
{"recordType": "product","imageUrl": "https://i.otto.de/i/otto/12345678","name": "Nike Air Max 270","brand": "Nike","price": 129.99,"currency": "EUR","suggestedPrice": 149.99,"discountLabel": "-13%","rating": 4.6,"reviewCount": 128,"category": "Sneaker","url": "https://www.otto.de/p/nike-air-max-270-12345678","productId": "12345678","variationId": "87654321"}
The record above was produced by the input in the next section: search query shoes with product details and reviews enabled.
Query and input reference
| Input | Type | Required | Default | Accepted values | Description |
|---|---|---|---|---|---|
searchQueries | array | No | — | Search terms | Keywords to search |
startUrls | array | No | — | OTTO.de URLs | Category, search, filtered, or product URLs |
sortBy | string | No | topseller | topseller, preis-aufsteigend, preis-absteigend, hoechste-reduzierung, neuheiten, bewertung | Result sort order |
brands | array | No | — | Brand slugs | Brand filter |
colors | array | No | — | Color slugs | Color filter |
sizes | array | No | — | Size slugs | Clothing size filter |
shoeSizesEu / shoeSizesUk / shoeSizesUs | array | No | — | Size slugs | Shoe size filters |
targetGroups | array | No | — | Audience slugs | Target group filter |
promotions | array | No | — | Promotion slugs | Promotion filter |
minDiscountPercent | integer | No | — | 0–90 | Discount filter |
reducedOnly | boolean | No | false | true / false | Reduced items only |
minPrice / maxPrice | integer | No | — | EUR | Price range filter |
minRating | string | No | — | 5-sterne, ab-4-sternen, ab-3-sternen, ab-2-sternen, ab-1-stern | Rating filter |
materials, sellers, seasons, styles, soleProfiles, sustainability, pronations, features, covers, surfaces, upholstery, rooms, services, seatCounts, dimensions | array | No | — | Filter slugs | Additional OTTO filters |
additionalFilters | object | No | {} | Filter id → slug(s) | Custom filters |
maxItems | integer | No | 20 | 0 = unlimited | Maximum products (reviews excluded) |
includeProductDetails | boolean | No | false | true / false | Fetch product details |
includeReviews | boolean | No | false | true / false | Store each review as its own row |
maxReviewsPerProduct | integer | No | 0 | 0 = all | Cap reviews per product |
proxyConfiguration | object | No | Residential | Apify proxy settings | Proxy configuration |
Minimal request:
{"searchQueries": ["shoes"],"maxItems": 20}
Advanced request:
{"searchQueries": ["shoes"],"sortBy": "topseller","brands": ["nike"],"minDiscountPercent": 20,"minPrice": 20,"maxPrice": 150,"maxItems": 100,"includeProductDetails": true,"includeReviews": true,"maxReviewsPerProduct": 10}
Retrieve the data through the API
- Start the Actor with a JSON input containing
searchQueriesand/orstartUrls. - Wait for the run to finish.
- Read records from the run's default dataset.
- Paginate or export the dataset.
from apify_client import ApifyClientclient = ApifyClient("YOUR_API_TOKEN")run = client.actor("datascrapers/otto-de-scraper").call(run_input={"searchQueries": ["shoes"],"maxItems": 20,"includeProductDetails": True,})for item in client.dataset(run["defaultDatasetId"]).iterate_items():print(item["recordType"], item.get("name"), item.get("price"))
Apify's generated API tab documents the equivalent calls for other languages.
Data quality and record handling
- Completeness — detail fields (description, identifiers, sizes, shipping) are conditional on
includeProductDetails; review fields are conditional onincludeReviews. - Source changes — prices, availability, and discounts reflect the response at scrape time.
- Deduplication — the Actor does not deduplicate across runs; use
productId(andvariationId) as the stable key. - Retry/error behavior — products or reviews that cannot be resolved are skipped; the run continues.
- Normalization — prices are numbers in EUR; ratings are numeric.
Export and pipeline examples
| Destination | Recommended method | Typical use |
|---|---|---|
| PostgreSQL/Supabase | Dataset API or webhook consumer | Product and price history |
| Google Sheets | Apify integration | Competitive price tracking |
| S3/cloud storage | Scheduled export or integration | Catalog snapshots |
Pricing and cost examples
Billing is pay per event: each record pushed is one charge, and each event type is priced the same. Platform compute is included in the actor usage fee.
| Event | What counts | Price |
|---|---|---|
product | Product listing record | $1.50 / 1,000 |
product-details | Product detail record | $1.50 / 1,000 |
product-review | Customer review record | $1.50 / 1,000 |
| Records | Estimated base cost |
|---|---|
| 1,000 | $1.50 |
| 10,000 | $15.00 |
| 100,000 | $150.00 |
Estimates depend on the verified pricing model and which options you enable.
Limitations and responsible data use
- Only publicly accessible OTTO.de product and review data is returned.
- Prices, availability, and discounts change frequently and reflect the moment of collection.
- Fields may be missing or conditional depending on the product and options enabled.
- No historical snapshots are stored unless you keep them yourself.
- You are responsible for complying with OTTO's terms and applicable laws.
Dataset questions
What does one dataset item represent?
One product, product detail, or customer review record, depending on the options enabled.
Which field should I use as a unique identifier?
Use productId for products and reviewId for reviews.
Are fields nullable or conditional?
Yes. Detail fields are conditional on includeProductDetails, and review fields are conditional on includeReviews.
Can I retrieve the records as CSV or JSON?
Yes. Export the default dataset as JSON, CSV, Excel, or XML, or read it through the Apify Dataset API.
How do I paginate large datasets?
Set maxItems to cap products, or paginate the dataset through the Dataset API.
What counts as a billable result?
Each product, product-detail, or review record pushed to the dataset is one event charge.
Related datasets from Data Scrapers
- Zalando Scraper — German fashion product records for the same apparel market.
- Zara Scraper — fashion product records that join with OTTO for cross-retailer pricing.
- Nike Scraper — brand product records for footwear and apparel analysis.
- Amazon Scraper — general merchandise records for broader price benchmarking.
Data Scrapers support
Need an additional field, record type, or export workflow? Contact Data Scrapers at stardustspotlight@gmail.com. Include a sample source URL, required fields, expected record volume, and preferred delivery format.