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
| Function | What it does |
|---|---|
searchListings | Every 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. |
getInquiryFormSchema | The 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). |
assembleInquiry | Validates 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);