Crawlzodocs
API referenceZomato

Zomato reviews

Reviews for one Zomato restaurant, text, rating, author, photos, replies.

Zomato serves 5 reviews per page and stops at page 5: page 6 is a hard 401 for anyone not logged in, on every restaurant regardless of how many reviews it has. That is a platform limit, and it means one sort+filter combination reaches at most 25 reviews.

deep works around it honestly. The 25-review cap applies per combination, not per restaurant, so sweeping all four filters against both sorts and de-duplicating by review id reaches roughly four times as many distinct reviews (measured: 25 for one combination, 99 across the matrix). It costs 40 requests instead of 1 and ignores page, sort and filter.

A restaurant with no reviews returns an empty list, not an error, and note that this endpoint alone cannot tell "no such restaurant" from "no reviews", because Zomato answers both identically. Use zomato-outlet-v4 to confirm a restaurant exists.

The example response below is real output from this endpoint, not an illustration. Long lists and long strings are shortened to keep the page readable, and each place that happens is marked. This example took 3.6s.

POST
/v1/scrapers/zomato-reviews-v4

Authorization

ApiKeyAuth
X-API-Key<token>

Your API key. Sent on every request.

In: header

Request Body

application/json

TypeScript Definitions

Use the request body type in TypeScript.

Response Body

application/json

application/json

application/json

application/json

curl -X POST "https://example.com/v1/scrapers/zomato-reviews-v4" \  -H "Content-Type: application/json" \  -d '{    "res_id": "21959252",    "page": 1,    "sort": "newest",    "filter": "all"  }'
{  "request_id": "req_8f2c1d94e7b0",  "success": true,  "status": {    "code": "OK",    "message": "Scrape completed.",    "retryable": false  },  "data": {    "filter": "all",    "has_more": true,    "page": 1,    "res_id": "21959252",    "returned": 5,    "reviews": [      {        "author": {          "follower_count": 0,          "name": "Guruprasad",          "profile_image": "https://b.zmtcdn.com/web/assets/2267aec184e096c98c46a1565a5563661664945464.png?fit=around%7C100%3A100&crop=100%3A100%3B%2A%2C%2A",          "profile_url": "https://www.zomato.com/users/guruprasad-306856753",          "user_id": "306856753"        },        "channel": "dining",        "comment_count": 0,        "experience": "dining",        "like_count": 0,        "posted_text": "yesterday",        "rating": 5,        "rating_label": "Excellent",        "review_id": "500887875",        "text": "ashik was wonderful host",        "url": "https://www.zoma.to/ZnKqAKn"      },      {        "author": {          "follower_count": 0,          "name": "Chaitanya P",          "profile_image": "https://b.zmtcdn.com/web/assets/2267aec184e096c98c46a1565a5563661664945464.png?fit=around%7C100%3A100&crop=100%3A100%3B%2A%2C%2A",          "profile_url": "https://www.zomato.com/users/chaitanya-p-289753706",          "user_id": "289753706"        },        "channel": "dining",        "comment_count": 0,        "experience": "dining_order",        "like_count": 0,        "posted_text": "3 days ago",        "rating": 5,        "rating_label": "Excellent",        "review_id": "500508945",        "text": "Rahul attendant was too good here",        "url": "https://www.zoma.to/KzNvwgz"      },      "… 3 more items in the full response"    ],    "reviews_accessible_without_login": 25,    "reviews_per_page": 5,    "served_page": 1,    "sort": "newest",    "total_pages": 160,    "total_reviews_reported": 803  },  "error": null,  "meta": {    "client_id": "client_abc123",    "scraper": "zomato-reviews-v4",    "billable": true,    "duration_ms": 3032  }}