Grab Scraper | GrabFood GrabMart SEA Menus avatar

Grab Scraper | GrabFood GrabMart SEA Menus

Pricing

from $2.20 / 1,000 results

Go to Apify Store
Grab Scraper | GrabFood GrabMart SEA Menus

Grab Scraper | GrabFood GrabMart SEA Menus

Scrape GrabFood restaurants, menus, cuisine SEO & GrabMart feeds across Singapore, Malaysia, Philippines, Thailand, Vietnam, Indonesia, Cambodia, and Myanmar. Extract merchant IDs, ratings, fees, menu items & prices, promos. Export Excel/CSV/JSON. Unofficial — not affiliated with Grab.

Pricing

from $2.20 / 1,000 results

Rating

0.0

(0)

Developer

kane liu

kane liu

Maintained by Community

Actor stats

1

Bookmarked

36

Total users

11

Monthly active users

4.9 hours

Issues response

a day ago

Last modified

Share

Grab Scraper — GrabFood & GrabMart (Southeast Asia)

Scrape GrabFood restaurant listings, menus, cuisine SEO pages, GrabMart feeds, and category shortcuts across Southeast Asia — then download structured food-delivery data as Excel, CSV, or JSON.

Use this Actor as a practical Grab data API for multi-market restaurant discovery, cuisine research, menu monitoring, Mart category mapping, and delivery-market tracking. Pick a country and mode, then get Dataset rows with merchant IDs, titles, ratings, delivery fees, menu items & prices, promo labels, and permalinks.

  • Scrape keyword search, cuisine SEO, recommended lists, restaurant menus, GrabMart merchants, chain / brand pages, category shortcuts, and startUrls
  • Cover 8 Grab markets: Singapore, Malaysia, Philippines, Thailand, Vietnam, Indonesia, Cambodia, Myanmar (sg my ph th vn id kh mm) with secondary cities (Cebu, Hanoi, Bali, Chiang Mai, Penang, …)
  • Extract merchantId, title, URL, rating, delivery fee / ETA when present, menu sections & item prices, cuisine tags, promo / icon labels, GrabMart merchants
  • Export to Excel / CSV / JSON, or connect Make, n8n, Zapier, Python, or the Apify API
  • Pay per event — Actor start + each Dataset result; platform usage is included (you do not pay separate Apify compute on top)

Unofficial tool. This Actor is not affiliated with, endorsed by, or sponsored by Grab Holdings or GrabFood / GrabMart. It collects publicly reachable listing surfaces and does not place orders, checkout, access private Grab accounts, or scrape GrabUnlimited login pricing. Taiwan (TW) and rides / brand WP are out of scope.

Compared with GrabFood Actors that cover restaurants-only, one country, or menus without Mart, this Actor focuses on 8-market SEA coverage with search, cuisine SEO, recommended, chain, Mart, category discovery, branch expansion, and restaurant menus in one input form.


What does the Grab Scraper do?

Grab Scraper lets you extract structured restaurant, menu, and Mart data from food.grab.com / mart.grab.com without operating your own anti-bot browser fleet. Give it a country and a mode (for example search, cuisine, restaurant, or mart), then start a run.

Under the hood, the Actor:

  1. Validates your input (mode, country, city / latlng / merchant identifiers, max results)
  2. Enforces free-tier caps when you are on a free Apify plan
  3. Collects GrabFood surfaces over a pure-HTTP guest-portal channel — search, cuisine, recommended, startUrls, restaurant menus, discoverCategories and mart run without a browser; directory reads the public sitemap and chain uses Chrome-UA SSR; no mode needs a browser slot
  4. Parses portal search, merchant detail (menu categories), and Mart feed signals into normalized Dataset records
  5. Writes INPUT_ECHO, RUN_SUMMARY (and ERROR_SUMMARY on failure) to the key-value store

You run it like any other Apify Actor — schedule it, call it from the API, or plug it into automations.

One Dataset row is one billed entity

Every Dataset row has rowType. Restaurants use rowType: "restaurant". Each menu product is a separate rowType: "menuItem" row and copies the restaurant ID, name, URL, and city. The legacy itemType field remains for compatibility, but menu products are no longer counted inside a restaurant row.

maxResults is the most Dataset rows for each keyword, start URL, restaurant, cuisine, chain, or directory target. The default is 70; larger values are collected in parts of 70, and the whole run stops at your maximum total charge. Restaurants, menu items, branch merchants, categories, promos, and labels all count together. Menu collection is capped per restaurant by maxMenuItemsPerRestaurant (25 by default).

