HORNBACH Products, Prices & Reviews Scraper
Pricing
from $1.00 / 1,000 product results
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
Maintained by CommunityActor stats
0
Bookmarked
1
Total users
1
Monthly active users
10 days ago
Last modified
Categories
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
| Field | Example value |
|---|---|
| productId / sku | 12314733 |
| name | Sample Cordless Drill Driver, incl. 2 batteries and charger |
| brand | Sample Tools Professional |
| url | https://www.hornbach.de/p/sample-product-name/12314733/ |
| price / currency / priceUnit | 199.0, EUR, ST |
| originalPrice | 249.0 |
| discountAmount / discountPercent | 50.0, 20.1 |
| packPrice / packPriceUnit | 14.93, Pack |
| rating / reviewCount | 4.9, 11 |
| badges | ["New in range"] |
| onlineAvailable / onlineAvailabilityText | true, Delivery in about 3 working days |
| storePickupAvailable / storeStockText | true, 20 pcs in stock at the store |
| onlineMerchant / storeMerchant | {"name": "Sample Retailer", "isMarketplaceMerchant": false} |
| categoryPath | [{"name": "Home", "url": "..."}, {"name": "Machines, Tools & Workshop", "url": "..."}] |
| ean | 4000000000000 |
| 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.totalReviewCount | 4.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"}] |
| changeType | NEW (incremental mode only — see "Resume & recurring updates" below) |
| changedFields | ["price", "onlineAvailabilityText"] (incremental mode, UPDATED rows only) |
| firstSeenAt | 2026-08-01T00:00:00Z (incremental mode only) |
| lastSeenAt | 2026-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:
| Need | Use |
|---|---|
| A run stopped and should continue | resumeFromRunId / automatic checkpoint recovery |
| 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 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
| Parameter | Type | Default | Description |
|---|---|---|---|
mode | string | search | search (keyword/category with filters) or url (paste links). |
searchTerm | string | - | Free-text keyword for search mode. |
category | string | - | A category id, e.g. S1937. Narrows a keyword search or browses a whole department alone. |
brands | array | [] | 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. |
sellers | array | [] | Only these named sellers. |
minPrice / maxPrice | integer | - | 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. |
availability | string | `` (any) | IN_STOCK, ONLINE, RESERVABLE, or NEW. |
sortBy | string | SCORE | SCORE, 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. |
urls | array | sample URL | Product, search, or category links for URL mode. |
fetchDetails | boolean | false | Adds full breadcrumb path, description, flattened specifications, EAN, media gallery, variant matrix, and safety hints. |
fetchReviews | boolean | true | Fetches each product's full review history. |
maxReviewsPerProduct | integer | 20 | Cap on reviews per product; 0 = all. |
maxPages | integer | 0 | Cap 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. |
maxItems | integer | 20 | Cap on total products; 0 = unlimited. |
resumeFromRunId | string | - | 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. |
incrementalMode | boolean | false | Daily/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. |
stateKey | string | - | 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. |
emitUnchanged | boolean | false | Incremental mode only. Also return products unchanged since the last run, marked UNCHANGED. Adds and bills extra rows you already have. |
emitExpired | boolean | false | Incremental 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. |
proxy | object | Apify default | Connection configuration. |
mcpConnectors | array | [] | Optional MCP connectors to also receive results. |
notionParentPageUrl | string | - | Required only when a Notion connector is selected. |
maxNotifyListings | integer | 50 | Cap 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.