HORNBACH Products, Prices & Reviews Scraper avatar

HORNBACH Products, Prices & Reviews Scraper

Pricing

from $1.00 / 1,000 product results

Go to Apify Store
HORNBACH Products, Prices & Reviews Scraper

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 technical specs, category path, online & in-store availability, and complete product reviews with rating breakdown.

Pricing

from $1.00 / 1,000 product results

Rating

0.0

(0)

Developer

Abot API

Abot API

Maintained by Community

Actor stats

0

Bookmarked

1

Total users

1

Monthly active users

10 days ago

Last modified

Share

HORNBACH Product Scraper

Pull rich product data from HORNBACH (hornbach.de), the German DIY, building materials and garden retailer. Search by keyword and/or category with real site filters, or paste product, search, and category links directly. Every record includes current price, the manufacturer's suggested retail price (UVP) with computed discount when a product is marked down, per-unit pricing (per square metre, per kilogram, per piece) where the site shows it, online and in-store availability, and a full customer review history with rating breakdown.

Why This Scraper?

  • Was-price and discount, structured, not scraped from a badge. When a product carries a manufacturer's suggested price alongside HORNBACH's own price, both are captured plus the computed discount amount and percentage.
  • Unit pricing for building materials. Tiles, flooring, and similar bulk goods return their per-square-metre (or per-kilogram, per-piece) selling price alongside the pack price, exactly as shown on the product page.
  • Full technical specifications, not a wall of text. Every category's characteristics table (dimensions, voltage, material, capacity, and dozens more per category) comes back as clean key/value pairs, plus the full breadcrumb category path.
  • Complete 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.
  • Online and in-store availability. Home delivery status alongside exact in-store stock text, aisle location, and seller information (HORNBACH itself or a marketplace partner).
  • Three ways in. Keyword search, category browse, or paste any product/search/category URL and let pagination continue automatically.
  • Daily/recurring change monitoring. Turn on Incremental mode to get only NEW, UPDATED, and REAPPEARED products on every scheduled run, or resume one specific interrupted run with resumeFromRunId.
  • Optional export to your apps. Send results into Notion, Linear, Airtable, or any Apify MCP connector alongside the dataset.

A note on specials: HORNBACH does not run a distinct "deals" or "clearance" collection the way some retailers do; its pricing model is everyday low prices rather than flash sales. There is no dedicated specials category to select, so this actor does not include one. The manufacturer's-price/discount field above still surfaces every individual product that happens to be marked down.

Data You Get

FieldExample value
productId / sku12314733
nameSample Cordless Drill Driver, incl. 2 batteries and charger
brandSample Tools Professional
urlhttps://www.hornbach.de/p/sample-product-name/12314733/
price / currency / priceUnit199.0, EUR, ST
originalPrice249.0
discountAmount / discountPercent50.0, 20.1
packPrice / packPriceUnit14.93, Pack
rating / reviewCount4.9, 11
badges["New in range"]
onlineAvailable / onlineAvailabilityTexttrue, Delivery in about 3 working days
storePickupAvailable / storeStockTexttrue, 20 pcs in stock at the store
onlineMerchant / storeMerchant{"name": "Sample Retailer", "isMarketplaceMerchant": false}
categoryPath[{"name": "Home", "url": "..."}, {"name": "Machines, Tools & Workshop", "url": "..."}]
ean4000000000000
specifications{"Drive type": "Battery", "Voltage": "18 V", "Weight incl. battery": "2.1 kg", ...}
images[{"url": "https://media.hornbach.de/...", "alt": "Sample product image"}]
variantGroupList[] (populated when the product offers colour/size variants)
datasheets[{"title": "Technical data sheet", "url": "https://..."}]
reviews.averageRating / reviews.totalReviewCount4.9, 11
reviews.ratingDistribution[{"rating": 5, "count": 10}, {"rating": 4, "count": 1}]
reviews.items[][{"rating": 5, "title": "Sample title", "body": "Sample review text.", "author": "Sample User", "date": "2026-05-01T00:00:00.000Z"}]
changeTypeNEW (incremental mode only — see "Resume & recurring updates" below)
changedFields["price", "onlineAvailabilityText"] (incremental mode, UPDATED rows only)
firstSeenAt2026-08-01T00:00:00Z (incremental mode only)
lastSeenAt2026-08-04T00:00:00Z (incremental mode only)

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

How to Use

Basic keyword search

{
"mode": "search",
"searchTerm": "akkuschrauber",
"maxItems": 20
}

Search narrowed by category, brand and price

{
"mode": "search",
"searchTerm": "akkuschrauber",
"category": "S1937",
"brands": ["Bosch Professional"],
"minPrice": 50,
"maxPrice": 250,
"sortBy": "PRICE_ASC",
"maxItems": 30
}

Category browse with full detail and review enrichment

{
"mode": "search",
"category": "S594",
"fetchDetails": true,
"fetchReviews": true,
"maxReviewsPerProduct": 0,
"maxItems": 50
}

Paste product, search, or category links

{
"mode": "url",
"urls": [
"https://www.hornbach.de/p/sample-product-name/12314733/",
"https://www.hornbach.de/s/fliesen/?page=1",
"https://www.hornbach.de/c/baustoffe/S594/"
],
"maxItems": 40
}

Continue a previous run, collecting only new products

{
"mode": "search",
"category": "S594",
"resumeFromRunId": "<a previous run id or dataset id>"
}

Resume & recurring updates

There are two different things here — pick the one that matches what you're doing:

NeedUse
A run stopped and should continueresumeFromRunId / automatic checkpoint recovery
Run the same search every day and receive only changesincrementalMode
Keep separate daily campaigns for similar searchesdistinct stateKey values
Run a normal full snapshotleave both off

