Bowmark AIdocs

Caruso Homes

Caruso Homes' own live community and Build-on-Your-Lot floor-plan listings, plus each community's own 'Schedule a Tour' form — reads the real field schema…

Caruso Homes' own live community and Build-on-Your-Lot floor-plan listings, plus each community's own 'Schedule a Tour' form — reads the real field schema and assembles a validated, ready-to-submit tour request. Never submits it.

Domain: carusohomes.com

Also known as: Caruso Homes, carusohomes.com

Call it directly

bowmark.providers.carusohomes.searchCommunities(args: SearchCommunitiesArgs): Promise<CarusoCommunity[]>
bowmark.providers.carusohomes.searchFloorPlans(args: SearchFloorPlansArgs): Promise<CarusoFloorPlan[]>
bowmark.providers.carusohomes.getTourAppointmentSchema(args: GetTourAppointmentSchemaArgs): Promise<CarusoTourAppointmentSchema>
bowmark.providers.carusohomes.assembleTourRequest(args: AssembleTourRequestArgs): Promise<AssembledTourRequest>

Functions

FunctionWhat it does
searchCommunitiesEvery live community on one of Caruso Homes' market listing pages — name, address, geo, image, description and the site's own best-effort starting-price band.
searchFloorPlansEvery floor-plan card on a market's listing — community-attached by default, or Build-on-Your-Lot when buildOnYourLot is true — with price, beds, baths and square footage.
getTourAppointmentSchemaOne community's own live 'Schedule a Tour' form: every visible field (type, required-ness, real enumerated options) plus that community's item_of_interest_id.
assembleTourRequestValidates a caller's tour request against a community's live form schema and maps it onto the site's own field names, ready to submit to /xhr/schedule-appointment/. Never submits it.

Types

interface CarusoCommunity {
  name: string;
  url: string;
  listingId: string | null;
  streetAddress: string | null;
  city: string | null;
  state: string | null;
  postalCode: string | null;
  latitude: number | null;
  longitude: number | null;
  description: string;
  images: string[];
  startingPriceLabel: string | null;
}

interface CarusoFloorPlan {
  name: string;
  url: string;
  listingId: string | null;
  collection: string | null;
  priceLabel: string | null;
  priceValue: number | null;
  beds: number | null;
  baths: number | null;
  sqft: number | null;
  buildOnYourLot: boolean;
}

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

interface CarusoFormField {
  name: string;
  label: string;
  type: "text" | "email" | "tel" | "date" | "checkbox" | "select";
  required: boolean;
  options?: CarusoFormFieldOption[];
}

interface CarusoTourAppointmentSchema {
  entryUrl: string;
  communityName: string;
  itemOfInterestId: string;
  fields: CarusoFormField[];
}

interface SearchCommunitiesArgs {
  market: string; // e.g. "md/maryland", "nc/charlotte" — the path segment carusohomes.com uses under /new-homes/<market>/
}

interface SearchFloorPlansArgs {
  market: string;
  buildOnYourLot?: boolean; // true -> the market's Build-on-Your-Lot listing; false/omitted -> community-attached plans
}

interface GetTourAppointmentSchemaArgs {
  communityUrl: string; // a community URL from searchCommunities, e.g. "https://www.carusohomes.com/new-homes/md/ellicott-city/mill-creek/18641/"
}

interface AssembleTourRequestArgs {
  communityUrl: string;
  firstName: string;
  lastName: string;
  email: string;
  phone?: string;
  desiredPriceRangeMinimum?: string;
  desiredPriceRangeMaximum?: string;
  whenToMove?: string;
  preferredAppointmentDate?: string; // "YYYY-MM-DD"
  message?: string;
  textOptIn?: boolean;
}

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

Examples

const communities = await bowmark.providers.carusohomes.searchCommunities({ market: "md/maryland" });
return communities.map((c) => ({ name: c.name, startingPrice: c.startingPriceLabel, url: c.url }));
const plans = await bowmark.providers.carusohomes.searchFloorPlans({ market: "md/maryland", buildOnYourLot: true });
return plans.filter((p) => (p.priceValue ?? Infinity) < 250_000);