tims / zomato-php-sdk
PHP SDK for the Zomato Restaurant API (v2.1)
Requires
- php: ^8.1
- ext-json: *
- guzzlehttp/guzzle: ^7.5
Requires (Dev)
- phpunit/phpunit: ^10.0|^11.0
Suggests
None
Provides
None
Conflicts
None
Replaces
None
README
PHP SDK for the Zomato Restaurant API (v2.1).
Covers the public endpoints documented by Zomato and mirrored in the community Postman collection.
Requirements
- PHP 8.1+ (8.1, 8.2, 8.3, and 8.4)
ext-json- Guzzle 7
Installation
composer require tims/zomato-php-sdk
Authentication
Create an API key in the Zomato developer portal. Every request sends it as the user-key header.
use Tims\Zomato\ZomatoClient; $zomato = new ZomatoClient(getenv('ZOMATO_USER_KEY'));
Do not commit API keys. Prefer environment variables.
Quick start
use Tims\Zomato\Enums\EntityType; use Tims\Zomato\Enums\Sort; use Tims\Zomato\ZomatoClient; $zomato = new ZomatoClient($userKey); $categories = $zomato->categories(); $cities = $zomato->cities(['q' => 'Mumbai', 'count' => 5]); $results = $zomato->search([ 'entity_id' => 1, 'entity_type' => EntityType::City, 'q' => 'pizza', 'cuisines' => [25, 55], 'sort' => Sort::Rating, 'count' => 20, ]);
Successful responses are decoded JSON arrays. Failed HTTP responses throw Tims\Zomato\ApiException.
Configuration
| Constructor argument | Default | Purpose |
|---|---|---|
$userKey |
required | Zomato API key (user-key header) |
$httpClient |
new Guzzle client | Inject a custom Guzzle client (tests, middleware) |
$guzzleOptions |
[] |
Extra Guzzle options when the default client is created |
$baseUrl |
https://developers.zomato.com/api/v2.1 |
Override API base URL |
$zomato = new ZomatoClient( userKey: $userKey, baseUrl: 'https://developers.zomato.com/api/v2.1', );
Error handling
use Tims\Zomato\ApiException; use Tims\Zomato\ZomatoClient; try { $data = (new ZomatoClient($userKey))->restaurant(16506740); } catch (ApiException $e) { $e->getStatusCode(); // HTTP status $e->getResponseBody(); // raw body $e->getResponseHeaders(); // response headers $e->getMessage(); }
API reference
Base URL: https://developers.zomato.com/api/v2.1
Common
| Method | HTTP | Path | Notes |
|---|---|---|---|
categories() |
GET |
/categories |
No query params |
cities(array $params = []) |
GET |
/cities |
q, lat, lon, city_ids, count |
collections(array $params = []) |
GET |
/collections |
city_id, lat, lon, count |
cuisines(array $params = []) |
GET |
/cuisines |
city_id, lat, lon |
establishments(array $params = []) |
GET |
/establishments |
city_id, lat, lon |
Locations
| Method | HTTP | Path | Notes |
|---|---|---|---|
geocode(float $lat, float $lon) |
GET |
/geocode |
Required lat, lon |
locations(string $query, array $params = []) |
GET |
/locations |
Required query; optional lat, lon, count |
locationDetails(int|string $entityId, string|EntityType $entityType) |
GET |
/location_details |
Required entity_id, entity_type |
Restaurants
| Method | HTTP | Path | Notes |
|---|---|---|---|
restaurant(int|string $resId) |
GET |
/restaurant |
Required res_id |
dailyMenu(int|string $resId) |
GET |
/dailymenu |
Required res_id |
reviews(int|string $resId, array $params = []) |
GET |
/reviews |
Required res_id; optional start, count |
search(array $params = []) |
GET |
/search |
See search parameters below |
Search parameters
| Param | Type | Description |
|---|---|---|
entity_id |
int|string | Location id |
entity_type |
string|EntityType |
city, subzone, zone, landmark, metro, group |
q |
string | Keyword |
start |
int | Offset |
count |
int | Max results |
lat / lon |
float | Coordinates |
radius |
float | Radius in meters |
cuisines |
string|array | Cuisine ids |
establishment_type |
int|string | From /establishments |
collection_id |
int|string | From /collections |
category |
string|array | From /categories |
sort |
string|Sort |
cost, rating, real_distance |
order |
string|Order |
asc, desc |
Arrays for cuisines / category are joined as comma-separated values.
Enums
use Tims\Zomato\Enums\EntityType; use Tims\Zomato\Enums\Order; use Tims\Zomato\Enums\Sort; EntityType::City; Sort::Rating; Order::Desc;
Examples
export ZOMATO_USER_KEY=your_key
php examples/categories.php
Testing
composer install
composer test
Tests use Guzzle mock handlers; no live API key is required.
Laravel
A Laravel wrapper (laravel-zomato) will be published separately. It will read ZOMATO_USER_KEY / ZOMATO_BASE_URL from config and bind ZomatoClient in the container.
License
This package is open-sourced software licensed under the MIT license.
Copyright (c) 2026 TIMS.