Resume (resumeFromRunId) continues one specific interrupted or previous large run: paste a run ID or dataset ID and this run skips products already collected there, returning only the remaining new ones. An automatic same-run checkpoint also protects against platform migrations/resurrects without any input needed.

Incremental mode (incrementalMode) is for a schedule (for example, daily): the actor remembers the previous run of the same search by itself, so you never paste a run ID. The first run returns everything as NEW. Later runs return only NEW, UPDATED, and REAPPEARED products by default — duplicates and unchanged products are suppressed (and not charged). Turn on emitUnchanged or emitExpired only when you also want those rows returned (and billed for). State is isolated per search/category/URL, filter, and detail/review-mode setup automatically, so switching what you fetch never mixes with a previous baseline; set stateKey to name or deliberately share a monitoring campaign.

Scheduled-run example — same search, run daily:

Day 1 (first run ever for this search):

{ "mode": "search", "searchTerm": "akkuschrauber", "incrementalMode": true }

→ every product comes back with "changeType": "NEW".

Day 2 (the schedule fires again, identical input):

{ "mode": "search", "searchTerm": "akkuschrauber", "incrementalMode": true }

→ products whose price, availability, or other details changed come back as "changeType": "UPDATED" with changedFields listing what changed, brand-new products come back as "changeType": "NEW", products that vanished and came back come back as "changeType": "REAPPEARED" — and products that are still there, unchanged, are not returned at all (suppressed, not charged) unless emitUnchanged is on. Every field described in "Data You Get" above is considered when deciding whether a product changed, and every field is still returned on each row regardless.

Input Parameters

ParameterTypeDefaultDescription
modestringsearchsearch (keyword/category with filters) or url (paste links).
searchTermstring-Free-text keyword for search mode.
categorystring-A category id, e.g. S1937. Narrows a keyword search or browses a whole department alone.
brandsarray[]Only these brands. Applies in search mode, and in URL mode only when the pasted URL is a search-result link — a category or product URL ignores it.
sellersarray[]Only these named sellers.
minPrice / maxPriceinteger-Price range in EUR. Applies in search mode, and in URL mode only when the pasted URL is a search-result link — a category or product URL ignores it.
availabilitystring`` (any)IN_STOCK, ONLINE, RESERVABLE, or NEW.
sortBystringSCORESCORE, PRICE_ASC, PRICE_DESC, RATING_DESC, BRAND_ASC, BRAND_DESC, TITLE_ASC, TITLE_DESC. Applies in search mode, and in URL mode only when the pasted URL is a search-result link — a category or product URL ignores it.
urlsarraysample URLProduct, search, or category links for URL mode.
fetchDetailsbooleanfalseAdds full breadcrumb path, description, flattened specifications, EAN, media gallery, variant matrix, and safety hints.
fetchReviewsbooleantrueFetches each product's full review history.
maxReviewsPerProductinteger20Cap on reviews per product; 0 = all.
maxPagesinteger0Cap on 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.
maxItemsinteger20Cap on total products; 0 = unlimited.
resumeFromRunIdstring-Continue one specific previous run/dataset: products already saved there are skipped, so this run only returns new ones. For recurring daily monitoring of the same search, use incrementalMode instead — see "Resume & recurring updates" above.
incrementalModebooleanfalseDaily/recurring monitoring of this same search. First run returns everything as NEW; later runs return only NEW/UPDATED/REAPPEARED by default. See "Resume & recurring updates" above.
stateKeystring-Optional name for a monitoring campaign, so its incremental state stays stable or is deliberately shared. Auto-derived from your search/filter/detail settings when left empty.
emitUnchangedbooleanfalseIncremental mode only. Also return products unchanged since the last run, marked UNCHANGED. Adds and bills extra rows you already have.
emitExpiredbooleanfalseIncremental mode only. Also return products from a previous run no longer found, marked EXPIRED, once a run has fully scanned the search (not capped, not a resume). Adds and bills extra synthetic rows.
proxyobjectApify defaultConnection configuration.
mcpConnectorsarray[]Optional MCP connectors to also receive results.
notionParentPageUrlstring-Required only when a Notion connector is selected.
maxNotifyListingsinteger50Cap on items sent to each connector.

Output Example

{
"productId": "12314733",
"sku": "12314733",
"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.0,
"currency": "EUR",
"priceUnit": "ST",
"originalPrice": null,
"discountAmount": null,
"discountPercent": null,
"packPrice": null,
"packPriceUnit": null,
"badges": [],
"rating": 4.9,
"reviewCount": 11,
"onlineAvailable": true,
"onlineAvailabilityText": "Delivery in about 3 working days",
"storePickupAvailable": true,
"storeStockText": "20 pcs in stock at the store",
"onlineMerchant": { "name": "Sample Retailer", "isMarketplaceMerchant": false },
"categoryPath": [
{ "name": "Home", "url": "https://www.hornbach.de/" },
{ "name": "Machines, Tools & Workshop", "url": "https://www.hornbach.de/c/sample/S1937/" }
],
"ean": "4000000000000",
"specifications": {
"Item type": "Screwdriver",
"Drive type": "Battery",
"Voltage": "18 V",
"Weight incl. battery": "2.1 kg"
},
"images": [
{ "url": "https://media.hornbach.de/hb/packshot/sample.jpg", "alt": "Sample product image" }
],
"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 }
}
]
}
}

Send results into your apps (MCP connectors)

Optionally pipe results into an app you already use through a Model Context Protocol connector. Authorize a connector once under your account's Integrations settings, then select it in the input; for Notion, also set the parent page. Each connector receives a condensed, human-readable summary per item (a title plus key fields), not the full JSON record; the complete data always stays in the dataset.

A Note on Access

Running this actor requires an active account with default proxy access, which is included on every plan. No further configuration is needed for typical use.