# Hubo Scraper — Belgian DIY & Hardware Products & Prices (`studio-amba/hubo-scraper`) Actor

Scrape products from Hubo.be via their Algolia search API. Belgian DIY and home improvement chain — tools, hardware, paint, and garden supplies.

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

## Pricing

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

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

## What's an Apify Actor?

An Actor is a serverless cloud program that runs on the Apify platform. It has two run modes.
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.

Apify vocabulary and the platform model are defined once, in the agent quickstart at https://apify.com/agents.md.

## 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.

Do not guess an integration path. Every one of them is in the agent quickstart at https://apify.com/agents.md: the Apify MCP server, Agent Skills with the Apify CLI, the JavaScript and Python clients, the REST API, and the account-free path for an agent with no human to sign in. It also carries the rule on stating cost before the first paid run.

For examples already wired to this Actor's own input schema, see the [API](#api) section below.

Each client library has reference documentation the quickstart does not restate: [JavaScript/TypeScript](https://docs.apify.com/api/client/js/docs.md) (`npm install apify-client`) and [Python](https://docs.apify.com/api/client/python/docs.md) (`pip install apify-client`).

# README

## Hubo Scraper -- Belgian Neighborhood DIY & Home Improvement

Scrape products, prices, specs, ratings, and availability from hubo.be -- Belgium's neighborhood DIY retailer with 150+ conveniently located stores. Supports search and category browsing with bilingual output (Dutch/French). Uses Hubo's Algolia-powered API for fast extraction.

### What is Hubo Scraper?

Hubo fills a unique niche in the Belgian DIY market: the neighborhood hardware store. While Brico and GAMMA compete with large-format warehouse stores, Hubo operates 150+ smaller, conveniently located shops across Belgium and Luxembourg. This makes Hubo the retailer Belgian consumers visit for quick fixes, everyday tools, paint, and garden essentials -- the kind of store you pop into on a Saturday morning before tackling a weekend project.

Despite its smaller store format, Hubo's online catalog is substantial. This scraper uses Hubo's custom search API (powered by Algolia) for fast, structured data extraction. It also supports HTML scraping of category pages for broader catalog discovery, with automatic subcategory traversal.

- **Belgian neighborhood retail pricing** -- Track Hubo's pricing strategy in the convenience DIY segment, where prices may differ from large-format competitors due to the neighborhood store model
- **Belgian DIY market triangulation** -- Combine Hubo data with Brico and GAMMA for a complete view of the three major Belgian DIY chains, each with a different store format and pricing approach
- **Private-label product analysis** -- Hubo carries its own private-label products alongside branded items; compare private-label pricing against national brands
- **Local market availability research** -- Monitor which products Hubo stocks to understand the convenience DIY assortment that reaches Belgian neighborhoods
- **Garden and seasonal product tracking** -- Hubo's garden, barbecue, and seasonal departments are a significant part of its business; track seasonal pricing cycles and product availability

### What data does Hubo Scraper extract?

- 🔨 **Product name** -- Full product title in Dutch or French
- 💰 **Price & promotions** -- Current price and strikethrough/original price when on sale
- 🏷️ **Brand** -- Manufacturer name
- 📦 **Stock & delivery** -- Availability based on delivery type options
- ⭐ **Ratings & reviews** -- Average customer rating and total review count
- 🖼️ **Product images** -- Primary image and full image gallery URLs
- 📐 **Technical specifications** -- Product features and attributes (dimensions, materials, performance data)
- 📋 **Product description** -- Full text description (HTML stripped)
- 🔗 **Product URL** -- Direct link on hubo.be
- 📂 **Category path** -- Category name and category page IDs
- 🏗️ **Product identifiers** -- EAN barcode, SKU, product ID
- 🌐 **Language** -- Data language (nl or fr)

### How to scrape Hubo

| Field | Type | Description |
|-------|------|-------------|
| `searchQuery` | String | Search keyword -- e.g., `"boormachine"`, `"verf"`, `"tuinslang"`, `"bbq"` |
| `categoryUrl` | String | Category page URL -- e.g., `https://www.hubo.be/nl/a/gereedschap/elektrisch-gereedschap/` |
| `startUrls` | Array | List of Hubo category URLs to scrape |
| `maxResults` | Integer | Maximum products (default: 100, set to 0 for unlimited) |
| `language` | String | `"nl"` (Dutch, default) or `"fr"` (French) |
| `proxyConfiguration` | Object | Proxy config (Apify proxy by default) |

**Tips:**

- `searchQuery` uses Hubo's search API and is the fastest mode -- great for targeted product lookups
- Category URLs automatically discover and traverse subcategories, so you can start broad (e.g., `/gereedschap/`) and get all nested products
- If neither `searchQuery` nor `categoryUrl` is provided, the actor defaults to the search API with an empty query
- The search API key is fetched dynamically and refreshed automatically if it expires
- Dutch and French return the same products with localized names and categories

### Output

```json
{
    "name": "Black+Decker accu schroefboormachine 18V 2x1.5Ah BDCDD186K",
    "brand": "Black+Decker",
    "price": 89.95,
    "currency": "EUR",
    "url": "https://www.hubo.be/nl/p/black-decker-accu-schroefboormachine-18v-bdcdd186k/6789012",
    "scrapedAt": "2026-04-03T17:00:00.000Z",
    "originalPrice": 109.95,
    "ean": "5035048644973",
    "sku": "6789012",
    "productId": "6789012",
    "inStock": true,
    "rating": 4.3,
    "reviewCount": 45,
    "imageUrl": "https://www.hubo.be/media/catalog/product/bdcdd186k.jpg",
    "imageUrls": [
        "https://www.hubo.be/media/catalog/product/bdcdd186k.jpg",
        "https://www.hubo.be/media/catalog/product/bdcdd186k-2.jpg"
    ],
    "description": "De Black+Decker BDCDD186K is een veelzijdige accuboormachine voor dagelijks gebruik in en rond het huis.",
    "specs": {
        "Spanning": "18 V",
        "Accucapaciteit": "1.5 Ah",
        "Max. koppel": "30 Nm",
        "Gewicht": "1.28 kg"
    },
    "category": "Elektrisch gereedschap",
    "categories": ["gereedschap", "elektrisch-gereedschap"],
    "language": "nl"
}
```

A garden product example:

```json
{
    "name": "Weber Spirit E-325S GBS gasbarbecue",
    "brand": "Weber",
    "price": 799.00,
    "currency": "EUR",
    "url": "https://www.hubo.be/nl/p/weber-spirit-e-325s-gbs-gasbarbecue/3456789",
    "scrapedAt": "2026-04-03T17:00:00.000Z",
    "ean": "0077924146985",
    "sku": "3456789",
    "productId": "3456789",
    "inStock": true,
    "rating": 4.8,
    "reviewCount": 72,
    "imageUrl": "https://www.hubo.be/media/catalog/product/weber-spirit-e325s.jpg",
    "description": "De Weber Spirit E-325S GBS is een driebranders gasbarbecue met GBS-grillrooster voor veelzijdig grillen.",
    "specs": {
        "Aantal branders": "3",
        "Vermogen": "11.1 kW",
        "Grilloppervlak": "2800 cm2",
        "Brandstof": "Gas"
    },
    "category": "Barbecue",
    "language": "nl"
}
```

### How much does it cost?

Hubo Scraper uses API calls for search mode and lightweight HTTP requests for category scraping.

| Scenario | Products | Est. cost |
|----------|----------|-----------|
| Quick keyword search | 100 | ~$0.10 |
| Category with subcategories | 500 | ~$0.40 |
| Full department | 1,000 | ~$0.70 |
| Broad catalog scan | 5,000 | ~$2.50 |

Standard Apify proxy costs included. No residential proxy required.

### Can I integrate?

- **JSON, CSV, Excel** -- Direct dataset download
- **Google Sheets** -- Auto-sync
- **Webhooks** -- Pipeline triggers on completion
- **API** -- Programmatic access (see below)
- **Zapier / Make** -- 5,000+ 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/hubo-scraper").call(run_input={
    "searchQuery": "verf",
    "maxResults": 200,
    "language": "nl"
})

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/hubo-scraper').call({
    searchQuery: 'verf',
    maxResults: 200,
    language: 'nl',
});

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

