# GrabFood Scraper – Restaurants & Menus in SEA (`anxuanng/grabfood-restaurants-scraper`) Actor

Scrape GrabFood restaurants in Vietnam, Singapore, Malaysia, Thailand, Indonesia, Philippines, Cambodia and Myanmar. Extract cuisines, rating, hours, delivery fee, promos and full menus with prices. Pay per restaurant, JSON/CSV, API and MCP.

- **URL**: https://apify.com/anxuanng/grabfood-restaurants-scraper.md
- **Developed by:** [Xuan An Nguyen](https://apify.com/anxuanng) (community)
- **Categories:** E-commerce, Lead generation
- **Stats:** 2 total users, 1 monthly users, 0.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $5.00 / 1,000 restaurant 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?

Actors are web data automations that power AI and operations. They run on the Apify platform to scrape websites, process data, connect APIs, and automate workflows.
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.
Actors are written with capital "A".

## 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.
The best way to integrate Actors is as follows.

- **AI agents and MCP clients** — the [Apify MCP server](https://docs.apify.com/integrations/mcp.md) at `https://mcp.apify.com` (remote, streamable HTTP, OAuth on first use).
- **Agentic workflows and local Actor development** — [Agent Skills](https://apify.com/.well-known/agent-skills/index.json) with the [Apify CLI](https://docs.apify.com/cli/docs.md): `npm install -g apify-cli`, then `apify login`.
- **JavaScript/TypeScript projects** — the official [JS/TS client](https://docs.apify.com/api/client/js/docs.md): `npm install apify-client`.
- **Python projects** — the official [Python client](https://docs.apify.com/api/client/python/docs.md): `pip install apify-client`.
- **Any other language** — the [REST API](https://docs.apify.com/api/v2.md).

For usage examples, see the [API](#api) section below.

For more details, see Apify documentation as [Markdown index](https://docs.apify.com/llms.txt) and [Markdown full-text](https://docs.apify.com/llms-full.txt).

# README

Extract **GrabFood restaurants and menus** across Vietnam, Singapore, Malaysia, Thailand, Indonesia, the Philippines, Cambodia and Myanmar as clean JSON: name, cuisines, rating and vote count, opening hours, delivery fee and time, promotions, and with detail mode the full menu with prices and availability. Pay per restaurant, no subscription. GrabFood has no public API; this Actor is the closest thing to one.

### What data does the GrabFood scraper extract?

- Scrape GrabFood merchants near any coordinate or by city preset in 8 countries
- Extract restaurant name, chain and branch, cuisines and price tier
- Extract rating and number of reviews
- Extract opening hours for every weekday and whether the store is open now
- Extract delivery fee, discounted fee, estimated delivery time and distance
- Extract current promotions, labels such as "Preferred merchant", and cover photo
- Extract the complete menu: categories, item names, prices, descriptions, images, availability
- Search by keyword such as a dish, cuisine or brand
- Deduplicate merchants across search points

### What can you use GrabFood data for?

- **Market sizing**: count restaurants by cuisine and area before opening a kitchen
- **Menu price intelligence**: compare item prices across competitors and cities
- **Lead generation**: restaurants with low ratings or no promo are prospects for F\&B software and marketing
- **Delivery coverage maps**: fee and delivery time by neighbourhood
- **Brand monitoring**: track a chain's branches, ratings and promotions over time
- **Food and travel apps**: enrich your own listings with hours and menus

### How do I scrape GrabFood restaurants?

1. Open the Actor and press **Try for free**.
2. Pick a **city preset** (Ho Chi Minh City, Hanoi, Da Nang, Singapore, Kuala Lumpur, Bangkok, Jakarta, Manila, Phnom Penh, Yangon) or enter your own **search points** as `lat,lng`. GrabFood returns merchants within a few kilometres of each point, so add points to cover a larger area.
3. Optionally enter a keyword such as `pho`, `bubble tea` or `KFC`.
4. Set **Max restaurants** and turn on **Fetch merchant details** if you want addresses and full menus.
5. Press **Start** and export as JSON, CSV or Excel, or read the dataset through the API.

### What does the output look like?

```json
{
  "id": "VNGFVN000003cc",
  "country": "VN",
  "url": "https://food.grab.com/vn/vi/restaurant/VNGFVN000003cc",
  "name": "Chân Gà Nướng Thịnh Vượng",
  "cuisines": ["Gà Nướng", "Bánh Mì", "Trà"],
  "rating": 4.6,
  "voteCount": 3043,
  "priceTag": 1,
  "isOpen": true,
  "displayedHours": "10:45-13:00 16:00-23:30",
  "weeklyHours": { "mon": "10:45-13:00 16:00-23:30", "sun": "10:45-13:00 16:00-23:45" },
  "distanceKm": 1.108,
  "estimatedDeliveryMinutes": 22,
  "deliveryFee": 10000,
  "deliveryFeeText": "10.000₫",
  "deliveryFeeDiscounted": true,
  "currency": "VND",
  "hasPromo": true,
  "promoText": "Giảm 30.000₫",
  "labels": ["Quán trứ danh Grab"],
  "address": "123-125 Nguyễn Huệ, P.Sài Gòn, 70000, Ho Chi Minh, Vietnam",
  "menuItemCount": 58,
  "menu": [
    { "category": "Combo", "name": "Combo Ưng Ý - 2 Người", "price": 212000, "priceText": "212,000 VND", "available": true }
  ]
}
```

Prices are whole units of the local currency (VND dong, SGD dollars). `address` and `menu` are present only with **Fetch merchant details**. GrabFood does not expose merchant coordinates or phone numbers on the web.

### What are the input options?

| Field | Default | What it does |
|---|---|---|
| `country` | `VN` | VN, SG, MY, TH, ID, PH, KH or MM |
| `city` | `ho-chi-minh` | preset that expands to several search points; picking a city in another country switches the country |
| `points` | none | your own `lat,lng` list, overrides the preset |
| `keyword` | none | dish, cuisine or brand |
| `maxItems` | 100 | stop after this many unique merchants |
| `maxPages` | 10 | pages per point, 32 merchants each |
| `fetchDetails` | off | address and full menu per merchant |
| `proxyConfiguration` | Apify residential | pick the target country |

### How much does it cost to scrape GrabFood?

You pay per merchant row, and a separate small fee per full menu when **Fetch merchant details** is on. A few hundred restaurants with complete menus cost a couple of dollars and take a few minutes. Set a budget on the run to cap spend; the Actor stops cleanly at the limit.

### How do I use the GrabFood API from code?

```python
from apify_client import ApifyClient

client = ApifyClient("YOUR_APIFY_TOKEN")
run = client.actor("anxuanng/grabfood-restaurants-scraper").call(run_input={
    "country": "SG", "city": "singapore", "keyword": "chicken rice", "maxItems": 200, "fetchDetails": True,
})
for r in client.dataset(run["defaultDatasetId"]).iterate_items():
    print(r["name"], r["rating"], r["deliveryFeeText"], r.get("menuItemCount"))
```

```bash
curl -X POST "https://api.apify.com/v2/acts/anxuanng~grabfood-restaurants-scraper/run-sync-get-dataset-items?token=YOUR_APIFY_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"country":"TH","city":"bangkok","maxItems":100}'
```

Works as an **MCP tool** for AI agents and with Apify integrations for Zapier, Make, n8n, Google Sheets and webhooks. Schedule it weekly to track prices and promotions.

### Frequently asked questions

#### Why do I get only a few hundred merchants per point?

GrabFood searches around a location, like the app does. Add more points a few kilometres apart to cover a whole city; duplicates are removed automatically.

#### Are menu prices accurate?

They are the prices GrabFood shows at scrape time, converted from the API's minor units to whole currency units. Promotions are not applied to item prices.

#### Which countries work?

All markets where GrabFood operates: Vietnam, Singapore, Malaysia, Thailand, Indonesia, the Philippines, Cambodia and Myanmar. Use a residential proxy in the target country for best results.

#### Is it legal to scrape GrabFood?

The Actor reads only what any visitor sees on food.grab.com without logging in. Use the data responsibly and respect the site's terms.

#### Which other Southeast Asian data sources are available?

[Batdongsan.com.vn Property Scraper](https://apify.com/anxuanng/batdongsan-scraper) for Vietnam real estate and [Vietnam Jobs Scraper](https://apify.com/anxuanng/vietnam-jobs-scraper) for VietnamWorks, TopCV and ITviec.

### Need a custom dataset or another site?

I build and maintain scrapers for Vietnamese and Southeast Asian websites (real estate, jobs, food delivery, e-commerce, Telegram). If you need a one-off dataset, a daily feed into Google Sheets or your database, or a scraper for a site that is not listed here, open an issue on this page with the site and the fields you need. You get a sample of real rows before you pay for anything.

### Support

Open an issue on this page for bugs or a field you need. Typical response within one business day (GMT+7).

# Actor input Schema

## `country` (type: `string`):

Grab market to search. Ignored when a city preset from another country is chosen.

## `city` (type: `string`):

Expands to several search points covering the city. Used when Points is empty. Setting a city in another country switches the country automatically.

## `points` (type: `array`):

GrabFood returns merchants within a few km of a point. Add points to cover an area, e.g. "10.7769,106.7009".

## `keyword` (type: `string`):

Cuisine, dish or restaurant name, e.g. "pho", "bubble tea", "KFC". Empty = all merchants near each point.

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

Stop after this many unique merchants. Charged per merchant actually pushed.

## `maxPages` (type: `integer`):

32 merchants per page.

## `fetchDetails` (type: `boolean`):

Open each merchant for the full address and the complete menu with prices and availability. Charged as a separate 'detail' event.

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

Residential proxy is required: GrabFood's firewall blocks datacenter IPs before the session token is issued. Pick the target country for best results.

## Actor input object example

```json
{
  "country": "VN",
  "city": "ho-chi-minh",
  "points": [],
  "maxItems": 100,
  "maxPages": 10,
  "fetchDetails": false,
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ]
  }
}
```

# Actor output Schema

## `listings` (type: `string`):

All scraped rows as JSON; append ?format=csv for CSV.

## `runSummary` (type: `string`):

Counts of pushed/skipped/failed rows and whether the budget limit was hit.

# 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 = {
    "points": [],
    "keyword": "",
    "proxyConfiguration": {
        "useApifyProxy": true,
        "apifyProxyGroups": [
            "RESIDENTIAL"
        ]
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("anxuanng/grabfood-restaurants-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 = {
    "points": [],
    "keyword": "",
    "proxyConfiguration": {
        "useApifyProxy": True,
        "apifyProxyGroups": ["RESIDENTIAL"],
    },
}

# Run the Actor and wait for it to finish
run = client.actor("anxuanng/grabfood-restaurants-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 '{
  "points": [],
  "keyword": "",
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ]
  }
}' |
apify call anxuanng/grabfood-restaurants-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,anxuanng/grabfood-restaurants-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/BCjklqBolJPIFLfKl/builds/K6zRTVTlvI15Xahlh/openapi.json
