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
| Function | What it does |
|---|---|
listStudios | Reads 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… |
getFittings | Reads 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". |
listFitters | Reads 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. |
checkAvailability | Checks 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 };