HORNBACH Products, Prices & Reviews Scraper icon

HORNBACH Products, Prices & Reviews Scraper

Scrape HORNBACH (hornbach.de) DIY, building & garden products: current + strike-through price with discount, per-unit pricing (m2/kg/piece), full…

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

HORNBACH Products, Prices & Reviews Scraper at a glance

HORNBACH Products, Prices & Reviews Scraper is a ready-to-run Apify actor from abotapi for collecting ecommerce data. Its documented output includes article no., product, brand, price and currency, 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.10 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, Developer Tools, Automation
Region
Europe
Pricing
$1.80 per 1,000 results (Free plan), from $1.10 on paid plans
Output
Documented below · JSON, CSV, Excel
Inputs
27 options

Scrape HORNBACH (hornbach.de) DIY, building & garden products: current + strike-through price with discount, per-unit pricing (m2/kg/piece), full technical specs, category path, online & in-store availability, and complete product reviews with rating breakdown.

What HORNBACH Products, Prices & Reviews Scraper can do

  • Was-price and discount, structured. When Hornbach.de shows both its own price and a manufacturer's suggested price, both are captured, plus the computed discount amount and percentage, not just a badge.
  • Unit pricing for bulk goods. Tiles, flooring, and similar products sold by quantity return their per-square-metre, per-kilogram, or per-piece pack price alongside the item price, exactly as shown on the product page.
  • Full technical specifications on demand. Turn on full product detail for the complete breadcrumb category path, EAN, media gallery, variant matrix, and every characteristic the product page lists, returned as clean key and value pairs.
  • Complete review history, fetched by default. Overall rating, review count, a full one to five star rating breakdown, and every individual review with author, date, rating, title, and body text.
  • Online and in-store availability together. Home delivery status alongside store pickup or reservation status and seller information, plus exact aisle-level stock text when full detail is on.
  • Three ways in. Keyword and/or category search with the site's real filters, or paste product, search, or category links and let pagination continue automatically.

Choose what to collect

These inputs let you configure HORNBACH Products, Prices & Reviews Scraper. 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 and/or category with HORNBACH's own 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. 'akkuschrauber' or 'fliesen'. Combine with Category below to narrow a keyword search, or leave empty and set only Category to browse a whole department.
searchQuerystringAlias of Search keyword, accepted for compatibility with other HORNBACH scrapers. Ignored when Search keyword is set.
categorystringA HORNBACH category id, e.g. 'S1937' (Maschinen, Werkzeug & Werkstatt), or a category name such as 'Akkuschrauber' which is looked up on hornbach.de; the run stops with an error if no category matches the name. Ids are in category page URLs: hornbach.de/c//S/. Narrows a keyword search, or browses the whole department when Search keyword is left empty. In URL mode it also narrows pasted search-result links; category and product links ignore it.
categoryUrlstringAlias: a hornbach.de category or search page URL. Switches the run to URL mode and scrapes it ahead of any Start URLs you pasted yourself (the untouched example list is replaced). Ignored when Category is set.
brandsarrayOnly return products from these brands, e.g. 'Bosch Professional', 'Makita', 'Einhell'. Match the exact brand name as shown on the site. Leave empty for all brands.
sellersarrayOnly return offers from these named sellers (HORNBACH itself plus third-party marketplace sellers), e.g. 'Rubart GmbH'. Leave empty for all sellers.
Show 20 more inputs
More input fields
InputWhat it controls
minPriceintegerOnly return products priced at or above this amount.
maxPriceintegerOnly return products priced at or below this amount.
availabilitystringNarrow by stock/availability, or by new-in-range products.

Choices: , IN_STOCK, ONLINE, RESERVABLE, NEW

sortBystringOrder of the returned results.

Choices: SCORE, PRICE_ASC, PRICE_DESC, RATING_DESC, BRAND_ASC, BRAND_DESC, TITLE_ASC, TITLE_DESC