includeMenuItems, expandBranches, emitCuisines, and emitPromoLabels default to off. Turn them on only when you want those separately billed child rows. List modes (search, cuisine, recommended, mart) otherwise return merchant rows only.

Location, long queries, and empty results

  • Leave city and latlng empty to search around the market's main city. A restaurantUrl or startUrls link from another market uses that market's own location, not the countryCode default.
  • When a run stops at maxResults, RUN_SUMMARY.nextCursor holds the position. Pass it as cursor with the same input to continue without repeats or gaps. nextCursor: null means the source is exhausted.
  • A run succeeds with zero rows only when Grab confirmed there is no match. Network or access failures fail the run instead of returning an empty Dataset.
  • RUN_SUMMARY.notes lists informational choices such as a category fallback or an ignored option. RUN_SUMMARY.warnings lists real problems.

What Grab data can I extract?

Public merchant directory

Use mode: "directory" for low-cost merchant discovery from GrabFood's public sitemaps. Choose countryCode and lang; optional sitemapCity selects an exact published city slug. Availability follows the current sitemap, not every ordering market or language.

Each row contains merchantId, URL, slug, country, language, sitemap city, lastmod, and provenance. Names derived from the URL are labeled nameSource: "url_slug". They are not verified display names, and directory membership does not prove that a merchant is currently open or deliverable.

sitemapShard and sitemapOffset start at zero. sitemapMaxShards defaults to one (maximum five). Continue using RUN_SUMMARY.diagnostics.nextCursor, preserving your country/language/city/date filters. Deduplicate merchant IDs across runs because live sitemap content can change. modifiedSince: "YYYY-MM-DD" filters inclusive sitemap publication dates; it does not detect menu or price changes. A fully filtered slice can succeed with zero rows.

Set enrichDetails: true to inspect at most maxEnrich public merchant pages. Only identity-matched restaurant data is accepted. A 200 page shell remains directoryOnly: true, detailStatus: "route_shell"; missing details are reported, not invented. Delivery-pin coordinates are never emitted as merchant coordinates. Use the restaurant mode for menus. Directory mode ignores search keyword, delivery city/latlng, and includeMenuItems; businessType: "MART" is unsupported.

This mode does not require residential proxies or browser sessions.

DataSearch / cuisine / recommendedRestaurant menuMartDiscover categoriesChain / startUrls
Merchant ID / slug / URL✅✅✅*—✅*
Title / name✅✅✅✅✅
Rating / delivery fee / ETA✅*✅*✅*—✅*
Cuisine tags / promo labels✅*✅*—✅✅*
Menu sections / items / prices—✅——✅*
Branch merchants✅*———✅*

*When present on the page or portal payload. Mart mode returns GrabMart merchant rows; startUrls restaurant links return menus with includeMenuItems.

Merchant lead and contact fields

Every Dataset item exposes the same lead-field shape, including when a field was not observed. The currently verified merchant lead path is the public Indonesian chain page: its server-rendered branch cards provide the branch organization and a numbered street address.

FieldTypeGrab-specific meaning
phones[{value, type, e164?}]Merchant phone numbers when observed. The verified chain sample returns [] and records phones: 未验证 in leadAbsences; this does not mean Grab has no merchant phone data anywhere.
emails[{value, type}]Merchant email addresses when observed. The verified chain sample returns [] with emails: 未验证, not 本站无.
address{street, unit, locality, region, postalCode, country, full}Branch address from the chain card. unit is the visible street-number token, for example No. 55-56; full preserves the complete source address.
geo{lat, lng} or nullMerchant coordinates, supplementary to the street address. Coordinates were not present on the verified chain cards, so the sample records geo: 未验证.
person{name, role?} or nullA named merchant contact. No merchant person was observed on the reached chain or route-shell surfaces, so this is 未验证.
org{name, id?}Merchant branch organization and Grab merchant ID. Verified examples include McDonald's - Cideng and IDGFSTI000020id.
web{website, socials[]}Per-merchant website and social profiles. These remain 未验证 for the verified chain sample. Grab corporate links from an About page are platform information, not merchant leads.
leadSourcesearch|detail|entity|contact|reveal-xhrWhere the lead came from. Verified chain branch rows use entity.
leadRevealvisible|click|xhr|gated|image|absentHow the lead was revealed. Chain organization and address are already visible, so verified rows use visible.
leadAbsencesobject/mapPer-field reason for an empty or null value. 未验证 means the field was not established on the measured surface; 闸门锁 is reserved for a measured access gate; 本站无 is used only when absence is actually verified.

