Telemetry API

Keel Telemetry API

A canonical telemetry interface for maritime performance vendors.
Keel provides a unified system and signal model so you can ingest and query vessel telemetry consistently — regardless of original source.
Open Documentation

The Model

Keel models telemetry using a simple, deterministic structure. You can get data points from any sensor just by defining the following three fields:

Vessel

Code: vessel_imo

Explanation: All telemetry in Keel is scoped to a vessel. You get them by IMO.



  • IMO 98XXXXX
  • IMO 1234567
System

Code: system_id

Explanation: Structured equipment instance identifier. It represents a specific equipment instance on a vessel. Systems distinguish between multiple engines, generators, boilers, and other equipment.

  • "engine:main:1"
  • "engine:generator:2"
Signal

Code: signal_id

Explanation: A canonical measurement definition. Signals describe what is measured, independent of provider naming. Signals are globally defined in the catalog.

  • "engine:rotational_speed"
  • "vessel:draft:forward"
  • "engine:cylinder:exhaust.temperature"
Vessel (IMO 98XXXXX)
 └── System (engine:main:1)
       └── Signal (engine.rotational_speed)
             └── Time series

Signals define what is measured.
Systems define where it is measured.

This separation allows telemetry to remain canonical and source-independent.

Quickstart

Query canonical telemetry using a time range and one or more targets.

Request (example)
Response (example)
{
  "start_time": "2026-02-01T00:00:00Z",
  "end_time": "2026-02-01T06:00:00Z",
  "targets": [
    {
      "vessel_imo": "IMO 98XXXXX",
      "system_id": "engine:main:1",
      "signal_id": "engine:rotational_speed"
    }
  ],
  "downsample": { "interval": "PT1M" }
}
{
  "series": [
    {
      "vessel_imo": "IMO 98XXXXX",
      "system_id": "engine:main:1",
      "signal_id": "engine:rotational_speed",
      "quantity": "rotational_speed",
      "unit": "rpm",
      "points": [
        { "timestamp": "2026-02-01T00:00:00Z", "value": 70 },
        { "timestamp": "2026-02-01T00:01:00Z", "value": 71 },
        { "timestamp": "2026-02-01T00:02:00Z", "value": 68 }
      ]
    }
  ]
}

Examples of Supported Measurements

system_id

signal_id

Description

Quantity (Default Unit)

engine:main
engine:main
engine:main
engine:main
engine:main
engine:main
engine:main
engine:main
engine:main
engine:main
engine:main
engine:main
engine:main
engine:main
engine:main
engine:main
engine:main
engine:main
engine:generator:1
engine:generator:1
engine:generator:1
boiler:1
boiler:1
boiler:1
vessel
vessel
vessel
vessel
vessel
vessel
vessel
vessel
vessel
vessel

engine:scavenge_air:pressure
engine:rotational_speed
engine:vibration:axial
engine:engine_room:ambient_temperature
engine:lube_oil:inlet_temperature
engine:lube_oil:inlet_pressure
engine:jacket_cooling_water:inlet_temperature
engine:jacket_cooling_water:inlet_pressure
engine:charge_air:pressure
engine:load:scrubber_output
engine:cooling_water:cylinder_outlet_temperature:{cylinder}
engine:exhaust_gas:cylinder_temperature:{cylinder}
engine:exhaust_gas:after_turbocharger_temperature
engine:exhaust_gas:before_turbocharger_temperature
engine:piston_cooling_oil:outlet_temperature:{cylinder}
engine:scavenge_air_fire:cylinder_temperature:{cylinder}
engine:fuel:inlet_temperature
engine:running_status
engine:rotational_speed
engine:power
engine:fuel:mass_flow
boiler:fuel:mass_flow
boiler:power
boiler:fuel:lcv
vessel:position:latitude
vessel:position:longitude
vessel:speed:over_ground
vessel:speed:through_water
vessel:heading:true
vessel:draft:average
vessel:trim
vessel:sea:depth
vessel:rudder:angle
vessel:propeller:pitch_angle

Scavenge air pressure
Main engine rotational speed
Main engine axial vibration
Engine room ambient temperature
Main engine lube oil inlet temperature
Main engine lube oil inlet pressure
Main engine jacket cooling water inlet temperature
Main engine jacket cooling water inlet pressure
Main engine charge air pressure
Main engine load output to scrubber
Cooling water outlet temperature per cylinder
Exhaust gas outlet temperature per cylinder
Exhaust gas temperature after turbocharger
Exhaust gas temperature before turbocharger
Piston cooling oil outlet temperature per cylinder
Scavenge air fire temperature per cylinder
Fuel oil inlet temperature
Main engine running status
Generator engine rotational speed
Generator power output
Generator fuel mass flow rate
Boiler fuel oil mass flow
Boiler power output
Boiler fuel lower calorific value
Vessel latitude
Vessel longitude
Speed over ground
Speed through water
True heading
Average draft
Vessel trim
Sea depth
Rudder angle
Propeller pitch angle

pressure (kPa)
rotational_speed (rpm)
vibration (mm/s)
temperature (Cel)
temperature (Cel)
pressure (kPa)
temperature (Cel)
pressure (kPa)
pressure (kPa)
power (percent)
temperature (Cel)
temperature (Cel)
temperature (Cel)
temperature (Cel)
temperature (Cel)
temperature (Cel)
temperature (Cel)
boolean_state (bool)
rotational_speed (rpm)
power (kW)
mass_flow (kg/h)
mass_flow (kg/h)
power (kW)
energy_density (kJ/kg)
angle (deg)
angle (deg)
speed (kn)
speed (kn)
angle (deg)
length (m)
length (m)
length (m)
angle (deg)
angle (deg)

Design Guarantees

Canonical Telemetry Identity

Every telemetry point is uniquely addressed by: (vessel_imo, system_id, signal_id, timestamp). No implicit scoping. No inferred identifiers.

Stable Signal Catalog

Signals are globally defined and versioned.Indexed signals use explicit dimensions: engine.exhaust.temperature.cylinder.{cylinder}. Signal identifiers are provider-agnostic.

Strong Units (UCUM)

Each series response includes: quantity, unit allowed_units.
Units follow UCUM conventions.
Clients may request supported unit conversions.

Explicit System Separation

Signals define what is measured.
Systems define where it is measured.
Multiple system instances are always explicit: engine:main:1, engine:gen:2.
No aggregation is performed implicitly.