# Expedia Email Scraper - Keyword Search & Domain Filter (`parse-point/expedia-email-scraper-lightning-fast-and-accurate`) Actor

🌍 Expedia Email Scraper extracts hotel and travel supplier emails using keyword and location filters. 🎯 Domain restriction, decoding and duplicate skipping. ✈️ Fast Expedia lead generation for travel tech sales.

- **URL**: https://apify.com/parse-point/expedia-email-scraper-lightning-fast-and-accurate.md
- **Developed by:** [Parse Point](https://apify.com/parse-point) (community)
- **Categories:** Lead generation, Travel, Automation
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $1.99 / 1,000 results

This Actor is paid per event and usage. You are charged both the fixed price for specific events and for Apify platform usage.

Learn more: https://docs.apify.com/platform/actors/running/actors-in-store#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

### Expedia Email Scraper

**Expedia Email Scraper** helps you scrape and export contact emails from Expedia profiles using keyword-driven travel prospecting. It’s ideal for anyone building an **Expedia email scraper** email list for outreach. Use it as a **web scraping for email** automation tool—faster than manual collection at scale.

***

### What Does Expedia Email Scraper Do? 🤖

**Expedia Email Scraper** takes your `keywords`, optional `location`, and `customDomains` to extract and collect matching email addresses from Expedia. During a run, it searches using the keywords you provide, filters emails to your allowed domains, and keeps results unique while respecting your `maxEmails` cap. Finally, it exports clean records to your Apify dataset with fields like `keyword`, `title`, `description`, `url`, and `email`, so you can immediately use the data for hotel marketing leads and B2B travel prospecting. Compared to manual work, it’s a reliable way to automate Expedia email collection.

***

### What Can Expedia Email Scraper Extract? 📊

This actor extracts publicly listed contact emails from Expedia along with helpful context for each lead (profile title, description/bio, and the originating URL). It also tracks which keyword led to each result, making it easier to segment your scraped Expedia contact database.

| Data Type | Field Name | Description |
|---|---|---|
| Contact | `email` | Primary email address found for the Expedia lead |
| Identity | `title` | Profile name or business handle shown on the lead |
| Context | `description` | Bio, summary, or profile tagline text captured from the listing |
| Discovery | `keyword` | Search term you used that surfaced the profile |
| Navigation | `url` | Direct link to the Expedia page where the lead was found |

***

#### Key Features of Expedia Email Scraper ⚡

- ✅ **Keyword-Driven Search:** Uses your `keywords` to surface Expedia profiles for targeted travel email extraction
- 🌍 **Location Targeting:** Add an optional `location` filter to focus on specific cities or regions for hotel marketing leads
- 📧 **Custom Domain Filtering:** Limit results to specific email domains like `@gmail.com` or `@company.com` for cleaner outreach lists
- 🔄 **Proxy-Ready & Reliable:** Designed for consistent scraping runs with built-in proxy support
- 📊 **Structured Output:** Produces a dataset with clearly labeled fields for easy CRM import or analysis
- 💾 **Real-Time Data Saving:** Saves results incrementally as it discovers leads
- ⚙️ **Configurable Limits:** Use `maxEmails` to control run scope, cost, and expected completion time

***

### How to Use Expedia Email Scraper 🚀

1. **Find the Actor** — Open **Expedia Email Scraper** in the [Apify Store](https://apify.com/store)
2. **Open Input Tab** — In Apify Console, go to the **Input** section
3. **Add Keywords** — Enter job titles, team roles, or search terms you want to find on Expedia
4. **Configure Filters** *(optional)* — Set `location` and `customDomains` to narrow results
5. **Set Result Limit** — Choose a `maxEmails` value to cap output and control run time
6. **Click Start** — Run the actor and monitor logs
7. **Download Results** — Export from the Dataset tab as JSON or CSV

*No coding required.*

***

### Expedia Email Scraper Output Format 📦

The actor saves results to your Apify dataset in structured JSON format, ready for export and downstream processing.

#### ⬇️ Input Example

```json
{
  "keywords": ["manager", "founder"],
  "location": "San Diego",
  "customDomains": ["@gmail.com", "@yahoo.com"],
  "maxEmails": 20
}
```

#### ⬆️ Output Example

```json
[
  {
    "keyword": "manager",
    "title": "Oceanview Hotel Management",
    "description": "Hotel management team and guest services information.",
    "url": "https://www.expedia.com/Hotel-Details?q=Oceanview-Hotel",
    "email": "reservations.oceanview@gmail.com"
  }
]
```

***

### 🎯 Use Cases of Expedia Email Scraper

- **B2B Lead Generation:** Build an Expedia contact database to power outbound sales campaigns and hospitality prospecting
- **Email Marketing Campaigns:** Source fresh contacts for newsletters, drip sequences, and promotional outreach
- **Talent Recruitment:** Identify professionals connected to travel and lodging services without manually collecting emails
- **Market Research:** Compare niches and regions by grouping results by `keyword` and `location`
- **CRM Enrichment:** Add scraped Expedia email harvesting results into your CRM to enrich existing records

***

### How Much Will Expedia Email Scraper Cost You? 💰

Expedia email harvesting is priced using Apify’s **pay-per-event** model—charges are tied to results (per email record found), not just the number of runs. Apify also provides a **free tier** with monthly compute credits for new users. To control spending, set `maxEmails` to cap how many emails the actor returns in a run, and keep an eye on live usage in the Apify Console.

***

### Is It Legal to Scrape Expedia? ⚖️

Expedia Email Scraper extracts data from **publicly available sources** on Expedia. It does not require logging in or accessing private profile content. Even when scraping is generally permissible, you should follow Expedia’s Terms of Service and applicable privacy and anti-spam laws (including GDPR/CCPA where relevant). For questions about data handling or concerns, contact <hello.parsepoint@gmail.com>.

***

### Expedia Email Scraper Input Parameters 📋

**Example input (JSON)**

```json
{
  "keywords": ["manager", "founder"],
  "location": "",
  "customDomains": ["@gmail.com", "@yahoo.com"],
  "maxEmails": 20
}
```

| Parameter | Type | Required | Default | Description |
|---|---|---|---|---|
| `keywords` | Array | ✅ Yes | — | One or more keywords you want to use to find relevant Expedia leads |
| `location` | String | No | `""` | Optional location filter to narrow results by city, state, or country |
| `customDomains` | Array | No | `["@gmail.com","@yahoo.com"]` | Email domain allowlist (example: `@gmail.com`, `@yahoo.com`) to filter extracted emails |
| `maxEmails` | Integer | No | `20` | Maximum number of emails to collect. The scraper stops once this limit is reached |

***

### During the Actor Run ⏱️

You’ll see live progress in the Apify Console as it processes each keyword and applies your domain filtering rules. Results are saved incrementally, so you can check the Dataset tab while the run is still active. If `maxEmails` is reached, the actor stops early. If results come back sparse, widen your keywords, add more related terms, or expand your email domains.

***

### Final Note ✉️

Start extracting Expedia emails in minutes—powered by keyword targeting and domain filtering—without manual spreadsheet cleanup. For help, reach out at <hello.parsepoint@gmail.com>.

***

### FAQ — Expedia Email Scraper ❓

#### How does the Expedia Email Scraper find emails?

The actor uses your provided `keywords` (and optional `location`) to surface Expedia listings, then extracts publicly available email addresses that match your `customDomains` filter. It returns the email records it finds without inventing or generating addresses.

#### What types of Expedia profiles can I scrape?

You can scrape Expedia profiles or listings that publicly display contact information, including email addresses. If a listing does not contain a public email that matches your configured domains, it won’t produce an email result.

#### What did your tests show about the Expedia Email Scraper?

Results depend on how many Expedia listings match your `keywords` and contain publicly listed emails that match your `customDomains`. In practice, narrowing by domain and using targeted travel or hospitality keywords improves yield.

#### Why scrape Expedia for emails?

Expedia is a strong source for hospitality-related contacts and business inquiries. Manually finding and compiling these contacts is time-consuming—this actor automates extraction into a structured dataset for outreach and research.

#### How much does it cost to use the Expedia Email Scraper?

Pricing follows Apify’s pay-per-event approach. The main control lever is `maxEmails`, which caps how many emails the actor collects per run. Apify free tier credits may be available for new users, and volume costs scale with results.

#### How does the Expedia Email Scraper help my business?

It helps you build an export-ready email list segmented by `keyword` and enriched with `title`, `description`, and `url`. That makes it easier to run hotel marketing leads campaigns, nurture outreach, and enrich CRM entries.

#### What are the challenges of using an Expedia email scraping tool?

Not every listing includes a public email address, and domain filtering can reduce matches if the emails don’t use your allowed domains. Also, the amount of data varies based on how broad or narrow your keywords are.

#### How do I choose the right Expedia email extractor?

Use keywords that match the roles or teams you’re targeting, add a `location` if you want regional hotel marketing leads, and set `customDomains` to the email domains you care about. If you want higher coverage, increase `maxEmails` and expand your keyword set.

***

### 🆘 Support & Feedback

Found a bug or need a custom solution for the Expedia Email Scraper?

- 🐞 **Bug Reports:** Open a ticket in the repository’s Issues section
- ✨ **Custom Solutions & Feature Requests:** Contact our team
- 📧 **Email:** <hello.parsepoint@gmail.com>

### Run Memory

**Skip keywords already scraped in a previous run** - the actor keeps a
persistent record of every keyword it finishes, in a named key-value store that
survives between runs. Turn this on and a repeat run silently drops the keywords
it has already covered, so a scheduled job over a fixed list only pays for new
ground.

A keyword is identified by the keyword *plus* the set of email domains it was
searched against, so re-running `fitness` against a new domain list is correctly
treated as new work rather than a duplicate.

**Reset keyword history** - wipe that record before the run starts, so
everything counts as new again.

**Max emails per keyword** - cap how many results any single keyword may
produce before the actor moves on to the next one. Stops one broad term from
consuming the entire run budget. `0` means no per-keyword limit.

These sit alongside the existing address-level deduplication: *Skip previous
runs* prevents re-pushing an individual mailbox, while *Skip duplicate keywords*
prevents re-running the search at all.

# Actor input Schema

## `keywords` (type: `array`):

A list of keywords or queries to search for.

## `location` (type: `string`):

Location to filter search results.

## `customDomains` (type: `array`):

List of custom email domains

## `maxEmails` (type: `integer`):

Maximum number of emails to collect. The scraper will stop once this limit is reached. Setting a higher limit allows for more potential results but doesn't guarantee reaching that number. This helps save costs by controlling scraping time.

## `decodeProtectedEmails` (type: `boolean`):

Read addresses the page hides behind Cloudflare protection or HTML entities. These are invisible to a plain text scan.

## `decodeWrittenEmails` (type: `boolean`):

Read addresses written to defeat scrapers, such as 'name \[at] example \[dot] com'.

## `decodeEncodedEmails` (type: `boolean`):

Read addresses stored base64-encoded in the page markup.

## `mergeAliasDuplicates` (type: `boolean`):

Collapse different spellings that reach the same inbox (e.g. j.o.h.n+news@gmail.com and john@gmail.com) into a single result, so you are not billed twice for one lead.

## `skipPreviousRuns` (type: `boolean`):

Do not return leads that an earlier run of this Actor already returned. Skipped leads are never charged.

## `duplicateHandling` (type: `string`):

What to do when several spellings reach the same inbox: merge them into one result, keep them apart but flag them, or keep everything as found.

## `skipDuplicateKeywords` (type: `boolean`):

Remember every keyword this actor completes and skip it next time. Ideal for a scheduled run over a fixed keyword list - you only pay for ground you have not covered. A keyword searched against a different set of email domains counts as new work, not a duplicate.

## `resetKeywordHistory` (type: `boolean`):

Clear the remembered keywords before this run starts, so everything is treated as new again. Use after changing your target list.

## `maxEmailsPerKeyword` (type: `integer`):

Stop collecting for a keyword once it has produced this many results, then move on to the next one. Keeps one broad term from consuming the whole run. Leave at 0 for no per-keyword limit.

## Actor input object example

```json
{
  "keywords": [
    "manager",
    "founder"
  ],
  "location": "",
  "customDomains": [
    "@gmail.com",
    "@yahoo.com"
  ],
  "maxEmails": 20,
  "decodeProtectedEmails": true,
  "decodeWrittenEmails": true,
  "decodeEncodedEmails": true,
  "mergeAliasDuplicates": true,
  "skipPreviousRuns": false,
  "duplicateHandling": "merge",
  "skipDuplicateKeywords": false,
  "resetKeywordHistory": false,
  "maxEmailsPerKeyword": 0
}
```

# Actor output Schema

## `dataset` (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 = {
    "keywords": [
        "manager",
        "founder"
    ],
    "location": "",
    "customDomains": [
        "@gmail.com",
        "@yahoo.com"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("parse-point/expedia-email-scraper-lightning-fast-and-accurate").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 = {
    "keywords": [
        "manager",
        "founder",
    ],
    "location": "",
    "customDomains": [
        "@gmail.com",
        "@yahoo.com",
    ],
}

# Run the Actor and wait for it to finish
run = client.actor("parse-point/expedia-email-scraper-lightning-fast-and-accurate").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 '{
  "keywords": [
    "manager",
    "founder"
  ],
  "location": "",
  "customDomains": [
    "@gmail.com",
    "@yahoo.com"
  ]
}' |
apify call parse-point/expedia-email-scraper-lightning-fast-and-accurate --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,parse-point/expedia-email-scraper-lightning-fast-and-accurate"
        }
    }
}

```

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/vdduJOeVnzcXraod3/builds/sMN4Y3xHF2hflnqvm/openapi.json
