# foodpanda All-in-One API (`romy/foodpanda-all-in-one-api`) Actor

Unofficial always-on REST API for live foodpanda data in 11 Asian markets: home feed, real-time search, filtered restaurant listings, full detail pages, customer reviews and open/closed status. No account, app or device needed. Runs in Apify Standby.

- **URL**: https://apify.com/romy/foodpanda-all-in-one-api.md
- **Developed by:** [Romy](https://apify.com/romy) (community)
- **Categories:** E-commerce, Developer tools
- **Stats:** 1 total users, 0 monthly users, 0.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $3.12 / 1,000 restaurant listing requests

This Actor is paid per event and usage. You are charged both the fixed price for specific events and for Apify platform usage.
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 All-in-One API

**foodpanda All-in-One API** is an unofficial, always-on REST wrapper around foodpanda's own mobile app API, giving you live restaurant data across 11 Asian markets — restaurant listings near any coordinate, real opening-hours/rating/cuisine detail pages, and real-time open/closed status — with no [foodpanda](https://www.foodpanda.sg) account, app, or scraping infrastructure required. Because this Actor runs in [Standby mode](https://docs.apify.com/platform/actors/development/programming-interface/standby) on the Apify platform, you call it exactly like any other REST API and get JSON back in milliseconds, with Apify handling authentication, scaling, and monitoring for you.

### Why use foodpanda All-in-One API?

- **Market research** — track restaurant density, cuisine mix, and ratings across Singapore, Malaysia, Thailand, Hong Kong, Taiwan, Philippines, Pakistan, Bangladesh, Cambodia, Laos, and Myanmar.
- **Competitive intelligence** — monitor a competitor's foodpanda presence: rating trend, opening hours, delivery availability.
- **Delivery/logistics tooling** — check whether a specific vendor is currently accepting delivery orders before routing to it.
- **Lead generation** — build a list of restaurants in a target area with contact-relevant metadata (chain, cuisine, address).

### How to use foodpanda All-in-One API

1. Click **Try for free** and start this Actor (Standby mode starts it once and keeps it warm — no per-run startup cost).
2. Copy the Actor's Standby URL from the **Standby** tab.
3. Call any endpoint below directly, e.g. `GET {standby-url}/vendors?country=sg&lat=1.2838&lng=103.8591`.
4. No API key or foodpanda login needed — this is the exact same data the foodpanda app itself shows to a signed-out user.

You can also call it via the [Apify API](https://docs.apify.com/api/v2) client in your language of choice, or `curl`/`fetch` directly.

### Input

This Actor takes **no run-input configuration** — it starts immediately in Standby mode. Every real parameter (country, coordinates, vendor code) is passed per-request as HTTP query parameters. See **Endpoints** below or the Actor's *API* tab for the full OpenAPI schema.

### Endpoints

#### `GET /home`

The real home feed: cuisine categories, active campaigns, and a richer per-vendor shape (live availability status, rating, chain, delivery-time estimation) than `GET /vendors`.

| Param        | Required | Description                                                             |
| ------------ | -------- | ----------------------------------------------------------------------- |
| `country`    | yes      | One of `bd`, `hk`, `kh`, `la`, `mm`, `my`, `ph`, `pk`, `sg`, `th`, `tw` |
| `lat`, `lng` | yes      | Coordinates to search near                                              |

#### `GET /search`

Real-time search suggestions — matching search terms plus direct vendor deeplinks (name, image, URL) for name matches. The app's own search-bar-as-you-type endpoint.

| Param        | Required | Description                                                             |
| ------------ | -------- | ----------------------------------------------------------------------- |
| `country`    | yes      | One of `bd`, `hk`, `kh`, `la`, `mm`, `my`, `ph`, `pk`, `sg`, `th`, `tw` |
| `q`          | yes      | Search text                                                             |
| `lat`, `lng` | yes      | Coordinates for locally-relevant results                                |

#### `GET /vendors`

Restaurants/vendors near a location — the exact endpoint the app's own home feed and search screens are built on. Every filter below was individually verified live against the real API (not guessed): each was sent with a real value and the resulting `available_count`/items were confirmed to actually change.

| Param                     | Required | Description                                                                                                                                                       |
| ------------------------- | -------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------ |
| `country`                 | yes      | One of `bd`, `hk`, `kh`, `la`, `mm`, `my`, `ph`, `pk`, `sg`, `th`, `tw`                                                                                             |
| `lat`, `lng`              | yes      | Coordinates to search near                                                                                                                                        |
| `limit`, `offset`         | no       | Pagination (confirmed live)                                                                                                                                       |
| `sort`                    | no       | `distance_asc`, `rating_desc`, `popularity_desc`, or `delivery_time_asc` — all 4 confirmed live, each returns a genuinely different top result                    |
| `cuisine`                 | no       | Numeric cuisine id, e.g. `86` = Fast Food. Confirmed to filter items. Real ids for the current market/location are in the response's own `listing.aggregations.cuisines[]` |
| `food_characteristic`     | no       | Numeric id, e.g. `81` = Organic. Confirmed to filter items. Real ids in `listing.aggregations.foodCharacteristics[]`                                              |
| `budgets`                 | no       | Budget tier, `1`-`4`. Confirmed to filter (`budgets=1` and `budgets=3` return disjoint sets matching that `budget` value)                                        |
| `payment_type`            | no       | String id, e.g. `credit_card`, `antfinancial_bkash`, `balance`. Confirmed to filter (`payment_type=credit_card` cut 692 → 516 results, exactly matching the aggregation's own count). Real ids in `listing.aggregations.payment_types[]` |
| `vertical`                | no       | Default `restaurants`. Confirmed to switch the entire result set — e.g. `darkstores` returns foodpanda's grocery/pandamart vendors instead                       |
| `vertical_type_ids`       | no       | Confirmed to further narrow results within a vertical (e.g. `restaurants` under `vertical=restaurants` cut 692 → 544)                                            |
| `use_free_delivery_label` | no       | `true`/`false`. NOT a filter — confirmed it only toggles whether each item gets a `free_delivery_label` field; item set/order is unchanged                       |
| `tag_label_metadata`      | no       | `true`/`false`. NOT a filter — confirmed it toggles whether `items[].tags[]` carry full discount detail (`origin`, `label_metadata.deal.id`, real promo text) vs generic tag codes |
| `customer_type`           | no       | Default `regular`. Accepted and forwarded (matches what the real app sends for a signed-out user); no observable effect without a real logged-in session          |

#### `GET /vendors/:code`

Full restaurant detail page — name, address, opening hours, rating, cuisines, description. `:code` comes from a `/vendors` item's `code` field.

#### `GET /vendors/:code/reviews`

Real customer reviews — text, reviewer name, per-topic ratings, like count, date. Paginate with `page_key` (from a previous response's `pageKey`).

#### `GET /vendors/:code/status`

Real-time open/closed status for one vendor's delivery expedition.

### Output

Every response is plain JSON returned directly over HTTP — there's no dataset to download, since this Actor is a live API, not a batch crawler.

```json
{
    "success": true,
    "listing": {
        "available_count": 3705,
        "returned_count": 3,
        "items": [
            {
                "code": "s41f",
                "name": "PastaGo - Fresh Made Pasta (Vivo City)",
                "address": "1 Harbourfront Walk #B2-53 Vivocity Singapore S098585",
                "cuisines": [{ "name": "Italian" }, { "name": "Pasta" }],
                "distance": 4.693,
                "hero_image": "https://foodpanda.dhmedia.io/image/fd-sg/LH/ct0sa-listing.jpeg"
            }
        ]
    }
}
```

### Data table

| Field        | Description                                                                  |
| ------------ | ---------------------------------------------------------------------------- |
| `code`       | Vendor's unique code — use with `/vendors/:code` and `/vendors/:code/status` |
| `name`       | Restaurant name                                                              |
| `address`    | Full street address                                                          |
| `cuisines`   | Cuisine tags (Italian, Chinese, Halal, ...)                                  |
| `chain`      | Chain/brand info if the restaurant is part of one                            |
| `distance`   | Distance in km from the query coordinates                                    |
| `hero_image` | Listing image URL                                                            |
| `rating`     | Star rating + review count (on `/vendors/:code`)                             |

### Pricing / Cost estimation

This Actor is billed **pay-per-event** — you pay only for the endpoints you actually call, at a per-request price shown on the Actor's page. There's no per-minute compute cost since Standby mode keeps the Actor warm between calls.

### Tips

- Cache `/vendors` results client-side for a given area — restaurant listings don't change minute-to-minute.
- Use `/vendors/:code/status` sparingly and only right before you need a fresh open/closed check — it's a lightweight, focused call by design.

### 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 endpoints, the same ones the real Android app uses for a signed-out user — no account credentials, private data, or bypassed authentication are involved. Use responsibly and in line with foodpanda's Terms of Service.

Known limitation: menu items/individual product detail are not yet exposed by this Actor (foodpanda's GraphQL API serves that from a subgraph not currently reachable via the endpoint this Actor uses) — restaurant-level listing/detail/reviews/status are all covered.

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

# Actor input Schema

## Actor input object example

```json
{}
```

# Actor output Schema

## `api` (type: `string`):

This Actor doesn't write to a dataset — every response is returned directly over HTTP by its Standby web server. See the README / web server OpenAPI schema (webServerSchema) for the full endpoint list and response shapes (GET /vendors).

# 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 = {};

// Run the Actor and wait for it to finish
const run = await client.actor("romy/foodpanda-all-in-one-api").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 = {}

# Run the Actor and wait for it to finish
run = client.actor("romy/foodpanda-all-in-one-api").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 '{}' |
apify call romy/foodpanda-all-in-one-api --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,romy/foodpanda-all-in-one-api"
        }
    }
}
```

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/k6XOjYuikcxCJKeC3/builds/Yeqnuhne0wnKcSOOM/openapi.json
