# Home Hardware Australia Product Scraper (`dromb/home-hardware-au-scraper`) Actor

Scrape products, categories and item details from Home Hardware Australia for price monitoring, product research, and market analysis.

- **URL**: https://apify.com/dromb/home-hardware-au-scraper.md
- **Developed by:** [Dmitriy Gyrbu](https://apify.com/dromb) (community)
- **Categories:** Automation, Developer tools, E-commerce
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $0.30 / 1,000 results

This Actor is paid per event and usage. You are charged both the fixed price for specific events and for Apify platform usage.

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

## What's an Apify Actor?

Actors are a software tools running on the Apify platform, for all kinds of web data extraction and automation use cases.
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.

In JavaScript/TypeScript projects, use official [JavaScript/TypeScript client](https://docs.apify.com/api/client/js.md):

```bash
npm install apify-client
```

In Python projects, use official [Python client library](https://docs.apify.com/api/client/python.md):

```bash
pip install apify-client
```

In shell scripts, use [Apify CLI](https://docs.apify.com/cli/docs.md):

````bash
# MacOS / Linux
curl -fsSL https://apify.com/install-cli.sh | bash
# Windows
irm https://apify.com/install-cli.ps1 | iex
```bash

In AI frameworks, you might use the [Apify MCP server](https://docs.apify.com/platform/integrations/mcp.md).

If your project is in a different language, use 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

## Home Hardware Australia Product Scraper

This Apify Actor allows you to scrape product data, categories, and detailed item information from Home Hardware Australia for price monitoring, product research, market research, availability tracking, and competitive analysis.

### Features

- **Product Search**: Search for products using keywords, sort options, and pagination.
- **Category Discovery**: List searchable categories from live Unbxd facets.
- **Filter Discovery**: Get supported sort options and live filter groups for search UIs.
- **Category Listings**: Return products filtered by a category name or slug.
- **Detailed Item Info**: Get full specifications, pricing, and availability for a single product by id, slug, or URL.
- **Connectivity Check**: Probe Home Hardware storefront and search backend availability.
- **Multi-Method HTTP Fallback**: Automatically tries multiple HTTP clients (httpx, cloudscraper, tls_client, curl_cffi) for maximum success rate.
- **Proxy Support**: Integrated Apify proxy support with country filtering (AU recommended).
- **User-Agent Randomization**: Random User-Agent selection for reduced detection risk.
- **Retry Logic**: Automatic retry with exponential backoff for blocked requests.
- **Standardized Infrastructure**: Built on shared apify-wave1 runtime for consistency across actors.

### Operation Guide

#### 1. Probe
Check connectivity to Home Hardware storefront and search backend.

#### 2. Categories
List all searchable category values from Unbxd facets. Use this to discover valid category names before calling the category operation.

#### 3. Search Filters
Get supported sort options and live filter groups for building faceted search UIs.

#### 4. Product Search
Provide a `Search Query` (e.g., "drill") to get a list of matching products. You can refine results using `Sort`, `Page`, and `Page Size`.

#### 5. Category Scraping
Provide a `Category Name` (e.g., "Tools" or "tools") to fetch all products in that category.

#### 6. Item Details
Provide an `Item ID`, `Slug`, or `URL` to get exhaustive details for a single item.

### Examples

You can copy and paste these JSON inputs into the Apify Actor's "JSON" editor for quick testing.

#### Probe Connectivity
```json
{
  "operation": "probe"
}
````

#### List Categories

```json
{
  "operation": "categories"
}
```

#### Get Search Filters

```json
{
  "operation": "search_filters"
}
```

#### Search for Drills

Returns a list of drill products sorted by relevance.

```json
{
  "operation": "search",
  "query": "drill",
  "page": 1,
  "page_size": 10,
  "sort": "relevance"
}
```

#### Search for Paint Sorted by Price

Returns paint products sorted by price ascending.

```json
{
  "operation": "search",
  "query": "paint",
  "page": 1,
  "page_size": 20,
  "sort": "price_asc"
}
```

#### Browse Tools Category

Returns products in the Tools category.

```json
{
  "operation": "category",
  "category_name": "Tools",
  "page": 1,
  "page_size": 10,
  "sort": "relevance"
}
```

#### Fetch Specific Product by ID

Gets full details for a product using its SKU.

```json
{
  "operation": "item",
  "item_id": "6172605"
}
```

#### Fetch Product by Slug

Gets full details using product slug.

```json
{
  "operation": "item",
  "slug": "makita-drill"
}
```

#### Fetch Product by URL

Gets full details using full product URL.

```json
{
  "operation": "item",
  "url": "https://www.homehardware.com.au/makita-drill"
}
```

### Input Fields

| Field | Required | Description | Example |
|---|---|---|---|
| `operation` | **Required** | Operation to perform: `probe`, `categories`, `search_filters`, `search`, `category`, or `item` | `search` |
| `query` | Optional | Text search query | `drill` |
| `category_name` | Optional | Category name or slug from `/categories` | `Tools` |
| `item_id` | Optional | SKU/unique id from search/category | `6172605` |
| `slug` | Optional | Product slug from search/category | `makita-drill` |
| `url` | Optional | Full product URL | `https://www.homehardware.com.au/makita-drill` |
| `page` | Optional | Page number | `1` |
| `page_size` | Optional | Number of products per page (max 100) | `24` |
| `sort` | Optional | Sort order (`relevance`, `price_asc`, `price_desc`) | `relevance` |
| `proxy` | Optional | Proxy mode (`direct`, `apify`, `custom`, `auto`) | `auto` |
| `customProxyUrl` | Optional | URL for custom proxy | `http://proxy.example.com:8080` |
| `proxyCountry` | Optional | Country for the proxy | `AU` |
| `includeRaw` | Optional | Include raw payload in summary | `false` |

### Output Fields

Each product item includes:

- `id`: Product SKU/unique ID.
- `slug`: Product URL slug.
- `name`: Product name.
- `brand`: Brand name.
- `barcode`: Product barcode/APN.
- `source_url`: URL to product page.
- `category`: Primary category.
- `breadcrumbs`: Full category hierarchy.
- `description`: Product description.
- `availability`: Availability status text.
- `in_stock`: Stock availability boolean.
- `price`: Current price.
- `discount_price`: Discounted price.
- `current_price`: Final price (discount or base).
- `images`: List of product image URLs.
- `price_info`: Detailed pricing information.
- `source`: Source identifier ("homehardware").

### Proxy & Bot Protection

Home Hardware AU uses Unbxd search API which is generally accessible without strict bot protection. We recommend:

- **Auto**: Automatically handles proxy selection (defaults to direct mode).
- **Direct**: Bypasses proxy (recommended for this source).
- **Custom**: Uses a provided custom proxy URL.
- **Apify**: Uses Apify proxy pool with country filtering.

The actor includes automatic retry logic with exponential backoff for blocked requests (403, 429, 502, 503) and invalid JSON responses.

### Pricing

- **Actor Start**: $0.005 per run
- **Dataset Item**: $0.0004 per item

Free/trial users are limited to 20 result requests per day.

### Limitations

- This scraper is unofficial and not affiliated with Home Hardware.
- Home Hardware may change their API structure without notice.
- Some products may have incomplete data depending on source availability.
- Category names may change over time; use the categories endpoint to discover current names.
- High-volume scraping may trigger rate limiting or blocking.

### Disclaimer

This scraper is unofficial and not affiliated with Home Hardware. Users are responsible for complying with Home Hardware's terms of service and applicable laws.

# Actor input Schema

## `operation` (type: `string`):

Operation to perform: probe, categories, search\_filters, search, category, or item.

## `query` (type: `string`):

Free-text query (e.g., 'drill' or 'paint') for searching products.

## `category_name` (type: `string`):

Category name or slug from /categories to filter results.

## `item_id` (type: `string`):

SKU/unique id from search/category for fetching a single item.

## `slug` (type: `string`):

Product slug from search/category for fetching a single item.

## `url` (type: `string`):

Full product URL for fetching a single item.

## `page` (type: `integer`):

Page number for pagination.

## `page_size` (type: `integer`):

Number of products per page. Maximum 100.

## `sort` (type: `string`):

Sort order: relevance, price\_asc, price\_desc.

## `proxy` (type: `string`):

Proxy configuration: 'direct', 'apify', 'custom', or 'auto'.

## `customProxyUrl` (type: `string`):

URL for custom proxy if 'custom' is selected.

## `proxyCountry` (type: `string`):

Country for the proxy (e.g., 'AU').

## `includeRaw` (type: `boolean`):

When true, return raw payload in summary.

## Actor input object example

```json
{
  "operation": "search",
  "page": 1,
  "page_size": 24,
  "sort": "relevance",
  "proxy": "auto",
  "proxyCountry": "AU",
  "includeRaw": false
}
```

# 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 = {};

// Run the Actor and wait for it to finish
const run = await client.actor("dromb/home-hardware-au-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 = {}

# Run the Actor and wait for it to finish
run = client.actor("dromb/home-hardware-au-scraper").call(run_input=run_input)

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

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

```

## CLI example

```bash
echo '{}' |
apify call dromb/home-hardware-au-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "command": "npx",
            "args": [
                "mcp-remote",
                "https://mcp.apify.com/?tools=dromb/home-hardware-au-scraper",
                "--header",
                "Authorization: Bearer <YOUR_API_TOKEN>"
            ]
        }
    }
}

```

## OpenAPI specification

```json
{
    "openapi": "3.0.1",
    "info": {
        "title": "Home Hardware Australia Product Scraper",
        "description": "Scrape products, categories and item details from Home Hardware Australia for price monitoring, product research, and market analysis.",
        "version": "0.1",
        "x-build-id": "b09D5pjajIsLzaC6G"
    },
    "servers": [
        {
            "url": "https://api.apify.com/v2"
        }
    ],
    "paths": {
        "/acts/dromb~home-hardware-au-scraper/run-sync-get-dataset-items": {
            "post": {
                "operationId": "run-sync-get-dataset-items-dromb-home-hardware-au-scraper",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor, waits for its completion, and returns Actor's dataset items in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK"
                    }
                }
            }
        },
        "/acts/dromb~home-hardware-au-scraper/runs": {
            "post": {
                "operationId": "runs-sync-dromb-home-hardware-au-scraper",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor and returns information about the initiated run in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/runsResponseSchema"
                                }
                            }
                        }
                    }
                }
            }
        },
        "/acts/dromb~home-hardware-au-scraper/run-sync": {
            "post": {
                "operationId": "run-sync-dromb-home-hardware-au-scraper",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor, waits for completion, and returns the OUTPUT from Key-value store in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK"
                    }
                }
            }
        }
    },
    "components": {
        "schemas": {
            "inputSchema": {
                "type": "object",
                "properties": {
                    "operation": {
                        "title": "Operation",
                        "enum": [
                            "probe",
                            "categories",
                            "search_filters",
                            "search",
                            "category",
                            "item"
                        ],
                        "type": "string",
                        "description": "Operation to perform: probe, categories, search_filters, search, category, or item.",
                        "default": "search"
                    },
                    "query": {
                        "title": "Search Query",
                        "type": "string",
                        "description": "Free-text query (e.g., 'drill' or 'paint') for searching products."
                    },
                    "category_name": {
                        "title": "Category Name",
                        "type": "string",
                        "description": "Category name or slug from /categories to filter results."
                    },
                    "item_id": {
                        "title": "Item ID",
                        "type": "string",
                        "description": "SKU/unique id from search/category for fetching a single item."
                    },
                    "slug": {
                        "title": "Slug",
                        "type": "string",
                        "description": "Product slug from search/category for fetching a single item."
                    },
                    "url": {
                        "title": "URL",
                        "type": "string",
                        "description": "Full product URL for fetching a single item."
                    },
                    "page": {
                        "title": "Page",
                        "type": "integer",
                        "description": "Page number for pagination.",
                        "default": 1
                    },
                    "page_size": {
                        "title": "Page Size",
                        "type": "integer",
                        "description": "Number of products per page. Maximum 100.",
                        "default": 24
                    },
                    "sort": {
                        "title": "Sort",
                        "enum": [
                            "relevance",
                            "price_asc",
                            "price_desc"
                        ],
                        "type": "string",
                        "description": "Sort order: relevance, price_asc, price_desc.",
                        "default": "relevance"
                    },
                    "proxy": {
                        "title": "Proxy Configuration",
                        "enum": [
                            "direct",
                            "apify",
                            "custom",
                            "auto"
                        ],
                        "type": "string",
                        "description": "Proxy configuration: 'direct', 'apify', 'custom', or 'auto'.",
                        "default": "auto"
                    },
                    "customProxyUrl": {
                        "title": "Custom Proxy URL",
                        "type": "string",
                        "description": "URL for custom proxy if 'custom' is selected."
                    },
                    "proxyCountry": {
                        "title": "Proxy Country",
                        "type": "string",
                        "description": "Country for the proxy (e.g., 'AU').",
                        "default": "AU"
                    },
                    "includeRaw": {
                        "title": "Include Raw",
                        "type": "boolean",
                        "description": "When true, return raw payload in summary.",
                        "default": false
                    }
                }
            },
            "runsResponseSchema": {
                "type": "object",
                "properties": {
                    "data": {
                        "type": "object",
                        "properties": {
                            "id": {
                                "type": "string"
                            },
                            "actId": {
                                "type": "string"
                            },
                            "userId": {
                                "type": "string"
                            },
                            "startedAt": {
                                "type": "string",
                                "format": "date-time",
                                "example": "2025-01-08T00:00:00.000Z"
                            },
                            "finishedAt": {
                                "type": "string",
                                "format": "date-time",
                                "example": "2025-01-08T00:00:00.000Z"
                            },
                            "status": {
                                "type": "string",
                                "example": "READY"
                            },
                            "meta": {
                                "type": "object",
                                "properties": {
                                    "origin": {
                                        "type": "string",
                                        "example": "API"
                                    },
                                    "userAgent": {
                                        "type": "string"
                                    }
                                }
                            },
                            "stats": {
                                "type": "object",
                                "properties": {
                                    "inputBodyLen": {
                                        "type": "integer",
                                        "example": 2000
                                    },
                                    "rebootCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "restartCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "resurrectCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "computeUnits": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            },
                            "options": {
                                "type": "object",
                                "properties": {
                                    "build": {
                                        "type": "string",
                                        "example": "latest"
                                    },
                                    "timeoutSecs": {
                                        "type": "integer",
                                        "example": 300
                                    },
                                    "memoryMbytes": {
                                        "type": "integer",
                                        "example": 1024
                                    },
                                    "diskMbytes": {
                                        "type": "integer",
                                        "example": 2048
                                    }
                                }
                            },
                            "buildId": {
                                "type": "string"
                            },
                            "defaultKeyValueStoreId": {
                                "type": "string"
                            },
                            "defaultDatasetId": {
                                "type": "string"
                            },
                            "defaultRequestQueueId": {
                                "type": "string"
                            },
                            "buildNumber": {
                                "type": "string",
                                "example": "1.0.0"
                            },
                            "containerUrl": {
                                "type": "string"
                            },
                            "usage": {
                                "type": "object",
                                "properties": {
                                    "ACTOR_COMPUTE_UNITS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_WRITES": {
                                        "type": "integer",
                                        "example": 1
                                    },
                                    "KEY_VALUE_STORE_LISTS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_INTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_EXTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_SERPS": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            },
                            "usageTotalUsd": {
                                "type": "number",
                                "example": 0.00005
                            },
                            "usageUsd": {
                                "type": "object",
                                "properties": {
                                    "ACTOR_COMPUTE_UNITS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_WRITES": {
                                        "type": "number",
                                        "example": 0.00005
                                    },
                                    "KEY_VALUE_STORE_LISTS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_INTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_EXTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_SERPS": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }
}
```
