{"openapi":"3.0.0","paths":{"/public/v1/account":{"get":{"operationId":"PublicApiController_account","parameters":[],"responses":{"200":{"description":""}},"security":[{"pooldial-api-key":[]}],"tags":["PoolDial Public API v1"]}},"/public/v1/customers":{"get":{"operationId":"PublicApiController_listCustomers","parameters":[{"name":"limit","required":false,"in":"query","schema":{"minimum":1,"maximum":100,"default":50,"type":"number"}}],"responses":{"200":{"description":""}},"security":[{"pooldial-api-key":[]}],"tags":["PoolDial Public API v1"]},"post":{"operationId":"PublicApiController_createCustomer","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicCreateCustomerDto"}}}},"responses":{"201":{"description":""}},"security":[{"pooldial-api-key":[]}],"tags":["PoolDial Public API v1"]}},"/public/v1/customers/{id}":{"get":{"operationId":"PublicApiController_getCustomer","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"security":[{"pooldial-api-key":[]}],"tags":["PoolDial Public API v1"]},"patch":{"operationId":"PublicApiController_updateCustomer","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicUpdateCustomerDto"}}}},"responses":{"200":{"description":""}},"security":[{"pooldial-api-key":[]}],"tags":["PoolDial Public API v1"]}},"/public/v1/customers/{id}/contacts":{"post":{"operationId":"PublicApiController_createCustomerContact","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicCreateCustomerContactDto"}}}},"responses":{"201":{"description":""}},"security":[{"pooldial-api-key":[]}],"tags":["PoolDial Public API v1"]}},"/public/v1/customers/{id}/contacts/{contactId}":{"patch":{"operationId":"PublicApiController_updateCustomerContact","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}},{"name":"contactId","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicUpdateCustomerContactDto"}}}},"responses":{"200":{"description":""}},"security":[{"pooldial-api-key":[]}],"tags":["PoolDial Public API v1"]}},"/public/v1/properties":{"get":{"operationId":"PublicApiController_listProperties","parameters":[{"name":"limit","required":false,"in":"query","schema":{"minimum":1,"maximum":100,"default":50,"type":"number"}},{"name":"cursor","required":false,"in":"query","schema":{"type":"string"}},{"name":"search","required":false,"in":"query","schema":{"type":"string"}},{"name":"status","required":false,"in":"query","schema":{"type":"string"}},{"name":"customerId","required":false,"in":"query","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"security":[{"pooldial-api-key":[]}],"tags":["PoolDial Public API v1"]},"post":{"operationId":"PublicApiController_createProperty","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicCreatePropertyDto"}}}},"responses":{"201":{"description":""}},"security":[{"pooldial-api-key":[]}],"tags":["PoolDial Public API v1"]}},"/public/v1/properties/{id}":{"get":{"operationId":"PublicApiController_getProperty","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"security":[{"pooldial-api-key":[]}],"tags":["PoolDial Public API v1"]},"patch":{"operationId":"PublicApiController_updateProperty","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicUpdatePropertyDto"}}}},"responses":{"200":{"description":""}},"security":[{"pooldial-api-key":[]}],"tags":["PoolDial Public API v1"]}},"/public/v1/properties/{propertyId}/bodies-of-water":{"get":{"operationId":"PublicApiController_listBodiesOfWater","parameters":[{"name":"propertyId","required":true,"in":"path","schema":{"type":"string"}},{"name":"limit","required":false,"in":"query","schema":{"minimum":1,"maximum":100,"default":50,"type":"number"}},{"name":"cursor","required":false,"in":"query","schema":{"type":"string"}},{"name":"search","required":false,"in":"query","schema":{"type":"string"}},{"name":"status","required":false,"in":"query","schema":{"type":"string"}},{"name":"customerId","required":false,"in":"query","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"security":[{"pooldial-api-key":[]}],"tags":["PoolDial Public API v1"]},"post":{"operationId":"PublicApiController_createBodyOfWater","parameters":[{"name":"propertyId","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicCreateBodyOfWaterDto"}}}},"responses":{"201":{"description":""}},"security":[{"pooldial-api-key":[]}],"tags":["PoolDial Public API v1"]}},"/public/v1/properties/{propertyId}/bodies-of-water/{bodyId}":{"patch":{"operationId":"PublicApiController_updateBodyOfWater","parameters":[{"name":"propertyId","required":true,"in":"path","schema":{"type":"string"}},{"name":"bodyId","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicUpdateBodyOfWaterDto"}}}},"responses":{"200":{"description":""}},"security":[{"pooldial-api-key":[]}],"tags":["PoolDial Public API v1"]}},"/public/v1/bodies-of-water/{bodyId}/equipment":{"get":{"operationId":"PublicApiController_listEquipment","parameters":[{"name":"bodyId","required":true,"in":"path","schema":{"type":"string"}},{"name":"limit","required":false,"in":"query","schema":{"minimum":1,"maximum":100,"default":50,"type":"number"}},{"name":"cursor","required":false,"in":"query","schema":{"type":"string"}},{"name":"search","required":false,"in":"query","schema":{"type":"string"}},{"name":"status","required":false,"in":"query","schema":{"type":"string"}},{"name":"customerId","required":false,"in":"query","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"security":[{"pooldial-api-key":[]}],"tags":["PoolDial Public API v1"]},"post":{"operationId":"PublicApiController_createEquipment","parameters":[{"name":"bodyId","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicCreateEquipmentDto"}}}},"responses":{"201":{"description":""}},"security":[{"pooldial-api-key":[]}],"tags":["PoolDial Public API v1"]}},"/public/v1/bodies-of-water/{bodyId}/equipment/{equipmentId}":{"patch":{"operationId":"PublicApiController_updateEquipment","parameters":[{"name":"bodyId","required":true,"in":"path","schema":{"type":"string"}},{"name":"equipmentId","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicUpdateEquipmentDto"}}}},"responses":{"200":{"description":""}},"security":[{"pooldial-api-key":[]}],"tags":["PoolDial Public API v1"]}},"/public/v1/technicians":{"get":{"operationId":"PublicApiController_listTechnicians","parameters":[{"name":"limit","required":false,"in":"query","schema":{"minimum":1,"maximum":100,"default":50,"type":"number"}},{"name":"cursor","required":false,"in":"query","schema":{"type":"string"}},{"name":"search","required":false,"in":"query","schema":{"type":"string"}},{"name":"status","required":false,"in":"query","schema":{"type":"string"}},{"name":"customerId","required":false,"in":"query","schema":{"type":"string"}},{"name":"includeInactive","required":false,"in":"query","schema":{"type":"boolean"}}],"responses":{"200":{"description":""}},"security":[{"pooldial-api-key":[]}],"tags":["PoolDial Public API v1"]}},"/public/v1/technicians/{id}":{"get":{"operationId":"PublicApiController_getTechnician","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"security":[{"pooldial-api-key":[]}],"tags":["PoolDial Public API v1"]}},"/public/v1/routes":{"get":{"operationId":"PublicApiController_listRoutes","parameters":[],"responses":{"200":{"description":""}},"security":[{"pooldial-api-key":[]}],"tags":["PoolDial Public API v1"]}},"/public/v1/routes/{id}":{"get":{"operationId":"PublicApiController_getRoute","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}},{"name":"date","required":false,"in":"query","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"security":[{"pooldial-api-key":[]}],"tags":["PoolDial Public API v1"]}},"/public/v1/routes/{routeId}/stops":{"post":{"operationId":"PublicApiController_createRouteStop","parameters":[{"name":"routeId","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicCreateRouteStopDto"}}}},"responses":{"201":{"description":""}},"security":[{"pooldial-api-key":[]}],"tags":["PoolDial Public API v1"]}},"/public/v1/routes/{routeId}/stops/{stopId}":{"patch":{"operationId":"PublicApiController_updateRouteStop","parameters":[{"name":"routeId","required":true,"in":"path","schema":{"type":"string"}},{"name":"stopId","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicUpdateRouteStopDto"}}}},"responses":{"200":{"description":""}},"security":[{"pooldial-api-key":[]}],"tags":["PoolDial Public API v1"]},"delete":{"operationId":"PublicApiController_removeRouteStop","parameters":[{"name":"routeId","required":true,"in":"path","schema":{"type":"string"}},{"name":"stopId","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"204":{"description":""}},"security":[{"pooldial-api-key":[]}],"tags":["PoolDial Public API v1"]}},"/public/v1/routes/{routeId}/stops/{stopId}/move":{"post":{"operationId":"PublicApiController_moveRouteStop","parameters":[{"name":"routeId","required":true,"in":"path","schema":{"type":"string"}},{"name":"stopId","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicMoveRouteStopDto"}}}},"responses":{"201":{"description":""}},"security":[{"pooldial-api-key":[]}],"tags":["PoolDial Public API v1"]}},"/public/v1/routes/{routeId}/stops/{stopId}/move-occurrence":{"post":{"operationId":"PublicApiController_moveRouteStopOccurrence","parameters":[{"name":"routeId","required":true,"in":"path","schema":{"type":"string"}},{"name":"stopId","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicMoveStopOccurrenceDto"}}}},"responses":{"201":{"description":""}},"security":[{"pooldial-api-key":[]}],"tags":["PoolDial Public API v1"]}},"/public/v1/service-logs":{"get":{"operationId":"PublicApiController_listServiceLogs","parameters":[],"responses":{"200":{"description":""}},"security":[{"pooldial-api-key":[]}],"tags":["PoolDial Public API v1"]},"post":{"operationId":"PublicApiController_createServiceLog","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicCreateServiceLogDto"}}}},"responses":{"201":{"description":""}},"security":[{"pooldial-api-key":[]}],"tags":["PoolDial Public API v1"]}},"/public/v1/service-logs/{id}":{"get":{"operationId":"PublicApiController_getServiceLog","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"security":[{"pooldial-api-key":[]}],"tags":["PoolDial Public API v1"]},"patch":{"operationId":"PublicApiController_updateServiceLog","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicUpdateServiceLogDto"}}}},"responses":{"200":{"description":""}},"security":[{"pooldial-api-key":[]}],"tags":["PoolDial Public API v1"]}},"/public/v1/service-logs/{id}/reading":{"post":{"operationId":"PublicApiController_createChemicalReading","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicChemicalReadingDto"}}}},"responses":{"201":{"description":""}},"security":[{"pooldial-api-key":[]}],"tags":["PoolDial Public API v1"]},"patch":{"operationId":"PublicApiController_updateChemicalReading","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicUpdateChemicalReadingDto"}}}},"responses":{"200":{"description":""}},"security":[{"pooldial-api-key":[]}],"tags":["PoolDial Public API v1"]}},"/public/v1/work-orders":{"get":{"operationId":"PublicApiController_listWorkOrders","parameters":[{"name":"limit","required":false,"in":"query","schema":{"minimum":1,"maximum":100,"default":50,"type":"number"}},{"name":"cursor","required":false,"in":"query","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"security":[{"pooldial-api-key":[]}],"tags":["PoolDial Public API v1"]},"post":{"operationId":"PublicApiController_createWorkOrder","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicCreateWorkOrderDto"}}}},"responses":{"201":{"description":""}},"security":[{"pooldial-api-key":[]}],"tags":["PoolDial Public API v1"]}},"/public/v1/work-orders/{id}":{"get":{"operationId":"PublicApiController_getWorkOrder","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"security":[{"pooldial-api-key":[]}],"tags":["PoolDial Public API v1"]},"patch":{"operationId":"PublicApiController_updateWorkOrder","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicUpdateWorkOrderDto"}}}},"responses":{"200":{"description":""}},"security":[{"pooldial-api-key":[]}],"tags":["PoolDial Public API v1"]}},"/public/v1/items-needed":{"get":{"operationId":"PublicApiController_listItems","parameters":[{"name":"limit","required":false,"in":"query","schema":{"minimum":1,"maximum":100,"default":50,"type":"number"}},{"name":"cursor","required":false,"in":"query","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"security":[{"pooldial-api-key":[]}],"tags":["PoolDial Public API v1"]},"post":{"operationId":"PublicApiController_createItem","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicCreateItemDto"}}}},"responses":{"201":{"description":""}},"security":[{"pooldial-api-key":[]}],"tags":["PoolDial Public API v1"]}},"/public/v1/items-needed/{id}":{"get":{"operationId":"PublicApiController_getItem","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"security":[{"pooldial-api-key":[]}],"tags":["PoolDial Public API v1"]},"patch":{"operationId":"PublicApiController_updateItem","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicUpdateItemDto"}}}},"responses":{"200":{"description":""}},"security":[{"pooldial-api-key":[]}],"tags":["PoolDial Public API v1"]}},"/public/v1/items-needed/{id}/install":{"post":{"operationId":"PublicApiController_installItem","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicMarkInstalledDto"}}}},"responses":{"201":{"description":""}},"security":[{"pooldial-api-key":[]}],"tags":["PoolDial Public API v1"]}},"/public/v1/items-needed/{id}/cancel":{"post":{"operationId":"PublicApiController_cancelItem","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"201":{"description":""}},"security":[{"pooldial-api-key":[]}],"tags":["PoolDial Public API v1"]}},"/public/v1/services":{"get":{"operationId":"PublicApiController_listServices","parameters":[{"name":"limit","required":false,"in":"query","schema":{"minimum":1,"maximum":100,"default":50,"type":"number"}},{"name":"cursor","required":false,"in":"query","schema":{"type":"string"}},{"name":"search","required":false,"in":"query","schema":{"type":"string"}},{"name":"status","required":false,"in":"query","schema":{"type":"string"}},{"name":"customerId","required":false,"in":"query","schema":{"type":"string"}},{"name":"includeInactive","required":false,"in":"query","schema":{"type":"boolean"}}],"responses":{"200":{"description":""}},"security":[{"pooldial-api-key":[]}],"tags":["PoolDial Public API v1"]}},"/public/v1/services/{id}":{"get":{"operationId":"PublicApiController_getService","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"security":[{"pooldial-api-key":[]}],"tags":["PoolDial Public API v1"]}},"/public/v1/invoices":{"get":{"operationId":"PublicApiController_listInvoices","parameters":[{"name":"limit","required":false,"in":"query","schema":{"minimum":1,"maximum":100,"default":50,"type":"number"}},{"name":"cursor","required":false,"in":"query","schema":{"type":"string"}},{"name":"search","required":false,"in":"query","schema":{"type":"string"}},{"name":"status","required":false,"in":"query","schema":{"type":"string"}},{"name":"customerId","required":false,"in":"query","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"security":[{"pooldial-api-key":[]}],"tags":["PoolDial Public API v1"]}},"/public/v1/invoices/{id}":{"get":{"operationId":"PublicApiController_getInvoice","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"security":[{"pooldial-api-key":[]}],"tags":["PoolDial Public API v1"]}},"/public/v1/invoices/{id}/payments":{"get":{"operationId":"PublicApiController_listInvoicePayments","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}},{"name":"limit","required":false,"in":"query","schema":{"minimum":1,"maximum":100,"default":50,"type":"number"}},{"name":"cursor","required":false,"in":"query","schema":{"type":"string"}},{"name":"search","required":false,"in":"query","schema":{"type":"string"}},{"name":"status","required":false,"in":"query","schema":{"type":"string"}},{"name":"customerId","required":false,"in":"query","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"security":[{"pooldial-api-key":[]}],"tags":["PoolDial Public API v1"]}},"/public/v1/quotes":{"get":{"operationId":"PublicApiController_listQuotes","parameters":[{"name":"limit","required":false,"in":"query","schema":{"minimum":1,"maximum":100,"default":50,"type":"number"}},{"name":"cursor","required":false,"in":"query","schema":{"type":"string"}},{"name":"search","required":false,"in":"query","schema":{"type":"string"}},{"name":"status","required":false,"in":"query","schema":{"type":"string"}},{"name":"customerId","required":false,"in":"query","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"security":[{"pooldial-api-key":[]}],"tags":["PoolDial Public API v1"]}},"/public/v1/quotes/{id}":{"get":{"operationId":"PublicApiController_getQuote","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"security":[{"pooldial-api-key":[]}],"tags":["PoolDial Public API v1"]}},"/public/v1/projects":{"get":{"operationId":"PublicApiController_listProjects","parameters":[{"name":"limit","required":false,"in":"query","schema":{"minimum":1,"maximum":100,"default":50,"type":"number"}},{"name":"cursor","required":false,"in":"query","schema":{"type":"string"}},{"name":"search","required":false,"in":"query","schema":{"type":"string"}},{"name":"status","required":false,"in":"query","schema":{"type":"string"}},{"name":"customerId","required":false,"in":"query","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"security":[{"pooldial-api-key":[]}],"tags":["PoolDial Public API v1"]}},"/public/v1/projects/{id}":{"get":{"operationId":"PublicApiController_getProject","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"security":[{"pooldial-api-key":[]}],"tags":["PoolDial Public API v1"]}}},"info":{"title":"PoolDial Public API","description":"Build server-side integrations with PoolDial customers, field operations, service records, and billing data.","version":"1.0","contact":{}},"tags":[],"servers":[],"components":{"securitySchemes":{"pooldial-api-key":{"scheme":"bearer","bearerFormat":"PoolDial API key","type":"http","description":"Use a key beginning with pd_live_."}},"schemas":{"PublicCreateCustomerDto":{"type":"object","properties":{}},"PublicUpdateCustomerDto":{"type":"object","properties":{}},"PublicCreateCustomerContactDto":{"type":"object","properties":{"firstName":{"type":"string"},"lastName":{"type":"string"},"role":{"type":"string","enum":["owner","property_manager","hoa","spouse","tenant","billing","emergency"]},"phone":{"type":"string"},"phoneLabel":{"type":"string"},"email":{"type":"string","format":"email"},"sendInvoices":{"type":"boolean"},"receivesServiceLogs":{"type":"boolean"},"isPrimary":{"type":"boolean"},"notes":{"type":"string"}}},"PublicUpdateCustomerContactDto":{"type":"object","properties":{"firstName":{"type":"string"},"lastName":{"type":"string"},"role":{"type":"string","enum":["owner","property_manager","hoa","spouse","tenant","billing","emergency"]},"phone":{"type":"string"},"phoneLabel":{"type":"string"},"email":{"type":"string","format":"email"},"sendInvoices":{"type":"boolean"},"receivesServiceLogs":{"type":"boolean"},"isPrimary":{"type":"boolean"},"notes":{"type":"string"}}},"PublicCreatePropertyDto":{"type":"object","properties":{}},"PublicUpdatePropertyDto":{"type":"object","properties":{}},"PublicCreateBodyOfWaterDto":{"type":"object","properties":{"name":{"type":"string"},"type":{"type":"string","enum":["pool","spa","fountain","pond","vanishing_edge","waterfall"]},"volumeGallons":{"type":"number","minimum":0},"surfaceType":{"type":"string","enum":["plaster","pebble","tile","vinyl","fiberglass"]},"sanitationType":{"type":"string","enum":["chlorine","salt","mineral","ozone"]},"installDate":{"type":"string"},"lastRenovation":{"type":"string"},"serviceFrequency":{"type":"string","enum":["weekly","biweekly","monthly"]},"notes":{"type":"string"}}},"PublicUpdateBodyOfWaterDto":{"type":"object","properties":{}},"PublicCreateEquipmentDto":{"type":"object","properties":{"category":{"type":"string","enum":["pump","booster_pump","filter","heater","cleaner","chlorinator","automation","light","valve"]},"manufacturer":{"type":"string"},"model":{"type":"string"},"serialNumber":{"type":"string"},"installDate":{"type":"string"},"warrantyExpires":{"type":"string"},"lastServiceDate":{"type":"string"},"status":{"type":"string","enum":["operational","needs_service","needs_replacement","replaced"]},"notes":{"type":"string"}},"required":["category"]},"PublicUpdateEquipmentDto":{"type":"object","properties":{}},"PublicCreateRouteStopDto":{"type":"object","properties":{"customerId":{"type":"string"},"propertyId":{"type":"string"},"sequence":{"type":"number","minimum":1},"estimatedDuration":{"type":"number","minimum":5},"notes":{"type":"string"},"isOneTime":{"type":"boolean"},"oneTimeDate":{"type":"string"},"serviceType":{"type":"string","enum":["recurring","repair","one_time"]}}},"PublicUpdateRouteStopDto":{"type":"object","properties":{"status":{"type":"string"}}},"PublicMoveRouteStopDto":{"type":"object","properties":{}},"PublicMoveStopOccurrenceDto":{"type":"object","properties":{"targetRouteId":{"type":"string"},"sourceDate":{"type":"string"},"targetDate":{"type":"string"},"targetSequence":{"type":"number","minimum":1}},"required":["targetRouteId","sourceDate","targetDate"]},"PublicCreateServiceLogDto":{"type":"object","properties":{}},"PublicUpdateServiceLogDto":{"type":"object","properties":{}},"PublicChemicalReadingDto":{"type":"object","properties":{"bodyOfWaterId":{"type":"string"},"chlorine":{"type":"number"},"combinedChlorine":{"type":"number"},"bromine":{"type":"number"},"ph":{"type":"number"},"alkalinity":{"type":"number"},"calciumHardness":{"type":"number"},"cyanuricAcid":{"type":"number"},"salt":{"type":"number"},"waterTemp":{"type":"number"},"phosphates":{"type":"number"},"tds":{"type":"number"},"psi":{"type":"number"},"customReadings":{"type":"object","additionalProperties":{"type":"number"}},"chemicalsAdded":{"type":"object","additionalProperties":{"type":"number"}}}},"PublicUpdateChemicalReadingDto":{"type":"object","properties":{}},"PublicCreateWorkOrderDto":{"type":"object","properties":{}},"PublicUpdateWorkOrderDto":{"type":"object","properties":{"completedAt":{"type":"string"}}},"PublicCreateItemDto":{"type":"object","properties":{}},"PublicUpdateItemDto":{"type":"object","properties":{}},"PublicMarkInstalledDto":{"type":"object","properties":{"quantity":{"type":"number","minimum":1},"unitPrice":{"type":"number","minimum":0},"notes":{"type":"string"}}}}}}