# 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:** 32 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $100.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/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

## 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/%7BDATASET_ID%7D/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.

# 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. Set to 0 for unlimited — the Actor keeps paginating category listings until the source is exhausted. If omitted, paid runs default to 1000 (bounded by your maxTotalChargeUsd budget). Runs on the Apify free plan are capped at 10 results. Each scraped product counts as one paid event; failed, blocked or out-of-stock-404 pages are never charged.

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

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

## `useResidentialProxy` (type: `boolean`):

Use Australian residential proxies (required to get past Bunnings' Cloudflare protection — datacenter proxies are blocked with HTTP 403). If residential proxies are unavailable on the account, the Actor falls back to datacenter automatically instead of running without a proxy.

## Actor input object example

```json
{
  "startUrls": [
    {
      "url": "https://www.bunnings.com.au/ozito-710w-hammer-drill_p0299328"
    },
    {
      "url": "https://www.bunnings.com.au/our-range/tools/power-tools/drills"
    }
  ],
  "maxResults": 3,
  "requestDelayMs": 500,
  "useResidentialProxy": true
}
```

# 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/ozito-710w-hammer-drill_p0299328"
        },
        {
            "url": "https://www.bunnings.com.au/our-range/tools/power-tools/drills"
        }
    ],
    "maxResults": 3,
    "requestDelayMs": 500
};

// 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/ozito-710w-hammer-drill_p0299328" },
        { "url": "https://www.bunnings.com.au/our-range/tools/power-tools/drills" },
    ],
    "maxResults": 3,
    "requestDelayMs": 500,
}

# 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(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 '{
  "startUrls": [
    {
      "url": "https://www.bunnings.com.au/ozito-710w-hammer-drill_p0299328"
    },
    {
      "url": "https://www.bunnings.com.au/our-range/tools/power-tools/drills"
    }
  ],
  "maxResults": 3,
  "requestDelayMs": 500
}' |
apify call cryptosignals/bunnings-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,cryptosignals/bunnings-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/Zqd50WC6LhTsWghYa/builds/CRZkokGaLtifrhite/openapi.json
