Bowmark AIdocs

Othership

Othership's real, live class schedule and seat availability across its Toronto and NYC sauna/ice-bath/breathwork studios — the same data its Mariana Tek…

Othership's real, live class schedule and seat availability across its Toronto and NYC sauna/ice-bath/breathwork studios — the same data its Mariana Tek booking widget shows, read directly rather than through a JS embed nothing outside a real browser can render.

Domain: othership.us

Also known as: Othership, othership, othership.us

Call it directly

bowmark.providers.othership.getLocations(): Promise<OthershipLocation[]>
bowmark.providers.othership.getClassSchedule(locationId: string, startDate: string, endDate: string): Promise<OthershipClassSchedule>

Functions

FunctionWhat it does
getLocationsReturns every Othership studio location (Toronto's Adelaide and Yorkville, NYC's Flatiron and Williamsburg) with its site id, city, address and timezone.
getClassScheduleSearches one Othership location's real, live class schedule between two YYYY-MM-DD dates — sauna, ice bath and breathwork sessions with instructor names, duration, tags and the actual seats…

Types

// Othership's OWN shapes — not a capability contract.

interface OthershipLocation {
  id: string;              // the key getClassSchedule's locationId takes
  name: string;             // e.g. "Adelaide", "Flatiron", "Williamsburg"
  city: string;
  stateProvince: string;
  formattedAddress: string;
  timezone: string;
  currencyCode: string;
  regionName: string | null; // e.g. "Toronto", "NYC"
}

interface OthershipClass {
  id: string;
  name: string;              // e.g. "Guided Up: Arctic Tundra - 60 min"
  description: string;
  durationMinutes: number;
  classroomName: string;
  instructorNames: string[];
  tags: string[];             // e.g. ["Guided", "Sun Pass"]
  startDateTime: string;      // ISO 8601 with the location's own UTC offset
  bookingStartDateTime: string;
  availableSpotCount: number; // real, live — 0 means fully booked, not "not offered"
  capacity: number;
  spotCountIsPublic: boolean;
  isCancelled: boolean;
}

interface OthershipClassSchedule {
  classes: OthershipClass[];
  totalCount: number;   // may exceed classes.length if the range was too broad — see warnings
  scheduleUrl: string;   // hand the visitor here to finish booking
  warnings: string[];
}

Examples

// What sauna and ice bath classes are open at Othership in Toronto this week, and how many spots are left?
const locations = await bowmark.providers.othership.getLocations();
const adelaide = locations.find((l) => l.name === "Adelaide");
const schedule = await bowmark.providers.othership.getClassSchedule(adelaide.id, "2026-09-01", "2026-09-07");
return schedule.classes
  .filter((c) => !c.isCancelled && c.availableSpotCount > 0)
  .map((c) => ({ name: c.name, when: c.startDateTime, spotsLeft: c.availableSpotCount, bookAt: schedule.scheduleUrl }));