Calculate a Seattle-area cost estimate. Returns total, material, labor costs, days, and itemized line items.
Material IDs: use get_material_options to get exact IDs, or pass a close match (e.g. "lvp", "composite", "cedar") and the server will resolve it. If ambiguous, the error message lists valid options.
Required fields by projectType:
interior-painting: rooms (Array<{id,name,length(ft),width(ft),height(6-30),paintCeiling(bool),paintTrim(bool),doorCount,windowCount,surfaceCondition("new-drywall"|"good-condition"|"poor-condition"),trimComplexity("baseboards-only"|"simple-trim"|"complex-trim"),wallTexture("smooth"|"light-texture"|"heavy-texture"),roomEmpty(bool)}>) | paintQuality (material ID) | paintFinish ("flat"|"eggshell"|"satin"|"semi-gloss"|"gloss") | includesPrimer (bool) | majorColorChange (bool)
exterior-painting: wallArea(sqft) | trimArea(sqft) | doorCount | paintQuality (material ID) | surfacePrepLevel ("minimal"|"moderate"|"extensive") | includesPrimer (bool) | stories (1-3) | colorChange (bool)
flooring: rooms (Array<{id,name,length(ft),width(ft)}>) | flooringMaterial (material ID, e.g. "vinyl-plank-lvp","solid-hardwood","ceramic-tile") | includesUnderlayment (bool) | underlaymentType? (material ID) | includesBaseboard (bool) | baseboardType? (material ID) | baseboardLinearFeet? | includesRemoval (bool) | removalType? ("carpet"|"tile"|"hardwood") | includesSubfloorPrep (bool) | transitionCount
deck: deckType ("new"|"existing") | dimensions ({length,width,height(ft above ground)}) | deckingMaterial (material ID, e.g. "pressure-treated-decking","composite-decking-basic") | framingMaterial (material ID, e.g. "pressure-treated-framing-2x6") | includesRailing (bool) | railingMaterial? (material ID) | railingLinearFeet? | includesStairs (bool) | stairSteps? (0-20) | deckShape ("rectangle"|"l-shape"|"angled-corners"|"multi-level") | skirtingType ("none"|"lattice"|"matching-board")
windows: windows (Array<{id,windowType(e.g."double-hung","casement","slider","bay"),width(inches 12-120),height(inches 12-120),quantity}>) | qualityLevel ("standard"|"premium"|"luxury") | includesTrimWork (bool) | trimMaterial? (material ID) | includesRemoval (bool) | energyEfficient (bool)
siding: wallArea(sqft) | sidingMaterial (material ID) | includesInsulation (bool) | insulationType? (string) | homeHeight ("single-story"|"two-story"|"three-story") | includesRemoval (bool) | existingSidingType? (string) | trimLinearFeet (number) | soffit (bool) | soffitLinearFeet? (number)
fence: linearFeet | fenceMaterial (material ID) | height (ft, 3-8) | gateCount (number 0-10) | gateWidth? (ft) | style? (e.g. "privacy","picket") | includesRemoval (bool) | terrain ("flat"|"sloped"|"mixed") | concreteFootings (bool)
landscaping: yardArea(sqft, 100–50000) | includesIrrigation(bool) | irrigationType?(string) | irrigationZones?(1–20) | includesSod(bool) | sodSquareFeet?(defaults to yardArea) | includesMulch(bool) | mulchSquareFeet?(defaults to yardArea) | includesSitePrep(bool) | plants?(Array<{id,plantType,quantity,size("small"|"medium"|"large")}>) | hardscapeFeatures?(Array<{id,featureType,squareFeet,material}>)
kitchen: kitchenSize(sqft, 40-600) | scope("cosmetic"|"standard"|"full-gut") | cabinets("keep"|"reface"|"prefab"|"semi-custom"|"custom") | countertop("keep"|"laminate"|"butcher-block"|"quartz"|"granite"|"marble") | appliances("keep"|"budget"|"mid-range"|"premium") | flooring("keep"|"lvp"|"tile"|"hardwood") | backsplash?(bool) | plumbingRelocation?(bool) | electricalUpgrade?(bool) | island?(bool) | lighting?(bool)
bathroom: bathroomType("half-bath"|"full-bath"|"primary-bath"|"accessible") | bathroomSize(sqft, 20-300) | scope("cosmetic"|"standard"|"full-gut") | showerTub("keep"|"tub-to-shower"|"walk-in-shower"|"tub-replacement"|"freestanding-tub") | vanity("keep"|"budget"|"mid-range"|"premium") | tileWork("none"|"floor-only"|"floor-and-shower"|"full-tile") | heatedFloors?(bool) | newLighting?(bool) | ventilation?(bool) | plumbingRelocation?(bool)
ada: projectScope("single-room"|"whole-home"|"bathroom-specific") | modifications({grabBars?,walkInShower?,widerDoorways?,ramp?,nonSlipFlooring?,leverHandles?,raisedToilet?,rollUnderSink?,accessibleCounters?,stairLift?} all bool) | currentCondition("minor"|"moderate"|"major") | homeStories?(1-3) | doorwayCount?(0-20) | rampLengthFeet?(0-60) | flooringSquareFeet?(0-5000)