urlsarrayPaste one or more HORNBACH product pages (/p/...//), search-result pages (/s//), or category pages (/c/.../S/). Pagination continues forward automatically from any page number already in the URL. The filters and sort order above apply to pasted search-result links (a sortBy value in the link itself wins over the Sort order field); category and product links are scraped as-is. Left untouched, URL mode scrapes one example of each supported URL shape (search, paginated search, sorted search, category, nested category, product).
fetchDetailsbooleanAdds the full breadcrumb category path, complete description, flattened technical specifications, EAN/GTIN, media gallery, variant matrix, safety/legal hints, and exact in-store stock text. Current price, was-price/discount, per-quantity price (e.g. per square metre) and rating are already included without this toggle.
fetchReviewsbooleanFetch each product's full review history: overall rating, review count, rating breakdown, and per-review author/date/rating/title/body. Products with no reviews simply return an empty list.
maxReviewsPerProductintegerCap on reviews fetched per product when 'Fetch reviews' is on. 0 = all available reviews, up to 1,000 per product.
maxPagesintegerStop after this many result pages per search/category/URL entry. 0 (default) = unlimited, walk every page until the site's own last page or Max products total is hit.
maxItemsintegerHard cap on total products returned across every search/category/URL entry. 0 = unlimited (still bounded by Max pages per search).
maxResultsintegerAlias of Max products total, accepted for compatibility. Takes effect while Max products total is left at its default of 20; a Max products total you changed wins.
resumeFromRunIdstringPaste a previous run id (or its dataset id) to continue that run: products already collected there are skipped, so this run only returns new products (a delta). Use this after an interrupted run, or to continue a large catalogue pull across multiple runs. For recurring daily/weekly monitoring of the SAME search, use Incremental mode below instead. Leave empty for a normal run.
incrementalModebooleanTurn this on for daily or recurring monitoring of the same search/category/URL set. The first run returns all matching products as NEW. Later runs normally return only NEW, UPDATED, and REAPPEARED products. UPDATED is decided by comparing every output field with the previous run (price, original price, discount, badges, availability and store pickup, merchant and so on); changedFields lists which ones moved. The reviews block never triggers UPDATED; a changed rating or review count does, unless you list them in Ignore fields below. Turn on "Emit unchanged" or "Emit expired" below only when you also want those products returned (and billed). State is kept separately for each search/category/URL and detail/review-mode setup; use State key to name or deliberately share a monitoring campaign. To continue one specific interrupted run instead, use Resume from run/dataset id 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/category/URL and filter/detail 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.
ignoreFieldsForChangesarrayOptional. Extra field names to leave out when deciding whether a product changed. Fields listed here still appear in every row; they just never trigger UPDATED or show up in changedFields. Use a dotted path for a nested field, e.g. onlineMerchant.name. The reviews block is always left out (it depends on the review cap and on whether the review fetch succeeded); rating and reviewCount do count as changes unless you list them here.
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)
nameProduct (text)
brandBrand (text)
pricePrice (number)
currencyCurrency (text)
priceUnitUnit (text)
originalPriceUVP / Was-price (number)
discountPercentDiscount % (number)
packPricePack price (number)
packPriceUnitPack unit (text)
ratingRating (number)
reviewCountReviews (number)
Show 21 more fields
onlineAvailableOnline (boolean)
storePickupAvailableStore pickup (boolean)
urlURL (link)
imageImage (image)
changeTypeChange type (incremental mode) (text)
changedFieldsChanged fields (incremental mode) (array)
firstSeenAtFirst seen (incremental mode) (date)
lastSeenAtLast seen (incremental mode) (date)
reviews.averageRatingAverage rating (number)
reviews.totalReviewCountTotal reviews (number)
reviews.items.ratingReview rating (number)
reviews.items.titleTitle (text)
reviews.items.bodyReview (text)
reviews.items.authorAuthor (text)
reviews.items.dateDate (date)
reviews.items.isRecommendedRecommended (boolean)
eanEAN (text)
categoryPathCategory path (array)
specificationsSpecifications (object)
datasheetsDatasheets (array)
imagesImages (array)

Example output

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

