OBI.de Scraper - Prices, Offers & Reviews avatar

OBI.de Scraper - Prices, Offers & Reviews

Pricing

from $1.00 / 1,000 product results

Go to Apify Store
OBI.de Scraper - Prices, Offers & Reviews

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

Abot API

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

0

Monthly active users

14 days ago

Last modified

Share

OBI Scraper: Prices, Specials, Stock & Reviews

OBI Scraper turns obi.de, the German DIY, home improvement and garden retailer, into structured product data. Search by keyword or category slug, narrow to the site's own currently discounted specials, or paste product and listing links directly. Every record from search, category or listing pages carries the current price, the strike-through original price with a computed discount when a product is marked down, per-unit pricing per square metre or per kilogram where the site shows it, and an online availability status, plus on request the full breadcrumb category path, technical specifications, media gallery, EAN and multi-seller pricing, and a complete customer review history with a full rating breakdown. A pasted single product link reads name, brand, description, images, category and reviews only, since it never visits a listing page. Export to JSON, CSV or Excel, pull results through the API, or send them into apps you already use.

Why This Scraper?

  • Was-price and discount, structured, not read off a badge. When a product carries a reduced or recommended-retail original price, both prices are captured plus the computed discount amount and percentage.
  • Real per-unit pricing. Building-material products such as tiles, flooring and timber return their per-square-metre or per-kilogram price separately from the pack or sale-unit price, exactly as the site distinguishes the two.
  • Specials as a first-class filter. A "Specials / offers only" toggle 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 guessing at a category that does not 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 that vary per product category and are never hardcoded, media gallery, EAN and multi-seller pricing, stock and shipping.
  • Two ways in. Keyword or category search with real site filters for brand, rating, price range, specials and sort order, or paste any product or listing link and let pagination continue forward on its own.
  • Optional export to your apps. Send results into Notion, Linear, Airtable or any Apify MCP connector alongside the dataset.

Use Cases

  • Price trackers and comparison sites: monitor OBI's current and strike-through prices, discount percentages and per-unit pricing across chosen categories.
  • DIY retail and category managers: watch how an assortment's pricing, ratings and stock status move over a search or category on a recurring schedule.
  • Consumer and product researchers: collect full review text, rating breakdowns and technical specifications for comparison or sentiment studies.
  • Marketing and promotions teams: track which products currently carry a reduced price with the specials filter, to plan campaigns around active discount windows.
  • Data teams building historical DIY pricing datasets: run Incremental mode on a schedule to build a change log of new, updated and no-longer-listed products over time.

Data You Get

Sample shape: values below are illustrative placeholders, not from a live product.

FieldExample
productId / sku"3345566"
name"Voltago Akku-Laubbläser LB-320"
brand"Voltago"
category / categoryPath"Gartengeräte", [{"name": "Garten", "url": "..."}, {"name": "Gartengeräte", "url": "..."}]
url"https://www.obi.de/p/3345566/voltago-akku-laubblaeser-lb-320"
price / currency79.99, "EUR"
originalPrice / originalPriceType / discountAmount / discountPercent99.99, "STRIKE_PRICE", 20.00, 20.0
unitPrice / unitPriceUnit14.50, "m²"
isOnSpecialtrue
rating / reviewCount4.6, 34
onlineAvailable / onlineAvailabilityStatustrue, "BESTELLBAR"
storeAvailabilityStatus"KEIN_MARKT_AUSGEWAEHLT" (the actor never picks a store, so this field usually just says none is selected)
image / images"https://www.obi.de/sample/image.png", ["https://www.obi.de/sample/image.png"]
ean / eans"4001234567890", ["4001234567890"]
descriptionfull product description text
technicalData{"Weight": "2.4 kg", "Battery type": "Li-Ion", "Voltage": "18 V"} (flattened per category)
media[{"type": "image", "url": "...", "thumbnail": "..."}]
variants[] (populated when the product has size or colour options)
sellers[{"sellerName": "Sample Seller", "price": 79.99, "shippingCost": 4.95, "stock": 12}]
manufacturerName / manufacturerCountry / taxPercent"Sample Manufacturer GmbH", "DE", 19
reviews.averageRating / reviews.totalReviewCount4.6, 34
reviews.ratingDistribution[{"rating": 5, "count": 22}, {"rating": 4, "count": 8}, {"rating": 3, "count": 2}]
reviews.items[][{"rating": 5, "title": "Works well in the garden", "body": "Sample review text.", "author": "Sample Buyer", "date": "2026-03-14T10:22:00.000+00:00", "isRecommended": true, "verifiedPurchaser": true}]

