{
  "openapi": "3.0.1",
  "info": {
    "title": "CruiseCritic Scraper [💰$1/1K] | Reviews | Itineraries",
    "description": "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.",
    "version": "0.0",
    "x-build-id": "HYEjSZkkmU5aHtwfo"
  },
  "servers": [
    {
      "url": "https://api.apify.com/v2"
    }
  ],
  "paths": {
    "/acts/ahmed_jasarevic~cruisecritic-scraper/run-sync-get-dataset-items": {
      "post": {
        "operationId": "run-sync-get-dataset-items-ahmed_jasarevic-cruisecritic-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/ahmed_jasarevic~cruisecritic-scraper/runs": {
      "post": {
        "operationId": "runs-sync-ahmed_jasarevic-cruisecritic-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/ahmed_jasarevic~cruisecritic-scraper/run-sync": {
      "post": {
        "operationId": "run-sync-ahmed_jasarevic-cruisecritic-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": {
          "startUrls": {
            "title": "Start URLs",
            "type": "array",
            "description": "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.",
            "items": {
              "type": "object",
              "required": [
                "url"
              ],
              "properties": {
                "url": {
                  "type": "string",
                  "title": "URL of a web page",
                  "format": "uri"
                }
              }
            }
          },
          "includeReviews": {
            "title": "Include member reviews",
            "type": "boolean",
            "description": "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.",
            "default": false
          },
          "sortBy": {
            "title": "Sort reviews by",
            "enum": [
              "newest",
              "oldest",
              "mostHelpful",
              "highestRated",
              "lowestRated"
            ],
            "type": "string",
            "description": "Order in which reviews are collected from each listing (applies to member reviews only).",
            "default": "newest"
          },
          "includeItineraries": {
            "title": "Include cruise itineraries",
            "type": "boolean",
            "description": "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.",
            "default": false
          },
          "itineraryDestination": {
            "title": "Itinerary destination",
            "type": "string",
            "description": "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": {
            "title": "Sort itineraries by",
            "enum": [
              "popularity",
              "price",
              "departureDate",
              "rating",
              "length"
            ],
            "type": "string",
            "description": "Order in which itineraries are collected (applies to cruise itineraries only).",
            "default": "popularity"
          },
          "maxItems": {
            "title": "Max ship profiles",
            "minimum": 1,
            "type": "integer",
            "description": "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.",
            "default": 100
          },
          "maxReviews": {
            "title": "Max reviews per profile",
            "minimum": 1,
            "type": "integer",
            "description": "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": {
            "title": "Max itineraries",
            "minimum": 1,
            "type": "integer",
            "description": "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": {
            "title": "Max requests per crawl",
            "maximum": 5000,
            "type": "integer",
            "description": "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.",
            "default": 50
          },
          "maxConcurrency": {
            "title": "Max concurrency",
            "maximum": 10,
            "type": "integer",
            "description": "Maximum number of concurrent requests. Increase with care; too much traffic can trigger the target site's bot protection.",
            "default": 4
          },
          "proxy": {
            "title": "Proxy configuration",
            "type": "object",
            "description": "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."
          }
        }
      },
      "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
                  },
                  "PROXY_UNBLOCKER_UNITS": {
                    "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
                  },
                  "PROXY_UNBLOCKER_UNITS": {
                    "type": "integer",
                    "example": 0
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}