# Food Delivery Scraper: Lieferando, Uber Eats, Wolt, Glovo (`acumix/food-delivery-scraper`) Actor

First 50 rows of every run are FREE (up to 500 per account) so you can check the data before you pay for any of it. 431,000 restaurants and 40M menu items from 8 food delivery apps in 18 European countries. Compare the same dish across apps, or find restaurants your competitor has and you do not.

- **URL**: https://apify.com/acumix/food-delivery-scraper.md
- **Developed by:** [liviu robert ciocazan](https://apify.com/acumix) (community)
- **Categories:** E-commerce
- **Stats:** 4 total users, 2 monthly users, 93.1% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $2.50 / 1,000 restaurants

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

## Food Delivery Scraper

Restaurant and menu data from 8 food delivery apps across 18 European countries.

#### The first 50 rows of every run are free

Up to 500 free rows per account, so you can check the data — real prices, real
snapshot dates, every field — before you pay for any of it. The **Coverage** output
is free and unlimited on top of that: it lists every country, city and platform we
hold, with counts, so you know what exists before you spend anything.

**431,000 restaurants · 40.3 million menu items · 2.9 million price comparisons**

Just Eat (Lieferando, Thuisbezorgd) · Uber Eats · Wolt · Glovo · Bolt Food · Foodora ·
eFood · Foody

The data is already collected, so a run takes seconds instead of hours. You pay only for
the rows you get.

***

### Start here: run Coverage. It's free.

Set **What do you want?** to **Coverage** and press Start. You get a list of every
country, city and platform we have, with restaurant counts — and how complete each field
is. Nothing is charged.

Then come back and pick what you actually want.

***

### The five things you can get

| | What one row is | Price per 1,000 rows |
|---|---|---|
| **Coverage** | a city on a platform, with counts | **free** |
| **Restaurants** | a restaurant on one app | $2.50 |
| **Menu items** | a dish, with its price | $0.80 |
| **Price comparison** | a dish priced on every app that has it | $3.00 |
| **Platform presence** | a restaurant, and which apps have it | $2.50 |

***

### Examples

**All Turkish restaurants in Berlin, with phone numbers**
Restaurants · City: Berlin · Cuisines: Turkish

**Where is my product sold, and for how much?**
Menu items · Dish name contains: `coca cola`

**Which restaurants are on Just Eat but not on Uber Eats?**
Platform presence · Must be ON: Just Eat · Must NOT be on: Uber Eats
→ 59,313 of them in the UK alone.

**The same dish, priced on two apps**
Price comparison · Minimum price difference: 20

```
Adam's Burger      Pommes frites   Just Eat €2.45   Wolt €4.90
UMI Sushi Bar      Creamy Dallas   Just Eat €5.00   Wolt €10.00
```

Same kitchen, same dish, different app, different price. Only possible because we match
a restaurant across apps.

**Every location of a chain**
Restaurants · Restaurant or chain name contains: `dominos`

***

### What you get in a row

**Restaurants** — name, address, postcode, city, coordinates, phone, cuisines, rating,
number of reviews, delivery fee, minimum order, delivery time, opening hours, pickup and
delivery availability, current offers, logo and photos, and the link to the listing.

**Menu items** — dish name, description, price, category, dietary tags, whether it's
available, photo, and the restaurant it belongs to. Toppings and sizes on request.

**Price comparison** — the dish, the price on each app, the cheapest and dearest, and the
difference between them.

**Platform presence** — which apps have the restaurant, and which don't.

***

### Things worth knowing

**Ratings are on one scale.** The apps don't agree — Wolt rates out of 10, Glovo out of
100, the rest out of 5. We convert everything to **0–5**, so "4.5 and up" means the same
thing everywhere. The original number is kept too.

**Cities include their suburbs.** Pick Athens and you get all 6,279 Athens restaurants,
not just the ones filed under the city centre. Spelling doesn't matter — `München`,
`Munich` and `muenchen` all work.

**Different apps publish different things.** Just Eat gives opening hours and a phone
number for almost every restaurant but no price bracket. Wolt is the opposite. Glovo has
no addresses. The free Coverage run shows you exactly how complete each field is, per
app, before you spend anything.

**Menus aren't everywhere.** Just Eat menus are missing in the UK, Spain and Italy.
Price comparison works in 11 countries. Coverage tells you which.

**Data is refreshed weekly.** Every row says when it was collected. We don't report
live open/closed status — if you need minute-by-minute availability, this isn't the
right tool.

**We don't have:** review text, allergens, or calories. They're not offered as fields.

***

### How you're charged

Per row delivered, and nothing else.

- Filters run before delivery, so a restaurant that doesn't match is never sent and never
  charged for.
- **Maximum results** is your spending cap. It starts at 1,000 — Berlin alone has 860,226
  menu items, so raise it deliberately.
- Coverage is always free.

***

### Need something else?

Bulk exports, another country or app, a different refresh schedule, or a feed into your
own system — message us through Apify.

# Actor input Schema

## `outputType` (type: `string`):

**Coverage is free.** Run it first to see every country, city and platform we hold, with restaurant counts — then come back and pick what you actually want.

## `cities` (type: `array`):

Each city shows how many restaurants it holds, so you can size the run before starting. Leave empty to take whole countries instead.

## `countries` (type: `array`):

Only needed when Cities is empty. Leave both empty to search all 18 countries.

## `platforms` (type: `array`):

Leave empty for every platform operating in the chosen places. Not every platform runs in every country — the free Coverage run shows which.

## `searchFor` (type: `string`):

Matches the restaurant name or its brand, so `dominos` finds every Domino's location. Case-insensitive.

## `cuisines` (type: `array`):

Keep only restaurants tagged with at least one of these.

## `minRating` (type: `string`):

Normalised to 0-5 across every platform, so 4.5 means the same on Wolt (which publishes 0-10) and Glovo (0-100) as on Just Eat. The original is kept in `rating_raw`.

## `itemNameContains` (type: `string`):

For Menu items and Price comparison. Try `coca cola` to see where a product is sold and at what price.

## `dietaryTags` (type: `array`):

Keep only dishes carrying at least one of these.

## `minPrice` (type: `integer`):

In the local currency. Leave empty for no floor.

## `maxPrice` (type: `integer`):

In the local currency. Leave empty for no ceiling.

## `minSpreadPct` (type: `integer`):

Price comparison only. Show a dish only when the dearest platform is at least this much above the cheapest. Try 20.

## `includeMenuItemOptions` (type: `boolean`):

Toppings, sizes and add-ons with their own prices. Makes menu rows considerably larger.

## `presentOn` (type: `array`):

The restaurant must be listed on every platform you pick here.

## `missingFrom` (type: `array`):

For example: on Just Eat, missing from Uber Eats — 59,313 restaurants in the UK alone.

## `maxItems` (type: `integer`):

You pay per row delivered, so this is your cost ceiling. Berlin alone holds 860,226 menu items — start small and raise it once you like what you see.

## Actor input object example

```json
{
  "outputType": "restaurants",
  "cities": [
    "de:berlin"
  ],
  "countries": [],
  "platforms": [],
  "cuisines": [],
  "minRating": "any",
  "dietaryTags": [],
  "includeMenuItemOptions": false,
  "presentOn": [],
  "missingFrom": [],
  "maxItems": 1000
}
```

# Actor output Schema

## `dataset` (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 = {
    "outputType": "restaurants",
    "cities": [
        "de:berlin"
    ],
    "countries": [],
    "platforms": [],
    "cuisines": [],
    "dietaryTags": [],
    "presentOn": [],
    "missingFrom": [],
    "maxItems": 1000
};

// Run the Actor and wait for it to finish
const run = await client.actor("acumix/food-delivery-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 = {
    "outputType": "restaurants",
    "cities": ["de:berlin"],
    "countries": [],
    "platforms": [],
    "cuisines": [],
    "dietaryTags": [],
    "presentOn": [],
    "missingFrom": [],
    "maxItems": 1000,
}

# Run the Actor and wait for it to finish
run = client.actor("acumix/food-delivery-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 '{
  "outputType": "restaurants",
  "cities": [
    "de:berlin"
  ],
  "countries": [],
  "platforms": [],
  "cuisines": [],
  "dietaryTags": [],
  "presentOn": [],
  "missingFrom": [],
  "maxItems": 1000
}' |
apify call acumix/food-delivery-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,acumix/food-delivery-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/umFait49DTHehTvHZ/builds/Wghes2j9JNRGmwnhO/openapi.json
