# Cruisecritic Reviews Scraper (`stealth_mode/cruisecritic-reviews-scraper`) Actor

Scrape detailed cruise reviews from CruiseCritic.com including ratings, reviewer profiles, ship info, destinations, images, and helpfulness votes — perfect for travel analysts, cruise lines, and hospitality researchers.

- **URL**: https://apify.com/stealth\_mode/cruisecritic-reviews-scraper.md
- **Developed by:** [Stealth mode](https://apify.com/stealth_mode) (community)
- **Categories:** Automation, Developer tools, Travel
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, NaN bookmarks
- **User rating**: No ratings yet

## Pricing

from $2.00 / 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.
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

## CruiseCritic.com Reviews Scraper: Extract Cruise Reviews & Ratings

---

### What Is CruiseCritic.com?

CruiseCritic.com is one of the largest cruise review and research platforms, hosting hundreds of thousands of traveler reviews across cruise lines, ships, and itineraries worldwide. The **CruiseCritic Reviews Scraper** automates extraction of this review data — saving hours of manual collection and enabling systematic analysis at scale.

---

### Overview

This scraper targets cruise itinerary review pages on CruiseCritic.com, collecting structured review records per sailing. It suits:

- **Travel analysts** benchmarking cruise line sentiment
- **Cruise operators** monitoring passenger feedback
- **Hospitality researchers** studying traveler satisfaction trends
- **Aggregator platforms** building cruise recommendation engines

---

### Input Format

```json
{
  "urls": [
    "https://www.cruisecritic.com/find-a-cruise/itinerary/12-night-caribbean-princess-to-southern-caribbean-on-october-18-2026?section=reviews&src=findACruiseItinerary"
  ],
  "ignore_url_failures": true,
  "max_items_per_url": 100
}
````

| Field | Type | Description |
|---|---|---|
| `urls` | `array` | URLs of cruise itinerary pages with `?section=reviews`. Add one per line or use Bulk edit. Example: `https://www.cruisecritic.com/find-a-cruise/itinerary/...?section=reviews` |
| `ignore_url_failures` | `boolean` | If `true`, skips failed URLs and continues the run instead of stopping. Recommended for bulk runs. Default: `true` |
| `max_items_per_url` | `integer` | Maximum number of reviews to collect per URL. Default: `20`. Set higher (e.g., `100`) for comprehensive coverage |

> **Tip:** Ensure the URL includes `?section=reviews` to target the reviews tab directly. Itinerary overview URLs without this parameter may return no reviews.

***

### Output Format

#### Sample Record (abbreviated)

```json
{
  "review": {
    "id": "738693",
    "rating": 5,
    "title": "Excellent introduction to Princess ",
    "snippet": "The one thing I did suggest to Princess in our after-cruise survey was for areas inside the ship to be available that did NOT have any music playing.We were impressed even if the Caribbean Princess is one of the oldest ships in their fleet.",
    "body": "This was our first Princess cruise, after having sailed Celebrity (3) and Holland America (1). We were impressed even if the Caribbean Princess is one of the oldest ships in their fleet. \r\n\r\nAs an overview, we were impressed with how finely she has been maintained. The decor is older, as to be expected, but it was comfortable and well taken care of. The ship itself was spotless. \r\n\r\nEmbarkation was an absolute breeze and it will be hard to go back to key cards after using the Medallion system. As someone who has worked in IT for more than 15 years, this experience was rock-solid from a tech perspective. We never had a single instance of the medallion not working through this 12 day cruise. \r\n\r\nWe had our first Inside cabin (forward) after having verandas in our other cruises. The room was efficiently designed and yes, the automatic light near the closet was annoying when you got up at night to use the bathroom :D . However, I am literally going to be buying myself one of their pillows because that bed was heaven! I wanted to pack it all up in my suitcase and take it home. Our room steward, Rashid, was excellent. Friendly, unobtrusive, always willing to help. The shower did have a shower curtain, but it was a heavy one and we never had any issues with it flying away or sticking to our legs. \r\n\r\nThe Lido deck had its share of chair hogs, as to be expected. I loved having multiple pools to choose from. I wish they had more lounge chairs in the shade versus the tables/chairs they have. However, the tables and chairs were always in use by people enjoying a game of cards or a table game, which was nice. \r\n\r\nThe gym had excellent equipment and was always clean. I suggested to Princess they have some yoga/exercise mats outside in the main gym itself and not just in the class space. I wanted to do yoga quite a few times and timed it badly so I got there when there was always a class in session. \r\n\r\nI did use the Service at Sea to order a snack and a drink and they found me without issue. The key here is that you actually have to go to your Cart and check out for the order to be placed. Some folks I was sitting near were having issues until they realized this.\r\n\r\nMeals were great - good variety of food and consistent standards. We ate mostly in the buffet and the food was always hot and fresh. Dining room service for the three times we ate there was attentive but not obsequious. \r\n\r\nThe one thing I did suggest to Princess in our after-cruise survey was for areas inside the ship to be available that did NOT have any music playing., even if for a small period of time in the morning. The only place we could get away from background music (live or otherwise) was out on the Promenade. Skywalker's Lounge would be the most perfect spot for this from 8:00am-12:00pm. We were up there multiple times and it was hardly used, it seemed.   Also, what a cool lounge! What a view!\r\n\r\nMy husband is a musician and was blown away by the quality of the musicians in the house band and also their main party band, Xcite (from Trinidad-Tobago). Really top notch, excellent artists. We had a great time listening to them. \r\n\r\nValerian, in the bar in back of the buffet (Oceanview!? I can't remember), was wonderful and created a drink for my husband that was spicy like he likes them. It was basically a margarita with a muddled jalapeno and no sugar. My husband was over the moon! :D \r\n\r\nThe Caribbean Princess is my husband's new favorite ship and we won't hesitate to sail with them again. We already put a deposit down. :) \r\n\r\nWe didn't go to any of the theater productions, mostly the music in the bars/lounges.",
    "cruise_date": "2026-02-21",
    "cruise_experience_level": "couple",
    "url": "/cruise/princess/caribbean-princess/reviews/738693",
    "has_children": false,
    "with_disabled": false
  },
  "user": {
    "id": "in4JuYoBtleMZ6TB-B7m",
    "username": "JaneAustenCruiser",
    "total_posts": 0,
    "avatar_url": "//images.r.cruisecritic.com/community/badges/cc_2011_badge_member.jpg",
    "total_helpful_votes": 0,
    "total_reviews": 0,
    "age": 50
  },
  "destination": {
    "id": 123,
    "name": "Caribbean - Southern",
    "slug": "southern-caribbean"
  },
  "ship": {
    "id": 303,
    "name": "Caribbean Princess",
    "slug": "caribbean-princess"
  },
  "cruise_line": {
    "id": 28,
    "name": "Princess Cruises",
    "slug": "princess"
  },
  "images": [
    {
      "id": 213056,
      "file_name": "adfbb0a2f8c443638d54c194a709f2d8.jpg"
    }
  ],
  "helpful_votes": 8,
  "from_url": "https://www.cruisecritic.com/find-a-cruise/itinerary/12-night-caribbean-princess-to-southern-caribbean-on-october-18-2026?section=reviews&src=findACruiseItinerary"
}
```

Each record represents a single cruise review with the following fields:

| Field | Meaning |
|---|---|
| `Review` | Full review content including overall rating, category sub-ratings (e.g., cabin, dining, embarkation), and the reviewer's written text |
| `User` | Reviewer profile data — typically includes username, membership level, and number of reviews contributed |
| `Destination` | The cruise destination or region reviewed (e.g., Southern Caribbean, Mediterranean) |
| `Ship` | The specific vessel the reviewer sailed on (e.g., *Caribbean Princess*) |
| `Cruise Line` | The operating cruise line (e.g., Princess Cruises, Royal Caribbean) |
| `Images` | Photos attached to the review, returned as image URLs |
| `Helpful Votes` | Number of times other users marked the review as helpful — useful for weighting sentiment analysis |

***

### How to Use

1. **Find review URLs** — Go to CruiseCritic.com, navigate to a cruise itinerary, and click the **Reviews** tab. Copy the full URL (ensure it contains `?section=reviews`).
2. **Configure input** — Paste URLs into the `urls` array. Adjust `max_items_per_url` based on how many reviews you need.
3. **Set failure handling** — Keep `ignore_url_failures: true` for multi-URL runs.
4. **Run and export** — Start the scraper and download results as JSON or CSV.

**Common issues:**

- URL missing `?section=reviews` → no review data returned
- Itinerary has fewer reviews than `max_items_per_url` → scraper collects all available and stops normally

***

### Use Cases & Business Value

- **Sentiment analysis:** Aggregate ratings across ships or routes to identify service gaps
- **Competitive benchmarking:** Compare passenger satisfaction between cruise lines
- **Content moderation research:** Study review patterns and helpfulness signals
- **Travel tech:** Power recommendation engines with real traveler feedback

***

### Conclusion

The **CruiseCritic.com Reviews Scraper** turns publicly available cruise reviews into structured, analysis-ready datasets. With seven key output fields and simple configuration, it provides immediate value for anyone working with cruise industry data.

# Actor input Schema

## `urls` (type: `array`):

Add the URLs of the tours details urls you want to scrape. You can paste URLs one by one, or use the Bulk edit section to add a prepared list.

## `ignore_url_failures` (type: `boolean`):

If true, the scraper will continue running even if some URLs fail to be scraped.

## `max_items_per_url` (type: `integer`):

The maximum number of items to scrape per URL.

## Actor input object example

```json
{
  "urls": [
    "https://www.cruisecritic.com/find-a-cruise/itinerary/12-night-caribbean-princess-to-southern-caribbean-on-october-18-2026?section=reviews&src=findACruiseItinerary"
  ],
  "ignore_url_failures": true,
  "max_items_per_url": 20
}
```

# 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 = {
    "urls": [
        "https://www.cruisecritic.com/find-a-cruise/itinerary/12-night-caribbean-princess-to-southern-caribbean-on-october-18-2026?section=reviews&src=findACruiseItinerary"
    ],
    "ignore_url_failures": true,
    "max_items_per_url": 20
};