### FAQ

**How does Hubo compare to Brico and GAMMA?**
Hubo operates smaller neighborhood stores (150+ locations) focused on convenience and everyday DIY needs. Brico has Belgium's largest stores (140+ locations, including Brico Plan-It megastores). GAMMA (80+ stores) is mid-size and Flemish-focused. All three have different pricing strategies reflecting their store formats and customer segments.

**Does Hubo have its own brands?**
Hubo carries some own-brand products alongside major brands. The scraper extracts the brand field for each product, making it easy to filter between private-label and national brand items.

**What happens if the search API key expires?**
The actor dynamically fetches a fresh API key at the start of each run. If the key expires during a long run, the scraper detects the 401/403 error and automatically refreshes the key before retrying.

**Can I scrape Hubo Luxembourg?**
Hubo also operates in Luxembourg. The hubo.be website serves Belgian customers; Luxembourg products may overlap. The scraper does not specifically target the Luxembourg market.

**Why does category scraping traverse subcategories?**
Hubo's category pages often contain subcategory links rather than products directly. The scraper automatically discovers and visits subcategories, collecting products from leaf-level category pages. This means you can start from a broad top-level category and get all products within it.

**How large is Hubo's online catalog?**
Hubo's online assortment is smaller than Brico's or GAMMA's, reflecting its neighborhood store format -- roughly 10,000-15,000 products. But it covers all core DIY categories: tools, paint, garden, bathroom, electrical, and building materials.