OBI does not expose a separate "discontinued" flag. onlineAvailable / onlineAvailabilityStatus describe whether a still-listed product can currently be ordered online, passed straight through from the site. storeAvailabilityStatus is the site's own per-store status code, but this actor never selects a specific store, so it typically just reports that no store is selected rather than real local stock. A product that disappears from a tracked search or category altogether is what Incremental mode's EXPIRED classification is designed to catch, and only once "Emit expired products" is turned on (see How to Use below).

How to Use

  1. Pick a mode: search (a keyword or a real category slug, with real site filters) or url (paste product or listing links).
  2. Fill in the search term or the URLs, then narrow with the specials, brand, rating and price filters if you want a subset.
  3. Turn on Fetch full product detail and/or Fetch reviews for the extra fields you want, then set Max products total and Max pages per search to bound the run.
  4. Start the run, then download the dataset as JSON, CSV or Excel, or read it through the API.

Keyword search, first page, with reviews (the review toggle default):

{
"mode": "search",
"searchTerm": "akku ventilator",
"maxItems": 20
}

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
}

Paste a single product link (full detail is always included; reviews on request):

{
"mode": "url",
"urls": ["https://www.obi.de/p/1409713/einhell-akku-ventilator-gc-cf-18-110-li-solo"],
"fetchReviews": true,
"maxReviewsPerProduct": 0
}

Paste a listing link and keep paginating forward:

{
"mode": "url",
"urls": ["https://www.obi.de/search/schrauben/"],
"maxItems": 100,
"maxPages": 10
}

Run it from your code

Python:

from apify_client import ApifyClient
client = ApifyClient("<YOUR_APIFY_TOKEN>")
run = client.actor("abotapi/obi-de-scraper").call(run_input={"mode": "search", "searchTerm": "akku ventilator", "maxItems": 20})
for product in client.dataset(run["defaultDatasetId"]).iterate_items():
print(product["name"], product["price"], product["currency"])

JavaScript:

import { ApifyClient } from 'apify-client';
const client = new ApifyClient({ token: '<YOUR_APIFY_TOKEN>' });
const run = await client.actor('abotapi/obi-de-scraper').call({ mode: 'search', searchTerm: 'akku ventilator', maxItems: 20 });
const { items } = await client.dataset(run.defaultDatasetId).listItems();

Or connect it to Make, Zapier, n8n, Google Sheets or webhooks from the Integrations tab.

A bare product link has no search-result card to read anything from, so this actor always reads the full product detail page for a pasted product link, regardless of the Fetch full product detail toggle. That toggle only controls whether search and category results also get that same detail fetch. Reviews still follow the Fetch reviews toggle in every mode. A pasted product record never carries price, currency, originalPrice, originalPriceType, discountAmount, discountPercent, isOnSpecial, unitPrice, onlineAvailable, onlineAvailabilityStatus, storeAvailabilityStatus, image or images, since none of that comes from the product detail page this actor reads for it; it does still carry categoryPath, description, technicalData, media, variants, sellers, ean, eans, manufacturerName, manufacturerCountry, taxPercent, rating, reviewCount and reviews. specialsOnly, minPrice and maxPrice will always filter a pasted product out if set, since it has no price or discount data to check against.

