
Google Maps Reviews Scraper
scrape.ly/store/cornerledger/google-maps-reviews-scraperLead generationAutomation
3 monthly users

Scrape GrabFood restaurants, ratings, delivery fees, menus and prices across Southeast Asia. No login needed. Export to JSON, CSV or Excel.
Scrape GrabFood restaurant listings, ratings, delivery fees, menus and prices across Southeast Asia — then download structured food-delivery data as JSON, CSV or Excel. Search any food or dish, read full restaurant menus, and cover eight Grab markets without a login, a browser or your own anti-bot setup.
Give it a country and a search term (or a restaurant link), pick a city, and get clean rows with merchant IDs, cuisines, star ratings, delivery fees, ETAs, promos, and — when you want it — every menu item with its price and discount.
pizza, bubble tea), or paste Restaurant URLs or IDs, or turn on All restaurants near the location.latitude,longitude.Start with maxResults: 10 to check your query, then scale up.
| Field | Description |
|---|---|
country | GrabFood market: sg my ph vn id kh mm th |
searchTerms | Foods, dishes or shop names to search |
restaurantUrls | GrabFood restaurant links or merchant IDs to read directly |
nearbyRestaurants | Collect nearby restaurants with no search term |
city / latlng | Where to deliver (a known city, or exact coordinates) |
maxResults | Rows per search or restaurant (0 = no limit) |
includeMenuItems | Also emit menu products as rows |
businessType, minRating, maxDeliveryFee, onlyOpen, onlyWithPromo | Filters |
{
"country": "ph",
"searchTerms": ["pizza"],
"city": "Manila",
"maxResults": 20,
"includeMenuItems": false
}
Every restaurant is one row (rowType: "restaurant"); with Include menu items, each product is a rowType: "menuItem" row linked to its restaurant.
| Field | Description |
|---|---|
merchantId, name, url | Restaurant ID, name and GrabFood link |
cuisine, rating, ratingCount | Cuisines, star rating and number of ratings |
deliveryFee, currency, etaMinutes | Delivery fee, currency and estimated delivery time |
promoText, isOpen, distanceKm | Current promo, open status, distance from the pin |
address, city, openingHours | Full address and weekly hours (with details on) |
menuCategory, price, discountedPrice, discountPercent | Menu item fields (menu rows) |
{
"rowType": "restaurant",
"merchantId": "PHGFSTI000000zw",
"name": "Angel's Pizza - Legarda",
"url": "https://food.grab.com/ph/en/restaurant/angel-s-pizza-legarda-delivery/PHGFSTI000000zw",
"cuisine": "Pizza, Italian, Pasta",
"rating": 4.2,
"ratingCount": 23896,
"deliveryFee": 2.0,
"currency": "PHP",
"etaMinutes": 44,
"promoText": "₱50.00 off",
"isOpen": true,
"city": "Manila",
"countryCode": "PH"
}
This Actor uses pay-per-result: $0.002 per result — that is $2.00 per 1,000 rows (restaurants and, when enabled, menu items). You pay only for the rows the Actor keeps after your filters.
| Results | Approx. cost |
|---|---|
| 100 | ~$0.20 |
| 1,000 | ~$2.00 |
| 10,000 | ~$20.00 |
Platform usage (compute and datacenter proxy traffic) is billed on top at the platform's rates, but this Actor is pure-HTTP and streams compact JSON, so that usage is a small fraction of a cent per result. There is no per-start fee.
maxResults: 0 for no cap. Large runs page through all results and stream rows as they go.null, never invented.latitude,longitude in the Delivery point field.Migrating from a similar actor on another platform? This one keeps the same restaurant and menu fields and adds simple per-result pricing with no separate start fee.
Every field below can be set in the run form, passed through the API, or saved as a task. Unset fields fall back to the defaults shown.
countryenumRequireddefault "sg"Country
Which GrabFood market to scrape.
searchTermsarrayOptionalSearch terms
Food, cuisine, dish or shop names to search, one per line (for example "pizza", "bubble tea", "ramen"). Each term is searched around the chosen location.
restaurantUrlsarrayOptionalRestaurant URLs or IDs
Full GrabFood restaurant links (https://food.grab.com/ph/en/restaurant/.../PHGF...) or bare merchant IDs. Each one is read on its own page, with the full address, hours and menu.
nearbyRestaurantsbooleanOptionaldefault falseAll restaurants near the location
Collect the restaurants GrabFood lists around the location, with no search term. Combine with the result limit to cap how many.
citystringOptionalCity
City to deliver to (for example Manila, Cebu, Kuala Lumpur, Penang, Jakarta, Bali, Ho Chi Minh City, Hanoi). Leave empty to use the market's main city. Ignored when a delivery point is set.
latlngstringOptionalDelivery point (lat,lng)
Exact delivery point as "latitude,longitude" (for example 14.5547,121.0244). Use this for any address or neighbourhood not in the city list. Overrides the city.
maxResultsintegerOptionaldefault 20Max results per search or restaurant
Most rows to collect for each search term and for each restaurant (restaurants and their menu items count together). Set 0 for no limit. Large runs page until this limit or the end of the results.
includeMenuItemsbooleanOptionaldefault falseInclude menu items
Also emit each restaurant's menu products as separate rows (name, price, discount, options). Loads each restaurant's page.
includeDetailsbooleanOptionaldefault falseInclude full restaurant details
Load each restaurant's page to add the full address, postal code, weekly opening hours and menu size (on by default when menu items are included).
maxMenuItemsPerRestaurantintegerOptionaldefault 0Max menu items per restaurant
Cap on menu products emitted per restaurant. 0 means every item on the menu.
businessTypeenumOptionaldefault "all"Business type
Keep only food merchants, only mart/grocery merchants, or all.
minRatingnumberOptionalMinimum rating
Keep only restaurants with at least this star rating (0 to 5). Restaurants with no rating are dropped when set.
maxDeliveryFeenumberOptionalMaximum delivery fee
Keep only restaurants whose delivery fee (after any discount) is at most this amount, in the market's currency.
onlyOpenbooleanOptionaldefault falseOnly open now
Keep only restaurants that are open at scrape time.
onlyWithPromobooleanOptionaldefault falseOnly with a promo
Keep only restaurants that currently show a promotion or discount.
languageenumOptionaldefault "en"Language
Content language. "Local" uses each market's own language (Thai, Vietnamese, Bahasa, Khmer); otherwise English.
proxyConfigurationobjectOptionaldefault {"useScrapelyProxy":true,"scrapelyProxyGroups":["DATACENTER…Proxy configuration
Datacenter proxies work for GrabFood and are the cheapest. If GrabFood starts refusing them, the scraper switches to residential proxies in the market's country by itself.
Every run writes its results to a dataset. Preview it in the dashboard, then export it or read it through the API.
| Field | Type | Description |
|---|---|---|
| name | any | Restaurant |
| rowType | any | Row |
| businessType | any | Type |
| rating | any | Rating |
| ratingCount | any | Ratings |
| cuisine | any | Cuisine |
| deliveryFee | any | Delivery fee |
| etaMinutes | any | ETA (min) |
| promoText | any | Promo |
| isOpen | any | Open |
| city | any | City |
| countryCode | any | Country |
| url | any | URL |
| merchantId | any | Merchant ID |
You pay for the events the actor reports, such as each result or page it produces. Platform usage is included in the event prices.
| Event | Charged when | Price |
|---|---|---|
| Result | One GrabFood restaurant or menu item saved to the dataset. | $0.002 |
Run this actor from your own code. Swap in your API token and the examples work as-is.
import { ScrapelyClient } from 'scrapely-client'
const client = new ScrapelyClient({ token: process.env.SCRAPELY_TOKEN })
// Start the actor and wait for the run to finish.
const run = await client.actor('shelfbright/grab-scraper').call({
"country": "ph",
"searchTerms": [
"pizza"
],
"restaurantUrls": [],
"maxResults": 20,
"proxyConfiguration": {
"useScrapelyProxy": true,
"scrapelyProxyGroups": [
"DATACENTER"
]
}
})
// Read the dataset the run produced.
const { items } = await client.dataset(run.defaultDatasetId).listItems()
console.log(items)Tokens live in your account settings. Keep them server-side: a token carries the full permissions of your account.
Connect the Scrape.ly MCP server once and your agent can run this actor as a tool. Pick your tool:
Fetch scrape.ly/agents.md and run shelfbright/grab-scraperPaste into Claude Code, Codex, Cursor or any AI agent. It signs you in once in the browser.
{
"mcpServers": {
"scrapely": {
"url": "https://api.scrape.ly/mcp?tools=actors,runs,storage,docs&actors=shelfbright/grab-scraper"
}
}
}No key in the file: your client opens the browser to sign you in the first time it connects.
Inputs the developer prepared for common jobs. Open one to see its input, then copy it to your account to run it as-is or adjust it.
Keyword search in the Singapore market
At least 4 stars and a current promo
Nearby restaurants with no search term
Restaurants plus menu items and prices
Paste a GrabFood restaurant link

Scrape Google Maps places for any search term and city, with no code or with one API call. A real run, its output, its log and its exact cost, plus the limits and the legal side.
Read the article
Paste an Amazon search or product URL into a ready-made Actor and get one row per product with price, ASIN, rating and review count. This guide covers the no-code steps, the API, ZIP code pricing, a real run and its cost.
Read the article
Scrape Google search results by query and country and get each results page as JSON: organic results with positions, People Also Ask and related searches. Run it without code or from Python, with a real run, the cost per page and Google's terms.
Read the articleScrape.ly gives you the infrastructure, the tooling, and the team to extract, process, and operationalize web data at any scale. Setup takes minutes. The advantage lasts forever.