{
  "productId": "12314733",
  "sku": "12314733",
  "concreteProductId": "12314733_ST",
  "name": "Sample Cordless Drill Driver, incl. 2 batteries and charger",
  "url": "https://www.hornbach.de/p/sample-product-name/12314733/",
  "brand": "Sample Tools Professional",
  "price": 199,
  "currency": "€",
  "priceUnit": "ST",
  "originalPrice": null,
  "discountAmount": null,
  "discountPercent": null,
  "packPrice": null,
  "packPriceUnit": null,
  "badges": [
    "Top item"
  ],
  "rating": 4.9,
  "reviewCount": 11,
  "onlineAvailable": true,
  "onlineAvailabilityText": "Online bestellbar",
  "storePickupAvailable": true,
  "storePickupAvailabilityText": "Reservierbar",
  "onlineMerchant": {
    "name": "HORNBACH",
    "isMarketplaceMerchant": false
  },
  "storeMerchant": {
    "name": "HORNBACH",
    "isMarketplaceMerchant": false
  },
  "categoryPath": [
    {
      "name": "Home",
      "url": "https://www.hornbach.de/"
    },
    {
      "name": "Machines, Tools and Workshop",
      "url": "https://www.hornbach.de/c/sample/S1937/"
    }
  ],
  "ean": "4000000000000",
  "specifications": {
    "Drive type": "Battery",
    "Voltage": "18 V",
    "Weight incl. battery": "2.1 kg"
  },
  "images": [
    {
      "url": "https://media.hornbach.de/hb/packshot/sample.jpg",
      "thumbnailUrl": "https://media.hornbach.de/hb/packshot/sample_thumb.jpg",
      "alt": "Sample product image"
    }
  ],
  "datasheets": [
    {
      "title": "Technical data sheet",
      "url": "https://media.hornbach.de/sample.pdf"
    }
  ],
  "reviews": {
    "averageRating": 4.9,
    "totalReviewCount": 11,
    "ratingDistribution": [
      {
        "rating": 5,
        "count": 10
      },
      {
        "rating": 4,
        "count": 1
      }
    ],
    "items": [
      {
        "rating": 5,
        "title": "Sample review title",
        "body": "Sample review text describing the product experience.",
        "author": "Sample User",
        "date": "2026-05-01T00:00:00.000Z",
        "isRecommended": true,
        "secondaryRatings": {
          "Value": 5,
          "Quality": 5
        }
      }
    ]
  }
}

Ways to use this data

  • Price and discount monitoring: track the gap between the manufacturer's suggested price and Hornbach.de's own price, plus per-unit pricing, for repricing or comparison-shopping tools.
  • Building materials procurement: pull bulk per-square-metre or per-kilogram pricing and full technical specifications for tiles, timber, and other quantity-sold materials.
  • Catalog and inventory feeds: keep an external catalog current with online and in-store availability, seller information, and specifications.
  • Review and reputation research: collect full review histories with rating breakdowns to analyze product quality and customer sentiment.
  • Recurring change monitoring: schedule daily or weekly runs to catch new arrivals, price changes, and availability shifts without re-collecting everything each 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 HORNBACH Products, Prices & Reviews Scraper return?

The documented output for HORNBACH Products, Prices & Reviews Scraper includes article no., product, brand, price, currency, unit, uvp / was-price and discount %. Availability of each field depends on the source page and the selected mode.

How much does HORNBACH Products, Prices & Reviews Scraper cost?

It costs $1.80 per 1,000 results on the Apify Free plan and from $1.10 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. Each later run then returns only new, updated and reappeared products for that tracked search, and unchanged ones are suppressed and not billed unless you turn Emit unchanged on.

What is the difference between Resume and Incremental mode?

Resume (resumeFromRunId) continues ONE specific interrupted or previous run: paste its run or dataset id and only the remaining new products are returned. Incremental mode is for running the SAME search again and again on a schedule; the actor remembers the previous run of that search by itself, with no id to paste. Combining the two only bootstraps a brand-new tracked search from an existing dataset; if that search already has saved state, the run stops with an error instead of mixing the two.

When does a product come back marked REAPPEARED?

Only after an earlier complete scan with Emit expired on recorded that same product as gone (normally output as an EXPIRED row), which itself only happens when Emit expired was on and that earlier run completed a full, uncapped scan of the tracked search. A tracked product that was never marked gone that way instead classifies as UPDATED, or UNCHANGED (suppressed unless Emit unchanged is on), like any other tracked product, never REAPPEARED.

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 results into Notion, Linear, or Airtable.

Ready to collect with HORNBACH Products, Prices & Reviews Scraper?

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