# Hornbach Austria Scraper — DIY Products, Tools & Prices (`studio-amba/hornbach-at-scraper`) Actor

Scrapes products from Hornbach.at with prices, ratings, stock info and specs. Supports search queries and category URLs.

- **URL**: https://apify.com/studio-amba/hornbach-at-scraper.md
- **Developed by:** [Studio Amba](https://apify.com/studio-amba) (community)
- **Categories:** E-commerce
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $1.20 / 1,000 result scrapeds

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.
Since this Actor supports Apify Store discounts, the price gets lower the higher subscription plan you have.

Learn more: https://docs.apify.com/actors/running/actors-in-store.md#pay-per-event

## What's an Apify Actor?

Actors are web data automations that power AI and operations. They run on the Apify platform to scrape websites, process data, connect APIs, and automate workflows.
In Batch mode, an Actor accepts a well-defined JSON input, performs an action which can take anything from a few seconds to a few hours,
and optionally produces a well-defined JSON output, datasets with results, or files in key-value store.
In Standby mode, an Actor provides a web server which can be used as a website, API, or an MCP server.
Actors are written with capital "A".

## How to integrate an Actor?

If asked about integration, you help developers integrate Actors into their projects.
You adapt to their stack and deliver integrations that are safe, well-documented, and production-ready.
The best way to integrate Actors is as follows.

- **AI agents and MCP clients** — the [Apify MCP server](https://docs.apify.com/integrations/mcp.md) at `https://mcp.apify.com` (remote, streamable HTTP, OAuth on first use).
- **Agentic workflows and local Actor development** — [Agent Skills](https://apify.com/.well-known/agent-skills/index.json) with the [Apify CLI](https://docs.apify.com/cli/docs.md): `npm install -g apify-cli`, then `apify login`.
- **JavaScript/TypeScript projects** — the official [JS/TS client](https://docs.apify.com/api/client/js/docs.md): `npm install apify-client`.
- **Python projects** — the official [Python client](https://docs.apify.com/api/client/python/docs.md): `pip install apify-client`.
- **Any other language** — the [REST API](https://docs.apify.com/api/v2.md).

For usage examples, see the [API](#api) section below.

For more details, see Apify documentation as [Markdown index](https://docs.apify.com/llms.txt) and [Markdown full-text](https://docs.apify.com/llms-full.txt).

# README

## Hornbach Austria Scraper -- Austria's DIY Megastore for Project Builders

Scrape products, prices, ratings, stock status, and SKU data from hornbach.at -- Hornbach's Austrian storefront, built for serious renovation projects and professional contracting. Extracts data from Hornbach's Apollo/GraphQL state for fast, reliable results.

### What is Hornbach Austria Scraper?

Hornbach is not your average neighborhood hardware store. It's a warehouse-format DIY chain with massive stores designed for customers tackling serious renovation projects, new builds, and professional contracting work. Hornbach operates dozens of stores across Austria, alongside its wider European network, and is a go-to for bulk materials, professional-grade tools, and project-scale quantities.

Hornbach.at uses the same modern React frontend with Apollo GraphQL state management as the rest of the Hornbach group. This scraper extracts product data directly from the server-rendered Apollo state embedded in the HTML, giving fast and reliable results without needing to parse fragile DOM markup.

- **Professional contractor price benchmarking** -- Compare Hornbach Austria's project-scale pricing on building materials, lumber, concrete, and insulation against Bauhaus, OBI, and local wholesale suppliers
- **Bulk material cost tracking** -- Monitor prices on high-volume items like wood planks, tiles, screws by the thousand, and bulk paint to optimize procurement timing
- **Power tool competitive analysis** -- Track how Hornbach Austria prices professional-grade power tools from Makita, DeWalt, Bosch Professional, Metabo, and Milwaukee
- **Garden and outdoor project planning** -- Extract pricing data for garden sheds, terrace materials, fencing, and outdoor equipment for project budgeting
- **Austrian DIY market research** -- Track pricing and assortment trends specific to the Austrian market

### What data does Hornbach Austria Scraper extract?

- Product name -- Full German-language product title
- Price & discounts -- Current price, original/strike-through price when discounted
- Brand -- Manufacturer name (Makita, DeWalt, Bosch Professional, HORNBACH, etc.)
- Stock availability -- Online availability status
- Ratings & reviews -- Average rating and review count
- Product image -- Main product image URL
- Product URL -- Direct link on hornbach.at
- SKU / Article number -- Hornbach's internal article number for reference and reordering

### How to scrape Hornbach Austria data

| Field | Type | Description |
|-------|------|--------------|
| `searchQuery` | String | Search by keyword -- e.g., `"bohrmaschine"`, `"schrauben"`, `"gartenmoebel"`, `"holz"` |
| `categoryUrl` | String | Direct category URL -- e.g., `https://www.hornbach.at/shop/Maschinen/Bohrer-Schrauber/Bohrhammer-Meisselhammer/S3309/artikelliste.html` |
| `maxResults` | Integer | Maximum products to scrape (default: 100, set to 0 for unlimited) |
| `proxyConfiguration` | Object | Apify proxy recommended for reliability |

**Tips:**

- `categoryUrl` overrides `searchQuery` if both are provided
- The search URL pattern is `https://www.hornbach.at/s/{query}/`
- Category URLs use the pattern `/shop/{Category-path}/S{id}/artikelliste.html`
- Set `maxResults` to 0 to scrape everything the query or category returns
- Apify proxy is enabled by default; residential proxies may be needed if you encounter blocks

### Output

```json
{
    "name": "Bohrmaschine Makita 6413 450 W 230 V",
    "brand": "Makita",
    "price": 129.00,
    "currency": "EUR",
    "url": "https://www.hornbach.at/p/bohrmaschine-makita-6413-450-w-230-v/6198030/",
    "scrapedAt": "2026-08-27T14:00:00.000Z",
    "originalPrice": 149.00,
    "imageUrl": "https://media.hornbach.at/hb/packshot/as.46702632.jpg",
    "rating": 4.6,
    "reviewCount": 58,
    "sku": "6198030",
    "inStock": true
}
```

A building materials example:

```json
{
    "name": "Konstruktionsvollholz NSi 60 x 80 x 3000 mm Fichte/Tanne",
    "brand": "HORNBACH",
    "price": 9.45,
    "currency": "EUR",
    "url": "https://www.hornbach.at/p/konstruktionsvollholz-nsi-60x80x3000-fichte/5432109/",
    "scrapedAt": "2026-08-27T14:00:00.000Z",
    "imageUrl": "https://media.hornbach.at/hb/packshot/as.54321090.jpg",
    "rating": 4.5,
    "reviewCount": 31,
    "sku": "5432109",
    "inStock": true
}
```

### How much does it cost?

Hornbach Austria Scraper uses direct HTTP requests with Apollo state extraction -- no browser overhead.

| Scenario | Products | Est. cost |
|----------|----------|-----------|
| Quick search | 100 | ~$0.15 |
| Category deep dive | 500 | ~$0.50 |
| Department inventory | 1,000 | ~$0.90 |
| Full catalog section | 5,000 | ~$3.50 |

Proxy costs may apply depending on your Apify plan and proxy configuration.

### Can I integrate?

- **JSON, CSV, Excel** -- Direct dataset download
- **Google Sheets** -- Auto-sync via Apify integration
- **Webhooks** -- Trigger your pipeline on completion
- **API** -- Programmatic access (see below)
- **Zapier / Make** -- 5,000+ app integrations
- **Amazon S3, Google Cloud Storage** -- Cloud storage push

### Can I use it as an API?

**Python:**

```python
from apify_client import ApifyClient

client = ApifyClient("YOUR_API_TOKEN")

run = client.actor("studio-amba/hornbach-at-scraper").call(run_input={
    "searchQuery": "holz",
    "maxResults": 200,
    "proxyConfiguration": {"useApifyProxy": True}
})

for item in client.dataset(run["defaultDatasetId"]).iterate_items():
    print(f"{item['name']} - EUR {item['price']}")
```

**JavaScript:**

```javascript
import { ApifyClient } from 'apify-client';

const client = new ApifyClient({ token: 'YOUR_API_TOKEN' });

const run = await client.actor('studio-amba/hornbach-at-scraper').call({
    searchQuery: 'holz',
    maxResults: 200,
    proxyConfiguration: { useApifyProxy: true },
});

const { items } = await client.dataset(run.defaultDatasetId).listItems();
console.log(items);
```

### FAQ

**Does this work for Hornbach in other countries?**
This scraper targets hornbach.at (Austria) specifically. Hornbach operates a separate website per country (Germany, Netherlands, Sweden, Czech Republic, Romania, Switzerland, and more), each with its own catalogue, pricing, and category IDs. For hornbach.de, see the [Hornbach Scraper](https://apify.com/studio-amba/hornbach-scraper).

**Why does Hornbach matter for professional contractors in Austria?**
Hornbach's warehouse format is specifically designed for project builders. Stores carry professional-grade materials in bulk quantities, offer contractor accounts, and provide services like wood cutting and delivery for large orders. Pricing on volume materials (lumber, tiles, concrete) is often more competitive than smaller-format DIY stores.

**How does the Apollo state extraction work?**
Hornbach's website server-renders product listings using React with Apollo Client. The full Apollo state (including product data, prices, ratings) is embedded in the HTML as `window.__APOLLO_STATE__`. The scraper parses this JSON directly, which is faster and more reliable than scraping HTML elements.

**What if the Apollo state is not found?**
The scraper includes an HTML fallback parser that extracts product data from DOM elements (product tiles, price elements, brand labels). This covers cases where Hornbach changes their rendering approach.

**Can I track Hornbach Austria's weekly promotions?**
Yes. Products with active promotions will show both `price` (current) and `originalPrice` (before discount). Schedule the actor to run weekly to track promotional patterns over time.

**How large is Hornbach Austria's online catalog?**
Individual categories can range from a few dozen products (specialist tool categories) to several hundred for broad search terms like "bohrmaschine". Set `maxResults` based on the scope of your query.

### Limitations

- Targets hornbach.at (Austria) only -- category IDs and the catalogue differ from hornbach.de and other country storefronts
- Data is extracted from listing-level Apollo state, so detailed specs and descriptions are not included (these would require visiting individual product pages)
- If Hornbach changes their Apollo state structure or switches rendering approaches, extraction may be temporarily affected
- Pagination stops when fewer than 20 products are found on a page (heuristic for detecting the last page)
- Some product categories may require Apify residential proxies if datacenter IPs are blocked

### Other DIY & home improvement scrapers

Compare Hornbach Austria with other European DIY retailers:

- **[Hornbach Scraper](https://apify.com/studio-amba/hornbach-scraper)** -- Germany, same Hornbach group
- **[OBI Scraper](https://apify.com/studio-amba/obi-scraper)** -- Germany's #1 DIY chain by store count
- **[Bauhaus Scraper](https://apify.com/studio-amba/bauhaus-scraper)** -- German/EU professional hardware & DIY
- **[Toom Scraper](https://apify.com/studio-amba/toom-scraper)** -- Germany, REWE group DIY chain
- **[GAMMA Scraper](https://apify.com/studio-amba/gamma-scraper)** -- Belgium, Intergamma group
- **[Brico Scraper](https://apify.com/studio-amba/brico-scraper)** -- Belgium's largest DIY chain
- **[Hubo Scraper](https://apify.com/studio-amba/hubo-scraper)** -- Belgian neighborhood DIY
- **[Praxis Scraper](https://apify.com/studio-amba/praxis-scraper)** -- Netherlands, Maxeda DIY Group
- **[Leroy Merlin Scraper](https://apify.com/studio-amba/leroymerlin-scraper)** -- France's #1 DIY retailer
- **[Castorama Scraper](https://apify.com/studio-amba/castorama-scraper)** -- France, Kingfisher group

### Your feedback

Found a bug? Need additional data fields? Questions about Hornbach Austria's data structure? Open an issue on the actor's page or reach out through Apify.

# Actor input Schema

## `searchQuery` (type: `string`):

Search term to look up on Hornbach.at (e.g., 'bohrmaschine', 'schrauben', 'gartenmöbel')

## `categoryUrl` (type: `string`):

Direct URL to a Hornbach.at category or search results page. Overrides searchQuery if both are provided.

## `maxResults` (type: `integer`):

Maximum number of products to scrape. Set to 0 for unlimited.

## `proxyConfiguration` (type: `object`):

Apify proxy settings. Use Apify residential proxies if you get blocked.

## `brightDataApiKey` (type: `string`):

Optional: your own Bright Data API key for the Web Unlocker zone. Used as a fallback when Hornbach's anti-bot challenge blocks residential proxies. If not set, the actor uses its built-in key.

## Actor input object example

```json
{
  "searchQuery": "bohrmaschine",
  "categoryUrl": "https://www.hornbach.at/shop/Maschinen/Bohrer-Schrauber/Bohrhammer-Meisselhammer/S3309/artikelliste.html",
  "maxResults": 100,
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ],
    "apifyProxyCountry": "AT"
  }
}
```

# Actor output Schema

## `results` (type: `string`):

No description

# API

You can run this Actor programmatically using our API. Below are code examples in JavaScript, Python, and CLI, as well as the OpenAPI specification and MCP server setup.

## JavaScript example

```javascript
import { ApifyClient } from 'apify-client';

// Initialize the ApifyClient with your Apify API token
// Replace the '<YOUR_API_TOKEN>' with your token
const client = new ApifyClient({
    token: '<YOUR_API_TOKEN>',
});

// Prepare Actor input
const input = {
    "searchQuery": "bohrmaschine",
    "proxyConfiguration": {
        "useApifyProxy": true,
        "apifyProxyGroups": [
            "RESIDENTIAL"
        ],
        "apifyProxyCountry": "AT"
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("studio-amba/hornbach-at-scraper").call(input);

// Fetch and print Actor results from the run's dataset (if any)
console.log('Results from dataset');
console.log(`💾 Check your data here: https://console.apify.com/storage/datasets/${run.defaultDatasetId}`);
const { items } = await client.dataset(run.defaultDatasetId).listItems();
items.forEach((item) => {
    console.dir(item);
});

// 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/js/docs

```

## Python example

```python
from apify_client import ApifyClient

# Initialize the ApifyClient with your Apify API token
# Replace '<YOUR_API_TOKEN>' with your token.
client = ApifyClient("<YOUR_API_TOKEN>")

# Prepare the Actor input
run_input = {
    "searchQuery": "bohrmaschine",
    "proxyConfiguration": {
        "useApifyProxy": True,
        "apifyProxyGroups": ["RESIDENTIAL"],
        "apifyProxyCountry": "AT",
    },
}

# Run the Actor and wait for it to finish
run = client.actor("studio-amba/hornbach-at-scraper").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print(f"💾 Check your data here: https://console.apify.com/storage/datasets/{run.default_dataset_id}")
for item in client.dataset(run.default_dataset_id).iterate_items():
    print(item)

# 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/python/docs/quick-start

```

## CLI example

```bash
echo '{
  "searchQuery": "bohrmaschine",
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ],
    "apifyProxyCountry": "AT"
  }
}' |
apify call studio-amba/hornbach-at-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,studio-amba/hornbach-at-scraper"
        }
    }
}

```

The hosted server signs you in with OAuth on first connect, so no API token belongs in this config. Clients without OAuth support can send an `Authorization: Bearer <APIFY_API_TOKEN>` header instead, using a token from API & Integrations in Apify Console (https://console.apify.com/settings/integrations).

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/actors/kBuWQ6PeAi6Y5cCrE/builds/1jgUn6L0LIo2H2U4j/openapi.json
