# Expedia Hotel Listings Scraper (`parseforge/expedia-scraper`) Actor

Scrape Expedia hotel listings by destination or URL. Returns property name, price, star rating, guest rating, and booking link. No API key needed.

- **URL**: https://apify.com/parseforge/expedia-scraper.md
- **Developed by:** [ParseForge](https://apify.com/parseforge) (community)
- **Categories:** Travel, Lead generation, Other
- **Stats:** 40 total users, 2 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $11.99 / 1,000 result items

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.
Since this Actor supports Apify Store discounts, the price gets lower the higher subscription plan you have.

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

## 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

[![ParseForge](https://raw.githubusercontent.com/ParseForge/apify-assets/main/banner.jpg)](https://apify.com/parseforge?fpr=vmoqkp)

### Expedia Hotel Listings Scraper

**Scrape Expedia hotel listings for any destination and dates, up to a million properties per run.** Every listing comes with its name, price, star rating, guest rating, and booking link. No login or API key. Export to CSV, JSON, Excel, or XML.

Expedia's website uses heavy anti-bot protection (DataDome and Akamai) that blocks standard scrapers. This Actor reads the public hotel search results directly, filtered by price, star rating, guest rating, and sort order, and returns each property in one fixed schema. It handles pagination and proxy rotation automatically.

| Who uses it | What they scrape Expedia for |
|---|---|
| Travel market researchers | Which hotels are available in a city on specific dates and at what price range |
| Competitive intelligence analysts | How hotel prices and ratings compare across destinations for a brand |
| Price monitoring teams | Track nightly rates for a set of hotels over time to adjust pricing strategies |
| Travel bloggers and content creators | Build a dataset of hotel options for a destination guide or comparison article |

### What it does

This Actor collects Expedia hotel listings by destination or direct URL, and returns each property as a flat row with name, price, star rating, guest rating, and booking link.

- 🔍 **Destination search:** Enter a city or region and dates, and the Actor fetches all matching hotel listings.
- 🔗 **Direct URL mode:** Paste a full Expedia hotel search URL to scrape exactly that page, ignoring other filters.
- 💰 **Price filters:** Set minimum and maximum price per night to narrow results to your budget range.
- ⭐ **Star and guest rating filters:** Filter by star rating (1-5) and minimum guest rating (0-10) to target quality properties.
- 📊 **Sort options:** Sort by recommended, price low to high, price high to low, guest rating, or star rating.

Results export to CSV, JSON, Excel, or XML, or straight from the API.

### What you can do with Expedia data

**📈 Monitor hotel pricing trends.**

A travel analytics firm runs the Actor weekly for top destinations to track price changes and inform their clients' booking decisions.

**🔍 Build a hotel comparison database.**

A travel startup scrapes Expedia listings for 50 cities to populate a price comparison tool with live rates and ratings.

**📊 Support market research reports.**

A hospitality consultant collects hotel data for a city to analyze supply, price distribution, and star rating mix for a client report.

**🏨 Optimize revenue management.**

A hotel chain uses the Actor to monitor competitor prices on Expedia for their market, adjusting their own rates to stay competitive.

### Why choose this scraper

|  | What you get |
|---|---|
| **No login needed** | Scrape Expedia without an account or API key. |
| **Residential proxies built in** | Handles DataDome and Akamai protection automatically. |
| **Flexible input** | Use a destination name or a direct URL, with date and guest count. |
| **Filter on the fly** | Set price range, star rating, guest rating, and sort order before the run. |
| **Export ready** | Results come as CSV, JSON, Excel, or XML with one row per property. |

### How it compares

This Actor focuses on Expedia hotel listings (prices, ratings, and booking links), while the competitors below cover reviews or Google Hotels data.

| Feature | ParseForge | Google Hotels Scraper - Prices, OTA Rates, Room Rates & Reviews | Expedia Reviews Scraper ✈️ Hotel Ratings, Text & Sentiment | Hotels.com Reviews Scraper 🏨 Ratings, Text & Sentiment |
|---|---|---|---|---|
| Scrapes hotel listings (name, price, star rating) | Yes | Yes | Not listed | Not listed |
| Scrapes hotel reviews (text, ratings, sentiment) | Not listed | Not listed | Yes | Yes |
| Price filter (min/max per night) | Yes | Not listed | Not listed | Not listed |
| Star rating filter | Yes | Not listed | Not listed | Not listed |
| Guest rating filter | Yes | Not listed | Not listed | Not listed |
| Sort by price, rating, or recommendation | Yes | Not listed | Not listed | Not listed |
| Direct URL input | Yes | Not listed | Not listed | Not listed |

### Configure the run

Drive the Actor from a destination or a direct Expedia search URL, and apply filters for price, star rating, guest rating, and sort order as each listing is read so only matches reach your dataset. The Input tab lists every parameter.

A first run with the defaults:

```json
{
  "destination": "New York",
  "checkIn": "2026-03-15",
  "checkOut": "2026-03-18",
  "maxItems": 10,
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ]
  }
}
```

A larger pull:

```json
{
  "destination": "New York",
  "checkIn": "2026-03-15",
  "checkOut": "2026-03-18",
  "maxItems": 200,
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ]
  }
}
```

### Pricing

Pay-per-result: **$0.01599 per result** collected. You pay only for the results written to your dataset.

| Results collected | Approximate cost |
|---|---|
| 100 results | $1.60 |
| 1,000 results | $15.99 |
| 10,000 results | $159.90 |

New Apify accounts start with $5 in free credit.

### Free users

Free-plan runs return up to 10 results as a preview. [Upgrade your Apify plan](https://console.apify.com/sign-up?fpr=vmoqkp) to collect up to 1,000,000 results per run.

### Run it

1. [Create a free Apify account with $5 in credit](https://console.apify.com/sign-up?fpr=vmoqkp).
2. Open the [Expedia Hotel Listings Scraper](https://apify.com/parseforge/expedia-scraper?fpr=vmoqkp).
3. Set your inputs and any filters, then click **Start**.
4. Export the results as CSV, Excel, JSON, or XML from the **Dataset** tab.

Run it programmatically through the [Apify API](https://docs.apify.com/api/v2) (`run-sync-get-dataset-items`) or the [ApifyClient](https://docs.apify.com/api/client/js) for JavaScript and Python.

### Use with AI agents (MCP)

Give an AI agent live access to Expedia through the Model Context Protocol. Add the Actor to Claude, Cursor, or any MCP client:

```bash
claude mcp add --transport http apify "https://mcp.apify.com/?tools=parseforge/expedia-scraper"
```

Then prompt it in plain language to run the scraper and read back the results.

### Troubleshooting

**Why am I getting no results?**

Check that your destination is a valid city or region name, and that your check-in and check-out dates are in YYYY-MM-DD format and in the future. Also ensure residential proxies are enabled.

**The Actor is returning very few results.**

Increase maxItems. Also check if your price or star rating filters are too restrictive. Try removing filters to see the full listing count.

**I'm getting blocked or captchas.**

Lower maxConcurrency to 1 or 2, and make sure you are using Apify residential proxies. If the issue persists, try a different proxy group or contact support.

**The price shown is not in USD.**

Expedia displays prices based on your IP location. The price filter is in USD, but the output price will be in the currency shown on the page. Use a proxy in a USD region if needed.

**My direct URL is not working.**

Ensure the URL is a valid Expedia hotel search URL (e.g., https://www.expedia.com/Hotel-Search?destination=...). If you provide a URL, the destination and date fields are ignored.

### FAQ

| Question | Answer |
|---|---|
| Do I need an Expedia API key? | No. This Actor scrapes the public Expedia website directly, so no API key or account is required. |
| What proxy type does this Actor use? | It uses Apify residential proxies by default, which are required to bypass Expedia's DataDome and Akamai anti-bot protection. |
| Can I scrape Expedia without a check-in date? | No. Expedia requires check-in and check-out dates to show results. You must provide both in YYYY-MM-DD format. |
| How many properties can I scrape per run? | You can set maxItems up to 1,000,000. The actual number depends on how many listings Expedia returns for your query. |
| Does this scrape hotel reviews? | No. This Actor only scrapes hotel listing data (name, price, star rating, guest rating, booking link). For reviews, use the Expedia Reviews Scraper. |
| Can I filter by price in a specific currency? | The price filter is in USD. Expedia may show prices in other currencies depending on your location, but the filter applies to the displayed price. |
| What happens if I get blocked? | Lower the maxConcurrency setting (default 3) and ensure residential proxies are enabled. The Actor retries failed requests automatically. |
| Can I scrape multiple destinations in one run? | No. Each run scrapes one destination or one URL. To scrape multiple destinations, run the Actor multiple times with different inputs. |
| Does the Actor handle pagination? | Yes. It automatically follows pagination to collect all matching properties up to your maxItems limit. |
| What data fields are returned? | Each property returns its name, price, star rating, guest rating, booking link, and other fields visible in the search results. The exact field list is shown in the output schema after a run. |

### Related actors

Browse the full [ParseForge collection](https://apify.com/parseforge?fpr=vmoqkp) for more scrapers.

🆘 **Need help?** Email parseforge@protonmail.com with your run ID, your input, and what you expected.

⚠️ **Disclaimer.** This Actor is unofficial and is not affiliated with, endorsed by, or sponsored by Expedia, Inc. It collects only publicly available data. You are responsible for using the collected data in compliance with the source's terms of service and applicable data-protection laws, including GDPR, CCPA, and PIPL. Do not use it to collect personal data unlawfully.

# Actor input Schema

## `destination` (type: `string`):

City or region to search for hotels (e.g. 'New York', 'Paris', 'London'). Used when no Start URL is provided.

## `startUrl` (type: `string`):

Expedia Hotel-Search URL to scrape. If provided, destination and other filters are ignored.

## `checkIn` (type: `string`):

Check-in date in YYYY-MM-DD format (e.g. '2026-03-15').

## `checkOut` (type: `string`):

Check-out date in YYYY-MM-DD format (e.g. '2026-03-18').

## `adults` (type: `integer`):

Number of adult guests per room.

## `children` (type: `integer`):

Number of children per room.

## `rooms` (type: `integer`):

Number of rooms to book.

## `maxItems` (type: `integer`):

How many properties to collect per run.

## `priceMin` (type: `integer`):

Minimum price per night filter (in USD).

## `priceMax` (type: `integer`):

Maximum price per night filter (in USD).

## `starRating` (type: `array`):

Filter by star rating. Select one or more values (1-5).

## `guestRating` (type: `number`):

Minimum guest rating filter (0-10, e.g. 7 = 'Good').

## `sort` (type: `string`):

Sort results by this criteria.

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

Proxy settings. Residential proxies are required for Expedia (DataDome + Akamai protection).

## `maxConcurrency` (type: `integer`):

Maximum number of parallel page requests. Lower if you get blocked.

## Actor input object example

```json
{
  "destination": "New York",
  "checkIn": "2026-03-15",
  "checkOut": "2026-03-18",
  "adults": 2,
  "children": 0,
  "rooms": 1,
  "maxItems": 10,
  "sort": "RECOMMENDED",
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ]
  },
  "maxConcurrency": 3
}
```

# Actor output Schema

## `results` (type: `string`):

Dataset with all scraped items

# 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 = {
    "destination": "New York",
    "checkIn": "2026-03-15",
    "checkOut": "2026-03-18",
    "maxItems": 10,
    "proxyConfiguration": {
        "useApifyProxy": true,
        "apifyProxyGroups": [
            "RESIDENTIAL"
        ]
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("parseforge/expedia-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 = {
    "destination": "New York",
    "checkIn": "2026-03-15",
    "checkOut": "2026-03-18",
    "maxItems": 10,
    "proxyConfiguration": {
        "useApifyProxy": True,
        "apifyProxyGroups": ["RESIDENTIAL"],
    },
}

# Run the Actor and wait for it to finish
run = client.actor("parseforge/expedia-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 '{
  "destination": "New York",
  "checkIn": "2026-03-15",
  "checkOut": "2026-03-18",
  "maxItems": 10,
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ]
  }
}' |
apify call parseforge/expedia-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,parseforge/expedia-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/SJg9XcshZlv8J0kqh/builds/oWdWp1o1JZIwDk6Ti/openapi.json
