Zomato API endpoint
Returns one Zomato restaurant's public detail by its canonical URL: name, address, locality, city, postcode, coordinates, phone, cuisines, headline rating plus Zomato's separate dining and delivery rating aggregates, the full weekly opening-hours table, open/closed and delivery-only/dark-kitchen status, and delivery metadata (ETA, minimum order, pickup availability). Zomato has no lighter restaurant-detail-only source -- this reads the same upstream as /zomato/restaurant/menu, just without the menu items.
/zomato/restaurantQuery parameters:
url (required) — canonical public Zomato restaurant URL, from /zomato/search's url field, e.g. https://www.zomato.com/mumbai/persian-darbar-byculla. A URL with a query string or fragment, a non-zomato.com host, or fewer than two path segments (city + restaurant slug) is rejected as invalid. A trailing /order, /menu, /info, /reviews, or /photos segment is accepted and stripped.An unrecognized restaurant URL returns a 404. Zomato has no lighter restaurant-detail-only source — this reads the same upstream page as /zomato/restaurant/menu, just without the menu items.
Response includes id, name, url, cuisines[], rating, rating_count, locality, address, city, zipcode (omitted when Zomato has no real postcode for the restaurant), country, latitude, longitude, image_url, phone, status_text (e.g. Closed for dining), and timing (e.g. Opens at 9am).
It also includes:
opening_hours[] — the full weekly table behind the single-line timing. Each entry has days (e.g. Mon-Sun) and timing (e.g. 12midnight – 4am, 11am – 12midnight). Zomato groups consecutive days sharing a schedule into one entry and puts multiple same-day service windows in one comma-separated string, so both are passed through as display text.ratings — Zomato rates dining and delivery separately, and the two can differ. Carries dining and/or delivery, each with rating and review_count (a display string, e.g. 51.3K). A mode the restaurant is not rated for (a delivery-only kitchen has no dining rating) is omitted rather than reported as 0. These are headline aggregates only; no individual review text or reviewer identity is returned.delivery — Zomato's own delivery metadata, when it carries any: time (ETA, e.g. 34 min), has_online_ordering, is_serviceable, min_order_amount, and pickup_available.is_delivery_only, is_dark_kitchen, is_temporarily_closed, is_permanently_closed — present and true only when Zomato itself sets the flag.| Field | In the sample | Value in the sample |
|---|---|---|
| id | Has a value | |
| name | Has a value | “Persian Darbar” |
| url | Has a value | zomato.com |
| cuisines | Has a value | 7 entries |
| rating | Has a value | 4.2 |
| rating_count | Has a value | 3,406 |
| locality | Has a value | “Byculla, Mumbai” |
| address | Has a value | |
| phone | Has a value | |
| status_text | Has a value | “Open now” |
| timing | Has a value | “9am – 1am (Today)” |
| city | Has a value | “Mumbai” |
| zipcode | Has a value | 400,027 |
| country | Has a value | “India” |
| latitude | Has a value | |
| longitude | Has a value | |
| image_url | Has a value | b.zmtcdn.com |
| opening_hours | Has a value | 1 entry |
| ratings.dining | Has a value | |
| ratings.delivery | Has a value | |
| delivery.time | Has a value | “33 min” |
| delivery.has_online_ordering | Has a value | true |
| delivery.is_serviceable | Has a value | true |
| delivery.min_order_amount | Has a value | 0 |
| delivery.pickup_available | Has a value | true |
| Parameter | Type | Required | Default | Description | Example |
|---|---|---|---|---|---|
| url | string | Yes | Canonical public Zomato restaurant URL, from /zomato/search's url field | https://www.zomato.com/mumbai/persian-darbar-byculla | |
| x-api-key (header) | string | Yes | API key required |
curl -X GET "https://api.crawlora.net/api/v1/zomato/restaurant?url=https%3A%2F%2Fwww.zomato.com%2Fmumbai%2Fpersian-darbar-byculla" \ -H "x-api-key: $CRAWLORA_API_KEY"
{
"code": 200,
"msg": "OK",
"data": {
"id": "34269",
"name": "Persian Darbar",
"url": "https://www.zomato.com/mumbai/persian-darbar-byculla",
"cuisines": [
"Biryani",
"Mughlai",
"North Indian"
],
"rating": 4.2,
"rating_count": "3403",
"locality": "Byculla, Mumbai",
"address": "5, Alexandra Terrace, Byculla, Mumbai",
"phone": "+912262261112, +912223791112",
"status_text": "Closed for dining",
"timing": "9am – 1am (Today)",
"city": "Mumbai",
"zipcode": "400027",
"country": "India",
"latitude": 18.97572852,
"longitude": 72.83370833,
"image_url": "https://b.zmtcdn.com/data/pictures/9/34269/thumb.jpg",
"opening_hours": [
{
"days": "Mon-Sun",
"timing": "9am – 1am"
}
],
"ratings": {
"dining": {
"rating": 4.2,
"review_count": "3,403"
},
"delivery": {
"rating": 4.2,
"review_count": "51.3K"
}
},
"delivery": {
"time": "34 min",
"has_online_ordering": true,
"is_serviceable": true,
"min_order_amount": 0,
"pickup_available": true
}
}
}Request schema
No body schema
Response schema
#/definitions/zomato.restaurantResponseDoc
| Field | Type | Required | Enum | Bounds | Example | Description |
|---|---|---|---|---|---|---|
| code | integer | No | Code is the HTTP status code or a custom code used to indicate the result of the request @example 200 | |||
| data | zomato.RestaurantResponse | No | ||||
| data.address | string | No | ||||
| data.city | string | No | City/Zipcode/Country/Latitude/Longitude come from the same contact section Address and Locality already do -- Zipcode is frequently blank or "0" upstream and is omitted when it is. | |||
| data.country | string | No | ||||
| data.cuisines | array | No | ||||
| data.delivery | object | No | Delivery is present only when Zomato carries delivery metadata for this restaurant. | |||
| data.delivery.has_online_ordering | boolean | No | ||||
| data.delivery.is_serviceable | boolean | No | ||||
| data.delivery.min_order_amount | number | No | ||||
| data.delivery.pickup_available | boolean | No | ||||
| data.delivery.time | string | No | ||||
| data.id | string | No | ||||
| data.image_url | string | No | ||||
| data.is_dark_kitchen | boolean | No | ||||
| data.is_delivery_only | boolean | No | IsDeliveryOnly marks a kitchen Zomato lists for delivery only (no dining), IsDarkKitchen a delivery-only kitchen with no storefront at all, and the two closed flags Zomato's own temporary/permanent closure states. | |||
| data.is_permanently_closed | boolean | No | ||||
| data.is_temporarily_closed | boolean | No | ||||
| data.latitude | number | No | ||||
| data.locality | string | No | ||||
| data.longitude | number | No | ||||
| data.name | string | No | ||||
| data.opening_hours | array | No | OpeningHours is the full weekly table behind the single-line Timing string above. | |||
| data.opening_hours[].days | string | No | ||||
| data.opening_hours[].timing | string | No | ||||
| data.phone | string | No | ||||
| data.rating | number | No | ||||
| data.rating_count | string | No | ||||
| data.ratings | object | No | Ratings splits the single headline Rating above into Zomato's own separately-aggregated dining and delivery figures. | |||
| data.ratings.delivery | zomato.SplitRating | No | ||||
| data.ratings.delivery.rating | number | No | ||||
| data.ratings.delivery.review_count | string | No | ||||
| data.ratings.dining | zomato.SplitRating | No | ||||
| data.ratings.dining.rating | number | No | ||||
| data.ratings.dining.review_count | string | No | ||||
| data.status_text | string | No | ||||
| data.timing | string | No | ||||
| data.url | string | No | ||||
| data.zipcode | string | No | ||||
| msg | unknown | No | Msg is the message that describes the result of the request @example "Request successful" |
| Status | Description | Schema |
|---|---|---|
| 400 | Bad Request | #/definitions/app.Response |
| 404 | Not Found | #/definitions/app.Response |
| 503 | Service Unavailable | #/definitions/app.Response |
Use environment variables for secrets and keep Crawlora API keys server-side.
curl -X GET "https://api.crawlora.net/api/v1/zomato/restaurant?url=https%3A%2F%2Fwww.zomato.com%2Fmumbai%2Fpersian-darbar-byculla" \
-H "x-api-key: $CRAWLORA_API_KEY"