DEV Community

Cover image for How to Scrape MakeMyTrip and Goibibo Reviews in 2026 (Python + a No-Code Shortcut)
Factden
Factden

Posted on

How to Scrape MakeMyTrip and Goibibo Reviews in 2026 (Python + a No-Code Shortcut)

If you want honest guest sentiment for a hotel in India, one platform is never enough. MakeMyTrip and Goibibo are the country's two largest OTAs, both run by the same group, and the same property usually carries a different pool of reviews on each. A traveller who books on Goibibo often leaves a review Goibibo never shows on MakeMyTrip, and the other way round. To read a hotel's real reputation in the India travel market you need both feeds, side by side.

This guide covers what you can pull from a review, why the DIY route is a two-headed problem, working Python, a no-code shortcut, and a plain comparison. If you want the deeper reference, there is a full guide on how to scrape MakeMyTrip and Goibibo reviews too, plus a step-by-step blog walkthrough.

What you can pull from a review

Per review you can get:

  • Overall rating and the review title, plus the hotel's sub-ratings (Location, Cleanliness, Facilities, Food, Room, Value for Money, Child-friendliness) on the free hotel profile
  • The full review text, and the source brand so you always know whether a row came from MakeMyTrip or Goibibo
  • Trip context: travel type (couple, family, business, solo), room name, and check-in month
  • Reviewer detail: name (or an anonymity flag), and lifetime review count on Goibibo
  • Review photos with AI scene-tags (images as [{ url, aiTags }]), plus owner/management responses with a date
  • An LLM-ready markdown block per review (markdownContent)

The two things that separate a real dataset from a shallow one: the second brand's feed and the free hotel profile (star class, geo, sub-ratings) that ships with every run.

Why scraping MakeMyTrip and Goibibo is hard

  1. There is no public reviews API. MakeMyTrip Group offers no public reviews or hotel-data API for either brand, so scraping the public pages is the only route.
  2. It is two systems, not one. MakeMyTrip and Goibibo share one hotel identity but present reviews through different pages and structures. A scraper built for one usually misses the other, and the brand you skip is often where the newer reviews are.
  3. The hotel profile lives apart from the reviews. Star class, property type, PIN code, geo-coordinates and the clubbed sub-ratings sit on a separate surface you have to fetch and join yourself.
  4. Bot protection and rate limits apply on both brands.

So the work is not parsing one page. It is handling both brands, joining the hotel profile, and staying unblocked, on repeat.

Three ways to get the data

DIY Python MakeMyTrip & Goibibo actor Official API
Setup time Hours to days ~30 seconds Not available (no public reviews API)
Both MakeMyTrip + Goibibo feeds Build two scrapers One run n/a
Free hotel profile (stars, geo, sub-ratings) Fetch and join yourself Included free n/a
Review photos + owner responses Parse nested markup Yes n/a
Cost Proxies + eng time Pay-per-result n/a
Best for One-off Scheduled, at scale Not an option

Option A: DIY in Python

A plain request to a hotel page tends to come back blocked or JavaScript-only:

import httpx

url = "https://www.makemytrip.com/hotels/hotel-details/?hotelId=200703241029455940&city=CTGOI&country=IN"
r = httpx.get(url, headers={"User-Agent": "Mozilla/5.0"})
print(r.status_code)   # challenge / JS-rendered shell, reviews not in the HTML
Enter fullscreen mode Exit fullscreen mode

The reviews load through internal endpoints, so you end up reverse-engineering those (per brand), normalizing two different response shapes, and separately fetching the hotel profile to join on. Doable for one hotel, painful for a portfolio on a schedule.

Option B: the no-code / API shortcut

When you want clean rows, the MakeMyTrip & Goibibo Reviews Scraper on Apify reads both brands in a single run and hands back structured JSON, with the full hotel profile included free. No login, no proxy setup.

from apify_client import ApifyClient

client = ApifyClient("<YOUR_APIFY_TOKEN>")
run = client.actor("factden/makemytrip-scraper").call(run_input={
    "startUrls": [
        "https://www.makemytrip.com/hotels/hotel-details/?hotelId=200703241029455940&city=CTGOI&country=IN",
        "https://www.goibibo.com/hotels/hard-rock-goa-hotel-in-goa-6204281054243107966/"
    ],
    "reviewSource": "auto",
    "maxReviewsPerHotel": 200,
    "sortBy": "mostRecent",
})
for review in client.dataset(run["defaultDatasetId"]).iterate_items():
    print(review["source"], review["overallRating"], review["travelType"])
