Delhaize APIdelhaize.be ↗
Search Delhaize.be products, retrieve nutritional details, allergens, pricing, and active promotions via a clean REST API. Covers Belgian grocery catalog in NL and FR.
What is the Delhaize API?
The Delhaize Belgium API exposes 3 endpoints to query the full Delhaize.be grocery catalog, returning product metadata, pricing, nutritional facts, allergens, and live promotions. The search_products endpoint lets you find items by keyword with paginated results in Dutch or French, while get_product_details returns ingredient lists, allergen breakdowns, and product images by Delhaize product code.
curl -X GET 'https://api.parse.bot/scraper/15807324-f7ef-4d7d-a3c6-7638f89560ec/search_products?query=melk&page_size=5&lang=nl&page=1' \ -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 delhaize-be-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: Delhaize Belgium grocery SDK — bounded, re-runnable."""
from parse_apis.delhaize_be_api import Delhaize, ProductNotFound
client = Delhaize()
# Browse current promotions — cap total items fetched.
for promo_product in client.promoted_products.list(page_size=5, limit=5):
print(promo_product.name, promo_product.formatted_price)
for promo in promo_product.promotions:
print(f" {promo.title}: {promo.simple_message}")
# Search for chocolate products.
for item in client.product_summaries.search(query="chocolade", page_size=5, limit=5):
print(item.name, item.brand, item.formatted_price)
# Drill-down: take one search hit and fetch full details via navigation.
hit = client.product_summaries.search(query="melk", limit=1).first()
if hit is not None:
product = hit.details()
print(product.name, product.price, product.weight_label)
print("Ingredients:", product.ingredients)
for nutrient in product.nutrients[:3]:
print(f" {nutrient.name}: {nutrient.values}")
if product.allergens.contain:
print("Contains:", product.allergens.contain)
# Point lookup by code discovered from the previous search result.
if hit is not None:
try:
detail = client.products.get(code=hit.code)
print(detail.name, detail.nutri_score, detail.categories[0].name)
except ProductNotFound:
print("Product no longer available")
print("exercised: promoted_products.list / product_summaries.search / details / products.get")
Search for products by keyword. Returns paginated results with product metadata including name, brand, price, availability, nutri-score, and active promotions. Results are ordered by relevance. The API uses zero-indexed pages internally; the caller passes 1-based page numbers.
| Param | Type | Description |
|---|---|---|
| lang | string | Language code for results: 'nl' for Dutch or 'fr' for French. |
| page | integer | Page number (1-based). Omitting returns page 1. |
| queryrequired | string | Search term for products (e.g. 'melk', 'chocolade', 'bier'). |
| page_size | integer | Number of products per page (1–100). |
{
"type": "object",
"fields": {
"page": "integer — current page number",
"query": "string — the search query echoed back",
"products": "array of product objects with code, name, brand, price, promotion, availability",
"page_size": "integer — number of products per page",
"total_results": "integer — total number of matching products"
},
"sample": {
"data": {
"page": 1,
"query": "melk",
"products": [
{
"url": "/nl/shop/Bewuste-voeding/Lactosevrij/Lactosevrije-melk/Melk-Halfvolle-Lactosevrij/p/S2018032200041700099",
"code": "S2018032200041700099",
"name": "Melk | Halfvolle | Lactosevrij",
"brand": "Delhaize",
"price": 7.09,
"currency": "EUR",
"in_stock": true,
"available": true,
"image_url": "/medias/sys_master/products/h0b/h20/13723879014430.jpg",
"promotion": null,
"sub_brand": null,
"was_price": null,
"nutri_score": "B",
"has_discount": false,
"weight_label": "6 x 1 l",
"category_code": "v2SPE",
"formatted_price": "€7,09",
"unit_price_label": "1,18 €/l"
}
],
"page_size": 5,
"total_results": 285
},
"status": "success"
}
}About the Delhaize API
What the API Covers
The API surfaces three endpoints against the Delhaize Belgium grocery catalog. search_products accepts a required query string (e.g. 'melk', 'bier') plus optional lang, page, and page_size parameters (1–100 results per page). Each result object includes code, name, brand, price, promotion, and availability. The endpoint echoes the query back in the response alongside total_results and page so you can implement full pagination.
Product Details and Nutrition
get_product_details takes a product_code — obtainable from search_products results — and returns the complete product record: name, brand, price (EUR), currency, in_stock, images (array of URLs), a relative url, and an allergens object with contain, mayContain, and unknown arrays. This is where ingredient lists, nutritional facts, and category assignments live. The lang parameter controls whether descriptions and ingredient text come back in Dutch (nl) or French (fr).
Promotions Feed
get_promotions lists all products on Delhaize.be that currently carry at least one active promotion. Promotion types include multi-buy deals, percentage discounts, and free-delivery offers. The endpoint is paginated with the same page and page_size controls as search_products, and each product object embeds a promotions array with full promotion metadata. total_results tells you how many promoted products exist at query time, useful for monitoring deal volume over time.
Language Support
All three endpoints accept a lang parameter set to 'nl' (Dutch) or 'fr' (French), mirroring the two official languages on delhaize.be. Omitting lang typically defaults to Dutch. Text fields like product names, descriptions, and category labels reflect the chosen language.
The Delhaize API is a managed, monitored endpoint for delhaize.be — not a raw scraper you maintain. Every endpoint is automatically health-checked on a schedule, and when delhaize.be 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 delhaize.be 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?+
- Build a Belgian grocery price tracker by polling
search_productsfor specific items and loggingpricechanges over time. - Aggregate active promotions daily using
get_promotionsto surface multi-buy and discount deals across the full catalog. - Populate a nutrition database by iterating product codes from search results and calling
get_product_detailsfor ingredient and allergen data. - Flag products containing specific allergens by parsing the
allergens.containandallergens.mayContainarrays fromget_product_details. - Compare nutri-score and brand data across a product category by running
search_productsqueries and collectingbrandand promotion fields. - Build a bilingual grocery app that switches between Dutch and French product descriptions using the
langparameter across all endpoints. - Monitor stock availability changes by periodically calling
get_product_detailson a watchlist of product codes and checking thein_stockfield.
| Tier | Price | Credits/month | Rate limit |
|---|---|---|---|
| Free | $0/mo | 200 | 5 req/min |
| Hobby | $30/mo | 1,000 | 20 req/min |
| Developer | $100/mo | 5,000 | 100 req/min |
| Team | $300/mo | 20,000 | 300 req/min |
| Company | $1,000/mo | 100,000 | 500 req/min |
Each endpoint has a fixed posted price per successful call — most fall between 1 and 10 credits — shown on this API's page before you run it. Exceeding the rate limit returns a 429 response. Authenticate with the X-API-Key header.
Does Delhaize Belgium have an official public developer API?+
What does `get_product_details` return beyond what `search_products` provides?+
search_products returns a summary record per product: code, name, brand, price, promotion, and availability. get_product_details adds the full allergens object (with contain, mayContain, and unknown sub-arrays), an images array, the relative url, explicit in_stock status, currency, and the extended description and nutritional facts fields that are not present in search result objects.Are store-level stock availability or click-and-collect slot data included?+
in_stock boolean and an available flag at the catalog level — there is no per-store inventory breakdown or click-and-collect availability. You can fork this API on Parse and revise it to add a store-specific availability endpoint if that granularity is needed.How does pagination work across the three endpoints?+
page parameter. Omitting page returns the first page. The page_size parameter controls results per page (1–100). Each paginated response includes total_results so you can calculate the total page count. Note that the API translates these 1-based page numbers to the zero-indexed format used by the source internally, so callers always use 1-based values.