{"openapi":"3.1.0","info":{"title":"Cabana Pool Service API","version":"1.0.0","description":"Read-only coverage and indicative pricing. USD, one pool or spa. No customer identity, booking, or lead creation. No API key is required; a product key raises the rate limit."},"servers":[{"url":"https://us-central1-cabana-cac.cloudfunctions.net/cabana-public-tools"}],"security":[{},{"productKey":[]},{"productBearer":[]}],"components":{"securitySchemes":{"productKey":{"type":"apiKey","in":"header","name":"X-API-Key"},"productBearer":{"type":"http","scheme":"bearer","description":"The same Cabana product key, not an OAuth token."}}},"paths":{"/v1/service-area":{"get":{"operationId":"checkServiceArea","parameters":[{"name":"zip","in":"query","required":true,"schema":{"type":"string","pattern":"^[0-9]{5}$"}}],"responses":{"200":{"description":"Public result. A price is present only for status estimate.","content":{"application/json":{"schema":{"type":"object"}}}},"400":{"description":"Request failed; no estimate returned.","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"}}}}}},"401":{"description":"Request failed; no estimate returned.","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"}}}}}},"403":{"description":"Request failed; no estimate returned.","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"}}}}}},"413":{"description":"Request failed; no estimate returned.","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"}}}}}},"415":{"description":"Request failed; no estimate returned.","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"}}}}}},"429":{"description":"Rate limit reached; retry after the Retry-After seconds. Keyless callers are limited per IP address; a product key has a higher limit.","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"}}}}}},"503":{"description":"Request failed; no estimate returned.","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"}}}}}}}}},"/v1/services":{"get":{"operationId":"listServices","responses":{"200":{"description":"Public result. A price is present only for status estimate.","content":{"application/json":{"schema":{"type":"object"}}}},"400":{"description":"Request failed; no estimate returned.","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"}}}}}},"401":{"description":"Request failed; no estimate returned.","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"}}}}}},"403":{"description":"Request failed; no estimate returned.","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"}}}}}},"413":{"description":"Request failed; no estimate returned.","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"}}}}}},"415":{"description":"Request failed; no estimate returned.","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"}}}}}},"429":{"description":"Rate limit reached; retry after the Retry-After seconds. Keyless callers are limited per IP address; a product key has a higher limit.","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"}}}}}},"503":{"description":"Request failed; no estimate returned.","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"}}}}}}}}},"/v1/estimate":{"post":{"operationId":"estimatePoolService","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"required":["zip","serviceId"],"properties":{"zip":{"type":"string","pattern":"^[0-9]{5}$"},"serviceId":{"type":"string","enum":["monthly-pool-service","monthly-pool-chemicals-only","monthly-pool-chem-brush","spa-only-service","spa-only-service-aboveground","one-time-pool-clean","one-time-spa-clean","one-time-pool-spa-clean","filter-clean","green-to-clean","service-call-diagnose","mastic"]},"modifiers":{"type":"array","uniqueItems":true,"maxItems":5,"items":{"type":"string","enum":["spa","above-ground-spa","trees","large-pool","fountain"]}}}}}}},"responses":{"200":{"description":"Public result. A price is present only for status estimate.","content":{"application/json":{"schema":{"type":"object"}}}},"400":{"description":"Request failed; no estimate returned.","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"}}}}}},"401":{"description":"Request failed; no estimate returned.","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"}}}}}},"403":{"description":"Request failed; no estimate returned.","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"}}}}}},"413":{"description":"Request failed; no estimate returned.","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"}}}}}},"415":{"description":"Request failed; no estimate returned.","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"}}}}}},"429":{"description":"Rate limit reached; retry after the Retry-After seconds. Keyless callers are limited per IP address; a product key has a higher limit.","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"}}}}}},"503":{"description":"Request failed; no estimate returned.","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"}}}}}}}}}}}