# foodpanda Restaurant Search Scraper (`romy/foodpanda-restaurant-search-scraper`) Actor

Restaurants near any coordinate in 11 Asian markets, with live-verified filters (cuisine, budget tier, payment type, food characteristics, vertical) and four sort orders, or real-time search suggestions. Fully paginated. No login needed.

- **URL**: https://apify.com/romy/foodpanda-restaurant-search-scraper.md
- **Developed by:** [Romy](https://apify.com/romy) (community)
- **Categories:** E-commerce, Lead generation
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $1.56 / 1,000 restaurant chargeds

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?

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

## foodpanda Restaurant Search Scraper

**foodpanda Restaurant Search Scraper** finds restaurants near any location across 11 Asian markets, with a full **live-verified filter set** — cuisine, budget tier, payment type, food characteristics (e.g. Organic), and sort order — or, if you give it a search text, real-time search suggestions instead. No [foodpanda](https://www.foodpanda.sg) account, app, or scraping infrastructure required.

Spun off from the mature [foodpanda All-in-One API](https://github.com/RomySaputraSihananda/foodpanda-all-in-one-api) for teams that want a run-and-export dataset of restaurants rather than a live standby API.

### Why use this Actor?

- **Market research** — build a full, filtered census of restaurants in an area (e.g. all halal-friendly, budget-tier-1 restaurants).
- **Lead generation** — restaurant lists with cuisine, chain, rating, and address for a target area.
- **Competitive intelligence** — see exactly how many/which restaurants accept a given payment method or cuisine in a market.

### Every filter below was verified live (not guessed)

| Field                  | Confirmed behavior                                                                                                                                                      |
| ---------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `cuisine`              | Numeric cuisine id (e.g. `86` = Fast Food in Bangladesh). Confirmed to filter items. Real ids come back in each response's own `aggregations.cuisines[]`.               |
| `foodCharacteristic`   | Numeric id (e.g. `81` = Organic). Confirmed to filter items. Real ids in `aggregations.foodCharacteristics[]`.                                                          |
| `budgets`              | Tier `1`-`4`. Confirmed to filter (disjoint result sets per tier, matching each item's own `budget` field).                                                             |
| `paymentType`          | String id (e.g. `credit_card`). Confirmed to filter (cut 692 -> 516 results, exactly matching the aggregation's own count). Real ids in `aggregations.payment_types[]`. |
| `vertical`             | Default `restaurants`. Confirmed to switch the entire result set (`darkstores` = foodpanda's grocery/pandamart vendors instead).                                        |
| `verticalTypeIds`      | Confirmed to further narrow results within a vertical.                                                                                                                  |
| `sort`                 | `distance_asc`, `rating_desc`, `popularity_desc`, `delivery_time_asc` — all 4 confirmed live, each returns a genuinely different top result.                            |
| `useFreeDeliveryLabel` | NOT a filter — confirmed it only toggles whether each item gets a `free_delivery_label` field.                                                                          |
| `tagLabelMetadata`     | NOT a filter — confirmed it toggles whether `tags[]` carry full discount detail vs generic tag codes.                                                                   |

### Input

| Field                                                                                                                                        | Required | Description                                                                    |
| -------------------------------------------------------------------------------------------------------------------------------------------- | -------- | ------------------------------------------------------------------------------ |
| `country`                                                                                                                                    | yes      | One of `bd`, `hk`, `kh`, `la`, `mm`, `my`, `ph`, `pk`, `sg`, `th`, `tw`        |
| `lat`, `lng`                                                                                                                                 | yes      | Coordinates to search near                                                     |
| `query`                                                                                                                                      | no       | If set, switches to search-suggestions mode instead of a restaurant listing    |
| `sort`, `cuisine`, `budgets`, `paymentType`, `foodCharacteristic`, `vertical`, `verticalTypeIds`, `useFreeDeliveryLabel`, `tagLabelMetadata` | no       | Listing filters — see table above                                              |
| `pageSize`                                                                                                                                   | no       | Restaurants per request (default 20)                                           |
| `maxItems`                                                                                                                                   | no       | Stop once this many restaurants have been pushed. Leave empty for all matches. |

### Output

One dataset row per restaurant (listing mode) or per suggestion component (search mode):

```json
{
    "code": "ejhq",
    "name": "Kung Pao - Gulshan",
    "address": "16/A, House #02, Gulshan-1, Dhaka",
    "cuisines": [{ "name": "Chinese" }],
    "budget": 3,
    "distance": 2.496,
    "rating": 4.8,
    "hero_image": "https://images.deliveryhero.io/image/fd-bd/LH/ejhq-listing.jpg"
}
```

### Pricing / Cost estimation

Billed **pay-per-event** — one `restaurant` event per restaurant scraped (or one `search-suggestions` event per suggestions query), plus a flat `apify-actor-start` event per run.

### FAQ, disclaimers, and support

This is an **unofficial** Actor, not affiliated with or endorsed by foodpanda or Delivery Hero SE. It calls foodpanda's own public mobile-app API (`{country}.fd-api.com`), the same one the real Android app uses for a signed-out user — no account credentials or bypassed authentication involved.

Found an issue or need a custom filter added? Use the **Issues** tab on this Actor's page.

# Actor input Schema

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

Market to search in.

## `lat` (type: `number`):

Coordinate to search near.

## `lng` (type: `number`):

Coordinate to search near.

## `query` (type: `string`):

If set, the Actor returns real-time search suggestions (matching terms + direct vendor deeplinks) instead of a filtered restaurant listing.

## `sort` (type: `string`):

All 4 values confirmed live, each returns a genuinely different top result. Listing mode only.

## `cuisine` (type: `integer`):

Numeric cuisine id, e.g. 86 = Fast Food in Bangladesh. Confirmed live to filter items. Real ids for the current market/location come back in the response's own aggregations.cuisines\[]. Listing mode only.

## `budgets` (type: `integer`):

Confirmed live to filter items by budget tier (1-4). Listing mode only.

## `paymentType` (type: `string`):

String id, e.g. credit_card, antfinancial_bkash, balance. Confirmed live to filter. Real ids in the response's own aggregations.payment_types\[]. Listing mode only.

## `foodCharacteristic` (type: `integer`):

Numeric id, e.g. 81 = Organic in Bangladesh. Confirmed live to filter. Real ids in the response's own aggregations.foodCharacteristics\[]. Listing mode only.

## `vertical` (type: `string`):

Confirmed live to switch the entire result set - e.g. darkstores returns foodpanda's grocery/pandamart vendors instead. Listing mode only.

## `verticalTypeIds` (type: `string`):

Confirmed live to further narrow results within a vertical. Listing mode only.

## `useFreeDeliveryLabel` (type: `boolean`):

NOT a filter - confirmed live it only toggles whether each item gets a free_delivery_label field. Listing mode only.

## `tagLabelMetadata` (type: `boolean`):

NOT a filter - confirmed live it toggles whether items' tags\[] carry full discount detail vs generic tag codes. Listing mode only.

## `pageSize` (type: `integer`):

Listing mode only.

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

Stop once this many restaurants have been pushed. Leave empty to fetch all matching restaurants. Listing mode only.

## Actor input object example

```json
{
  "country": "sg",
  "lat": 1.2838,
  "lng": 103.8591,
  "paymentType": "credit_card",
  "vertical": "restaurants",
  "useFreeDeliveryLabel": false,
  "tagLabelMetadata": false,
  "pageSize": 20,
  "maxItems": 20
}
```

# 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 = {
    "country": "sg",
    "lat": 1.2838,
    "lng": 103.8591,
    "paymentType": "credit_card",
    "maxItems": 20
};

// Run the Actor and wait for it to finish
const run = await client.actor("romy/foodpanda-restaurant-search-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 = {
    "country": "sg",
    "lat": 1.2838,
    "lng": 103.8591,
    "paymentType": "credit_card",
    "maxItems": 20,
}

# Run the Actor and wait for it to finish
run = client.actor("romy/foodpanda-restaurant-search-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 '{
  "country": "sg",
  "lat": 1.2838,
  "lng": 103.8591,
  "paymentType": "credit_card",
  "maxItems": 20
}' |
apify call romy/foodpanda-restaurant-search-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,romy/foodpanda-restaurant-search-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/o1C4KCCCOh8hcIIyu/builds/MhIf14OMWADajsm6g/openapi.json