Resume and recurring updates

  • Resume (resumeFromRunId) continues one interrupted or oversized run: paste its run or dataset ID and this run skips every product already collected there, returning only the remaining new products.
  • Incremental mode (incrementalMode) is for a schedule, for example daily, against the same search: the actor remembers the previous run itself, so you never paste a run ID. The first run returns everything as NEW. Later runs classify each product as NEW, UPDATED (with changedFields), UNCHANGED (suppressed and not billed unless emitUnchanged is on), REAPPEARED or EXPIRED. State is isolated per search term or URL, mode, filter and detail setting automatically; set stateKey to name or deliberately share a monitoring campaign. The nested review list itself is excluded from change detection, but the top-level rating and reviewCount fields are not, so a new review that moves either of those still turns the product UPDATED on the next run.
  • EXPIRED products (present before, no longer found) are only produced once emitExpired is on and a run completes a full, uncapped scan of the tracked search, never on a run cut short by Resume or by Max products total. Turning emitExpired on for the first time is also what starts marking a missing product as gone in the stored state.
  • REAPPEARED can only ever follow, on a later run, for a product that was previously marked gone that way. With emitExpired left off, which is the default, nothing is ever marked gone, so REAPPEARED never fires either.

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 (a 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.

Input Parameters

ParameterTypeDefaultDescription
modestringsearchsearch finds products by keyword, category or specials; url scrapes pasted product, search or category links.
searchTermstring(prefill akku ventilator)Keyword or a real OBI category slug, used in search mode only.
urlsarray(prefill sample link)Product or listing URLs to scrape, used in url mode only. Pagination continues forward from any ?page= already in the link.
specialsOnlybooleanfalseKeep only currently-discounted products. Applies to search mode and a pasted listing/category link; a pasted single product link never carries discount data, so it is always filtered out when this is on.
brandsarray(none)Exact brand names to keep. Applies to both search and url mode.
minRatinginteger(none)1 to 5, minimum rating to keep. Applies to both search and url mode.
minPricenumber(none)Minimum price in EUR to keep. Applies to search mode and a pasted listing/category link; a pasted single product link has no price to filter on, so it is always filtered out when this is set.
maxPricenumber(none)Maximum price in EUR to keep. Applies to search mode and a pasted listing/category link; a pasted single product link has no price to filter on, so it is always filtered out when this is set.
sortBystringRELEVANCERELEVANCE, PRICE_ASC, PRICE_DESC or RATING, applied to the fetched result set.
fetchDetailsbooleanfalseAdds breadcrumb category path, description, flattened technical specifications, media gallery, EAN and multi-seller pricing and stock from the product detail page, for search and listing results. A pasted single product link always includes this detail regardless of this toggle.
fetchReviewsbooleantrueFetches each product's full review history: overall rating, review count, a full rating breakdown, and per-review author, date, rating, title and body text.
maxReviewsPerProductinteger20Cap on reviews fetched per product when Fetch reviews is on. 0 means all available reviews.
maxPagesinteger(none, unlimited)Cap on result pages per search, category or URL entry. Leave empty for no page limit; the run still stops at Max products total.
maxItemsinteger20Hard cap on total products returned across every search, category or URL entry. 0 means unlimited, still bounded by Max pages per search.
resumeFromRunIdstring(none)Paste a previous run ID or dataset ID to continue one interrupted or oversized crawl without returning or charging for products already collected there.
incrementalModebooleanfalseTurn on for recurring monitoring of the same search. Later runs return only new and changed products.
stateKeystring(none)Optional name for an incremental-mode monitoring campaign; derived automatically from the search and filters when left empty.
emitUnchangedbooleanfalseIncremental mode only: also return, and bill for, products unchanged since the last run.
emitExpiredbooleanfalseIncremental mode only: also return, and bill for, products no longer found, once a run fully scans the tracked search.
proxyobject{"useApifyProxy": true}Connection configuration for the run.
mcpConnectorsarray(none)Optional MCP connectors to export results into (Notion, Linear, Airtable, Apify).
notionParentPageUrlstring(none)Notion connector only: page under which item pages are created.
maxNotifyListingsinteger50Cap on items exported to each connector per run. Does not affect the dataset.

Output Example

Sample shape: values below are illustrative placeholders, not from a live product.

{
"productId": "3345566",
"sku": "3345566",
"name": "Voltago Akku-Laubbläser LB-320",
"brand": "Voltago",
"category": "Gartengeräte",
"url": "https://www.obi.de/p/3345566/voltago-akku-laubblaeser-lb-320",
"price": 79.99,
"currency": "EUR",
"originalPrice": 99.99,
"originalPriceType": "STRIKE_PRICE",
"discountAmount": 20.00,
"discountPercent": 20.0,
"isOnSpecial": true,
"unitPrice": null,
"unitPriceUnit": null,
"rating": 4.6,
"reviewCount": 34,
"onlineAvailable": true,
"onlineAvailabilityStatus": "BESTELLBAR",
"storeAvailabilityStatus": "KEIN_MARKT_AUSGEWAEHLT",
"image": "https://www.obi.de/sample/image.png",
"reviews": {
"averageRating": 4.6,
"totalReviewCount": 34,
"ratingDistribution": [
{ "rating": 5, "count": 22 },
{ "rating": 4, "count": 8 },
{ "rating": 3, "count": 2 }
],
"items": [
{
"rating": 5,
"title": "Works well in the garden",
"body": "Sample review text.",
"author": "Sample Buyer",
"date": "2026-03-14T10:22:00.000+00:00",
"isRecommended": true,
"verifiedPurchaser": true
}
]
}
}

When fetchDetails is on for search or category results, the record also carries categoryPath, description, technicalData, media, variants, sellers, ean, eans, manufacturerName, manufacturerCountry and taxPercent. A pasted single product link (always detail-fetched) carries those same fields but never price, currency, originalPrice, discount fields, isOnSpecial, unitPrice, onlineAvailable, either availability status, image or images, since none of that lives on the product detail page; see "A note on pasted single product links" above. When incrementalMode is on, every returned record also carries changeType (NEW, UPDATED, UNCHANGED, REAPPEARED or EXPIRED), changedFields, firstSeenAt and lastSeenAt.

Plan Requirement

The default connection setup works without extra configuration. The run automatically retries a refused request a few times on the same connection, and stops retrying for the rest of that run if refusals continue, keeping whatever was already collected. A residential proxy connection is optional under Connection and is worth turning on only for very large or long-running monitoring campaigns.

FAQ

How much does it cost?

You pay per product returned in the dataset, plus a separate surcharge whenever full detail and/or the review history was actually fetched for that product, charged once per product no matter how many of those sub-fetches landed, plus a one-time run start fee. A pasted single product link always fetches full detail regardless of the Fetch full product detail toggle, so it always carries that surcharge when the fetch succeeds. The Pricing tab on the actor page shows the current rates. Use Max products total to cap the cost of any run.

This actor collects only publicly available product and review information from obi.de pages already visible to a shopper. You are responsible for how you use the data: follow OBI's terms and the laws that apply to you, and get legal advice before any commercial redistribution. Review text in particular may carry rights held by its authors.

Can I get only new or changed products on a schedule?

Yes. Schedule the actor from the Schedules tab and turn on Incremental mode. Later runs then return only new, updated and reappeared products for the same tracked search, and unchanged ones are suppressed and not billed unless Emit unchanged is on.

Does Incremental mode report REAPPEARED or EXPIRED products by default?

No. EXPIRED products are only produced once Emit expired is turned on and a run completes a full, uncapped scan of the tracked search, never on a run cut short by Resume or by Max products total. Turning Emit expired on is also what first lets the stored state mark a missing product as gone; REAPPEARED can then only follow, on a later run, for a product that was marked gone that way and is found again. With Emit expired left off, which is the default, nothing is ever marked gone, so REAPPEARED never fires either.

Why did my run return no products instead of failing?

If obi.de refuses every request during a search or category walk, the run still finishes as successful with whatever it managed to collect, which can be an empty dataset, rather than stopping with an error. A pasted single product link behaves differently: if its detail page is refused, the actor still pushes (and bills) a stub row for it with just the identifiers it already had (productId, sku, url) and no name or other detail fields, rather than an empty dataset, unless a filter like specialsOnly, minPrice or maxPrice happens to exclude it first. Only a few specific setup problems, such as an unreadable Resume run or dataset ID, or turning on Incremental mode and Resume together against a search that already has tracked state, stop the run early with a clear failure message.

Can I use it with AI agents or MCP?

Yes. Call it from any Apify integration or MCP client, and use the connector field to push a summary of each result into Notion, Linear or Airtable.

🔗 Want more e-commerce data?

Pair this actor with these related scrapers from the same team:

🛒 HORNBACH Products, Prices & Reviews Scraper
Scrape HORNBACH (hornbach.de) DIY, building & garden products: current + strike-through...
🛒 dm.de
Scrape dm-drogerie markt (dm.de) products: current + strike-through Ausverkauf price with...
🛒 ROSSMANN.de Scraper
Scrape ROSSMANN (rossmann.de) drugstore products: current + original strike-through price...
🥦 Kaufland.de Scraper
Scrape Kaufland.de, Germany's hypermarket and online marketplace: keyword/category/brand...
🛒 Thalia.de Scraper
Scrape Thalia.de books, eBooks, audiobooks, toys and stationery. Search by keyword or...
🛒 LeroyMerlin.es Scraper
Scrape Leroy Merlin Spain (leroymerlin.es) DIY and home-improvement products: price...

👉 Browse all abotapi scrapers

💬 Support & custom scrapers

  • 🐞 Found a bug or a missing field? Open a ticket on the Issues tab. We usually reply within hours.
  • 🛠️ Need another site, extra fields or a private build? Email abotapi@proton.me or message Telegram @abotapi.
  • ⭐ Enjoying it? A quick review on the actor page helps other users find it.