Swiggy Public Restaurant Scraper
Pricing
from $2.99 / 1,000 restaurants
Swiggy Public Restaurant Scraper
Extract normalized restaurant records from public Swiggy pages and endpoints without login or private access.
Pricing
from $2.99 / 1,000 restaurants
Rating
0.0
(0)
Developer
w3crawler
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
2 days ago
Last modified
Categories
Share
Extract normalized public restaurant records from Swiggy city, restaurant, JSON, or JSON-LD pages. The Actor uses bounded direct HTTPS, filters records to official Swiggy URLs, and deduplicates identities. Each row contains a restaurant's public identity and URL, source route, and whichever cuisine, price, rating, location, delivery, menu, or structured-data fields the page exposes. Dataset rows contain source-backed restaurant records only; run diagnostics stay in the OUTPUT key-value summary.
Get started
- Open the Actor Store page and select Try for free or open the Input tab.
- Add public Swiggy city, restaurant, JSON, or JSON-LD pages to
startUrls, then setmaxItems. - Keep
followPaginationoff and the limits small for the first run. Enable pagination only when you need additional pages. - Start the Actor, open the dataset, and export the saved records as JSON, CSV, or Excel. Open Run summary (
OUTPUT) to check the outcome and counts.
Input
All fields are optional; the defaults below are ready to use. Unsupported field names and out-of-range values are rejected before requests start.
| Field | Type | Required? | Default | Meaning |
|---|---|---|---|---|
startUrls | object array | Optional | [{"url":"https://www.swiggy.com/dapi/restaurants/list/v5?lat=12.9716&lng=77.5946&is-seo-homepage-enabled=true&page_type=DESKTOP_WEB_LISTING"}] | Public HTTPS Swiggy city, restaurant, JSON, or JSON-LD pages. 1–50 items. |
maxItems | integer | Optional | 25 | Hard result limit for a bounded run. 1–1000. |
maxPages | integer | Optional | 1 | Maximum public pages requested when pagination is enabled. 1–100. |
followPagination | boolean | Optional | false | Follow same-host rel=next links up to maxPages. |
requestDelayMs | integer | Optional | 600 | Polite delay between direct public requests. |
maxConcurrency | integer | Optional | 1 | Retained for input compatibility; direct requests run sequentially for bounded load. 1–5. |
userAgent | string | Optional | Not supplied | Optional consistent user agent for public requests. up to 300 characters. |
Default input:
{"startUrls": [{"url": "https://www.swiggy.com/dapi/restaurants/list/v5?lat=12.9716&lng=77.5946&is-seo-homepage-enabled=true&page_type=DESKTOP_WEB_LISTING"}],"maxItems": 25,"maxPages": 1,"followPagination": false,"requestDelayMs": 600,"maxConcurrency": 1}
userAgent has no default. The Actor reads public data from Swiggy over direct HTTPS only; it has no proxy or browser input.
Output
The dataset contains one row per saved result. Optional information appears only when the source publishes it; missing values are omitted rather than inferred. No diagnostic or placeholder rows are written.
| Field | Type | Availability | Meaning |
|---|---|---|---|
recordType | string | Always | Row discriminator; always swiggyRestaurant. |
source | string | Always | Source host; swiggy.com. |
provenance | string | Always | Route that produced the row, such as public_swiggy_json_endpoint. |
id | string | Always | Restaurant identity extracted from the source record. |
restaurantId | string | Always | Swiggy restaurant identifier. |
name | string | Always | Public restaurant name. |
url | string | Always | Canonical public restaurant URL from the source record. |
restaurantUrl | string | Always | Canonical public restaurant URL used by the Actor. It matches url in the archived rows. |
sourceUrl | string | Always | Start URL that produced the row, including the listing API route. |
sourcePageUrl | string | When an HTML page is used | Public page URL that produced the row; the archived JSON-route rows omit it. |
sourceDomain | string | Always | Host of the source response, such as www.swiggy.com. |
type | string | When published | Source entity type when the page exposes one. |
description | string | When published | Public restaurant description. |
imageUrl | string | When published | Public restaurant image URL. |
brand | string | When published | Public brand name when it differs from the restaurant name. |
category | string | When published | Public restaurant category label. |
cuisines | string array | When published | Public cuisine labels. |
servesCuisine | string array | When published | Cuisines listed in structured data when the page exposes them. |
menu | object | When published | Structured menu object when the page exposes one. |
menuUrl | string | When published | Public menu URL. |
price | number | When published | Numeric menu or listing price when the source exposes one. |
currency | string | When published | Currency for price. |
costForTwo | string | When published | Public cost-for-two value, such as ₹600 for two. |
rating | number | When published | Numeric public rating at collection time. |
reviewCount | number | When published | Public review or rating count at collection time. |
publishedAt | string | When published | Publication timestamp from the public source metadata. |
location | string | When published | Public outlet location label. |
address | string | When published | Public street address. |
locality | string | When published | Public locality label. |
deliveryTime | string | number | When published | Delivery estimate as displayed, such as 30-40 mins. |
data | object | Always | Compact source snapshot used to derive identity and core fields; its keys vary by route. |
rank | integer | Always | One-based position among deduplicated records. |
scrapedAt | string | Always | Time the record was written, in ISO UTC. |
retrievedAt | string | When published | Retrieval timestamp carried in the public source data when present. |
The sample below is a complete saved row from the 2026-10-25 JSON-API run. Fields that the JSON route did not expose are absent rather than guessed.
{"recordType": "swiggyRestaurant","source": "swiggy.com","provenance": "public_swiggy_json_endpoint","id": "21473","restaurantId": "21473","name": "Dindigul Thalappakatti - Since 1957","url": "https://www.swiggy.com/city/chennai/dindigul-thalappakatti-since-1957-triplicane-rest21473","restaurantUrl": "https://www.swiggy.com/city/chennai/dindigul-thalappakatti-since-1957-triplicane-rest21473","sourceUrl": "https://www.swiggy.com/dapi/restaurants/list/v5?lat=13.0827&lng=80.2707&is-seo-homepage-enabled=true&page_type=DESKTOP_WEB_LISTING","sourceDomain": "www.swiggy.com","imageUrl": "https://media-assets.swiggy.com/swiggy/image/upload/RX_THUMBNAIL/IMAGES/VENDOR/2025/9/21/8f508f2f-9853-451b-8df6-32e6648a2424_21473.JPG","cuisines": ["Biryani","Barbecue","South Indian","Chinese","North Indian"],"costForTwo": "₹600 for two","rating": 4.2,"reviewCount": 20000,"location": "Triplicane","locality": "Triplicane","deliveryTime": "30-40 mins","data": {"id": "21473","name": "Dindigul Thalappakatti - Since 1957","url": "https://www.swiggy.com/city/chennai/dindigul-thalappakatti-since-1957-triplicane-rest21473","cuisines": ["Biryani","Barbecue","South Indian","Chinese","North Indian"],"costForTwo": "₹600 for two","deliveryTime": "30-40 mins","locality": "Triplicane","areaName": "Triplicane"},"rank": 1,"scrapedAt": "2026-10-25T20:56:23.990Z"}
Run summary
Run summary is stored separately from the dataset in the run's key-value store under OUTPUT.
| Field | Meaning |
|---|---|
recordType | Summary discriminator; runSummary. |
status | Run outcome; SUCCEEDED or FAILED. |
runStatus | Canonical run status; matches status. |
dataStatus | Dataset completeness: COMPLETE, PARTIAL, NO_RESULTS, or FAILED. |
dataAvailable | Whether at least one restaurant row was saved. |
actor | Actor slug; swiggy-restaurant-scraper. |
requestedStartUrlCount | Start URLs supplied for the run. |
requestedMaxItems | Restaurant limit requested. |
requestedMaxPages | Page limit requested. |
followPagination | Whether same-host pagination was enabled. |
requestDelayMs | Delay applied between direct public requests. |
maxConcurrency | Compatibility value supplied in the input. Requests run sequentially. |
itemsStored | Restaurant rows written. |
recordsStored | Complete restaurant records written. |
dataRecordCount | Data records counted for the run. |
uniqueIdentities | Distinct restaurant identities after deduplication. |
failureCount | Source or parse failures recorded. |
blockedCount | Blocked or access-boundary responses. |
errorCount | Request or parse errors. |
noResultsCount | Targets that completed without a usable restaurant record. |
diagnosticCount | Operational issues recorded for the run. |
fixtureMode | Whether a bundled QA fixture was used instead of the live source. |
source | Source host; swiggy.com. |
provenance | Route family recorded for the run, such as public_html_json_jsonld. |
generatedBy | Generator label recorded in the actor build. |
scrapedAt | Time the summary was written, in ISO UTC. |
| Status | Data status | Meaning |
|---|---|---|
SUCCEEDED | COMPLETE | Eligible results were saved without an extraction problem. |
SUCCEEDED | PARTIAL | Some results were saved, but a later problem prevented a complete run. Saved rows remain available. |
SUCCEEDED | NO_RESULTS | The source completed cleanly and returned no matching results. |
FAILED | FAILED | A fatal error occurred before any usable result was saved. |
Example OUTPUT from the saved run:
{"recordType": "runSummary","status": "SUCCEEDED","runStatus": "SUCCEEDED","dataStatus": "COMPLETE","dataAvailable": true,"actor": "swiggy-restaurant-scraper","requestedStartUrlCount": 1,"requestedMaxItems": 5,"requestedMaxPages": 1,"followPagination": false,"requestDelayMs": 0,"maxConcurrency": 1,"itemsStored": 5,"recordsStored": 5,"dataRecordCount": 5,"uniqueIdentities": 5,"failureCount": 0,"blockedCount": 0,"errorCount": 0,"noResultsCount": 0,"diagnosticCount": 0,"fixtureMode": false,"source": "swiggy.com","provenance": "public_html_json_jsonld","generatedBy": "Codex with GPT-6 Luna","scrapedAt": "2026-10-25T20:56:24.285Z"}
Coverage and limitations
The Actor reads public data from Swiggy over direct HTTPS only. It does not log in to private accounts, use a browser, use a proxy, or bypass access controls. It accepts city, restaurant, JSON, and JSON-LD pages, keeps only official Swiggy restaurant identities, and deduplicates them across start URLs. The JSON listing route used by the archived run exposes a smaller field set than HTML or JSON-LD pages, so many optional schema fields are absent from those rows rather than inferred.
followPagination is off by default; when enabled, the Actor follows same-host rel=next links up to maxPages. maxItems caps unique saved records, not requests. When a public page is blocked, unsupported, empty, or redirected outside Swiggy, failure details go to the Actor log and counts go to OUTPUT; no diagnostic or placeholder dataset row is written. Optional fields are omitted when the source does not publish them. Source availability can change.
Usage and support
This HTTP-only Actor avoids browser startup costs and runs requests sequentially. Cost depends on Apify compute and the number of start pages, pagination pages, and bounded retries. Start with one start URL and a small maxItems; increase maxPages only when pagination is needed. See the Actor's Pricing tab for current account rates.
Use the Actor Issues page to report a problem. Include the run ID, the input used, and the run summary; do not include tokens, cookies, or private data. This Actor is not affiliated with Swiggy. Use it only for public data and in accordance with the source's terms, robots guidance, and applicable law. Public pages can contain personal information; use the output only for lawful purposes.