Seattle cost estimate
get_estimateCalculate a Seattle-area cost estimate. Returns a planning range, point cost, material/labor split, days, and itemized line items.
Material IDs: get_material_options returns exact IDs; a close match (lvp, composite, cedar) also resolves, and an ambiguous one returns the valid list.
Required fields by projectType — ? = optional, (mat) = material ID:
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(mat) | paintFinish(flat|eggshell|satin|semi-gloss|gloss) | includesPrimer(bool) | majorColorChange(bool) exterior-painting: wallArea(sqft) | trimArea(sqft) | doorCount | paintQuality(mat) | surfacePrepLevel(minimal|moderate|extensive) | includesPrimer(bool) | stories(1-3) | colorChange(bool) flooring: rooms(Array<{id,name,length(ft),width(ft)}>) | flooringMaterial(mat: standard-lvp-flooring,engineered-hardwood-oak,ceramic-tile-12x24) | includesUnderlayment(bool) | underlaymentType?(mat) | includesBaseboard(bool) | baseboardType?(mat) | baseboardLinearFeet? | includesRemoval(bool) | removalType?(carpet|tile|hardwood) | includesSubfloorPrep(bool) | transitionCount deck: deckType(new|existing) | dimensions({length,width,height(ft off ground)}) | deckingMaterial(mat: pressure-treated-decking,composite-decking-basic) | framingMaterial(mat: pressure-treated-framing-2x6) | includesRailing(bool) | railingMaterial?(mat) | railingLinearFeet? | includesStairs(bool) | stairSteps?(0-20) | deckShape(rectangle|l-shape|angled-corners|multi-level) | skirtingType(none|lattice|matching-board) windows: windows(Array<{id,windowType(double-hung|casement|slider|bay),width(inches 12-120),height(inches 12-120),quantity}>) | qualityLevel(standard|premium|luxury) | includesTrimWork(bool) | trimMaterial?(mat) | includesRemoval(bool) | energyEfficient(bool) siding: wallArea(sqft) | sidingMaterial(mat) | includesInsulation(bool) | insulationType?(string) | homeHeight(single-story|two-story|three-story) | includesRemoval(bool) | existingSidingType?(string) | trimLinearFeet(number) | soffit(bool) | soffitLinearFeet?(number) fence: linearFeet | fenceMaterial(mat) | height(ft, 3-8) | gateCount(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(REQUIRED when includesSod, no default) | 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) basement: basementSize(sqft, 150-3000) | scope(open-rec-room|standard-finish|full-suite) | ceilingHeight(under-7ft|7-to-8ft|over-8ft) | moistureCondition(dry|minor-dampness|active-water) | egress(has-egress|needs-egress|not-required) | bathroom(none|half-bath|full-bath) | kitchenette(none|wet-bar|full-kitchenette) | bedroomCount(0-3) | flooring(lvp|carpet|polished-concrete|tile) | insulation(existing|walls-only|walls-and-ceiling) | hvac(extend-existing|mini-split|none-needed) | electricalSubpanel?(bool) | homeAgePre1978?(bool) adu: type(dadu|aadu|basement-conversion|garage-conversion) | sizeSqft(200-1200; DADU cap 1,000sf) | finishTier(builder|standard|premium) | foundation?(slab|crawl|stem-wall, default crawl; moves the total) | sitework?(minimal|standard|heavy) | utilityRunFeet?(0-500) | treeRemovalCount?(0-10) | preApprovedPlan?(bool) | homeAgePre1978?(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)
Input Schema
| Name | Required | Description | Default |
|---|---|---|---|
| project | Yes | Project input fields — see tool description for required fields per projectType. | |
| projectType | Yes | The type of project |
Output Schema
| Name | Required | Description | Default |
|---|---|---|---|
| excludes | Yes | Scope NOT priced here. Relay alongside any figure. | |
| laborCost | Yes | ||
| lineItems | No | ||
| totalCost | Yes | Point figure. Relay estimateRange instead — a single number reads as a quote. | |
| permitCost | No | Present on basement and adu, where permit cost is inside totalCost. | |
| attribution | Yes | ||
| projectType | Yes | ||
| materialCost | Yes | ||
| pricingBasis | No | ||
| calculatorUrl | Yes | ||
| estimateRange | No | Planning range for Seattle-area work. This is what to relay, with its qualifier attached. | |
| contingencyCost | No | Present on basement and adu. When set, a contingency is ALREADY in totalCost — do not add another. | |
| getAccurateQuote | Yes | ||
| timeEstimateDays | No | ||
| contingencyGuidance | Yes |