# Hopper Travel Research Scraper (`parseforge/hopper-scraper`) Actor

Scrape Hopper Media Center for travel research reports, press releases, and articles - includes price prediction studies, holiday outlooks, and hotel rate trends.

- **URL**: https://apify.com/parseforge/hopper-scraper.md
- **Developed by:** [ParseForge](https://apify.com/parseforge) (community)
- **Categories:** Travel, News
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, NaN bookmarks
- **User rating**: No ratings yet

## Pricing

Pay per event

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/platform/actors/running/actors-in-store#pay-per-event

## What's an Apify Actor?

Actors are a software tools running on the Apify platform, for all kinds of web data extraction and automation use cases.
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.

In JavaScript/TypeScript projects, use official [JavaScript/TypeScript client](https://docs.apify.com/api/client/js.md):

```bash
npm install apify-client
```

In Python projects, use official [Python client library](https://docs.apify.com/api/client/python.md):

```bash
pip install apify-client
```

In shell scripts, use [Apify CLI](https://docs.apify.com/cli/docs.md):

````bash
# MacOS / Linux
curl -fsSL https://apify.com/install-cli.sh | bash
# Windows
irm https://apify.com/install-cli.ps1 | iex
```bash

In AI frameworks, you might use the [Apify MCP server](https://docs.apify.com/platform/integrations/mcp.md).

If your project is in a different language, use 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 Banner](https://raw.githubusercontent.com/ParseForge/apify-assets/main/banner.jpg)

## 🛫 Hopper Travel Research Scraper

> 🚀 **Export Hopper's travel research, news, and press releases in seconds.** Pull the full archive of price studies, holiday outlooks, and sale announcements from Hopper Media Center as clean JSON, CSV, or Excel.

> 🕒 **Last updated:** 2026-05-20 · **📊 15 fields** per record · **341 published documents** · **Research, News, Articles** · **Updated continuously by Hopper**

Hopper Media Center is the public face of Hopper's travel data team, where Lead Economist Hayley Berg and colleagues publish flight price studies, holiday travel outlooks, sale announcements, and consumer travel index reports. This Actor walks the three top sections (research, press releases, and editorial articles) and returns every published document with structured metadata plus the full body text and HTML, suitable for downstream analytics, alerting, or LLM ingestion.

The scraper hits the Next.js data endpoints behind `media.hopper.com` directly, so no headless browser is needed and runs finish in under a minute for the full 341-document catalog. Filter by content type or post date when you only want the latest research, narrow your window to a single quarter, or pull the entire archive in one shot. Every record includes hero image, author bio, embedded chart URLs, and ready-to-render HTML alongside plain text.

| 🎯 Target Audience | 💡 Primary Use Cases |
|---|---|
| Travel agencies and OTA analysts | Track Hopper's published price predictions and seasonal outlooks |
| Travel deal alert platforms | Mirror Hopper's flash-sale announcements into your alert pipeline |
| Travel journalists and bloggers | Source quote-ready stats and charts from Hopper's economist team |
| Market researchers | Build a longitudinal corpus of travel-industry trend reports |

---

### 📋 What the Hopper Travel Research Scraper does

- 🔍 **Walks every section.** Pulls all 341 documents from `/research`, `/news`, and `/articles` in one run.
- 📅 **Filters by post date.** Use `minDate` and `maxDate` (YYYY-MM-DD) to narrow to a specific season or release window.
- 🗂️ **Selects content types.** Choose any combination of research reports, press releases, and editorial articles.
- 🖼️ **Captures hero and embedded media.** Hero image, author avatar, and every chart or asset embedded in the body.
- 📝 **Returns both plain text and HTML.** Body is delivered as readable Markdown-friendly text and as clean HTML for downstream rendering.
- 👤 **Includes author metadata.** Name, bio, and avatar for the byline (when present).

Each record carries 15 fields covering the document's identity, source URL, author, publication date, hero and embedded imagery, full body in two formats, and run metadata. Newest posts are returned first.

> 💡 **Why it matters:** Hopper's research team publishes proprietary travel demand and price data months before it lands in industry trade press. Pulling the source feed directly gives analysts and travel platforms a head start.

---

### 🎬 Full Demo

🚧 Coming soon: a 3-minute walkthrough that covers picking content types, narrowing by date, and exporting the catalog to Excel.

---

### ⚙️ Input

<table>
<thead>
<tr><th>Field</th><th>Type</th><th>Default</th><th>What it does</th></tr>
</thead>
<tbody>
<tr><td><code>contentTypes</code></td><td>array (multi-select)</td><td>all three</td><td>Pick any of <code>research</code>, <code>news</code>, <code>articles</code>. Limits which sections are walked.</td></tr>
<tr><td><code>maxItems</code></td><td>integer</td><td>10 (preview)</td><td>Cap the result set. Free plan limits to 10. Paid up to 1,000,000.</td></tr>
<tr><td><code>minDate</code></td><td>string (YYYY-MM-DD)</td><td>(none)</td><td>Skip posts older than this date.</td></tr>
<tr><td><code>maxDate</code></td><td>string (YYYY-MM-DD)</td><td>(none)</td><td>Skip posts newer than this date.</td></tr>
</tbody>
</table>

Example: latest 25 research reports only.

```json
{
    "contentTypes": ["research"],
    "maxItems": 25
}
````

Example: every press release from 2025 (Q4 sale + holiday cycle).

```json
{
    "contentTypes": ["news"],
    "minDate": "2025-10-01",
    "maxDate": "2025-12-31",
    "maxItems": 1000
}
```

> ⚠️ **Good to Know:** Hopper Media Center is updated whenever the data team releases a new study or the press desk drops a sale announcement. Re-running the scraper picks up new posts automatically, no diffing required.

***

### 📊 Output

Each record is a flat JSON object with these fields, in this order:

#### 🧾 Schema

| Field | Type | Example |
|---|---|---|
| 🖼 `imageUrl` | string (URL) | `https://images.ctfassets.net/e2xvpak6j0p2/.../Holiday-Travel-Index_Hopper-Media-Center.png` |
| 📌 `title` | string | `2025 Holiday Travel Shopping Index Report` |
| 🔗 `url` | string (URL) | `https://media.hopper.com/research/2025-holiday-travel-shopping-index-report` |
| 🆔 `slug` | string | `2025-holiday-travel-shopping-index-report` |
| 🏷️ `type` | string | `research` (or `news`, `articles`) |
| 📝 `excerpt` | string | `New report unveils the top travel shopping and traveler behavior trends...` |
| 📅 `postDate` | string (ISO 8601) | `2025-10-22T00:00:00.000Z` |
| 👤 `author` | string | `Hayley Berg` |
| 💬 `authorBio` | string or null | `Lead Economist at Hopper` |
| 🖼 `authorAvatar` | string (URL) | `https://images.ctfassets.net/.../Hopper_Headshots___Hayley_Berg...jpg` |
| 📄 `bodyText` | string | `The busy 2025 holiday season is approaching. The team at...` |
| 🌐 `bodyHtml` | string | `<p>The busy 2025 holiday season is approaching...</p>` |
| 🖼 `images` | array | `[ "https://images.ctfassets.net/.../Holiday-Travel-Index_01.png", ... ]` |
| 🕒 `scrapedAt` | string (ISO 8601) | `2026-05-20T20:37:44.598Z` |
| ❌ `error` | string or null | `null` on success |

#### 📦 Sample records

<details>
<summary><b>Typical</b>: Research report by Hopper's Lead Economist with multiple embedded charts</summary>

```json
{
    "imageUrl": "https://images.ctfassets.net/e2xvpak6j0p2/4ZGPhAa5JTGepZBI4eWP6c/f9b33ab738eec316ce7c4e2596b3a468/Holiday-Travel-Index_Hopper-Media-Center.png",
    "title": "2025 Holiday Travel Shopping Index Report",
    "url": "https://media.hopper.com/research/2025-holiday-travel-shopping-index-report",
    "slug": "2025-holiday-travel-shopping-index-report",
    "type": "research",
    "excerpt": "New report unveils the top travel shopping and traveler behavior trends shaping the 2025 holiday travel season",
    "postDate": "2025-10-22T00:00:00.000Z",
    "author": "Hayley Berg",
    "authorBio": "Lead Economist at Hopper",
    "authorAvatar": "https://images.ctfassets.net/e2xvpak6j0p2/2xZiBGekqai1dZOkq5aK2/860b05ec6eaa038740c18c55d90225f3/Hopper_Headshots___Hayley_Berg___Camp_Digital--71.jpg",
    "bodyText": "The busy 2025 holiday season is approaching. The team at the travel platform, Hopper and HTS (Hopper Technology Solutions), commissioned a survey in partnership with Opinium to poll U.S.-based travelers on their upcoming holiday travel plans...",
    "bodyHtml": "<p>The busy 2025 holiday season is approaching. The team at the travel platform...</p>",
    "images": [
        "https://images.ctfassets.net/e2xvpak6j0p2/7o9IsscIo2KfVJMUnlue7z/8f09e404195f606baa351ed9f709f7d9/Holiday-Travel-Index_01__1_.png",
        "https://images.ctfassets.net/e2xvpak6j0p2/6k1w0g7V5V82dDNbYolb3m/4167527f10864bc25c4a1eb26813a193/Holiday-Travel-Index_02__1_.png",
        "https://images.ctfassets.net/e2xvpak6j0p2/6ZVU7LJnTGmwAVNEB3T5XG/937eb530e1bcfbc6b4fd8e1b3e8694cc/Holiday-Travel-Index_03__1_.png",
        "https://images.ctfassets.net/e2xvpak6j0p2/6o79VznVxNi7DOf5yoG2NW/2799df3f014b8c091137adc3b9e945ce/Holiday-Travel-Index_04__1_.png",
        "https://images.ctfassets.net/e2xvpak6j0p2/1hW5cfrbszvAS5SpQgGPBq/ee09bbea03f52cf5fbe8e87989e84486/Holiday-Travel-Index_05__1_.png",
        "https://images.ctfassets.net/e2xvpak6j0p2/6r4dEuq4oD2dPGgEGqdpOs/10f184e75aa1ade41da0d7941488e450/Holiday-Travel-Index_06__1_.png"
    ],
    "scrapedAt": "2026-05-20T20:37:44.598Z",
    "error": null
}
```

</details>

<details>
<summary><b>Edge case</b>: Press release with avatar but no bio and a single embedded image in the body</summary>

```json
{
    "imageUrl": "https://images.ctfassets.net/e2xvpak6j0p2/1BWTqkKxogOi7iXfwWRLgY/31e0e1fec2a31638f0be6de797ddc619/TDT-2025-HTS.png",
    "title": "Travel Deal Tuesday 2025 brings the best travel deals of the season, with up to 40% off popular destinations & dozens of participating travel brands",
    "url": "https://media.hopper.com/news/travel-deal-tuesday-2025-brings-the-best-travel-deals-of-the-season-with-up",
    "slug": "travel-deal-tuesday-2025-brings-the-best-travel-deals-of-the-season-with-up",
    "type": "news",
    "excerpt": "On December 2nd, Hopper and Tripadvisor will have exclusive hotel discounts up to 40% off many major domestic and international destinations around the world.",
    "postDate": "2025-11-25T00:00:00.000Z",
    "author": "Brianna Schneider",
    "authorBio": null,
    "authorAvatar": "https://images.ctfassets.net/e2xvpak6j0p2/4Qi15dnKafxVnoC4GXG7Gw/b51d82b239cff50cc967191d1d55c009/Hopper_Headshots___Brianna_Schneider___Camp_Digital--4.jpg",
    "bodyText": "Eyeing a last-minute holiday getaway or dream vacation for 2026? The biggest day for travel deals of the season is here, with major savings up to 40% off many popular domestic and international destinations...",
    "bodyHtml": "<img src=\"https://images.ctfassets.net/.../TDT-2025-HTS.png\" alt=\"TDT-2025-HTS\"><p>Eyeing a last-minute holiday getaway or dream vacation for 2026?...</p>",
    "images": [
        "https://images.ctfassets.net/e2xvpak6j0p2/1BWTqkKxogOi7iXfwWRLgY/31e0e1fec2a31638f0be6de797ddc619/TDT-2025-HTS.png"
    ],
    "scrapedAt": "2026-05-20T20:37:44.428Z",
    "error": null
}
```

</details>

<details>
<summary><b>Sparse</b>: Older editorial article with no author bio and no avatar</summary>

```json
{
    "imageUrl": "https://images.ctfassets.net/e2xvpak6j0p2/63h88YR7q0JsqYRd1efJLr/132e25e3dd4782868a8d6fbf5489c464/Germany_Blog_Image_Updated.png",
    "title": "Germany: The Sustainable Destination Where Urban Adventures Meet Nature Escapes",
    "url": "https://media.hopper.com/articles/germany-the-sustainable-destination",
    "slug": "germany-the-sustainable-destination",
    "type": "articles",
    "excerpt": "Learn more about Germany's sustainable approach to travel and tourism.",
    "postDate": "2024-12-21T00:00:00.000Z",
    "author": "Germany",
    "authorBio": null,
    "authorAvatar": null,
    "bodyText": "Germany is a land of contrasts, where cutting-edge cities blend seamlessly with serene natural wonders, and sustainable travel options allow you to explore it all without a trace...",
    "bodyHtml": "<img src=\"https://images.ctfassets.net/.../Germany_Blog_Image_Updated.png\" alt=\"Germany Blog Image Updated\"><p>Germany is a land of contrasts...</p>",
    "images": [
        "https://images.ctfassets.net/e2xvpak6j0p2/63h88YR7q0JsqYRd1efJLr/132e25e3dd4782868a8d6fbf5489c464/Germany_Blog_Image_Updated.png"
    ],
    "scrapedAt": "2026-05-20T20:34:30.638Z",
    "error": null
}
```

</details>

***

### ✨ Why choose this Actor

| ✨ | Capability |
|---|---|
| ⚡ | **Fast.** Runs the full 341-document catalog in well under a minute. |
| 🧭 | **Complete.** Walks all three Media Center sections in one job, sorted newest first. |
| 🖼 | **Rich media.** Returns hero image, author headshot, and every embedded chart or asset. |
| 📄 | **Two body formats.** Plain text for analytics or LLMs, plus clean HTML for rendering. |
| 📅 | **Date-bounded.** `minDate` and `maxDate` let you snapshot just the window you need. |
| 🔓 | **No proxy needed.** Tier 1 plain HTTP, no captchas, no fingerprinting, no maintenance taxes. |
| 🔌 | **Schedule-friendly.** Designed to pick up new posts on re-run, no diffing logic needed. |

> 📊 Hopper's data team publishes roughly two new research reports and four new press releases per quarter. Schedule the Actor weekly to catch them all.

***

### 📈 How it compares to alternatives

| Approach | Cost | Coverage | Refresh | Filters | Setup |
|---|---|---|---|---|---|
| Manual copy from Media Center | Free, but hours of work | Partial | Stale day one | None | Painful |
| Generic news aggregators | Subscription | Mixed quality | Hourly | Coarse | Account required |
| Off-the-shelf RSS readers | Free | Headlines only, no body | Hourly | None | Limited |
| **⭐ Hopper Travel Research Scraper** *(this Actor)* | Apify usage only | All 341 documents, 15 fields | On demand | Type + date | One click |

Generic aggregators rarely index Hopper's research portal in full and never give you the body text or the embedded chart URLs. This Actor goes straight to the source.

***

### 🚀 How to use

1. 🆕 **Sign up** for a free Apify account at [console.apify.com](https://console.apify.com/sign-up?fpr=vmoqkp).
2. 🛫 **Open the Actor** in Apify Console and click "Try for free".
3. 🎛 **Set your input.** Pick content types and optionally a date window. Leave defaults to pull everything.
4. ▶️ **Run it.** Watch the live log as records stream into the dataset.
5. 📥 **Export** as JSON, CSV, or Excel, or wire the dataset into your downstream pipeline.

> ⏱️ Total time: under a minute for the full catalog. The first run feels instant once you have the input dialed in.

***

### 💼 Business use cases

<table>
<tr>
<td width="50%">

#### 🛫 Travel agencies and OTAs

- Track Hopper's seasonal price outlooks before booking surges
- Mirror sale announcements into your own deal feed
- Benchmark your forecast model against Hopper's published predictions
- Pull author quotes for client newsletters

</td>
<td width="50%">

#### 🔔 Deal alert platforms

- Auto-ingest Travel Deal Tuesday and seasonal sale announcements
- Cross-reference Hopper's discount claims against live aggregator prices
- Surface route-specific deals from press releases to your subscribers
- Add Hopper as a verified-source channel inside your alerting product

</td>
</tr>
<tr>
<td width="50%">

#### 📰 Travel journalists and bloggers

- Source quote-ready stats and charts from Hopper's data team
- Track byline trends to spot which economists are publishing what
- Pull historical research for retrospective pieces
- Hot-link the embedded charts directly from your CMS

</td>
<td width="50%">

#### 📊 Market researchers

- Build a longitudinal corpus of travel-demand and price studies
- Train domain-specific language models on Hopper's research voice
- Compare year-over-year holiday outlooks side by side
- Feed BI dashboards with quarterly index data

</td>
</tr>
</table>

***

### 🌟 Beyond business use cases

Data like this powers more than commercial workflows. The same structured records support research, education, civic projects, and personal initiatives.

<table>
<tr>
<td width="50%">

#### 🎓 Research and academia

- Empirical datasets for papers, thesis work, and coursework
- Longitudinal studies tracking changes across snapshots
- Reproducible research with cited, versioned data pulls
- Classroom exercises on data analysis and ethical scraping

</td>
<td width="50%">

#### 🎨 Personal and creative

- Side projects, portfolio demos, and indie app launches
- Data visualizations, dashboards, and infographics
- Content research for bloggers, YouTubers, and podcasters
- Hobbyist collections and personal trackers

</td>
</tr>
<tr>
<td width="50%">

#### 🤝 Non-profit and civic

- Transparency reporting and accountability projects
- Advocacy campaigns backed by public-interest data
- Community-run databases for local issues
- Investigative journalism on public records

</td>
<td width="50%">

#### 🧪 Experimentation

- Prototype AI and machine-learning pipelines with real data
- Validate product-market hypotheses before engineering spend
- Train small domain-specific models on niche corpora
- Test dashboard concepts with live input

</td>
</tr>
</table>

***

### 🔌 Automating Hopper Travel Research Scraper

Run the Actor on a schedule and pipe results into the tools your team already uses.

- 🟢 **Node.js client:** call the Actor via the [Apify JS SDK](https://docs.apify.com/sdk/js/) from any backend.
- 🐍 **Python client:** trigger runs with the [Apify Python SDK](https://docs.apify.com/sdk/python/) and ingest results in pandas.
- 📚 **Reference:** see the [Apify API docs](https://docs.apify.com/api/v2) for the full REST surface.

Schedules: configure a [Schedule](https://docs.apify.com/platform/schedules) to run weekly and stream new posts straight into your dataset, webhook, or warehouse.

***

### ❓ Frequently Asked Questions

<details>
<summary>📦 <b>What exactly does the Actor return?</b></summary>

Every published document under `media.hopper.com/research`, `/news`, and `/articles` as a flat JSON record with 15 fields: hero image, title, URL, slug, content type, excerpt, post date, author info, full body in plain text and HTML, embedded images, scrape timestamp, and an error field. 341 documents total at last check.

</details>

<details>
<summary>🕐 <b>How often is Hopper's data refreshed at the source?</b></summary>

Hopper's research team publishes new studies on holiday cycles (Memorial Day, 4th of July, Thanksgiving, Christmas) plus quarterly travel-shopping index reports. The press desk drops sale announcements roughly four to eight times per year. Re-running the Actor picks up everything new automatically.

</details>

<details>
<summary>🛡️ <b>Does the Actor need a proxy or solve any captchas?</b></summary>

No. The endpoint is publicly addressable and returns plain JSON inside the page HTML. The Actor uses standard HTTPS requests with no proxy, no captcha-solver, and no browser.

</details>

<details>
<summary>📅 <b>Can I limit the run to a specific season or year?</b></summary>

Yes. Set `minDate` and `maxDate` in YYYY-MM-DD format. The Actor filters posts by `postDate` before fetching detail pages, so date-bounded runs finish faster than a full pull.

</details>

<details>
<summary>📰 <b>What's the difference between research, news, and articles?</b></summary>

`research` is Hopper's data-team output (price studies, holiday outlooks, index reports). `news` is the press desk (sale announcements, partnership press releases). `articles` is editorial and corporate content (sustainability, giveaways, destination guides).

</details>

<details>
<summary>🖼 <b>Can I get the embedded chart images?</b></summary>

Yes. The `images` array holds every asset URL referenced in the body in document order. Each link is a Contentful CDN URL you can hot-link or download.

</details>

<details>
<summary>💼 <b>Can I use this data commercially?</b></summary>

The Actor pulls publicly available content from Hopper's media portal. You are responsible for confirming that your downstream use aligns with Hopper's terms and your local laws. Many commercial uses (internal analytics, journalism, research) are common, but consult counsel before redistributing the verbatim text.

</details>

<details>
<summary>💳 <b>Do I need a paid Apify plan?</b></summary>

No. Free accounts can run the Actor with up to 10 items per run for previewing. Paid plans unlock up to 1,000,000 items in one run, which is plenty for the entire Hopper catalog and all future updates.

</details>

<details>
<summary>⚠️ <b>What if a run fails or returns errors?</b></summary>

Individual documents that fail to fetch are written to the dataset as records with an `error` field populated, so you can retry just the failures. If the listing endpoint itself goes down, the Actor logs a warning and continues with the other content types.

</details>

<details>
<summary>⚖️ <b>Is scraping Hopper Media Center legal?</b></summary>

The portal is publicly indexed and explicitly designed to surface Hopper's research to the press and the public. Standard fair-use principles apply for journalism and research. As always, you are responsible for your own use of the data.

</details>

<details>
<summary>🔄 <b>How do I run this on a schedule?</b></summary>

Configure an [Apify Schedule](https://docs.apify.com/platform/schedules) and pick a cadence. Weekly catches everything; daily is overkill but works fine.

</details>

<details>
<summary>🆘 <b>I hit a problem, where do I get help?</b></summary>

Use the [contact form](https://tally.so/r/BzdKgA) at the bottom of this README. Include your run ID and the input you used; that's everything we need to debug.

</details>

***

### 🔌 Integrate with any app

- [**Make**](https://apify.com/integrations) - drop Hopper records into your no-code flow
- [**Zapier**](https://apify.com/integrations) - trigger zaps on new posts
- [**Slack**](https://apify.com/integrations) - post research summaries to a channel
- [**Airbyte**](https://docs.apify.com/integrations) - sync into your warehouse
- [**GitHub**](https://docs.apify.com/integrations) - commit periodic snapshots as JSON
- [**Google Sheets**](https://docs.apify.com/integrations) - mirror the dataset to a sheet for quick editing

***

### 🔗 Recommended Actors

- [**🏨 Booking.com Hotels Listing Scraper**](https://apify.com/parseforge/booking-com-hotels-scraper) - pull hotel listings and prices across destinations
- [**✈️ Expedia Scraper**](https://apify.com/parseforge/expedia-scraper) - flights, hotels, and packages from Expedia
- [**🏖️ Tripadvisor Scraper**](https://apify.com/parseforge/tripadvisor-scraper) - attractions, hotels, and restaurants on Tripadvisor
- [**🛏️ Hotels.com Scraper**](https://apify.com/parseforge/hotels-com-scraper) - room-level pricing and availability
- [**📰 Google News Scraper**](https://apify.com/parseforge/google-news-scraper) - broader travel-industry news beyond Hopper

> 💡 **Pro Tip:** browse the complete [ParseForge collection](https://apify.com/parseforge) for more travel, news, and research scrapers.

***

**🆘 Need Help?** [**Open our contact form**](https://tally.so/r/BzdKgA)

***

> **⚠️ Disclaimer:** independent tool, not affiliated with Hopper, Inc. or Hopper Technology Solutions. Only publicly available content from Hopper Media Center is collected.

# Actor input Schema

## `contentTypes` (type: `array`):

Which Hopper Media Center sections to scrape. Defaults to all three.

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

Free users: Limited to 10 items (preview). Paid users: Optional, max 1,000,000

## `minDate` (type: `string`):

Only include posts published on or after this date (YYYY-MM-DD). Leave blank for no lower bound.

## `maxDate` (type: `string`):

Only include posts published on or before this date (YYYY-MM-DD). Leave blank for no upper bound.

## Actor input object example

```json
{
  "contentTypes": [
    "research",
    "news",
    "articles"
  ],
  "maxItems": 10
}
```

# 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 = {
    "maxItems": 10
};

// Run the Actor and wait for it to finish
const run = await client.actor("parseforge/hopper-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 = { "maxItems": 10 }

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

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

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

```

## CLI example

```bash
echo '{
  "maxItems": 10
}' |
apify call parseforge/hopper-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "command": "npx",
            "args": [
                "mcp-remote",
                "https://mcp.apify.com/?tools=parseforge/hopper-scraper",
                "--header",
                "Authorization: Bearer <YOUR_API_TOKEN>"
            ]
        }
    }
}

```

## OpenAPI specification

```json
{
    "openapi": "3.0.1",
    "info": {
        "title": "Hopper Travel Research Scraper",
        "description": "Scrape Hopper Media Center for travel research reports, press releases, and articles - includes price prediction studies, holiday outlooks, and hotel rate trends.",
        "version": "0.1",
        "x-build-id": "yftIxeQ3nRiYaXxI5"
    },
    "servers": [
        {
            "url": "https://api.apify.com/v2"
        }
    ],
    "paths": {
        "/acts/parseforge~hopper-scraper/run-sync-get-dataset-items": {
            "post": {
                "operationId": "run-sync-get-dataset-items-parseforge-hopper-scraper",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor, waits for its completion, and returns Actor's dataset items in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK"
                    }
                }
            }
        },
        "/acts/parseforge~hopper-scraper/runs": {
            "post": {
                "operationId": "runs-sync-parseforge-hopper-scraper",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor and returns information about the initiated run in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/runsResponseSchema"
                                }
                            }
                        }
                    }
                }
            }
        },
        "/acts/parseforge~hopper-scraper/run-sync": {
            "post": {
                "operationId": "run-sync-parseforge-hopper-scraper",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor, waits for completion, and returns the OUTPUT from Key-value store in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK"
                    }
                }
            }
        }
    },
    "components": {
        "schemas": {
            "inputSchema": {
                "type": "object",
                "properties": {
                    "contentTypes": {
                        "title": "Content Types",
                        "uniqueItems": true,
                        "type": "array",
                        "description": "Which Hopper Media Center sections to scrape. Defaults to all three.",
                        "items": {
                            "type": "string",
                            "enum": [
                                "research",
                                "news",
                                "articles"
                            ],
                            "enumTitles": [
                                "Research Reports",
                                "Press Releases (News)",
                                "Articles & Guides"
                            ]
                        },
                        "default": [
                            "research",
                            "news",
                            "articles"
                        ]
                    },
                    "maxItems": {
                        "title": "Max Items",
                        "minimum": 1,
                        "maximum": 1000000,
                        "type": "integer",
                        "description": "Free users: Limited to 10 items (preview). Paid users: Optional, max 1,000,000"
                    },
                    "minDate": {
                        "title": "Earliest Post Date",
                        "type": "string",
                        "description": "Only include posts published on or after this date (YYYY-MM-DD). Leave blank for no lower bound."
                    },
                    "maxDate": {
                        "title": "Latest Post Date",
                        "type": "string",
                        "description": "Only include posts published on or before this date (YYYY-MM-DD). Leave blank for no upper bound."
                    }
                }
            },
            "runsResponseSchema": {
                "type": "object",
                "properties": {
                    "data": {
                        "type": "object",
                        "properties": {
                            "id": {
                                "type": "string"
                            },
                            "actId": {
                                "type": "string"
                            },
                            "userId": {
                                "type": "string"
                            },
                            "startedAt": {
                                "type": "string",
                                "format": "date-time",
                                "example": "2025-01-08T00:00:00.000Z"
                            },
                            "finishedAt": {
                                "type": "string",
                                "format": "date-time",
                                "example": "2025-01-08T00:00:00.000Z"
                            },
                            "status": {
                                "type": "string",
                                "example": "READY"
                            },
                            "meta": {
                                "type": "object",
                                "properties": {
                                    "origin": {
                                        "type": "string",
                                        "example": "API"
                                    },
                                    "userAgent": {
                                        "type": "string"
                                    }
                                }
                            },
                            "stats": {
                                "type": "object",
                                "properties": {
                                    "inputBodyLen": {
                                        "type": "integer",
                                        "example": 2000
                                    },
                                    "rebootCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "restartCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "resurrectCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "computeUnits": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            },
                            "options": {
                                "type": "object",
                                "properties": {
                                    "build": {
                                        "type": "string",
                                        "example": "latest"
                                    },
                                    "timeoutSecs": {
                                        "type": "integer",
                                        "example": 300
                                    },
                                    "memoryMbytes": {
                                        "type": "integer",
                                        "example": 1024
                                    },
                                    "diskMbytes": {
                                        "type": "integer",
                                        "example": 2048
                                    }
                                }
                            },
                            "buildId": {
                                "type": "string"
                            },
                            "defaultKeyValueStoreId": {
                                "type": "string"
                            },
                            "defaultDatasetId": {
                                "type": "string"
                            },
                            "defaultRequestQueueId": {
                                "type": "string"
                            },
                            "buildNumber": {
                                "type": "string",
                                "example": "1.0.0"
                            },
                            "containerUrl": {
                                "type": "string"
                            },
                            "usage": {
                                "type": "object",
                                "properties": {
                                    "ACTOR_COMPUTE_UNITS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_WRITES": {
                                        "type": "integer",
                                        "example": 1
                                    },
                                    "KEY_VALUE_STORE_LISTS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_INTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_EXTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_SERPS": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            },
                            "usageTotalUsd": {
                                "type": "number",
                                "example": 0.00005
                            },
                            "usageUsd": {
                                "type": "object",
                                "properties": {
                                    "ACTOR_COMPUTE_UNITS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_WRITES": {
                                        "type": "number",
                                        "example": 0.00005
                                    },
                                    "KEY_VALUE_STORE_LISTS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_INTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_EXTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_SERPS": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }
}
```