// Run the Actor and wait for it to finish
const run = await client.actor("stealth_mode/cruisecritic-reviews-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 = {
    "urls": ["https://www.cruisecritic.com/find-a-cruise/itinerary/12-night-caribbean-princess-to-southern-caribbean-on-october-18-2026?section=reviews&src=findACruiseItinerary"],
    "ignore_url_failures": True,
    "max_items_per_url": 20,
}

# Run the Actor and wait for it to finish
run = client.actor("stealth_mode/cruisecritic-reviews-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 '{
  "urls": [
    "https://www.cruisecritic.com/find-a-cruise/itinerary/12-night-caribbean-princess-to-southern-caribbean-on-october-18-2026?section=reviews&src=findACruiseItinerary"
  ],
  "ignore_url_failures": true,
  "max_items_per_url": 20
}' |
apify call stealth_mode/cruisecritic-reviews-scraper --silent --output-dataset

```

## MCP server setup

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

```

## OpenAPI specification

```json
{
    "openapi": "3.0.1",
    "info": {
        "title": "Cruisecritic Reviews Scraper",
        "description": "Scrape detailed cruise reviews from CruiseCritic.com including ratings, reviewer profiles, ship info, destinations, images, and helpfulness votes — perfect for travel analysts, cruise lines, and hospitality researchers.",
        "version": "0.0",
        "x-build-id": "3xP9QX5xj7KirRJgi"
    },
    "servers": [
        {
            "url": "https://api.apify.com/v2"
        }
    ],
    "paths": {
        "/acts/stealth_mode~cruisecritic-reviews-scraper/run-sync-get-dataset-items": {
            "post": {
                "operationId": "run-sync-get-dataset-items-stealth_mode-cruisecritic-reviews-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/stealth_mode~cruisecritic-reviews-scraper/runs": {
            "post": {
                "operationId": "runs-sync-stealth_mode-cruisecritic-reviews-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/stealth_mode~cruisecritic-reviews-scraper/run-sync": {
            "post": {
                "operationId": "run-sync-stealth_mode-cruisecritic-reviews-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": {
                    "urls": {
                        "title": "URLs of the tours details urls to scrape",
                        "type": "array",
                        "description": "Add the URLs of the tours details urls you want to scrape. You can paste URLs one by one, or use the Bulk edit section to add a prepared list.",
                        "items": {
                            "type": "string"
                        }
                    },
                    "ignore_url_failures": {
                        "title": "Continue running even if some URLs fail to be scraped",
                        "type": "boolean",
                        "description": "If true, the scraper will continue running even if some URLs fail to be scraped."
                    },
                    "max_items_per_url": {
                        "title": "Max items per URL",
                        "type": "integer",
                        "description": "The maximum number of items to scrape per URL."
                    }
                }
            },
            "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
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }
}
```
