
TikTok Shop Scraper
scrape.ly/store/shelfbright/tiktok-shop-scraperE-commerceSocial media
1 monthly user

Scrape Zomato restaurants by city, locality, cuisine, dish or collection: rating, votes, cuisines, cost for two, address, phone, hours, coordinates and menu images, plus reviews. No login needed.
Scrape Zomato restaurants in any Indian city: name, rating and votes, dining and delivery ratings, cuisines, cost for two, address, phone numbers, opening hours, GPS coordinates, menu images, photos and highlights. Switch to review mode to collect restaurant reviews with rating, text, date and reviewer. Paste Zomato links or just type a city, cuisine or locality. No login needed.
| Field | Description |
|---|---|
startUrls | Zomato restaurant pages or list pages (city, locality, cuisine, dish, collection). |
city | City slug as in Zomato links: bangalore, ncr, mumbai, pune, hyderabad, … |
searchTerms | Cuisines or dishes for the city: biryani, pizza, north indian, cafes. |
localities | Neighbourhoods for the city: Koramangala, Bandra West. |
maxResults | Maximum restaurants per run (default 20). |
scrapeType | restaurants (default) or reviews. |
includeDetails | Phones, coordinates, hours, menu images and more (default on). With details off, a restaurant whose list card shows no open/closed status still gets its hours (timing) from its page. |
maxReviewsPerRestaurant, reviewSort, reviewType | Review mode options. |
{
"city": "bangalore",
"searchTerms": ["biryani", "momos"],
"localities": ["Indiranagar"],
"maxResults": 100
}
Restaurant rows:
| Field | Description |
|---|---|
restaurantId, name, url, shortUrl | Restaurant and link |
rating, ratingText, votes, diningRating, diningReviews, deliveryRating, deliveryReviews | Ratings |
cuisines, costForTwo, costForTwoText, costForOneText, paymentInfo | Food and price |
address, locality, city, zipcode, latitude, longitude | Location |
phone, phones | Published phone numbers |
timing, statusText, openingHours | Hours |
highlights, knownFor, topTags, menuImages, photos, imageUrl | Details and media |
deliveryTime, hasOnlineOrdering, offers, isPromoted | Delivery list fields |
{
"restaurantId": 18000000,
"name": "Example Biryani House",
"url": "https://www.zomato.com/bangalore/example-biryani-house-indiranagar-bangalore",
"locality": "Indiranagar, Bangalore",
"address": "12, 100 Feet Road, Indiranagar, Bangalore",
"zipcode": "560038",
"latitude": 12.9719,
"longitude": 77.6412,
"phone": "+919800000000",
"cuisines": ["Biryani", "North Indian"],
"rating": 4.3,
"ratingText": "Very Good",
"votes": 1966,
"diningRating": 4.3,
"deliveryRating": 4.1,
"costForTwo": 800,
"costForTwoText": "₹800 for two",
"openingHours": [{"days": "Mon-Sun", "hours": "11am – 11pm"}],
"highlights": ["Lunch", "Dinner", "Takeaway available", "Indoor seating"],
"menuImages": [{"label": "Food", "pages": 6, "url": "https://b.zmtcdn.com/data/menus/..."}]
}
Review rows (review mode):
| Field | Description |
|---|---|
reviewId, reviewUrl, restaurantId, restaurantName, restaurantUrl | Review and restaurant |
rating, ratingText, experience, reviewText | 1–5 rating, label, dining or delivery, text |
date, dateApprox | Zomato's date ("12 days ago", "Mar 01, 2023") and an approximate ISO date |
userName, userId, userProfileUrl, userFollowersCount | Reviewer |
likeCount, commentCount, positiveTags, negativeTags, photos, ownerReplies | Engagement and replies |
{
"reviewId": 520000000,
"restaurantName": "Example Biryani House",
"rating": 5,
"ratingText": "Excellent",
"experience": "dining",
"reviewText": "Great biryani and quick service.",
"date": "12 days ago",
"dateApprox": "2026-10-04",
"userName": "Asha R.",
"likeCount": 0,
"ownerReplies": [{"text": "Thank you for visiting!", "author": "Example Biryani House", "date": "10 days ago"}]
}
Platform usage is small and paid separately: about $0.03 to $0.15 for 1,000 restaurants with full details, and about $0.02 for 1,000 restaurants without details. So 1,000 restaurants with details cost about $4.05 to $4.15 in total, and 1,000 reviews about $2.55.
Is it legal to scrape Zomato? The actor reads public restaurant pages that any visitor can open. Use the data in line with Zomato's terms and data protection laws.
Do I need a Zomato account or a proxy? No. No login and no proxy setup.
How many restaurants can I get? Zomato shows only the first few hundred restaurants of any single list (about 500 for a whole city). Add cuisines, dishes or localities to reach more; duplicates across lists are removed.
Why is a field empty? Not every restaurant publishes phone numbers, hours or menus. Delivery-only fields (delivery time, online ordering) are filled from delivery pages.
Can I schedule it or use the API? Yes. Schedule runs for rating tracking or new reviews and read results through the API or integrations.
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.
startUrlsarrayOptionalZomato URLs
Restaurant pages (zomato.com/bangalore/truffles-koramangala, …/info, …/reviews, …/order) or list pages: a city (zomato.com/ncr/restaurants), a locality (…/koramangala-restaurants), a cuisine (…/restaurants/biryani), a delivery dish page or a collection.
citystringOptionalCity
Search a city instead of pasting URLs, as it appears in Zomato links: bangalore, ncr (Delhi NCR), mumbai, pune, hyderabad, chennai, kolkata, ahmedabad, jaipur, goa, …
searchTermsarrayOptionalCuisines or dishes
Optional, with a city: cuisines or dishes such as biryani, pizza, north indian, cafes, momos. Leave empty for all restaurants of the city.
localitiesarrayOptionalLocalities
Optional, with a city: neighbourhoods such as Koramangala, Indiranagar, Bandra West.
maxResultsintegerOptionaldefault 20Max restaurants
Stop after this many restaurants in total (in review mode: restaurants whose reviews are collected).
scrapeTypeenumOptionaldefault "restaurants"What to scrape
Restaurants (one row per restaurant) or reviews (one row per review of each restaurant found).
includeDetailsbooleanOptionaldefault trueFull restaurant details
Open every restaurant for phone numbers, coordinates, opening hours, menu images, photos, highlights and more. Turn off for a faster run with the fields shown in the list pages.
maxReviewsPerRestaurantintegerOptionaldefault 20Max reviews per restaurant
Review mode only.
reviewSortenumOptionaldefault "newest"Review order
Review mode only.
reviewTypeenumOptionaldefault "all"Review type
Review mode only: all reviews, dining reviews or delivery reviews.
proxyConfigurationobjectOptionaldefault {"useScrapelyProxy":true,"scrapelyProxyGroups":["DATACENTER…Proxy configuration
Datacenter connections work well for Zomato. Choose residential (Indian exits are used automatically) if you see blocks.
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 |
|---|---|---|
| restaurantId | number | null | |
| name | string | null | |
| url | string | null | |
| city | string | null | |
| locality | string | null | |
| address | string | null | |
| zipcode | string | null | |
| latitude | number | null | |
| longitude | number | null | |
| phone | string | null | |
| phones | array | null | |
| cuisines | array | null | |
| rating | number | null | |
| ratingText | string | null | |
| votes | number | null | |
| diningRating | number | null | |
| diningReviews | number | null | |
| deliveryRating | number | null | |
| deliveryReviews | number | null | |
| costForTwo | number | null | |
| costForTwoText | string | null | |
| costForOneText | string | null | |
| statusText | string | null | |
| timing | string | null | |
| openingHours | array | null | |
| deliveryTime | string | null | |
| hasOnlineOrdering | boolean | null | |
| isPromoted | boolean | null | |
| offers | array | null | |
| knownFor | array | null | |
| topDishes | array | null | |
| highlights | array | null | |
| unavailable | array | null | |
| topTags | array | null | |
| paymentInfo | string | null | |
| menuImages | array | null | |
| photos | array | null | |
| imageUrl | string | null | |
| isDeliveryOnly | boolean | null | |
| isPermanentlyClosed | boolean | null | |
| isTemporarilyClosed | boolean | null | |
| chain | string | null | |
| shortUrl | string | null | |
| source | string | null | |
| scrapedAt | string | null | |
| reviewId | number | null | |
| restaurantName | string | null | |
| restaurantUrl | string | null | |
| experience | string | null | |
| reviewText | string | null | |
| date | string | null | |
| dateApprox | string | null | |
| userName | string | null | |
| userId | number | null | |
| userProfileUrl | string | null | |
| userProfilePic | string | null | |
| userReviewsCount | number | null | |
| userFollowersCount | number | null | |
| likeCount | number | null | |
| commentCount | number | null | |
| positiveTags | array | null | |
| negativeTags | array | null | |
| ownerReplies | array | null | |
| reviewUrl | string | null |
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 |
|---|---|---|
| Restaurant | One Zomato restaurant saved to the dataset. | $0.004 |
| Review | One Zomato review saved to the dataset (review mode). | $0.0025 |
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('cornerledger/zomato-scraper').call({
"startUrls": [
{
"url": "https://www.zomato.com/bangalore/restaurants/biryani"
}
],
"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 cornerledger/zomato-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=cornerledger/zomato-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.
Restaurants with details and 5 newest reviews.
Restaurants for a cuisine search in a city.
Reviews from restaurant and listing URLs.
Quick list of restaurants without details.
Scrape.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.