OBI.de Scraper - Prices, Offers & Reviews
Pricing
from $1.00 / 1,000 product results
OBI.de Scraper - Prices, Offers & Reviews
Scrape OBI (obi.de) DIY/home-improvement products: current + strike-through original price with discount, per-unit pricing (per m2/kg), specials/offers listings, brand, EAN, multi-seller stock, tech specs, and full reviews with rating breakdown. Search or paste links.
Pricing
from $1.00 / 1,000 product results
Rating
0.0
(0)
Developer
Abot API
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
10 days ago
Last modified
Categories
Share
OBI Product Scraper
Pull rich product data from OBI (obi.de), the German DIY / home-improvement / hardware / garden retailer. Search by keyword, category, or currently-discounted specials, or paste product and listing links directly. Every record includes the current price, the strike-through original price with computed discount when a product is marked down, per-unit pricing (per m² / per kg / per piece) where the site shows it, and a complete customer review history with a full rating breakdown.
Why This Scraper?
- Was-price and discount, structured, not scraped from a badge. When a product carries a reduced or recommended-retail original price, both are captured plus the computed discount amount and percentage.
- Real per-unit pricing. Building-material products (tiles, flooring, timber) return their per-square-metre or per-kilogram price separately from the pack/sale-unit price, exactly as the site distinguishes the two.
- Specials, first-class. A
specialsOnlytoggle narrows any search or category listing to only products currently showing a reduced price -- OBI has no separate "on sale" category route, so this filters the site's own live discount signal instead of faking a category that doesn't exist. - Full review history. Overall rating, review count, a full 1 to 5 star rating breakdown, and every individual review with author, date, rating, title, and body text.
- Rich detail on demand. Full breadcrumb category path, flattened technical specifications (varies per product category, never hardcoded), media gallery, EAN, and multi-seller pricing/stock/shipping.
- Two ways in. Keyword or category search with real site filters (brand, rating, price range, specials, sort), or paste any product/listing link and continue pagination automatically.
- Optional export to your apps. Send results into Notion, Linear, Airtable, or any Apify MCP connector alongside the dataset.
Data You Get
| Field | Example value |
|---|---|
| productId / sku | 1234567 |
| name | Sample Cordless Fan |
| brand | Sample Brand |
| category / categoryPath | Battery tools, [{"name": "Power tools", "url": "..."}, {"name": "Battery tools", "url": "..."}] |
| url | https://www.obi.de/p/1234567/sample-cordless-fan |
| price / currency | 39.99, EUR |
| originalPrice / originalPriceType / discountAmount / discountPercent | 49.99, STRIKE_PRICE, 10.00, 20.0 |
| unitPrice / unitPriceUnit | 20.99, m² |
| isOnSpecial | true |
| rating / reviewCount | 4.7, 62 |
| onlineAvailable / onlineAvailabilityStatus / storeAvailabilityStatus | true, BESTELLBAR, KEIN_MARKT_AUSGEWAEHLT |
| image / images | ["https://www.obi.de/sample/image.png"] |
| ean / eans | 4000000000000 |
| description | full text field |
| technicalData | {"Weight": "476 g", "Height": "26.5 cm", "Battery type": "Li-Ion"} (flattened per category) |
| media | [{"type": "image", "url": "...", "thumbnail": "..."}] |
| variants | [] (populated when the product has size/colour options) |
| sellers | [{"sellerName": "Sample Seller", "price": 39.99, "shippingCost": 4.95, "stock": 36}] |
| manufacturerName / manufacturerCountry / taxPercent | Sample Manufacturer AG, DE, 19 |
| reviews.averageRating / reviews.totalReviewCount | 4.7, 62 |
| reviews.ratingDistribution | [{"rating": 5, "count": 50}, {"rating": 4, "count": 10}, ...] |
| reviews.items[] | [{"rating": 5, "title": "Sample title", "body": "Sample review text.", "author": "Sample User", "date": "2026-07-12T07:31:15.000+00:00", "isRecommended": true, "verifiedPurchaser": true}] |
Sample shape: values above are illustrative placeholders, not from a live product.
How to Use
1. Keyword search, first page, with reviews (default):
{"mode": "search","searchTerm": "akku ventilator","maxItems": 20}
2. Category browse, filtered to a brand and only currently-discounted items:
{"mode": "search","searchTerm": "werkzeuge","brands": ["Bosch"],"specialsOnly": true,"sortBy": "PRICE_ASC","maxItems": 50,"maxPages": 5}
3. Full product detail + reviews for pasted product links:
{"mode": "url","urls": ["https://www.obi.de/p/1234567/sample-cordless-fan"],"fetchDetails": true,"fetchReviews": true,"maxReviewsPerProduct": 0}
4. Paste a listing link and keep paginating forward:
{"mode": "url","urls": ["https://www.obi.de/search/akku%20ventilator/"],"maxItems": 100,"maxPages": 10}
Input Parameters
| Parameter | Type | Description |
|---|---|---|
mode | string | search or url. |
searchTerm | string | Keyword or a real category slug (search mode only). |
urls | array | Product or listing URLs to scrape (url mode only). |
specialsOnly | boolean | Keep only currently-discounted products (applies to both search and url mode). |
brands | array | Exact brand names to keep (applies to both search and url mode). |
minRating | integer | 1-5, minimum rating to keep (applies to both search and url mode). |
minPrice / maxPrice | number | EUR price band to keep (applies to both search and url mode). |
sortBy | string | RELEVANCE, PRICE_ASC, PRICE_DESC, or RATING (applies to both search and url mode). |
fetchDetails | boolean | Fetch full product detail (breadcrumb, description, specs, media, EAN, sellers). |
fetchReviews | boolean | Fetch full review history. |
maxReviewsPerProduct | integer | Cap on reviews per product; 0 = all. |
maxPages | integer | Cap on result pages per search/URL entry; empty = unlimited. |
maxItems | integer | Cap on total products returned; 0 = unlimited. |
resumeFromRunId | string | Continue ONE interrupted run/dataset without re-collecting or re-charging its products. |
incrementalMode | boolean | Recurring monitoring of the same search: later runs return only NEW/UPDATED/REAPPEARED products. |
stateKey | string | Optional name for an incremental-mode monitoring campaign; auto-derived from the search/filters when empty. |
emitUnchanged | boolean | Incremental mode only: also return (and bill for) products unchanged since the last run. |
emitExpired | boolean | Incremental mode only: also return (and bill for) products no longer found, once a run fully scans the tracked search. |
proxy | object | Apify proxy configuration. Works on every plan by default. |
mcpConnectors | array | Optional MCP connectors to export results into (Notion, Linear, Airtable, Apify). |
notionParentPageUrl | string | Notion connector only: page under which item pages are created. |
maxNotifyListings | integer | Cap on items exported to each connector per run. Does not affect the dataset. |
Output Example
{"productId": "1234567","sku": "1234567","name": "Sample Cordless Fan","brand": "Sample Brand","category": "Battery tools","url": "https://www.obi.de/p/1234567/sample-cordless-fan","price": 39.99,"currency": "EUR","originalPrice": null,"discountAmount": null,"discountPercent": null,"isOnSpecial": false,"unitPrice": null,"unitPriceUnit": null,"rating": 4.7,"reviewCount": 62,"onlineAvailable": true,"image": "https://www.obi.de/sample/image.png","reviews": {"averageRating": 4.7,"totalReviewCount": 62,"ratingDistribution": [{ "rating": 5, "count": 50 }, { "rating": 4, "count": 10 }],"items": [{"rating": 5,"title": "Sample title","body": "Sample review text.","author": "Sample User","date": "2026-07-12T07:31:15.000+00:00","isRecommended": true,"verifiedPurchaser": true}]}}
Sample shape: values above are illustrative placeholders, not from a live product.
Incremental mode only. When incrementalMode is on, every returned record also carries:
| Field | Description |
|---|---|
changeType | NEW | UPDATED | UNCHANGED | REAPPEARED | EXPIRED |
changedFields | Top-level fields that changed since last seen; non-empty only for UPDATED |
firstSeenAt | When this product was first observed by this monitoring campaign |
lastSeenAt | When this product was last observed |
Resume & recurring updates
Two different things -- pick the one that matches what you're doing:
| Need | Use |
|---|---|
| A crawl stopped and should continue | resumeFromRunId |
| Run the same search every day and receive only changes | incrementalMode |
| Keep separate daily campaigns for similar searches | distinct stateKey values |
| Run a normal full snapshot | leave both off |
Resume (resumeFromRunId) continues one specific interrupted or previous large crawl: paste a run ID or dataset ID and this run skips products already collected there, returning only the remaining new products.
Incremental mode (incrementalMode) is for a schedule (e.g. daily): the actor remembers the previous run of the same search itself, so you never paste a run ID. The first run returns everything as NEW. Later runs return only NEW, UPDATED, and REAPPEARED products -- unchanged products are suppressed (and not charged) unless emitUnchanged is on. EXPIRED products (present before, no longer found) are only produced with emitExpired on, and only once a run fully scans the tracked search (not capped, not a resume). State is isolated per search term/URL, mode, filter and detail setting automatically; set stateKey to name or deliberately share a monitoring campaign. A new review alone never counts as a change to its product -- reviews are excluded from change detection.
Send results into your apps (MCP connectors)
Optionally pipe results into the apps you already use through Model Context Protocol (MCP) connectors. Authorize a connector once under Apify, Settings, Integrations, then select it in the mcpConnectors field. Each connector receives a condensed, human-readable summary per product (title plus key fields), while the complete record always stays in the Apify dataset. For Notion, set notionParentPageUrl to the page the item pages should be created under, and use maxNotifyListings to cap how many items are exported per connector per run. Supported connectors: Notion, Linear, Airtable, and Apify. Leave the field empty to skip; it never changes the dataset output.
A note on plans
The default connection works on every Apify plan, including the free tier. A residential proxy connection is optional and only worth turning on for very large or sustained runs.