Every request must include your API key in the X-API-Key header.
X-API-Key: ht_org_your_key_here
Your key is issued when your organisation is created. It starts with ht_org_ and is only shown once — store it securely. If you lose it or it is compromised, contact the Hydrotwin team to rotate it.
— when a key is rotated your old key stays valid for so you have time to update your systems without downtime.
Rate limit — The API has a limit of 500 requests per hour
Verify your API key is working and inspect your granted scopes.
X-API-Key: ht_org_abc123...
List all Hydrotwin deployments your organisation has been granted access to.
deployments:read
X-API-Key: ht_org_abc123...
"location": "Lagos Harbour",
"client": "Nigerian Ports Authority",
"intervention_at": "2025-01-15T08:00:00.000Z"
"location": "Lagos Harbour",
"client": "Nigerian Ports Authority",
"intervention_at": "2025-03-01T10:30:00.000Z"
List all Hydrotwins accessible to your organisation, grouped by HT ID with active status and GPS coordinates. Use this to discover which hydrotwin_id values to use in measurement endpoints.
measurements:read
X-API-Key: ht_org_abc123...
"client": "Nigerian Ports Authority",
"location": "Lagos Harbour",
"lastActive": "2026-03-06T11:42:00.000Z",
"location": "Lagos Harbour",
"deploymentDate": "2025-01-15T08:00:00.000Z"
"location": "Lagos Harbour",
"deploymentDate": "2025-03-01T10:30:00.000Z"
"accessType": "organisation"
isActive is true if data was received in the last 2 hours. accessType is either "organisation" (your org was granted access) or "direct" (your user account was granted access directly).
Real-time endpoints return the last 24 hours of data. No date parameters are needed.
:hydrotwin_id — the htId value from /hydrotwins (e.g. HT-S-001)
AI detections from the last 24 hours.
measurements:read
GET /api/hydrotwin/HT-S-001/real_time/detections
X-API-Key: ht_org_abc123...
"ingestedAt": "2026-03-06T10:15:00.000Z",
"ingestedAt": "2026-03-06T10:30:00.000Z",
"lastUpdated": "2026-03-06T11:42:00.000Z"
detections is the count of detection windows that triggered. windows is the total number of windows analysed in that file. It can be used to obtain a % of detections, similarly to what is presented in the dashboard.
Broadband noise level readings from the last 24 hours.
measurements:read
GET /api/hydrotwin/HT-S-001/real_time/noise_level
X-API-Key: ht_org_abc123...
"ingestedAt": "2026-03-06T10:15:00.000Z",
"lastUpdated": "2026-03-06T11:42:00.000Z"
volume is the overall broadband noise level in dB re 1µPa. broadband is a JSON object mapping frequency (Hz) to dB level.
SPL spectrum readings from the last 24 hours.
measurements:read
GET /api/hydrotwin/HT-S-001/real_time/spl
X-API-Key: ht_org_abc123...
"ingestedAt": "2026-01-01T08:30:00.000Z",
"p5": { "40.0": 127.1, "100.0": 111.2, "1000.0": 104.3, "20000.0": 92.1 },
"p50": { "40.0": 131.6, "100.0": 116.6, "1000.0": 111.4, "20000.0": 94.9 },
"p95": { "40.0": 136.2, "100.0": 121.8, "1000.0": 117.9, "20000.0": 98.3 },
"lastUpdated": "2026-01-01T09:00:00.000Z"
Internal humidity and temperature readings from the last 24 hours.
measurements:read
GET /api/hydrotwin/HT-S-001/real_time/humidity
X-API-Key: ht_org_abc123...
"ingestedAt": "2026-03-06T10:00:00.000Z",
"ingestedAt": "2026-03-06T11:00:00.000Z",
"lastUpdated": "2026-03-06T11:42:00.000Z"
humidity in %. temperature in °C. Recorded inside the device enclosure. Any field may be null if not available for this device.
Battery and solar power readings from the last 24 hours.
measurements:read
GET /api/hydrotwin/HT-S-001/real_time/energy
X-API-Key: ht_org_abc123...
"ingestedAt": "2026-03-06T10:00:00.000Z",
"ingestedAt": "2026-03-06T11:00:00.000Z",
"lastUpdated": "2026-03-06T11:42:00.000Z"
batteryVoltage in V. batteryPower in W. solarVoltage in V. Any field may be null if not available for this device.
Audio file metadata from the last 24 hours.
measurements:read
GET /api/hydrotwin/HT-S-001/real_time/audio
X-API-Key: ht_org_abc123...
"fileName": "HT-S-001_20260306_101500.wav",
"ingestedAt": "2026-03-06T10:15:00.000Z",
"lastUpdated": "2026-03-06T11:42:00.000Z"
duration is in seconds. blobUrl is the Azure Blob Storage URL if the file has been stored, otherwise null. stored indicates whether the raw audio file is available for download.
Historical endpoints require a date range. Dates can be full ISO 8601 datetimes or date-only strings.
When using date-only format (YYYY-MM-DD), start_date is automatically expanded to 00:00:00 UTC and end_date to 23:59:59 UTC to cover the full day.
Historical AI detections.
measurements:read
GET /api/hydrotwin/HT-S-001/detections?start_date=2026-01-01&end_date=2026-01-31
X-API-Key: ht_org_abc123...
"ingestedAt": "2026-01-01T08:30:00.000Z",
"startDate": "2026-01-01T00:00:00.000Z",
"endDate": "2026-01-31T23:59:59.999Z"
Historical Sound Pressure Level (SPL) spectrum readings.
measurements:read
GET /api/hydrotwin/HT-S-001/spl?start_date=2026-01-01&end_date=2026-01-31
X-API-Key: ht_org_abc123...
"ingestedAt": "2026-01-01T08:30:00.000Z",
"p50": { "40.0": 131.6, "100.0": 116.6, "1000.0": 111.4, "20000.0": 94.9 },
"p95": { "40.0": 136.2, "100.0": 121.8, "1000.0": 117.9, "20000.0": 98.3 }
"startDate": "2026-01-01T00:00:00.000Z",
"endDate": "2026-01-31T23:59:59.999Z"
spectrum is a nested JSON object: frequency (Hz) → percentile → dB level.
Historical broadband noise volume readings.
measurements:read
GET /api/hydrotwin/HT-S-001/volume?start_date=2026-01-01&end_date=2026-01-31
X-API-Key: ht_org_abc123...
"ingestedAt": "2026-01-01T08:30:00.000Z",
"startDate": "2026-01-01T00:00:00.000Z",
"endDate": "2026-01-31T23:59:59.999Z"
Historical internal humidity and temperature readings.
measurements:read
GET /api/hydrotwin/HT-S-001/humidity?start_date=2026-01-01&end_date=2026-01-31
X-API-Key: ht_org_abc123...
"ingestedAt": "2026-01-01T08:00:00.000Z",
"startDate": "2026-01-01T00:00:00.000Z",
"endDate": "2026-01-31T23:59:59.999Z"
Historical battery and solar readings.
measurements:read
GET /api/hydrotwin/HT-S-001/energy?start_date=2026-01-01&end_date=2026-01-31
X-API-Key: ht_org_abc123...
"ingestedAt": "2026-01-01T08:00:00.000Z",
"startDate": "2026-01-01T00:00:00.000Z",
"endDate": "2026-01-31T23:59:59.999Z"
Historical dissolved oxygen and water temperature readings.
measurements:read
GET /api/hydrotwin/HT-C-004/dissolved_oxygen?start_date=2026-01-01&end_date=2026-01-31
X-API-Key: ht_org_abc123...
"ingestedAt": "2026-01-01T09:00:00.000Z",
"waterTemperature": 27.8,
"startDate": "2026-01-01T00:00:00.000Z",
"endDate": "2026-01-31T23:59:59.999Z"
dissolvedOxygen in mg/L. qualityFactor is a value between 0 and 1 indicating measurement confidence. Any field may be null.
Historical wave readings.
measurements:read
GET /api/hydrotwin/HT-S-001/wave?start_date=2026-01-01&end_date=2026-01-31
X-API-Key: ht_org_abc123...
"ingestedAt": "2026-01-01T09:00:00.000Z",
"significantWaveHeight": 1.2,
"peakDirectionSpread": 32.0,
"meanDirectionalSpread": 28.5
"startDate": "2026-01-01T00:00:00.000Z",
"endDate": "2026-01-31T23:59:59.999Z"
significantWaveHeight in meters. Periods in seconds. Directions in degrees (meteorological convention). Any field may be null.
Historical wind readings.
measurements:read
GET /api/hydrotwin/HT-S-001/wind?start_date=2026-01-01&end_date=2026-01-31
X-API-Key: ht_org_abc123...
"ingestedAt": "2026-01-01T09:00:00.000Z",
"startDate": "2026-01-01T00:00:00.000Z",
"endDate": "2026-01-31T23:59:59.999Z"
speed in m/s. direction in degrees. seaSurfaceValue is the Beaufort sea state (0–12). Any field may be null.
Historical ocean current readings.
measurements:read
GET /api/hydrotwin/HT-S-001/current?start_date=2026-01-01&end_date=2026-01-31
X-API-Key: ht_org_abc123...
"ingestedAt": "2026-01-01T09:00:00.000Z",
"startDate": "2026-01-01T00:00:00.000Z",
"endDate": "2026-01-31T23:59:59.999Z"
speed in m/s. direction in degrees. temperature in °C. Any field may be null.
Historical atmospheric pressure readings.
measurements:read
GET /api/hydrotwin/HT-S-001/barometer?start_date=2026-01-01&end_date=2026-01-31
X-API-Key: ht_org_abc123...
"ingestedAt": "2026-01-01T09:00:00.000Z",
"startDate": "2026-01-01T00:00:00.000Z",
"endDate": "2026-01-31T23:59:59.999Z"
pressure in hPa (millibars).
Historical wave partition data separating swell and sea components.
measurements:read
GET /api/hydrotwin/HT-S-001/wave_partitions?start_date=2026-01-01&end_date=2026-01-31
X-API-Key: ht_org_abc123...
"ingestedAt": "2026-01-01T09:00:00.000Z",
"swellStartFrequency": 0.04,
"swellEndFrequency": 0.1,
"swellSignificantWaveHeight": 0.8,
"swellMeanDirection": 230.0,
"swellMeanDirectionalSpread": 20.0,
"seaStartFrequency": 0.1,
"seaSignificantWaveHeight": 0.9,
"seaMeanDirection": 195.0,
"seaMeanDirectionalSpread": 35.0
"startDate": "2026-01-01T00:00:00.000Z",
"endDate": "2026-01-31T23:59:59.999Z"
Frequencies in Hz. Heights in metres. Periods in seconds. Directions in degrees. Any field may be null.
Historical GPS position log for the device.
measurements:read
GET /api/hydrotwin/HT-S-001/deployment_positions?start_date=2026-01-01&end_date=2026-01-31
X-API-Key: ht_org_abc123...
"ingestedAt": "2026-01-01T08:00:00.000Z",
"ingestedAt": "2026-01-02T08:00:00.000Z",
"startDate": "2026-01-01T00:00:00.000Z",
"endDate": "2026-01-31T23:59:59.999Z"
All errors follow a standard shape:
"message": "Invalid API Key",
Missing or invalid API key
Your key does not have the required scope for this endpoint
Invalid parameters (e.g. start_date after end_date)
Rate limit exceeded — 500 requests/hour per organisation