{"openapi":"3.1.0","info":{"title":"ProEstimate homeowner agent API","version":"1.0","description":"Homeowner-authorized preliminary exterior estimates. Only the homeowner can approve the initial terms by email."},"servers":[{"url":"https://proestimate.prodevgroup.com/api/agent/v1"}],"security":[{"agentBearer":[]}],"components":{"securitySchemes":{"agentBearer":{"type":"http","scheme":"bearer"}},"schemas":{"SignupInput":{"type":"object","properties":{"homeownerEmail":{"type":"string","maxLength":254,"format":"email","pattern":"^(?:[A-Za-z0-9_'+\\-]+\\.)*[A-Za-z0-9_'+\\-]*[A-Za-z0-9_+-]@(?:[A-Za-z0-9][A-Za-z0-9\\-]*\\.)+[A-Za-z]{2,}$"},"agentName":{"type":"string","minLength":1,"maxLength":80,"pattern":"^[\\p{L}\\p{N}][\\p{L}\\p{N}\\p{M} _'’()&-]*$"},"token":{"type":"string","pattern":"^pe_agent_[A-Za-z0-9_-]{43}$"}},"required":["homeownerEmail","agentName"],"additionalProperties":false},"Status":{"type":"object","properties":{"agentId":{"type":"string","format":"uuid"},"status":{"enum":["pending","active","revoked"]},"emailDelivery":{"enum":["sending","sent","failed"]},"termsVersion":{"type":"string"}},"required":["agentId","status","emailDelivery","termsVersion"]},"QuoteInput":{"type":"object","properties":{"address":{"type":"string","minLength":1,"maxLength":500},"name":{"type":"string","minLength":1,"maxLength":160},"measurements":{"minItems":1,"maxItems":250,"type":"array","items":{"anyOf":[{"type":"object","properties":{"name":{"type":"string","minLength":1,"maxLength":160},"source":{"type":"string","minLength":1,"maxLength":400},"kind":{"type":"string","const":"manual"},"unit":{"type":"string","const":"sqft"},"quantity":{"type":"number","exclusiveMinimum":0,"maximum":2500000},"stories":{"anyOf":[{"type":"number","const":1},{"type":"number","const":2},{"type":"number","const":3}]},"pitch":{"description":"Rise in inches per 12 inches of horizontal run. Defaults to 6.","type":"number","minimum":0,"maximum":24},"trade":{"type":"string","const":"roof"}},"required":["unit","quantity","trade"],"additionalProperties":false,"description":"Actual sloped roof surface square feet before waste."},{"type":"object","properties":{"name":{"type":"string","minLength":1,"maxLength":160},"source":{"type":"string","minLength":1,"maxLength":400},"kind":{"type":"string","const":"manual"},"unit":{"type":"string","const":"sqft"},"quantity":{"type":"number","exclusiveMinimum":0,"maximum":2500000},"stories":{"anyOf":[{"type":"number","const":1},{"type":"number","const":2},{"type":"number","const":3}]},"trade":{"type":"string","const":"siding"}},"required":["unit","quantity","trade"],"additionalProperties":false,"description":"Net siding square feet after openings and before waste."},{"type":"object","properties":{"name":{"type":"string","minLength":1,"maxLength":160},"source":{"type":"string","minLength":1,"maxLength":400},"kind":{"type":"string","const":"manual"},"unit":{"type":"string","const":"sqft"},"quantity":{"type":"number","exclusiveMinimum":0,"maximum":2500000},"trade":{"type":"string","enum":["concrete","deck","pergola"]}},"required":["unit","quantity","trade"],"additionalProperties":false},{"type":"object","properties":{"name":{"type":"string","minLength":1,"maxLength":160},"source":{"type":"string","minLength":1,"maxLength":400},"stories":{"anyOf":[{"type":"number","const":1},{"type":"number","const":2},{"type":"number","const":3}]},"trade":{"type":"string","const":"gutters"},"kind":{"type":"string","const":"manual"},"unit":{"type":"string","const":"lf"},"quantity":{"type":"number","exclusiveMinimum":0,"maximum":2500000},"gutterComponent":{"type":"string","enum":["run","downspout"]}},"required":["trade","unit","quantity"],"additionalProperties":false,"description":"Measured linear feet. Component defaults to run."},{"type":"object","properties":{"name":{"type":"string","minLength":1,"maxLength":160},"source":{"type":"string","minLength":1,"maxLength":400},"stories":{"anyOf":[{"type":"number","const":1},{"type":"number","const":2},{"type":"number","const":3}]},"trade":{"type":"string","const":"gutters"},"gutterComponent":{"type":"string","const":"downspout"},"count":{"type":"integer","minimum":1,"maximum":500},"heightFt":{"description":"Total vertical feet. When omitted or zero, uses 10 feet per story.","type":"number","minimum":0,"maximum":100}},"required":["trade","gutterComponent","count"],"additionalProperties":false,"description":"Count of drops of the same height and story; includes two feet for offsets per drop."},{"type":"object","properties":{"name":{"type":"string","minLength":1,"maxLength":160},"source":{"type":"string","minLength":1,"maxLength":400},"stories":{"anyOf":[{"type":"number","const":1},{"type":"number","const":2},{"type":"number","const":3}]},"pitch":{"description":"Rise in inches per 12 inches of horizontal run. Defaults to 6.","type":"number","minimum":0,"maximum":24},"trade":{"type":"string","const":"roof"},"kind":{"type":"string","const":"polygon"},"points":{"minItems":3,"maxItems":500,"type":"array","items":{"type":"object","properties":{"lat":{"type":"number","exclusiveMinimum":-85,"exclusiveMaximum":85},"lng":{"type":"number","minimum":-180,"maximum":180}},"required":["lat","lng"],"additionalProperties":false}}},"required":["trade","kind","points"],"additionalProperties":false},{"type":"object","properties":{"name":{"type":"string","minLength":1,"maxLength":160},"source":{"type":"string","minLength":1,"maxLength":400},"trade":{"type":"string","enum":["concrete","deck","pergola"]},"kind":{"type":"string","const":"polygon"},"points":{"minItems":3,"maxItems":500,"type":"array","items":{"type":"object","properties":{"lat":{"type":"number","exclusiveMinimum":-85,"exclusiveMaximum":85},"lng":{"type":"number","minimum":-180,"maximum":180}},"required":["lat","lng"],"additionalProperties":false}}},"required":["trade","kind","points"],"additionalProperties":false},{"type":"object","properties":{"name":{"type":"string","minLength":1,"maxLength":160},"source":{"type":"string","minLength":1,"maxLength":400},"stories":{"anyOf":[{"type":"number","const":1},{"type":"number","const":2},{"type":"number","const":3}]},"trade":{"type":"string","const":"siding"},"kind":{"type":"string","const":"line"},"points":{"minItems":2,"maxItems":500,"type":"array","items":{"type":"object","properties":{"lat":{"type":"number","exclusiveMinimum":-85,"exclusiveMaximum":85},"lng":{"type":"number","minimum":-180,"maximum":180}},"required":["lat","lng"],"additionalProperties":false}},"heightFt":{"description":"Total vertical feet. When omitted or zero, uses 10 feet per story.","type":"number","minimum":0,"maximum":100},"openingsSqft":{"type":"number","minimum":0,"maximum":2500000}},"required":["trade","kind","points"],"additionalProperties":false},{"type":"object","properties":{"name":{"type":"string","minLength":1,"maxLength":160},"source":{"type":"string","minLength":1,"maxLength":400},"stories":{"anyOf":[{"type":"number","const":1},{"type":"number","const":2},{"type":"number","const":3}]},"trade":{"type":"string","const":"gutters"},"kind":{"type":"string","const":"line"},"points":{"minItems":2,"maxItems":500,"type":"array","items":{"type":"object","properties":{"lat":{"type":"number","exclusiveMinimum":-85,"exclusiveMaximum":85},"lng":{"type":"number","minimum":-180,"maximum":180}},"required":["lat","lng"],"additionalProperties":false}},"gutterComponent":{"type":"string","const":"run"}},"required":["trade","kind","points"],"additionalProperties":false},{"type":"object","properties":{"name":{"type":"string","minLength":1,"maxLength":160},"source":{"type":"string","minLength":1,"maxLength":400},"stories":{"anyOf":[{"type":"number","const":1},{"type":"number","const":2},{"type":"number","const":3}]},"trade":{"type":"string","const":"gutters"},"kind":{"type":"string","const":"point"},"points":{"minItems":1,"maxItems":1,"type":"array","items":{"type":"object","properties":{"lat":{"type":"number","exclusiveMinimum":-85,"exclusiveMaximum":85},"lng":{"type":"number","minimum":-180,"maximum":180}},"required":["lat","lng"],"additionalProperties":false}},"gutterComponent":{"type":"string","const":"downspout"},"heightFt":{"description":"Total vertical feet. When omitted or zero, uses 10 feet per story.","type":"number","minimum":0,"maximum":100}},"required":["trade","kind","points"],"additionalProperties":false}]}},"measurementWarnings":{"maxItems":100,"type":"array","items":{"type":"string","minLength":1,"maxLength":1000}},"options":{"type":"object","properties":{"roof":{"type":"object","properties":{"material":{"type":"string","minLength":1,"maxLength":100},"wastePercent":{"type":"number","minimum":0,"maximum":50},"removal":{"type":"boolean"}},"additionalProperties":false},"siding":{"type":"object","properties":{"material":{"type":"string","minLength":1,"maxLength":100},"wastePercent":{"type":"number","minimum":0,"maximum":50},"removal":{"type":"boolean"}},"additionalProperties":false},"pergola":{"type":"object","properties":{"material":{"type":"string","minLength":1,"maxLength":100},"wastePercent":{"type":"number","minimum":0,"maximum":50},"removal":{"type":"boolean"}},"additionalProperties":false},"gutters":{"type":"object","properties":{"material":{"type":"string","minLength":1,"maxLength":100},"wastePercent":{"type":"number","minimum":0,"maximum":50},"removal":{"type":"boolean"},"leafGuard":{"type":"boolean"}},"additionalProperties":false},"concrete":{"type":"object","properties":{"material":{"type":"string","minLength":1,"maxLength":100},"wastePercent":{"type":"number","minimum":0,"maximum":50},"removal":{"type":"boolean"},"thicknessIn":{"type":"number","minimum":4,"maximum":24}},"additionalProperties":false},"deck":{"type":"object","properties":{"material":{"type":"string","minLength":1,"maxLength":100},"wastePercent":{"type":"number","minimum":0,"maximum":50},"removal":{"type":"boolean"},"deckHeightFt":{"type":"number","minimum":0,"maximum":30},"railingLf":{"type":"number","minimum":0,"maximum":10000},"stairCount":{"type":"integer","minimum":0,"maximum":100}},"additionalProperties":false}},"additionalProperties":false}},"required":["measurements"],"additionalProperties":false},"RevisionInput":{"type":"object","properties":{"address":{"type":"string","minLength":1,"maxLength":500},"name":{"type":"string","minLength":1,"maxLength":160},"measurements":{"minItems":1,"maxItems":250,"type":"array","items":{"anyOf":[{"type":"object","properties":{"name":{"type":"string","minLength":1,"maxLength":160},"source":{"type":"string","minLength":1,"maxLength":400},"kind":{"type":"string","const":"manual"},"unit":{"type":"string","const":"sqft"},"quantity":{"type":"number","exclusiveMinimum":0,"maximum":2500000},"stories":{"anyOf":[{"type":"number","const":1},{"type":"number","const":2},{"type":"number","const":3}]},"pitch":{"description":"Rise in inches per 12 inches of horizontal run. Defaults to 6.","type":"number","minimum":0,"maximum":24},"trade":{"type":"string","const":"roof"}},"required":["unit","quantity","trade"],"additionalProperties":false,"description":"Actual sloped roof surface square feet before waste."},{"type":"object","properties":{"name":{"type":"string","minLength":1,"maxLength":160},"source":{"type":"string","minLength":1,"maxLength":400},"kind":{"type":"string","const":"manual"},"unit":{"type":"string","const":"sqft"},"quantity":{"type":"number","exclusiveMinimum":0,"maximum":2500000},"stories":{"anyOf":[{"type":"number","const":1},{"type":"number","const":2},{"type":"number","const":3}]},"trade":{"type":"string","const":"siding"}},"required":["unit","quantity","trade"],"additionalProperties":false,"description":"Net siding square feet after openings and before waste."},{"type":"object","properties":{"name":{"type":"string","minLength":1,"maxLength":160},"source":{"type":"string","minLength":1,"maxLength":400},"kind":{"type":"string","const":"manual"},"unit":{"type":"string","const":"sqft"},"quantity":{"type":"number","exclusiveMinimum":0,"maximum":2500000},"trade":{"type":"string","enum":["concrete","deck","pergola"]}},"required":["unit","quantity","trade"],"additionalProperties":false},{"type":"object","properties":{"name":{"type":"string","minLength":1,"maxLength":160},"source":{"type":"string","minLength":1,"maxLength":400},"stories":{"anyOf":[{"type":"number","const":1},{"type":"number","const":2},{"type":"number","const":3}]},"trade":{"type":"string","const":"gutters"},"kind":{"type":"string","const":"manual"},"unit":{"type":"string","const":"lf"},"quantity":{"type":"number","exclusiveMinimum":0,"maximum":2500000},"gutterComponent":{"type":"string","enum":["run","downspout"]}},"required":["trade","unit","quantity"],"additionalProperties":false,"description":"Measured linear feet. Component defaults to run."},{"type":"object","properties":{"name":{"type":"string","minLength":1,"maxLength":160},"source":{"type":"string","minLength":1,"maxLength":400},"stories":{"anyOf":[{"type":"number","const":1},{"type":"number","const":2},{"type":"number","const":3}]},"trade":{"type":"string","const":"gutters"},"gutterComponent":{"type":"string","const":"downspout"},"count":{"type":"integer","minimum":1,"maximum":500},"heightFt":{"description":"Total vertical feet. When omitted or zero, uses 10 feet per story.","type":"number","minimum":0,"maximum":100}},"required":["trade","gutterComponent","count"],"additionalProperties":false,"description":"Count of drops of the same height and story; includes two feet for offsets per drop."},{"type":"object","properties":{"name":{"type":"string","minLength":1,"maxLength":160},"source":{"type":"string","minLength":1,"maxLength":400},"stories":{"anyOf":[{"type":"number","const":1},{"type":"number","const":2},{"type":"number","const":3}]},"pitch":{"description":"Rise in inches per 12 inches of horizontal run. Defaults to 6.","type":"number","minimum":0,"maximum":24},"trade":{"type":"string","const":"roof"},"kind":{"type":"string","const":"polygon"},"points":{"minItems":3,"maxItems":500,"type":"array","items":{"type":"object","properties":{"lat":{"type":"number","exclusiveMinimum":-85,"exclusiveMaximum":85},"lng":{"type":"number","minimum":-180,"maximum":180}},"required":["lat","lng"],"additionalProperties":false}}},"required":["trade","kind","points"],"additionalProperties":false},{"type":"object","properties":{"name":{"type":"string","minLength":1,"maxLength":160},"source":{"type":"string","minLength":1,"maxLength":400},"trade":{"type":"string","enum":["concrete","deck","pergola"]},"kind":{"type":"string","const":"polygon"},"points":{"minItems":3,"maxItems":500,"type":"array","items":{"type":"object","properties":{"lat":{"type":"number","exclusiveMinimum":-85,"exclusiveMaximum":85},"lng":{"type":"number","minimum":-180,"maximum":180}},"required":["lat","lng"],"additionalProperties":false}}},"required":["trade","kind","points"],"additionalProperties":false},{"type":"object","properties":{"name":{"type":"string","minLength":1,"maxLength":160},"source":{"type":"string","minLength":1,"maxLength":400},"stories":{"anyOf":[{"type":"number","const":1},{"type":"number","const":2},{"type":"number","const":3}]},"trade":{"type":"string","const":"siding"},"kind":{"type":"string","const":"line"},"points":{"minItems":2,"maxItems":500,"type":"array","items":{"type":"object","properties":{"lat":{"type":"number","exclusiveMinimum":-85,"exclusiveMaximum":85},"lng":{"type":"number","minimum":-180,"maximum":180}},"required":["lat","lng"],"additionalProperties":false}},"heightFt":{"description":"Total vertical feet. When omitted or zero, uses 10 feet per story.","type":"number","minimum":0,"maximum":100},"openingsSqft":{"type":"number","minimum":0,"maximum":2500000}},"required":["trade","kind","points"],"additionalProperties":false},{"type":"object","properties":{"name":{"type":"string","minLength":1,"maxLength":160},"source":{"type":"string","minLength":1,"maxLength":400},"stories":{"anyOf":[{"type":"number","const":1},{"type":"number","const":2},{"type":"number","const":3}]},"trade":{"type":"string","const":"gutters"},"kind":{"type":"string","const":"line"},"points":{"minItems":2,"maxItems":500,"type":"array","items":{"type":"object","properties":{"lat":{"type":"number","exclusiveMinimum":-85,"exclusiveMaximum":85},"lng":{"type":"number","minimum":-180,"maximum":180}},"required":["lat","lng"],"additionalProperties":false}},"gutterComponent":{"type":"string","const":"run"}},"required":["trade","kind","points"],"additionalProperties":false},{"type":"object","properties":{"name":{"type":"string","minLength":1,"maxLength":160},"source":{"type":"string","minLength":1,"maxLength":400},"stories":{"anyOf":[{"type":"number","const":1},{"type":"number","const":2},{"type":"number","const":3}]},"trade":{"type":"string","const":"gutters"},"kind":{"type":"string","const":"point"},"points":{"minItems":1,"maxItems":1,"type":"array","items":{"type":"object","properties":{"lat":{"type":"number","exclusiveMinimum":-85,"exclusiveMaximum":85},"lng":{"type":"number","minimum":-180,"maximum":180}},"required":["lat","lng"],"additionalProperties":false}},"gutterComponent":{"type":"string","const":"downspout"},"heightFt":{"description":"Total vertical feet. When omitted or zero, uses 10 feet per story.","type":"number","minimum":0,"maximum":100}},"required":["trade","kind","points"],"additionalProperties":false}]}},"measurementWarnings":{"maxItems":100,"type":"array","items":{"type":"string","minLength":1,"maxLength":1000}},"options":{"type":"object","properties":{"roof":{"type":"object","properties":{"material":{"type":"string","minLength":1,"maxLength":100},"wastePercent":{"type":"number","minimum":0,"maximum":50},"removal":{"type":"boolean"}},"additionalProperties":false},"siding":{"type":"object","properties":{"material":{"type":"string","minLength":1,"maxLength":100},"wastePercent":{"type":"number","minimum":0,"maximum":50},"removal":{"type":"boolean"}},"additionalProperties":false},"pergola":{"type":"object","properties":{"material":{"type":"string","minLength":1,"maxLength":100},"wastePercent":{"type":"number","minimum":0,"maximum":50},"removal":{"type":"boolean"}},"additionalProperties":false},"gutters":{"type":"object","properties":{"material":{"type":"string","minLength":1,"maxLength":100},"wastePercent":{"type":"number","minimum":0,"maximum":50},"removal":{"type":"boolean"},"leafGuard":{"type":"boolean"}},"additionalProperties":false},"concrete":{"type":"object","properties":{"material":{"type":"string","minLength":1,"maxLength":100},"wastePercent":{"type":"number","minimum":0,"maximum":50},"removal":{"type":"boolean"},"thicknessIn":{"type":"number","minimum":4,"maximum":24}},"additionalProperties":false},"deck":{"type":"object","properties":{"material":{"type":"string","minLength":1,"maxLength":100},"wastePercent":{"type":"number","minimum":0,"maximum":50},"removal":{"type":"boolean"},"deckHeightFt":{"type":"number","minimum":0,"maximum":30},"railingLf":{"type":"number","minimum":0,"maximum":10000},"stairCount":{"type":"integer","minimum":0,"maximum":100}},"additionalProperties":false}},"additionalProperties":false},"baseRevision":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991}},"required":["measurements","baseRevision"],"additionalProperties":false},"Quote":{"type":"object","required":["id","revision","input","estimate","pricing","assumptions","disclaimer"],"properties":{"id":{"type":"string","format":"uuid"},"revision":{"type":"integer"},"createdAt":{"type":"string","format":"date-time"},"input":{"$ref":"#/components/schemas/QuoteInput"},"estimate":{"type":"object","properties":{"total":{"type":"number"},"low":{"type":"number"},"high":{"type":"number"},"warnings":{"type":"array","items":{"type":"string"}},"items":{"type":"array","items":{"type":"object","additionalProperties":true}},"byTrade":{"type":"object","additionalProperties":true}}},"pricing":{"type":"object","properties":{"currency":{"const":"USD"},"name":{"type":"string"},"starterRates":{"type":"boolean"}}},"assumptions":{"type":"array","items":{"type":"string"}},"disclaimer":{"type":"string"}}}}},"paths":{"/terms":{"get":{"operationId":"readTerms","summary":"Read the current homeowner terms","security":[],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"default":{"description":"JSON error. A pending or revoked bearer receives 403 on quote operations. Rate-limited requests may be retried after Retry-After.","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}}}}},"/signup":{"post":{"operationId":"requestAccess","summary":"Register and email the homeowner. You can mint your bearer before signup.","security":[{},{"agentBearer":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SignupInput"}}}},"responses":{"200":{"description":"Matching existing registration for a client-supplied bearer.","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"201":{"description":"Pending registration and bearer token; save it privately.","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"default":{"description":"JSON error. A pending or revoked bearer receives 403 on quote operations. Rate-limited requests may be retried after Retry-After.","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}}}}},"/status":{"get":{"operationId":"getStatus","summary":"Poll using your existing bearer","responses":{"200":{"description":"Current authorization status","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Status"}}}},"default":{"description":"JSON error. A pending or revoked bearer receives 403 on quote operations. Rate-limited requests may be retried after Retry-After.","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}}}}},"/resend":{"post":{"operationId":"resendApproval","summary":"Resend a pending approval email after the cooldown","responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"default":{"description":"JSON error. A pending or revoked bearer receives 403 on quote operations. Rate-limited requests may be retried after Retry-After.","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}}}}},"/access":{"delete":{"operationId":"disconnect","summary":"Revoke this agent’s access immediately","responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"default":{"description":"JSON error. A pending or revoked bearer receives 403 on quote operations. Rate-limited requests may be retried after Retry-After.","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}}}}},"/measurements/import":{"post":{"operationId":"previewReport","summary":"Convert a supplied HOVER summary or EagleView report into a quote input for review","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"report":{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{}}},"required":["report"],"additionalProperties":false}}}},"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"default":{"description":"JSON error. A pending or revoked bearer receives 403 on quote operations. Rate-limited requests may be retried after Retry-After.","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}}}}},"/quotes/catalog":{"get":{"operationId":"getCatalog","summary":"Read available trades, installed materials, starter-rate status and defaults","responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"default":{"description":"JSON error. A pending or revoked bearer receives 403 on quote operations. Rate-limited requests may be retried after Retry-After.","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}}}}},"/quotes":{"post":{"operationId":"createQuote","summary":"Save and price supplied measurements","parameters":[{"name":"Idempotency-Key","in":"header","required":false,"description":"Unique key for this write. Preserve it when retrying an identical request.","schema":{"type":"string","pattern":"^[A-Za-z0-9._:-]{1,128}$"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/QuoteInput"},"example":{"name":"Roof and front gutters","measurements":[{"trade":"roof","name":"House roof","quantity":1800,"unit":"sqft","pitch":6,"stories":2},{"trade":"gutters","name":"Front eave","quantity":50,"unit":"lf","stories":2},{"trade":"gutters","name":"Front drops","gutterComponent":"downspout","count":2,"stories":2}]}}}},"responses":{"200":{"description":"Saved estimate revision","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Quote"}}}},"201":{"description":"First quote revision","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Quote"}}}},"default":{"description":"JSON error. A pending or revoked bearer receives 403 on quote operations. Rate-limited requests may be retried after Retry-After.","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}}}},"get":{"operationId":"listQuotes","summary":"List this agent’s quotes","parameters":[{"in":"query","name":"after","schema":{"type":"string","format":"uuid"}},{"in":"query","name":"limit","schema":{"type":"integer","minimum":1,"maximum":100}}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"default":{"description":"JSON error. A pending or revoked bearer receives 403 on quote operations. Rate-limited requests may be retried after Retry-After.","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}}}}},"/quotes/{id}":{"get":{"operationId":"getQuote","summary":"Read the latest saved revision","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","format":"uuid"}}],"responses":{"200":{"description":"Saved estimate revision","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Quote"}}}},"default":{"description":"JSON error. A pending or revoked bearer receives 403 on quote operations. Rate-limited requests may be retried after Retry-After.","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}}}},"put":{"operationId":"reviseQuote","summary":"Submit all revised inputs and baseRevision. Revisions keep the original price book.","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","format":"uuid"}},{"name":"Idempotency-Key","in":"header","required":false,"description":"Unique key for this write. Preserve it when retrying an identical request.","schema":{"type":"string","pattern":"^[A-Za-z0-9._:-]{1,128}$"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RevisionInput"}}}},"responses":{"200":{"description":"Saved estimate revision","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Quote"}}}},"default":{"description":"JSON error. A pending or revoked bearer receives 403 on quote operations. Rate-limited requests may be retried after Retry-After.","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}}}}},"/quotes/{id}/revisions/{revision}":{"get":{"operationId":"getQuoteRevision","summary":"Read a historical revision","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","format":"uuid"}},{"name":"revision","in":"path","required":true,"schema":{"type":"integer","minimum":1}}],"responses":{"200":{"description":"Saved estimate revision","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Quote"}}}},"default":{"description":"JSON error. A pending or revoked bearer receives 403 on quote operations. Rate-limited requests may be retried after Retry-After.","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}}}}},"/quotes/{id}/revisions/{revision}/pdf":{"get":{"operationId":"downloadQuotePdf","summary":"Download the private printable estimate for the homeowner","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","format":"uuid"}},{"name":"revision","in":"path","required":true,"schema":{"type":"integer","minimum":1}}],"responses":{"200":{"description":"Itemized estimate document","content":{"application/pdf":{"schema":{"type":"string","format":"binary"}}}},"default":{"description":"JSON error. A pending or revoked bearer receives 403 on quote operations. Rate-limited requests may be retried after Retry-After.","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}}}}},"/quotes/{id}/revisions/{revision}/custom":{"get":{"operationId":"listCustomEstimates","summary":"Retrieve contractor-approved alternatives for this private quote revision","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","format":"uuid"}},{"name":"revision","in":"path","required":true,"schema":{"type":"integer","minimum":1}}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"default":{"description":"JSON error. A pending or revoked bearer receives 403 on quote operations. Rate-limited requests may be retried after Retry-After.","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}}}}},"/quotes/{id}/revisions/{revision}/custom/{proposalId}/pdf":{"get":{"operationId":"downloadCustomEstimate","summary":"Download a contractor-reviewed custom estimate","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","format":"uuid"}},{"name":"revision","in":"path","required":true,"schema":{"type":"integer","minimum":1}},{"name":"proposalId","in":"path","required":true,"schema":{"type":"string","format":"uuid"}}],"responses":{"200":{"description":"Custom estimate PDF","content":{"application/pdf":{"schema":{"type":"string","format":"binary"}}}},"default":{"description":"JSON error. A pending or revoked bearer receives 403 on quote operations. Rate-limited requests may be retried after Retry-After.","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}}}}}}}