What the MakeMyTrip scraper collects
Scrapes MakeMyTrip's hotel listings into JSON and CSV: one 41-column row per property on a city's listing, for the dates and guests you give it. Rows carry nightly price after discount, with taxes and with property fees, the guest rating and whose reviews it summarises, stars, property type, locality and coordinates.
City hotel listing
Input: A city name or site location code, plus dates and guestsOne row per property with nightly price, taxes, fees, discount, coupon, stars, rating, review counts, locality and coordinates.
Sorted and family searches
Input: A city plus --sort, --adults or --child-ageThe same rows under a chosen ordering or guest mix; the ordering is recorded on every row.
Listing URL
Input: A MakeMyTrip hotel-listing URLReads the query (city, dates, guests) from the site's own listing address.
From zero to MakeMyTrip data in 3 steps
Install
Clone the repository and install one browser engine. Python 3.9+.
$ git clone https://github.com/2scraper/makemytrip-scraper.git && cd makemytrip-scraper $ python3 -m venv venv $ ./venv/bin/pip install -r requirements.txt -r requirements-playwright.txt $ cp .env.example .env
Run a scraper
Pick what you need and run it. Every flag is documented in the README.
$ python playwright_scraper.py --city Goa --checkin 2026-11-10 --checkout 2026-11-12 --pages 3$ python playwright_scraper.py --city Mumbai --child-age 5 --child-age 8$ python playwright_scraper.py --url "https://www.makemytrip.com/hotels/hotel-listing/?checkin=11102026&checkout=11112026&city=CTGOI&locusId=CTGOI&locusType=city&country=IN&roomStayQualifier=2e0e"Get structured data
Rows land in JSON or CSV (
--format), with a.meta.jsonsidecar recording status, pages fetched and why the run stopped.
MakeMyTrip data fields
41 columns per row in a predictable schema. The most useful ones:
| Field | What it holds |
|---|---|
sku | MakeMyTrip hotel id |
title | Property name |
price | Per-night price after the site's discount, before taxes |
price_with_tax | Per-night price including taxes |
price_with_fees | Per-night price including fees paid at the property |
original_price | Struck-through price, where shown |
discount_pct | Discount implied by the two prices |
coupon_code | Coupon the site applied |
property_type | Hotel, Resort, Hostel, Apartment, … |
star_rating | Star class (null for unstarred properties) |
rating | Guest rating |
review_count | Number of reviews |
review_source | Whose reviews the rating summarises (MMT, MMT_EXP, MMT_BKG, …) |
locality | Neighbourhood or area |
latitude | Latitude of the property |
section | Which block of the listing the row came from |
[
{
"source": "makemytrip.com",
"scraped_at": "2026-09-24T23:32:04.971786+00:00",
"url": "https://www.makemytrip.com/hotels/hotel-details?hotelId=202410211734063978&checkin=1120…",
"sku": "202410211734063978",
"title": "Ginger Goa, Candolim",
"price": 6441.0,
"original_price": 7199.0,
"currency": "INR",
"discount_pct": 10.5,
"price_with_tax": 7449.0,
"price_with_fees": 7449.0,
"price_basis": "Per Night",
"coupon_code": "MMTSMARTSAVING",
"coupon_discount": 758.0,
"property_type": "Hotel",
"star_rating": 4,
"rating": 4.2,
"rating_count": 3941,
"review_count": 1962,
"rating_text": "Very Good",
"review_source": "MMT",
"locality": "Candolim",
"city": "Goa",
"city_code": "CTGOI",
"country_code": "IN",
"latitude": 15.52459,
"longitude": 73.76756,
"image": "https://r1imghtlak.mmtcdn.com/0f00d12b-9701-420b-b944-7cf35bc4d064.jpg?output-quality=7…",
"categories": [
"Chain",
"Couple Friendly",
"wow_weekend26",
"… 5 more"
],
"sold_out": false,
"sponsored": false,
"section": "RECOMMENDED_HOTELS",
"check_in": "2026-11-20",
"check_out": "2026-11-21",
"adults": 2,
"rooms": 1,
"page": 1,
"position": 1,
"mode": "hotels",
"sort": "popular"
},
{
"source": "makemytrip.com",
"scraped_at": "2026-09-24T23:32:04.971827+00:00",
"url": "https://www.makemytrip.com/hotels/hotel-details?hotelId=202410121919144277&checkin=1120…",
"sku": "202410121919144277",
"title": "Gateway Goa, Palolem (A Taj InnerCircle Hotel)",
"price": 7500.0,
"original_price": null,
"currency": "INR",
"discount_pct": null,
"price_with_tax": 7875.0,
"price_with_fees": 7875.0,
"price_basis": "Per Night",
"coupon_code": "MMTTAJA11",
"coupon_discount": 505.0,
"property_type": "Resort",
"star_rating": 5,
"rating": 4.7,
"rating_count": 682,
"review_count": 272,
"rating_text": "Excellent",
"review_source": "MMT",
"locality": "Palolem",
"city": "Goa",
"city_code": "CTGOI",
"country_code": "IN",
"latitude": 14.99538,
"longitude": 74.04094,
"image": "https://r2imghtlak.mmtcdn.com/r2-mmt-htl-image/htl-imgs/202410121919144277-3f4177f6-4b8…",
"categories": [
"Chain",
"DH_Premium",
"taj_gc",
"… 6 more"
],
"sold_out": false,
"sponsored": false,
"section": "RECOMMENDED_HOTELS",
"check_in": "2026-11-20",
"check_out": "2026-11-21",
"adults": 2,
"rooms": 1,
"page": 1,
"position": 2,
"mode": "hotels",
"sort": "popular"
}
]First 2 of 18 rows from a real run — sample_output.json. Long values shortened here.
Handles what breaks naive MakeMyTrip scrapers
Substitute hotels flagged
A wrong city code returns another town's hotels under a NEARBY_HOTELS block in an ordinary HTTP 200. Every row carries section, and the run warns and counts substitutes.
Three prices, not one
Each row has the nightly price, the price with taxes and the price with fees collected at the property, so city taxes stated in another currency are not lost.
Cursor overlap de-duplicated
The listing is paged by a cursor and same-price properties can repeat across pages; repeats are dropped and logged rather than double-counted.
Zero means none
Unstarred hostels and unrated properties carry 0 in the site's data; both become null so averages over the columns mean something.
Scraping infrastructure included
The same tested core runs every 2scraper repository, so the hard parts work the same way on every site.
CAPTCHA handling
Detects the challenge a page really serves and, with a 2Captcha key, solves it only when it blocks the data — a capped number of solves per page.
Proxy rotation
Single proxy or a pool from a file, rotated on blocks with a fresh browser per exit. Credentials stay out of argv and logs.
Fingerprints
Optional complete device identity from the 2Captcha Fingerprint API — user agent, client hints, locale and timezone that agree with each other.
Scraping Browser API
Point --cdp-endpoint at a managed Chromium with its own exit country — no browser infrastructure to run yourself.
Honest run metadata
Every run writes a .meta.json sidecar and distinct exit codes: complete, blocked, empty and partial are never confused, and a failed run never overwrites good data.
Diff two runs
diff_runs.py compares two complete MakeMyTrip snapshots by id — new, removed and changed rows for monitoring.
What teams do with MakeMyTrip data
Hotel rate monitoring
Track nightly prices, taxes and fees for a city and date range, diffing runs of the same query by sku.
Discount and coupon tracking
Record struck-through prices, discount percentages and the coupons MakeMyTrip applies.
Competitive analysis for hotels
Compare a property's price and guest rating against neighbours in the same locality and star class.
Destination research
Map supply by property type, stars and coordinates across Indian and international cities.
Free to run. Pay only for what the site requires.
Needs a residential exit or the Scraping Browser API
From a datacentre address MakeMyTrip served nothing to any client in Sep 2026, and there was no captcha on the way in. The one product measured to work is the Scraping Browser API with an Indian (country-in) exit, which returned full listings. Residential proxies and fingerprints are supported but were not measured to help here; captcha solving is wired in but had nothing to solve.
Optional 2Captcha services — captcha solving, the Scraping Browser API, residential proxies and fingerprints — work behind one key.
Good to know
- Flights are not implemented.
- --concurrency above 1 is refused because pages chain by cursor.
- The Scraper API route reads only a listing's first five properties.
2scraper vs. hosted scraper APIs
| 2scraper | Typical hosted API | |
|---|---|---|
| Code | Open source, MIT — read and patch it | Closed |
| Cost | Free; optional services billed only when used | Subscription or per request / per result |
| Runs on | Your machine, server or CI | The vendor's infrastructure |
| Output | JSON/CSV files + run metadata | API responses |
| When the site changes | Fix it yourself or open an issue / PR | Wait for the vendor |
MakeMyTrip scraper FAQ
What do I need to run it?
A Scraping Browser API endpoint with a country-in profile, set in .env. A local browser from a datacentre address is refused; a home connection in India has not been tried.
Which currency are prices in?
INR, whatever the city, because the currency follows the site's region. Prices are per night before taxes, with taxed and fee-inclusive prices in separate columns.
Does it scrape flights?
No. This repo does not implement flights; their results arrive as a server-sent event stream. Hotels only.
How many pages can I fetch?
Pages of up to 30 properties are fetched one after another via the site's cursor; the site states no total, and the run ends as complete when the site says nothing follows.
What output formats are supported?
JSON and CSV with the same 41 columns, plus a <out>.meta.json recording the query, currency and whether the listing ended.
Is scraping MakeMyTrip legal?
It reads the public hotel listing an anonymous visitor sees, books nothing and logs into nothing. It is public data; follow the site's terms and the law.