Bowmark AIdocs

CBH Homes

CBH Homes' own live home-search endpoint (city, price, beds, baths) plus the site's own 'get in touch about a home' inquiry form — reads the real field…

CBH Homes' own live home-search endpoint (city, price, beds, baths) plus the site's own 'get in touch about a home' inquiry form — reads the real field schema and assembles a validated, ready-to-submit inquiry for one listing. Never submits it.

Domain: cbhhomes.com

Also known as: CBH Homes, cbhhomes.com

Call it directly

bowmark.providers.cbhhomes.searchListings(args: SearchListingsArgs): Promise<CbhListing[]>
bowmark.providers.cbhhomes.getInquiryFormSchema(args: GetInquiryFormSchemaArgs): Promise<CbhInquiryFormSchema>
bowmark.providers.cbhhomes.assembleInquiry(args: AssembleInquiryArgs): Promise<AssembledInquiry>

Functions

FunctionWhat it does
searchListingsEvery home matching a city/price/beds/baths filter, straight off CBH Homes' own home-search endpoint — address, price, floor plan, community, amenities and days on market.
getInquiryFormSchemaThe site's own live 'get in touch about a home' form: every visible field (type, required-ness, real enumerated City of Interest / Price Range options).
assembleInquiryValidates a caller's inquiry against the form's live schema and maps it onto the site's own field names, pre-filling a supplied listing's own hidden bookkeeping — ready to submit.

Types

interface CbhListing {
  id: number;
  mls: number;
  url: string;
  image: string | null;
  status: string;
  isSold: boolean;
  isReserved: boolean;
  address: string;
  city: string;
  filterCity: string;
  county: string | null;
  state: string;
  postalCode: string;
  latitude: number | null;
  longitude: number | null;
  floorPlanId: string | null;
  floorPlanName: string | null;
  communityId: string | null;
  communityName: string | null;
  beds: number | null;
  baths: number | null;
  garageCapacity: number | null;
  sqft: number | null;
  price: number;
  priceMonthly: number | null;
  amenities: string[];
  salesCenter: string | null;
  schoolDistrict: string | null;
  daysOnMarket: number | null;
}

interface SearchListingsArgs {
  city?: string; // the site's own filter-city band, e.g. "Meridian (North)"
  bedrooms?: number;
  bathrooms?: number;
  priceMin?: number;
  priceMax?: number;
  sqftMin?: number;
  sqftMax?: number;
  moveInReady?: boolean;
  count?: number; // default 50
  page?: number;
}

interface CbhFormFieldOption {
  value: string;
  label: string;
}

interface CbhFormField {
  name: string;
  label: string;
  type: "text" | "email" | "tel" | "checkbox" | "select" | "textarea";
  required: boolean;
  options?: CbhFormFieldOption[];
}

interface CbhInquiryFormSchema {
  entryUrl: string;
  fields: CbhFormField[];
}

interface GetInquiryFormSchemaArgs {
  pageUrl?: string; // a listing's own url from searchListings, or omit for the homepage form
}

interface AssembleInquiryArgs {
  pageUrl?: string; // a listing's own url from searchListings pre-fills the form's hidden bookkeeping for that home; omit for a general inquiry
  firstName: string;
  lastName: string;
  email: string;
  phone: string;
  cityOfInterest: string; // must be one of getInquiryFormSchema's own options
  priceRange: string; // must be one of getInquiryFormSchema's own options
  message?: string;
  street?: string;
  city?: string;
  state?: string;
  zip?: string;
  howClose?: string;
  textOptIn?: boolean;
}

interface AssembledInquiry {
  valid: boolean;
  errors: string[];
  entryUrl: string;
  formFields: Record<string, string>;
  summary: string;
}

Examples

const listings = await bowmark.providers.cbhhomes.searchListings({
  city: "Meridian (North)",
  bedrooms: 3,
  bathrooms: 2,
  priceMax: 500_000,
});
return listings.map((l) => ({ address: l.address, price: l.price, url: l.url }));
const schema = await bowmark.providers.cbhhomes.getInquiryFormSchema({});
const cityField = schema.fields.find((f) => f.label === "City of Interest");
return cityField?.options?.map((o) => o.value);