### Limitations

- Targets hubo.be (Belgium) -- not specifically tuned for Hubo Luxembourg
- The search API key needs to be fetched at the start of each run, adding a few seconds of startup time
- Category scraping via HTML is slower than API search and may miss products if the HTML structure changes
- Product specs depth varies -- some products have rich feature data, others have minimal attributes
- The API returns 24 products per page; large extractions require many paginated requests
- Subcategory discovery relies on link patterns matching `/a/` paths

### Other DIY & home improvement scrapers

Get the full picture of Belgian and European DIY:

- **[Brico Scraper](https://apify.com/studio-amba/brico-scraper)** -- Belgium's largest DIY chain (Colruyt group)
- **[GAMMA Scraper](https://apify.com/studio-amba/gamma-scraper)** -- Belgium, Intergamma group
- **[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
- **[OBI Scraper](https://apify.com/studio-amba/obi-scraper)** -- Germany's leading DIY chain
- **[Hornbach Scraper](https://apify.com/studio-amba/hornbach-scraper)** -- German/EU DIY megastore
- **[Bauhaus Scraper](https://apify.com/studio-amba/bauhaus-scraper)** -- German/EU professional hardware
- **[Toom Scraper](https://apify.com/studio-amba/toom-scraper)** -- Germany, REWE group DIY

### Your feedback

Questions, bugs, or feature requests? Open an issue on the actor's page or contact us through Apify. We maintain this scraper based on user feedback.

# Actor input Schema

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

List of Hubo category URLs to scrape (e.g. https://www.hubo.be/nl/a/gereedschap/elektrisch-gereedschap/).

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

Search for products by keyword (e.g. 'boormachine', 'verf'). Leave empty to crawl categories instead.

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

Start scraping from a specific Hubo category URL (e.g. https://www.hubo.be/nl/a/gereedschap/elektrisch-gereedschap/). Leave empty to use search or crawl all categories.

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

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

## `language` (type: `string`):

Language for product data. Dutch (nl) or French (fr).

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

Apify proxy configuration. Use Apify proxies or your own.

## Actor input object example

```json
{
  "startUrls": [],
  "searchQuery": "",
  "categoryUrl": "",
  "maxResults": 100,
  "language": "nl",
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ],
    "apifyProxyCountry": "BE"
  }
}
```

# 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": [],
    "searchQuery": "",
    "categoryUrl": "",
    "proxyConfiguration": {
        "useApifyProxy": true,
        "apifyProxyGroups": [
            "RESIDENTIAL"
        ],
        "apifyProxyCountry": "BE"
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("studio-amba/hubo-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": [],
    "searchQuery": "",
    "categoryUrl": "",
    "proxyConfiguration": {
        "useApifyProxy": True,
        "apifyProxyGroups": ["RESIDENTIAL"],
        "apifyProxyCountry": "BE",
    },
}

# Run the Actor and wait for it to finish
run = client.actor("studio-amba/hubo-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": [],
  "searchQuery": "",
  "categoryUrl": "",
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ],
    "apifyProxyCountry": "BE"
  }
}' |
apify call studio-amba/hubo-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,studio-amba/hubo-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/KuNagHcS3ox8aA8Dj/builds/76VdTFSCzVSApX53u/openapi.json
