Bowmark AIdocs

Club Champion

Club Champion's live studio directory, its fitters, real per-store fitting pricing, and real open-slot availability on a named fitter's calendar — the…

Club Champion's live studio directory, its fitters, real per-store fitting pricing, and real open-slot availability on a named fitter's calendar — the same booking widget backend the site itself calls. Rung 10, no browser.

Domain: clubchampion.com

Also known as: Club Champion, clubchampion.com, Club Champion Golf

Call it directly

bowmark.providers.clubchampion.listStudios(): Promise<ClubchampionStudio[]>
bowmark.providers.clubchampion.getFittings(storeName: string): Promise<ClubchampionFittingsMenu>
bowmark.providers.clubchampion.listFitters(storeName?: string): Promise<ClubchampionFitter[]>
bowmark.providers.clubchampion.checkAvailability(fitterId: string, start: string, end: string, durationMinutes?: number, fittingType?: string): Promise<ClubchampionAvailability>

Functions

FunctionWhat it does
listStudiosReads the live list of every Club Champion fitting studio (~155 in the US) — real address, lat/lng, timezone, bay count and contact info, the same data the site's own /booknow-access studio…
getFittingsReads one studio's real, live fitting-type menu with per-store pricing (Driver, Full Bag, Putter, etc.) — pass a studio name from listStudios(), e.g. "Bellevue".
listFittersReads the live list of every Club Champion fitter (~396 across the chain) — the person a fitting is booked with, and the only id checkAvailability accepts.
checkAvailabilityChecks real, live open-slot availability on one FITTER's calendar (an id from listFitters()) over a "YYYY-MM-DD"..."YYYY-MM-DD" range — the same live check the site's own booking widget…

Types

interface ClubchampionStudio {
  id: string;
  name: string;
  timezone: string;
  bayCount: number;
  address: string;
  country: string;
  lat: number;
  lng: number;
  phone: string;
  email: string;
}

interface ClubchampionFitting {
  productId: string;
  name: string;
  description: string;
  durationMinutes: number;
  durationLabel: string;
  unitPrice: number;
}

interface ClubchampionFittingsMenu {
  storeId: string;
  storeName: string;
  fittings: ClubchampionFitting[];
  activePromoCode: string | null;
  activePromoTerms: string | null;
}

interface ClubchampionFitter {
  id: string;            // the id checkAvailability takes
  name: string;
  locationId: string;
  locationName: string;  // the studio name listStudios() and getFittings() use
  timezone: string;
  handedness: string[];
  specialties: string[];
  locationBayCount: number;
}

interface ClubchampionSlot {
  start: string;   // ISO instant, e.g. "2026-09-08T10:00:00.000Z"
  end: string;
  status: string;  // the site's own word, e.g. "available"
  resourceId: string;
}

interface ClubchampionAvailability {
  resourceId: string;         // the fitter id, echoed back
  range: { start: string; end: string };
  mode: string;               // the site's own live/cached indicator
  slots: ClubchampionSlot[];  // verbatim — empty is a real answer
}

Examples

// Find a nearby studio, then see its live fitting menu.
const studios = await bowmark.providers.clubchampion.listStudios();
const bellevue = studios.find((s) => s.name === "Bellevue");
const menu = await bowmark.providers.clubchampion.getFittings(bellevue.name);
return { bellevue, menu };
// Check open slots for a Driver fitting at Bellevue over the next fortnight.
const menu = await bowmark.providers.clubchampion.getFittings("Bellevue");
const driver = menu.fittings.find((f) => f.name === "Driver");
const [fitter] = await bowmark.providers.clubchampion.listFitters("Bellevue");
const avail = await bowmark.providers.clubchampion.checkAvailability(
  fitter.id, "2026-09-08", "2026-09-22", driver.durationMinutes, driver.name,
);
return { driver, fitter, slots: avail.slots };