# MakeMyTrip Hotels Scraper (`shahidirfan/makemytrip-hotels-scraper`) Actor

Extract hotel listings, prices, ratings, reviews, amenities, locations, room details, availability, and property information from MakeMyTrip. Get structured travel data for hotel research, price monitoring, market analysis, and competitive intelligence.

- **URL**: https://apify.com/shahidirfan/makemytrip-hotels-scraper.md
- **Developed by:** [Shahid Irfan](https://apify.com/shahidirfan) (community)
- **Categories:** Travel, Automation, Developer tools
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 1 bookmarks
- **User rating**: 5.00 out of 5 stars

## Pricing

Pay per usage

This Actor is paid per platform usage. The Actor is free to use, and you only pay for the Apify platform usage, which gets cheaper the higher subscription plan you have.

Learn more: https://docs.apify.com/platform/actors/running/actors-in-store#pay-per-usage

## What's an Apify Actor?

Actors are web data automations that power AI and operations. They run on the Apify platform to scrape websites, process data, connect APIs, and automate workflows.
In Batch mode, an Actor accepts a well-defined JSON input, performs an action which can take anything from a few seconds to a few hours,
and optionally produces a well-defined JSON output, datasets with results, or files in key-value store.
In Standby mode, an Actor provides a web server which can be used as a website, API, or an MCP server.
Actors are written with capital "A".

## How to integrate an Actor?

If asked about integration, you help developers integrate Actors into their projects.
You adapt to their stack and deliver integrations that are safe, well-documented, and production-ready.
The best way to integrate Actors is as follows.

- **AI agents and MCP clients** — the [Apify MCP server](https://docs.apify.com/integrations/mcp.md) at `https://mcp.apify.com` (remote, streamable HTTP, OAuth on first use).
- **Agentic workflows and local Actor development** — [Agent Skills](https://apify.com/.well-known/agent-skills/index.json) with the [Apify CLI](https://docs.apify.com/cli/docs.md): `npm install -g apify-cli`, then `apify login`.
- **JavaScript/TypeScript projects** — the official [JS/TS client](https://docs.apify.com/api/client/js/docs.md): `npm install apify-client`.
- **Python projects** — the official [Python client](https://docs.apify.com/api/client/python/docs.md): `pip install apify-client`.
- **Any other language** — the [REST API](https://docs.apify.com/api/v2.md).

For usage examples, see the [API](#api) section below.

For more details, see Apify documentation as [Markdown index](https://docs.apify.com/llms.txt) and [Markdown full-text](https://docs.apify.com/llms-full.txt).

# README

### What does MakeMyTrip Hotels Listing Scraper do?

MakeMyTrip Hotels Listing Scraper collects structured hotel listings from MakeMyTrip destination search pages. Paste one or more hotel listing URLs to extract property names, ratings, review counts, locations, coordinates, images, categories, availability signals, and direct hotel links for travel research and hospitality analysis.

The Actor accepts full MakeMyTrip listing URLs, preserves the destination and occupancy context, and removes empty values from each result. If a saved URL contains dates that have already passed, the Actor preserves the stay length and moves the search to the next available day.

### Why use MakeMyTrip Hotels Listing Scraper?

- **Build hotel datasets quickly** - Replace manual copying with clean, structured rows ready for analysis.
- **Compare destination inventory** - Review property types, star ratings, guest scores, review volume, categories, and location signals across cities.
- **Track listing position** - Save each property's page and position for repeated visibility checks.
- **Collect media and location data** - Capture primary images, additional media, latitude, longitude, location labels, and hotel links when MakeMyTrip publishes them.
- **Automate recurring research** - Run on demand, schedule repeat collections, export datasets, or connect results to downstream tools.
- **Avoid duplicate rows** - Hotels are deduplicated by their MakeMyTrip hotel ID within each target search.

### What hotel data can you extract from MakeMyTrip?

| Field                 | Description                                        |
| --------------------- | -------------------------------------------------- |
| `hotelId`             | MakeMyTrip hotel identifier                        |
| `hotelName`           | Property display name                              |
| `hotelUrl`            | Direct hotel detail URL                            |
| `sourceUrl`           | Listing URL supplied for the search                |
| `listingPage`         | Result page where the hotel appeared               |
| `listingPosition`     | Position in the collected listing sequence         |
| `propertyType`        | Property type, such as hotel, resort, or apartment |
| `propertyLabel`       | Additional property label shown by MakeMyTrip      |
| `stayType`            | Stay classification when available                 |
| `hotelType`           | MakeMyTrip hotel type value                        |
| `starRating`          | Hotel star classification                          |
| `starRatingType`      | Source or type of star rating                      |
| `hotelCategory`       | MakeMyTrip category label                          |
| `soldOut`             | Whether the listing is marked sold out             |
| `showCallToBook`      | Whether the property requires a call to book       |
| `totalRoomCount`      | Published room count when available                |
| `priceDisplayMsg`     | Price or availability message shown on the listing |
| `locationName`        | Area or destination name                           |
| `locationType`        | Type of location returned for the property         |
| `cityCode`            | MakeMyTrip destination city code                   |
| `countryCode`         | Country code used by the listing search            |
| `countryName`         | Published country name                             |
| `latitude`            | Property latitude                                  |
| `longitude`           | Property longitude                                 |
| `overallRating`       | Aggregate guest rating                             |
| `ratingText`          | Guest rating label, such as Excellent              |
| `formattedRatingText` | Formatted rating description                       |
| `totalReviewCount`    | Total published review count                       |
| `totalRatingCount`    | Total published rating count                       |
| `ratingBreakdown`     | Detailed rating summary when available             |
| `categories`          | Property categories and listing tags               |
| `locationPersuasion`  | Location-related selling points                    |
| `persuasions`         | Badges and selling-point text shown on the listing |
| `heroImage`           | Primary hotel image URL                            |
| `media`               | Additional property media URLs and media types     |
| `totalImageCount`     | Total number of published images                   |
| `travellerImageCount` | Number of traveller images                         |
| `hotelMediaCount`     | Hotel media count                                  |
| `sponsored`           | Sponsored placement flag when available            |
| `appDeeplink`         | MakeMyTrip app link when published                 |
| `sharingUrl`          | Shareable property URL                             |
| `checkin`             | Effective check-in date in MakeMyTrip format       |
| `checkout`            | Effective check-out date in MakeMyTrip format      |
| `roomStayQualifier`   | Room and guest occupancy value                     |
| `searchText`          | Destination text used in the search                |
| `currency`            | Display currency context                           |

Fields that are unavailable for a particular hotel are omitted instead of being saved as null or empty values.

### How to use MakeMyTrip Hotels Listing Scraper

1. Open a MakeMyTrip hotel search for your destination, dates, rooms, and guests.
2. Copy the complete hotel listing URL from the browser.
3. Add the URL to `startUrls` in the Actor input.
4. Set `resultsWanted` and the `maxPages` safety limit.
5. Keep residential proxy settings enabled for hosted runs.
6. Run the Actor and download or integrate the resulting dataset.

### Input Parameters

| Parameter            | Type    | Required | Default           | Description                                   |
| -------------------- | ------- | -------- | ----------------- | --------------------------------------------- |
| `startUrls`          | Array   | No       | Dubai listing URL | One or more MakeMyTrip hotel listing URLs     |
| `resultsWanted`      | Integer | No       | `20`              | Maximum unique hotel listings to save per URL |
| `maxPages`           | Integer | No       | `2`               | Maximum listing pages to collect per URL      |
| `proxyConfiguration` | Object  | No       | Residential proxy | Proxy settings for reliable hosted runs       |

### Usage Examples

#### Collect 20 Dubai hotel listings

Use a complete destination listing URL for the most accurate city, date, room, and guest context.

```json
{
    "startUrls": [
        {
            "url": "https://www.makemytrip.global/hotels/hotel-listing/?checkin=09012026&city=CTDUB&checkout=09022026&roomStayQualifier=2e0e&locusId=CTDUB&country=UNI&locusType=city&searchText=Dubai"
        }
    ],
    "resultsWanted": 20,
    "maxPages": 2
}
```

#### Collect listings from multiple destinations

Each URL is processed as a separate target, and the result limit applies to each target.

```json
{
    "startUrls": [
        {
            "url": "https://www.makemytrip.global/hotels/hotel-listing/?checkin=09012026&city=CTDUB&checkout=09022026&roomStayQualifier=2e0e&locusId=CTDUB&country=UNI&locusType=city&searchText=Dubai"
        },
        {
            "url": "https://www.makemytrip.global/hotels/hotel-listing/?checkin=09012026&city=CTSIN&checkout=09022026&roomStayQualifier=2e0e&locusId=CTSIN&country=SGP&locusType=city&searchText=Singapore"
        }
    ],
    "resultsWanted": 20,
    "maxPages": 2
}
```

#### Build a larger destination dataset

Increase both limits when you need more than the first result page.

```json
{
    "startUrls": [
        {
            "url": "https://www.makemytrip.global/hotels/hotel-listing/?checkin=09012026&city=CTLON&checkout=09032026&roomStayQualifier=2e0e&locusId=CTLON&country=GBR&locusType=city&searchText=London"
        }
    ],
    "resultsWanted": 60,
    "maxPages": 4,
    "proxyConfiguration": {
        "useApifyProxy": true,
        "apifyProxyGroups": ["RESIDENTIAL"]
    }
}
```

### Sample Output

```json
{
    "hotelId": "202202221653165800",
    "hotelName": "Taj Exotica Resort & Spa, The Palm, Dubai",
    "hotelUrl": "https://www.makemytrip.global/hotels/hotel-details/?hotelId=202202221653165800",
    "listingPage": 1,
    "listingPosition": 1,
    "propertyType": "Resort",
    "starRating": 5,
    "hotelCategory": "LUXE",
    "soldOut": false,
    "locationName": "Palm Jumeirah",
    "cityCode": "CTDUB",
    "countryName": "United Arab Emirates",
    "latitude": 25.12398,
    "longitude": 55.15409,
    "overallRating": 4.7,
    "ratingText": "Excellent",
    "totalReviewCount": 219,
    "totalRatingCount": 1150,
    "categories": ["Luxury", "Beach Property"],
    "persuasions": ["Private beach access"],
    "heroImage": "https://promos.makemytrip.com/Hotels_product/Luxe/Hero/example.webp",
    "checkin": "09012026",
    "checkout": "09022026",
    "searchText": "Dubai",
    "currency": "SGD"
}
```

### Tips for Best Results

- Use complete MakeMyTrip hotel listing URLs with destination, dates, and occupancy included.
- Start with `resultsWanted: 20` and `maxPages: 2` before increasing collection size.
- Keep residential proxy settings enabled on Apify because MakeMyTrip may restrict datacenter traffic.
- Use future travel dates. Expired dates are moved forward automatically, but current dates provide clearer run-to-run comparisons.
- Run comparable searches with the same occupancy and currency when building time-series datasets.
- Some optional fields vary by property, destination, and listing state. Missing source values are omitted from the dataset.

### Integrations and exports

- **Google Sheets** - Send hotel rows to a shared research spreadsheet.
- **Webhooks** - Notify another system when a collection finishes.
- **Make and Zapier** - Connect hotel datasets to no-code workflows.
- **Apify API** - Start runs and retrieve datasets from applications or scripts.
- **Dataset exports** - Download results as JSON, CSV, Excel, XML, or other supported formats.

### Frequently Asked Questions

#### Can I use any MakeMyTrip hotel listing URL?

Yes. Use a public hotel search or listing URL that includes a valid destination. Extra tracking parameters are retained where safe, while the search context needed for collection is normalized.

#### What happens when my saved URL contains old dates?

The Actor moves an expired stay to the next available day while preserving the original number of nights. The effective `checkin` and `checkout` values are included in every output row.

#### Can I collect hotels from several cities in one run?

Yes. Add multiple entries to `startUrls`. The Actor processes each destination separately and applies `resultsWanted` to each URL.

#### Why are some output fields missing?

MakeMyTrip does not publish every optional field for every hotel. Empty strings, null values, and empty nested objects are removed to keep exports clean.

#### Can I schedule hotel monitoring?

Yes. Use Apify schedules to repeat the same search hourly, daily, weekly, or at another interval, then send the dataset to an integration or webhook.

#### Is it legal to collect MakeMyTrip hotel data?

Collection of public web data may be permitted in many contexts, but you are responsible for complying with applicable laws, MakeMyTrip terms, and privacy requirements.

### Related Actors

- [Booking.com Scraper](https://apify.com/shahidirfan/booking-com-scraper)
- [Expedia Hotels Scraper](https://apify.com/shahidirfan/expedia-hotels-scraper)
- [Tripadvisor Hotels Scraper](https://apify.com/shahidirfan/tripadvisor-hotels-scraper)
- [Trip.com Hotels Scraper](https://apify.com/shahidirfan/trip-com-hotels-scraper)

### Support

For bugs, target-page changes, or feature requests, use the Issues tab on the Actor page and include the input URL plus the run ID.

### Legal Notice

This Actor is intended for legitimate collection of publicly available hotel listing data. Users are responsible for using the output responsibly and complying with applicable laws, website terms, and data protection rules.

# Actor input Schema

## `startUrls` (type: `array`):

MakeMyTrip hotel listing URLs. Paste one or more search/listing URLs.

## `resultsWanted` (type: `integer`):

Maximum number of hotel listings to save per URL.

## `maxPages` (type: `integer`):

Maximum listing pages to request per URL.

## `proxyConfiguration` (type: `object`):

Apify proxy settings. Residential proxy is recommended for hosted runs.

## Actor input object example

```json
{
  "startUrls": [
    {
      "url": "https://www.makemytrip.global/hotels/hotel-listing/?checkin=07162026&city=CTDUB&checkout=07172026&roomStayQualifier=2e0e&locusId=CTDUB&country=UNI&locusType=city&searchText=Dubai&regionNearByExp=3&rsc=1e2e0e"
    }
  ],
  "resultsWanted": 20,
  "maxPages": 2,
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ],
    "countryCode": "SG"
  }
}
```

# Actor output Schema

## `overview` (type: `string`):

No description

# API

You can run this Actor programmatically using our API. Below are code examples in JavaScript, Python, and CLI, as well as the OpenAPI specification and MCP server setup.

## JavaScript example

```javascript
import { ApifyClient } from 'apify-client';

// Initialize the ApifyClient with your Apify API token
// Replace the '<YOUR_API_TOKEN>' with your token
const client = new ApifyClient({
    token: '<YOUR_API_TOKEN>',
});

// Prepare Actor input
const input = {
    "startUrls": [
        {
            "url": "https://www.makemytrip.global/hotels/hotel-listing/?checkin=07162026&city=CTDUB&checkout=07172026&roomStayQualifier=2e0e&locusId=CTDUB&country=UNI&locusType=city&searchText=Dubai&regionNearByExp=3&rsc=1e2e0e"
        }
    ],
    "resultsWanted": 20,
    "maxPages": 2
};

// Run the Actor and wait for it to finish
const run = await client.actor("shahidirfan/makemytrip-hotels-scraper").call(input);

// Fetch and print Actor results from the run's dataset (if any)
console.log('Results from dataset');
console.log(`💾 Check your data here: https://console.apify.com/storage/datasets/${run.defaultDatasetId}`);
const { items } = await client.dataset(run.defaultDatasetId).listItems();
items.forEach((item) => {
    console.dir(item);
});

// 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/js/docs

```

## Python example

```python
from apify_client import ApifyClient

# Initialize the ApifyClient with your Apify API token
# Replace '<YOUR_API_TOKEN>' with your token.
client = ApifyClient("<YOUR_API_TOKEN>")

# Prepare the Actor input
run_input = {
    "startUrls": [{ "url": "https://www.makemytrip.global/hotels/hotel-listing/?checkin=07162026&city=CTDUB&checkout=07172026&roomStayQualifier=2e0e&locusId=CTDUB&country=UNI&locusType=city&searchText=Dubai&regionNearByExp=3&rsc=1e2e0e" }],
    "resultsWanted": 20,
    "maxPages": 2,
}

# Run the Actor and wait for it to finish
run = client.actor("shahidirfan/makemytrip-hotels-scraper").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print(f"💾 Check your data here: https://console.apify.com/storage/datasets/{run.default_dataset_id}")
for item in client.dataset(run.default_dataset_id).iterate_items():
    print(item)

# 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/python/docs/quick-start

```

## CLI example

```bash
echo '{
  "startUrls": [
    {
      "url": "https://www.makemytrip.global/hotels/hotel-listing/?checkin=07162026&city=CTDUB&checkout=07172026&roomStayQualifier=2e0e&locusId=CTDUB&country=UNI&locusType=city&searchText=Dubai&regionNearByExp=3&rsc=1e2e0e"
    }
  ],
  "resultsWanted": 20,
  "maxPages": 2
}' |
apify call shahidirfan/makemytrip-hotels-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,shahidirfan/makemytrip-hotels-scraper"
        }
    }
}

```

The hosted server signs you in with OAuth on first connect, so no API token belongs in this config. Clients without OAuth support can send an `Authorization: Bearer <APIFY_API_TOKEN>` header instead, using a token from API & Integrations in Apify Console (https://console.apify.com/settings/integrations).

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/actors/Mu3k19waU0XcoDnpX/builds/OZM1dyfd6TerNiUNd/openapi.json
