{"openapi":"3.1.0","info":{"title":"Pelagio Defense Data and Device API","version":"7.1.0","description":"Bounded public maritime data plus the authenticated Pelagio Defense V7.1 physical-device telemetry and engineering-evidence platform. Provider provenance and absence are preserved; missing data is never fabricated. Informational only and not for navigation."},"servers":[{"url":"https://pelagio-defense.vercel.app"}],"paths":{"/api/v1/providers":{"get":{"summary":"Provider, license, and implementation registry","responses":{"200":{"description":"Pelagio Defense query completed. Inspect health fields for individual upstream availability."},"400":{"description":"Invalid or unbounded query","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limited","headers":{"Retry-After":{"schema":{"type":"integer"}}}}}}},"/api/v1/providers/health":{"get":{"summary":"Bounded live connectivity checks for core and on-demand providers","parameters":[{"name":"lat","in":"query","required":true,"schema":{"type":"number","minimum":-90,"maximum":90}},{"name":"lon","in":"query","required":true,"schema":{"type":"number","minimum":-180,"maximum":180}}],"responses":{"200":{"description":"Pelagio Defense query completed. Inspect health fields for individual upstream availability."},"400":{"description":"Invalid or unbounded query","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limited","headers":{"Retry-After":{"schema":{"type":"integer"}}}}}}},"/api/v1/location":{"get":{"summary":"Concurrent real-data location snapshot","parameters":[{"name":"lat","in":"query","required":true,"schema":{"type":"number","minimum":-90,"maximum":90}},{"name":"lon","in":"query","required":true,"schema":{"type":"number","minimum":-180,"maximum":180}}],"responses":{"200":{"description":"Pelagio Defense query completed. Inspect health fields for individual upstream availability."},"400":{"description":"Invalid or unbounded query","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limited","headers":{"Retry-After":{"schema":{"type":"integer"}}}}}}},"/api/v1/environment":{"get":{"summary":"Normalized environmental observations and forecast context","parameters":[{"name":"lat","in":"query","required":true,"schema":{"type":"number","minimum":-90,"maximum":90}},{"name":"lon","in":"query","required":true,"schema":{"type":"number","minimum":-180,"maximum":180}}],"responses":{"200":{"description":"Pelagio Defense query completed. Inspect health fields for individual upstream availability."},"400":{"description":"Invalid or unbounded query","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limited","headers":{"Retry-After":{"schema":{"type":"integer"}}}}}}},"/api/v1/ocean":{"get":{"summary":"Buoy and satellite ocean samples","parameters":[{"name":"lat","in":"query","required":true,"schema":{"type":"number","minimum":-90,"maximum":90}},{"name":"lon","in":"query","required":true,"schema":{"type":"number","minimum":-180,"maximum":180}}],"responses":{"200":{"description":"Pelagio Defense query completed. Inspect health fields for individual upstream availability."},"400":{"description":"Invalid or unbounded query","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limited","headers":{"Retry-After":{"schema":{"type":"integer"}}}}}}},"/api/v1/weather":{"get":{"summary":"NOAA NWS forecast with provenance","parameters":[{"name":"lat","in":"query","required":true,"schema":{"type":"number","minimum":-90,"maximum":90}},{"name":"lon","in":"query","required":true,"schema":{"type":"number","minimum":-180,"maximum":180}}],"responses":{"200":{"description":"Pelagio Defense query completed. Inspect health fields for individual upstream availability."},"400":{"description":"Invalid or unbounded query","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limited","headers":{"Retry-After":{"schema":{"type":"integer"}}}}}}},"/api/v1/stations":{"get":{"summary":"Nearest NOAA CO-OPS stations","parameters":[{"name":"lat","in":"query","required":true,"schema":{"type":"number","minimum":-90,"maximum":90}},{"name":"lon","in":"query","required":true,"schema":{"type":"number","minimum":-180,"maximum":180}}],"responses":{"200":{"description":"Pelagio Defense query completed. Inspect health fields for individual upstream availability."},"400":{"description":"Invalid or unbounded query","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limited","headers":{"Retry-After":{"schema":{"type":"integer"}}}}}}},"/api/v1/stations/{id}":{"get":{"summary":"CO-OPS station metadata plus optional bounded history and tide predictions","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}},{"name":"start","in":"query","schema":{"type":"string","format":"date-time"}},{"name":"end","in":"query","schema":{"type":"string","format":"date-time"}}],"responses":{"200":{"description":"Pelagio Defense query completed. Inspect health fields for individual upstream availability."},"400":{"description":"Invalid or unbounded query","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limited","headers":{"Retry-After":{"schema":{"type":"integer"}}}}}}},"/api/v1/buoys":{"get":{"summary":"Nearest active NOAA NDBC stations","parameters":[{"name":"lat","in":"query","required":true,"schema":{"type":"number","minimum":-90,"maximum":90}},{"name":"lon","in":"query","required":true,"schema":{"type":"number","minimum":-180,"maximum":180}}],"responses":{"200":{"description":"Pelagio Defense query completed. Inspect health fields for individual upstream availability."},"400":{"description":"Invalid or unbounded query","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limited","headers":{"Retry-After":{"schema":{"type":"integer"}}}}}}},"/api/v1/buoys/{id}":{"get":{"summary":"Bounded NDBC realtime standard-meteorological series","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}},{"name":"days","in":"query","schema":{"type":"integer","minimum":1,"maximum":45}}],"responses":{"200":{"description":"Pelagio Defense query completed. Inspect health fields for individual upstream availability."},"400":{"description":"Invalid or unbounded query","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limited","headers":{"Retry-After":{"schema":{"type":"integer"}}}}}}},"/api/v1/currents":{"get":{"summary":"NDBC HF-radar total surface current","parameters":[{"name":"lat","in":"query","required":true,"schema":{"type":"number","minimum":-90,"maximum":90}},{"name":"lon","in":"query","required":true,"schema":{"type":"number","minimum":-180,"maximum":180}}],"responses":{"200":{"description":"Pelagio Defense query completed. Inspect health fields for individual upstream availability."},"400":{"description":"Invalid or unbounded query","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limited","headers":{"Retry-After":{"schema":{"type":"integer"}}}}}}},"/api/v1/bathymetry":{"get":{"summary":"NOAA NCEI terrain point and actual selected DEM metadata","parameters":[{"name":"lat","in":"query","required":true,"schema":{"type":"number","minimum":-90,"maximum":90}},{"name":"lon","in":"query","required":true,"schema":{"type":"number","minimum":-180,"maximum":180}}],"responses":{"200":{"description":"Pelagio Defense query completed. Inspect health fields for individual upstream availability."},"400":{"description":"Invalid or unbounded query","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limited","headers":{"Retry-After":{"schema":{"type":"integer"}}}}}}},"/api/v1/timeseries":{"get":{"summary":"NOAA CoastWatch SST and chlorophyll series; days is bounded to 2–90","parameters":[{"name":"lat","in":"query","required":true,"schema":{"type":"number","minimum":-90,"maximum":90}},{"name":"lon","in":"query","required":true,"schema":{"type":"number","minimum":-180,"maximum":180}}],"responses":{"200":{"description":"Pelagio Defense query completed. Inspect health fields for individual upstream availability."},"400":{"description":"Invalid or unbounded query","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limited","headers":{"Retry-After":{"schema":{"type":"integer"}}}}}}},"/api/v1/profiles":{"get":{"summary":"Nearest Argo and license-gated IOOS glider profiles","parameters":[{"name":"lat","in":"query","required":true,"schema":{"type":"number","minimum":-90,"maximum":90}},{"name":"lon","in":"query","required":true,"schema":{"type":"number","minimum":-180,"maximum":180}}],"responses":{"200":{"description":"Pelagio Defense query completed. Inspect health fields for individual upstream availability."},"400":{"description":"Invalid or unbounded query","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limited","headers":{"Retry-After":{"schema":{"type":"integer"}}}}}}},"/api/v1/argo":{"get":{"summary":"Nearest recent Argo profile","parameters":[{"name":"lat","in":"query","required":true,"schema":{"type":"number","minimum":-90,"maximum":90}},{"name":"lon","in":"query","required":true,"schema":{"type":"number","minimum":-180,"maximum":180}}],"responses":{"200":{"description":"Pelagio Defense query completed. Inspect health fields for individual upstream availability."},"400":{"description":"Invalid or unbounded query","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limited","headers":{"Retry-After":{"schema":{"type":"integer"}}}}}}},"/api/v1/gliders":{"get":{"summary":"Nearest recent license-allowlisted IOOS glider profile","parameters":[{"name":"lat","in":"query","required":true,"schema":{"type":"number","minimum":-90,"maximum":90}},{"name":"lon","in":"query","required":true,"schema":{"type":"number","minimum":-180,"maximum":180}}],"responses":{"200":{"description":"Pelagio Defense query completed. Inspect health fields for individual upstream availability."},"400":{"description":"Invalid or unbounded query","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limited","headers":{"Retry-After":{"schema":{"type":"integer"}}}}}}},"/api/v1/satellite":{"get":{"summary":"Copernicus STAC scene metadata; imagery assets require provider authentication","parameters":[{"name":"lat","in":"query","required":true,"schema":{"type":"number","minimum":-90,"maximum":90}},{"name":"lon","in":"query","required":true,"schema":{"type":"number","minimum":-180,"maximum":180}}],"responses":{"200":{"description":"Pelagio Defense query completed. Inspect health fields for individual upstream availability."},"400":{"description":"Invalid or unbounded query","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limited","headers":{"Retry-After":{"schema":{"type":"integer"}}}}}}},"/api/v1/satellite-scenes":{"get":{"summary":"Alias for bounded Copernicus STAC scene metadata","parameters":[{"name":"lat","in":"query","required":true,"schema":{"type":"number","minimum":-90,"maximum":90}},{"name":"lon","in":"query","required":true,"schema":{"type":"number","minimum":-180,"maximum":180}}],"responses":{"200":{"description":"Pelagio Defense query completed. Inspect health fields for individual upstream availability."},"400":{"description":"Invalid or unbounded query","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limited","headers":{"Retry-After":{"schema":{"type":"integer"}}}}}}},"/api/v1/research":{"get":{"summary":"Civilian engineering and environmental site context","parameters":[{"name":"lat","in":"query","required":true,"schema":{"type":"number","minimum":-90,"maximum":90}},{"name":"lon","in":"query","required":true,"schema":{"type":"number","minimum":-180,"maximum":180}}],"responses":{"200":{"description":"Pelagio Defense query completed. Inspect health fields for individual upstream availability."},"400":{"description":"Invalid or unbounded query","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limited","headers":{"Retry-After":{"schema":{"type":"integer"}}}}}}},"/api/v1/vessel-history":{"get":{"summary":"MarineCadastre historical density or bounded future track query contract","parameters":[{"name":"lat","in":"query","required":false,"schema":{"type":"number","minimum":-90,"maximum":90}},{"name":"lon","in":"query","required":false,"schema":{"type":"number","minimum":-180,"maximum":180}},{"name":"bbox","in":"query","schema":{"type":"string","example":"-122.1,36.6,-121.8,36.9"}},{"name":"start","in":"query","schema":{"type":"string","format":"date-time"}},{"name":"end","in":"query","schema":{"type":"string","format":"date-time"}},{"name":"limit","in":"query","schema":{"type":"integer","minimum":1,"maximum":5000}}],"responses":{"200":{"description":"Pelagio Defense query completed. Inspect health fields for individual upstream availability."},"400":{"description":"Invalid or unbounded query","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limited","headers":{"Retry-After":{"schema":{"type":"integer"}}}}}}},"/api/v1/devices":{"get":{"summary":"Visible real-device registry; emulator hidden unless server explicitly enables it","responses":{"200":{"description":"Pelagio Defense query completed. Inspect health fields for individual upstream availability."},"400":{"description":"Invalid or unbounded query","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limited","headers":{"Retry-After":{"schema":{"type":"integer"}}}}}}},"/api/v1/devices/{id}":{"get":{"summary":"One visible real device","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"Pelagio Defense query completed. Inspect health fields for individual upstream availability."},"400":{"description":"Invalid or unbounded query","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limited","headers":{"Retry-After":{"schema":{"type":"integer"}}}}}}},"/api/v1/devices/{id}/telemetry":{"get":{"summary":"Cursor-paginated physical-device telemetry history and export","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","pattern":"^TW-[A-Z0-9][A-Z0-9-]*$"}},{"name":"limit","in":"query","schema":{"type":"integer","minimum":1,"maximum":500}},{"name":"from","in":"query","schema":{"type":"string","format":"date-time"}},{"name":"to","in":"query","schema":{"type":"string","format":"date-time"}},{"name":"cursor","in":"query","schema":{"type":"string"}},{"name":"fields","in":"query","schema":{"type":"string","example":"position,power,platform"}},{"name":"format","in":"query","schema":{"type":"string","enum":["json","csv"]}}],"responses":{"200":{"description":"Pelagio Defense query completed. Inspect health fields for individual upstream availability."},"400":{"description":"Invalid or unbounded query","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limited","headers":{"Retry-After":{"schema":{"type":"integer"}}}}}}},"/api/v1/devices/{id}/alerts":{"get":{"summary":"Rule-based physical-device alert history","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"Pelagio Defense query completed. Inspect health fields for individual upstream availability."},"400":{"description":"Invalid or unbounded query","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limited","headers":{"Retry-After":{"schema":{"type":"integer"}}}}}}},"/api/v1/device-telemetry":{"post":{"summary":"Per-device authenticated, origin-bound, idempotent telemetry ingest","security":[{"deviceBearer":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TelemetryEnvelope"}}}},"responses":{"200":{"description":"Idempotent duplicate"},"202":{"description":"Accepted with sequence and clock status"},"401":{"description":"Invalid, expired, or revoked credential","content":{"application/json":{"schema":{"$ref":"#/components/schemas/DeviceError"}}}},"403":{"description":"Device disabled, identity/origin mismatch, or emulator disabled","content":{"application/json":{"schema":{"$ref":"#/components/schemas/DeviceError"}}}},"413":{"description":"Payload exceeds 64 KiB","content":{"application/json":{"schema":{"$ref":"#/components/schemas/DeviceError"}}}},"422":{"description":"Schema or timestamp validation failed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/DeviceError"}}}},"429":{"description":"Credential-scoped rate limit exceeded","content":{"application/json":{"schema":{"$ref":"#/components/schemas/DeviceError"}}}},"503":{"description":"Durable ingest unavailable or not configured","content":{"application/json":{"schema":{"$ref":"#/components/schemas/DeviceError"}}}}}}},"/api/v1/device-auth/status":{"get":{"summary":"Read-only device credential and identity check","security":[{"deviceBearer":[]}],"responses":{"200":{"description":"Credential is valid for the returned non-secret device identity"},"401":{"description":"Invalid, expired, or revoked credential"},"503":{"description":"Device authentication is not configured"}}}},"/api/v1/device-observations":{"post":{"summary":"Authenticated scalar JSON or allowlisted private binary device observation","security":[{"deviceBearer":[]}],"responses":{"200":{"description":"Idempotent duplicate"},"202":{"description":"Observation accepted"},"401":{"description":"Unauthorized"},"403":{"description":"Credential does not own the observation"},"413":{"description":"Binary request exceeds the size limit"},"415":{"description":"MIME type is not allowed"},"422":{"description":"Invalid observation"},"503":{"description":"Database or object storage unavailable"}}}},"/api/v1/device-observations/{id}/content":{"get":{"summary":"Authenticated private binary retrieval scoped to the owning device or admin organization","security":[{"deviceBearer":[]},{"adminBearer":[]}],"responses":{"200":{"description":"Integrity-checked binary attachment"},"401":{"description":"Unauthorized"},"404":{"description":"Observation not found or not owned"},"503":{"description":"Object storage unavailable"}}}},"/api/v1/admin/devices":{"get":{"summary":"Organization-scoped admin device list","security":[{"adminBearer":[]}],"responses":{"200":{"description":"Device list"},"401":{"description":"Unauthorized"}}},"post":{"summary":"Admin-authenticated device registration; returns a one-time credential","security":[{"adminBearer":[]}],"responses":{"201":{"description":"Registered; credential is displayed once"},"401":{"description":"Unauthorized"},"409":{"description":"Device already exists"},"422":{"description":"Invalid registration"}}}},"/api/v1/admin/devices/{id}":{"get":{"summary":"Organization-scoped device, latest telemetry, alerts, audit, events, and test history","security":[{"adminBearer":[]}],"responses":{"200":{"description":"Device detail"},"401":{"description":"Unauthorized"},"404":{"description":"Device not found"}}},"patch":{"summary":"Disable or enable one organization-owned device","security":[{"adminBearer":[]}],"responses":{"200":{"description":"Device state changed"},"401":{"description":"Unauthorized"}}}},"/api/v1/admin/devices/{id}/test-sessions":{"get":{"summary":"List recorded physical test evidence","security":[{"adminBearer":[]}],"responses":{"200":{"description":"Test sessions"}}},"post":{"summary":"Record an actually performed bench/integration/water/field test","security":[{"adminBearer":[]}],"responses":{"201":{"description":"Test session recorded"},"422":{"description":"Invalid session"}}}},"/api/v1/admin/devices/{id}/calibrations":{"get":{"summary":"List physical sensor calibration records","security":[{"adminBearer":[]}],"responses":{"200":{"description":"Calibration records"}}},"post":{"summary":"Record a real calibration; bench/field status requires linked private evidence","security":[{"adminBearer":[]}],"responses":{"201":{"description":"Calibration recorded"},"422":{"description":"Invalid calibration"}}}},"/api/v1/admin/devices/{id}/engineering-notes":{"get":{"summary":"List physical-device engineering notes","security":[{"adminBearer":[]}],"responses":{"200":{"description":"Engineering notes"}}},"post":{"summary":"Record an operator engineering note with optional private evidence IDs","security":[{"adminBearer":[]}],"responses":{"201":{"description":"Engineering note recorded"},"422":{"description":"Invalid note"}}}},"/api/v1/admin/infrastructure":{"get":{"summary":"Request-verified production infrastructure state without secret values","security":[{"adminBearer":[]}],"responses":{"200":{"description":"Database, schema, storage, ingest, and physical-device state"},"401":{"description":"Unauthorized"}}}},"/api/v1/admin/devices/{id}/credentials":{"post":{"summary":"Rotate and return a one-time device credential","security":[{"adminBearer":[]}],"responses":{"200":{"description":"Credential rotated"},"401":{"description":"Unauthorized"}}},"delete":{"summary":"Revoke active device credentials","security":[{"adminBearer":[]}],"responses":{"200":{"description":"Credentials revoked"},"401":{"description":"Unauthorized"}}}},"/api/v1/admin/device-health-sweep":{"post":{"summary":"Materialize stale/offline alerts from server receipt time","security":[{"adminBearer":[]}],"responses":{"200":{"description":"Health sweep completed"},"401":{"description":"Unauthorized"}}}},"/api/v1/admin/webhooks":{"get":{"summary":"Device-event webhook configuration state and recent deliveries (no URL path or secret)","security":[{"adminBearer":[]}],"responses":{"200":{"description":"Webhook status"},"401":{"description":"Unauthorized"}}}},"/api/v1/admin/webhooks/test":{"post":{"summary":"Enqueue and immediately dispatch a signed webhook.test event","security":[{"adminBearer":[]}],"responses":{"200":{"description":"Test dispatched"},"401":{"description":"Unauthorized"},"409":{"description":"Webhook not configured"}}}},"/api/v1/admin/webhooks/dispatch":{"post":{"summary":"Deliver due webhook retries now","security":[{"adminBearer":[]}],"responses":{"200":{"description":"Dispatch completed"},"401":{"description":"Unauthorized"}}}},"/api/v1/admin/devices/{id}/alerts/{alertId}":{"patch":{"summary":"Acknowledge or resolve a device alert","security":[{"adminBearer":[]}],"responses":{"200":{"description":"Alert state updated"},"401":{"description":"Unauthorized"},"404":{"description":"Open alert not found"}}}}},"components":{"securitySchemes":{"deviceBearer":{"type":"http","scheme":"bearer","description":"One-time provisioned per-device credential"},"adminBearer":{"type":"http","scheme":"bearer","description":"Server-side device-admin credential; never exposed in browser code"}},"schemas":{"SourceMode":{"type":"string","enum":["LIVE_OBSERVATION","LIVE_MODEL","FORECAST","NEAR_REALTIME","HISTORICAL","SATELLITE","DEVICE_TELEMETRY","DERIVED","CACHED","SIMULATION","EMULATOR","UNAVAILABLE"]},"Quality":{"type":"string","enum":["GOOD","SUSPECT","BAD","UNKNOWN","PROVIDER_FLAGGED"]},"Freshness":{"type":"string","enum":["REALTIME","RECENT","HISTORICAL","STATIC","FORECAST","STALE"]},"Provenance":{"type":"object","required":["sourceId","providerName","providerDataset","sourceMode","sourceTimestamp","fetchedAt","ageSeconds","freshness","units","qualityFlag","licenseClass","attribution","sourceDocumentation","cacheStatus"],"properties":{"sourceId":{"type":"string"},"providerName":{"type":"string"},"providerDataset":{"type":"string"},"sourceMode":{"$ref":"#/components/schemas/SourceMode"},"sourceTimestamp":{"type":"string","format":"date-time"},"fetchedAt":{"type":"string","format":"date-time"},"ageSeconds":{"type":"number","minimum":0},"freshness":{"$ref":"#/components/schemas/Freshness"},"units":{"type":"string"},"qualityFlag":{"$ref":"#/components/schemas/Quality"},"rawQualityCode":{"type":"string"},"licenseClass":{"type":"string"},"attribution":{"type":"string"},"sourceDocumentation":{"type":"string","format":"uri"},"cacheStatus":{"type":"string"}}},"EnvironmentalSample":{"type":"object","required":["id","lat","lon","timestamp","parameter","value","unit","quality","provenance"],"properties":{"id":{"type":"string"},"lat":{"type":"number","minimum":-90,"maximum":90},"lon":{"type":"number","minimum":-180,"maximum":180},"depthM":{"type":"number"},"timestamp":{"type":"string","format":"date-time"},"parameter":{"type":"string"},"value":{"type":"number"},"unit":{"type":"string"},"quality":{"$ref":"#/components/schemas/Quality"},"provenance":{"$ref":"#/components/schemas/Provenance"}}},"Pagination":{"type":"object","required":["nextCursor"],"properties":{"nextCursor":{"type":["string","null"]}}},"Error":{"type":"object","required":["error"],"properties":{"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"}}}}},"DeviceError":{"type":"object","additionalProperties":true,"required":["ok","code"],"properties":{"ok":{"type":"boolean","const":false},"code":{"type":"string"},"message":{"type":"string"},"details":{}}},"Position":{"type":"object","additionalProperties":false,"required":["lat","lon"],"properties":{"lat":{"type":"number","minimum":-90,"maximum":90,"description":"Decimal degrees"},"lon":{"type":"number","minimum":-180,"maximum":180,"description":"Decimal degrees"},"altitudeM":{"type":"number","minimum":-500,"maximum":20000},"depthM":{"type":"number","minimum":0,"maximum":12000},"headingDeg":{"type":"number","minimum":0,"maximum":360},"speedMps":{"type":"number","minimum":0,"maximum":100},"horizontalAccuracyM":{"type":"number","minimum":0},"fixType":{"type":"string","enum":["NONE","GNSS","DGPS","RTK_FLOAT","RTK_FIXED","ESTIMATED"]},"source":{"type":"string"}}},"Power":{"type":"object","additionalProperties":false,"properties":{"batteryPct":{"type":"number","minimum":0,"maximum":100},"batteryVoltageV":{"type":"number","minimum":0},"batteryCurrentA":{"type":"number"},"energyRemainingWh":{"type":"number","minimum":0},"solarInputW":{"type":"number","minimum":0},"systemPowerW":{"type":"number","minimum":0},"chargingState":{"type":"string","enum":["CHARGING","DISCHARGING","FULL","IDLE","FAULT","UNKNOWN"]}}},"Platform":{"type":"object","additionalProperties":false,"properties":{"state":{"type":"string","enum":["BOOTING","IDLE","OPERATING","RECOVERING","CHARGING","MAINTENANCE","FAULT","UNKNOWN"]},"health":{"type":"string","enum":["NOMINAL","DEGRADED","FAULT","UNKNOWN"]},"internalTempC":{"type":"number","description":"Degrees Celsius"},"internalTemperatureC":{"type":"number","description":"Degrees Celsius"},"leakDetected":{"type":"boolean"},"pressureHpa":{"type":"number","minimum":0},"pressure":{"type":"number","minimum":0},"uptimeSeconds":{"type":"number","minimum":0},"systemLoad1m":{"type":"number","minimum":0}}},"Communications":{"type":"object","additionalProperties":false,"required":["linkType"],"properties":{"linkType":{"type":"string","enum":["WIFI","CELLULAR","SATELLITE","LORA","ETHERNET","OFFLINE","UNKNOWN"]},"rssiDbm":{"type":"number"},"rssi":{"type":"number"},"latencyMs":{"type":"number","minimum":0},"packetLossPct":{"type":"number","minimum":0,"maximum":100},"lastSuccessfulUplink":{"type":"string","format":"date-time"}}},"Environment":{"type":"object","additionalProperties":false,"properties":{"waterTemperatureC":{"type":"number"},"airTemperatureC":{"type":"number"},"salinityPsu":{"type":"number","minimum":0,"maximum":60},"pressureHpa":{"type":"number","minimum":0},"humidityPct":{"type":"number","minimum":0,"maximum":100},"waveHeightM":{"type":"number","minimum":0},"windSpeedMps":{"type":"number","minimum":0},"windDirectionDeg":{"type":"number","minimum":0,"maximum":360},"currentSpeedMps":{"type":"number","minimum":0},"currentDirectionDeg":{"type":"number","minimum":0,"maximum":360},"dissolvedOxygenMgL":{"type":"number","minimum":0},"ph":{"type":"number","minimum":0,"maximum":14}}},"Sensors":{"type":"object","additionalProperties":false,"properties":{"gnss":{"type":"object","additionalProperties":false,"properties":{"satellites":{"type":"integer","minimum":0,"maximum":128},"hdop":{"type":"number","minimum":0},"valid":{"type":"boolean"}}},"temperature":{"type":"object","additionalProperties":false,"required":["value","unit","valid"],"properties":{"value":{"type":"number","minimum":-100,"maximum":250},"unit":{"type":"string","const":"degC"},"valid":{"type":"boolean"}}},"imu":{"type":"object","additionalProperties":false,"properties":{"rollDeg":{"type":"number"},"pitchDeg":{"type":"number"},"yawDeg":{"type":"number"},"accelerationMps2":{"type":"number","minimum":0}}},"environment":{"$ref":"#/components/schemas/Environment"},"aisReceiver":{"type":"object","additionalProperties":false,"required":["state"],"properties":{"state":{"type":"string","enum":["RECEIVING","NO_SIGNAL","DISABLED","FAULT","UNKNOWN"]},"messagesReceived":{"type":"integer","minimum":0}}},"camera":{"type":"object","additionalProperties":false,"required":["state"],"properties":{"state":{"type":"string","enum":["READY","CAPTURING","DISABLED","FAULT","UNKNOWN"]},"observationCount":{"type":"integer","minimum":0}}},"errors":{"type":"array","maxItems":50,"items":{"type":"string"}},"depth":{"type":"object"},"custom":{"type":"object"}}},"Hardware":{"type":"object","additionalProperties":false,"properties":{"model":{"type":"string"},"serialNumber":{"type":"string"},"revision":{"type":"string"}}},"Software":{"type":"object","additionalProperties":false,"properties":{"version":{"type":"string"},"softwareVersion":{"type":"string"},"build":{"type":"string"},"buildSha":{"type":"string"},"osVersion":{"type":"string"},"clientVersion":{"type":"string"},"profileVersion":{"type":"string"}}},"TelemetryEnvelope":{"type":"object","additionalProperties":false,"required":["schemaVersion","sourceMode","deviceId","messageId","deviceTimestamp","sequence"],"properties":{"schemaVersion":{"type":"string","enum":["1.0","2.0"]},"sourceMode":{"type":"string","enum":["DEVICE_TELEMETRY","EMULATOR"]},"deviceId":{"type":"string","pattern":"^TW-[A-Z0-9][A-Z0-9-]*$"},"messageId":{"type":"string"},"deviceTimestamp":{"type":"string","format":"date-time"},"bootId":{"type":"string"},"sequence":{"type":"integer","minimum":0},"position":{"$ref":"#/components/schemas/Position"},"power":{"$ref":"#/components/schemas/Power"},"platform":{"$ref":"#/components/schemas/Platform"},"communications":{"$ref":"#/components/schemas/Communications"},"payload":{"type":"object","additionalProperties":false,"properties":{"type":{"type":"string"},"state":{"type":"string"},"bayState":{"type":"string"}}},"sensors":{"$ref":"#/components/schemas/Sensors"},"hardware":{"$ref":"#/components/schemas/Hardware"},"software":{"$ref":"#/components/schemas/Software"}}}}}}