Lieferando Menu Scraper - Restaurant Menus, Prices & Delivery avatar

Lieferando Menu Scraper - Restaurant Menus, Prices & Delivery

Pricing

from $0.70 / 1,000 restaurant or menu results

Go to Apify Store
Lieferando Menu Scraper - Restaurant Menus, Prices & Delivery

Lieferando Menu Scraper - Restaurant Menus, Prices & Delivery

Scrape restaurant menus & dish prices from Lieferando.de, Germany's largest food delivery platform. Menu, price, delivery fees & minimum order per German postcode, with change detection across runs. Food delivery menu data as JSON rows. Unofficial, independent tool.

Pricing

from $0.70 / 1,000 restaurant or menu results

Rating

0.0

(0)

Developer

Kamer Ozkan

Kamer Ozkan

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

5 hours ago

Last modified

Categories

Share

Lieferando Menu & Price Scraper - German Food Delivery Data

Unofficial Actor: This Actor accesses publicly displayed data from Lieferando.de. It is not affiliated with, endorsed by, or sponsored by Lieferando or Just Eat Takeaway.com.

Production-oriented Apify Actor for postcode-dependent Lieferando.de intelligence. It resolves each German postal code through Lieferando, discovers local restaurant branches, extracts full menus and delivery economics, normalizes equivalent products, retains 90 days of prices, and produces ready-to-use comparison reports.

Included intelligence

  • complete menu rows with product name, description, category, price, availability, image, and source ID
  • delivery fee, minimum order, delivery time, rating, offer, address, coordinates, and opening hours
  • published cuisine labels plus explainable menu-based cuisine inference when metadata is missing
  • stable chain identity for comparing the same restaurant group across branches
  • semantic product normalization that maps spelling variants such as Döner Kebab, Doener Kebap, and DONER
  • optional custom alias mappings for market- or brand-specific product language
  • size-, quantity-, dietary-, and variant-aware comparable product IDs to avoid false matches
  • postcode price matrix with min/average/max price, branches, EUR spread, and percentage spread
  • per-item rolling 90-day observations, EUR change, and percentage change
  • restaurant-level 90-day menu-basket inflation summaries
  • HTML intelligence dashboard plus CSV and JSON exports
  • session rotation, blocked-request recovery, run-quality scoring, optional HTTPS alerts, and optional failure on degraded data

Outputs

The default dataset contains five record types:

recordTypePurpose
menu_itemOne current menu product with branch, location, normalization, and 90-day history
restaurantRestaurant-level fallback row when menus are disabled or empty
postcode_price_matrixSame chain and comparable product summarized across postal codes
menu_inflation_summaryCurrent versus first retained comparable menu basket
run_summaryCoverage, failure rates, quality metrics, issues, and final status

The default key-value store also contains:

  • REPORT.html - visual executive report
  • POSTCODE_PRICE_MATRIX.csv - spreadsheet-ready postcode comparison
  • ANALYTICS.json - matrix and inflation data
  • RUN_SUMMARY.json - monitoring payload
  • SCHEDULE_RECOMMENDATION.json - daily production schedule template

Example output

All records below are unedited output from live runs on 2026-07-28. The Actor emits four record types into one dataset: menu_item, postcode_price_matrix, menu_inflation_summary, and run_summary.

1. A restaurant listing with its live offer (menu_item)

A real Berlin listing: parsed delivery economics (fee, minimum, time window), structured address and coordinates, cuisine classification with confidence and source, and the running promotion exactly as the platform shows it. Fields the source does not publish stay null.

