# OBI Scraper — German DIY Products, Prices & Stock (OBI.de) (`studio-amba/obi-scraper`) Actor

Scrape OBI.de products: name, price, original price, rating, review count, SKU and images. Tools, garden, building materials and more from Germany's leading DIY retailer with 350+ stores. Search by keyword or category URL. No login or cookies required.

- **URL**: https://apify.com/studio-amba/obi-scraper.md
- **Developed by:** [Studio Amba](https://apify.com/studio-amba) (community)
- **Categories:** E-commerce
- **Features:** Limited permissions
- **Stats:** 7 total users, 1 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

## OBI Scraper -- Germany's Leading DIY & Home Improvement Retailer

Know what OBI is charging today, not last month. This actor pulls current prices, stock status, and full product specs from obi.de, Germany's largest DIY chain with 350+ stores, so you can watch a competitor's pricing move or build a product database without opening a browser.

### What is OBI Scraper?

OBI is Germany's largest DIY retailer by store count and one of the dominant forces in the European home improvement market. With over 350 stores in Germany (and 650+ across Europe), OBI serves both amateur DIYers and professional contractors. Its catalog covers power tools, hand tools, screws and fasteners, paint, wood, flooring, garden equipment, bathroom fixtures, lighting, and building materials.

This scraper crawls OBI's search results and product detail pages using CheerioCrawler, extracting data from JSON-LD structured data, HTML elements, and product attribute tables. It visits each product's detail page for the richest possible data extraction.

- **German DIY market intelligence** -- Track OBI pricing against Hornbach, Bauhaus, Toom, and Hagebau to understand Germany's competitive DIY landscape
- **Professional contractor procurement** -- Pull pricing data on screws, fasteners, building materials, and tools for large-scale procurement comparison
- **Product specification database** -- Build a comprehensive specs database from OBI's detailed product attribute tables covering dimensions, materials, power ratings, and compliance marks
- **Brand positioning analysis** -- Study how brands like Bosch, Makita, Metabo, Fischer, and OBI's private labels are positioned across categories
- **European DIY pricing research** -- Compare German pricing (OBI, Hornbach, Bauhaus) with French (Leroy Merlin), Belgian (Brico, GAMMA), and Dutch (Praxis) retailers

### What data does OBI Scraper extract?

- 🔩 **Product name** -- Full German product title
- 💰 **Price & discounts** -- Current price and strikethrough/UVP original price
- 🏷️ **Brand** -- Manufacturer name (Bosch, Makita, Fischer, OBI, etc.)
- 📦 **Stock availability** -- InStock status from structured data
- ⭐ **Ratings & reviews** -- Star rating and review count
- 🖼️ **Product images** -- Primary image and full gallery of all product photos
- 📐 **Technical specifications** -- Detailed key-value specs from product attribute tables
- 📋 **Product description** -- Full product description text
- 🔗 **Product URL** -- Direct link on obi.de
- 📂 **Category breadcrumbs** -- Full category path from breadcrumb navigation
- 🏗️ **Product identifiers** -- EAN/GTIN barcode, SKU, and internal product ID

### How to scrape OBI data

| Field | Type | Description |
|-------|------|-------------|
| `searchQuery` | String | Search by keyword -- e.g., `"schrauben"`, `"bohrmaschine"`, `"farbe"`, `"gartenmobel"` |
| `categoryUrl` | String | A listing page URL to crawl -- e.g., `https://www.obi.de/search/schlagbohrmaschine/` |
| `maxResults` | Integer | Maximum products to return (default: 100, max: 50,000) |
| `proxyConfiguration` | Object | Optional proxy for reliability |

**Tips:**

- Neither field is required -- leave both empty and the actor searches `bohrmaschine` (drills) as a working default
- The actor visits each product's detail page for full specs and descriptions, so it extracts richer data than listing-only scrapers
- OBI's search and category listing pages share the same URL pattern: `https://www.obi.de/search/{term}/` -- use a narrower term (e.g. `schlagbohrmaschine`) in `categoryUrl` to target a subcategory instead of the broader `searchQuery` match
- Proxy recommended for scrapes above a few hundred products

### Output

```json
{
    "name": "Bosch Professional Akku-Bohrschrauber GSR 18V-55 inkl. 2 Akkus",
    "brand": "Bosch Professional",
    "price": 189.99,
    "currency": "EUR",
    "url": "https://www.obi.de/p/bosch-professional-akku-bohrschrauber-gsr-18v-55/9876543",
    "scrapedAt": "2026-04-03T13:00:00.000Z",
    "originalPrice": 219.99,
    "ean": "3165140953160",
    "sku": "GSR18V55",
    "productId": "9876543",
    "inStock": true,
    "rating": 4.7,
    "reviewCount": 234,
    "imageUrl": "https://www.obi.de/media/bosch-gsr-18v-55.jpg",
    "imageUrls": [
        "https://www.obi.de/media/bosch-gsr-18v-55.jpg",
        "https://www.obi.de/media/bosch-gsr-18v-55-2.jpg",
        "https://www.obi.de/media/bosch-gsr-18v-55-3.jpg"
    ],
    "description": "Der Bosch Professional GSR 18V-55 ist ein kompakter Akku-Bohrschrauber mit 55 Nm Drehmoment.",
    "specs": {
        "Spannung": "18 V",
        "Max. Drehmoment": "55 Nm",
        "Bohrfutter": "13 mm",
        "Gewicht": "1,1 kg",
        "Akkutyp": "Li-Ion"
    },
    "category": "Werkzeug > Elektrowerkzeuge > Akku-Bohrschrauber",
    "categories": ["Werkzeug", "Elektrowerkzeuge", "Akku-Bohrschrauber"]
}
```

A fasteners example -- OBI's bread and butter:

```json
{
    "name": "Fischer Universaldubel UX 8 x 50 mm 100 Stuck",
    "brand": "Fischer",
    "price": 12.49,
    "currency": "EUR",
    "url": "https://www.obi.de/p/fischer-universalduebel-ux-8x50/8765432",
    "scrapedAt": "2026-04-03T13:00:00.000Z",
    "ean": "4006209770283",
    "productId": "8765432",
    "inStock": true,
    "rating": 4.9,
    "reviewCount": 412,
    "imageUrl": "https://www.obi.de/media/fischer-ux-8x50.jpg",
    "description": "Der Fischer Universaldubel UX eignet sich fur alle Baustoffe.",
    "specs": {
        "Durchmesser": "8 mm",
        "Lange": "50 mm",
        "Packungsinhalt": "100 Stuck",
        "Material": "Nylon",
        "Schraubendurchmesser": "5-6 mm"
    },
    "category": "Befestigungstechnik > Dubel > Universaldubel",
    "categories": ["Befestigungstechnik", "Dubel", "Universaldubel"]
}
```

### How much does it cost?

Pricing is $0.02 per run start plus $0.002 per product scraped.

| Scenario | Products | Est. cost |
|----------|----------|-----------|
| Quick search | 50 | ~$0.12 |
| Category scan | 200 | ~$0.42 |
| Brand analysis | 500 | ~$1.02 |
| Large export | 1,000 | ~$2.02 |

Proxy costs are additional if configured. No residential proxy is strictly required for OBI.

### Can I integrate?

- **JSON, CSV, Excel** -- Direct dataset download
- **Google Sheets** -- Automatic sync
- **Webhooks** -- Trigger on run completion
- **API** -- Programmatic access
- **Zapier / Make** -- 5,000+ integrations
- **Amazon S3, Google Cloud Storage** -- Cloud export

### Can I use it as an API?

**Python:**

```python
from apify_client import ApifyClient

client = ApifyClient("YOUR_API_TOKEN")

run = client.actor("studio-amba/obi-scraper").call(run_input={
    "searchQuery": "schrauben",
    "maxResults": 100
})

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/obi-scraper').call({
    searchQuery: 'schrauben',
    maxResults: 100,
});

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

### FAQ

**How big is OBI's product catalog?**
OBI.de carries an estimated 50,000-100,000 products online. The in-store assortment is even larger. The scraper can handle large exports -- just set `maxResults` accordingly and allow time for detail page visits.

**Does this work for OBI in other countries?**
This scraper targets obi.de (Germany) specifically. OBI operates in several European countries (Austria, Poland, Czech Republic, etc.) with separate websites. The scraper would need modification for other OBI country sites.

**Why does the scraper visit each product page?**
OBI's listing pages show limited data (name, price, image). By visiting each product's detail page, the scraper extracts full technical specifications, descriptions, EAN codes, all images, and accurate stock status. This makes it slower but significantly more data-rich.

**Can I scrape OBI's building materials section?**
Yes. OBI has extensive building materials categories: wood, concrete, insulation, roofing, drywall, and more. Use the category URL for the specific department or search by keyword.

**How does OBI compare to Hornbach and Bauhaus?**
OBI is the largest by store count (350+ in Germany). Hornbach focuses on warehouse-format stores for project builders and contractors. Bauhaus emphasizes professional-grade materials. All three are major players in the German DIY market. Use all three scrapers for comprehensive German market coverage.

### Limitations

- Targets obi.de (Germany) only
- Visits each product's detail page, so scraping speed is limited by page load times (roughly 1-3 seconds per product)
- Some OBI pages may rely on JavaScript rendering that CheerioCrawler cannot execute -- in those cases, listing data falls back to link extraction
- Specs and descriptions vary by product -- some items have detailed attribute tables, others have minimal data
- Product card extraction on listing pages depends on OBI's current HTML structure, which may change

### Other DIY & home improvement scrapers

Cover the full German and European DIY market:

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

### Your feedback

Questions about extraction or missing data fields? Found a bug? Open an issue on the actor's page or reach out through Apify.

# Actor input Schema

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

Search for products by keyword (e.g., 'schrauben', 'bohrmaschine', 'farbe'). Uses obi.de search.

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

An obi.de category page URL to scrape. Example: https://www.obi.de/search/schlagbohrmaschine/

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

Maximum number of products to return.

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

Proxy settings for better reliability. Recommended for large scrapes.

## Actor input object example

```json
{
  "searchQuery": "schrauben",
  "maxResults": 100,
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ],
    "apifyProxyCountry": "DE"
  }
}
```

# Actor output Schema

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

No description

# API

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

## JavaScript example

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

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

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

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

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

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

```

## Python example

```python
from apify_client import ApifyClient

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

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

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

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

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

```

## CLI example

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

```

## MCP server setup

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