Foodpanda Scraper - Restaurants, Menus and Reviews
Pricing
from $2.20 / 1,000 results
Foodpanda Scraper - Restaurants, Menus and Reviews
Extract Foodpanda restaurants, menu items, shops and reviews across 10 Asia-Pacific markets, including Singapore, Hong Kong, Malaysia and Taiwan. Pay per delivered row plus a start fee.
Pricing
from $2.20 / 1,000 results
Rating
0.0
(0)
Developer
kane liu
Maintained by CommunityActor stats
1
Bookmarked
12
Total users
2
Monthly active users
2 days ago
Last modified
Categories
Security
Limited permissionsShare
Foodpanda Scraper
Export Foodpanda restaurants, menu items, shops and reviews from supported Asia-Pacific markets as structured rows.
- Find restaurants by city, cuisine, chain or page URL.
- Collect menu prices, variations and topping options when available.
- Read written reviews or a rating summary when no written reviews exist.
- Discover city and cuisine slugs for your next input.
- Pay $3.00 per 1,000 delivered rows on the Free plan, plus a small start fee.
What does Foodpanda Scraper do?
Foodpanda Scraper collects public listing, restaurant and review data from Foodpanda country sites. Supported market codes are sg (Singapore), hk (Hong Kong), my (Malaysia), tw (Taiwan), ph (Philippines), pk (Pakistan), bd (Bangladesh), kh (Cambodia), mm (Myanmar) and la (Laos). Availability varies by market and page.
- Listings:
cuisine,city,chainandshopsselect restaurants or shops. - Restaurant details:
restaurantselects one restaurant; menu-item rows requireincludeMenuItems: true. - Reviews:
reviewsreturns written reviews, or one rating-summary row when only star ratings are available. - Discovery:
discoverCitiesanddiscoverCuisinesreturn reusable slugs. - Several URLs:
startUrlsaccepts several Foodpanda page links. - Optional menus:
includeMenuItemsandenrichMenusare off by default. Each menu-item row is billed like a restaurant row and shares its input's row limit.
What data can you extract from Foodpanda?
Fields depend on the row type and what Foodpanda exposes. Rows include rowType, id, market and scrapedAt. Identifiers should be interpreted with their market and row type. Examples below illustrate the format, not a current restaurant offer.
Restaurant rows (restaurant)
| Field | Description | Example |
|---|---|---|
vendorCode | Restaurant identifier | fqow |
title | Restaurant name | Example Pizza |
url | Restaurant page | https://www.foodpanda.sg/restaurant/fqow/example |
rating | Published rating, when present | 4.5 |
ratingCount | Number of ratings | 120 |
restaurantCity | City name or slug | singapore |
chainName | Chain name, when available | Example Pizza |
minimumOrderAmount | Published minimum order amount | 10 |
minimumDeliveryFee | Published minimum delivery fee | 2.5 |
restaurantAddress | Public restaurant address when available | Example restaurant address |
Menu-item rows (menuItem)
| Field | Description | Example |
|---|---|---|
productId | Menu product identifier | product-123 |
name | Product name | Margherita Pizza |
categoryName | Menu category | Pizza |
price | Listed price; interpret in the market's currency | 12.9 |
discountedPrice | Discounted product price when shown | 10.9 |
productVariations | Available product options | [] |
toppings | Available topping details | [] |
restaurantId | Parent restaurant identifier | fqow |
restaurantName | Parent restaurant name | Example Pizza |
Review rows (review)
| Field | Description | Example |
|---|---|---|
reviewId | Review identifier | review-123 |
text | Written review | The order arrived warm. |
rating | Overall review rating | 5 |
createdAt | Published date when supplied | 2026-10-01T12:00:00Z |
vendorCode | Reviewed restaurant | fqow |
Rating-summary rows (reviewSummary)
| Field | Description | Example |
|---|---|---|
rating | Restaurant rating | 4.5 |
ratingCount | Total star ratings | 120 |
writtenReviewCount | Written reviews in this fallback | 0 |
ratingsDistribution | Counts by star rating | {"5": 80, "4": 40} |
City rows (city)
| Field | Description | Example |
|---|---|---|
citySlug | Value for a city input | singapore |
name | Displayed city name | Singapore |
url | City page | https://www.foodpanda.sg/city/singapore/ |
Cuisine rows (cuisine)
| Field | Description | Example |
|---|---|---|
cuisineSlug | Value for a cuisine input | pizza |
citySlug | Associated city | singapore |
name | Displayed cuisine name | Pizza |
Shop listings
Shop listings can use rowType: "restaurant"; do not identify shops from the row type alone.
| Field | Description | Example |
|---|---|---|
verticalKind | Shop classification | shops |
shopVertical | Available shop category | grocery |
vendorCode | Shop identifier | abcd |
How to scrape Foodpanda
- Open Foodpanda Scraper in Apify Console.
- Choose
marketand fill your target fields. - Set
maxResultsto 3 for a first run. - Click Start and wait for the run to finish.
- Open the dataset and download rows or read them through the API.
An empty input uses the form's Singapore pizza example, capped at 3 rows. This is a billed example run, not a promise of free data. With mode: "auto", filled fields select the mode: startUrls, restaurant URL or vendor code, chain name, city plus cuisine, then city alone.
Cuisine
Fill citySlug and cuisineSlug. Copy slugs from Foodpanda links rather than translating them yourself.
Restaurant
Fill restaurantUrl or vendorCode, with vendorSlug when known. Enable includeMenuItems for separate product rows; the restaurant row also uses one row of the limit.
City
Fill only citySlug to select city listings automatically. Remove an unwanted cuisine value left in the form.
Shops
Choose mode: "shops" and fill citySlug for shops or pandamart listings. Coverage depends on the selected market.
Discover cities
Choose mode: "discoverCities". No target field is required; returned citySlug values can be reused.
Discover cuisines
Choose mode: "discoverCuisines" and optionally a city. Otherwise the Actor uses the market's sample city.
Chain
Fill chainName. A partial name is accepted. Set city and cuisine explicitly to control the search; omitted values use the market's sample city and pizza.
Start URLs
Fill startUrls with Foodpanda restaurant, city or cuisine links. Each link is a separate input. Other modes do not use this list.
Reviews
Choose mode: "reviews" explicitly with a restaurant URL or vendor code. A restaurant target alone does not select reviews.
What to fill in
| Field | What to enter | Default |
|---|---|---|
mode | Automatic selection or one mode above | auto |
market | Supported country code | sg |
citySlug | City URL slug | Example: singapore |
cuisineSlug | Cuisine URL slug | Example: pizza |
restaurantUrl | Full Foodpanda restaurant link | Empty |
vendorCode | Code following /restaurant/ | Empty |
vendorSlug | Restaurant-name part after the code | Empty |
chainName | Chain name or partial name | Empty |
startUrls | Array of page links | Empty |
maxResults | Row limit per input, 1–500 | 70; form example 3 |
includeMenuItems | Deliver separate menu-item rows | false |
maxMenuItemsPerRestaurant | Menu-item cap per restaurant, 0–200 | 20 |
includeToppings | Retain topping identifiers on variations | true |
enrichMenus | Request menus from listings; also enable includeMenuItems | false |
maxEnrich | Maximum listing restaurants to enrich, 0–50 | 5 |
loadMoreRounds | Additional listing expansion rounds, 0–20 | 0 |
lang | Optional page-language prefix; usually leave empty | Empty |
locale | Compatibility alias for market | Empty |
cursor | Previous RUN_SUMMARY.nextCursor for continuation | Empty |
proxyCountry | Leave empty; country is selected from the market | Automatic |
Automatic selection:
{"citySlug": "singapore", "cuisineSlug": "pizza", "maxResults": 3}
Cuisine:
{"mode": "cuisine", "market": "sg", "citySlug": "singapore", "cuisineSlug": "pizza", "maxResults": 3}
Restaurant with menu items:
{"mode": "restaurant", "market": "sg", "vendorCode": "fqow", "includeMenuItems": true, "maxResults": 5}
City:
{"mode": "city", "market": "ph", "citySlug": "manila", "maxResults": 3}
Shops:
{"mode": "shops", "market": "sg", "citySlug": "singapore", "maxResults": 3}
Discover cities:
{"mode": "discoverCities", "market": "hk", "maxResults": 3}
Discover cuisines:
{"mode": "discoverCuisines", "market": "hk", "citySlug": "hong-kong", "maxResults": 3}
Chain:
{"mode": "chain", "market": "sg", "chainName": "Pizza Hut", "citySlug": "singapore", "cuisineSlug": "pizza", "maxResults": 3}
Start URLs:
{"mode": "startUrls", "market": "sg", "startUrls": ["https://www.foodpanda.sg/city/singapore"], "maxResults": 3}
Reviews:
{"mode": "reviews", "market": "sg", "vendorCode": "fqow", "maxResults": 3}
maxItems and limit are aliases of maxResults. Unknown fields do not themselves fail the run: close misspellings can be corrected; others are ignored with a note. Each run writes its input interpretation to INPUT_REPORT in the default key-value store. Invalid targets or values can stop before collection with INVALID_INPUT: <field> — <how to fix>. No rows are charged then, but the start fee still applies.
Output example
Illustrative restaurant row:
{"rowType": "restaurant","itemType": "restaurant","id": "fqow","vendorCode": "fqow","title": "Example Pizza","name": "Example Pizza","market": "sg","url": "https://www.foodpanda.sg/restaurant/fqow/example","rating": 4.5,"ratingCount": 120,"scrapedAt": "2026-10-24T00:00:00Z"}
Export the dataset as JSON, CSV, Excel, XML, RSS or an HTML table. RUN_SUMMARY contains row counts, warnings and a continuation cursor when available. Check it for partial results; ERROR_SUMMARY describes hard failures.
Why use this Foodpanda scraper?
- Row-based billing: apart from the start fee, pay for delivered rows, not pages attempted.
- Partial delivery: available rows returned after a stop or timeout are still delivered within the limit. A manual abort does not guarantee recovery of unfinished work.
- Useful relationships: menu-item rows carry parent restaurant identifiers and details when available.
- No invented source values: unavailable ratings, prices and addresses remain missing or empty.
- Several inputs: collect multiple page links through
startUrls. - No proxy setup: you do not need to set up proxies.
How much does it cost to scrape Foodpanda?
The Actor uses pay-per-event pricing. At the default 512 MB memory, one start costs $0.005 on every plan. Start events are counted per GB of allocated memory, with a minimum of one event. Platform usage is included in these prices.
| Apify plan | Start at 512 MB | Price per row | Price per 1,000 rows |
|---|---|---|---|
| Free | $0.005 | $0.003 | $3.00 |
| Starter | $0.005 | $0.003 | $3.00 |
| Scale | $0.005 | $0.0026 | $2.60 |
| Business | $0.005 | $0.0022 | $2.20 |
| Platinum | $0.005 | $0.002 | $2.00 |
| Diamond | $0.005 | $0.0016 | $1.60 |
maxResults applies per input, defaults to 70 and accepts up to 500. Larger requests are collected in parts of 70. Restaurant, menu-item, review and discovery rows share the limit, rather than receiving separate allowances.
Free-plan runs are capped at 200 rows, with 10 runs of this Actor. The whole run is bounded by Maximum cost per run (maxTotalChargeUsd in the API). A reached free quota is reported as RUN_SUMMARY.status: "FREE_TIER_LIMIT", even if the run ends successfully.
Example: one input delivering 3 rows at 512 MB costs 3 × $0.003 + $0.005 = $0.014 on the Free plan. Three menu-item rows cost the same as three restaurant rows; the restaurant row itself also counts if delivered.
What happens when the run timeout is too short
When automatic resumption is accepted and the estimated work exceeds the remaining timeout, the run can pause rather than fail. Its status message explains that it will resume automatically and gives an estimated wait; the run temporarily appears as ABORTED.
When results are ready, the same run can resume, deliver to the same dataset and finish as SUCCEEDED. Rows already delivered are skipped so they are not delivered or charged twice. When skipping earlier rows, the status reports Resumed: delivering N rows. No manual restart is needed for this automatic pause.
Automatic pauses are limited to 3 per run. Keep the default timeout of 3600 seconds to reduce pauses. Other failures can still prevent completion.
The synchronous API endpoints run-sync and run-sync-get-dataset-items wait at most 300 seconds and may return an empty dataset while the run is paused. For longer requests, start asynchronously and read the dataset after SUCCEEDED, or use a succeeded-event webhook.
Use with AI agents and the API
Apify MCP server
Add this remote tool to a compatible Claude, ChatGPT, Cursor or VS Code client:
https://mcp.apify.com?tools=lentic_clockss/foodpanda-scraper
Sign in with Apify using OAuth, or send Authorization: Bearer <YOUR_APIFY_TOKEN>. The tool returns run and dataset IDs; the agent can read rows with get-dataset-items. Clients without remote support can use npx @apify/actors-mcp-server --tools lentic_clockss/foodpanda-scraper with APIFY_TOKEN configured.
Example prompt: "Get 3 Foodpanda pizza restaurant rows in Singapore and return their names, ratings and URLs."
Apify API
from apify_client import ApifyClientclient = ApifyClient("<YOUR_APIFY_TOKEN>")run = client.actor("lentic_clockss/foodpanda-scraper").call(run_input={"market": "sg", "citySlug": "singapore", "cuisineSlug": "pizza", "maxResults": 3})for row in client.dataset(run["defaultDatasetId"]).iterate_items():print(row)
import { ApifyClient } from 'apify-client';const client = new ApifyClient({ token: '<YOUR_APIFY_TOKEN>' });const run = await client.actor('lentic_clockss/foodpanda-scraper').call({market: 'sg', citySlug: 'singapore', cuisineSlug: 'pizza', maxResults: 3});const { items } = await client.dataset(run.defaultDatasetId).listItems();console.log(items);
For asynchronous HTTP calls, send input JSON to POST https://api.apify.com/v2/acts/lentic_clockss~foodpanda-scraper/runs with your token in the Authorization: Bearer header. Read rows with GET https://api.apify.com/v2/datasets/<datasetId>/items?format=json after completion.
Integrations
Use the Integrations tab to connect Google Sheets, Make, Zapier, n8n, Slack, Airtable or a webhook. Apify Schedules can repeat saved inputs.
FAQ
Is it legal to scrape Foodpanda?
Public availability is not blanket permission. You are responsible for Foodpanda's terms and applicable data-protection law. Processing personal data requires a lawful basis.
Why did my run end as ABORTED?
It may be an automatic pause before resumption. Read the status message: a manual abort is different and does not imply that the run will restart.
How many results can I get?
Request 1–500 rows per input, subject to availability and your charge limit. The Free plan allows up to 200 rows per run and 10 runs of this Actor.
Why are some fields empty?
Foodpanda does not expose every field on every page. Listing rows may have less detail than restaurant rows. Missing fields do not prove that a restaurant lacks that information.
Is this an official Foodpanda API?
No. This scraper is not affiliated with Foodpanda or Delivery Hero.
Can I collect menus and toppings?
Yes. Enable includeMenuItems; for listing modes also enable enrichMenus. Keep includeToppings enabled to retain available topping identifiers. Menu items consume the same limit as restaurant rows.
What if a restaurant has no written reviews?
If star ratings exist, review mode can return one reviewSummary row instead. No ratings can produce vendorHasNoRatings; verify the vendor code.
Is Thailand supported?
No. Thailand is outside the supported market list.
Limitations
- No orders, checkout, payments or private account data.
- No guarantee of every restaurant, historical review or menu item in a market.
- Shops and pandamart availability varies; a listed mode does not guarantee rows for every city.
- Keep
langempty unless needed; a forced/en/path can fail in Hong Kong. Taiwan city and cuisine slugs may use local spellings. - Prices and availability are snapshots, not checkout quotes. Optional menu collection can fail while restaurant rows remain available.
Related scrapers
More food delivery and grocery scrapers from the same publisher:
- Grab Scraper
- iFood Scraper
- PedidosYa Scraper
- Uber Eats Scraper
- Deliveroo Scraper
- Foodora Scraper
- DoorDash Scraper
- Rappi Scraper
Browse all of our scrapers at apify.com/lentic_clockss.
Support
Report problems or request a field through the Issues tab of this Actor's page. Include the run ID and the input you used.