Reveal cost

The verified chain lead path needs one public chain-page request. Organization and address are present in the server-rendered branch anchors, so it requires no click-to-reveal action, contact XHR, login, or merchant-detail request. This keeps lead extraction to the chain page itself. Restaurant menu requests add merchant-detail calls for menu data, but they do not imply that phone, email, person, coordinates, or per-merchant web profiles were revealed.

Honest lead limitations

  • Verified guest-visible merchant leads are limited to branch org plus a numbered address on the Indonesian chain SSR surface.
  • Merchant phones, emails, person, geo, web.website, and web.socials are unverified, not confirmed absent from Grab.
  • The reached restaurant URL returned a route shell with a merchant ID but no merchant business fields. A merchant ID alone is not treated as successful detail enrichment.
  • GrabFood and GrabMart browser/CDP attempts were blocked by a CloudFront 403 gate during validation. The Actor does not treat that response as HTML data and does not convert it into a claim that merchant leads are absent.
  • Grab corporate headquarters/address/social data from an About page is supporting platform information only. It is never substituted for a restaurant or shop lead.

Why scrape GrabFood / GrabMart?

Grab is one of the largest food-delivery and quick-commerce platforms in Southeast Asia. Teams scrape Grab to:

  • Map restaurant supply by city, cuisine, or chain across SEA markets
  • Track menus and prices for competitive monitoring
  • Build delivery-market datasets (ratings, fees, promos, cuisine mix)
  • Inventory GrabMart categories and nearby merchants near a delivery pin
  • Seed CRM / research workflows with merchant IDs and GrabFood URLs

More Actors like this

Need restaurant / delivery data outside Grab, or a different vertical? Use a dedicated Actor below for structured fields. Use this Actor for GrabFood / GrabMart across Southeast Asia.

Similar food delivery scrapers

Prefer another specialized scraper?

If your target has a specialized Actor below, use that first — usually cheaper and more structured than a generic scrape.

Jobs & Freelance

Real Estate

E-commerce

Social & Content

Ads Intelligence

General Tools

→ See the full catalog in Related Actors below, or browse apify.com/lentic_clockss.


How to scrape GrabFood / GrabMart (no code required)

  1. Create a free Apify account
  2. Open Grab Scraper
  3. Choose a mode: search, restaurant, mart, chain, cuisine, recommended, startUrls, or discoverCategories
  4. Choose a countryCode (default ph)
  5. Enter a city / latlng, keyword, cuisineSlug, merchantId / restaurantUrl, chainName, or startUrls
  6. (Optional) Set maxResults, includeMenuItems (restaurant pages), maxMenuItemsPerRestaurant, emitPromoLabels, emitCuisines, expandBranches, lang, or a cursor from an earlier run
  7. Click Start and download the Dataset as JSON, CSV, Excel, or JSONL

Start with maxResults: 5–10 to verify the query, then scale up.

Connect to your tools

PlatformHow
Make.comApify → Run Actor → lentic_clockss/grab-scraper
n8nApify node → Run Actor
ZapierApify → Run Actor
API / SDKApify Client (actorId: lentic_clockss/grab-scraper)

How much does it cost to scrape Grab?

This Actor uses pay-per-event pricing. You are charged for:

EventPrice
Actor Start (apify-actor-start)$0.005 per start
Result (apify-default-dataset-item)$3.00 / 1,000 results ($0.003 each on FREE/BRONZE)

Platform usage costs are included — you do not pay separate Apify compute/proxy usage for this Actor on top of the event prices above (User pays platform usage costs = No).

Store tier pricing (results)

Tier$/1,000per result
FREE*$3.00$0.003
BRONZE$3.00$0.003
SILVER$2.60$0.0026
GOLD$2.20$0.0022
PLATINUM$2.00$0.002
DIAMOND$1.60$0.0016

*Store tier discounts apply to paying Apify customers on higher tiers.

Example cost estimates

Results collectedApprox. event cost*
100~$0.31
1,000~$3.01
10,000~$30.01

*Assumes one Actor start at default memory billing for start events, plus $0.003 per Dataset item on FREE/BRONZE. Exact start billing can scale with allocated memory (one start event per GB, minimum one).

Free Apify trial credit can cover a small test run — try maxResults: 5 first.

