# Carnival Cruise Price Scraper – Sailings & Cabin Fares (`clearfeedlabs/carnival-cruise-scraper`) Actor

Extract Carnival Cruise Line sailings with Interior, Oceanview, Balcony and Suite fares, ship, dates, nights, destination and port from publicly visible, logged-out search results. Polite, rate-limited, stops if blocked. Unofficial tool.

- **URL**: https://apify.com/clearfeedlabs/carnival-cruise-scraper.md
- **Developed by:** [Clearfeed Labs](https://apify.com/clearfeedlabs) (community)
- **Categories:** Travel, E-commerce
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $1.80 / 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?

An Actor is a serverless cloud program that runs on the Apify platform. It has two run modes.
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.

Apify vocabulary and the platform model are defined once, in the agent quickstart at https://apify.com/agents.md.

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

Do not guess an integration path. Every one of them is in the agent quickstart at https://apify.com/agents.md: the Apify MCP server, Agent Skills with the Apify CLI, the JavaScript and Python clients, the REST API, and the account-free path for an agent with no human to sign in. It also carries the rule on stating cost before the first paid run.

For examples already wired to this Actor's own input schema, see the [API](#api) section below.

Each client library has reference documentation the quickstart does not restate: [JavaScript/TypeScript](https://docs.apify.com/api/client/js/docs.md) (`npm install apify-client`) and [Python](https://docs.apify.com/api/client/python/docs.md) (`pip install apify-client`).

# README

## Carnival Cruise Price Scraper – Sailings & Cabin Fares

> **Not affiliated with, endorsed by, or sponsored by Carnival Corporation & plc. Carnival is a trademark of its owner, used here only to describe compatibility.**

Carnival Cruise Price Scraper collects **publicly visible Carnival Cruise Line sailings and cabin fares**: **Interior, Oceanview, Balcony and Suite** prices, plus ship, sail date, nights, destination and departure port. It reads only what a logged-out visitor sees on carnival.com's cruise search. You can export the results as JSON, CSV, Excel or HTML, or get them through the Apify API.

This is an unofficial tool. It doesn't provide licensed or official Carnival data.

### Popular uses

- [Bahamas cruise prices: Carnival sailings and cabin fares](https://apify.com/clearfeedlabs/carnival-cruise-scraper/examples/bahamas-cruise-prices)
- [Caribbean cruise prices by cabin type](https://apify.com/clearfeedlabs/carnival-cruise-scraper/examples/caribbean-cruise-prices)
- [Cruises from Florida ports (Miami, Port Canaveral, Jacksonville)](https://apify.com/clearfeedlabs/carnival-cruise-scraper/examples/cruises-from-florida-ports)
- [Alaska cruise prices by month (summer sailings from Seattle)](https://apify.com/clearfeedlabs/carnival-cruise-scraper/examples/alaska-cruise-prices-by-month)

These examples are for personal trip planning and price research.

### What can this Carnival cruise scraper do?

- 🚢 Collects every matching sailing: ship, dates, nights, destination and port
- 💲 Gets the lowest public **Interior, Oceanview, Balcony and Suite** fare per sailing
- 🔎 Checks each fare's category code against Carnival's own ship cabin data so suites are really suites (`categoryCheck`)
- 🎯 Filters by destination, departure port and sailing month
- 🐢 Built to be polite: one browser, at least 1.5 seconds between requests, hard caps per run
- 🛑 **Stops if it gets blocked.** No retry tricks, no identity rotation, no CAPTCHA solving
- ⏰ Can run on a schedule to track fares over time (each row has a `scrapedAt` timestamp)

### What data does it extract?

| Field | Description |
|---|---|
| `shipName`, `shipCode` | Ship, e.g. "Carnival Elation" / `EL` |
| `itineraryTitle` | e.g. "4-Day The Bahamas from Jacksonville, FL" |
| `sailDate`, `returnDate` | ISO dates (YYYY-MM-DD) |
| `durationDays`, `durationNights` | Carnival's "X-Day" label, and nights calculated from the dates |
| `destination`, `destinationCode` | Region, e.g. The Bahamas / `BH` |
| `departurePort`, `departurePortCode` | e.g. Jacksonville, FL / `JAX` |
| `interiorPrice`, `oceanviewPrice`, `balconyPrice`, `suitePrice` | Lowest public fare per person (USD), or `null` if sold out, not offered, or failing the category check |
| `interiorCategoryCode` … `suiteCategoryCode` | The Carnival cabin category each price came from |
| `categoryCheck` | Verification status for each cabin type (see below) |
| `currency` | `USD` |
| `priceBasis` | `per person, double occupancy, taxes & fees not included` |
| `sailingId`, `itineraryUrl`, `bookingUrl` | Links to the public itinerary and booking pages |
| `scrapedAt` | When the price was observed. Prices change often. |

#### `categoryCheck` statuses

- `verified`: the category belongs to that cabin type on that ship, according to Carnival's ship content. For example, `OB` and `OS` are suite categories on some ships.
- `verified:UL-rate`: an interior category priced under a special "UL" rate. It may not be the default fare shown in the booking flow.
- `guarantee`: a generic "guarantee" code (`IS`, `OV`, `BL`), meaning you're assigned a cabin of that type.
- `mismatch:<type>` / `unknown-category`: the category doesn't match the cabin type, so the price is set to `null` rather than mislabelled.
- `unverified`: the ship data couldn't be loaded, so the price is shown as returned.
- `unavailable`: sold out or not offered.

### How to scrape Carnival cruise prices

1. Click **Try for free** and open the Input tab.
2. Optionally pick destinations, ports and a month range.
3. Set **Max sailings** (default 100, hard cap 2,000).
4. Click **Start**, then download the dataset in your preferred format.

#### Input examples

Bahamas sailings, first quarter of 2027:

```json
{ "destinations": ["BH"], "dateFrom": "2027-01", "dateTo": "2027-03", "maxItems": 200 }
```

Everything from Miami and Port Canaveral:

```json
{ "departurePorts": ["MIA", "PCV"], "maxItems": 500 }
```

Common destination codes (Carnival's own): `A` Alaska, `BH` Bahamas, `C` Caribbean (or a sub-region such as `CW` Western Caribbean), `M` Mexico, `H` Hawaii, `BM` Bermuda, `E` Europe. The old `AK` input is mapped to `A` automatically. Common port codes: `MIA`, `PCV`, `GAL`, `JAX`, `LAX`, `TPA`.

#### Output example

```json
{
  "shipName": "Carnival Elation", "sailDate": "2026-11-29", "returnDate": "2026-12-03",
  "durationNights": 4, "destination": "The Bahamas", "departurePort": "Jacksonville, FL",
  "interiorPrice": 178, "oceanviewPrice": 246, "balconyPrice": 566, "suitePrice": 666,
  "suiteCategoryCode": "OB",
  "categoryCheck": { "interior": "verified:UL-rate", "oceanview": "guarantee", "balcony": "guarantee", "suite": "verified" },
  "currency": "USD", "priceBasis": "per person, double occupancy, taxes & fees not included",
  "scrapedAt": "2026-10-29T19:18:39.139Z"
}
```

### How much does it cost?

This Actor uses **pay-per-event** pricing: **$1.80 per 1,000 results** ($0.0018 per sailing), plus a negligible $0.00005 per run start. For example, 100 sailings cost about $0.18, and 1,000 sailings about $1.80. A run of 100 sailings usually takes under a minute.

### Responsible use / Disclaimer

- **You are responsible** for using this tool in line with the target website's terms of use, applicable law (including copyright, database and consumer-protection rules) and reasonable rate limits. Using the output commercially, for example republishing or reselling fares, may need permission from the rights holder.
- The Actor collects only **publicly visible, logged-out pricing**. It never logs in and never uses accounts or cookies from a signed-in session.
- It does **not** bypass blocks, rotate fingerprints or solve CAPTCHAs. If the site responds with HTTP 403/429, a challenge page, or anything other than JSON, the run **stops gracefully** and keeps what it already collected. The reason is saved in the `RUN_SUMMARY` record.
- It pauses at least 1.5 seconds between requests and caps each run at 2,000 sailings and 100 search pages. These limits can't be lowered.
- It collects **no personal data**.
- Proxies are optional and up to you, for example to match a US location. They are not a way to get around blocks.
- Fares are indicative, change often, and may differ from the final checkout price. Always confirm on the cruise line's site.
- **Takedown requests, complaints and support:** open an issue on this Actor's **Issues** tab on Apify Store. We'll respond promptly.

### FAQ

**Is this official Carnival data?** No. This is an unofficial tool that reads public search results. For licensed data, use the cruise line's travel-agent or partner programs.

**Are taxes included?** No. Prices are the cruise fare per person, double occupancy. See `priceBasis`.

**Why is a price `null`?** The cabin type is sold out, not offered, or failed the category check.

**The run stopped with "blocked". What now?** The site refused the request. Wait, then try again later with a smaller `maxItems`. The Actor won't try to get around the block.

**Can I track price drops?** Yes. Schedule the Actor (for example daily) and compare `sailingId` prices across runs.

**Something's wrong or missing?** Open an issue on the Actor's **Issues** tab.

***

Built and maintained by **Clearfeed Labs**: reliable, compliant data feeds with polite scraping, clean schemas and fast fixes. Questions or takedown requests: use the **Issues** tab.

# Actor input Schema

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

Carnival destination codes (from Carnival's own search filters): A = Alaska, BH = The Bahamas, BM = Bermuda, C = Caribbean (sub-regions such as CW = Western Caribbean also work), M = Mexico, H = Hawaii, NN = Canada & New England, E = Europe, T = Panama Canal, S = South America, ET = Transatlantic, TP = Transpacific, X = Asia, U = Australia, NZ = New Zealand, O = South Pacific. Empty = all.

## `departurePorts` (type: `array`):

Embark port codes, e.g. MIA (Miami), PCV (Port Canaveral), JAX (Jacksonville), TPA (Tampa), GAL (Galveston), MSY (New Orleans), MOB (Mobile), BWI (Baltimore), NYC (New York), ORF (Norfolk), LAX (Los Angeles), SFO (San Francisco), SEA (Seattle). Empty = all.

## `dateFrom` (type: `string`):

YYYY-MM

## `dateTo` (type: `string`):

YYYY-MM

## `numAdults` (type: `integer`):

Prices are per person for this occupancy.

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

Maximum sailings (dataset rows) per run. Hard cap: 2000.

## `pageSize` (type: `integer`):

Itineraries per search API page.

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

Optional. Default is a direct connection. You may route requests through a proxy of your choice (e.g. to match a US location). Proxies are NOT a way to get past blocks: if the site blocks or rate-limits the run, the Actor stops.

## Actor input object example

```json
{
  "destinations": [
    "BH"
  ],
  "numAdults": 2,
  "maxItems": 100,
  "pageSize": 50,
  "proxyConfiguration": {
    "useApifyProxy": false
  }
}
```

# Actor output Schema

## `sailings` (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 = {
    "destinations": [
        "BH"
    ],
    "proxyConfiguration": {
        "useApifyProxy": false
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("clearfeedlabs/carnival-cruise-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 = {
    "destinations": ["BH"],
    "proxyConfiguration": { "useApifyProxy": False },
}

# Run the Actor and wait for it to finish
run = client.actor("clearfeedlabs/carnival-cruise-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 '{
  "destinations": [
    "BH"
  ],
  "proxyConfiguration": {
    "useApifyProxy": false
  }
}' |
apify call clearfeedlabs/carnival-cruise-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,clearfeedlabs/carnival-cruise-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/jrcl1jHCPPJEmhAnv/builds/zdL1avcOF7Wwcbsad/openapi.json