{
"recordType": "menu_item",
"observedAt": "2026-07-28T20:31:44.957Z",
"searchPostalCode": "10115",
"searchResultUrl": "https://www.lieferando.de/en/delivery/food/postcode-10115",
"restaurantName": "Sushi Yana",
"restaurantSlug": "sushi-yana-moabit",
"restaurantUrl": "https://www.lieferando.de/en/menu/sushi-yana-moabit?c_id=019fa26e-3e3a-7697-b664-b06e591dc3fd",
"chainKey": "lieferando:sushi_yana",
"chainName": "Sushi Yana",
"chainSource": "lieferando_chain_asset",
"rating": 4.6,
"reviewCount": 0,
"reviewCountText": "(9.600+)",
"deliveryTimeText": "25-40 min",
"deliveryTimeMin": 25,
"deliveryTimeMax": 40,
"deliveryFeeText": "Free delivery",
"deliveryFee": 0,
"minimumOrderText": "Min. 35,00€",
"minimumOrder": 35,
"offer": "50% off selected items",
"sponsored": true,
"stampCard": false,
"address": {
"@type": "PostalAddress",
"addressCountry": "Germany",
"addressLocality": "Berlin",
"addressRegion": "Berlin",
"postalCode": "10555",
"streetAddress": "Gotzkowskystraße 26"
},
"geo": {
"@type": "GeoCoordinates",
"latitude": 52.524754,
"longitude": 13.330654
},
"openingHours": [
"Su 00:00-00:45",
"Su-Th 10:30-23:45",
"Fr-Sa 10:30-23:59",
"Sa 00:00-00:45"
],
"cuisineTypes": [
"Japanese / Sushi",
"Salads / Healthy"
],
"cuisineClassifications": [
{
"cuisine": "Japanese / Sushi",
"confidence": 0.98,
"source": "menu_inference",
"matchedTerms": [
"sushi",
"maki",
"nigiri",
"sashimi",
"tempura"
]
},
"(1 more, shortened here)"
],
"sourceProductId": "fdedc97b-8012-4815-b449-f698e815abbd",
"category": "Starters",
"productName": "Vegetarian Spring Rolls - 6 pieces",
"description": "Served with sweet and sour sauce",
"priceText": "3,70 €",
"isFromPrice": false,
"isAvailable": true,
"imageUrl": "https://just-eat-prod-eu-res.cloudinary.com/image/upload/c_thumb,w_120/f_auto/q_auto/v1/de/dishes/13026782/5cebe021907a856e78b3bc759b6176ed",
"price": 3.7,
"priceCurrency": "EUR",
"canonicalName": "vegetarian spring rolls",
"canonicalProductId": "de-menu-v3:37c5ee26528ce1b2027aeeb2",
"comparableProductId": "de-menu-v3:d189604bdd1b148a3fc3a5fa",
"productSignature": "rolls spring vegetarian",
"normalizationConfidence": 0.81,
"productAttributes": {
"sizeValue": null,
"sizeUnit": null,
"sizeKey": null,
"quantity": 6,
"dietary": [
"vegetarian"
],
"variants": [],
"semanticTokens": [
"rolls",
"spring",
"vegetarian"
]
},
"normalizationVersion": "de-menu-v3",
"priceHistory90d": [
{
"observedAt": "2026-07-28T20:31:44.957Z",
"price": 3.7
}
],
"priceChange90d": null,
"priceChangePercent90d": null,
"firstObservedAt": "2026-07-28T20:31:44.957Z",
"observationCount": 1
}

2. Every run audits itself (run_summary and menu_inflation_summary)

The run reports its own quality instead of asking to be trusted: request failure and retry rates, the share of items with missing prices, cuisine classification coverage, and exactly how many results were charged. A run that fails its quality thresholds says so in issues rather than shipping silently bad data.

{
"recordType": "run_summary",
"observedAt": "2026-07-28T12:27:40.624Z",
"completedAt": "2026-07-28T12:29:09.422Z",
"status": "healthy",
"expectedPostalCodes": [
"10115"
],
"resolvedPostalCodes": [
"10115"
],
"requestedRestaurantLimit": 2,
"discoveredRestaurantCount": 2,
"scrapedRestaurantCount": 2,
"menuItemCount": 79,
"unavailableItemCount": 7,
"matrixRowCount": 72,
"crossPostcodeMatrixRowCount": 0,
"inflationSummaryCount": 2,
"failedRequestCount": 0,
"failedRequestRate": 0,
"retriedRequestCount": 0,
"totalRetryCount": 0,
"retryRate": 0,
"nullPriceRate": 0,
"cuisineCoverage": 1,
"averageMenuItemsPerRestaurant": 39.5,
"smallMenuRestaurantCount": 0,
"issues": [],
"failures": [],
"chargedResultCount": 79,
"stoppedBySpendingLimit": false
}

The inflation basket is honest about its composition: unavailable items are excluded from the tracked basket instead of being carried at stale prices, and the record shows that accounting (41 items on the menu, 6 unavailable, 35 tracked).

{
"recordType": "menu_inflation_summary",
"observedAt": "2026-07-28T12:27:40.624Z",
"searchPostalCode": "10115",
"chainKey": "lieferando:burgermeister",
"chainName": "Burgermeister",
"restaurantName": "Burgermeister Eberswalder",
"restaurantUrl": "https://www.lieferando.de/en/menu/burgermeister-5?c_id=019f37d0-05cc-7243-9430-de2821818e9a",
"menuItemCount": 41,
"unavailableItemCount": 6,
"trackedItemCount": 35,
"changedItemCount": 0,
"increasedItemCount": 0,
"decreasedItemCount": 0,
"unchangedItemCount": 35,
"currentComparableBasket": 267.84,
"firstComparableBasket": 267.84,
"menuInflation90d": 0,
"medianItemChangePercent90d": 0,
"maxItemIncreasePercent90d": null,
"maxItemDecreasePercent90d": null
}

