{"openapi":"3.0.0","paths":{"/token":{"post":{"operationId":"AuthController_issue","summary":"Create a Bearer Token","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/IssueTokenDto"}}}},"responses":{"200":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/IssueTokenResponseDto"}}}}},"tags":["Authentication"]}},"/v1/sites":{"get":{"operationId":"SitesController_findAll","summary":"Get all Sites","parameters":[{"name":"page","required":true,"in":"query","schema":{"type":"number"}},{"name":"perPage","required":true,"in":"query","schema":{"type":"number"}},{"name":"dataType","required":false,"in":"query","description":"Type of site details to be returned (defaults to \"basic\" if no value is provided)","schema":{"example":"basic","enum":["basic","additional"],"type":"string"}},{"name":"name","required":false,"in":"query","schema":{"type":"string"}},{"name":"active","required":false,"in":"query","schema":{"type":"boolean"}},{"name":"companyId","required":false,"in":"query","schema":{"type":"number"}},{"name":"sortDirection","required":false,"in":"query","description":"Sort direction","schema":{"example":"asc","enum":["asc","desc"],"type":"string"}},{"name":"sortBy","required":false,"in":"query","description":"Field to sort by (ignores case)","schema":{"example":"","enum":["siteprocompanyid","projectid","name"],"type":"string"}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/PaginatedResponse"},{"properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/Site"}}}}]}}}},"400":{"description":"Invalid query parameters"},"401":{"description":"Missing, expired, or invalid bearer token"},"429":{"description":"Rate limit exceeded"}},"tags":["Sites"],"security":[{"bearer":[]}]}},"/v1/pumps/logs/load":{"post":{"operationId":"PumpLogsController_load","summary":"Aggregated pump telemetry log summaries over a time range","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PumpLogsLoadDto"}}}},"responses":{"200":{"description":"","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/PumpLogSummaryDto"}}}}},"400":{"description":"Validation failed"},"401":{"description":"Missing, expired, or invalid bearer token"},"403":{"description":"No access to one or more pumps"},"429":{"description":"Rate limit exceeded"}},"tags":["Historical Data Download"],"security":[{"bearer":[]}]}},"/v1/meters/logs/load":{"post":{"operationId":"MeterLogsController_load","summary":"Aggregated meter telemetry log summaries over a time range","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/MeterLogsLoadDto"}}}},"responses":{"200":{"description":"","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/MeterLogSummaryDto"}}}}},"400":{"description":"Validation failed"},"401":{"description":"Missing, expired, or invalid bearer token"},"403":{"description":"No access to one or more meters"},"429":{"description":"Rate limit exceeded"}},"tags":["Historical Data Download"],"security":[{"bearer":[]}]}},"/v1/sensors/logs/load":{"post":{"operationId":"SensorLogsController_load","summary":"Aggregated sensor telemetry log summaries over a time range","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SensorLogsLoadDto"}}}},"responses":{"200":{"description":"","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/SensorLogSummaryDto"}}}}},"400":{"description":"Validation failed"},"401":{"description":"Missing, expired, or invalid bearer token"},"403":{"description":"No access to one or more sensors"},"429":{"description":"Rate limit exceeded"}},"tags":["Historical Data Download"],"security":[{"bearer":[]}]}},"/v1/sensors/logs/raw":{"post":{"operationId":"SensorLogsController_raw","summary":"Raw sensor logs for a single sensor (max 60-day window)","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SensorLogsRawDto"}}}},"responses":{"200":{"description":"","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/SensorRawLogDto"}}}}},"400":{"description":"Validation failed, or date span exceeds 60 days"},"401":{"description":"Missing, expired, or invalid bearer token"},"403":{"description":"No access to this sensor"},"429":{"description":"Rate limit exceeded"}},"tags":["Historical Data Download"],"security":[{"bearer":[]}]}},"/v1/tanks/logs/load":{"post":{"operationId":"TankLogsController_load","summary":"Aggregated tank group telemetry log summaries over a time range","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TankLogsLoadDto"}}}},"responses":{"200":{"description":"","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/TankLogSummaryDto"}}}}},"400":{"description":"Validation failed"},"401":{"description":"Missing, expired, or invalid bearer token"},"403":{"description":"No access to one or more tanks"},"429":{"description":"Rate limit exceeded"}},"tags":["Historical Data Download"],"security":[{"bearer":[]}]}},"/v1/transactions/logs/load":{"post":{"operationId":"TransactionLogsController_load","summary":"Transaction logs for one or more sites in a time range","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TransactionLogsLoadDto"}}}},"responses":{"200":{"description":"","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/TransactionLogDto"}}}}},"400":{"description":"Validation failed"},"401":{"description":"Missing, expired, or invalid bearer token"},"403":{"description":"No access to one or more sites (or cameras when motionCap=true)"},"429":{"description":"Rate limit exceeded"}},"tags":["Transactions, Tickets, and Images"],"security":[{"bearer":[]}]}},"/v1/transactions/change-logs":{"post":{"operationId":"TransactionChangeLogsController_load","summary":"Transaction change logs across sites and ticket numbers","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TransactionChangeLogsLoadDto"}}}},"responses":{"200":{"description":"","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/TransactionChangeLogDto"}}}}},"400":{"description":"Validation failed, or date span exceeds 60 days"},"401":{"description":"Missing, expired, or invalid bearer token"},"403":{"description":"No access to one or more sites"},"429":{"description":"Rate limit exceeded"}},"tags":["Transactions, Tickets, and Images"],"security":[{"bearer":[]}]}},"/v1/images/motion-capture":{"post":{"operationId":"ImagesController_motionCapture","summary":"Bundle motion capture images for the given UUIDs into a zip","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ImagesPayloadDto"}}}},"responses":{"200":{"description":"application/zip stream","content":{"application/json":{"schema":{"type":"string","format":"binary"}}}},"400":{"description":"Validation failed, including malformed image UUIDs"},"401":{"description":"Missing, expired, or invalid bearer token"},"404":{"description":"One or more of the requested image UUIDs are unknown"},"429":{"description":"Rate limit exceeded"},"500":{"description":"One or more of the requested images could not be retrieved"}},"tags":["Transactions, Tickets, and Images"],"security":[{"bearer":[]}]}},"/v1/images/tickets":{"post":{"operationId":"ImagesController_tickets","summary":"Bundle ticket images for the given UUIDs into a zip","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ImagesPayloadDto"}}}},"responses":{"200":{"description":"application/zip stream","content":{"application/json":{"schema":{"type":"string","format":"binary"}}}},"400":{"description":"Validation failed, including malformed image UUIDs"},"401":{"description":"Missing, expired, or invalid bearer token"},"404":{"description":"One or more of the requested image UUIDs are unknown"},"429":{"description":"Rate limit exceeded"},"500":{"description":"One or more of the requested images could not be retrieved"}},"tags":["Transactions, Tickets, and Images"],"security":[{"bearer":[]}]}},"/v1/config/sensors/{sensorId}":{"get":{"operationId":"ConfigController_getSensorRegister","summary":"Get IO register config for a sensor","parameters":[{"name":"sensorId","required":true,"in":"path","description":"SiteSensorID","schema":{"type":"string"}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/RegisterDto"}}}}},"400":{"description":"Validation failed"},"401":{"description":"Missing, expired, or invalid bearer token"},"403":{"description":"Caller lacks permission for the requested site"},"404":{"description":"No sensor with this ID"},"429":{"description":"Rate limit exceeded"}},"tags":["Equipment Configuration"],"security":[{"bearer":[]}]}},"/v1/config/sensors/{sensorId}/light":{"get":{"operationId":"ConfigController_getSensorRegisterLight","summary":"Get IO register config for a sensor (light payload)","parameters":[{"name":"sensorId","required":true,"in":"path","description":"SiteSensorID","schema":{"type":"string"}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/RegisterDto"}}}}},"400":{"description":"Validation failed"},"401":{"description":"Missing, expired, or invalid bearer token"},"403":{"description":"Caller lacks permission for the requested site"},"404":{"description":"No sensor with this ID"},"429":{"description":"Rate limit exceeded"}},"tags":["Equipment Configuration"],"security":[{"bearer":[]}]}},"/v1/config/updates/sensors/{sensorId}":{"get":{"operationId":"ConfigController_getSensorRegisterUpdates","summary":"Get sensor register updates since a start date","parameters":[{"name":"sensorId","required":true,"in":"path","description":"SiteSensorID","schema":{"type":"string"}},{"name":"startDate","required":true,"in":"query","description":"ISO start date","schema":{"type":"string"}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/RegisterDto"}}}}},"400":{"description":"Validation failed"},"401":{"description":"Missing, expired, or invalid bearer token"},"403":{"description":"Caller lacks permission for the requested site"},"404":{"description":"No sensor with this ID"},"429":{"description":"Rate limit exceeded"}},"tags":["Equipment Configuration"],"security":[{"bearer":[]}]}},"/v1/config/updates/sensors/{sensorId}/light":{"get":{"operationId":"ConfigController_getSensorRegisterUpdatesLight","summary":"Get sensor register updates since a start date (light payload)","parameters":[{"name":"sensorId","required":true,"in":"path","description":"SiteSensorID","schema":{"type":"string"}},{"name":"startDate","required":true,"in":"query","description":"ISO start date","schema":{"type":"string"}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/RegisterDto"}}}}},"400":{"description":"Validation failed"},"401":{"description":"Missing, expired, or invalid bearer token"},"403":{"description":"Caller lacks permission for the requested site"},"404":{"description":"No sensor with this ID"},"429":{"description":"Rate limit exceeded"}},"tags":["Equipment Configuration"],"security":[{"bearer":[]}]}},"/v1/config/site/sensors":{"get":{"operationId":"ConfigController_getSensorsForSite","summary":"Get sensor configuration for a site","parameters":[{"name":"siteId","required":true,"in":"query","description":"Site ID","schema":{"type":"string"}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/SensorConfigDto"}}}}},"400":{"description":"Validation failed"},"401":{"description":"Missing, expired, or invalid bearer token"},"403":{"description":"Caller lacks permission for the requested site"},"429":{"description":"Rate limit exceeded"}},"tags":["Equipment Configuration"],"security":[{"bearer":[]}]}},"/v1/config/site/sensors/light":{"get":{"operationId":"ConfigController_getSensorsForSiteLight","summary":"Get sensor configuration for a site (light payload)","parameters":[{"name":"siteId","required":true,"in":"query","description":"Site ID","schema":{"type":"string"}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/SensorConfigDto"}}}}},"400":{"description":"Validation failed"},"401":{"description":"Missing, expired, or invalid bearer token"},"403":{"description":"Caller lacks permission for the requested site"},"429":{"description":"Rate limit exceeded"}},"tags":["Equipment Configuration"],"security":[{"bearer":[]}]}},"/v1/config/updates/site/sensors":{"get":{"operationId":"ConfigController_getSensorsForSiteUpdates","summary":"Get sensor configuration updates for a site","parameters":[{"name":"siteId","required":true,"in":"query","description":"Site ID","schema":{"type":"string"}},{"name":"startDate","required":true,"in":"query","description":"ISO start date","schema":{"type":"string"}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/SensorConfigDto"}}}}},"400":{"description":"Validation failed"},"401":{"description":"Missing, expired, or invalid bearer token"},"403":{"description":"Caller lacks permission for the requested site"},"429":{"description":"Rate limit exceeded"}},"tags":["Equipment Configuration"],"security":[{"bearer":[]}]}},"/v1/config/updates/site/sensors/light":{"get":{"operationId":"ConfigController_getSensorsForSiteUpdatesLight","summary":"Get sensor configuration updates for a site (light payload)","parameters":[{"name":"siteId","required":true,"in":"query","description":"Site ID","schema":{"type":"string"}},{"name":"startDate","required":true,"in":"query","description":"ISO start date","schema":{"type":"string"}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/SensorConfigDto"}}}}},"400":{"description":"Validation failed"},"401":{"description":"Missing, expired, or invalid bearer token"},"403":{"description":"Caller lacks permission for the requested site"},"429":{"description":"Rate limit exceeded"}},"tags":["Equipment Configuration"],"security":[{"bearer":[]}]}},"/v1/config/meters/{meterId}":{"get":{"operationId":"ConfigController_getMeterRegister","summary":"Get IO register config for a flow meter","parameters":[{"name":"meterId","required":true,"in":"path","description":"SiteFlowmeterID","schema":{"type":"string"}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MeterRegistersDto"}}}},"400":{"description":"Validation failed"},"401":{"description":"Missing, expired, or invalid bearer token"},"403":{"description":"Caller lacks permission for the requested site"},"404":{"description":"No meter with this ID"},"429":{"description":"Rate limit exceeded"}},"tags":["Equipment Configuration"],"security":[{"bearer":[]}]}},"/v1/config/meters/{meterId}/light":{"get":{"operationId":"ConfigController_getMeterRegisterLight","summary":"Get IO register config for a flow meter (light payload)","parameters":[{"name":"meterId","required":true,"in":"path","description":"SiteFlowmeterID","schema":{"type":"string"}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MeterRegistersDto"}}}},"400":{"description":"Validation failed"},"401":{"description":"Missing, expired, or invalid bearer token"},"403":{"description":"Caller lacks permission for the requested site"},"404":{"description":"No meter with this ID"},"429":{"description":"Rate limit exceeded"}},"tags":["Equipment Configuration"],"security":[{"bearer":[]}]}},"/v1/config/updates/meters/{meterId}":{"get":{"operationId":"ConfigController_getMeterRegisterUpdates","summary":"Get meter register updates since a start date","parameters":[{"name":"meterId","required":true,"in":"path","description":"SiteFlowmeterID","schema":{"type":"string"}},{"name":"startDate","required":true,"in":"query","description":"ISO start date","schema":{"type":"string"}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MeterRegistersDto"}}}},"400":{"description":"Validation failed"},"401":{"description":"Missing, expired, or invalid bearer token"},"403":{"description":"Caller lacks permission for the requested site"},"404":{"description":"No meter with this ID"},"429":{"description":"Rate limit exceeded"}},"tags":["Equipment Configuration"],"security":[{"bearer":[]}]}},"/v1/config/updates/meters/{meterId}/light":{"get":{"operationId":"ConfigController_getMeterRegisterUpdatesLight","summary":"Get meter register updates since a start date (light payload)","parameters":[{"name":"meterId","required":true,"in":"path","description":"SiteFlowmeterID","schema":{"type":"string"}},{"name":"startDate","required":true,"in":"query","description":"ISO start date","schema":{"type":"string"}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MeterRegistersDto"}}}},"400":{"description":"Validation failed"},"401":{"description":"Missing, expired, or invalid bearer token"},"403":{"description":"Caller lacks permission for the requested site"},"404":{"description":"No meter with this ID"},"429":{"description":"Rate limit exceeded"}},"tags":["Equipment Configuration"],"security":[{"bearer":[]}]}},"/v1/config/site/meters":{"get":{"operationId":"ConfigController_getMetersForSite","summary":"Get meter configuration for a site","parameters":[{"name":"siteId","required":true,"in":"query","description":"Site ID","schema":{"type":"string"}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/MeterConfigDto"}}}}},"400":{"description":"Validation failed"},"401":{"description":"Missing, expired, or invalid bearer token"},"403":{"description":"Caller lacks permission for the requested site"},"429":{"description":"Rate limit exceeded"}},"tags":["Equipment Configuration"],"security":[{"bearer":[]}]}},"/v1/config/site/meters/light":{"get":{"operationId":"ConfigController_getMetersForSiteLight","summary":"Get meter configuration for a site (light payload)","parameters":[{"name":"siteId","required":true,"in":"query","description":"Site ID","schema":{"type":"string"}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/MeterConfigDto"}}}}},"400":{"description":"Validation failed"},"401":{"description":"Missing, expired, or invalid bearer token"},"403":{"description":"Caller lacks permission for the requested site"},"429":{"description":"Rate limit exceeded"}},"tags":["Equipment Configuration"],"security":[{"bearer":[]}]}},"/v1/config/updates/site/meters":{"get":{"operationId":"ConfigController_getMetersForSiteUpdates","summary":"Get meter configuration updates for a site","parameters":[{"name":"siteId","required":true,"in":"query","description":"Site ID","schema":{"type":"string"}},{"name":"startDate","required":true,"in":"query","description":"ISO start date","schema":{"type":"string"}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/MeterConfigDto"}}}}},"400":{"description":"Validation failed"},"401":{"description":"Missing, expired, or invalid bearer token"},"403":{"description":"Caller lacks permission for the requested site"},"429":{"description":"Rate limit exceeded"}},"tags":["Equipment Configuration"],"security":[{"bearer":[]}]}},"/v1/config/updates/site/meters/light":{"get":{"operationId":"ConfigController_getMetersForSiteUpdatesLight","summary":"Get meter configuration updates for a site (light payload)","parameters":[{"name":"siteId","required":true,"in":"query","description":"Site ID","schema":{"type":"string"}},{"name":"startDate","required":true,"in":"query","description":"ISO start date","schema":{"type":"string"}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/MeterConfigDto"}}}}},"400":{"description":"Validation failed"},"401":{"description":"Missing, expired, or invalid bearer token"},"403":{"description":"Caller lacks permission for the requested site"},"429":{"description":"Rate limit exceeded"}},"tags":["Equipment Configuration"],"security":[{"bearer":[]}]}},"/v1/config/pumps/{pumpId}":{"get":{"operationId":"ConfigController_getPumpRegister","summary":"Get IO register config for a pump","parameters":[{"name":"pumpId","required":true,"in":"path","description":"SitePumpID","schema":{"type":"string"}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PumpRegistersDto"}}}},"400":{"description":"Validation failed"},"401":{"description":"Missing, expired, or invalid bearer token"},"403":{"description":"Caller lacks permission for the requested site"},"404":{"description":"No pump with this ID"},"429":{"description":"Rate limit exceeded"}},"tags":["Equipment Configuration"],"security":[{"bearer":[]}]}},"/v1/config/pumps/{pumpId}/light":{"get":{"operationId":"ConfigController_getPumpRegisterLight","summary":"Get IO register config for a pump (light payload)","parameters":[{"name":"pumpId","required":true,"in":"path","description":"SitePumpID","schema":{"type":"string"}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PumpRegistersDto"}}}},"400":{"description":"Validation failed"},"401":{"description":"Missing, expired, or invalid bearer token"},"403":{"description":"Caller lacks permission for the requested site"},"404":{"description":"No pump with this ID"},"429":{"description":"Rate limit exceeded"}},"tags":["Equipment Configuration"],"security":[{"bearer":[]}]}},"/v1/config/updates/pumps/{pumpId}":{"get":{"operationId":"ConfigController_getPumpRegisterUpdates","summary":"Get pump register updates since a start date","parameters":[{"name":"pumpId","required":true,"in":"path","description":"SitePumpID","schema":{"type":"string"}},{"name":"startDate","required":true,"in":"query","description":"ISO start date","schema":{"type":"string"}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PumpRegistersDto"}}}},"400":{"description":"Validation failed"},"401":{"description":"Missing, expired, or invalid bearer token"},"403":{"description":"Caller lacks permission for the requested site"},"404":{"description":"No pump with this ID"},"429":{"description":"Rate limit exceeded"}},"tags":["Equipment Configuration"],"security":[{"bearer":[]}]}},"/v1/config/updates/pumps/{pumpId}/light":{"get":{"operationId":"ConfigController_getPumpRegisterUpdatesLight","summary":"Get pump register updates since a start date (light payload)","parameters":[{"name":"pumpId","required":true,"in":"path","description":"SitePumpID","schema":{"type":"string"}},{"name":"startDate","required":true,"in":"query","description":"ISO start date","schema":{"type":"string"}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PumpRegistersDto"}}}},"400":{"description":"Validation failed"},"401":{"description":"Missing, expired, or invalid bearer token"},"403":{"description":"Caller lacks permission for the requested site"},"404":{"description":"No pump with this ID"},"429":{"description":"Rate limit exceeded"}},"tags":["Equipment Configuration"],"security":[{"bearer":[]}]}},"/v1/config/site/pumps":{"get":{"operationId":"ConfigController_getPumpsForSite","summary":"Get pump configuration for a site","parameters":[{"name":"siteId","required":true,"in":"query","description":"Site ID","schema":{"type":"string"}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/PumpConfigDto"}}}}},"400":{"description":"Validation failed"},"401":{"description":"Missing, expired, or invalid bearer token"},"403":{"description":"Caller lacks permission for the requested site"},"429":{"description":"Rate limit exceeded"}},"tags":["Equipment Configuration"],"security":[{"bearer":[]}]}},"/v1/config/site/pumps/light":{"get":{"operationId":"ConfigController_getPumpsForSiteLight","summary":"Get pump configuration for a site (light payload)","parameters":[{"name":"siteId","required":true,"in":"query","description":"Site ID","schema":{"type":"string"}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/PumpConfigDto"}}}}},"400":{"description":"Validation failed"},"401":{"description":"Missing, expired, or invalid bearer token"},"403":{"description":"Caller lacks permission for the requested site"},"429":{"description":"Rate limit exceeded"}},"tags":["Equipment Configuration"],"security":[{"bearer":[]}]}},"/v1/config/updates/site/pumps":{"get":{"operationId":"ConfigController_getPumpsForSiteUpdates","summary":"Get pump configuration updates for a site","parameters":[{"name":"siteId","required":true,"in":"query","description":"Site ID","schema":{"type":"string"}},{"name":"startDate","required":true,"in":"query","description":"ISO start date","schema":{"type":"string"}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/PumpConfigDto"}}}}},"400":{"description":"Validation failed"},"401":{"description":"Missing, expired, or invalid bearer token"},"403":{"description":"Caller lacks permission for the requested site"},"429":{"description":"Rate limit exceeded"}},"tags":["Equipment Configuration"],"security":[{"bearer":[]}]}},"/v1/config/updates/site/pumps/light":{"get":{"operationId":"ConfigController_getPumpsForSiteUpdatesLight","summary":"Get pump configuration updates for a site (light payload)","parameters":[{"name":"siteId","required":true,"in":"query","description":"Site ID","schema":{"type":"string"}},{"name":"startDate","required":true,"in":"query","description":"ISO start date","schema":{"type":"string"}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/PumpConfigDto"}}}}},"400":{"description":"Validation failed"},"401":{"description":"Missing, expired, or invalid bearer token"},"403":{"description":"Caller lacks permission for the requested site"},"429":{"description":"Rate limit exceeded"}},"tags":["Equipment Configuration"],"security":[{"bearer":[]}]}},"/v1/config/tanks/{tankGroupId}":{"get":{"operationId":"ConfigController_getTankGroupRegister","summary":"Get IO register config for a tank group","parameters":[{"name":"tankGroupId","required":true,"in":"path","description":"SiteTankGroupID","schema":{"type":"string"}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TankRegistersDto"}}}},"400":{"description":"Validation failed"},"401":{"description":"Missing, expired, or invalid bearer token"},"403":{"description":"Caller lacks permission for the requested site"},"404":{"description":"No tank group with this ID"},"429":{"description":"Rate limit exceeded"}},"tags":["Equipment Configuration"],"security":[{"bearer":[]}]}},"/v1/config/tanks/{tankGroupId}/light":{"get":{"operationId":"ConfigController_getTankGroupRegisterLight","summary":"Get IO register config for a tank group (light payload)","parameters":[{"name":"tankGroupId","required":true,"in":"path","description":"SiteTankGroupID","schema":{"type":"string"}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TankRegistersDto"}}}},"400":{"description":"Validation failed"},"401":{"description":"Missing, expired, or invalid bearer token"},"403":{"description":"Caller lacks permission for the requested site"},"404":{"description":"No tank group with this ID"},"429":{"description":"Rate limit exceeded"}},"tags":["Equipment Configuration"],"security":[{"bearer":[]}]}},"/v1/config/updates/tanks/{tankGroupId}":{"get":{"operationId":"ConfigController_getTankGroupRegisterUpdates","summary":"Get tank group register updates since a start date","parameters":[{"name":"tankGroupId","required":true,"in":"path","description":"SiteTankGroupID","schema":{"type":"string"}},{"name":"startDate","required":true,"in":"query","description":"ISO start date","schema":{"type":"string"}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TankRegistersDto"}}}},"400":{"description":"Validation failed"},"401":{"description":"Missing, expired, or invalid bearer token"},"403":{"description":"Caller lacks permission for the requested site"},"404":{"description":"No tank group with this ID"},"429":{"description":"Rate limit exceeded"}},"tags":["Equipment Configuration"],"security":[{"bearer":[]}]}},"/v1/config/updates/tanks/{tankGroupId}/light":{"get":{"operationId":"ConfigController_getTankGroupRegisterUpdatesLight","summary":"Get tank group register updates since a start date (light payload)","parameters":[{"name":"tankGroupId","required":true,"in":"path","description":"SiteTankGroupID","schema":{"type":"string"}},{"name":"startDate","required":true,"in":"query","description":"ISO start date","schema":{"type":"string"}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TankRegistersDto"}}}},"400":{"description":"Validation failed"},"401":{"description":"Missing, expired, or invalid bearer token"},"403":{"description":"Caller lacks permission for the requested site"},"404":{"description":"No tank group with this ID"},"429":{"description":"Rate limit exceeded"}},"tags":["Equipment Configuration"],"security":[{"bearer":[]}]}},"/v1/config/site/tanks":{"get":{"operationId":"ConfigController_getTanksForSite","summary":"Get tank configuration for a site","parameters":[{"name":"siteId","required":true,"in":"query","description":"Site ID","schema":{"type":"string"}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/TankConfigDto"}}}}},"400":{"description":"Validation failed"},"401":{"description":"Missing, expired, or invalid bearer token"},"403":{"description":"Caller lacks permission for the requested site"},"429":{"description":"Rate limit exceeded"}},"tags":["Equipment Configuration"],"security":[{"bearer":[]}]}},"/v1/config/site/tanks/light":{"get":{"operationId":"ConfigController_getTanksForSiteLight","summary":"Get tank configuration for a site (light payload)","parameters":[{"name":"siteId","required":true,"in":"query","description":"Site ID","schema":{"type":"string"}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/TankConfigDto"}}}}},"400":{"description":"Validation failed"},"401":{"description":"Missing, expired, or invalid bearer token"},"403":{"description":"Caller lacks permission for the requested site"},"429":{"description":"Rate limit exceeded"}},"tags":["Equipment Configuration"],"security":[{"bearer":[]}]}},"/v1/config/updates/site/tanks":{"get":{"operationId":"ConfigController_getTanksForSiteUpdates","summary":"Get tank configuration updates for a site","parameters":[{"name":"siteId","required":true,"in":"query","description":"Site ID","schema":{"type":"string"}},{"name":"startDate","required":true,"in":"query","description":"ISO start date","schema":{"type":"string"}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/TankConfigDto"}}}}},"400":{"description":"Validation failed"},"401":{"description":"Missing, expired, or invalid bearer token"},"403":{"description":"Caller lacks permission for the requested site"},"429":{"description":"Rate limit exceeded"}},"tags":["Equipment Configuration"],"security":[{"bearer":[]}]}},"/v1/config/updates/site/tanks/light":{"get":{"operationId":"ConfigController_getTanksForSiteUpdatesLight","summary":"Get tank configuration updates for a site (light payload)","parameters":[{"name":"siteId","required":true,"in":"query","description":"Site ID","schema":{"type":"string"}},{"name":"startDate","required":true,"in":"query","description":"ISO start date","schema":{"type":"string"}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/TankConfigDto"}}}}},"400":{"description":"Validation failed"},"401":{"description":"Missing, expired, or invalid bearer token"},"403":{"description":"Caller lacks permission for the requested site"},"429":{"description":"Rate limit exceeded"}},"tags":["Equipment Configuration"],"security":[{"bearer":[]}]}},"/v1/config/site/actuators":{"get":{"operationId":"ConfigController_getActuatorsForSite","summary":"Get actuator configuration for a site","parameters":[{"name":"siteId","required":true,"in":"query","description":"Site ID","schema":{"type":"string"}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/ActuatorConfigDto"}}}}},"400":{"description":"Validation failed"},"401":{"description":"Missing, expired, or invalid bearer token"},"403":{"description":"Caller lacks permission for the requested site"},"429":{"description":"Rate limit exceeded"}},"tags":["Equipment Configuration"],"security":[{"bearer":[]}]}},"/v1/config/site/actuators/light":{"get":{"operationId":"ConfigController_getActuatorsForSiteLight","summary":"Get actuator configuration for a site (light payload)","parameters":[{"name":"siteId","required":true,"in":"query","description":"Site ID","schema":{"type":"string"}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/ActuatorConfigDto"}}}}},"400":{"description":"Validation failed"},"401":{"description":"Missing, expired, or invalid bearer token"},"403":{"description":"Caller lacks permission for the requested site"},"429":{"description":"Rate limit exceeded"}},"tags":["Equipment Configuration"],"security":[{"bearer":[]}]}},"/v1/config/updates/site/actuators":{"get":{"operationId":"ConfigController_getActuatorsForSiteUpdates","summary":"Get actuator configuration updates for a site (always the full set)","parameters":[{"name":"siteId","required":true,"in":"query","description":"Site ID","schema":{"type":"string"}},{"name":"startDate","required":true,"in":"query","description":"ISO start date","schema":{"type":"string"}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/ActuatorConfigDto"}}}}},"400":{"description":"Validation failed"},"401":{"description":"Missing, expired, or invalid bearer token"},"403":{"description":"Caller lacks permission for the requested site"},"429":{"description":"Rate limit exceeded"}},"tags":["Equipment Configuration"],"security":[{"bearer":[]}]}},"/v1/config/updates/site/actuators/light":{"get":{"operationId":"ConfigController_getActuatorsForSiteUpdatesLight","summary":"Get actuator configuration updates for a site (light payload, always the full set)","parameters":[{"name":"siteId","required":true,"in":"query","description":"Site ID","schema":{"type":"string"}},{"name":"startDate","required":true,"in":"query","description":"ISO start date","schema":{"type":"string"}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/ActuatorConfigDto"}}}}},"400":{"description":"Validation failed"},"401":{"description":"Missing, expired, or invalid bearer token"},"403":{"description":"Caller lacks permission for the requested site"},"429":{"description":"Rate limit exceeded"}},"tags":["Equipment Configuration"],"security":[{"bearer":[]}]}},"/v1/config/site":{"get":{"operationId":"ConfigController_getSiteConfig","summary":"Get full configuration for a site","parameters":[{"name":"siteId","required":true,"in":"query","description":"Site ID","schema":{"type":"string"}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SiteConfigDto"}}}},"400":{"description":"Validation failed"},"401":{"description":"Missing, expired, or invalid bearer token"},"403":{"description":"Caller lacks permission for the requested site"},"429":{"description":"Rate limit exceeded"}},"tags":["Equipment Configuration"],"security":[{"bearer":[]}]}},"/v1/config/site/light":{"get":{"operationId":"ConfigController_getSiteConfigLight","summary":"Get light configuration for a site","parameters":[{"name":"siteId","required":true,"in":"query","description":"Site ID","schema":{"type":"string"}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SiteConfigDto"}}}},"400":{"description":"Validation failed"},"401":{"description":"Missing, expired, or invalid bearer token"},"403":{"description":"Caller lacks permission for the requested site"},"429":{"description":"Rate limit exceeded"}},"tags":["Equipment Configuration"],"security":[{"bearer":[]}]}},"/v1/config/updates/site":{"get":{"operationId":"ConfigController_getSiteConfigUpdates","summary":"Get site configuration updates since a date","parameters":[{"name":"siteId","required":true,"in":"query","description":"Site ID","schema":{"type":"string"}},{"name":"startDate","required":true,"in":"query","description":"ISO start date","schema":{"type":"string"}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SiteConfigDto"}}}},"400":{"description":"Validation failed"},"401":{"description":"Missing, expired, or invalid bearer token"},"403":{"description":"Caller lacks permission for the requested site"},"429":{"description":"Rate limit exceeded"}},"tags":["Equipment Configuration"],"security":[{"bearer":[]}]}},"/v1/config/updates/site/light":{"get":{"operationId":"ConfigController_getSiteConfigUpdatesLight","summary":"Get site configuration updates since a date (light payload)","parameters":[{"name":"siteId","required":true,"in":"query","description":"Site ID","schema":{"type":"string"}},{"name":"startDate","required":true,"in":"query","description":"ISO start date","schema":{"type":"string"}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SiteConfigDto"}}}},"400":{"description":"Validation failed"},"401":{"description":"Missing, expired, or invalid bearer token"},"403":{"description":"Caller lacks permission for the requested site"},"429":{"description":"Rate limit exceeded"}},"tags":["Equipment Configuration"],"security":[{"bearer":[]}]}},"/v1/config/site/compact":{"get":{"operationId":"ConfigController_getCompactSiteConfig","summary":"Get compact configuration for a site","parameters":[{"name":"siteId","required":true,"in":"query","description":"Site ID","schema":{"type":"string"}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CompactSiteConfigDto"}}}},"400":{"description":"Validation failed"},"401":{"description":"Missing, expired, or invalid bearer token"},"403":{"description":"Caller lacks permission for the requested site"},"429":{"description":"Rate limit exceeded"}},"tags":["Equipment Configuration"],"security":[{"bearer":[]}]}},"/v1/config/updates/site/compact":{"get":{"operationId":"ConfigController_getCompactSiteConfigUpdates","summary":"Get compact site configuration updates since a date","parameters":[{"name":"siteId","required":true,"in":"query","description":"Site ID","schema":{"type":"string"}},{"name":"startDate","required":true,"in":"query","description":"ISO start date","schema":{"type":"string"}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CompactSiteConfigDto"}}}},"400":{"description":"Validation failed"},"401":{"description":"Missing, expired, or invalid bearer token"},"403":{"description":"Caller lacks permission for the requested site"},"429":{"description":"Rate limit exceeded"}},"tags":["Equipment Configuration"],"security":[{"bearer":[]}]}},"/v1/edge/logs/sensor":{"post":{"operationId":"LogsController_handleSingleLog","summary":"Process a single edge sensor log","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SensorLogDto"}}}},"responses":{"201":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/UploadResponseDto"}}}},"400":{"description":"Validation failed"},"401":{"description":"Missing, expired, or invalid bearer token"},"403":{"description":"Caller lacks permission for a requested site"},"404":{"description":"A referenced sensor, meter, pump, or tank group does not exist"},"429":{"description":"Rate limit exceeded"}},"tags":["Historical Data Upload"],"security":[{"bearer":[]}]}},"/v1/edge/logs/meter":{"post":{"operationId":"LogsController_handleSingleFlowMeterLog","summary":"Process a single meter log","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/FlowMeterLogInboundDto"}}}},"responses":{"201":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/UploadResponseDto"}}}},"400":{"description":"Validation failed"},"401":{"description":"Missing, expired, or invalid bearer token"},"403":{"description":"Caller lacks permission for a requested site"},"404":{"description":"A referenced sensor, meter, pump, or tank group does not exist"},"429":{"description":"Rate limit exceeded"}},"tags":["Historical Data Upload"],"security":[{"bearer":[]}]}},"/v1/edge/logs/meter/batch":{"post":{"operationId":"LogsController_handleBatchFlowMeterLogs","summary":"Process a batch of flow meter logs","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/FlowMeterLogInboundDto"},"example":[{"flowMeterID":123,"timestamp":"2024-01-01T00:00:00.000Z","startTimestamp":"2023-12-31T23:00:00.000Z","totalVolume":1000,"dayVolume":100,"pressure":50,"flowRate":10}]}}}},"responses":{"201":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/UploadResponseDto"}}}},"400":{"description":"Body is not an array, or an entry fails flow meter log validation."},"401":{"description":"Missing, expired, or invalid bearer token"},"403":{"description":"Caller lacks permission for a requested site"},"404":{"description":"A referenced sensor, meter, pump, or tank group does not exist"},"429":{"description":"Rate limit exceeded"}},"tags":["Historical Data Upload"],"security":[{"bearer":[]}]}},"/v1/edge/logs/generic":{"post":{"operationId":"LogsController_handleGenericLogPayload","summary":"Submit mixed logs (sensor + flow meter + pump + tank)","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"array","items":{"oneOf":[{"$ref":"#/components/schemas/SensorLogDto"},{"$ref":"#/components/schemas/FlowMeterLogInboundDto"},{"$ref":"#/components/schemas/PumpLogDto"},{"$ref":"#/components/schemas/TankLogDto"}]},"example":[{"sensorID":40779,"value":52.34,"timestamp":"2025-04-16T10:00:00Z"},{"flowMeterID":12345,"totalVolume":10200.5,"timestamp":"2025-04-16T10:00:00Z"},{"sitePumpID":789,"pressure":150,"running":true,"timestamp":"2025-04-16T10:00:00Z"},{"siteTankGroupID":456,"entryTankLevel":4000,"exitTankLevel":3500,"totalVolume":5000,"timestamp":"2025-04-16T10:00:00Z"}],"description":"Array of mixed logs containing sensor, meter, pump, and tank logs"}}}},"responses":{"201":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/UploadResponseDto"}}}},"400":{"description":"Body is not an array, or contains an entry that is not an object."},"401":{"description":"Missing, expired, or invalid bearer token"},"403":{"description":"Caller lacks permission for a requested site"},"404":{"description":"A referenced sensor, meter, pump, or tank group does not exist"},"429":{"description":"Rate limit exceeded"},"500":{"description":"The log could not be stored"}},"tags":["Historical Data Upload"],"security":[{"bearer":[]}]}},"/v1/edge/logs/sensor/batch":{"post":{"operationId":"LogsController_handleBatchLogs","summary":"Process a batch of edge sensor logs","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/SensorLogDto"}}}}},"responses":{"201":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/UploadResponseDto"}}}},"400":{"description":"Body is not an array, or an entry fails sensor log validation."},"401":{"description":"Missing, expired, or invalid bearer token"},"403":{"description":"Caller lacks permission for a requested site"},"404":{"description":"A referenced sensor, meter, pump, or tank group does not exist"},"429":{"description":"Rate limit exceeded"}},"tags":["Historical Data Upload"],"security":[{"bearer":[]}]}},"/v1/edge/logs/pump/batch":{"post":{"operationId":"LogsController_handleBatchPumpLogs","summary":"Submit a batch of pump logs","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/PumpLogDto"},"example":[{"sitePumpID":123,"timestamp":"2024-01-01T00:00:00.000Z","pressure":150,"running":true,"frequency":60,"statusID":0,"status":"Running"}]}}}},"responses":{"201":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/UploadResponseDto"}}}},"400":{"description":"Body is not an array, or an entry fails pump log validation."},"401":{"description":"Missing, expired, or invalid bearer token"},"403":{"description":"Caller lacks permission for a requested site"},"404":{"description":"A referenced sensor, meter, pump, or tank group does not exist"},"429":{"description":"Rate limit exceeded"},"500":{"description":"The log could not be stored"}},"tags":["Historical Data Upload"],"security":[{"bearer":[]}]}},"/v1/edge/logs/pump":{"post":{"operationId":"LogsController_handlePumpLog","summary":"Submit a pump log","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PumpLogDto"}}}},"responses":{"201":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/UploadResponseDto"}}}},"400":{"description":"Validation failed"},"401":{"description":"Missing, expired, or invalid bearer token"},"403":{"description":"Caller lacks permission for a requested site"},"404":{"description":"A referenced sensor, meter, pump, or tank group does not exist"},"429":{"description":"Rate limit exceeded"},"500":{"description":"The log could not be stored"}},"tags":["Historical Data Upload"],"security":[{"bearer":[]}]}},"/v1/edge/logs/tank/batch":{"post":{"operationId":"LogsController_handleBatchTankLogs","summary":"Submit a batch of tank logs","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/TankLogDto"}}}}},"responses":{"201":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/UploadResponseDto"}}}},"400":{"description":"Body is not an array, or an entry fails tank log validation."},"401":{"description":"Missing, expired, or invalid bearer token"},"403":{"description":"Caller lacks permission for a requested site"},"404":{"description":"A referenced sensor, meter, pump, or tank group does not exist"},"429":{"description":"Rate limit exceeded"},"500":{"description":"The log could not be stored"}},"tags":["Historical Data Upload"],"security":[{"bearer":[]}]}},"/v1/edge/logs/tank":{"post":{"operationId":"LogsController_handleTankLog","summary":"Submit a tank log","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TankLogDto"}}}},"responses":{"201":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/UploadResponseDto"}}}},"400":{"description":"Validation failed"},"401":{"description":"Missing, expired, or invalid bearer token"},"403":{"description":"Caller lacks permission for a requested site"},"404":{"description":"A referenced sensor, meter, pump, or tank group does not exist"},"429":{"description":"Rate limit exceeded"},"500":{"description":"The log could not be stored"}},"tags":["Historical Data Upload"],"security":[{"bearer":[]}]}},"/v1/edge/readings/sensor":{"post":{"operationId":"ReadingsController_handleSingleReading","summary":"Process a single edge sensor reading to update site data (no log creation)","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SensorReadingDto"}}}},"responses":{"201":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/UploadResponseDto"}}}},"400":{"description":"Validation failed"},"401":{"description":"Missing, expired, or invalid bearer token"},"403":{"description":"Caller lacks permission for a requested site"},"404":{"description":"A referenced sensor, meter, pump, or tank group does not exist"},"429":{"description":"Rate limit exceeded"}},"tags":["Live Data Upload"],"security":[{"bearer":[]}]}},"/v1/edge/readings/sensor/batch":{"post":{"operationId":"ReadingsController_handleBatchReadings","summary":"Process a batch of edge sensor readings to update site data (no log creation)","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BatchSensorReadingsDto"}}}},"responses":{"201":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/UploadResponseDto"}}}},"400":{"description":"Validation failed"},"401":{"description":"Missing, expired, or invalid bearer token"},"403":{"description":"Caller lacks permission for a requested site"},"404":{"description":"A referenced sensor, meter, pump, or tank group does not exist"},"429":{"description":"Rate limit exceeded"}},"tags":["Live Data Upload"],"security":[{"bearer":[]}]}},"/v1/edge/readings/meter":{"post":{"operationId":"ReadingsController_handleSingleFlowMeterReading","summary":"Process a single flow meter reading (not a full log)","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/FlowMeterReadingDto"}}}},"responses":{"201":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/UploadResponseDto"}}}},"400":{"description":"Validation failed"},"401":{"description":"Missing, expired, or invalid bearer token"},"403":{"description":"Caller lacks permission for a requested site"},"404":{"description":"A referenced sensor, meter, pump, or tank group does not exist"},"429":{"description":"Rate limit exceeded"}},"tags":["Live Data Upload"],"security":[{"bearer":[]}]}},"/v1/edge/readings/meter/batch":{"post":{"operationId":"ReadingsController_handleBatchMeterReadings","summary":"Process a batch of flow meter readings (not full logs)","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BatchFlowMeterReadingsDto"}}}},"responses":{"201":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/UploadResponseDto"}}}},"400":{"description":"Validation failed"},"401":{"description":"Missing, expired, or invalid bearer token"},"403":{"description":"Caller lacks permission for a requested site"},"404":{"description":"A referenced sensor, meter, pump, or tank group does not exist"},"429":{"description":"Rate limit exceeded"}},"tags":["Live Data Upload"],"security":[{"bearer":[]}]}},"/v1/edge/readings/generic":{"post":{"operationId":"ReadingsController_handleGenericReadingPayload","summary":"Submit mixed readings (sensor + meter + pump + tank)","parameters":[],"requestBody":{"required":true,"description":"Mixed reading payload. Each entry is routed by its identifying fields.","content":{"application/json":{"schema":{"type":"object","required":["readings"],"properties":{"readings":{"type":"array","items":{"oneOf":[{"$ref":"#/components/schemas/SensorReadingDto"},{"$ref":"#/components/schemas/FlowMeterReadingDto"},{"$ref":"#/components/schemas/PumpReadingDto"},{"$ref":"#/components/schemas/TankReadingDto"}]}}}}}}},"responses":{"201":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/UploadResponseDto"}}}},"400":{"description":"`readings` is missing, not an array, or contains a non-object entry."},"401":{"description":"Missing, expired, or invalid bearer token"},"403":{"description":"Caller lacks permission for a requested site"},"404":{"description":"A referenced sensor, meter, pump, or tank group does not exist"},"429":{"description":"Rate limit exceeded"}},"tags":["Live Data Upload"],"security":[{"bearer":[]}]}},"/v1/edge/readings/pump/batch":{"post":{"operationId":"ReadingsController_handleBatchPumpReadings","summary":"Submit a batch of pump readings","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BatchPumpReadingsDto"}}}},"responses":{"201":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/UploadResponseDto"}}}},"400":{"description":"Validation failed"},"401":{"description":"Missing, expired, or invalid bearer token"},"403":{"description":"Caller lacks permission for a requested site"},"404":{"description":"A referenced sensor, meter, pump, or tank group does not exist"},"429":{"description":"Rate limit exceeded"}},"tags":["Live Data Upload"],"security":[{"bearer":[]}]}},"/v1/edge/readings/pump":{"post":{"operationId":"ReadingsController_handlePumpReading","summary":"Submit a real-time pump reading","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PumpReadingDto"}}}},"responses":{"201":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/UploadResponseDto"}}}},"400":{"description":"Validation failed"},"401":{"description":"Missing, expired, or invalid bearer token"},"403":{"description":"Caller lacks permission for a requested site"},"404":{"description":"A referenced sensor, meter, pump, or tank group does not exist"},"429":{"description":"Rate limit exceeded"}},"tags":["Live Data Upload"],"security":[{"bearer":[]}]}},"/v1/edge/readings/tank/batch":{"post":{"operationId":"ReadingsController_handleBatchTankReadings","summary":"Submit a batch of tank readings","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BatchTankReadingsDto"}}}},"responses":{"201":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/UploadResponseDto"}}}},"400":{"description":"Validation failed"},"401":{"description":"Missing, expired, or invalid bearer token"},"403":{"description":"Caller lacks permission for a requested site"},"404":{"description":"A referenced sensor, meter, pump, or tank group does not exist"},"429":{"description":"Rate limit exceeded"}},"tags":["Live Data Upload"],"security":[{"bearer":[]}]}},"/v1/edge/readings/tank":{"post":{"operationId":"ReadingsController_handleTankReading","summary":"Submit a real-time tank reading","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TankReadingDto"}}}},"responses":{"201":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/UploadResponseDto"}}}},"400":{"description":"Validation failed"},"401":{"description":"Missing, expired, or invalid bearer token"},"403":{"description":"Caller lacks permission for a requested site"},"404":{"description":"A referenced sensor, meter, pump, or tank group does not exist"},"429":{"description":"Rate limit exceeded"}},"tags":["Live Data Upload"],"security":[{"bearer":[]}]}},"/v1/edge/alarms":{"post":{"operationId":"AlarmsController_sendAlarm","summary":"Send a single alarm","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AlarmDto"}}}},"responses":{"201":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AlarmSendResultDto"}}}},"400":{"description":"Validation failed"},"401":{"description":"Missing, expired, or invalid bearer token"},"403":{"description":"Caller lacks permission for a requested site"},"404":{"description":"A referenced sensor, meter, pump, or tank group does not exist"},"429":{"description":"Rate limit exceeded"}},"tags":["Alarms"],"security":[{"bearer":[]}]}},"/v1/edge/alarms/batch":{"post":{"operationId":"AlarmsController_sendAlarms","summary":"Send multiple alarms for a single site","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/MultiSiteAlarmsDto"}}}},"responses":{"201":{"description":"","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/AlarmSendResultDto"}}}}},"400":{"description":"Validation failed"},"401":{"description":"Missing, expired, or invalid bearer token"},"403":{"description":"Caller lacks permission for a requested site"},"404":{"description":"A referenced sensor, meter, pump, or tank group does not exist"},"429":{"description":"Rate limit exceeded"}},"tags":["Alarms"],"security":[{"bearer":[]}]}},"/v1/edge/alarms/resolve":{"post":{"operationId":"AlarmsController_resolveAlarms","summary":"Resolve one or more alarms for a site","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/MultiSiteAlarmsDto"}}}},"responses":{"200":{"description":"","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/AlarmResolveResultDto"}}}}},"400":{"description":"Missing site id or SiteAlarmLogID"},"401":{"description":"Missing, expired, or invalid bearer token"},"403":{"description":"Caller lacks permission for a requested site"},"404":{"description":"A referenced sensor, meter, pump, or tank group does not exist"},"429":{"description":"Rate limit exceeded"}},"tags":["Alarms"],"security":[{"bearer":[]}]}},"/v1/edge/alarms/active":{"post":{"operationId":"AlarmsController_listActiveAlarms","summary":"List active (unresolved) alarms for one or more sites","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ActiveAlarmsFilterDto"}}}},"responses":{"200":{"description":"","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/ActiveAlarmDto"}}}}},"400":{"description":"No valid site id supplied"},"401":{"description":"Missing, expired, or invalid bearer token"},"403":{"description":"Caller lacks permission for a requested site"},"404":{"description":"A referenced sensor, meter, pump, or tank group does not exist"},"429":{"description":"Rate limit exceeded"}},"tags":["Alarms"],"security":[{"bearer":[]}]}},"/v1/edge/alarms/{id}/resolve":{"post":{"operationId":"AlarmsController_quickResolve","summary":"Quick-resolve a single alarm by its log id","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"number"}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AlarmActionResultDto"}}}},"400":{"description":"Validation failed"},"401":{"description":"Missing, expired, or invalid bearer token"},"403":{"description":"Caller lacks permission for a requested site"},"404":{"description":"A referenced sensor, meter, pump, or tank group does not exist"},"429":{"description":"Rate limit exceeded"}},"tags":["Alarms"],"security":[{"bearer":[]}]}},"/v1/edge/alarms/{id}/silence":{"post":{"operationId":"AlarmsController_silence","summary":"Silence a single alarm by its log id","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"number"}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AlarmActionResultDto"}}}},"400":{"description":"Validation failed"},"401":{"description":"Missing, expired, or invalid bearer token"},"403":{"description":"Caller lacks permission for a requested site"},"404":{"description":"A referenced sensor, meter, pump, or tank group does not exist"},"429":{"description":"Rate limit exceeded"}},"tags":["Alarms"],"security":[{"bearer":[]}]}},"/v1/edge/alarms/{id}/unsilence":{"post":{"operationId":"AlarmsController_unsilence","summary":"Remove the silence from a single alarm by its log id","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"number"}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AlarmActionResultDto"}}}},"400":{"description":"Validation failed"},"401":{"description":"Missing, expired, or invalid bearer token"},"403":{"description":"Caller lacks permission for a requested site"},"404":{"description":"A referenced sensor, meter, pump, or tank group does not exist"},"429":{"description":"Rate limit exceeded"}},"tags":["Alarms"],"security":[{"bearer":[]}]}},"/v1/edge/alarms/remotely-resolved":{"post":{"operationId":"AlarmsController_retrieveV2","summary":"Retrieve remotely-resolved alarms","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BaseDataRequestDto"}}}},"responses":{"200":{"description":"","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/RemotelyResolvedAlarmDto"}}}}},"400":{"description":"Validation failed"},"401":{"description":"Missing, expired, or invalid bearer token"},"403":{"description":"Caller lacks permission for a requested site"},"404":{"description":"A referenced sensor, meter, pump, or tank group does not exist"},"429":{"description":"Rate limit exceeded"}},"tags":["Alarms"],"security":[{"bearer":[]}]}},"/v1/edge/user/sensors/virtual":{"post":{"operationId":"UserController_createVirtualSensor","summary":"Create a virtual sensor","description":"Creates a SiteSensors record for a non-equipment-related virtual sensor. Required fields are siteID, name, active, unitID, units, sensorTypeID, and sensorSubTypeID. Optional fields include description and equation.","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateVirtualSensorDto"}}}},"responses":{"201":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/VirtualSensorResponseDto"}}}},"400":{"description":"Validation failed"},"401":{"description":"Missing, expired, or invalid bearer token"},"403":{"description":"Caller lacks permission for the requested site"},"404":{"description":"A referenced sensor, meter, pump, or tank group does not exist"},"429":{"description":"Rate limit exceeded"}},"tags":["Equipment"],"security":[{"bearer":[]}]}},"/v1/edge/user/sensors/virtual/{sensorId}":{"put":{"operationId":"UserController_updateVirtualSensor","summary":"Update a virtual sensor","description":"Updates the backing SiteSensors record for a virtual sensor. Required fields are siteID, name, active, unitID, units, sensorTypeID, and sensorSubTypeID. Optional fields include description and equation.","parameters":[{"name":"sensorId","required":true,"in":"path","description":"SiteSensors.SiteSensorID for the virtual sensor.","schema":{"example":456,"type":"number"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateVirtualSensorDto"}}}},"responses":{"200":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/VirtualSensorResponseDto"}}}},"400":{"description":"Validation failed"},"401":{"description":"Missing, expired, or invalid bearer token"},"403":{"description":"Caller lacks permission for the requested site"},"404":{"description":"A referenced sensor, meter, pump, or tank group does not exist"},"429":{"description":"Rate limit exceeded"}},"tags":["Equipment"],"security":[{"bearer":[]}]},"delete":{"operationId":"UserController_deleteVirtualSensor","summary":"Delete a virtual sensor","description":"Soft deletes the backing SiteSensors record by setting SiteSensors.Delete to true. The database row is not hard deleted.","parameters":[{"name":"sensorId","required":true,"in":"path","description":"SiteSensors.SiteSensorID for the virtual sensor.","schema":{"example":456,"type":"number"}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/DeleteVirtualSensorResponseDto"}}}},"400":{"description":"Validation failed"},"401":{"description":"Missing, expired, or invalid bearer token"},"403":{"description":"Caller lacks permission for the requested site"},"404":{"description":"A referenced sensor, meter, pump, or tank group does not exist"},"429":{"description":"Rate limit exceeded"}},"tags":["Equipment"],"security":[{"bearer":[]}]}},"/v1/edge/user/sensors":{"get":{"operationId":"UserController_getSensors","summary":"Get sensors for the provided site IDs","parameters":[{"name":"siteIds","required":true,"in":"query","description":"Comma-separated list of site IDs to filter sensors by","schema":{"example":"1,2,3","type":"string"}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/SiteSensorDto"}}}}},"400":{"description":"Validation failed"},"401":{"description":"Missing, expired, or invalid bearer token"},"403":{"description":"Caller lacks permission for the requested site"},"404":{"description":"A referenced sensor, meter, pump, or tank group does not exist"},"429":{"description":"Rate limit exceeded"}},"tags":["Equipment"],"security":[{"bearer":[]}]}},"/v1/edge/user/meters":{"get":{"operationId":"UserController_getMeters","summary":"Get meters for the provided site IDs","parameters":[{"name":"siteIds","required":true,"in":"query","description":"Comma-separated list of site IDs to filter meters by","schema":{"example":"1,2,3","type":"string"}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/SiteFlowMeterDto"}}}}},"400":{"description":"Validation failed"},"401":{"description":"Missing, expired, or invalid bearer token"},"403":{"description":"Caller lacks permission for the requested site"},"404":{"description":"A referenced sensor, meter, pump, or tank group does not exist"},"429":{"description":"Rate limit exceeded"}},"tags":["Equipment"],"security":[{"bearer":[]}]}},"/v1/edge/user/tanks":{"get":{"operationId":"UserController_getTanks","summary":"Get tanks for the provided site IDs","parameters":[{"name":"siteIds","required":true,"in":"query","description":"Comma-separated list of site IDs to filter tanks by","schema":{"example":"1,2,3","type":"string"}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/SiteTankGroupDto"}}}}},"400":{"description":"Validation failed"},"401":{"description":"Missing, expired, or invalid bearer token"},"403":{"description":"Caller lacks permission for the requested site"},"404":{"description":"A referenced sensor, meter, pump, or tank group does not exist"},"429":{"description":"Rate limit exceeded"}},"tags":["Equipment"],"security":[{"bearer":[]}]}},"/v1/edge/user/pumps":{"get":{"operationId":"UserController_getPumps","summary":"Get pumps for the provided site IDs","parameters":[{"name":"siteIds","required":true,"in":"query","description":"Comma-separated list of site IDs to filter pumps by","schema":{"example":"1,2,3","type":"string"}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/SitePumpDto"}}}}},"400":{"description":"Validation failed"},"401":{"description":"Missing, expired, or invalid bearer token"},"403":{"description":"Caller lacks permission for the requested site"},"404":{"description":"A referenced sensor, meter, pump, or tank group does not exist"},"429":{"description":"Rate limit exceeded"}},"tags":["Equipment"],"security":[{"bearer":[]}]}},"/v1/edge/live/site/{siteId}":{"get":{"operationId":"LiveDataController_getSiteLiveData","summary":"Get last known live values for all equipment at a site","description":"Returns the current database values for site sensors, flow meters, pumps, tank groups, actuators, burners, charge pumps, ESD buttons, filters, lanes, lighting zones, power supplies, separators, and wellheads in a site/config-style payload.","parameters":[{"name":"siteId","required":true,"in":"path","description":"Site ID","schema":{"type":"string"}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SiteLiveDataResponseDto"}}}},"400":{"description":"Validation failed"},"401":{"description":"Missing, expired, or invalid bearer token"},"403":{"description":"Caller lacks permission for the requested site"},"429":{"description":"Rate limit exceeded"}},"tags":["Live Data Download"],"security":[{"bearer":[]}]}},"/v1/edge/live/site/sensors/{siteId}":{"get":{"operationId":"LiveDataController_getSiteSensorsLiveData","summary":"Get last known live sensor values for a site","description":"Returns only current site sensor database values for consumers that do not need the full live site payload.","parameters":[{"name":"siteId","required":true,"in":"path","description":"Site ID","schema":{"type":"string"}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SiteLiveSensorsResponseDto"}}}},"400":{"description":"Validation failed"},"401":{"description":"Missing, expired, or invalid bearer token"},"403":{"description":"Caller lacks permission for the requested site"},"429":{"description":"Rate limit exceeded"}},"tags":["Live Data Download"],"security":[{"bearer":[]}]}},"/v1/edge/live/site/meters/{siteId}":{"get":{"operationId":"LiveDataController_getSiteMetersLiveData","summary":"Get last known live meter values for a site","description":"Returns only current site flow meter database values for consumers that do not need the full live site payload.","parameters":[{"name":"siteId","required":true,"in":"path","description":"Site ID","schema":{"type":"string"}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SiteLiveMetersResponseDto"}}}},"400":{"description":"Validation failed"},"401":{"description":"Missing, expired, or invalid bearer token"},"403":{"description":"Caller lacks permission for the requested site"},"429":{"description":"Rate limit exceeded"}},"tags":["Live Data Download"],"security":[{"bearer":[]}]}},"/v1/edge/live/site/pumps/{siteId}":{"get":{"operationId":"LiveDataController_getSitePumpsLiveData","summary":"Get last known live pump values for a site","description":"Returns only current site pump database values for consumers that do not need the full live site payload.","parameters":[{"name":"siteId","required":true,"in":"path","description":"Site ID","schema":{"type":"string"}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SiteLivePumpsResponseDto"}}}},"400":{"description":"Validation failed"},"401":{"description":"Missing, expired, or invalid bearer token"},"403":{"description":"Caller lacks permission for the requested site"},"429":{"description":"Rate limit exceeded"}},"tags":["Live Data Download"],"security":[{"bearer":[]}]}},"/v1/edge/live/site/tanks/{siteId}":{"get":{"operationId":"LiveDataController_getSiteTanksLiveData","summary":"Get last known live tank values for a site","description":"Returns only current site tank group database values for consumers that do not need the full live site payload.","parameters":[{"name":"siteId","required":true,"in":"path","description":"Site ID","schema":{"type":"string"}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SiteLiveTanksResponseDto"}}}},"400":{"description":"Validation failed"},"401":{"description":"Missing, expired, or invalid bearer token"},"403":{"description":"Caller lacks permission for the requested site"},"429":{"description":"Rate limit exceeded"}},"tags":["Live Data Download"],"security":[{"bearer":[]}]}},"/v1/edge/live/site/actuators/{siteId}":{"get":{"operationId":"LiveDataController_getSiteActuatorsLiveData","summary":"Get last known live actuator values for a site","description":"Returns only current site actuator database values for consumers that do not need the full live site payload.","parameters":[{"name":"siteId","required":true,"in":"path","description":"Site ID","schema":{"type":"string"}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SiteLiveActuatorsResponseDto"}}}},"400":{"description":"Validation failed"},"401":{"description":"Missing, expired, or invalid bearer token"},"403":{"description":"Caller lacks permission for the requested site"},"429":{"description":"Rate limit exceeded"}},"tags":["Live Data Download"],"security":[{"bearer":[]}]}},"/v1/edge/live/site/burners/{siteId}":{"get":{"operationId":"LiveDataController_getSiteBurnersLiveData","summary":"Get last known live burner values for a site","description":"Returns only current site burner database values for consumers that do not need the full live site payload.","parameters":[{"name":"siteId","required":true,"in":"path","description":"Site ID","schema":{"type":"string"}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SiteLiveBurnersResponseDto"}}}},"400":{"description":"Validation failed"},"401":{"description":"Missing, expired, or invalid bearer token"},"403":{"description":"Caller lacks permission for the requested site"},"429":{"description":"Rate limit exceeded"}},"tags":["Live Data Download"],"security":[{"bearer":[]}]}},"/v1/edge/live/site/charge-pumps/{siteId}":{"get":{"operationId":"LiveDataController_getSiteChargePumpsLiveData","summary":"Get last known live charge pump values for a site","description":"Returns only current site charge pump database values for consumers that do not need the full live site payload.","parameters":[{"name":"siteId","required":true,"in":"path","description":"Site ID","schema":{"type":"string"}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SiteLiveChargePumpsResponseDto"}}}},"400":{"description":"Validation failed"},"401":{"description":"Missing, expired, or invalid bearer token"},"403":{"description":"Caller lacks permission for the requested site"},"429":{"description":"Rate limit exceeded"}},"tags":["Live Data Download"],"security":[{"bearer":[]}]}},"/v1/edge/live/site/esd-buttons/{siteId}":{"get":{"operationId":"LiveDataController_getSiteEsdButtonsLiveData","summary":"Get last known live ESD button values for a site","description":"Returns only current site emergency shutdown button database values for consumers that do not need the full live site payload.","parameters":[{"name":"siteId","required":true,"in":"path","description":"Site ID","schema":{"type":"string"}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SiteLiveEsdButtonsResponseDto"}}}},"400":{"description":"Validation failed"},"401":{"description":"Missing, expired, or invalid bearer token"},"403":{"description":"Caller lacks permission for the requested site"},"429":{"description":"Rate limit exceeded"}},"tags":["Live Data Download"],"security":[{"bearer":[]}]}},"/v1/edge/live/site/filters/{siteId}":{"get":{"operationId":"LiveDataController_getSiteFiltersLiveData","summary":"Get last known live filter values for a site","description":"Returns only current site filter database values for consumers that do not need the full live site payload.","parameters":[{"name":"siteId","required":true,"in":"path","description":"Site ID","schema":{"type":"string"}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SiteLiveFiltersResponseDto"}}}},"400":{"description":"Validation failed"},"401":{"description":"Missing, expired, or invalid bearer token"},"403":{"description":"Caller lacks permission for the requested site"},"429":{"description":"Rate limit exceeded"}},"tags":["Live Data Download"],"security":[{"bearer":[]}]}},"/v1/edge/live/site/lanes/{siteId}":{"get":{"operationId":"LiveDataController_getSiteLanesLiveData","summary":"Get last known live lane values for a site","description":"Returns only current site lane database values for consumers that do not need the full live site payload.","parameters":[{"name":"siteId","required":true,"in":"path","description":"Site ID","schema":{"type":"string"}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SiteLiveLanesResponseDto"}}}},"400":{"description":"Validation failed"},"401":{"description":"Missing, expired, or invalid bearer token"},"403":{"description":"Caller lacks permission for the requested site"},"429":{"description":"Rate limit exceeded"}},"tags":["Live Data Download"],"security":[{"bearer":[]}]}},"/v1/edge/live/site/lighting-zones/{siteId}":{"get":{"operationId":"LiveDataController_getSiteLightingZonesLiveData","summary":"Get last known live lighting zone values for a site","description":"Returns only current site lighting area database values for consumers that do not need the full live site payload.","parameters":[{"name":"siteId","required":true,"in":"path","description":"Site ID","schema":{"type":"string"}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SiteLiveLightingZonesResponseDto"}}}},"400":{"description":"Validation failed"},"401":{"description":"Missing, expired, or invalid bearer token"},"403":{"description":"Caller lacks permission for the requested site"},"429":{"description":"Rate limit exceeded"}},"tags":["Live Data Download"],"security":[{"bearer":[]}]}},"/v1/edge/live/site/power-supplies/{siteId}":{"get":{"operationId":"LiveDataController_getSitePowerSuppliesLiveData","summary":"Get last known live power supply values for a site","description":"Returns only current site power supply database values for consumers that do not need the full live site payload.","parameters":[{"name":"siteId","required":true,"in":"path","description":"Site ID","schema":{"type":"string"}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SiteLivePowerSuppliesResponseDto"}}}},"400":{"description":"Validation failed"},"401":{"description":"Missing, expired, or invalid bearer token"},"403":{"description":"Caller lacks permission for the requested site"},"429":{"description":"Rate limit exceeded"}},"tags":["Live Data Download"],"security":[{"bearer":[]}]}},"/v1/edge/live/site/separators/{siteId}":{"get":{"operationId":"LiveDataController_getSiteSeparatorsLiveData","summary":"Get last known live separator values for a site","description":"Returns only current site separator database values for consumers that do not need the full live site payload.","parameters":[{"name":"siteId","required":true,"in":"path","description":"Site ID","schema":{"type":"string"}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SiteLiveSeparatorsResponseDto"}}}},"400":{"description":"Validation failed"},"401":{"description":"Missing, expired, or invalid bearer token"},"403":{"description":"Caller lacks permission for the requested site"},"429":{"description":"Rate limit exceeded"}},"tags":["Live Data Download"],"security":[{"bearer":[]}]}},"/v1/edge/live/site/wellheads/{siteId}":{"get":{"operationId":"LiveDataController_getSiteWellheadsLiveData","summary":"Get last known live wellhead values for a site","description":"Returns only current site wellhead database values for consumers that do not need the full live site payload.","parameters":[{"name":"siteId","required":true,"in":"path","description":"Site ID","schema":{"type":"string"}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SiteLiveWellheadsResponseDto"}}}},"400":{"description":"Validation failed"},"401":{"description":"Missing, expired, or invalid bearer token"},"403":{"description":"Caller lacks permission for the requested site"},"429":{"description":"Rate limit exceeded"}},"tags":["Live Data Download"],"security":[{"bearer":[]}]}}},"info":{"title":"SitePro Platform API","description":"REST API for managing SitePro organizations, companies, customers, sites, tickets, and regulatory compliance forms.\n\n## Authentication\nAll endpoints require a valid JWT bearer token. Include it in the `Authorization` header:\n```\nAuthorization: Bearer <token>\n```\n\n## Versioning\nThe API uses URI-based versioning. All endpoints are prefixed with `/v1/`.\n\n## Pagination\nList endpoints return paginated responses with the following structure:\n```json\n{\n  \"data\": [],\n  \"meta\": {\n    \"total\": 100,\n    \"lastPage\": 5,\n    \"currentPage\": 1,\n    \"perPage\": 20,\n    \"prev\": null,\n    \"next\": 2\n  }\n}\n```\n\n## Errors\nError responses follow a consistent format:\n```json\n{\n  \"statusCode\": 400,\n  \"message\": \"Validation failed\",\n  \"timestamp\": \"2026-01-01T00:00:00.000Z\",\n  \"path\": \"/v1/users\"\n}\n```\n\nA request with a missing, expired, or invalid bearer token returns `401 Unauthorized`.\nA valid token without access to the requested resource returns `403 Forbidden`.\n\n## Rate limiting\nEach user may make 100 requests per 60 seconds to each endpoint.\nRequests without a valid bearer token are limited per IP address instead. Requests over the limit\nreturn `429 Too Many Requests`; wait for the window to reset before retrying.","version":"1.0","contact":{}},"tags":[],"servers":[],"components":{"securitySchemes":{"bearer":{"scheme":"bearer","bearerFormat":"JWT","type":"http"}},"schemas":{"IssueTokenDto":{"type":"object","properties":{"username":{"type":"string","example":"Username"},"password":{"type":"string","example":"Password"}},"required":["username","password"]},"IssueTokenResponseDto":{"type":"object","properties":{"access_token":{"type":"string","example":"AccessToken"},"token_type":{"type":"string","example":"Type"},"expires_in":{"type":"number","example":"Expires In"},"scope":{"type":"string","example":"Scope"}},"required":["access_token","token_type","expires_in","scope"]},"PaginatedMetaData":{"type":"object","properties":{"total":{"type":"number","example":1},"lastPage":{"type":"number","example":1},"currentPage":{"type":"number","example":1},"perPage":{"type":"number","example":20},"prev":{"type":"number","example":null,"nullable":true},"next":{"type":"number","example":null,"nullable":true}},"required":["total","lastPage","currentPage","perPage","prev","next"]},"PaginatedResponse":{"type":"object","properties":{"data":{"type":"array","items":{"type":"string"}},"meta":{"$ref":"#/components/schemas/PaginatedMetaData"}},"required":["data","meta"]},"Site":{"type":"object","properties":{"SiteID":{"type":"number","example":9},"ProjectID":{"type":"number","example":9},"Name":{"type":"string","example":"JDoe Ranch"},"Latitude":{"type":"string","example":"33.508"},"Longitude":{"type":"string","example":"-101.846"},"Active":{"type":"boolean","example":true},"Address":{"type":"string","example":null,"nullable":true},"AddressLine1":{"type":"string","example":null,"nullable":true},"AddressLine2":{"type":"string","example":null,"nullable":true},"SiteProCompanyID":{"type":"number","example":999}},"required":["SiteID","ProjectID","Name","Latitude","Longitude","Active","Address","AddressLine1","AddressLine2","SiteProCompanyID"]},"PumpLogsLoadDto":{"type":"object","properties":{"pumpIds":{"example":[1234,1235],"description":"Pump IDs to fetch logs for (1-10)","type":"array","items":{"type":"number"}},"start":{"type":"string","example":"2024-07-01T00:00:00Z","description":"ISO 8601 UTC start timestamp"},"end":{"type":"string","example":"2024-08-01T00:00:00Z","description":"ISO 8601 UTC end timestamp"},"interval":{"type":"string","enum":["DayData","HourData"],"example":"DayData"}},"required":["pumpIds","start","end","interval"]},"SummaryLogItemDto":{"type":"object","properties":{"min":{"type":"number","example":0},"max":{"type":"number","example":55},"avg":{"type":"number","example":24.19}},"required":["min","max","avg"]},"PumpLogSummaryDto":{"type":"object","properties":{"siteName":{"type":"string","example":"Test Site"},"siteId":{"type":"number","example":1},"pumpName":{"type":"string","example":"Test Pump 1"},"pumpId":{"type":"number","example":1234},"date":{"type":"string","example":"2024-07-01T05:00:00.000Z"},"frequency":{"nullable":true,"allOf":[{"$ref":"#/components/schemas/SummaryLogItemDto"}]},"headPressure":{"nullable":true,"allOf":[{"$ref":"#/components/schemas/SummaryLogItemDto"}]},"suctionPressure":{"nullable":true,"allOf":[{"$ref":"#/components/schemas/SummaryLogItemDto"}]},"outputCurrent":{"nullable":true,"allOf":[{"$ref":"#/components/schemas/SummaryLogItemDto"}]},"outputVoltage":{"nullable":true,"allOf":[{"$ref":"#/components/schemas/SummaryLogItemDto"}]}},"required":["siteName","siteId","pumpName","pumpId","date","frequency","headPressure","suctionPressure","outputCurrent","outputVoltage"]},"MeterLogsLoadDto":{"type":"object","properties":{"meterIds":{"example":[555],"description":"Meter IDs to fetch logs for (1-10)","type":"array","items":{"type":"number"}},"start":{"type":"string","example":"2024-07-01T00:00:00Z"},"end":{"type":"string","example":"2024-08-01T00:00:00Z"},"interval":{"type":"string","enum":["DayData","HourData"],"example":"DayData"}},"required":["meterIds","start","end","interval"]},"MeterLogSummaryDto":{"type":"object","properties":{"siteName":{"type":"string","example":"Test Site"},"siteId":{"type":"number","example":123},"meterName":{"type":"string","example":"Test Meter"},"meterId":{"type":"number","example":555},"totalizerId":{"type":"number","example":789,"nullable":true},"flowDirection":{"type":"string","example":"PassThrough","description":"Pipeline flow direction (None | In | Out | Downhole | PassThrough)"},"date":{"type":"string","example":"2024-07-01T05:00:00.000Z"},"flow":{"nullable":true,"allOf":[{"$ref":"#/components/schemas/SummaryLogItemDto"}]},"pressure":{"nullable":true,"allOf":[{"$ref":"#/components/schemas/SummaryLogItemDto"}]},"valvePosition":{"nullable":true,"allOf":[{"$ref":"#/components/schemas/SummaryLogItemDto"}]},"dayVolume":{"nullable":true,"allOf":[{"$ref":"#/components/schemas/SummaryLogItemDto"}]},"totalVolume":{"nullable":true,"allOf":[{"$ref":"#/components/schemas/SummaryLogItemDto"}]}},"required":["siteName","siteId","meterName","meterId","totalizerId","flowDirection","date","flow","pressure","valvePosition","dayVolume","totalVolume"]},"SensorLogsLoadDto":{"type":"object","properties":{"sensorIds":{"example":[42],"description":"Sensor IDs to fetch logs for (1-10)","type":"array","items":{"type":"number"}},"start":{"type":"string","example":"2024-07-01T00:00:00Z"},"end":{"type":"string","example":"2024-08-01T00:00:00Z"},"interval":{"type":"string","enum":["DayData","HourData"],"example":"DayData"}},"required":["sensorIds","start","end","interval"]},"SensorLogSummaryDto":{"type":"object","properties":{"siteName":{"type":"string","example":"Test Site"},"siteId":{"type":"number","example":1},"sensorName":{"type":"string","example":"Test Sensor"},"sensorId":{"type":"number","example":42},"isManual":{"type":"boolean","example":false,"nullable":true},"isPassthrough":{"type":"boolean","example":false,"nullable":true},"equation":{"type":"string","example":"","nullable":true},"units":{"type":"string","example":"PSI","nullable":true},"date":{"type":"string","example":"2024-07-01T05:00:00.000Z"},"value":{"nullable":true,"allOf":[{"$ref":"#/components/schemas/SummaryLogItemDto"}]}},"required":["siteName","siteId","sensorName","sensorId","isManual","isPassthrough","equation","units","date","value"]},"SensorLogsRawDto":{"type":"object","properties":{"sensorIds":{"example":[42],"description":"Single sensor ID","type":"array","items":{"type":"number"}},"start":{"type":"string","example":"2024-07-01T00:00:00Z"},"end":{"type":"string","example":"2024-08-01T00:00:00Z"}},"required":["sensorIds","start","end"]},"SensorRawLogDto":{"type":"object","properties":{"siteName":{"type":"string","example":"Test Site"},"sensorName":{"type":"string","example":"Test Sensor"},"isManual":{"type":"boolean","example":false,"nullable":true},"isPassthrough":{"type":"boolean","example":false,"nullable":true},"equation":{"type":"string","example":"","nullable":true},"sensorId":{"type":"number","example":42},"date":{"type":"number","example":132579360000000000,"description":"Windows FILETIME (100-ns ticks since 1601)"},"value":{"type":"number","example":12.3,"nullable":true},"reading":{"type":"number","example":12.3,"nullable":true},"valueUnits":{"type":"string","example":"PSI","nullable":true},"readUnits":{"type":"string","example":"PSI","nullable":true}},"required":["siteName","sensorName","isManual","isPassthrough","equation","sensorId","date","value","reading","valueUnits","readUnits"]},"TankLogsLoadDto":{"type":"object","properties":{"tankIds":{"example":[55],"description":"Tank group IDs (1-10)","type":"array","items":{"type":"number"}},"start":{"type":"string","example":"2024-07-01T00:00:00Z"},"end":{"type":"string","example":"2024-08-01T00:00:00Z"},"interval":{"type":"string","enum":["DayData","HourData"],"example":"DayData"}},"required":["tankIds","start","end","interval"]},"TankLogSummaryDto":{"type":"object","properties":{"siteName":{"type":"string","example":"Test Site"},"siteId":{"type":"number","example":1},"tankGroupName":{"type":"string","example":"Test Tank Group"},"tankGroupId":{"type":"number","example":55},"date":{"type":"string","example":"2024-07-01T05:00:00.000Z"},"totalHeight":{"nullable":true,"allOf":[{"$ref":"#/components/schemas/SummaryLogItemDto"}]},"totalVolume":{"nullable":true,"allOf":[{"$ref":"#/components/schemas/SummaryLogItemDto"}]},"oilHeight":{"nullable":true,"allOf":[{"$ref":"#/components/schemas/SummaryLogItemDto"}]},"oilVolume":{"nullable":true,"allOf":[{"$ref":"#/components/schemas/SummaryLogItemDto"}]},"waterHeight":{"nullable":true,"allOf":[{"$ref":"#/components/schemas/SummaryLogItemDto"}]},"waterVolume":{"nullable":true,"allOf":[{"$ref":"#/components/schemas/SummaryLogItemDto"}]},"pressure":{"nullable":true,"allOf":[{"$ref":"#/components/schemas/SummaryLogItemDto"}]}},"required":["siteName","siteId","tankGroupName","tankGroupId","date","totalHeight","totalVolume","oilHeight","oilVolume","waterHeight","waterVolume","pressure"]},"TransactionLogsLoadDto":{"type":"object","properties":{"siteIds":{"example":[1234],"description":"Site IDs to fetch transactions for","type":"array","items":{"type":"number"}},"start":{"type":"string","example":"2024-07-01T00:00:00Z"},"end":{"type":"string","example":"2024-08-01T00:00:00Z"},"motionCap":{"type":"boolean","example":false,"description":"When true, populate `imageUUIDs` with motion-capture image UUIDs within a 10-minute window of the ticket start"},"modifiedAfter":{"type":"string","example":"2024-07-15T00:00:00Z","description":"When set, only transactions modified after this ISO 8601 UTC timestamp are returned"}},"required":["siteIds","start","end"]},"TransactionStatusDto":{"type":"object","properties":{"review":{"type":"string","example":"Fully Approved"},"regulatory":{"type":"boolean","example":true}},"required":["review","regulatory"]},"TransactionSourceInfoDto":{"type":"object","properties":{"state":{"type":"string","example":"TX","nullable":true},"company":{"type":"string","example":"TEST OPERATING","nullable":true},"siteID":{"type":"number","example":4321,"nullable":true},"siteName":{"type":"string","example":"TEST SITE 1","nullable":true},"districtNumber":{"type":"number","example":1,"nullable":true},"county":{"type":"string","example":"HARRISON","nullable":true},"operatorName":{"type":"string","example":"TEST OPERATING","nullable":true},"operatorNumber":{"type":"number","example":5678,"nullable":true},"leaseName":{"type":"string","example":"Test Lease","nullable":true},"leaseNumber":{"type":"number","example":9012,"nullable":true},"fieldName":{"type":"string","example":"Test Field","nullable":true},"fieldNumber":{"type":"number","example":3456,"nullable":true},"wellName":{"type":"string","example":"Test Well | 1a","nullable":true},"API":{"type":"string","example":"123456789","nullable":true},"drillingPermitNumber":{"type":"number","example":1234,"nullable":true}},"required":["state","company","siteID","siteName","districtNumber","county","operatorName","operatorNumber","leaseName","leaseNumber","fieldName","fieldNumber","wellName","API","drillingPermitNumber"]},"TransactionServiceCompanyDto":{"type":"object","properties":{"companyName":{"type":"string","example":"Test Trucking Company","nullable":true},"waterHaulerPermitNum":{"type":"number","example":123456,"nullable":true},"driver":{"type":"string","example":"SitePro Driver","nullable":true},"truckNum":{"type":"string","example":"123","nullable":true},"ticketNum":{"type":"number","example":123456,"nullable":true},"manifestNum":{"type":"number","example":123456,"nullable":true},"type":{"type":"string","example":"Disposal"}},"required":["companyName","waterHaulerPermitNum","driver","truckNum","ticketNum","manifestNum","type"]},"TransactionDestinationInfoDto":{"type":"object","properties":{"companyName":{"type":"string","example":"SitePro Demo","nullable":true},"siteName":{"type":"string","example":"TEST SITE 2","nullable":true},"siteID":{"type":"number","example":1234,"nullable":true},"ticketNum":{"type":"number","example":654321,"nullable":true},"ticketPrefix":{"type":"string","example":"","nullable":true}},"required":["companyName","siteName","siteID","ticketNum","ticketPrefix"]},"TransactionOnSiteTimesDto":{"type":"object","properties":{"sourceTime":{"type":"string","example":"00:00"},"destinationTime":{"type":"string","example":"00:00"}},"required":["sourceTime","destinationTime"]},"TransactionLogDto":{"type":"object","properties":{"siteName":{"type":"string","example":"Test SWD","nullable":true},"status":{"$ref":"#/components/schemas/TransactionStatusDto"},"startTime":{"type":"string","example":"2017-01-26T14:43:00.000Z"},"endTime":{"type":"string","example":"2017-01-26T14:45:00.000Z"},"lastModified":{"type":"string","example":"2024-06-15T12:00:00.000Z","nullable":true},"sourceSiteTimeZone":{"type":"string","example":"Central Standard Time","nullable":true},"source":{"$ref":"#/components/schemas/TransactionSourceInfoDto"},"service":{"$ref":"#/components/schemas/TransactionServiceCompanyDto"},"destination":{"$ref":"#/components/schemas/TransactionDestinationInfoDto"},"laneName":{"type":"string","example":"Test Lane 1","nullable":true},"amount":{"type":"number","example":180,"nullable":true},"meteredAmount":{"type":"number","example":183.12,"nullable":true},"units":{"type":"string","example":"bbl","nullable":true},"onSiteTimes":{"$ref":"#/components/schemas/TransactionOnSiteTimesDto"},"rate":{"type":"number","example":7.2,"nullable":true},"notes":{"type":"string","example":"A Note left on the ticket.","nullable":true},"fluidType":{"type":"string","example":"Production","nullable":true},"avgDensity":{"type":"number","example":0},"imageUUIDs":{"example":[],"description":"Only populated when request body has motionCap=true","type":"array","items":{"type":"string"}},"ticketImage":{"type":"string","example":"F56A4180-65AA-42EC-A945-5FD21DEC0536"},"ticketID":{"type":"number","example":157365},"includeInRegulatoryReport":{"type":"boolean","example":true,"nullable":true}},"required":["siteName","status","startTime","endTime","lastModified","sourceSiteTimeZone","source","service","destination","laneName","amount","meteredAmount","units","onSiteTimes","rate","notes","fluidType","imageUUIDs","ticketImage","ticketID","includeInRegulatoryReport"]},"TransactionChangeLogFiltersDto":{"type":"object","properties":{"siteIds":{"example":[12345,54321],"type":"array","items":{"type":"number"}},"ticketNums":{"example":[1,2,3],"type":"array","items":{"type":"number"}}}},"TransactionChangeLogsLoadDto":{"type":"object","properties":{"start":{"type":"string","example":"2024-07-01T00:00:00Z"},"end":{"type":"string","example":"2024-08-01T00:00:00Z","description":"Max 60-day span from start"},"filters":{"$ref":"#/components/schemas/TransactionChangeLogFiltersDto"}},"required":["start","end"]},"TransactionChangeItemDto":{"type":"object","properties":{"PropertyName":{"type":"string","example":"HaulRoutStartTime"},"OriginalValue":{"type":"string","example":""},"NewValue":{"type":"string","example":"7/21/2021 2:00:00 PM"}},"required":["PropertyName","OriginalValue","NewValue"]},"TransactionChangeLogDto":{"type":"object","properties":{"TransactionID":{"type":"number","example":12345678},"LogTypeName":{"type":"string","example":"Main Ticket","description":"1=Main Ticket | 2=Source Regulatory | 3=Destination Regulatory | 4=Disposal Fee | 5=Service Item"},"LogType":{"type":"number","example":1},"TicketNumber":{"type":"number","example":54},"SiteID":{"type":"number","example":12345},"SiteName":{"type":"string","example":"Test SWD"},"SiteCompany":{"type":"string","example":"SitePro Demo"},"Editor":{"type":"string","example":"John Doe"},"EditorCompany":{"type":"string","example":"Testers LLC"},"ChangeDate":{"type":"string","example":"2019-07-21T15:00:00.000Z"},"ChangeItems":{"type":"array","items":{"$ref":"#/components/schemas/TransactionChangeItemDto"}}},"required":["TransactionID","LogTypeName","LogType","TicketNumber","SiteID","SiteName","SiteCompany","Editor","EditorCompany","ChangeDate","ChangeItems"]},"ImagesPayloadDto":{"type":"object","properties":{"ImageUUIDs":{"example":["c56a4180-65aa-42ec-a945-5fd21dec0538"],"description":"UUIDs of images to bundle into a zip","type":"array","items":{"type":"string"}}},"required":["ImageUUIDs"]},"RegisterDeviceRefDto":{"type":"object","properties":{"DeviceName":{"type":"string","description":"Modbus device name","example":"PLC-1"},"SlaveAddress":{"type":"number","description":"Modbus slave address","example":1}},"required":["DeviceName","SlaveAddress"]},"RegisterDto":{"type":"object","properties":{"SiteIODeviceRegisterID":{"type":"string","description":"SiteIODeviceRegisterID (bigint serialized as string)","example":"10231"},"SiteModbusInOutDeviceID":{"type":"number","description":"Owning Modbus device id","example":55},"Register":{"type":"number","description":"Modbus register address","example":40001},"RegisterDataType":{"type":"number","description":"Register data type code","example":3},"RegisterSize":{"type":"number","description":"Register size (words)","example":2},"RegisterClassification":{"type":"number","description":"Register classification code","example":1},"RegisterAccessType":{"type":"number","description":"Register access type code","example":0,"nullable":true},"BitIndex":{"type":"number","description":"Bit index within the register","example":0,"nullable":true},"ScalingMultiplierValue":{"type":"number","description":"Scaling multiplier","example":1,"nullable":true},"ScalingDividerValue":{"type":"number","description":"Scaling divider","example":1,"nullable":true},"ScalingEquation":{"type":"string","description":"Read scaling equation","nullable":true},"WriteScalingEquation":{"type":"string","description":"Write scaling equation","nullable":true},"Units":{"type":"string","description":"Units label","example":"psi","nullable":true},"UnitID":{"type":"number","description":"Unit id","example":7,"nullable":true},"Name":{"type":"string","description":"Register name","nullable":true},"Description":{"type":"string","description":"Register description","nullable":true},"Deleted":{"type":"boolean","description":"Soft-delete flag","example":false,"nullable":true},"SiteModbusInOutDevices":{"description":"Owning Modbus device (name + slave address)","allOf":[{"$ref":"#/components/schemas/RegisterDeviceRefDto"}]},"ConnectionName":{"type":"string","description":"Connection name (sensor-attached registers)","nullable":true},"ConnectionSlaveAddress":{"type":"number","description":"Connection slave address","nullable":true},"ConnectionSensorID":{"type":"number","description":"Connection sensor id","nullable":true}},"required":["SiteIODeviceRegisterID","SiteModbusInOutDeviceID","Register","RegisterDataType","RegisterSize","RegisterClassification"]},"SiteSensorDto":{"type":"object","properties":{"SiteSensorID":{"type":"number","example":4321},"SiteID":{"type":"number","example":789},"Name":{"type":"string","example":"Tank 1 Level"},"Units":{"type":"string","example":"ft"},"Active":{"type":"boolean","example":true},"ConvertedUnits":{"type":"string","example":"ft","nullable":true},"SiteSensorTypeID":{"type":"number","example":3,"nullable":true},"SiteSensorSubTypeID":{"type":"number","example":1,"nullable":true},"AlarmEnabled":{"type":"boolean","example":true,"nullable":true},"LoggingEnabled":{"type":"boolean","example":true,"nullable":true},"UnitID":{"type":"number","example":7,"nullable":true},"ConvertedUnitID":{"type":"number","example":7,"nullable":true},"EquipmentID":{"type":"string","description":"EquipmentID (bigint serialized as string)","example":"99001","nullable":true},"EquipmentTypeID":{"type":"number","example":10,"nullable":true},"Latitude":{"type":"number","description":"Latitude (Decimal serialized as number)","example":33.508,"nullable":true},"Longitude":{"type":"number","description":"Longitude (Decimal serialized as number)","example":-101.855,"nullable":true}},"required":["SiteSensorID","SiteID","Name","Units","Active"]},"SensorConfigDto":{"type":"object","properties":{"sensor":{"$ref":"#/components/schemas/SiteSensorDto"},"registers":{"type":"array","items":{"$ref":"#/components/schemas/RegisterDto"}}},"required":["sensor","registers"]},"MeterRegistersDto":{"type":"object","properties":{"meterRegisters":{"type":"object","description":"Meter registers keyed by role name; value null when unconfigured","additionalProperties":{"allOf":[{"$ref":"#/components/schemas/RegisterDto"}],"nullable":true}},"sensorRegisters":{"type":"array","items":{"$ref":"#/components/schemas/RegisterDto"}}},"required":["meterRegisters","sensorRegisters"]},"SiteFlowMeterDto":{"type":"object","properties":{"SiteFlowMeterID":{"type":"number","example":220},"SiteID":{"type":"number","example":789},"Name":{"type":"string","example":"Intake Meter"},"VolumeUnits":{"type":"string","example":"bbl","nullable":true},"FlowUnits":{"type":"string","example":"bbl/d","nullable":true},"VolumeUnitID":{"type":"number","example":4,"nullable":true},"MeterTypeID":{"type":"number","example":1,"nullable":true},"SiteSensorID":{"type":"number","example":4321,"nullable":true},"SiteFluidTypeID":{"type":"number","example":2,"nullable":true},"LoggingEnabled":{"type":"boolean","example":true,"nullable":true},"Latitude":{"type":"number","example":33.508,"nullable":true},"Longitude":{"type":"number","example":-101.855,"nullable":true}},"required":["SiteFlowMeterID","SiteID","Name"]},"MeterConfigDto":{"type":"object","properties":{"meter":{"$ref":"#/components/schemas/SiteFlowMeterDto"},"meterRegisters":{"type":"object","additionalProperties":{"allOf":[{"$ref":"#/components/schemas/RegisterDto"}],"nullable":true}},"sensorRegisters":{"type":"array","items":{"$ref":"#/components/schemas/RegisterDto"}}},"required":["meter","meterRegisters","sensorRegisters"]},"PumpRegistersDto":{"type":"object","properties":{"pumpRegisters":{"type":"object","description":"Pump registers keyed by role name; value null when unconfigured","additionalProperties":{"allOf":[{"$ref":"#/components/schemas/RegisterDto"}],"nullable":true}},"sensorRegisters":{"type":"array","items":{"$ref":"#/components/schemas/RegisterDto"}}},"required":["pumpRegisters","sensorRegisters"]},"SitePumpDto":{"type":"object","properties":{"SitePumpID":{"type":"number","example":610},"SiteID":{"type":"number","example":789},"Name":{"type":"string","example":"Transfer Pump"},"IsVFD":{"type":"boolean","example":true},"Active":{"type":"boolean","example":true},"SitePumpTypeID":{"type":"number","example":2,"nullable":true},"MaximumFrequency":{"type":"number","example":60},"MinimumFrequency":{"type":"number","example":0},"MaximumFlow":{"type":"number","example":500},"MinimumFlow":{"type":"number","example":0},"LoggingEnabled":{"type":"boolean","example":true,"nullable":true},"DesignTypeID":{"type":"number","example":1,"nullable":true},"Latitude":{"type":"number","example":33.508,"nullable":true},"Longitude":{"type":"number","example":-101.855,"nullable":true}},"required":["SitePumpID","SiteID","Name","IsVFD","Active","MaximumFrequency","MinimumFrequency","MaximumFlow","MinimumFlow"]},"PumpConfigDto":{"type":"object","properties":{"pump":{"$ref":"#/components/schemas/SitePumpDto"},"pumpRegisters":{"type":"object","additionalProperties":{"allOf":[{"$ref":"#/components/schemas/RegisterDto"}],"nullable":true}},"sensorRegisters":{"type":"array","items":{"$ref":"#/components/schemas/RegisterDto"}}},"required":["pump","pumpRegisters","sensorRegisters"]},"TankRegistersDto":{"type":"object","properties":{"tankRegisters":{"type":"object","description":"Tank registers keyed by role name; value null when unconfigured","additionalProperties":{"allOf":[{"$ref":"#/components/schemas/RegisterDto"}],"nullable":true}},"sensorRegisters":{"type":"object","description":"Tank sensor registers keyed by sensor field name","additionalProperties":{"$ref":"#/components/schemas/RegisterDto"}}},"required":["tankRegisters","sensorRegisters"]},"SiteTankGroupDto":{"type":"object","properties":{"SiteTankGroupID":{"type":"number","example":300},"SiteID":{"type":"number","example":789},"Name":{"type":"string","example":"Battery A"},"Capacity":{"type":"number","example":500},"MaximumHeightLevel":{"type":"number","example":20},"MinimumHeightLevel":{"type":"number","example":0},"NumberOfTanks":{"type":"number","example":4},"IsOil":{"type":"boolean","example":true},"SiteTankGroupTypeID":{"type":"number","example":1},"Active":{"type":"boolean","example":true},"VolumeUnitID":{"type":"number","example":4,"nullable":true},"LoggingEnabled":{"type":"boolean","example":true,"nullable":true},"Latitude":{"type":"number","example":33.508,"nullable":true},"Longitude":{"type":"number","example":-101.855,"nullable":true}},"required":["SiteTankGroupID","SiteID","Name","Capacity","MaximumHeightLevel","MinimumHeightLevel","NumberOfTanks","IsOil","SiteTankGroupTypeID","Active"]},"TankConfigDto":{"type":"object","properties":{"tankGroup":{"$ref":"#/components/schemas/SiteTankGroupDto"},"tankRegisters":{"type":"object","additionalProperties":{"allOf":[{"$ref":"#/components/schemas/RegisterDto"}],"nullable":true}},"sensorRegisters":{"type":"object","description":"Tank sensor registers keyed by sensor field name","additionalProperties":{"$ref":"#/components/schemas/RegisterDto"}}},"required":["tankGroup","tankRegisters","sensorRegisters"]},"SiteActuatorDto":{"type":"object","properties":{"SiteActuatorID":{"type":"number","example":1},"SiteID":{"type":"number","example":789},"SiteActuatorStatusID":{"type":"number","example":3},"Name":{"type":"string","example":"Tank Actuator"},"SiteInOutDeviceID":{"type":"number","example":null,"nullable":true},"SiteModbusInOutDeviceID":{"type":"number","example":63,"nullable":true},"FullyClosedChannel":{"type":"number","example":2},"FullyOpenChannel":{"type":"number","example":1},"CloseChannel":{"type":"number","example":2},"OpenChannel":{"type":"number","example":1},"DigitalInMissingAlarmActive":{"type":"boolean","example":false},"DigitalInMissingAlarmDescription":{"type":"string","example":""},"Auto":{"type":"boolean","example":false},"LoggingEnabled":{"type":"boolean","description":"Omitted from light responses","example":true},"UsesAnalogControl":{"type":"boolean","example":false,"nullable":true},"AnalogOutChannel":{"type":"number","example":3,"nullable":true},"AnalogOutSiteModbusInOutDeviceID":{"type":"number","example":63,"nullable":true},"AnalogInValvePositionChannel":{"type":"number","example":4,"nullable":true},"AnalogInSiteModbusInOutDeviceID":{"type":"number","example":63,"nullable":true},"FullyOpenPosition":{"type":"number","example":100,"nullable":true},"FullyClosedPosition":{"type":"number","example":0,"nullable":true},"DigitalOpenValveRegisterID":{"type":"string","description":"bigint serialized as string","example":"10231","nullable":true},"DigitalCloseValveRegisterID":{"type":"string","description":"bigint serialized as string","example":"10232","nullable":true},"DigitalFullyOpenValveRegisterID":{"type":"string","description":"bigint serialized as string","example":"10233","nullable":true},"DigitalFullyClosedValveRegisterID":{"type":"string","description":"bigint serialized as string","example":"10234","nullable":true},"AnalogOpenValveRegisterID":{"type":"string","description":"bigint serialized as string","example":"10235","nullable":true},"AnalogValvePositionRegisterID":{"type":"string","description":"bigint serialized as string","example":"10236","nullable":true},"AnalogValvePositionSensorID":{"type":"number","example":4321,"nullable":true},"CurrentValvePosition":{"type":"number","description":"Omitted from light responses","example":75,"nullable":true},"LastClosed":{"type":"string","description":"Omitted from light responses","format":"date-time","nullable":true},"LastOpened":{"type":"string","description":"Omitted from light responses","format":"date-time","nullable":true},"ESDState":{"type":"number","example":0,"nullable":true},"ESDCustomPosition":{"type":"number","example":0,"nullable":true},"MonitorStatusIndicators":{"type":"boolean","example":true,"nullable":true},"MaxTimeToFullyOpen":{"type":"number","example":30,"nullable":true},"MaxTimeToFullyClose":{"type":"number","example":30,"nullable":true},"DefaultAction":{"type":"number","example":1,"nullable":true},"DefaultPosition":{"type":"number","example":0,"nullable":true},"Delete":{"type":"boolean","example":false,"nullable":true},"DesignTypeID":{"type":"number","description":"Omitted from light responses","example":1,"nullable":true},"Latitude":{"type":"number","description":"Omitted from light responses","example":33.508,"nullable":true},"Longitude":{"type":"number","description":"Omitted from light responses","example":-101.855,"nullable":true},"CustomIconURL":{"type":"string","description":"Omitted from light responses","example":null,"nullable":true}},"required":["SiteActuatorID","SiteID","SiteActuatorStatusID","Name","FullyClosedChannel","FullyOpenChannel","CloseChannel","OpenChannel","DigitalInMissingAlarmActive","DigitalInMissingAlarmDescription","Auto"]},"ActuatorScalePointDto":{"type":"object","properties":{"F":{"type":"number","description":"Actuator position (percent)","example":75},"V":{"type":"number","description":"Sensor value","example":10}},"required":["F","V"]},"ActuatorSensorScalingDto":{"type":"object","properties":{"SiteActuatorSensorScalingID":{"type":"number","example":4},"SiteActuatorID":{"type":"number","example":1},"SiteSensorID":{"type":"number","example":3658},"Active":{"type":"boolean","example":false},"ScalePoints":{"description":"Parsed from the stored JSON; empty when unset or unparseable","type":"array","items":{"$ref":"#/components/schemas/ActuatorScalePointDto"}}},"required":["SiteActuatorSensorScalingID","SiteActuatorID","SiteSensorID","Active","ScalePoints"]},"ActuatorSensorTriggerDto":{"type":"object","properties":{"SiteActuatorID":{"type":"number","example":1},"SiteSensorID":{"type":"number","example":25011},"TopAlarmActuatorAction":{"type":"number","example":2},"TopAlarmCustomPosition":{"type":"number","example":0},"BottomAlarmActuatorAction":{"type":"number","example":2},"BottomAlarmCustomPosition":{"type":"number","example":0},"TimeBased":{"type":"boolean","example":false},"TopAlarmActionActiveTime":{"type":"number","example":0,"nullable":true},"TopAlarmActionInactiveTime":{"type":"number","example":0,"nullable":true},"BottomAlarmActionActiveTime":{"type":"number","example":0,"nullable":true},"BottomAlarmActionInactiveTime":{"type":"number","example":0,"nullable":true},"Active":{"type":"boolean","example":false}},"required":["SiteActuatorID","SiteSensorID","TopAlarmActuatorAction","TopAlarmCustomPosition","BottomAlarmActuatorAction","BottomAlarmCustomPosition","TimeBased","Active"]},"ActuatorTankGroupConnectionDto":{"type":"object","properties":{"SiteActuatorTankGroupConnectionID":{"type":"number","example":4},"SiteActuatorID":{"type":"number","example":1},"SiteTankGroupID":{"type":"number","example":836},"SiteMiddleTankID":{"type":"number","example":12,"nullable":true},"LevelToOpen":{"type":"number","example":21},"LevelToClose":{"type":"number","example":22},"LevelToAlertClose":{"type":"number","example":21.5},"Active":{"type":"boolean","example":false}},"required":["SiteActuatorTankGroupConnectionID","SiteActuatorID","SiteTankGroupID","LevelToOpen","LevelToClose","LevelToAlertClose","Active"]},"ActuatorConfigDto":{"type":"object","properties":{"actuator":{"$ref":"#/components/schemas/SiteActuatorDto"},"sensorScalings":{"type":"array","items":{"$ref":"#/components/schemas/ActuatorSensorScalingDto"}},"sensorTriggers":{"type":"array","items":{"$ref":"#/components/schemas/ActuatorSensorTriggerDto"}},"tankGroupConnections":{"type":"array","items":{"$ref":"#/components/schemas/ActuatorTankGroupConnectionDto"}}},"required":["actuator","sensorScalings","sensorTriggers","tankGroupConnections"]},"SiteModbusInOutDeviceDto":{"type":"object","properties":{"SiteModbusInOutDeviceID":{"type":"number","example":55},"SiteID":{"type":"number","example":789},"DeviceName":{"type":"string","example":"PLC-1"},"SlaveAddress":{"type":"number","example":1},"IPAddress":{"type":"string","example":"192.168.1.50","nullable":true},"Active":{"type":"boolean","example":true,"nullable":true},"SupportedIOProtocolID":{"type":"number","example":2,"nullable":true},"LastCommunication":{"type":"string","format":"date-time","nullable":true}},"required":["SiteModbusInOutDeviceID","SiteID","DeviceName","SlaveAddress"]},"DeviceConfigDto":{"type":"object","properties":{"device":{"$ref":"#/components/schemas/SiteModbusInOutDeviceDto"},"registers":{"type":"array","items":{"$ref":"#/components/schemas/RegisterDto"}}},"required":["device","registers"]},"SiteConfigDto":{"type":"object","properties":{"devices":{"description":"Empty for the /updates variant","type":"array","items":{"$ref":"#/components/schemas/DeviceConfigDto"}},"sensors":{"type":"array","items":{"$ref":"#/components/schemas/SensorConfigDto"}},"meters":{"type":"array","items":{"$ref":"#/components/schemas/MeterConfigDto"}},"pumps":{"type":"array","items":{"$ref":"#/components/schemas/PumpConfigDto"}},"tankGroups":{"type":"array","items":{"$ref":"#/components/schemas/TankConfigDto"}},"actuators":{"description":"All actuators for the site, including on /updates (actuator tables have no update timestamp)","type":"array","items":{"$ref":"#/components/schemas/ActuatorConfigDto"}}},"required":["devices","sensors","meters","pumps","tankGroups","actuators"]},"CompactSensorDto":{"type":"object","properties":{"sensor":{"$ref":"#/components/schemas/SiteSensorDto"},"registerIds":{"description":"Register ids (bigint serialized as string)","type":"array","items":{"type":"string"}}},"required":["sensor","registerIds"]},"CompactMeterDto":{"type":"object","properties":{"meter":{"$ref":"#/components/schemas/SiteFlowMeterDto"},"meterRegisters":{"type":"object","description":"Register role name → register id (or null)","additionalProperties":{"type":"number","nullable":true}},"sensorRegisterIds":{"type":"array","items":{"type":"string"}}},"required":["meter","meterRegisters","sensorRegisterIds"]},"CompactPumpDto":{"type":"object","properties":{"pump":{"$ref":"#/components/schemas/SitePumpDto"},"pumpRegisters":{"type":"object","description":"Register role name → register id (or null)","additionalProperties":{"type":"number","nullable":true}},"sensorRegisterIds":{"type":"array","items":{"type":"string"}}},"required":["pump","pumpRegisters","sensorRegisterIds"]},"CompactTankDto":{"type":"object","properties":{"tankGroup":{"$ref":"#/components/schemas/SiteTankGroupDto"},"tankRegisters":{"type":"object","description":"Register role name → register id (or null)","additionalProperties":{"type":"number","nullable":true}},"sensorRegisterIds":{"type":"array","items":{"type":"string"}}},"required":["tankGroup","tankRegisters","sensorRegisterIds"]},"CompactSiteConfigDto":{"type":"object","properties":{"devices":{"type":"object","description":"Devices keyed by SiteModbusInOutDeviceID","additionalProperties":{"$ref":"#/components/schemas/SiteModbusInOutDeviceDto"}},"registers":{"type":"object","description":"Deduped registers keyed by SiteIODeviceRegisterID (null/undefined props stripped)","additionalProperties":{"$ref":"#/components/schemas/RegisterDto"}},"sensors":{"type":"array","items":{"$ref":"#/components/schemas/CompactSensorDto"}},"meters":{"type":"array","items":{"$ref":"#/components/schemas/CompactMeterDto"}},"pumps":{"type":"array","items":{"$ref":"#/components/schemas/CompactPumpDto"}},"tankGroups":{"type":"array","items":{"$ref":"#/components/schemas/CompactTankDto"}},"actuators":{"description":"All actuators for the site, including on /updates (actuator tables have no update timestamp)","type":"array","items":{"$ref":"#/components/schemas/ActuatorConfigDto"}}},"required":["devices","registers","sensors","meters","pumps","tankGroups","actuators"]},"SensorLogDto":{"type":"object","properties":{"sensorID":{"type":"number","description":"Unique identifier of the sensor.","example":12345},"date":{"type":"number","description":"UTC timestamp of when the log was created.","example":1672531200000},"timestamp":{"type":"string","description":"ISO UTC timestamp of when the log was created.","example":"2025-05-29T16:54:49.240Z"},"siteID":{"type":"number","description":"Unique identifier of the site.","example":67890},"value":{"type":"number","description":"Value associated with the log.","example":42.5},"reading":{"type":"number","description":"Reading taken from the sensor.","example":36.8},"uniqueKey":{"type":"string","description":"Unique key for the log entry.","example":"unique-key-12345","readOnly":true},"readUnits":{"type":"string","description":"Units of the reading. Null when the sensor has no converted unit.","example":"Celsius","nullable":true},"valueUnits":{"type":"string","description":"Units of the value. Null when the sensor has no converted unit.","example":"Liters","nullable":true},"statusTypeSource":{"type":"number","description":"Status type source identifier.","example":1},"text":{"type":"string","description":"Additional descriptive text.","example":"Normal operation"}},"required":["sensorID","timestamp","siteID","value","reading"]},"UploadResponseDto":{"type":"object","properties":{"result":{"type":"string","description":"Human-readable summary of what was processed. This is generic across all reading types, and may be augmented with additional fields in the future.","example":"Reading processed successfully."}},"required":["result"]},"FlowMeterLogInboundDto":{"type":"object","properties":{"flowMeterID":{"type":"number"},"timestamp":{"type":"string"},"startTimestamp":{"type":"string"},"totalVolume":{"type":"number"},"dayVolume":{"type":"number"},"pressure":{"type":"number"},"density":{"type":"number"},"temperature":{"type":"number"},"flowRate":{"type":"number"},"actuatorStatus":{"type":"number"},"actuatorPosition":{"type":"number"},"statusTypeSource":{"type":"number"},"currentFlowSensorConvertedUnitID":{"type":"number"},"volumeUnitID":{"type":"number"}},"required":["flowMeterID","timestamp","startTimestamp"]},"PumpLogDto":{"type":"object","properties":{"sitePumpID":{"type":"number","example":123},"timestamp":{"type":"string","example":"2024-01-01T00:00:00.000Z"},"startTimestamp":{"type":"string","example":"2023-12-31T23:00:00.000Z"},"frequency":{"type":"number","example":60},"outputCurrent":{"type":"number","example":12.5},"outputVoltage":{"type":"number","example":230},"pressure":{"type":"number","example":150},"suctionPressure":{"type":"number","example":80},"vibrationLevel":{"type":"number","example":1.2},"igbtTemperature":{"type":"number","example":65},"capacitanceTemperature":{"type":"number","example":55},"autoEnabled":{"type":"boolean","example":true},"fault":{"type":"boolean","example":false},"underAlarm":{"type":"boolean","example":false},"running":{"type":"boolean","example":true},"active":{"type":"boolean","example":true},"targetConcentration":{"type":"number","example":10},"actualConcentration":{"type":"number","example":9},"injectionRate":{"type":"number","example":5},"statusID":{"type":"number","enum":[0,1,2,3,4,5,6,7,8],"example":2},"status":{"type":"string","example":"Running"}},"required":["sitePumpID","timestamp"]},"TankLogDto":{"type":"object","properties":{"entryTankLevel":{"type":"number"},"exitTankLevel":{"type":"number"},"totalVolume":{"type":"number"},"siteTankGroupID":{"type":"number"},"entryWaterLevel":{"type":"number"},"exitWaterLevel":{"type":"number"},"exitIsPressure":{"type":"boolean"},"entryIsPressure":{"type":"boolean"},"entryPressure":{"type":"number"},"exitPressure":{"type":"number"},"actuatorStatus":{"type":"number"},"timestamp":{"type":"string"},"capacityUnitID":{"type":"number"},"entryVolume":{"type":"number"},"exitVolume":{"type":"number"}},"required":["entryTankLevel","exitTankLevel","totalVolume","siteTankGroupID","exitIsPressure","entryIsPressure","entryPressure","exitPressure","actuatorStatus"]},"SensorReadingDto":{"type":"object","properties":{"sensorID":{"type":"number","description":"Unique identifier of the sensor.","example":12345},"value":{"type":"number","description":"Value associated with the sensor reading.","example":42.5},"reading":{"type":"number","description":"Reading taken from the sensor.","example":36.8},"timestamp":{"type":"string","description":"Timestamp of the reading in ISO 8601 format (defaults to now if omitted).","example":"2025-01-07T12:00:00Z"}},"required":["sensorID","value","reading"]},"FlowMeterReadingDto":{"type":"object","properties":{"flowMeterID":{"type":"number","description":"ID of the flow meter being read","example":40779},"totalVolume":{"type":"number","description":"Total volume reading from the flow meter","example":12345.67},"timestamp":{"type":"string","description":"Timestamp of the reading (optional, defaults to now if not provided)","example":"2025-04-16T14:30:00Z"},"startTimestamp":{"type":"string","description":"Timestamp of the beginning of this log (Optional, used for calculating flow rates)","example":"2025-04-16T14:30:00Z"},"dayVolume":{"type":"number","description":"Day volume reading calculated for the current 24-hour period","example":456.78},"flowRate":{"type":"number","description":"Instantaneous flow rate associated with the reading","example":12.34},"pressure":{"type":"number","description":"Pressure measurement captured with the reading","example":85.5},"density":{"type":"number","description":"Fluid density measured during the reading","example":0.82},"temperature":{"type":"number","description":"Temperature reading captured alongside the flow data","example":21.5},"actuatorStatus":{"type":"number","description":"Status flag returned by the meter actuator","example":1},"actuatorPosition":{"type":"number","description":"Position reading from the meter actuator","example":55.5},"statusTypeSource":{"type":"number","description":"Status type reported by the source system","example":3},"currentFlowSensorConvertedUnitID":{"type":"number","description":"Identifier of the unit applied to the flow sensor conversion","example":42},"volumeUnitID":{"type":"number","description":"Identifier for the unit of measure used for volume totals","example":7}},"required":["flowMeterID","totalVolume"]},"PumpReadingDto":{"type":"object","properties":{"sitePumpID":{"type":"number"},"timestamp":{"type":"string"},"startTimestamp":{"type":"string","example":"2023-12-31T23:00:00.000Z"},"pressure":{"type":"number"},"running":{"type":"boolean"},"active":{"type":"boolean"},"frequency":{"type":"number"},"autoEnabled":{"type":"boolean"},"statusID":{"type":"number","enum":[0,1,2,3,4,5,6,7,8],"example":2},"status":{"type":"string"},"fault":{"type":"boolean"},"underAlarm":{"type":"boolean","example":false},"suctionPressure":{"type":"number"},"outputVoltage":{"type":"number"},"outputCurrent":{"type":"number"},"vibrationLevel":{"type":"number"},"igbtTemperature":{"type":"number"},"capacitanceTemperature":{"type":"number"},"targetConcentration":{"type":"number"},"actualConcentration":{"type":"number"},"injectionRate":{"type":"number"}},"required":["sitePumpID","timestamp"]},"TankReadingDto":{"type":"object","properties":{"entryTankLevel":{"type":"number"},"exitTankLevel":{"type":"number"},"totalVolume":{"type":"number"},"siteTankGroupID":{"type":"number"},"entryWaterLevel":{"type":"number"},"exitWaterLevel":{"type":"number"},"exitIsPressure":{"type":"boolean"},"entryIsPressure":{"type":"boolean"},"entryPressure":{"type":"number"},"exitPressure":{"type":"number"},"actuatorStatus":{"type":"number"},"timestamp":{"type":"string"},"capacityUnitID":{"type":"number"},"entryVolume":{"type":"number"},"exitVolume":{"type":"number"}},"required":["entryTankLevel","exitTankLevel","totalVolume","siteTankGroupID","exitIsPressure","entryIsPressure","entryPressure","exitPressure","actuatorStatus"]},"BatchSensorReadingsDto":{"type":"object","properties":{"readings":{"description":"Array of sensor readings to be processed.","type":"array","items":{"$ref":"#/components/schemas/SensorReadingDto"}}},"required":["readings"]},"BatchFlowMeterReadingsDto":{"type":"object","properties":{"readings":{"description":"Array of flow meter readings to be processed.","type":"array","items":{"$ref":"#/components/schemas/FlowMeterReadingDto"}}},"required":["readings"]},"BatchPumpReadingsDto":{"type":"object","properties":{"readings":{"description":"Array of pump readings to be processed.","type":"array","items":{"$ref":"#/components/schemas/PumpReadingDto"}}},"required":["readings"]},"BatchTankReadingsDto":{"type":"object","properties":{"readings":{"description":"Array of tank readings to be processed.","type":"array","items":{"$ref":"#/components/schemas/TankReadingDto"}}},"required":["readings"]},"AlarmDto":{"type":"object","properties":{"equipmentID":{"type":"number","description":"Equipment identifier","example":101},"traceKey":{"type":"string","description":"Unique trace key for alarm","example":"abcd-1234"},"equipmentTypeID":{"type":"number","description":"Equipment type identifier","example":1},"siteAlarmLogID":{"type":"number","description":"Log identifier assigned by SitePro","example":555},"localAlarmLogID":{"type":"number","description":"Local log identifier from client","example":42},"description":{"type":"string","description":"Alarm description","example":"Tank high level"},"siteAlarmTypeID":{"type":"number","description":"Alarm type identifier","example":3},"siteID":{"type":"number","description":"Site identifier","example":789},"date":{"type":"string","description":"ISO timestamp of the alarm","example":"2025-05-29T16:54:49.240Z"},"value":{"type":"number","description":"Alarm value","example":12.34},"units":{"type":"object","description":"Units associated with the value","example":38},"actionTaken":{"type":"string","description":"Action taken for the alarm","example":"Acknowledged"},"siteName":{"type":"string","description":"Name of the site","example":"Big Rig 1"},"resolved":{"type":"boolean","description":"Whether the alarm is resolved","example":false}},"required":["localAlarmLogID","siteAlarmTypeID","siteID","date"]},"AlarmSendResultDto":{"type":"object","properties":{"success":{"type":"boolean","description":"Whether the alarm was persisted successfully","example":true},"siteAlarmLogID":{"type":"number","description":"Log identifier assigned by SitePro (0 when not saved)","example":100},"localAlarmLogID":{"type":"number","description":"Local log identifier echoed back from the client","example":42},"reason":{"type":"string","description":"Reason returned when the alarm could not be fully processed"}},"required":["success","siteAlarmLogID","localAlarmLogID"]},"MultiSiteAlarmsDto":{"type":"object","properties":{"siteID":{"type":"number","description":"Site identifier","example":789},"siteName":{"type":"string","description":"Name of the site","example":"Big Rig 1"},"alarms":{"description":"Array of alarms","type":"array","items":{"$ref":"#/components/schemas/AlarmDto"}}},"required":["siteID","alarms"]},"AlarmResolveResultDto":{"type":"object","properties":{"localAlarmLogID":{"type":"number","description":"Local log identifier echoed back from the client","example":42},"siteAlarmLogID":{"type":"number","description":"Log identifier assigned by SitePro","example":100},"success":{"type":"boolean","description":"Whether the alarm was resolved successfully","example":true},"resolved":{"type":"boolean","description":"Whether the alarm is now resolved","example":true}},"required":["localAlarmLogID","siteAlarmLogID","success","resolved"]},"ActiveAlarmsFilterDto":{"type":"object","properties":{"siteIds":{"description":"List of site IDs to filter active alarms by.","example":[789,790],"type":"array","items":{"type":"number"}}},"required":["siteIds"]},"ActiveAlarmDto":{"type":"object","properties":{"SiteAlarmLogID":{"type":"number","description":"SiteAlarmLog identifier","example":100},"SiteAlarmID":{"type":"number","description":"Parent SiteAlarm identifier","example":12},"SiteID":{"type":"number","description":"Site identifier","example":789},"Description":{"type":"string","description":"Alarm description","example":"Tank high level"},"Value":{"type":"number","description":"Alarm value","example":12.34},"Units":{"type":"string","description":"Units associated with the value","example":"psi"},"Date":{"type":"string","description":"Timestamp of the alarm","example":"2025-05-29T16:54:49.240Z"},"Resolved":{"type":"boolean","description":"Whether the alarm is resolved","example":false},"Silenced":{"type":"boolean","description":"Whether the alarm is silenced","example":false},"ActionTaken":{"type":"string","description":"Action-taken audit trail"}},"required":["SiteAlarmLogID","SiteAlarmID","SiteID","Date","Resolved","Silenced"]},"AlarmActionResultDto":{"type":"object","properties":{"success":{"type":"boolean","description":"Whether the action completed successfully","example":true},"result":{"type":"string","description":"Human-readable success detail","example":"Alarm resolved successfully"},"reason":{"type":"string","description":"Reason returned when the action failed","example":"No alarm found to resolve."}},"required":["success"]},"BaseDataRequestDto":{"type":"object","properties":{"ids":{"description":"Array of identifiers","example":[1,2,3],"type":"array","items":{"type":"string"}}},"required":["ids"]},"RemotelyResolvedAlarmDto":{"type":"object","properties":{"id":{"type":"number","description":"SiteAlarmLog identifier","example":100},"description":{"type":"string","description":"Action-taken text recorded on the alarm log"},"active":{"type":"number","description":"0 when resolved, 1 when still active","example":0}},"required":["id","active"]},"CreateVirtualSensorDto":{"type":"object","properties":{"name":{"type":"string","description":"Display name for the virtual sensor. Maps to SiteSensors.Name.","example":"Virtual Line Pressure"},"description":{"type":"string","description":"Optional description for the virtual sensor. Maps to SiteSensors.Description.","example":"Average pressure calculated from upstream and downstream sensors."},"siteID":{"type":"number","description":"Site that owns the virtual sensor. Maps to SiteSensors.SiteID.","example":12345},"active":{"type":"boolean","description":"Whether the virtual sensor is active. Maps to SiteSensors.Active.","example":true},"unitID":{"type":"number","description":"Unit identifier used by the virtual sensor. Maps to SiteSensors.UnitID.","example":38},"units":{"type":"string","description":"Unit label displayed for the virtual sensor value. Maps to SiteSensors.Units.","example":"psi"},"sensorTypeID":{"type":"number","description":"Sensor type identifier for the virtual sensor. Maps to SiteSensors.SiteSensorTypeID.","example":1},"sensorSubTypeID":{"type":"number","description":"Sensor subtype identifier for the virtual sensor. Maps to SiteSensors.SiteSensorSubTypeID.","example":2},"equation":{"type":"string","description":"Optional equation or expression for derived virtual sensor values. Maps to SiteSensors.Equation.","example":"(sensor_1001 + sensor_1002) / 2"}},"required":["name","siteID","active","unitID","units","sensorTypeID","sensorSubTypeID"]},"VirtualSensorResponseDto":{"type":"object","properties":{"sensorID":{"type":"number","description":"SiteSensors.SiteSensorID for the virtual sensor.","example":456},"name":{"type":"string","description":"Display name for the virtual sensor.","example":"Virtual Line Pressure"},"description":{"type":"string","description":"Optional description for the virtual sensor.","example":"Average pressure calculated from upstream and downstream sensors."},"siteID":{"type":"number","description":"Site that owns the virtual sensor.","example":12345},"active":{"type":"boolean","description":"Whether the virtual sensor is active.","example":true},"unitID":{"type":"number","description":"Unit identifier used by the virtual sensor.","example":38},"units":{"type":"string","description":"Unit label displayed for the virtual sensor value.","example":"psi"},"sensorTypeID":{"type":"number","description":"Sensor type identifier for the virtual sensor.","example":1},"sensorSubTypeID":{"type":"number","description":"Sensor subtype identifier for the virtual sensor.","example":2},"equation":{"type":"string","description":"Optional equation or expression for derived virtual sensor values.","example":"(sensor_1001 + sensor_1002) / 2"}},"required":["sensorID","name","siteID","active","unitID","units","sensorTypeID","sensorSubTypeID"]},"UpdateVirtualSensorDto":{"type":"object","properties":{"name":{"type":"string","description":"Display name for the virtual sensor. Maps to SiteSensors.Name.","example":"Virtual Line Pressure"},"description":{"type":"string","description":"Optional description for the virtual sensor. Maps to SiteSensors.Description.","example":"Average pressure calculated from upstream and downstream sensors."},"siteID":{"type":"number","description":"Site that owns the virtual sensor. Maps to SiteSensors.SiteID.","example":12345},"active":{"type":"boolean","description":"Whether the virtual sensor is active. Maps to SiteSensors.Active.","example":true},"unitID":{"type":"number","description":"Unit identifier used by the virtual sensor. Maps to SiteSensors.UnitID.","example":38},"units":{"type":"string","description":"Unit label displayed for the virtual sensor value. Maps to SiteSensors.Units.","example":"psi"},"sensorTypeID":{"type":"number","description":"Sensor type identifier for the virtual sensor. Maps to SiteSensors.SiteSensorTypeID.","example":1},"sensorSubTypeID":{"type":"number","description":"Sensor subtype identifier for the virtual sensor. Maps to SiteSensors.SiteSensorSubTypeID.","example":2},"equation":{"type":"string","description":"Optional equation or expression for derived virtual sensor values. Maps to SiteSensors.Equation.","example":"(sensor_1001 + sensor_1002) / 2"}},"required":["name","siteID","active","unitID","units","sensorTypeID","sensorSubTypeID"]},"DeleteVirtualSensorResponseDto":{"type":"object","properties":{"sensorID":{"type":"number","description":"SiteSensors.SiteSensorID for the soft-deleted virtual sensor.","example":456},"deleted":{"type":"boolean","description":"Whether SiteSensors.Delete was set to true.","example":true}},"required":["sensorID","deleted"]},"LiveSensorDto":{"type":"object","properties":{"siteSensorId":{"type":"number","example":4321},"siteId":{"type":"number","example":789},"name":{"type":"string","example":"Tank 1 Level"},"currentReading":{"type":"object","description":"Formatted current reading","example":"12.4 ft","nullable":true},"currentValue":{"type":"number","description":"Current numeric value","example":12.4,"nullable":true},"lastUpdatedStats":{"type":"string","format":"date-time","nullable":true},"lastLogDate":{"type":"string","format":"date-time","nullable":true},"topAlarmActive":{"type":"boolean","description":"High (top) alarm currently active","example":false,"nullable":true},"bottomAlarmActive":{"type":"boolean","description":"Low (bottom) alarm currently active","example":false,"nullable":true},"active":{"type":"boolean","example":true,"nullable":true},"unitId":{"type":"number","description":"Unit of currentReading","example":7,"nullable":true},"units":{"type":"string","description":"Unit of currentReading. For 4-20 mA loop sensors this is the raw signal unit (e.g. mA), not the engineering unit. Null when the sensor has no unit configured.","example":"mA","nullable":true},"convertedUnitId":{"type":"number","description":"Unit of currentValue","example":9,"nullable":true},"convertedUnits":{"type":"string","description":"Unit of currentValue. This is the engineering unit after conversion. Null when the sensor has no converted unit configured.","example":"psi","nullable":true},"latitude":{"type":"number","description":"Latitude (Decimal serialized as number)","example":33.508,"nullable":true},"longitude":{"type":"number","description":"Longitude (Decimal serialized as number)","example":-101.855,"nullable":true}},"required":["siteSensorId","siteId","name"]},"LiveMeterDto":{"type":"object","properties":{"siteFlowMeterId":{"type":"number","example":220},"siteId":{"type":"number","example":789},"name":{"type":"string","example":"Intake Meter"},"totalFlow":{"type":"number","example":10234.5,"nullable":true},"lastFlowValue":{"type":"number","example":42.1,"nullable":true},"lastFlowCheck":{"type":"string","format":"date-time","nullable":true},"dateLastReset":{"type":"string","format":"date-time","nullable":true},"currentPressure":{"type":"number","example":120.5,"nullable":true},"currentTemperature":{"type":"number","example":68.2,"nullable":true},"currentDayTotalFlow":{"type":"number","example":512.7,"nullable":true},"yesterdayEndTotal":{"type":"number","example":9800.3,"nullable":true},"volumeUnits":{"type":"string","example":"bbl","nullable":true},"flowUnits":{"type":"string","example":"bbl/d","nullable":true},"latitude":{"type":"number","example":33.508,"nullable":true},"longitude":{"type":"number","example":-101.855,"nullable":true}},"required":["siteFlowMeterId","siteId","name"]},"LivePumpDto":{"type":"object","properties":{"sitePumpId":{"type":"number","example":610},"siteId":{"type":"number","example":789},"name":{"type":"string","example":"Transfer Pump"},"currentOutputFrequency":{"type":"number","example":58.5,"nullable":true},"currentOutputAmps":{"type":"number","example":12.1,"nullable":true},"currentOutputVoltage":{"type":"number","example":480,"nullable":true},"currentOutputPowerFactor":{"type":"number","example":0.92,"nullable":true},"currentPressure":{"type":"number","example":120.5,"nullable":true},"currentSuctionPressure":{"type":"number","example":30.2,"nullable":true},"currentVibration":{"type":"number","example":0.4,"nullable":true},"running":{"type":"boolean","description":"Coalesced running flag","example":true},"active":{"type":"boolean","description":"Coalesced active flag","example":true},"faulted":{"type":"boolean","description":"Coalesced fault flag","example":false},"auto":{"type":"boolean","description":"Auto-enabled flag, from the latest pump log","example":false},"pumpStatus":{"type":"number","description":"Pump status code from the latest pump log. 0=Idle, 1=Starting, 2=Started, 3=Stopping, 4=NeedsStopping, 5=NeedsStarting, 6=Fault, 7=ManuallyDisabled, 8=NeedsMaintenance","example":2,"nullable":true},"latitude":{"type":"number","example":33.508,"nullable":true},"longitude":{"type":"number","example":-101.855,"nullable":true}},"required":["sitePumpId","siteId","name","running","active","faulted","auto"]},"LiveTankGroupDto":{"type":"object","properties":{"siteTankGroupId":{"type":"number","example":300},"siteId":{"type":"number","example":789},"name":{"type":"string","example":"Battery A"},"currentEntryTankLevel":{"type":"number","example":12.4,"nullable":true},"currentExitTankLevel":{"type":"number","example":8.1,"nullable":true},"currentTankPressure":{"type":"number","example":14.2,"nullable":true},"entryWaterLevel":{"type":"number","example":2.1,"nullable":true},"exitWaterLevel":{"type":"number","example":1.8,"nullable":true},"entryOilLevel":{"type":"number","example":10.3,"nullable":true},"exitOilLevel":{"type":"number","example":6.3,"nullable":true},"lastUpdate":{"type":"string","format":"date-time","nullable":true},"latitude":{"type":"number","example":33.508,"nullable":true},"longitude":{"type":"number","example":-101.855,"nullable":true}},"required":["siteTankGroupId","siteId","name"]},"LiveActuatorDto":{"type":"object","properties":{"siteActuatorId":{"type":"number","example":900},"siteId":{"type":"number","example":789},"name":{"type":"string","example":"Dump Valve"},"auto":{"type":"boolean","example":true,"nullable":true},"currentValvePosition":{"type":"number","description":"Current valve position","example":100,"nullable":true},"latitude":{"type":"number","example":33.508,"nullable":true},"longitude":{"type":"number","example":-101.855,"nullable":true},"siteActuatorStatus":{"type":"string","description":"Resolved actuator status name","example":"Open","nullable":true}},"required":["siteActuatorId","siteId","name"]},"LiveBurnerDto":{"type":"object","properties":{"siteBurnerId":{"type":"number","example":700},"siteId":{"type":"number","example":789},"name":{"type":"string","example":"Line Heater"},"latitude":{"type":"number","example":33.508,"nullable":true},"longitude":{"type":"number","example":-101.855,"nullable":true},"active":{"type":"boolean","example":true,"nullable":true},"pilotStatus":{"type":"string","description":"Resolved pilot status name","example":"On","nullable":true},"pilotPressure":{"type":"number","description":"Pilot pressure sensor value","example":6.2,"nullable":true},"mainEntryBurnerActuator":{"type":"string","description":"Main entry burner actuator status name","nullable":true},"mainExitBurnerActuator":{"type":"string","description":"Main exit burner actuator status name","nullable":true},"mainPressure":{"type":"number","description":"Main pressure sensor value","example":22.5,"nullable":true},"temperature":{"type":"number","description":"Temperature sensor value","example":180.4,"nullable":true},"loadingPressureActuator":{"type":"string","description":"Loading pressure actuator status name","nullable":true},"emergencyShutDownActuator":{"type":"string","description":"Emergency shutdown actuator status name","nullable":true}},"required":["siteBurnerId","siteId","name"]},"LiveChargePumpDto":{"type":"object","properties":{"siteChargePumpId":{"type":"number","example":810},"siteId":{"type":"number","example":789},"name":{"type":"string","example":"Charge Pump 1"},"timeLastStarted":{"type":"string","format":"date-time","nullable":true},"started":{"type":"boolean","example":true,"nullable":true},"active":{"type":"boolean","example":true,"nullable":true},"currentVibration":{"type":"number","example":0.3,"nullable":true},"latitude":{"type":"number","example":33.508,"nullable":true},"longitude":{"type":"number","example":-101.855,"nullable":true},"currentFrequency":{"type":"number","description":"Coalesced current frequency","example":58.5},"currentAmps":{"type":"number","description":"Coalesced current amps","example":12.1},"currentVoltage":{"type":"number","description":"Coalesced current voltage","example":480},"currentCapacitorTemperature":{"type":"number","description":"Coalesced capacitor temperature","example":45.2},"currentIGBTTemperature":{"type":"number","description":"Coalesced IGBT temperature","example":52.1}},"required":["siteChargePumpId","siteId","name","currentFrequency","currentAmps","currentVoltage","currentCapacitorTemperature","currentIGBTTemperature"]},"LiveEsdButtonDto":{"type":"object","properties":{"siteEmergencyShutdownButtonId":{"type":"number","example":500},"siteId":{"type":"number","example":789},"name":{"type":"string","example":"Main ESD"},"status":{"type":"number","description":"Resolved status from register scaled value","example":0,"nullable":true},"latitude":{"type":"number","example":33.508,"nullable":true},"longitude":{"type":"number","example":-101.855,"nullable":true}},"required":["siteEmergencyShutdownButtonId","siteId","name"]},"LiveFilterDto":{"type":"object","properties":{"siteFilterId":{"type":"number","example":400},"siteFilterSystemId":{"type":"number","example":40,"nullable":true},"siteId":{"type":"number","example":789},"name":{"type":"string","example":"Sand Filter A"},"lastCleaned":{"type":"string","format":"date-time","nullable":true},"actuator":{"type":"string","description":"Resolved actuator status name","nullable":true},"status":{"type":"number","description":"Filter status code","example":1,"nullable":true},"needsCleaning":{"type":"boolean","example":false,"nullable":true},"currentPressure":{"type":"number","example":22.5,"nullable":true},"latitude":{"type":"number","example":33.508,"nullable":true},"longitude":{"type":"number","example":-101.855,"nullable":true},"active":{"type":"boolean","example":true,"nullable":true}},"required":["siteFilterId","siteId","name"]},"LiveLaneDto":{"type":"object","properties":{"siteLaneId":{"type":"number","example":200},"siteId":{"type":"number","example":789},"name":{"type":"string","example":"Load Lane 1"},"currentFlow":{"type":"number","example":42.1,"nullable":true},"currentDensity":{"type":"number","example":0.85,"nullable":true},"currentSessionTotalFlow":{"type":"number","description":"Running total flow for the current session","example":512.7},"laneStatus":{"type":"string","description":"Resolved lane status name, from SiteLaneStatuses. One of: Valve Closed & Ready, Valve Opening, Valve Open & In-Use, Valve Closing, Manually Disabled, Needs Maintenance.","example":"Valve Open & In-Use","nullable":true},"latitude":{"type":"number","example":33.508,"nullable":true},"longitude":{"type":"number","example":-101.855,"nullable":true}},"required":["siteLaneId","siteId","name","currentSessionTotalFlow"]},"LiveLightingZoneDto":{"type":"object","properties":{"siteLightingAreaId":{"type":"number","example":100},"siteId":{"type":"number","example":789},"name":{"type":"string","example":"Yard Lights"},"auto":{"type":"boolean","example":true,"nullable":true},"on":{"type":"boolean","example":true,"nullable":true},"latitude":{"type":"number","example":33.508,"nullable":true},"longitude":{"type":"number","example":-101.855,"nullable":true}},"required":["siteLightingAreaId","siteId","name"]},"LivePowerSupplyDto":{"type":"object","properties":{"sitePowerSupplyId":{"type":"number","example":620},"siteId":{"type":"number","example":789},"name":{"type":"string","example":"Solar Bank"},"isOn":{"type":"boolean","example":true,"nullable":true},"remainingPowerLevel":{"type":"number","description":"Remaining power level sensor value","example":82.5,"nullable":true},"powerConsumption":{"type":"number","description":"Power consumption sensor value","example":4.2,"nullable":true},"batteryChargeRate":{"type":"number","description":"Battery charge rate sensor value","example":1.1,"nullable":true},"latitude":{"type":"number","example":33.508,"nullable":true},"longitude":{"type":"number","example":-101.855,"nullable":true}},"required":["sitePowerSupplyId","siteId","name"]},"LiveSeparatorDto":{"type":"object","properties":{"siteSeparatorId":{"type":"number","example":550},"siteId":{"type":"number","example":789},"name":{"type":"string","example":"Separator 1"},"reliefActuator":{"type":"string","description":"Relief actuator status name","nullable":true},"gasActuator":{"type":"string","description":"Gas actuator status name","nullable":true},"entryFlowMeterCurrentFlow":{"type":"number","description":"Entry flow meter current flow","example":42.1,"nullable":true},"gasFlowMeterCurrentFlow":{"type":"number","description":"Gas flow meter current flow","example":18.6,"nullable":true},"densityMeterCurrentDensity":{"type":"number","description":"Density meter current density","example":0.85,"nullable":true},"vesselPressure":{"type":"number","description":"Vessel pressure sensor value","example":120.5,"nullable":true},"fluidTemperature":{"type":"number","description":"Fluid temperature sensor value","example":95.2,"nullable":true},"ambientTemperature":{"type":"number","description":"Ambient temperature sensor value","example":68.4,"nullable":true},"airTemperature":{"type":"number","description":"Air temperature sensor value","example":70.1,"nullable":true},"latitude":{"type":"number","example":33.508,"nullable":true},"longitude":{"type":"number","example":-101.855,"nullable":true},"active":{"type":"boolean","example":true,"nullable":true}},"required":["siteSeparatorId","siteId","name"]},"LiveWellheadDto":{"type":"object","properties":{"siteWellheadId":{"type":"number","example":650},"siteId":{"type":"number","example":789},"name":{"type":"string","example":"Wellhead 1"},"esdActuator":{"type":"string","description":"ESD actuator status name","nullable":true},"flowControlActuator":{"type":"string","description":"Flow control actuator status name","nullable":true},"gasInjectionActuator":{"type":"string","description":"Gas injection actuator status name","nullable":true},"chokeStatus":{"type":"number","description":"Choke status sensor value","example":42.1,"nullable":true},"latitude":{"type":"number","example":33.508,"nullable":true},"longitude":{"type":"number","example":-101.855,"nullable":true}},"required":["siteWellheadId","siteId","name"]},"SiteLiveDataResponseDto":{"type":"object","properties":{"siteId":{"type":"number","description":"Site the live values belong to","example":789},"timestamp":{"type":"string","description":"ISO 8601 timestamp the payload was generated","format":"date-time","example":"2026-07-20T12:34:56.000Z"},"sensors":{"type":"array","items":{"$ref":"#/components/schemas/LiveSensorDto"}},"meters":{"type":"array","items":{"$ref":"#/components/schemas/LiveMeterDto"}},"pumps":{"type":"array","items":{"$ref":"#/components/schemas/LivePumpDto"}},"storage":{"type":"array","items":{"$ref":"#/components/schemas/LiveTankGroupDto"}},"actuators":{"type":"array","items":{"$ref":"#/components/schemas/LiveActuatorDto"}},"burners":{"type":"array","items":{"$ref":"#/components/schemas/LiveBurnerDto"}},"chargePumps":{"type":"array","items":{"$ref":"#/components/schemas/LiveChargePumpDto"}},"esdButtons":{"type":"array","items":{"$ref":"#/components/schemas/LiveEsdButtonDto"}},"filters":{"type":"array","items":{"$ref":"#/components/schemas/LiveFilterDto"}},"lanes":{"type":"array","items":{"$ref":"#/components/schemas/LiveLaneDto"}},"lightingZones":{"type":"array","items":{"$ref":"#/components/schemas/LiveLightingZoneDto"}},"powerSupplies":{"type":"array","items":{"$ref":"#/components/schemas/LivePowerSupplyDto"}},"separators":{"type":"array","items":{"$ref":"#/components/schemas/LiveSeparatorDto"}},"wellheads":{"type":"array","items":{"$ref":"#/components/schemas/LiveWellheadDto"}}},"required":["siteId","timestamp","sensors","meters","pumps","storage","actuators","burners","chargePumps","esdButtons","filters","lanes","lightingZones","powerSupplies","separators","wellheads"]},"SiteLiveSensorsResponseDto":{"type":"object","properties":{"siteId":{"type":"number","description":"Site the live values belong to","example":789},"timestamp":{"type":"string","description":"ISO 8601 timestamp the payload was generated","format":"date-time","example":"2026-07-20T12:34:56.000Z"},"sensors":{"type":"array","items":{"$ref":"#/components/schemas/LiveSensorDto"}}},"required":["siteId","timestamp","sensors"]},"SiteLiveMetersResponseDto":{"type":"object","properties":{"siteId":{"type":"number","description":"Site the live values belong to","example":789},"timestamp":{"type":"string","description":"ISO 8601 timestamp the payload was generated","format":"date-time","example":"2026-07-20T12:34:56.000Z"},"meters":{"type":"array","items":{"$ref":"#/components/schemas/LiveMeterDto"}}},"required":["siteId","timestamp","meters"]},"SiteLivePumpsResponseDto":{"type":"object","properties":{"siteId":{"type":"number","description":"Site the live values belong to","example":789},"timestamp":{"type":"string","description":"ISO 8601 timestamp the payload was generated","format":"date-time","example":"2026-07-20T12:34:56.000Z"},"pumps":{"type":"array","items":{"$ref":"#/components/schemas/LivePumpDto"}}},"required":["siteId","timestamp","pumps"]},"SiteLiveTanksResponseDto":{"type":"object","properties":{"siteId":{"type":"number","description":"Site the live values belong to","example":789},"timestamp":{"type":"string","description":"ISO 8601 timestamp the payload was generated","format":"date-time","example":"2026-07-20T12:34:56.000Z"},"storage":{"type":"array","items":{"$ref":"#/components/schemas/LiveTankGroupDto"}}},"required":["siteId","timestamp","storage"]},"SiteLiveActuatorsResponseDto":{"type":"object","properties":{"siteId":{"type":"number","description":"Site the live values belong to","example":789},"timestamp":{"type":"string","description":"ISO 8601 timestamp the payload was generated","format":"date-time","example":"2026-07-20T12:34:56.000Z"},"actuators":{"type":"array","items":{"$ref":"#/components/schemas/LiveActuatorDto"}}},"required":["siteId","timestamp","actuators"]},"SiteLiveBurnersResponseDto":{"type":"object","properties":{"siteId":{"type":"number","description":"Site the live values belong to","example":789},"timestamp":{"type":"string","description":"ISO 8601 timestamp the payload was generated","format":"date-time","example":"2026-07-20T12:34:56.000Z"},"burners":{"type":"array","items":{"$ref":"#/components/schemas/LiveBurnerDto"}}},"required":["siteId","timestamp","burners"]},"SiteLiveChargePumpsResponseDto":{"type":"object","properties":{"siteId":{"type":"number","description":"Site the live values belong to","example":789},"timestamp":{"type":"string","description":"ISO 8601 timestamp the payload was generated","format":"date-time","example":"2026-07-20T12:34:56.000Z"},"chargePumps":{"type":"array","items":{"$ref":"#/components/schemas/LiveChargePumpDto"}}},"required":["siteId","timestamp","chargePumps"]},"SiteLiveEsdButtonsResponseDto":{"type":"object","properties":{"siteId":{"type":"number","description":"Site the live values belong to","example":789},"timestamp":{"type":"string","description":"ISO 8601 timestamp the payload was generated","format":"date-time","example":"2026-07-20T12:34:56.000Z"},"esdButtons":{"type":"array","items":{"$ref":"#/components/schemas/LiveEsdButtonDto"}}},"required":["siteId","timestamp","esdButtons"]},"SiteLiveFiltersResponseDto":{"type":"object","properties":{"siteId":{"type":"number","description":"Site the live values belong to","example":789},"timestamp":{"type":"string","description":"ISO 8601 timestamp the payload was generated","format":"date-time","example":"2026-07-20T12:34:56.000Z"},"filters":{"type":"array","items":{"$ref":"#/components/schemas/LiveFilterDto"}}},"required":["siteId","timestamp","filters"]},"SiteLiveLanesResponseDto":{"type":"object","properties":{"siteId":{"type":"number","description":"Site the live values belong to","example":789},"timestamp":{"type":"string","description":"ISO 8601 timestamp the payload was generated","format":"date-time","example":"2026-07-20T12:34:56.000Z"},"lanes":{"type":"array","items":{"$ref":"#/components/schemas/LiveLaneDto"}}},"required":["siteId","timestamp","lanes"]},"SiteLiveLightingZonesResponseDto":{"type":"object","properties":{"siteId":{"type":"number","description":"Site the live values belong to","example":789},"timestamp":{"type":"string","description":"ISO 8601 timestamp the payload was generated","format":"date-time","example":"2026-07-20T12:34:56.000Z"},"lightingZones":{"type":"array","items":{"$ref":"#/components/schemas/LiveLightingZoneDto"}}},"required":["siteId","timestamp","lightingZones"]},"SiteLivePowerSuppliesResponseDto":{"type":"object","properties":{"siteId":{"type":"number","description":"Site the live values belong to","example":789},"timestamp":{"type":"string","description":"ISO 8601 timestamp the payload was generated","format":"date-time","example":"2026-07-20T12:34:56.000Z"},"powerSupplies":{"type":"array","items":{"$ref":"#/components/schemas/LivePowerSupplyDto"}}},"required":["siteId","timestamp","powerSupplies"]},"SiteLiveSeparatorsResponseDto":{"type":"object","properties":{"siteId":{"type":"number","description":"Site the live values belong to","example":789},"timestamp":{"type":"string","description":"ISO 8601 timestamp the payload was generated","format":"date-time","example":"2026-07-20T12:34:56.000Z"},"separators":{"type":"array","items":{"$ref":"#/components/schemas/LiveSeparatorDto"}}},"required":["siteId","timestamp","separators"]},"SiteLiveWellheadsResponseDto":{"type":"object","properties":{"siteId":{"type":"number","description":"Site the live values belong to","example":789},"timestamp":{"type":"string","description":"ISO 8601 timestamp the payload was generated","format":"date-time","example":"2026-07-20T12:34:56.000Z"},"wellheads":{"type":"array","items":{"$ref":"#/components/schemas/LiveWellheadDto"}}},"required":["siteId","timestamp","wellheads"]}}}}