# Disney Cruises Scraper - Complete Cruise Data Extractor (`sercul/disney-cruises-scraper`) Actor

Why Choose This Scraper?

✅ Extract from 5 Disney Cruise Line markets (US, CA, GB, EU, AU) with local currency pricing
✅ Complete cruise data with cabin-level pricing
✅ Filter by 9 destination regions
✅ Departure and arrival dates on every sailing — 900+ US sailings per run

- **URL**: https://apify.com/sercul/disney-cruises-scraper.md
- **Developed by:** [Jeremy G](https://apify.com/sercul) (community)
- **Categories:** Travel, Other
- **Stats:** 31 total users, 5 monthly users, 98.7% runs succeeded, 1 bookmarks
- **User rating**: No ratings yet

## Pricing

from $1.50 / 1,000 results

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.

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

## Disney Cruise Line Scraper — Complete Cruise Data Extractor

Extract **cruise listings, itineraries, and cabin-level pricing** from Disney Cruise Line across 5 international markets. Built for travel agencies, price comparison sites, affiliate marketers, and analysts.

### Why Choose This Scraper?

- ✅ Extract from **5 Disney Cruise Line markets** (US, CA, GB, EU, AU) with local-currency pricing
- ✅ Complete cruise data with **cabin-level pricing** across 4 cabin types (Interior, Outside, Verandah, Suite)
- ✅ Filter by **9 destination regions** (Caribbean, Bahamas, Alaska, Europe, Mexican Riviera, and more)
- ✅ **900+ sailings per US run**, ~400-700 per international market
- ✅ **Direct booking/source URLs** on every sailing — ready for affiliate monetization
- ✅ Automatic auth-cookie management with retry and session refresh

### Use Cases

- **Travel agencies & OTAs** — track Disney pricing against competitors daily
- **Affiliate/comparison sites** — populate Disney inventory with deep-links
- **Price analysts** — monitor Disney fare curves for forecasting
- **Internal benchmarking** — cruise lines comparing against Disney positioning

### Supported Markets

| Region | Output Currency | API Region |
|--------|----------|------------|
| `en_US` | USD | US |
| `en_CA` | **USD** \* | INTL |
| `en_GB` | GBP | INTL |
| `en_EU` | EUR (→ it\_IT) | INTL |
| `en_AU` | **USD** \* | INTL |

> \* Disney only localizes US (USD), UK (GBP) and EU (EUR). For Canada and Australia its API
> returns the **USD** price (what a real CA/AU visitor sees), so this scraper reports USD for
> `en_CA`/`en_AU`, not CAD/AUD.

### Input

| Parameter | Type | Description | Default |
|-----------|------|-------------|---------|
| `region`\* | string | Market to scrape | `en_US` |
| `maxRows` | number | Maximum sailing results | `500` |
| `destinations` | string\[] | Filter by destination code | All |
| `maxRequestRetries` | number | Retries for failed requests | `5` |
| `requestHandlerTimeoutSecs` | number | Request timeout (seconds) | `60` |
| `useApifyProxy` | boolean | Use Apify Residential proxy (always RESIDENTIAL) | `false` |
| `useSessionPool` | boolean | Sticky residential session (rotated on block) when using Apify Proxy | `true` |
| `proxyUrl` | string | Custom proxy URL | — |
| `apifyProxyCountryCode` | string | Override proxy country | Auto |
| `fetchDayItinerary` | boolean | Opt-in true day-by-day itinerary per sailing. **Requires `useApifyProxy: true`.** Slow | `false` |

### Destination Codes

| Code | Destination |
|------|-------------|
| `CARIBBEAN` | Caribbean |
| `BAHAMAS` | Bahamas |
| `MEXICAN RIVIERA` | Mexican Riviera |
| `ALASKA` | Alaska |
| `EUROPE` | Europe |
| `TRANS ATLANTIC` | Transatlantic |
| `TRANS PANAMA CANAL` | Panama Canal |
| `CALIFORNIA COAST` | California Coast |
| `SINGAPORE` | Singapore |

### Cabin Codes

| Code | Cabin Type |
|------|------------|
| `INSIDE` | Interior (Inside stateroom) |
| `OUTSIDE` | Ocean View / Outside |
| `VERANDAH` | Verandah (balcony) |
| `SUITE` | Suite (Concierge / Royal / Tower) |

### Output

Each record is a single sailing with:

- Cruise and itinerary identifiers (`cruise_id`, `itinerary_id`)
- Ship name, departure port code, duration (nights)
- Departure and arrival dates (ISO format)
- Lowest available per-person price with currency
- Ports of call with day numbers
- Dynamic per-cabin price fields: `price_{CURRENCY}_{CABIN}` (e.g., `price_USD_INSIDE`, `price_USD_VERANDAH`)
- Service charges, port charges, taxes (where applicable)
- `source_url` — direct link to the sailing page for deep-linking / affiliate tracking
- `platform`, `company`, `locale` — for multi-market deduplication

#### Sample Output

```json
{
  "cruise_id": "DCL_WONDER_2026-08-15",
  "itinerary_id": "DCL_WONDER_4N_BAHAMAS",
  "company": "disney-cruise-line",
  "locale": "en_US",
  "platform": "disney-cruise-line-en_US",
  "title": "4-Night Bahamian Cruise from Port Canaveral",
  "ship_name": "Disney Wonder",
  "departure_date": "2026-08-15",
  "duration": 4,
  "price": 1899,
  "currency": "USD",
  "price_USD_INSIDE": 1899,
  "price_USD_OUTSIDE": 2199,
  "price_USD_VERANDAH": 2799,
  "price_USD_SUITE": 5499,
  "destinations": ["BAHAMAS"],
  "ports_list": ["Port Canaveral", "Nassau", "Castaway Cay", "Port Canaveral"],
  "source_url": "https://disneycruise.disney.go.com/..."
}
```

### Runtime & Cost

- **Typical run:** ~2-4 minutes for 500 rows on US market
- **Full US sweep:** ~10-15 minutes for 900+ sailings
- **Memory:** 1 GB default (set `memoryMbs: 2048` for very large runs)
- **Proxy:** Optional on US market, recommended for EU/AU markets

### Usage

```json
{
  "region": "en_US",
  "maxRows": 500,
  "destinations": ["CARIBBEAN", "BAHAMAS"],
  "useApifyProxy": true
}
```

### Notes

- Disney prices are **per-person, double-occupancy**
- The US market returns a different set of sailings than the international markets
- Authentication is handled automatically for you
- For affiliate tracking, append your affiliate parameters to `source_url` on the consuming side

### Related Actors

Looking to build a full cruise pricing dataset? Pair this with:

- **Royal Caribbean Scraper** — 6 markets, per-cabin pricing
- **Norwegian (NCL) Scraper** — 6 markets, enrichable details
- **Celebrity Cruises Scraper** — 6 markets, service charges included
- **Carnival Cruises Scraper** — 2 markets, high volume
- **MSC / Costa / Princess / Holland America Scrapers** — full coverage

### Support

Issues or custom requests? Email **support@track.cruises**.

# Actor input Schema

## `region` (type: `string`):

Market/locale to scrape

## `maxRows` (type: `integer`):

Maximum number of sailing results to fetch

## `destinations` (type: `array`):

Filter by destination code (leave empty for all)

## `maxRequestRetries` (type: `integer`):

Maximum number of retries for failed requests

## `requestHandlerTimeoutSecs` (type: `integer`):

Timeout for HTTP requests in seconds

## `useApifyProxy` (type: `boolean`):

Use Apify Proxy for data API requests after auth

## `apifyProxyCountryCode` (type: `string`):

Two-letter country code for proxy geo-targeting

## `useSessionPool` (type: `boolean`):

When using Apify Proxy, keep one residential session for the run instead of a new IP per request. Improves reliability on longer runs. Ignored without Apify Proxy.

## `proxyUrl` (type: `string`):

Custom proxy for data API calls. Format: http\[s]://user:pass@host:port

## `fetchDayItinerary` (type: `boolean`):

Fetch true itinerary day numbers (incl. sea days) per sailing. REQUIRES "Use Apify Proxy" = ON (RESIDENTIAL). One request per sailing, cannot be deduped, so it is slow/expensive at scale. Leave OFF for normal runs; enable only for a one-time backfill. When OFF, output has portSequence (ordinal) and itineraryDay=null.

## `dayItineraryConcurrency` (type: `integer`):

How many per-sailing day-itinerary requests to run in parallel

## Actor input object example

```json
{
  "region": "en_US",
  "maxRows": 2000,
  "destinations": [],
  "maxRequestRetries": 5,
  "requestHandlerTimeoutSecs": 60,
  "useApifyProxy": false,
  "useSessionPool": true,
  "fetchDayItinerary": false,
  "dayItineraryConcurrency": 8
}
```

# 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 = {};

// Run the Actor and wait for it to finish
const run = await client.actor("sercul/disney-cruises-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 = {}

# Run the Actor and wait for it to finish
run = client.actor("sercul/disney-cruises-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 '{}' |
apify call sercul/disney-cruises-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,sercul/disney-cruises-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/Lb4Iqr3L5qZJn4LMJ/builds/k6g6HpC2Kiyppyb1o/openapi.json
