# CruiseCritic Scraper \[💰$1/1K] | Reviews | Itineraries (`ahmed_jasarevic/cruisecritic-scraper`) Actor

Scrape CruiseCritic.com in three datasets: cruise ship profiles with ratings, review counts, size, ratio and price per night; member reviews with full text, rating, cruise date and author; and itineraries with day-by-day ports of call, searchable by destination.

- **URL**: https://apify.com/ahmed_jasarevic/cruisecritic-scraper.md
- **Developed by:** [Ahmed Jasarevic](https://apify.com/ahmed_jasarevic) (community)
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $0.90 / 1,000 reviews

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?

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

## CruiseCritic Scraper — Ship Profiles, Member Reviews & Cruise Itineraries

Scrape **[CruiseCritic.com](https://www.cruisecritic.com)** in three datasets: cruise ship profiles (always), member reviews and cruise itineraries (optional). Ship profiles carry ratings, review counts, size, passenger ratio, maiden year, lowest price per night and type flags; reviews carry the full review text, rating, cruise date and length, author, destination, departure port and photos; itineraries carry the day-by-day route with every port of call. Listing URLs are resolved automatically and pagination is followed until your item caps are reached.

Built for cruise-line market research, travel agencies and OTA product teams, itinerary-comparison tools, and reputation teams tracking member sentiment across a fleet.

### Scrape Cruise Ship Profiles, Reviews & Itineraries For Market Research

- **Cruise ship database** — ratings, review counts, size category, passenger ratio, maiden year and lowest price per night per ship
- **Member review mining** — full review text with rating, cruise date and length, author age band, experience level, destination, departure port and photos
- **Itinerary and route research** — day-by-day ports of call, departure and arrival ports, destination region, ship and cruise line, searchable by destination
- **Sentiment analysis on cruise lines** — `memberLovePercentage`, `professionalRating` and average member rating per ship
- **Competitive fleet analysis** — ship type flags (`isRiver`, `isExpedition`, `isFamily`, `isLuxury`) across a whole cruise line in one run
- **Building a cruise comparison dataset** — price-per-night, size and ratio fields combine with reviews and itineraries for full-fleet coverage

### How It Works

![How the CruiseCritic Scraper works: cruise pages become ship profiles, member reviews and day-by-day itineraries.](https://api.apify.com/v2/key-value-stores/oeuA0kLOyhbRM4fzt/records/how-it-works-cruisecritic.webp)

The Actor calls the same Next.js data endpoint the CruiseCritic frontend uses. One request returns every ship in a line, up to 100 full reviews or 25 itineraries, with pagination followed to the caps you set.

Each ship row carries ratings, review volume, size, maiden year and lowest nightly price. Reviews and itineraries are written to their own datasets, ready for sentiment and route analysis.

CruiseCritic.com is a Next.js application backed by a public data endpoint. The Actor talks to that endpoint directly — the same one the site's own frontend uses — instead of rendering pages in a browser:

- One JSON request returns **all ships of a cruise line**, or up to **100 full reviews** (title, complete body text, rating, author, ship, destination, photos) — roughly ten times more per request than an HTML page.
- Itinerary search resolves a destination keyword to a destination ID and then returns **25 itineraries per request**, each with its full day-by-day route.
- Listing URLs are resolved automatically (`cruiselineBySlug` / `shipBySlug`), and review and itinerary pagination is followed until the item caps are reached.
- Pages without a data shortcut (for example a single review detail URL) fall back to parsing the JSON embedded in the page's `__NEXT_DATA__` script tag.

No browser, no CSS selectors, low memory. A 10,000-review job takes around 100 requests.

### Input Parameters

| Field | Type | Required | Default | Notes |
| --- | --- | --- | --- | --- |
| `startUrls` | array | Yes | — | Cruise page or review-listing URLs. Review listings support the `rating` and `page` query parameters. |
| `includeReviews` | boolean | No | `false` | Also scrape member reviews into the `reviews` dataset. Charged per review saved. When no review URLs are given, reviews of the ships found in the itineraries are collected automatically. |
| `sortBy` | enum | No | `newest` | Review order: `newest`, `oldest`, `mostHelpful`, `highestRated`, `lowestRated`. |
| `includeItineraries` | boolean | No | `false` | Also search cruise itineraries into the `itineraries` dataset. Charged per itinerary saved. Enabled automatically when a find-a-cruise start URL is provided. |
| `itineraryDestination` | string | No | all | Destination to search itineraries for, matched against CruiseCritic destinations (e.g. `croatia`, `alaska`, `caribbean`). Empty means all destinations. |
| `itinerarySortBy` | enum | No | `popularity` | Itinerary order: `popularity`, `price`, `departureDate`, `rating`, `length`. |
| `maxItems` | integer | No | `100` | Maximum ship profiles in the default dataset. |
| `maxReviews` | integer | No | `maxItems` | Maximum reviews per ship profile in the `reviews` dataset. |
| `maxItineraries` | integer | No | `maxItems` | Maximum itineraries in the `itineraries` dataset. |
| `maxRequestsPerCrawl` | integer | No | `50` | Maximum requests; each returns a whole ship list, up to 100 reviews or 25 itineraries. |
| `maxConcurrency` | integer | No | `4` | Concurrent requests. |
| `proxy` | object | No | Apify Proxy | Standard Apify proxy configuration; Apify Proxy is enabled by default and used for page fetches when the target site blocks the Actor's IP range. |

Free-plan runs are limited to **10 items per dataset**; paying runs get the configured caps.

### Output Fields

#### Ship profiles (default dataset)

| Field | Description |
| --- | --- |
| `shipId` | CruiseCritic ship ID. |
| `name`, `slug`, `url` | Ship name and page URL. |
| `line`, `lineSlug` | Cruise line name and slug. |
| `imageUrl` | Main ship photo. |
| `averageRating` | Average member rating (1–5). |
| `memberLovePercentage` | Share of members who loved the ship. |
| `professionalRating` | Editors' rating. |
| `totalReviews` | Number of member reviews. |
| `size`, `ratio` | Size category and passenger ratio. |
| `maidenYear` | Year of the maiden voyage. |
| `lowestPricePerNight` | Lowest price per night, when available. |
| `isRiver`, `isExpedition`, `isFamily`, `isLuxury` | Ship type flags. |
| `scrapedAt` | Scrape timestamp. |

#### Member reviews (`reviews` dataset)

| Field | Description |
| --- | --- |
| `reviewId` | CruiseCritic review ID. |
| `url` | Source URL of the review. |
| `ship`, `line` | Cruise ship and cruise line name. |
| `title` | Review title. |
| `rating` | Overall rating (1–5). |
| `reviewText` | Full review text. |
| `cruiseDate` | Date of the cruise. |
| `cruiseLength` | Cruise length in nights. |
| `cruiseExperienceLevel` | Reviewer's experience level. |
| `author`, `authorAge` | Reviewer username and age band, when provided. |
| `destination`, `departurePort` | Cruise destination and departure port. |
| `helpfulVotes` | Helpful votes on the review. |
| `totalImages` / `images` | Review photos. |
| `scrapedAt` | Scrape timestamp. |

#### Cruise itineraries (`itineraries` dataset)

| Field | Description |
| --- | --- |
| `itineraryId` | CruiseCritic itinerary ID. |
| `title` | Itinerary name. |
| `length` | Cruise length in nights. |
| `cruiseLineId`, `cruiseLine` | Cruise line ID and name. |
| `shipId`, `ship`, `shipImageUrl` | Ship ID, name and photo. |
| `departurePortId`, `departurePort`, `departurePortSlug` | Embarkation port and its slug. |
| `arrivalPortId`, `arrivalPort`, `arrivalPortSlug` | Final port and its slug. |
| `destinationId`, `destination` | Destination region. |
| `route` | Ports of call in order, one entry per day (`day`, `port`, `portId`, `portSlug`). |
| `scrapedAt` | Scrape timestamp. |

### Example Input

All ships of a cruise line, plus its top-rated reviews and Alaska itineraries:

```json
{
  "startUrls": [
    { "url": "https://www.cruisecritic.com/cruise/celebrity/cruises" },
    { "url": "https://www.cruisecritic.com/cruise/celebrity/reviews?rating=excellent,very-good" }
  ],
  "includeReviews": true,
  "sortBy": "highestRated",
  "includeItineraries": true,
  "itineraryDestination": "alaska",
  "itinerarySortBy": "rating",
  "maxItems": 50,
  "maxReviews": 20
}
```

### Example Output

```json
{
  "shipId": "20046",
  "name": "Celebrity Edge",
  "slug": "celebrity-edge",
  "url": "https://www.cruisecritic.com/cruise/celebrity/celebrity-edge",
  "line": "Celebrity Cruises",
  "lineSlug": "celebrity",
  "imageUrl": "https://www.cruisecritic.com/img/ships/celebrity-edge.jpg",
  "averageRating": 4.5,
  "memberLovePercentage": 87,
  "professionalRating": 4.5,
  "totalReviews": 1243,
  "size": "Large",
  "ratio": 2.0,
  "maidenYear": "2018",
  "lowestPricePerNight": 189,
  "isRiver": false,
  "isExpedition": false,
  "isFamily": false,
  "isLuxury": true,
  "scrapedAt": "2026-10-17T12:00:00.000Z"
}
```

### Automate Cruise Monitoring With Schedules & Webhooks

- **Schedule the Actor** monthly to re-crawl a fleet and detect new ships, new reviews and updated ratings or price-per-night.
- **Webhooks** — configure a run-success webhook so each finished run POSTs to n8n, Make or Zapier and lands in a CRM, spreadsheet or data warehouse.
- **Apify API** — pull any of the three datasets programmatically with the JavaScript or Python client, or export JSON / CSV / Excel from the console.
- Recurring runs are what keep a cruise database current; ships, ratings and itineraries change across seasons.

### Related Actors

- [Cruisecritic Reviews Scraper](https://apify.com/stealth_mode/cruisecritic-reviews-scraper) — CruiseCritic member reviews by cruise line.
- [CruiseCritic Ship Reviews & Itinerary Scraper](https://apify.com/litezero/cruisecritic-ship-reviews-scraper) — CruiseCritic ship reviews and itineraries.
- [Royal Caribbean Scraper — Complete Cruise Data Extractor](https://apify.com/sercul/royal-caribbean) — Royal Caribbean sailings, per-cabin pricing and booking links across 9 markets.
- [CruiseMapper Scraper](https://apify.com/parsebird/cruisemapper-scraper) — cruise itineraries, ships and ports from CruiseMapper.
- [CruiseMapper Scraper (Alternative)](https://apify.com/solidcode/cruisemapper-scraper) — CruiseMapper itineraries, ship specs and port schedules.

### Frequently Asked Questions

#### Why use this Actor instead of the official CruiseCritic API?

CruiseCritic publishes no public developer API for ship profiles, reviews or itineraries. Its pages are additionally protected by DataDome bot mitigation, and review listing pages can exceed 1 MB of HTML. This Actor instead reads the same public JSON data endpoint the site's own Next.js frontend calls — so one request returns up to 100 full reviews or every ship of a cruise line, with no API key, no browser rendering and no DOM scraping setup.

#### What are alternatives to CruiseCritic for cruise data?

Three routes exist. First, the cruise lines' own booking sites (Royal Caribbean, Celebrity, Carnival, Norwegian, MSC, Princess, Disney), which publish per-cabin pricing and sailings but no third-party reviews. Second, CruiseMapper and Viamaster, which cover itineraries, ships and ports but not member sentiment. Third, third-party CruiseCritic API resellers, which proxy the site's data at a higher per-record price. This Actor covers the reviews and ship-profile side that the booking sites cannot.

#### Does CruiseCritic have an official API?

No. There is no published CruiseCritic developer API. Its public site is served by a Next.js application with a JSON data endpoint that the frontend itself calls, which is what this Actor reads. Third-party vendors sell "CruiseCritic APIs" that proxy the site's pages — they are not official.

#### Can I filter reviews by rating?

Yes. Review listing URLs accept the site's own `rating` query parameter, for example `.../celebrity/reviews?rating=excellent,very-good`. Valid values are `excellent`, `very-good`, `average`, `poor` and `terrible`. Combined with `sortBy`, this lets you extract only positive or only negative sentiment for a line or a ship.

#### Can I collect itineraries by destination?

Yes — enable `includeItineraries` and set `itineraryDestination` to a CruiseCritic destination such as `croatia`, `alaska` or `caribbean`, leaving it empty for all destinations. You can also paste a find-a-cruise URL as a start URL; its filters (destination, cruise line, ports of call, departure port, length, page) are read and applied automatically, and the option turns itself on. Each saved itinerary is charged.

#### Can an AI agent call this Actor?

Yes. It is a standard Apify Actor, so any MCP client or agent can start a run through the Apify API or the Apify MCP server, wait for it to finish, and read the dataset items. The minimal input and output field list are in the next section.

#### How much does it cost?

Pay-per-event: ship profiles are charged per profile saved, member reviews per review saved and itineraries per itinerary saved ($1 per 1,000 items), plus a small Actor-start event scaled by memory. If the run's spending limit is reached, the Actor stops cleanly: already saved items were billed, nothing further is fetched.

### For AI Agents & LLM Apps

Purpose: return structured cruise data from cruisecritic.com as three separate datasets — ship profiles (default), member reviews and cruise itineraries — with ratings, review text, day-by-day routes and price-per-night.

Minimal input (all ships of a cruise line):

```json
{ "startUrls": [{ "url": "https://www.cruisecritic.com/cruise/celebrity/cruises" }] }
```

Variant — ships, top-rated reviews and destination itineraries:

```json
{
  "startUrls": [
    { "url": "https://www.cruisecritic.com/cruise/celebrity/cruises" },
    { "url": "https://www.cruisecritic.com/cruise/celebrity/reviews?rating=excellent,very-good" }
  ],
  "includeReviews": true,
  "sortBy": "highestRated",
  "includeItineraries": true,
  "itineraryDestination": "alaska",
  "maxItems": 50,
  "maxReviews": 20
}
```

Output fields:

- Default dataset (ship profiles): `shipId`, `name`, `slug`, `url`, `line`, `lineSlug`, `imageUrl`, `averageRating`, `memberLovePercentage`, `professionalRating`, `totalReviews`, `size`, `ratio`, `maidenYear`, `lowestPricePerNight`, `isRiver`, `isExpedition`, `isFamily`, `isLuxury`, `scrapedAt`.
- `reviews` dataset: `reviewId`, `url`, `ship`, `line`, `title`, `rating`, `reviewText`, `cruiseDate`, `cruiseLength`, `cruiseExperienceLevel`, `author`, `authorAge`, `destination`, `departurePort`, `helpfulVotes`, `totalImages`, `images`, `scrapedAt`.
- `itineraries` dataset: `itineraryId`, `title`, `length`, `cruiseLineId`, `cruiseLine`, `shipId`, `ship`, `shipImageUrl`, `departurePortId`, `departurePort`, `departurePortSlug`, `arrivalPortId`, `arrivalPort`, `arrivalPortSlug`, `destinationId`, `destination`, `route`, `scrapedAt`.

Behaviors an agent should know:

- `startUrls` is required and drives everything. Accepted shapes: a cruise-line page (all ships), a single ship page, a review listing (with `rating` and `page` parameters) or a find-a-cruise URL.
- Ship profiles always land in the default dataset; reviews and itineraries only when their include flags are on, and they land in separate `reviews` and `itineraries` datasets — not the default one.
- `includeReviews` and `includeItineraries` each add per-item charges; leave them off when you only need ship profiles.
- When a find-a-cruise URL is provided, `includeItineraries` enables itself and its filters are applied automatically; with no usable filters, itineraries are collected across all destinations.
- When itineraries are collected, the Actor also fetches the profiles of the ships that appear in them (charged per profile) and, if reviews are enabled and no review URLs were given, reviews of those ships.
- `maxReviews` and `maxItineraries` default to the value of `maxItems`, so setting one cap often sets all three — override them explicitly if you want asymmetric caps.
- Free-plan runs are limited to 10 items per dataset.

Billing: pay-per-event — $1 per 1,000 items, charged separately per dataset type (profiles, reviews, itineraries), plus a small Actor-start event scaled by memory. Budget by item count per dataset, since each dataset bills independently.

### Legal & Compliance Disclaimer

This Actor is an independent tool and is not affiliated with, endorsed by or sponsored by Cruise Critic or its parent company. It reads only publicly visible cruise pages, review listings and itinerary search results on cruisecritic.com — no login, no account and no access to private or member-only data, and it does not circumvent any authentication or access control. Reviewer usernames and any age band shown are already public on the review pages. You are responsible for your own compliance with CruiseCritic's Terms of Service and with applicable data-protection law (including the GDPR where personal data is present) when scaling or redistributing reviews.

### SEO Keywords

cruisecritic scraper, cruise ship data, cruise reviews api, cruise itineraries scraper, cruise line market research, cruise ship database, member reviews scraper, cruise port of call data, cruise destination data, cruise review sentiment, cruise price per night, ship passenger ratio, cruise fleet analysis, cruise itinerary search, alaska cruise data, caribbean cruise data, mediterranean cruise data, cruise comparison data, cruisecritic api alternative, cruise line scraper, cruise travel research, river cruise data, expedition cruise data, cruise review database

# Actor input Schema

## `startUrls` (type: `array`):

CruiseCritic cruise URLs to scrape. Ship pages collect the ship profiles into the default dataset, for example https://www.cruisecritic.com/cruise/celebrity (all ships of a line) or https://www.cruisecritic.com/cruise/celebrity/celebrity-edge (one ship); the /cruises variants of these URLs work too. Review listings are only scraped when "Include member reviews" is enabled, for example https://www.cruisecritic.com/cruise/celebrity/reviews (all reviews for a line) or .../celebrity-edge/reviews (one ship). On review URLs the `rating` query parameter is honored (e.g. ?rating=excellent,very-good; values: excellent, very-good, average, poor, terrible), as is `page` for starting at a later page. The Actor follows pagination automatically. find-a-cruise URLs (e.g. https://www.cruisecritic.com/find-a-cruise/destination-europe or .../find-a-cruise?port=126,154) cannot be fetched directly; their filters (destination, cruise line, ports of call, departure port, length, page) are applied to the itinerary search instead, and providing one enables "Include cruise itineraries" automatically.

## `includeReviews` (type: `boolean`):

When enabled, review listings are also scraped and saved to a separate "reviews" dataset. Each saved review is charged as an extra pay-per-event (see the Actor's pricing), so this is disabled by default. Leave it off to collect only ship profiles. If no review URLs are provided and itineraries are collected, the reviews of the ships found in the itineraries are collected automatically.

## `sortBy` (type: `string`):

Order in which reviews are collected from each listing (applies to member reviews only).

## `includeItineraries` (type: `boolean`):

When enabled, the Actor also searches cruise itineraries and saves them to a separate "itineraries" dataset, with one item per itinerary: route day by day, ports, ship, cruise line, length and destination. Each saved itinerary is charged as an extra pay-per-event (see the Actor's pricing), so this is disabled by default. Providing a find-a-cruise start URL enables it automatically.

## `itineraryDestination` (type: `string`):

Destination to search itineraries for, matched against CruiseCritic destinations, for example croatia, alaska, caribbean or mediterranean. Leave empty to collect itineraries across all destinations. Applies only when "Include cruise itineraries" is enabled. When a start URL is a find-a-cruise page with its own filters, those are used instead and this option only fills in a missing destination.

## `itinerarySortBy` (type: `string`):

Order in which itineraries are collected (applies to cruise itineraries only).

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

Maximum number of ship profiles to save to the default dataset. Reviews and itineraries have their own limits below. Free users are limited to 10 items per dataset.

## `maxReviews` (type: `integer`):

Maximum number of member reviews to save for each ship profile. Leave empty to use the value of "Max ship profiles". Free users are limited to 10 reviews in total.

## `maxItineraries` (type: `integer`):

Maximum number of itineraries to save to the "itineraries" dataset. Leave empty to use the value of "Max ship profiles". Free users are limited to 10 items per dataset.

## `maxRequestsPerCrawl` (type: `integer`):

Maximum number of requests the crawler may perform. Data comes from CruiseCritic's own endpoints, which return whole ship lists and up to 100 reviews per request, so 50 requests can yield thousands of items.

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

Maximum number of concurrent requests. Increase with care; too much traffic can trigger the target site's bot protection.

## `proxy` (type: `object`):

Proxies used by the crawler. Apify Proxy is enabled by default; if the target site ever blocks requests, consider switching to residential proxies. When no proxy is available, the Actor continues without one.

## Actor input object example

```json
{
  "startUrls": [
    {
      "url": "https://www.cruisecritic.com/cruise/celebrity/cruises"
    }
  ],
  "includeReviews": false,
  "sortBy": "newest",
  "includeItineraries": false,
  "itineraryDestination": "croatia",
  "itinerarySortBy": "popularity",
  "maxItems": 100,
  "maxRequestsPerCrawl": 50,
  "maxConcurrency": 4,
  "proxy": {
    "useApifyProxy": true
  }
}
```

# Actor output Schema

## `cruises` (type: `string`):

No description

## `reviews` (type: `string`):

No description

## `itineraries` (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 = {
    "startUrls": [
        {
            "url": "https://www.cruisecritic.com/cruise/celebrity/cruises"
        }
    ],
    "itineraryDestination": "croatia",
    "proxy": {
        "useApifyProxy": true
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("ahmed_jasarevic/cruisecritic-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 = {
    "startUrls": [{ "url": "https://www.cruisecritic.com/cruise/celebrity/cruises" }],
    "itineraryDestination": "croatia",
    "proxy": { "useApifyProxy": True },
}

# Run the Actor and wait for it to finish
run = client.actor("ahmed_jasarevic/cruisecritic-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 '{
  "startUrls": [
    {
      "url": "https://www.cruisecritic.com/cruise/celebrity/cruises"
    }
  ],
  "itineraryDestination": "croatia",
  "proxy": {
    "useApifyProxy": true
  }
}' |
apify call ahmed_jasarevic/cruisecritic-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,ahmed_jasarevic/cruisecritic-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/71eFaz96lHcVshEdQ/builds/HYEjSZkkmU5aHtwfo/openapi.json
