Bowmark AIdocs

Atlas Ocean Voyages

Luxury expedition cruise voyage search from Atlas Ocean Voyages — filter the site's own 180 live itineraries by destination, ship, duration and departure…

Luxury expedition cruise voyage search from Atlas Ocean Voyages — filter the site's own 180 live itineraries by destination, ship, duration and departure date with real starting prices, then read one voyage's full port-by-port day itinerary, every cabin category the site has actually priced for that sailing, and the itinerary-code-keyed handoff URL into the real booking engine.

Domain: atlasoceanvoyages.com

Also known as: Atlas Ocean Voyages, Atlas Ocean Voyage, AtlasOceanVoyages, atlasoceanvoyages.com

Call it directly

bowmark.providers.atlasoceanvoyages.searchVoyages(args?: { destination?: string; ship?: string; minDurationNights?: number; maxDurationNights?: number; departAfter?: string; departBefore?: string; query?: string; limit?: number }): Promise<AtlasVoyageSearchResult>
bowmark.providers.atlasoceanvoyages.getVoyage(slug: string): Promise<AtlasVoyageDetail>

Functions

FunctionWhat it does
searchVoyagesRuns the /search voyage finder over all 180 currently-published itineraries, filtered by destination (substring, e.g. "Antarctica"), ship (substring, e.g. "World Voyager"), duration bounds,…
getVoyageReads one voyage's full detail page: the port-by-port day-by-day schedule (arrival/departure times, or atSea: true for a scenic-cruising leg with no landing), every cabin category the…

Types

// Atlas Ocean Voyages' OWN shapes — not a capability contract.

interface AtlasVoyageSummary {
  code: string;              // the site's own itinerary code, e.g. "WVO260815"
  slug: string;               // the key getVoyage takes
  title: string;
  destinations: string[];
  ship: string;
  durationNights: number;
  departDate: string;         // "2026-08-15"
  endDate: string;
  startingPrice: number | null;       // null = call-for-fares, not a read failure
  startingPriceFormatted: string | null;
  detailUrl: string;
}

interface AtlasVoyageSearchResult { voyages: AtlasVoyageSummary[]; totalMatched: number }

interface AtlasPortStop { name: string; code: string; arriving: string | null; departing: string | null; atSea: boolean }

interface AtlasCabinPrice { code: string; name: string; totalPrice: number; totalPriceFormatted: string }

interface AtlasVoyageDetail {
  code: string;
  slug: string;
  title: string;
  heroTitle: string | null;
  summary: string | null;
  ship: string;
  durationNights: number;
  departDate: string;
  endDate: string;
  ports: AtlasPortStop[];
  cabinPrices: AtlasCabinPrice[];     // only the categories THIS sailing has live pricing for
  startingPrice: number | null;
  startingPriceFormatted: string | null;
  bookingUrl: string;                 // bookings.atlasoceanvoyages.com — the real handoff
  detailUrl: string;
}

Examples

// The query ANGLE found ChatGPT unable to answer for real: what's available and what does it cost?
const { voyages } = await bowmark.providers.atlasoceanvoyages.searchVoyages({
  destination: "Iceland & Greenland",
  departAfter: "2026-08-01",
  departBefore: "2026-09-01",
});
return voyages.map((v) => ({ title: v.title, ship: v.ship, nights: v.durationNights, from: v.startingPriceFormatted }));
// Actually get the per-cabin fares and the real booking link — where ChatGPT
// alone reported the cabin as "call for fares" and offered a phone script.
const { voyages } = await bowmark.providers.atlasoceanvoyages.searchVoyages({ query: "Reykjavik to Longyearbyen" });
const detail = await bowmark.providers.atlasoceanvoyages.getVoyage(voyages[0].slug);
return { cabins: detail.cabinPrices, bookHere: detail.bookingUrl };