# Bunnings Scraper (`cryptosignals/bunnings-scraper`) Actor

Scrape product data from Bunnings Warehouse (bunnings.com.au) — titles, prices, SKUs, brands, stock status, images and descriptions. Perfect for price monitoring, market research, affiliate feeds and supply chain intelligence across Australia and New Zealand's largest hardware retailer.

- **URL**: https://apify.com/cryptosignals/bunnings-scraper.md
- **Developed by:** [Web Data Labs](https://apify.com/cryptosignals) (community)
- **Categories:** E-commerce
- **Stats:** 9 total users, 2 monthly users, 100.0% runs succeeded, NaN bookmarks
- **User rating**: No ratings yet

## Pricing

from $50.00 / 1,000 results

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.

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

## Bunnings Scraper — Extract Product Data from bunnings.com.au

**Scrape product data from [Bunnings Warehouse](https://www.bunnings.com.au)**, Australia and New Zealand's largest hardware and home improvement retailer. This actor extracts **title, price, SKU, brand, stock status, images and descriptions** from Bunnings product pages and category/listing pages — no manual copy-paste, no fragile spreadsheets.

Running on the Apify platform gives you API access, scheduling, integrations (Google Sheets, Zapier, webhooks), automatic proxy rotation, and full run monitoring out of the box.

> 👉 **Try it free:** [Sign up for Apify](https://apify.com/sign-up?fpr=hustler) and get $5/month in free credits to run this scraper.

### What does Bunnings Scraper do?

Give it a list of Bunnings product URLs or category pages, and it returns clean structured JSON. Category pages are automatically crawled to collect every product link on the page, so you can scrape hundreds of drills, mowers, paints or screws with one input.

**Data fields extracted per product:**

| Field          | Type    | Description                                       |
|----------------|---------|---------------------------------------------------|
| `title`        | string  | Product name                                      |
| `price`        | number  | Numeric price                                     |
| `currency`     | string  | Currency code (AUD / NZD)                         |
| `sku`          | string  | Bunnings SKU / product ID                         |
| `brand`        | string  | Manufacturer brand                                |
| `stock_status` | string  | `in_stock`, `out_of_stock`, or marketplace status |
| `image_url`    | string  | Primary product image URL                         |
| `description`  | string  | Product description                               |
| `url`          | string  | Canonical product URL                             |
| `scraped_at`   | ISO8601 | Timestamp                                         |

### Why use Bunnings Scraper?

- **Price monitoring** — Track competitor prices for tools, building materials and outdoor products across ANZ.
- **Market research** — Analyze assortment, brand coverage and stock depth in hardware retail.
- **Affiliate & price comparison sites** — Build product feeds for niche comparison websites.
- **Dropshipping & resale research** — Find profitable products and margins.
- **Supply chain intelligence** — Monitor availability of specific SKUs.

### How to use Bunnings Scraper

1. Click **Try for free** and sign in to Apify (or create a free account).
2. Paste Bunnings URLs into the **Start URLs** field — product pages, category pages, or both.
3. Set **Maximum results** (default 100).
4. Click **Start**.
5. When the run finishes, download the data as JSON, CSV, Excel, HTML or XML from the **Storage** tab, or fetch it via the Apify API.

### Input

Configure the scraper in the **Input** tab:

```json
{
  "startUrls": [
    { "url": "https://www.bunnings.com.au/our-range/tools/power-tools/drills" },
    { "url": "https://www.bunnings.com.au/makita-18v-brushless-hammer-driver-drill-skin_p0158411" }
  ],
  "maxResults": 100,
  "requestDelayMs": 1500
}
````

- **startUrls** — array of Bunnings URLs. Product URLs match the `_p<id>` slug pattern; category URLs are auto-crawled.
- **maxResults** — cap on the number of products scraped (and paid events).
- **requestDelayMs** — delay between page loads (milliseconds). Default 1500ms is gentle on the target site.

### Output

You can download the dataset in various formats such as **JSON, HTML, CSV or Excel**. Example item:

```json
{
  "url": "https://www.bunnings.com.au/makita-18v-brushless-hammer-driver-drill-skin_p0158411",
  "title": "Makita 18V Brushless Hammer Driver Drill - Skin",
  "price": 199.00,
  "currency": "AUD",
  "sku": "0158411",
  "brand": "Makita",
  "stock_status": "in_stock",
  "image_url": "https://media.prod.bunnings.com.au/api/public/content/....jpg",
  "description": "The Makita 18V LXT Brushless Hammer Driver Drill features...",
  "scraped_at": "2026-04-13T03:12:45.123Z"
}
```

### Pricing — How much does it cost to scrape Bunnings?

This actor uses **Pay-Per-Event (PPE)** billing — you only pay for successfully scraped products:

- **$0.05 per scraped product** — no subscription, no compute-unit math.
- **100 products** ≈ **$5.00**.
- **1,000 products** ≈ **$50.00**.

Apify's free tier gives you $5/month of credits — enough to test the actor on your first ~100 products at no cost. Failed scrapes (e.g. Cloudflare challenges) are not charged.

### Tips and advanced options

- Start with specific category URLs (e.g. `/our-range/tools/power-tools/drills`) rather than broad top-level pages for best link harvesting.
- Combine the actor with Apify's **scheduler** to refresh prices daily or weekly.
- Export directly to Google Sheets with the Apify-Google Sheets integration.
- Use the Apify API to fetch results into your own systems:

```bash
curl "https://api.apify.com/v2/datasets/{DATASET_ID}/items?format=json"
```

### FAQ, disclaimers and support

**Is scraping Bunnings legal?** This actor only collects **publicly available** product information. You are responsible for ensuring your use complies with Bunnings' Terms of Service and your local laws. Do not use this actor to collect personal data, reproduce copyrighted content at scale, or cause disruption to the target site.

**What happens if Bunnings blocks the request?** Bunnings uses Cloudflare managed challenges. The actor uses Apify's proxy pool and a real browser to handle these; blocked requests are logged with `error: cloudflare_challenge` and **not charged**.

**Can I scrape bunnings.co.nz (New Zealand)?** The same URL pattern is supported; pass NZ URLs in `startUrls`.

**Need a custom version?** Report issues or request features via the **Issues** tab. Custom scrapers, integrations and enterprise support available on request.

### ⭐ Leave a Review

If this actor saved you time, a quick [review on the Apify Store](https://apify.com/cryptosignals/bunnings-scraper) helps other developers find it. Takes 30 seconds and means a lot.

# Actor input Schema

## `startUrls` (type: `array`):

List of Bunnings product URLs or category/listing URLs. Category pages are crawled to find product links. Product URLs must contain the \_p<id> slug pattern.

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

Maximum number of products to scrape. Each scraped product counts as one paid event.

## `requestDelayMs` (type: `integer`):

Delay between page loads in milliseconds. Higher values are gentler on the target site.

## Actor input object example

```json
{
  "startUrls": [
    {
      "url": "https://www.bunnings.com.au/makita-18v-brushless-hammer-driver-drill-skin_p0158411"
    },
    {
      "url": "https://www.bunnings.com.au/our-range/tools/power-tools/drills"
    }
  ],
  "maxResults": 100,
  "requestDelayMs": 1500
}
```

# 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 = {
    "startUrls": [
        {
            "url": "https://www.bunnings.com.au/makita-18v-brushless-hammer-driver-drill-skin_p0158411"
        },
        {
            "url": "https://www.bunnings.com.au/our-range/tools/power-tools/drills"
        }
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("cryptosignals/bunnings-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 = { "startUrls": [
        { "url": "https://www.bunnings.com.au/makita-18v-brushless-hammer-driver-drill-skin_p0158411" },
        { "url": "https://www.bunnings.com.au/our-range/tools/power-tools/drills" },
    ] }

# Run the Actor and wait for it to finish
run = client.actor("cryptosignals/bunnings-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 '{
  "startUrls": [
    {
      "url": "https://www.bunnings.com.au/makita-18v-brushless-hammer-driver-drill-skin_p0158411"
    },
    {
      "url": "https://www.bunnings.com.au/our-range/tools/power-tools/drills"
    }
  ]
}' |
apify call cryptosignals/bunnings-scraper --silent --output-dataset

```

## MCP server setup

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

```

## OpenAPI specification

```json
{
    "openapi": "3.0.1",
    "info": {
        "title": "Bunnings Scraper",
        "description": "Scrape product data from Bunnings Warehouse (bunnings.com.au) — titles, prices, SKUs, brands, stock status, images and descriptions. Perfect for price monitoring, market research, affiliate feeds and supply chain intelligence across Australia and New Zealand's largest hardware retailer.",
        "version": "1.0",
        "x-build-id": "rXO8dKfQNnI0EDv2M"
    },
    "servers": [
        {
            "url": "https://api.apify.com/v2"
        }
    ],
    "paths": {
        "/acts/cryptosignals~bunnings-scraper/run-sync-get-dataset-items": {
            "post": {
                "operationId": "run-sync-get-dataset-items-cryptosignals-bunnings-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/cryptosignals~bunnings-scraper/runs": {
            "post": {
                "operationId": "runs-sync-cryptosignals-bunnings-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/cryptosignals~bunnings-scraper/run-sync": {
            "post": {
                "operationId": "run-sync-cryptosignals-bunnings-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",
                "required": [
                    "startUrls"
                ],
                "properties": {
                    "startUrls": {
                        "title": "Start URLs",
                        "type": "array",
                        "description": "List of Bunnings product URLs or category/listing URLs. Category pages are crawled to find product links. Product URLs must contain the _p<id> slug pattern.",
                        "items": {
                            "type": "object",
                            "required": [
                                "url"
                            ],
                            "properties": {
                                "url": {
                                    "type": "string",
                                    "title": "URL of a web page",
                                    "format": "uri"
                                }
                            }
                        }
                    },
                    "maxResults": {
                        "title": "Maximum results",
                        "minimum": 1,
                        "maximum": 10000,
                        "type": "integer",
                        "description": "Maximum number of products to scrape. Each scraped product counts as one paid event.",
                        "default": 100
                    },
                    "requestDelayMs": {
                        "title": "Delay between requests (ms)",
                        "minimum": 500,
                        "maximum": 10000,
                        "type": "integer",
                        "description": "Delay between page loads in milliseconds. Higher values are gentler on the target site.",
                        "default": 1500
                    }
                }
            },
            "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
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }
}
```