3. Cross-postcode price comparison (postcode_price_matrix)

The same comparable product is matched across postcodes with per-postcode min, average, and max plus the contributing branches. In this real observation both areas were served at identical prices, so the spread is reported as exactly zero: the matrix reports no difference when there is none, which is what makes a nonzero spread trustworthy.

{
"recordType": "postcode_price_matrix",
"observedAt": "2026-07-28T20:31:44.957Z",
"chainKey": "lieferando:burgermeister",
"chainName": "Burgermeister",
"canonicalProductId": "de-menu-v3:77c75ffb312ff5c8a9a65dac",
"comparableProductId": "de-menu-v3:e0f4f0d4ace60fde53c95650",
"canonicalName": "hamburger",
"postalCodeCount": 2,
"branchCount": 1,
"priceByPostalCode": {
"10115": {
"postalCode": "10115",
"branchCount": 1,
"observationCount": 1,
"minPrice": 7.1,
"averagePrice": 7.1,
"maxPrice": 7.1,
"branches": [
{
"restaurantName": "Burgermeister Eberswalder",
"restaurantUrl": "https://www.lieferando.de/en/menu/burgermeister-5?c_id=019f37d0-05cc-7243-9430-de2821818e9a",
"price": 7.1
}
]
},
"10435": {
"postalCode": "10435",
"branchCount": 1,
"observationCount": 1,
"minPrice": 7.1,
"averagePrice": 7.1,
"maxPrice": 7.1,
"branches": [
{
"restaurantName": "Burgermeister Eberswalder",
"restaurantUrl": "https://www.lieferando.de/en/menu/burgermeister-5?c_id=019f37d0-05cc-7243-9430-de2821818e9a",
"price": 7.1
}
]
}
},
"lowestPrice": 7.1,
"highestPrice": 7.1,
"priceSpread": 0,
"priceSpreadPercent": 0
}

Pricing

Pay-per-event: $0.001 per delivered result row ($1 per 1,000 rows), covering menu items, price matrices, inflation summaries, and run summaries alike, plus a negligible run-start fee. A failed run produces no result charges.

This Actor is also exposed to AI agents through Apify's MCP server (mcp.apify.com): an agent can discover it by search and run it with the same pay-per-event billing, with no separate integration.

Run locally

npm install
npm run typecheck
npm test
npm run build
npm start

Copy examples/production-input.json to storage/key_value_stores/default/INPUT.json before npm start. For a short smoke test, reduce postalCodes to one value and maxRestaurantsPerPostalCode to 1.

Production use

Use the input in examples/production-input.json, keep the same named key-value store between runs, and create a daily Apify schedule. Full scheduling, alerting, output, and retention guidance is in docs/production.md.

For a fixed competitor set, add Lieferando menu URLs to restaurantUrls. Direct URLs can be collected without a search-postcode context, but postcode matrices require postcode-routed discovery.

Lieferando blocks data-center and direct Apify cloud IPs. The Actor therefore defaults to a German residential Apify Proxy profile, which is billed separately by Apify. The proxy settings remain visible and editable in the Actor input.

Comparison behavior

canonicalProductId represents the normalized semantic product. comparableProductId adds size, quantity, dietary, and variant attributes, so a 0.33 L cola is not compared with a 1 L cola.

Matrix rows are keyed by chain plus comparableProductId. A cross-postcode match therefore requires at least two input postal codes and an overlapping chain/product combination. Every source branch remains listed in the matrix cell for auditability.

Price history is keyed by postal code, branch, and Lieferando source product ID in the named store lieferando-price-history-v1. Repeated runs retain 90 days and append at most one unchanged observation per day. A first run has no earlier baseline, so change fields remain null until a later run supplies one.

customProductAliases can extend the built-in German rules without a code change. Aliases are applied safely as normalized phrases; size and quantity safeguards remain part of comparableProductId.

Publish

The Actor definition, Store README, deterministic Docker build, input/output schemas, dataset view, resource limits, and changelog are included. Deploy the folder with apify push or connect it as the Actor source in Apify Console, complete the account-owned Store display fields, and click Publish to Store.

Responsible operation

Use conservative concurrency, respect applicable law and platform terms, and avoid collecting personal or account data. The Actor only reads publicly displayed restaurant and menu information.