Zomato restaurants as JSON, with dining and delivery rated separately
The Zomato API turns zomato.com, India's restaurant discovery and food-delivery marketplace, into clean JSON in five actions.
5 active endpoints, on 1, 2 and 3 credit tiers.
- POST/zomato/v1/search
- POST/zomato/v1/restaurant/detail
- POST/zomato/v1/restaurant/menu
- POST/zomato/v1/restaurant/reviews
- POST/zomato/v1/locations/search
What Zomato endpoints does ReefAPI ship?
5 live read endpoints. Read-only data API: no writes, no account actions, no dashboard access on the target site.
Zomato API
5 of 5 endpoints, ready to run
A city's restaurants: res_id, name, Zomato URL, locality and address, cuisines, cost for two as text and as a rupee number, the image, and both ratings with their review counts. Every row is flagged is_promoted, and the response counts how many were paid placements.
// Press "Try it" and this pane shows exactly what the // live site returned this second — including an empty // result, if that is the truth. No key, no account.
How the Zomato API works
Zomato is a normal ReefAPI surface — the same four rules that hold for every other engine on the key.
No OAuth app, no request signing, no per-site account. One key covers all 280 engines.
Every route is a POST with a JSON body. Parameters are validated against the published schema before anything is charged.
Credits, not seats. Failed and blocked calls are never charged, and cache hits cost nothing.
One envelope everywhere. meta carries latency_ms, record_count and the endpoint that answered.
From a city to a restaurant's menu and reviews
Every action after search is keyed on res_id, which search returns on every row. Because a listing returns nine restaurants and does not page, breadth comes from varying the cuisine, locality and collection rather than from a page number.
Optional. Turns a neighbourhood name into the locality slug and coordinates Zomato knows it by.
Up to 9 restaurants with res_id, address, cuisines, cost for two and both ratings. Drop the rows where is_promoted is true if you only want organic results.
The full record: coordinates, postcode, opening hours day by day, phone numbers, highlights and popular dishes.
The dish catalogue with veg and vegan tags. Dish prices are not published signed out; the restaurant's cost for two is on the detail record.
The 25 newest reviews with text, star rating and reviewer, which is the signed-out ceiling.
One city listing plus three follow-up calls gives a complete restaurant profile: where it is, when it opens, what it costs, what it cooks, how it is rated for dining and for delivery separately, and what its most recent customers wrote.
curl -X POST https://api.reefapi.com/zomato/v1/search \
-H "x-api-key: $REEF_KEY" \
-H "content-type: application/json" \
-d '{"city":"ncr"}'{
"ok": true,
"data": { … },
"meta": {
"api": "zomato",
"endpoint": "search",
"mode": "live",
"latency_ms": …,
"record_count": …
},
"error": null
}The two ratings, and the four fields that keep them apart
Zomato scores the same restaurant twice — once by people who ate in, once by people who ordered delivery — and it shows them as two separate badges. The two numbers regularly disagree, and a restaurant can be excellent on one and poor on the other. This API never blends them. Every search row and every detail record carries all four fields below, and any of them can be null when the restaurant has no rating of that kind yet.
| Field | What it is | How often it was filled |
|---|---|---|
| rating_dining | The dine-in star rating, 1 to 5. | 8 of 8 restaurants in the detail sample |
| rating_dining_count | How many dining reviews that score is based on. | 8 of 8 |
| rating_delivery | The delivery star rating, 1 to 5. Null when the restaurant does not deliver. | 4 of 8 — only half the sample delivered |
| rating_delivery_count | How many delivery reviews that score is based on. | 8 of 8 |
| rating_count_approximate | True when Zomato published only a rounded count such as 11.8K instead of an exact figure. | Set per record; detail returns the exact count where the source publishes one |
Checked against the structured data Zomato itself publishes on each restaurant page, on 12 restaurants drawn from four listing surfaces across three cities: name, dining rating, dining review count, cost for two and street address all matched on 12 of 12. An id taken from search resolved to the same record in detail on 12 of 12.
What Zomato publishes, and where it stops
Measured on 2026-09-23 against the live gateway. The limits below are the source's, not the API's, and every response reports which one it hit in stop_reason.
8 — Delhi NCR 25,603 restaurants, Mumbai 21,563, Bangalore 19,071, Pune 14,439, Hyderabad 12,807, Chennai 10,179, Kolkata 9,050, Jaipur 6,260
All 28 pairwise comparisons of those cities' results shared zero restaurants
Up to 9, and listings do not page — 8 paging approaches all returned the identical 9 restaurants
9 of 9 rows on a plain city listing; 0 of 9 on a curated collection; 6 of 9 on a delivery listing. Flagged per row as is_promoted
Two per restaurant, returned separately: rating_dining filled on 8 of 8 sampled, rating_delivery on 4 of 8 (only half deliver)
12 restaurants across 3 cities: name, dining rating, dining review count, cost for two and address matched 12 of 12
13 of 16 restaurants returned a dish catalogue, 36 to 365 dishes each; the other 3 are dine-in only and return a clear not-found
Not published to a signed-out reader — 0 of 1,690 dishes carried a price, so price_inr is null and prices_published is false
Up to 25, newest first. Zomato requires a login beyond that, measured on 3 restaurants
res_id, name, URL, address, locality, cuisines, cost for two and image filled 9 of 9 in all 5 listing categories tested
What people build with Zomato
The jobs this data is most often used for.
endpoints
credits per call
Restaurant discovery apps list a city by cuisine or locality and read is_promoted on every row, so paid placements can be dropped before anything reaches a user.
Location intelligence and delivery-market teams pull address, locality, postcode, latitude and longitude per restaurant and compare cuisine mix across cities, which differ completely: the eight cities measured shared no restaurants at all.
Rating trackers store rating_dining and rating_delivery as two separate series, which is the only way to see a kitchen that is strong for dine-in and weak on delivery.
Menu and dish research reads the full dish catalogue with veg and vegan tags per item to answer what a city's restaurants actually cook, without needing prices.
What Zomato data costs
The cheapest call here is 1 credit, so $15/mo (Pro) buys 10,000 of them — $1.50 per 1,000 credits. Credits roll over and never expire, and failed or blocked calls are not charged.
Full pricing →- 1,000 free credits on signup, no card
- One key, all 280 APIs, one credit pool
- Failed and blocked calls are never charged
- Credits roll over and never expire
Call it in two lines
Sign up, get 1,000 credits and one key that works on every engine. Then this is the whole protocol.
curl -X POST https://api.reefapi.com/zomato/v1/search \
-H "x-api-key: $REEF_KEY" \
-H "content-type: application/json" \
-d '{"city":"ncr"}'import requests
r = requests.post(
"https://api.reefapi.com/zomato/v1/search",
headers={"x-api-key": REEF_KEY},
json={
"city": "ncr"
},
)
print(r.json()["data"])Have a question? We got answers.
The questions people actually ask before wiring up Zomato.
Get a free key →Why is there no field called rating?▾
Because Zomato publishes two ratings for the same restaurant and they disagree. One venue measured in this build scored 3.9 for dining from 6,851 reviews and 3.1 for delivery from 21. Any single blended number would be wrong for one of those two audiences, so this API returns rating_dining, rating_dining_count, rating_delivery and rating_delivery_count and lets you choose. rating_delivery is null when a restaurant does not deliver, which was the case for half the detail sample.
Can I get dish prices from the menu?▾
No, and the API says so rather than guessing. Zomato does not show dish prices to a signed-out reader: the dish records carry no price at all and the page itself sets a flag saying prices are held back until you sign in. Across 1,690 dishes read from 13 restaurants, not one carried a price. So restaurant/menu returns price_inr as null on every dish, sets prices_published to false and includes a price_note explaining it. What you do get is the complete catalogue: every menu, its categories, and each dish with its name, its description and its veg or vegan tags — 36 to 365 dishes per restaurant in the sample. The restaurant's own cost-for-two figure is separate and is returned in full, as both printed text and a rupee number.
How many restaurants does one search return, and can I page through a whole city?▾
One search returns up to 9 restaurants, and it does not page. That is the source's own ceiling, not a setting: eight different paging approaches were tested against the same listing and every one returned the identical nine restaurants. The count you see in source_total_results is how many restaurants match in that city — 25,603 in Delhi NCR — not how many you can retrieve. Coverage comes from breadth instead of depth: vary the city, the cuisine, the locality and the collection, and each combination returns its own nine. Each response tells you what happened in stop_reason.
How many reviews can I read per restaurant?▾
Up to 25, the newest first. Zomato serves five pages of five reviews to a signed-out reader and asks for a login after that, measured identically on three different restaurants. The response carries reviews_truncated so you know more exist, and source_number_of_pages, which is Zomato's own page count for a signed-in reader and will be much larger. Each review comes with its text, its star rating, whether it is a dining or a delivery review, its age, the like and comment counts, and the reviewer name and profile link exactly as the public page prints them.
Are the search results ordered, or are some of them ads?▾
Some of them are ads, and the API flags them. On a plain city listing every one of the nine rows was a paid placement in every city measured. Curated collections were the opposite — a collection listing returned nine rows with no paid placements at all — and delivery listings were mixed at six of nine. Every row carries is_promoted, and each response carries promoted_count and organic_count so you can filter before displaying. Promotional banner tiles that sit inside the grid have no restaurant behind them; they are removed and counted in dropped_tiles.
Which cities can I search, and do they really differ?▾
Pass the city slug Zomato uses in its own URLs: ncr for Delhi NCR, plus mumbai, bangalore, hyderabad, chennai, kolkata, pune, jaipur and the rest. The cities are genuinely separate inventories, not one list filtered: the eight cities measured returned 6,260 to 25,603 matching restaurants each, and all 28 pairwise comparisons of their results shared zero restaurants. If you are not sure what to pass for a neighbourhood, locations/search turns a place name into the localities Zomato knows, with coordinates.
What is the cost for two, exactly?▾
It is Zomato's own estimate of what two people spend, and it comes back both ways: price_for_two_text as the site prints it, and price_for_two_inr as a plain rupee number you can sort on. It is an estimate of a typical bill, not a menu price, and for a bar it can be calculated on drinks. The detail record also returns cost_notes, the full list of cost lines the page shows, because a second line is often a different thing entirely such as the price of a pint rather than a meal. It matched the figure Zomato publishes in its own page data on 12 of 12 restaurants checked.
Does every restaurant have a menu I can read?▾
Most do. In a 16 restaurant sample, 13 returned a dish catalogue and 3 did not; all eight taken from delivery listings had one. The three without a catalogue are dine-in only venues that never took online orders, and for those the API returns a clear not-found rather than an empty list. Those restaurants usually still have a photographed menu, and restaurant/detail lists those menu images under image_menus with a label and page count.
What is the Zomato API?▾
Zomato API is a ReefAPI endpoint group for india's restaurant guide: search a city by cuisine, locality or collection, with dining and delivery ratings kept as separate numbers, plus dish catalogues and review text. It returns live JSON through POST requests under /zomato/v1.
Is the Zomato API free to try?▾
Yes. ReefAPI starts with 1,000 free credits, no card required. Zomato calls use the same shared credit balance as every other ReefAPI engine.
Do I need a Zomato login or account?▾
No login to Zomato is needed for the API response. You call ReefAPI with your x-api-key header, and the playground can run live examples before you create a production key.
How fresh is the Zomato data?▾
The page example is captured from a live search call, and production requests fetch live data through ReefAPI rather than a static sample.
How many credits does the Zomato API use?▾
Zomato actions currently cost 1-3 credits per successful call. Failed or blocked calls are free. All APIs draw from one credit pool.
Can I call Zomato from an AI assistant or MCP client?▾
Yes. Connect ReefAPI once through MCP and your assistant can call zomato actions with the same key, credit pool and JSON envelope used by normal REST requests.
15 Reputation & Reviews APIs on the same key
One key, one credit pool, one response envelope. If you are pulling Zomato, you are one call away from the rest of the category — no second contract, no second integration.
Need something this API does not do?
Name the endpoint, the field, or a source we do not carry yet. We ship new APIs every week and you would be first to get the key. Real people read every message and reply the same day.
Try it on your own data before you pay anything
The call above is the real endpoint, not a recording. A free key gives you 1,000 credits, the other 279 APIs, and the same envelope everywhere.
Endpoints, parameters and credit costs on this page are read from the live catalog and cannot drift from what the API accepts. Field notes were captured on 2026-09-23.