{"openapi":"3.1.0","info":{"title":"Cruise Price Check API","version":"1.0.0","summary":"Recorded cruise fares and itineraries as JSON.","description":"Search sailings from Celebrity Cruises, Royal Caribbean, Virgin Voyages, Norwegian Cruise Line and MSC Cruises, with the latest cabin fares Cruise Price Check recorded. No key is needed. Each IP address can make 30 requests an hour. Every request counts, including errors. Fares are the latest prices we recorded from each cruise line and can change at any time. Confirm the price, fare basis, taxes and fees with the cruise line before booking.","termsOfService":"https://cruisepricecheck.com/terms","contact":{"name":"Cruise Price Check by Codify Limited","url":"https://cruisepricecheck.com/cruise-price-api"}},"externalDocs":{"description":"Cruise price API documentation","url":"https://cruisepricecheck.com/cruise-price-api"},"servers":[{"url":"https://cruisepricecheck.com/api/v1"}],"security":[],"paths":{"/cruises":{"get":{"operationId":"searchCruises","summary":"Search cruise sailings and their latest recorded fares","description":"Returns a page of sailings. By default these depart from today onwards and are sorted by departure date. An unknown parameter returns 400.","parameters":[{"name":"line","in":"query","required":false,"description":"Cruise line IDs, separated by commas: celebrity, royal, virgin, ncl, msc.","schema":{"type":"string"},"example":"celebrity,royal"},{"name":"from","in":"query","required":false,"description":"Earliest departure date, YYYY-MM-DD. Defaults to today in the UK.","schema":{"type":"string","format":"date"},"example":"2027-05-01"},{"name":"to","in":"query","required":false,"description":"Latest departure date, YYYY-MM-DD.","schema":{"type":"string","format":"date"},"example":"2027-09-30"},{"name":"minNights","in":"query","required":false,"description":"Shortest trip length in nights.","schema":{"type":"integer","minimum":1,"maximum":365},"example":7},{"name":"maxNights","in":"query","required":false,"description":"Longest trip length in nights.","schema":{"type":"integer","minimum":1,"maximum":365},"example":14},{"name":"maxPrice","in":"query","required":false,"description":"Only sailings whose lowest fare is at or below this amount, compared in the fare's own currency.","schema":{"type":"number","exclusiveMinimum":0},"example":1500},{"name":"cabin","in":"query","required":false,"description":"Cabin category: inside, outside (ocean view), balcony or suite. Only fares in that category are returned.","schema":{"type":"string","enum":["inside","outside","balcony","suite"]},"example":"balcony"},{"name":"sort","in":"query","required":false,"description":"Use date to sort by departure date or price to sort by lowest fare, both ascending. Defaults to date.","schema":{"type":"string","enum":["date","price"],"default":"date"},"example":"price"},{"name":"page","in":"query","required":false,"description":"Page number, from 1 to 100.","schema":{"type":"integer","minimum":1,"maximum":100,"default":1},"example":2},{"name":"limit","in":"query","required":false,"description":"Sailings per page, from 1 to 25. Defaults to 10.","schema":{"type":"integer","minimum":1,"maximum":25,"default":10},"example":25}],"responses":{"200":{"description":"A page of sailings.","headers":{"RateLimit-Limit":{"description":"Requests allowed in the current window.","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Requests left in the current window.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the current window resets.","schema":{"type":"integer"}},"RateLimit-Policy":{"description":"The limit and window length in seconds, for example 30;w=3600.","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SailingList"}}}},"400":{"description":"A parameter is unknown or outside its allowed format or range.","headers":{"RateLimit-Limit":{"description":"Requests allowed in the current window.","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Requests left in the current window.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the current window resets.","schema":{"type":"integer"}},"RateLimit-Policy":{"description":"The limit and window length in seconds, for example 30;w=3600.","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"The hourly request limit has been reached.","headers":{"RateLimit-Limit":{"description":"Requests allowed in the current window.","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Requests left in the current window.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the current window resets.","schema":{"type":"integer"}},"RateLimit-Policy":{"description":"The limit and window length in seconds, for example 30;w=3600.","schema":{"type":"string"}},"Retry-After":{"description":"Seconds to wait before trying again.","schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"Cruise data could not load.","headers":{"RateLimit-Limit":{"description":"Requests allowed in the current window.","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Requests left in the current window.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the current window resets.","schema":{"type":"integer"}},"RateLimit-Policy":{"description":"The limit and window length in seconds, for example 30;w=3600.","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"503":{"description":"The API is temporarily unavailable.","headers":{"RateLimit-Limit":{"description":"Requests allowed in the current window.","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Requests left in the current window.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the current window resets.","schema":{"type":"integer"}},"RateLimit-Policy":{"description":"The limit and window length in seconds, for example 30;w=3600.","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/cruises/{id}":{"get":{"operationId":"getCruise","summary":"Get one sailing with its fares and day-by-day ports","parameters":[{"name":"id","in":"path","required":true,"description":"The sailing ID from a search result. It matches the sailing page URL.","schema":{"type":"integer","minimum":1},"example":123}],"responses":{"200":{"description":"One sailing.","headers":{"RateLimit-Limit":{"description":"Requests allowed in the current window.","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Requests left in the current window.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the current window resets.","schema":{"type":"integer"}},"RateLimit-Policy":{"description":"The limit and window length in seconds, for example 30;w=3600.","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SailingResponse"}}}},"400":{"description":"A parameter is unknown or outside its allowed format or range.","headers":{"RateLimit-Limit":{"description":"Requests allowed in the current window.","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Requests left in the current window.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the current window resets.","schema":{"type":"integer"}},"RateLimit-Policy":{"description":"The limit and window length in seconds, for example 30;w=3600.","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"No sailing has this ID.","headers":{"RateLimit-Limit":{"description":"Requests allowed in the current window.","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Requests left in the current window.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the current window resets.","schema":{"type":"integer"}},"RateLimit-Policy":{"description":"The limit and window length in seconds, for example 30;w=3600.","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"The hourly request limit has been reached.","headers":{"RateLimit-Limit":{"description":"Requests allowed in the current window.","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Requests left in the current window.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the current window resets.","schema":{"type":"integer"}},"RateLimit-Policy":{"description":"The limit and window length in seconds, for example 30;w=3600.","schema":{"type":"string"}},"Retry-After":{"description":"Seconds to wait before trying again.","schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"Cruise data could not load.","headers":{"RateLimit-Limit":{"description":"Requests allowed in the current window.","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Requests left in the current window.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the current window resets.","schema":{"type":"integer"}},"RateLimit-Policy":{"description":"The limit and window length in seconds, for example 30;w=3600.","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"503":{"description":"The API is temporarily unavailable.","headers":{"RateLimit-Limit":{"description":"Requests allowed in the current window.","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Requests left in the current window.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the current window resets.","schema":{"type":"integer"}},"RateLimit-Policy":{"description":"The limit and window length in seconds, for example 30;w=3600.","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}}},"components":{"schemas":{"Fare":{"type":"object","required":["cabin","name","price","currency","checkedAt"],"properties":{"cabin":{"type":"string","enum":["inside","outside","balcony","suite"]},"name":{"type":["string","null"],"description":"The cruise line's cabin name."},"price":{"type":"number","description":"The recorded fare. The fare basis is not recorded."},"currency":{"type":"string","description":"ISO 4217 currency code.","example":"GBP"},"checkedAt":{"type":["string","null"],"format":"date-time","description":"When the fare was last checked."}}},"Sailing":{"type":"object","required":["id","url","cruiseLine","ship","itinerary","nights","departureDate","returnDate","departurePort","destination","taxesIncluded","fares"],"properties":{"id":{"type":"integer"},"url":{"type":"string","format":"uri","description":"The sailing page on Cruise Price Check, with price history."},"cruiseLine":{"type":"object","required":["id","name"],"properties":{"id":{"type":"string","enum":["celebrity","royal","virgin","ncl","msc"]},"name":{"type":"string"}}},"ship":{"type":["string","null"]},"itinerary":{"type":["string","null"]},"nights":{"type":["integer","null"]},"departureDate":{"type":"string","format":"date"},"returnDate":{"type":"string","format":"date"},"departurePort":{"type":["string","null"]},"destination":{"type":["string","null"]},"taxesIncluded":{"type":["boolean","null"]},"fares":{"type":"array","description":"Cheapest first. Filtered to one category when cabin is set.","items":{"$ref":"#/components/schemas/Fare"}}}},"SailingDetail":{"allOf":[{"$ref":"#/components/schemas/Sailing"},{"type":"object","required":["days"],"properties":{"days":{"type":"array","description":"Ports visited each day. An empty ports list is a day at sea.","items":{"type":"object","required":["day","ports"],"properties":{"day":{"type":"integer"},"ports":{"type":"array","items":{"type":"string"}}}}}}}]},"SailingList":{"type":"object","required":["data","pagination","notice","attribution"],"properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/Sailing"}},"pagination":{"type":"object","required":["page","limit","total","totalPages"],"properties":{"page":{"type":"integer"},"limit":{"type":"integer"},"total":{"type":"integer"},"totalPages":{"type":"integer"}}},"notice":{"type":"string"},"attribution":{"type":"string"}}},"SailingResponse":{"type":"object","required":["data","notice","attribution"],"properties":{"data":{"$ref":"#/components/schemas/SailingDetail"},"notice":{"type":"string"},"attribution":{"type":"string"}}},"Error":{"type":"object","required":["error"],"properties":{"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["invalid_request","not_found","rate_limited","server_error","unavailable"]},"message":{"type":"string"}}}}}}}}