Enter fullscreen mode Exit fullscreen mode

Mix MakeMyTrip and Goibibo URLs freely. reviewSource takes auto (match each link's own brand), makemytrip, goibibo, or both (collect both brands' reviews for the same hotel). sortBy accepts mostRelevant, mostRecent, helpful, positive, or negative, and you can bound results with fromDate / toDate and minRating / maxRating.

Because this is one actor with a lean input, you can schedule it to monitor ratings and new reviews across both OTAs over time: set sortBy: "mostRecent" and slide fromDate to your last run date, and each nightly pass pulls only what is new, for a few cents. That is the difference between a one-off pull and a live reputation feed for a whole portfolio.

What comes back: 19 fields per review

Group Fields
Core reviewId, hotelId, hotelName, hotelUrl, source (makemytrip / goibibo), submittedAt
Rating overallRating, title
Text reviewText
Reviewer reviewer (name, isAnonymous, reviewsWritten for Goibibo)
Trip context travelType, roomName, checkInMonth
Signals usefulCount, imagesCount, images (url + aiTags), ownerResponse (text, date)
AI-ready markdownContent
Meta extractedAt

A trimmed sample row (a MakeMyTrip review):

{
  "reviewId": "01KXQ014AHMXEWYHEBNBX9ZSCY",
  "hotelName": "Caravela Beach Resort",
  "source": "makemytrip",
  "submittedAt": "2026-07-17",
  "checkInMonth": "2026-07",
  "reviewer": {"name": "Sumit Khare", "isAnonymous": false, "reviewsWritten": null},
  "travelType": "COUPLE",
  "roomName": "Deluxe Room Sea View",
  "overallRating": 5,
  "title": "Wonderful beachside stay",
  "reviewText": "Amazing experience. Great service, good food and a beautiful property...",
  "imagesCount": 3,
  "images": [{"url": "https://.../photo.jpg", "aiTags": ["palm_tree", "grass", "house"]}],
  "ownerResponse": null,
  "markdownContent": "# Caravela Beach Resort review (MakeMyTrip)\n\n**Rating:** 5/5..."
}
Enter fullscreen mode Exit fullscreen mode

Every run also returns a free Hotels row per property: hotelStars, propertyType, hotelAddress, pinCode, geoLat, geoLong, overallRating, ratingLabel, reviewsCount, and the clubbed subRatings. Full field list and snippets are in the GitHub repo.

Grab a free sample dataset

Want to see the data first? There is a free MakeMyTrip and Goibibo sample (CSV/JSON) here: factden.com/sample-makemytrip. It includes rows from both brands so you can see the shape before you run anything.

FAQ

Is scraping MakeMyTrip or Goibibo legal? The reviews are publicly visible. As with any scraping, check the sites' Terms of Service and your local rules (India's DPDP Act, GDPR, and so on), and use the data responsibly.

Is there an official MakeMyTrip / Goibibo reviews API? No public one. MakeMyTrip Group offers no public reviews or hotel-data API for either brand, so scraping the public pages is the only route for most teams.

Can I get both brands' reviews for the same hotel? Yes. The two platforms share one hotel identity, so set reviewSource: "both" and you get the MakeMyTrip and Goibibo review feeds for the same property, each row tagged by source.

Can I scrape both MakeMyTrip and Goibibo at once? Yes, that is the point. Mix both URL types in one run (or paste raw hotel IDs) and the output uses the same schema, tagged by source.

Can I track a hotel's rating over time? Yes. Schedule the actor with sortBy: "mostRecent" and a sliding fromDate, and each run pulls only new reviews across both OTAs, cheaply, so you build a rating and sentiment trend without re-scraping everything.

How do I stop getting blocked? Plain requests get challenged on both brands. This is the hard part of the job, and the actor handles it for you, no proxy or account setup required.

Related

Questions, or a field you wish it extracted? Drop a comment.

Top comments (0)