HORNBACH APIhornbach.de ↗
Search HORNBACH Germany products, fetch full pricing and delivery details, and check real-time in-store availability across all branches via 3 REST endpoints.
What is the HORNBACH API?
The HORNBACH.de API gives developers access to 3 endpoints covering the full product data lifecycle at HORNBACH Germany: search by keyword, retrieve complete product details including current price and delivery info, and check branch-level stock availability. The search_products endpoint resolves a free-text query to a matching category and returns an array of product summaries with article numbers, prices, and basic availability status.
curl -X GET 'https://api.parse.bot/scraper/f091d2d0-8e5d-4e83-a51d-198760ce45d3/search_products?query=mobiles+Klimager%C3%A4t' \ -H 'X-API-Key: $PARSE_API_KEY'
Typed, relational, agent-ready
A generated client with real types, enums, and the links between objects — the structure a flat JSON response can't carry. Autocompletes in your editor and reads cleanly to coding agents.
- Fully typed · autocompletes
- Objects link to objects
- Typed errors & pagination
Typed Python client. Set up the SDK in your uv project, then pull this API’s typed client:
uv add parse-sdk uv run parse init uv run parse add --marketplace hornbach-de-api
uv run parse add --marketplace pulls a pinned snapshot of this canonical API — it won’t change underneath you. To customize it, subscribe and swap to your own copy.
"""Walkthrough: hornbach SDK — bounded, re-runnable; every call capped."""
from parse_apis.Hornbach_Product___Availability_API import Hornbach, ProductNotFound
client = Hornbach()
# Search for mobile air conditioners — merchant data shows first-party vs marketplace
for product in client.product_summaries.search(query="mobiles Klimagerät", limit=3):
print(product.name, product.price, product.merchant_name, product.is_marketplace)
# Drill down into the first result's full detail
summary = client.product_summaries.search(query="mobiles Klimagerät", limit=1).first()
if summary:
detail = summary.details()
print(detail.name, detail.price)
print("Online:", detail.online_availability.merchant_name, detail.online_availability.is_marketplace)
print("Store:", detail.store_availability.status_text)
# Check availability at a specific store (Leipzig)
store_check = detail.check_store(store_id="540")
print(store_check.store_name, store_check.store_city)
print("Merchant:", store_check.online_availability.merchant_name, store_check.online_availability.is_marketplace)
# Typed error: try fetching a non-existent product
try:
client.products.get(article_number="99999999")
except ProductNotFound as e:
print(f"not found: {e.article_number}")
print("exercised: product_summaries.search / ProductSummary.details / Product.check_store / products.get")
Search HORNBACH products by keyword. Returns a list of matching products with name, price, article number, availability, and merchant information. The site may redirect keyword searches to a best-matching category page; results reflect the server's interpretation of the query.
| Param | Type | Description |
|---|---|---|
| queryrequired | string | Search keyword for products (e.g. 'mobiles Klimagerät', 'Heizlüfter'). |
{
"type": "object",
"fields": {
"query": "the search query submitted",
"category": "category name the search resolved to, if any",
"products": "array of product summaries with merchant info",
"total_results": "total number of matching products"
},
"sample": {
"query": "mobiles Klimagerät",
"category": "Suchergebnisse für: \"mobiles+Klimagerät\"",
"products": [
{
"url": "https://www.hornbach.de/p/terrassentuerabdichtung-fuer-mobile-klimageraete-aus-polyester-5-60-m-mit-klettband/10332618/",
"name": "Terrassentürabdichtung für mobile Klimageräte aus Polyester 5,60 m mit Klettband",
"price": 22.95,
"currency": "EUR",
"position": 1,
"image_url": "https://media.hornbach.de/hb/application/as.47222792.jpg?dvid=8",
"availability": null,
"article_number": "10332618"
}
],
"total_results": 5
}
}About the HORNBACH API
What the API Covers
The API exposes three endpoints targeting HORNBACH Germany's product catalog and store inventory. search_products accepts a German or English keyword (e.g. 'mobiles Klimagerät') and returns a list of matching products, each with a name, price, article number, and availability status. Note that HORNBACH's search may redirect a query to the closest matching category, and the category field in the response reflects that resolution.
Product Detail and Pricing
get_product_detail accepts an article_number from search results and returns a detailed record: name, description (which may contain HTML markup), price as a decimal, currency (EUR), availability_schema using schema.org vocabulary (InStock, OutOfStock, etc.), and an online_availability object covering delivery time, shipping info, and ordering status. Pass an optional store_id to also populate the store_availability object with in-store reservation status, article location within the store, and supplementary text.
Store Availability Lookup
check_store_availability focuses specifically on branch-level stock. Provide either a store_id (e.g. '540' for Leipzig) or a German postal code (postal_code, e.g. '04109') to resolve the nearest store. The response includes structured store metadata — store_name, store_address, store_city, store_zip — alongside two availability objects: store_availability (with can_reserve, status_text, and article_location) and online_availability (with can_order_online, delivery_time, and has_shipping_costs). Store IDs found through this endpoint can be reused as the store_id parameter in get_product_detail.
The HORNBACH API is a managed, monitored endpoint for hornbach.de — not a raw scraper you maintain. Every endpoint is automatically health-checked on a schedule, and when hornbach.de changes and a check fails, the API is automatically queued for repair and re-verified. It is built to keep working as the site underneath it changes.
This isn't an official hornbach.de API — it's an independent, maintained REST wrapper over public data. Where the source has no official API (or only a limited one), Parse gives you a stable contract over a source that never promised one, and keeps it current. Need a new endpoint or field? You can revise it yourself in plain English and the agent rebuilds it against the live site in minutes — contributing the change back to the shared API is free.
Will this API break when the source site changes?+
Is this an official API from the source site?+
Can I fix or extend this API myself if I need a new endpoint or field?+
What happens if I call an endpoint that has an issue?+
- Monitor HORNBACH price changes on specific article numbers for price-tracking dashboards.
- Find the nearest in-stock branch for a product by querying with a German postal code via
check_store_availability. - Build a product search widget that maps HORNBACH article numbers to current prices and delivery estimates.
- Aggregate store availability data across multiple
store_idvalues to identify regional stock patterns. - Automate restock alerts by polling
online_availability.can_order_onlineandstore_availability.can_reservefields. - Enrich an internal product catalog with HORNBACH descriptions, pricing, and schema.org availability statuses.
| Tier | Price | Credits/month | Rate limit |
|---|---|---|---|
| Free | $0/mo | 100 | 5 req/min |
| Hobby | $30/mo | 1,000 | 20 req/min |
| Developer | $100/mo | 5,000 | 100 req/min |
One credit = one API call regardless of which marketplace API you call. Exceeding the rate limit returns a 429 response. Authenticate with the X-API-Key header.
Does HORNBACH have an official public developer API?+
What does `check_store_availability` return beyond a simple in-stock flag?+
store_availability object with can_reserve (boolean), status_text, supplementary_text, article_location (the aisle or bin location within the store), and availability_text. It also includes an online_availability object with can_order_online, delivery_time, and has_shipping_costs, plus full store metadata: store_name, store_address, store_city, and store_zip.Does the search endpoint support filtering by category, price range, or product attributes?+
search_products accepts only a free-text query parameter. The server resolves the query to a category automatically and the category field reflects this. Filtering by price range, brand, or product attributes is not supported. You can fork this API on Parse and revise it to add filtered category-browse or faceted search endpoints.Does the API cover HORNBACH stores outside Germany, such as Austria, Switzerland, or the Netherlands?+
postal_code expects German PLZ codes, and pricing is in EUR for the German market. Coverage of other HORNBACH country sites is not currently included. You can fork the API on Parse and revise it to point to the relevant country domain.Can the `description` field from `get_product_detail` contain HTML tags?+
description field may contain HTML markup and should be sanitized or stripped before display in plain-text contexts. All other fields — name, price, currency, article_number, sku — are returned as clean scalar values.