---
title: "Search Swiggy restaurants near a location"
method: GET
path: "/swiggy/search"
tags: ["Swiggy"]
---

# Search Swiggy restaurants near a location

`GET /swiggy/search`

## Request

- Base URL: `https://api.crawlora.net/api/v1`
- URL: `https://api.crawlora.net/api/v1/swiggy/search`
- Auth: API key in header `x-api-key`

Returns restaurants delivering to a latitude/longitude, optionally filtered by a keyword or browsed within a curated collection. With no query and no collection_id this browses the nearby-restaurant listing; with a query it runs a keyword search across restaurant names, cuisines, and dishes; with a collection_id (from /swiggy/collections) it browses restaurants within that curated collection. query and collection_id are mutually exclusive. Keyword search has two result tabs, selected with tab: dish (the default) returns restaurants that serve a matching dish, each with the matching dishes, their prices, and Swiggy's own per-dish rating where it has one, in a dishes array; restaurant returns restaurants whose own name or cuisine matches, a wider set with no dishes. tab, veg, min_rating and offers are only valid together with query. sort works with either query (relevance, delivery_time, rating) or collection_id (those three plus cost_low_to_high and cost_high_to_low), and is rejected on a plain nearby browse. Each restaurant carries its id (the value the restaurant and menu endpoints take), name, cuisines, cost for two, rating, delivery time, open/closed status, a hero image, and, where one is shown, an external_rating block with the third-party aggregate score, count, and source. Where the result card advertises a promotion it also carries offers, the same title/description/tag shape /swiggy/restaurant returns (a listing card never carries a coupon code, and a card showing both a discount and a separate free-delivery benefit returns them as two entries). is_promoted is present and true only for a result Swiggy itself labels a sponsored placement rather than an organic one. unavailable_message is present only when Swiggy says the restaurant cannot currently be ordered from and carries its own reason; it is not the inverse of is_open, since Swiggy reports a restaurant as open while still refusing orders for the requested location. A plain nearby browse also returns is_serviceable, which says whether Swiggy delivers to the requested coordinates at all: false means the coordinates are outside Swiggy's delivery coverage, so the empty restaurants list is a coverage answer rather than a no-matches answer, while an empty list without the field means no matches in a served area. It is omitted on keyword search and on a collection_id browse, neither of which carries Swiggy's own coverage marker.

## Query parameters

- `latitude` number, required
- `longitude` number, required
- `query` string
- `collection_id` string
- `sort` 'relevance' | 'delivery_time' | 'rating' | 'cost_low_to_high' | 'cost_high_to_low'
- `offset` string
- `tab` 'dish' | 'restaurant'
- `veg` boolean
- `min_rating` number
- `offers` boolean

## Headers

- `x-api-key` string, required

## Response `200`

OK

- SwiggySearchResponseDoc
  - `code` integer: Code is the HTTP status code or a custom code used to indicate the result of the request @example 200
  - `data` SwiggySearchResponse
    - `is_serviceable` boolean: IsServiceable reports whether Swiggy delivers to the requested coordinates at all. False means the coordinates are outside Swiggy's delivery coverage, so an empty restaurants list is a coverage answer rather than a no-matches answer; an empty list without this field means no matches in a served area. Returned only for the plain nearby browse -- keyword search and a collection_id browse omit it, because Swiggy answers neither with a coverage verdict.
    - `next_offset` string
    - `restaurants` SwiggyRestaurant[]
      - `address` string
      - `area` string
      - `city` string
      - `cost_for_two` string
      - `cuisines` string[]
      - `delivery_time_minutes` integer
      - `dishes` SwiggyMenuItem[]: Dishes are the menu items that actually matched a /swiggy/search query, carried only by Swiggy's own "Dishes" search tab (tab=dish). Empty on the restaurant tab, on a plain nearby browse, on a collection browse, and on /swiggy/restaurant -- none of those upstream shapes carry per-restaurant dish matches.
        - `category` string
        - `description` string
        - `discounted_price` number
        - `id` string
        - `image_url` string
        - `in_stock` boolean
        - `is_veg` boolean
        - `name` string
        - `price` number
        - `rating` number: Rating and TotalRatings are Swiggy's own aggregate score and review count for this individual dish, the same two fields a restaurant carries. Omitted when the dish has no rating yet. Only the headline aggregate is returned -- individual reviews and reviewer identity are out of scope for this platform.
        - `total_ratings` integer
      - `external_rating` SwiggyExternalRating
        - `count` string
        - `rating` number
        - `source` string
      - `hours_message` string
      - `hours_status` string: HoursStatus/HoursMessage are Swiggy's own live open/close callout for this outlet ("Open now" / "Closes 11:30 pm"); OpeningHours is its weekly schedule. Only the restaurant detail and menu responses carry these -- search and collection listing cards do not, so they are empty on /swiggy/search results.
      - `id` string
      - `image_url` string
      - `is_open` boolean
      - `is_promoted` boolean: IsPromoted reports whether Swiggy itself labels this a promoted (sponsored, paid-placement) result rather than an organic one. Present and true only for those; Swiggy marks none on a plain nearby browse.
      - `latitude` number
      - `locality` string
      - `longitude` number
      - `name` string
      - `offers` SwiggyOffer[]: Offers are the promotions Swiggy shows on this restaurant's own listing card in a search, browse, or collection result -- the headline discount and its condition, its badge, and any separate free-delivery benefit. Absent when the card shows no promotion, and on /swiggy/restaurant and /swiggy/restaurant/menu, whose responses carry the restaurant's fuller offer list at the top level instead.
        - `coupon_code` string
        - `description` string
        - `tag` string
        - `title` string
      - `opening_hours` SwiggyOpeningHours[]
        - `day` string
        - `hours` string
      - `phone` string
      - `postal_code` string
      - `rating` number
      - `rating_count` string
      - `total_ratings` integer
      - `unavailable_message` string: UnavailableMessage is Swiggy's own reason this listed restaurant cannot be ordered from right now ("Currently not taking orders for this location", "Opens next at 5 pm, today", "Temporarily closed for delivery"). Absent for a restaurant that is currently orderable. Note it is not simply the inverse of is_open: a restaurant Swiggy reports as open can still be unavailable for the requested location.
  - `msg` unknown

## Other responses

- `400`: Bad Request
- `503`: Service Unavailable

---

[API](https://skmtc.dev/crawlora/apis/crawlora-api.md) · [All operations](https://skmtc.dev/crawlora/apis/crawlora-api/llms.txt) · [OpenAPI document](https://skmtc.dev/crawlora/apis/crawlora-api/revisions/0497899e2016?raw)
