# Foody.vn Scraper — Vietnam Restaurants (Rating, Phone) (`haketa/foody-scraper`) Actor

Scrape restaurants from Foody.vn, Vietnam's #1 food directory: name, address, rating (out of 10), review count, phone, GPS, photos and delivery/booking signals. Filter by city. Great for local F\&B research and lead generation. No login or API key. Export JSON, CSV, Excel.

- **URL**: https://apify.com/haketa/foody-scraper.md
- **Developed by:** [Haketa](https://apify.com/haketa) (community)
- **Categories:** Lead generation
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $1.50 / 1,000 results

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.
Since this Actor supports Apify Store discounts, the price gets lower the higher subscription plan you have.

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

## Foody.vn Scraper 🇻🇳🍜

Extract **restaurants & food places from Foody.vn — Vietnam's #1 food & restaurant directory** — at scale, without an account or API key. Scrape by city and export clean JSON, CSV or Excel: **name, address, rating (out of 10), review count, phone, GPS, photos and delivery/booking signals.**

Ideal for **local F\&B market research, restaurant lead generation, delivery/aggregator apps and mapping Vietnam's dining scene.**

***

### 🔑 What this scraper does

- 🏙️ **Scrape by city** — Ho Chi Minh City, Ha Noi, Da Nang and more (by Foody city ID).
- ⭐ **Ratings & reviews** — average rating (out of 10) and total review count.
- 📞 **Phone** — the restaurant's contact number where Foody publishes it.
- 📍 **Location** — full address plus GPS coordinates.
- 📊 **Reviews** — total review count per place.
- 🛵 **Signals** — delivery, booking and promotion flags.
- 🖼️ **Photo** — cover image.

No login, no cookies to paste, no API key. Pick a city, press start, export.

***

### 📋 Example output

```json
{
  "id": "1174605",
  "restaurantId": 1174605,
  "name": "Cơm Tấm Khương - Cơm Tấm Sườn Cọng",
  "url": "https://www.foody.vn/ho-chi-minh/com-tam-khuong",
  "address": "382 Tân Sơn Nhì, P. Tân Sơn Nhì, Quận Tân Phú, TP. HCM",
  "phone": "0902915908",
  "rating": 7.8,
  "ratingText": "Rất ngon",
  "totalReviews": 462,
  "lat": 10.7955021,
  "lng": 106.6295264,
  "photoUrl": "https://images.foody.vn/res/...jpg",
  "description": null,
  "isOpening": true,
  "hasDelivery": true,
  "hasBooking": false,
  "hasPromotion": true,
  "deliveryUrl": "https://www.foody.vn/delivery/...",
  "cityId": 217,
  "scrapedAt": "2026-09-11T10:00:00.000Z"
}
```

***

### 🗂️ Fields you get

| Field | Description |
|---|---|
| `id`, `restaurantId` | Foody place ID |
| `name` | Restaurant / place name |
| `url` | Foody listing URL |
| `address` | Full address |
| `phone` | Contact phone, where Foody publishes it |
| `rating` | Average rating **out of 10** |
| `ratingText` | Rating label (e.g. "Rất ngon" / very good) |
| `totalReviews` | Number of reviews |
| `lat`, `lng` | GPS coordinates |
| `photoUrl` | Cover image |
| `description` | Short description, where available |
| `isOpening` | Whether currently open |
| `hasDelivery`, `hasBooking`, `hasPromotion` | Delivery / booking / promotion signals |
| `deliveryUrl` | Delivery link where available |
| `cityId`, `scrapedAt` | City ID and scrape time |

> Name, address, rating, reviews, GPS and photo come on every place. **Phone is included where Foody publishes it** (around half of listings); when a restaurant hasn't shared a number, the field is null.

***

### 🚀 How to use

1. Click **Try for free**.
2. Enter one or more **City IDs** (e.g. `217` for Ho Chi Minh City, `3` for Ha Noi).
3. Set **Max Items** and **Max Pages per City**, then click **Start**.
4. Export as **JSON, CSV, Excel, HTML, RSS**, or via the **Apify API**.

**Common city IDs:** `217` = Ho Chi Minh City, `3` = Ha Noi, `47` = Da Nang, `216` = Binh Duong, `218` = Bien Hoa, `4` = Hai Phong.

***

### 📝 Example inputs

#### 1. Ho Chi Minh City restaurants

```json
{ "cityIds": ["217"], "maxItems": 300 }
```

#### 2. Multiple cities

```json
{
  "cityIds": ["217", "3", "47"],
  "maxItems": 2000,
  "maxPagesPerCity": 30
}
```

#### 3. Ha Noi only

```json
{ "cityIds": ["3"], "maxItems": 500 }
```

***

### 💡 Popular use cases

#### 🍜 Local F\&B market research

Map Vietnam's restaurant scene by city — ratings, review volumes and locations — to size markets, spot popular areas and benchmark competition.

#### 🎯 Restaurant lead generation

Build lists of restaurants with phone numbers and addresses for POS, delivery, supplier or marketing outreach.

#### 🛵 Delivery & aggregator apps

Seed or enrich a restaurant database with names, locations, ratings and delivery signals.

#### 🗺️ Location intelligence

Use GPS coordinates and engagement metrics to map dining density and popularity across districts.

#### 🤖 AI, LLM & data products

Feed clean, structured Vietnamese restaurant data into your own models, dashboards or products.

***

### 👥 Who uses this

- **F\&B suppliers & POS/delivery vendors** building restaurant lead lists.
- **Market researchers & analysts** mapping Vietnam's dining scene.
- **Delivery & directory apps** seeding restaurant databases.
- **Developers & AI builders** who need Vietnamese F\&B data via API.

***

### 🎛️ Options

- **City IDs** — Foody city IDs, scraped separately.
- **Place Type** — 1 = restaurants (default).
- **Max Items** — cap total places (`0` = unlimited).
- **Max Pages per City** — pages per city (about 24 places per page).

***

### ❓ FAQ

**Do I need a Foody account or API key?**
No. Just enter a city ID and run — no login, no cookies, no key.

**How is rating scored?**
Foody rates out of **10** (not 5). The `rating` field is the average out of 10, with a `ratingText` label.

**Do I get phone numbers?**
Yes, where Foody publishes them — roughly half of listings include a phone number; the rest are null (the restaurant hasn't shared one).

**Which cities can I scrape?**
Any Foody city by its ID. Common ones: 217 (HCMC), 3 (Ha Noi), 47 (Da Nang), 216 (Binh Duong), 4 (Hai Phong).

**Do I get GPS coordinates?**
Yes — `lat` and `lng` on every place.

**How many places can I get?**
As many as the city has, up to your `maxItems` and `maxPagesPerCity` limits. Set `maxItems: 0` for unlimited.

**What export formats are supported?**
JSON, CSV, Excel, HTML table, RSS, and the Apify API. Connect to Make, Zapier, Google Sheets, Slack, webhooks or an MCP server.

**Is the data structured and clean?**
Yes. Each place is a flat, typed JSON object, de-duplicated by ID.

***

### 🔌 Integrations

- Export to **JSON, CSV, Excel, HTML, RSS**.
- Pull via the **Apify API** or client libraries (JavaScript, Python).
- Connect to **Make, Zapier, Google Sheets, Slack, webhooks** and more.
- Use from an **MCP server** in your AI agent / LLM workflow.
- Schedule recurring runs with the **Apify Scheduler**.

***

### ⚖️ Legal & responsible use

This scraper collects **publicly available** listing information only — the same data any visitor can see on Foody.vn without logging in. It does not access private messages, user accounts, or anything behind authentication.

You are responsible for how you use the collected data. Please:

- Respect Foody's Terms of Service and all applicable laws.
- Use any personal or company data lawfully and only for legitimate purposes.
- Avoid excessive request rates and scrape responsibly.

This tool is provided for lawful purposes such as market research, lead generation and business intelligence. It is not affiliated with, endorsed by, or connected to Foody.

# Actor input Schema

## `cityIds` (type: `array`):

Foody city IDs to scrape. Common IDs: 217 = Ho Chi Minh City, 3 = Ha Noi, 47 = Da Nang, 216 = Binh Duong, 218 = Bien Hoa, 4 = Hai Phong. Each city is scraped separately.

## `placeType` (type: `integer`):

Foody place type. 1 = restaurants (default). Leave as 1 for the main restaurant/food directory.

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

Maximum number of places to collect across all cities. 0 = unlimited.

## `maxPagesPerCity` (type: `integer`):

How many result pages to scrape per city. Each page has about 24 places.

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

The default (Apify Proxy, datacenter) works out of the box.

## Actor input object example

```json
{
  "cityIds": [
    "217"
  ],
  "placeType": 1,
  "maxItems": 200,
  "maxPagesPerCity": 8,
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}
```

# Actor output Schema

## `dataset` (type: `string`):

Open to view and export all scraped listings (JSON, CSV, Excel).

# 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 = {
    "cityIds": [
        "217"
    ],
    "placeType": 1,
    "maxItems": 200,
    "maxPagesPerCity": 8,
    "proxyConfiguration": {
        "useApifyProxy": true
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("haketa/foody-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 = {
    "cityIds": ["217"],
    "placeType": 1,
    "maxItems": 200,
    "maxPagesPerCity": 8,
    "proxyConfiguration": { "useApifyProxy": True },
}

# Run the Actor and wait for it to finish
run = client.actor("haketa/foody-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 '{
  "cityIds": [
    "217"
  ],
  "placeType": 1,
  "maxItems": 200,
  "maxPagesPerCity": 8,
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}' |
apify call haketa/foody-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,haketa/foody-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/lF7pNTba5V4Z81erY/builds/odEj8iN6fsz6tIj7a/openapi.json
