{"openapi":"3.1.0","info":{"title":"Cruizer cruise API","version":"0.1.0","description":"Plain-words cruise search: three ranked, explained picks with all-in prices and tracked booking links. Same engine as the Cruizer web app and MCP server (/mcp). Rate limit: 30 plan requests per minute per IP."},"servers":[{"url":"https://cruizer.ca"}],"paths":{"/api/v1/plan":{"post":{"operationId":"plan_cruise","summary":"Plan a cruise from a plain-words request","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["request"],"properties":{"request":{"type":"string","example":"5 days, beach, me and my girlfriend, no kids, July, under $4k"},"home":{"type":"string","example":"Toronto"}}}}}},"responses":{"200":{"description":"Plan","content":{"application/json":{"schema":{"type":"object","properties":{"plan_id":{"type":"string"},"heard":{"type":"string"},"understood":{"type":"array","items":{"type":"string"}},"picks":{"type":"array","items":{"type":"object","properties":{"rank":{"type":"integer"},"sailing_id":{"type":"string"},"line":{"type":"string"},"ship":{"type":"string"},"itinerary":{"type":"string"},"departure_date":{"type":"string","format":"date"},"nights":{"type":"integer"},"departs_from":{"type":"string"},"ports":{"type":"array","items":{"type":"string"}},"why":{"type":"string"},"fit_pct":{"type":"integer"},"fit_breakdown":{"type":"array","items":{"type":"object","properties":{"label":{"type":"string"},"met":{"type":"number"},"weight":{"type":"number"}}}},"cabin":{"type":"string"},"travelers":{"type":"integer"},"all_in_total":{"type":"integer"},"realistic_total":{"type":"integer"},"inclusions":{"type":"string"},"deal":{"type":"object","properties":{"label":{"type":"string"},"reason":{"type":"string"}}},"new_to_you":{"type":"string","nullable":true},"verified":{"type":"boolean"},"source_url":{"type":"string","nullable":true},"sample_data":{"type":"boolean"},"traveller_note":{"type":"object","nullable":true,"properties":{"summary":{"type":"string"},"source":{"type":"string"},"url":{"type":"string"}}},"detail_url":{"type":"string"},"booking_options_url":{"type":"string"}}}},"more_available":{"type":"integer"},"head_to_head":{"type":"object","nullable":true},"how_we_picked":{"type":"array","items":{"type":"object"}},"sample_data_note":{"type":"string","nullable":true}}}}}},"400":{"description":"Error","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"}}}}}},"429":{"description":"Error","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"}}}}}}}}},"/api/v1/plan/{plan_id}/refine":{"post":{"operationId":"refine_plan","summary":"Refine a plan with a follow-up message","parameters":[{"name":"plan_id","in":"path","required":true,"schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["message"],"properties":{"message":{"type":"string","example":"cheaper"}}}}}},"responses":{"200":{"description":"Updated plan","content":{"application/json":{"schema":{"type":"object","properties":{"plan_id":{"type":"string"},"heard":{"type":"string"},"understood":{"type":"array","items":{"type":"string"}},"picks":{"type":"array","items":{"type":"object","properties":{"rank":{"type":"integer"},"sailing_id":{"type":"string"},"line":{"type":"string"},"ship":{"type":"string"},"itinerary":{"type":"string"},"departure_date":{"type":"string","format":"date"},"nights":{"type":"integer"},"departs_from":{"type":"string"},"ports":{"type":"array","items":{"type":"string"}},"why":{"type":"string"},"fit_pct":{"type":"integer"},"fit_breakdown":{"type":"array","items":{"type":"object","properties":{"label":{"type":"string"},"met":{"type":"number"},"weight":{"type":"number"}}}},"cabin":{"type":"string"},"travelers":{"type":"integer"},"all_in_total":{"type":"integer"},"realistic_total":{"type":"integer"},"inclusions":{"type":"string"},"deal":{"type":"object","properties":{"label":{"type":"string"},"reason":{"type":"string"}}},"new_to_you":{"type":"string","nullable":true},"verified":{"type":"boolean"},"source_url":{"type":"string","nullable":true},"sample_data":{"type":"boolean"},"traveller_note":{"type":"object","nullable":true,"properties":{"summary":{"type":"string"},"source":{"type":"string"},"url":{"type":"string"}}},"detail_url":{"type":"string"},"booking_options_url":{"type":"string"}}}},"more_available":{"type":"integer"},"head_to_head":{"type":"object","nullable":true},"how_we_picked":{"type":"array","items":{"type":"object"}},"sample_data_note":{"type":"string","nullable":true}}}}}},"400":{"description":"Error","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"}}}}}}}}},"/api/v1/sailings/{sailing_id}":{"get":{"operationId":"get_sailing","summary":"Sailing detail","parameters":[{"name":"sailing_id","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"Sailing"},"404":{"description":"Error","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"}}}}}}}}},"/api/v1/sailings/{sailing_id}/booking-options":{"get":{"operationId":"get_booking_options","summary":"Partner booking links sorted by all-in price","parameters":[{"name":"sailing_id","in":"path","required":true,"schema":{"type":"string"}},{"name":"cabin","in":"query","schema":{"type":"string","enum":["inside","ocean","balcony","suite"]}},{"name":"travelers","in":"query","schema":{"type":"integer","default":2}}],"responses":{"200":{"description":"Options"},"404":{"description":"Error","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"}}}}}}}}},"/api/v1/compare":{"get":{"operationId":"compare_lines","summary":"Head-to-head between two cruise lines","parameters":[{"name":"line_a","in":"query","required":true,"schema":{"type":"string"}},{"name":"line_b","in":"query","required":true,"schema":{"type":"string"}},{"name":"request","in":"query","schema":{"type":"string"}}],"responses":{"200":{"description":"Comparison"},"404":{"description":"Error","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"}}}}}}}}},"/api/v1/price-watch":{"post":{"operationId":"watch_price","summary":"Store a price-drop alert request","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["sailing_id","email"],"properties":{"sailing_id":{"type":"string"},"email":{"type":"string","format":"email"}}}}}},"responses":{"200":{"description":"Saved"}}}},"/api/v1/ports":{"get":{"operationId":"search_ports","summary":"Fuzzy port lookup","parameters":[{"name":"q","in":"query","required":true,"schema":{"type":"string","example":"martinez"}}],"responses":{"200":{"description":"Ports"}}}}}}