OBI.de Scraper icon

OBI.de Scraper

Scrape OBI (obi.de) DIY/home-improvement products: current + strike-through original price with discount, per-unit pricing (per m2/kg), specials/offers…

Start using this actor on Apify ↗Need a custom scraper?Contact us ↗

OBI.de Scraper at a glance

OBI.de Scraper is a ready-to-run Apify actor from abotapi for collecting ecommerce data. Its documented output includes article no., change type (incremental mode), ean, product and brand, which you can export as JSON, CSV or Excel or read through the Apify API. It costs $1.80 per 1,000 results on the Apify Free plan and from $1.00 on paid plans, with smaller per-run or optional feature charges listed on Apify.

Runs on
Apify cloud: console, API, schedules and integrations
Data type
Ecommerce, Automation, Developer Tools
Region
Europe
Pricing
$1.80 per 1,000 results (Free plan), from $1.00 on paid plans
Output
Documented below · JSON, CSV, Excel
Inputs
26 options

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.

What OBI.de Scraper can do

  • 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 filters for brand, rating, price range and specials plus a sort order (the site ignores sort parameters, so sorting is applied by the actor to the fetched result set), or paste any product or listing link and let pagination continue forward on its own.

Choose what to collect

These inputs let you configure OBI.de Scraper - Prices, Offers & Reviews. Open the actor on Apify to enter your values and review the current options.

Supported input fields
InputWhat it controls
modestring · required'search' finds products by keyword, category, and/or the site's own currently-discounted specials, with real site filters. 'url' scrapes any product, search-result, or category page URL you paste, walking pagination forward automatically.

Choices: search, url