Free Apify plan limits (Actor-enforced)

CapFree Apify planPaying
Runs of this Actor10 totalUnlimited
Results per run200Schema max

Limits are set by the Actor developer, not Apify. Quota hits return SUCCEEDED with RUN_SUMMARY.status=FREE_TIER_LIMIT.


Input examples

Keyword search (Philippines)

{
"mode": "search",
"countryCode": "ph",
"city": "manila",
"keyword": "chicken",
"businessType": "FOOD",
"maxResults": 20
}

Cuisine SEO (Cebu pizza)

{
"mode": "cuisine",
"countryCode": "ph",
"city": "cebu",
"cuisineSlug": "pizza",
"emitPromoLabels": true,
"maxResults": 20
}

Restaurant menu

{
"mode": "restaurant",
"countryCode": "sg",
"merchantId": "SGXXXXXXXX",
"includeMenuItems": true,
"maxResults": 100
}

GrabMart feed (Penang)

{
"mode": "mart",
"countryCode": "my",
"city": "penang",
"keyword": "snacks",
"maxResults": 30
}

Discover category shortcuts (Myanmar)

{
"mode": "discoverCategories",
"countryCode": "mm",
"city": "yangon",
"maxResults": 50
}

Chain branches with addresses

{
"mode": "chain",
"countryCode": "id",
"chainName": "mcdonalds",
"maxResults": 40
}

Output example

{
"rowType": "restaurant",
"itemType": "merchant",
"businessType": "FOOD",
"source": "ph",
"countryCode": "ph",
"merchantId": "PHGFB000000",
"title": "Example Chicken",
"name": "Example Chicken",
"url": "https://food.grab.com/ph/en/restaurant/example/PHGFB000000",
"rating": 4.6,
"deliveryFee": 29,
"scrapedAt": "2026-08-02T12:00:00+00:00"
}

Dataset views expose Row type, Type, Biz, Title, Country, Merchant, URL, Price, Rating, and Scraped. Menu products use rowType=menuItem; restaurants use rowType=restaurant. Optional menu, branch, category, promo, and label rows share that input's maxResults budget.


Tips for better Grab datasets

  • Match city to countryCode (e.g. cebu + ph, not a PH city with my)
  • Use maxResults: 5–10 first; larger values are collected in parts of 70.
  • Child rows default off. Enable includeMenuItems, expandBranches, emitCuisines, or emitPromoLabels only when you need those separately billed rows.
  • Some Thailand portal fetches can be unstable from distant egress — retry or switch market for smoke tests
  • Production jobs should use a normal Actor run (Dataset + KV). Standby /search is for capped Live-view previews only

FAQ

Is this an official Grab API?

No. It is an unofficial scraper for publicly reachable GrabFood / GrabMart pages. Not affiliated with Grab.

Do I need my own proxies?

No. Residential egress is handled by the Actor backend. You do not mint Apify proxy in the Actor input for normal runs.

Can I scrape menus?

Yes — use mode=restaurant with restaurantUrl or merchantId (or restaurant links in startUrls) and set includeMenuItems: true. Each menu item is its own billed row.

Does platform usage cost extra?

No. With this Actor’s pay-per-event setup, users do not pay separate Apify platform usage on top of Actor Start + result events.

What about GrabUnlimited or login prices?

Out of scope. This Actor does not log in or scrape member-only pricing.

What about Taiwan?

Taiwan (TW) is out of scope for this Actor.


Use this Actor only for legitimate purposes and in compliance with applicable laws and Grab’s terms. Do not scrape personal data you are not entitled to process. Respect rate limits and do not use the data to harm merchants, riders, or diners.


Support

Questions or feature requests? Open an issue on the Actor page or contact the developer via Apify Console.

Keywords: Grab scraper, GrabFood scraper, GrabMart scraper, Grab menu scraper, Grab restaurant scraper, GrabFood API, Southeast Asia food delivery data, Singapore Grab, Malaysia Grab, Philippines GrabFood, Thailand Grab, Vietnam GrabFood, Indonesia Grab, Cambodia Grab, Myanmar Grab, cuisine SEO, merchant ID, pay per event


All public Actors from [lentic_clockss]. Click a name to open the Store detail page.

Food Delivery

Jobs & Freelance

Real Estate

E-commerce

Travel & Stays

Social & Content

Ads Intelligence

Local & Maps

General Tools

→ Browse the full profile: apify.com/lentic_clockss