searchTermstringFree-text keyword (e.g. 'akku ventilator') or a known OBI category slug (e.g. 'werkzeuge', 'garten', 'bad', 'kueche') to browse a whole listing. Leave empty and turn on Specials / offers only to browse current offers. With no keyword and no specials filter, the actor searches the example keyword 'akku ventilator' so a default run still returns rows.
urlsarrayPaste OBI product pages (.../p/[/]), search/category/specials listing pages (.../search//, with or without trailing slash, with or without ?page=), or brand shop pages (.../marken/, mapped to the brand listing). Pagination continues forward from any ?page= already in the URL. The site ignores ?sort=: the actor warns and orders within each fetched page only. The default list holds one example per distinct target; the prefill additionally shows the redirect and sort variants, which resolve to the same targets.
specialsOnlybooleanOBI has no separate 'on sale' category route -- it marks currently-reduced products with a strike-through original price inline in every listing. Turn this on to keep only products that currently show a reduced price and discount (narrows the same search/category listing, verified live on 'aktion').
brandsarrayOnly return products from these brands, e.g. 'Bosch', 'Einhell', 'Makita'. Match the exact brand name as shown on the site. Leave empty for all brands.
minRatingintegerOnly return products rated at or above this many stars, 1-5.
minPricenumberOnly return products priced at or above this amount, in euros.
Show 19 more inputs
More input fields
InputWhat it controls
maxPricenumberOnly return products priced at or below this amount, in euros.
sortBystringOrder of the returned results (applied to the fetched result set; for a fully sorted view across a large catalog, combine with a larger Max products total).

Choices: RELEVANCE, PRICE_ASC, PRICE_DESC, RATING

fetchDetailsbooleanAdds the full breadcrumb category path, description, technical data/specifications (flattened), media gallery, variants, EAN, multi-seller pricing/stock, and manufacturer info from the product detail page. Current price, was-price/discount, unit price and rating are already included without this toggle.
fetchReviewsbooleanFetch each product's full review history: overall rating, review count, a full 1-5 rating breakdown, and per-review author/date/rating/title/body. Products with no reviews simply return an empty list. The detail-enrichment charge is one unit per started block of 10 reviews returned, with the product read folded into the first block (minimum 1 unit per enriched row; see the Pricing tab).
maxReviewsPerProductintegerCap on reviews fetched per product when 'Fetch reviews' is on. 0 = all available reviews, up to 5000 per product.
maxPagesintegerStop after this many result pages per search/category/URL entry. Leave empty for the built-in hard limit of 1000 pages per entry; the run also stops at Max products total.
maxItemsintegerHard cap on total products returned across every search/category/URL entry. 0 = the maximum of 100000 (still bounded by Max pages per search).
resumeFromRunIdstringPaste a previous run ID or dataset ID to continue a large crawl of products without returning or charging for products already collected there. Use this after an interrupted run, or when continuing a product catalogue pull in another run. For recurring daily monitoring of the same search, use Incremental mode below instead.
incrementalModebooleanTurn this on for daily or recurring monitoring. The first run returns all matching products as NEW. Later runs normally return only NEW, UPDATED, and REAPPEARED products. UPDATED means a compared field changed: price, original price, discount, special flag, availability, rating, review count, name, brand, category, images, detail fields and so on. Reviews (the nested reviews block) and the scrapedAt timestamp are never compared, so a new review never creates a billable row; they stay in every returned row. Use "Ignore fields when detecting changes" and "Change scope" below to narrow what counts. Turn on "Emit unchanged" or "Emit expired" only when you also want those products returned (and billed). State is kept separately for each search term/URL and mode/filter/detail setup; use State key when you want to name or deliberately share a monitoring campaign. To continue one specific interrupted run instead, use Resume from a previous run above.
stateKeystringOptional. Name this monitoring campaign to keep its state stable, or to deliberately share state across differently-configured runs. Leave empty to let the actor derive a key automatically from the search term/URLs and filter settings -- different searches then never mix state with each other.
emitUnchangedbooleanOff by default. Turn on to also return products that have not changed since the last run, marked UNCHANGED. This returns -- and bills -- extra rows you already have, so leave it off unless you specifically want the full snapshot every run.
emitExpiredbooleanOff by default. Turn on to also return products that were present in a previous run but are no longer found, marked EXPIRED. Only produced once a run has fully scanned the tracked search -- not when Max products capped it or when Resume was used. This returns -- and bills -- extra synthetic rows, so leave it off unless you need expiry tracking. EXPIRED means the product was not found on a complete scan; it does not prove the product was delisted.
changeScopestringAll (default): any compared field that changes makes a product UPDATED. Price and stock only: only price, original price, discount, special flag and availability decide UPDATED; name, images, category and other metadata never create a row. Changing this with the automatic state key starts a fresh baseline (everything NEW once); set a State key to keep the current baseline.

Choices: all, priceAndStock

compactUpdatesbooleanOff by default. When on, UPDATED and EXPIRED rows are slim: ids, url, name, current price and availability plus priceChanges (old and new value per moved field). NEW rows stay full. A compact row carries no reviews or detail fields, so no detail-enrichment charge is made for it.
expireAfterMissedScansintegerWith Emit expired on, a product is marked EXPIRED only after it was missing from this many consecutive complete scans (default 1). EXPIRED means the product dropped out of the listing; it does not prove it was delisted or is out of stock.
ignoreFieldsForChangesarrayField names that never decide UPDATED (they stay in every returned row). A dotted path such as images.url or reviews.items drops that key inside nested values. Reviews and scrapedAt are always ignored. Example: rating, reviewCount.
mcpConnectorsarrayOptionally send the scraped results into the apps you already use, via Model Context Protocol (MCP) connectors. Authorize a connector once under Apify -> Settings -> Integrations, then select it here. The connector receives a condensed, human-readable summary per item (title + key fields), not the full JSON; the complete record stays in the dataset. Leave empty to skip. Supported: Notion (https://mcp.notion.com/mcp), Linear (https://mcp.linear.app/sse), Airtable (https://mcp.airtable.com/mcp), Apify (https://mcp.apify.com).
notionParentPageUrlstringURL (or id) of the Notion page under which item pages are created. Required to enable the Notion export; ignored by other connectors.
maxNotifyListingsintegerCap on items written to each connector per run. Does not affect the dataset.

Fields in the output

The documented dataset includes the fields below. Availability can depend on the source page and selected mode.

productIdArticle No. (text)
changeTypeChange type (incremental mode) (text)
eanEAN (text)
nameProduct (text)
brandBrand (text)
categoryCategory (text)
pricePrice (number)
currencyCurrency (text)
originalPriceOriginal price (number)
discountPercentDiscount % (number)
unitPriceUnit price (number)
unitPriceUnitUnit (text)
Show 18 more fields
isOnSpecialOn special (boolean)
ratingRating (number)
reviewCountReviews (number)
onlineAvailableOnline available (boolean)
inStockIn stock (boolean)
urlURL (link)
imageImage (image)
changedFieldsChanged fields (incremental mode) (array)
firstSeenAtFirst seen (incremental mode) (date)
lastSeenAtLast seen (incremental mode) (date)
scrapedAtScraped at (date)
reviewsReviews (rating, count, breakdown, per-review list) (object)
categoryPathCategory path (array)
descriptionDescription (text)
technicalDataTechnical data (object)
sellersSellers (array)
manufacturerNameManufacturer (text)
manufacturerCountryManufacturer country (text)

Example output

An example from this actor’s documentation. Values are illustrative; this is not a fresh live result.

{
  "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,
  "discountPercent": 20,
  "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
      }
    ]
  }
}

Ways to use this data

  • 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.

Before you run

Start with a small input and check the resulting records against your expected fields. Source content and actor options can change; the current Apify listing is the reference for availability and pricing.

Questions about this actor

What data does OBI.de Scraper return?

The documented output for OBI.de Scraper includes article no., change type (incremental mode), ean, product, brand, category, price and currency. Availability of each field depends on the source page and the selected mode.

How much does OBI.de Scraper cost?

It costs $1.80 per 1,000 results on the Apify Free plan and from $1.00 on paid plans, with smaller per-run or optional feature charges listed on Apify. The Apify listing shows the current rate for every plan.

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.

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.

Ready to collect with OBI.de Scraper?

Run it on Apify with your own input and export the results as JSON, CSV or Excel.