1. Data sharing

Sensor and/or noon report data is required to create Ship Kernel models.
Below you may find which data sources and variables are required, and how to upload these to our platform.

Once uploaded, we will continuously process, merge and analyze the data to determine whether the quality is sufficient for modeling. The results of these analyses will be made available through our API. See the next step, Data Monitoring.

Data Requirements

Data Sources

Different sources can be used to build a model:

  • Sensor data
  • Noon report data
  • Design data
  • Any combination of the above

Only one of the above sources is minimally required to create a model. Still, we recommend sharing as many data sources as available, as it will increase accuracy and usability.

Next, we need to know about any events that might impact the performance of the ship (hull cleanings, propeller cleanings, dry-dockings, ESDs, ...). This ensures the models can capture the changes in performance due to these events.

Lastly, weather data may be provided but is not required. If not provided, we will use our own sources.

Operational data (sensor and/or noon reports)

Allowed variables

The table below shows the supported variables. Variables marked as 'essential' are minimally required to create data-driven models. Sharing non-essential variables will lead to richer and more accurate models and is highly recommended.
These variables can be sourced from sensor data and/or noon reports.

If possible, we recommend sharing both sensor and noon reports for all variables as this increases the reliability of the model.

Variable Unit Essential API field
Time and position
Timestamp (end of period) ISO8601 datetime_end
Position (latitude / longitude) degrees lat, lng
Speed over ground kn sog
Speed through water kn stw
Heading degrees ship_heading
Loading condition
Mean draft m draft_avg
Trim m trim
Main engine and propeller
Shaft power kW me_power
Fuel consumption noon reports: mt
sensor: mt/day
me_fuel_consumption
Fuel type SVD fuel type code, see Table 2 below. within me_fuel_consumption
Fuel specific energy (LCV), overrides the fuel type's default LCV MJ/kg per fuel type within me_fuel_consumption
Shaft RPM rotations/min me_rpm
Running hours h me_running_hours
Propeller pitch percentage % If applicable propeller_pitch_percentage
Generators
Shaft generator power kW If applicable shaft_generator_power
Turbo generator power kW If applicable turbo_generator_power
Boilers These fields may be provided per boiler (up to 3) as well as the total over all boilers.
Fuel consumption noon reports: mt
sensor: mt/day
boiler_fuel_consumption_1 .. _3, _total
Fuel type SVD fuel type code, see Table 2 below. within boiler_fuel_consumption_*
Fuel specific energy (LCV), overrides the fuel type's default LCV MJ/kg per fuel type within boiler_fuel_consumption_*
Running hours h boiler_running_hours_1 .. _3
Auxiliary engines These fields may be provided per auxiliary engine (up to 6) as well as the total over all auxiliary engines.
Power kW ae_power_1 .. _6, _total
Fuel consumption noon reports: mt
sensor: mt/day
ae_fuel_consumption_1 .. _6, _total
Fuel type SVD fuel type code, see Table 2 below. within ae_fuel_consumption_*
Fuel specific energy (LCV), overrides the fuel type's default LCV MJ/kg per fuel type within ae_fuel_consumption_*
Running hours h ae_running_hours_1 .. _6
Lubrication
Cylinder oil remaining on board mt cyl_oil_rob
Cylinder oil consumption g/kWh cyl_oil_consumption
System oil remaining on board mt sys_oil_rob
System oil consumption mt/day sys_oil_consumption
Energy saving devices
Air lubrication system power kW If applicable air_lubrication_system_power
Noon report context
Voyage ID text voyage_id
Voyage leg ID text voyage_leg_id
Noon report event (arrival, departure, begin / end of sea passage, noon at sea, …) SVD event code, see Table 1 below. event_type_code

SVD Codes

Fuel types and event codes from the Smart Maritime Council Standardised Vessel Dataset.

ℹ️Table 1: SVD Event Type code

Event type code list from the Smart Maritime Council Standardised Vessel Dataset (IMO0597).

CodeEvent typeRemark
EV01ArrivalArrival at berth or anchorage within port
EV02DepartureDeparture from berth or anchorage within port
EV03Begin of off-hire
EV04End of off-hire
EV05Arrival STSArrival at ship-to-ship location
EV06Departure STSDeparture from STS location
EV07STSEvents at which STS operation took place
EV08Begin canal passage
EV09End canal passage
EV10Begin of sea passage
EV11End of sea passage
EV12Begin anchoring
EV13End anchoring
EV14Begin drifting
EV15End drifting
EV16Noon (position) - sea passage
EV17Noon (position) - port
EV18Noon (position) - river
EV19Noon (position) - stoppage
EV20ETA update
EV21Begin fuel change over
EV22End fuel change over
EV23Change destination (deviation)
EV24Begin of deviation
EV25End of deviation
EV26Entering special area
EV27Leaving special area
EV28Other event
EV29Performance snapshot
ℹ️Table 2: SVD Fuel Type Code

Fuel type code list from the Smart Maritime Council Standardised Vessel Dataset (IMO0654). Each code maps to a default LCV which may be overridden.

CodeFuel typeLCV
EthaneEthane46.4
EthanolEthanol26.8
HFOHeavy Fuel Oil40.2
LBGLiquefied Biogas, Bio-LNG48.0
LFOLight Fuel Oil41.2
LNGLiquefied Natural Gas48.0
LNGBOLNG boil-off cargo used as fuel48.0
LNGN2Deducted portion of Nitrogen from LNG Fuel48.0
LPGLiquefied Petroleum Gas46.0
LPGBLiquefied Petroleum Gas, Butane45.7
LPGPLiquefied Petroleum Gas, Propane46.3
LSHFOLow Sulfur Heavy Fuel Oil40.2
LSLFOLow Sulfur Fuel Oil41.2
LSMGOLow Sulfur Marine Gas Oil42.7
MDOMarine Diesel Oil42.7
MethanolMethanol19.9
MGOMarine Gas Oil42.7
OtherOther fuel type name/
ULSFO2020HFO with a sulphur content of 0.1% or below41.2
ULSLFO2020LFO with a sulphur content of 0.1% or below41.2
ULSMDO2020MDO with a sulphur content of 0.1% or below42.7
ULSMGO2020MGO with a sulphur content of 0.1% or below42.7
VLSFOVery Low Sulphur Fuel Oil40.2
VLSFO2020HFO with a sulphur content between 0.1% and 0.5%40.2
VLSLFO2020LFO with a sulphur content between 0.1% and 0.5%40.2

Sensor sampling rate

We recommend a sampling rate of 1 sample / 5min. Nevertheless, other frequencies (1/sec to 1/hour) are supported too. This doesn't mean that data should be uploaded at this same sampling rate. Preferably, data is uploaded in batches.

Amount of data

Technically sound models can already be made with as little as 1 week of historical data in some cases, but a safe lower threshold would be 3 months of data. Ideally multiple years of historical operational data is shared. This increases model accuracy and provides more conditions to evaluate the model on.

Frequency of sharing

We recommend:

  • Initially, uploading a one-off historical batch containing all available historical data.
  • Afterwards, periodically upload a new batch once a week as new data becomes available.

The frequency of once a week is merely a suggestion, other frequencies are also possible.

Design data

Apart from operational data (sensor data and/or noon reports), design data can also be shared. This allows to create models in case no or insufficient operational data is available. It also helps improve data-driven models by providing more vessel specifics the model can learn from. It is not a must to share design data, as long as sufficient operational data (sensor data and/or noon report data) is available. It is however highly recommended, as it will improve the data-driven models, and create a fallback option in case of serious data issues or unavailability.

Minimum required variables

Calm water curve: sourced from sea trials, model tests, CFD, or other.

VariableUnit
Draft forem
Draft aftm
Speed Over Ground or Speed Through Waterkn
Shaft PowerkW
RPM/min

Main Engine Shop Test

VariableUnit
PowerkW
RPM/min
SFOCg/kWh

Uploading Data

To make a request to our API you must be authorized. Please see Authorization.

Adding a ship

Query the Ships list endpoint to view all ships you have access to.

A new ship can be added through the Add a new ship endpoint. Only name and IMO number are strictly required. MCR and Max RPM should be added to limit the model to the operational range of the vessel.

Data Sources

Each data source has its own API endpoint:

Data can be uploaded by sending a POST request to these endpoints. The details of what such a request should look like and the exact unit each parameter should have is documented in each endpoint. For clarity, an example is also given further below.

Data Format

For uploading data, we impose a few format constraints.

  • Each sample should at least have a timestamp in ISO8601 format.
  • Each variable should have the correct data type, as defined in the endpoint reference. For example, text won't be accepted where a number should be.
  • Variables may be missing or null.

Example

As a manner of example, please find an example JSON file containing two rows of sensor and noon reports data below, and an example Python script that uploads the sensor data through the API.

{
  "datetime_end": ["2022-08-02T09:21:24.0000000+00:00", "2022-08-02T09:26:24.0000000+00:00"],
  "lat": [24.69452, 24.60452],
  "lng": [128.10483, 128.20483],
  "sog": [14.1, 15],
  "stw": [14.1, 15],
  "me_power": [20000, 20010.5],
  "me_rpm": [60, 61],

  "me_fuel_consumption": [
    [
      {"fuel_type": "LNG",   "rate_in_mt_per_day": 70,  "lcv": 49.1},
      {"fuel_type": "LSMGO", "rate_in_mt_per_day": 1.2, "lcv": 42.7}
    ],
    [
      {"fuel_type": "LNG",   "rate_in_mt_per_day": 72,  "lcv": 49.1},
      {"fuel_type": "LSMGO", "rate_in_mt_per_day": 1.1}
    ]
  ],

  "ae_fuel_consumption_1": [
    [{"fuel_type": "LSMGO", "rate_in_mt_per_day": 1.8}],
    [{"fuel_type": "LSMGO", "rate_in_mt_per_day": 1.6}]
  ],
  "ae_fuel_consumption_2": [
    [{"fuel_type": "LSMGO", "rate_in_mt_per_day": 1.2}],
    [{"fuel_type": "LSMGO", "rate_in_mt_per_day": 0.0}]
  ],
  "ae_power_1": [700, 640],
  "ae_power_2": [300, 0],
  "ae_power_total": [1000, 640],

  "boiler_fuel_consumption_1": [
    [{"fuel_type": "VLSFO", "rate_in_mt_per_day": 0.5}],
    [{"fuel_type": "VLSFO", "rate_in_mt_per_day": 0.4}]
  ],

  "turbo_generator_power": [500, 520.5],
  "shaft_generator_power": [800, 810.2],

  "ship_heading": [222.3, 30.6],
  "draft_avg": [21.1, 21],
  "trim": [-0.15, -0.1],
  "sea_depth": [200.5, 30.1]
}
{
  "datetime_end": ["2022-08-02T12:00:00.0000000+00:00", "2022-08-03T12:00:00.0000000+00:00"],
  "lat": [24.69452, 24.50452],
  "lng": [128.10483, 128.20483],
  "sog": [14.1, 15],
  "stw": [14.1, 15],
  "me_power": [20000, 20010.5],
  "me_rpm": [60, 61],

  "me_fuel_consumption": [
    [
      {"fuel_type": "LNG",   "amount_in_mt": 70,  "lcv": 49.1},
      {"fuel_type": "LSMGO", "amount_in_mt": 1.2, "lcv": 42.7}
    ],
    [
      {"fuel_type": "LNG",   "amount_in_mt": 72,  "lcv": 49.1},
      {"fuel_type": "LSMGO", "amount_in_mt": 1.1}
    ]
  ],

  "ae_fuel_consumption_1": [
    [{"fuel_type": "LSMGO", "amount_in_mt": 1.8}],
    [{"fuel_type": "LSMGO", "amount_in_mt": 1.6}]
  ],
  "ae_fuel_consumption_2": [
    [{"fuel_type": "LSMGO", "amount_in_mt": 1.2}],
    [{"fuel_type": "LSMGO", "amount_in_mt": 0.0}]
  ],
  "ae_power_1": [700, 640],
  "ae_power_2": [300, 0],
  "ae_power_total": [1000, 640],

  "boiler_fuel_consumption_1": [
    [{"fuel_type": "VLSFO", "amount_in_mt": 0.5}],
    [{"fuel_type": "VLSFO", "amount_in_mt": 0.4}]
  ],

  "turbo_generator_power": [500, 520.5],
  "shaft_generator_power": [800, 810.2],

  "ship_heading": [222.3, 30.6],
  "draft_avg": [21.1, 21],
  "trim": [-0.15, -0.1],
  "sea_depth": [200.5, 30.1]
}
import requests

url = "https://api.toqua.ai/ships/{imo_number}/data/sensors"

payload = {
    {
  "datetime_end": ["2022-08-02T09:21:24.0000000+00:00", "2022-08-02T09:26:24.0000000+00:00"],
  "lat": [24.69452, 24.60452],
  "lng": [128.10483, 128.20483],
  "sog": [14.1, 15],
  "stw": [14.1, 15],
  "me_power": [20000, 20010.5],
  "me_rpm": [60, 61],

  "me_fuel_consumption": [
    [
      {"fuel_type": "LNG",   "rate_in_mt_per_day": 70,  "lcv": 49.1},
      {"fuel_type": "LSMGO", "rate_in_mt_per_day": 1.2, "lcv": 42.7}
    ],
    [
      {"fuel_type": "LNG",   "rate_in_mt_per_day": 72,  "lcv": 49.1},
      {"fuel_type": "LSMGO", "rate_in_mt_per_day": 1.1}
    ]
  ],

  "ae_fuel_consumption_1": [
    [{"fuel_type": "LSMGO", "rate_in_mt_per_day": 1.8}],
    [{"fuel_type": "LSMGO", "rate_in_mt_per_day": 1.6}]
  ],
  "ae_fuel_consumption_2": [
    [{"fuel_type": "LSMGO", "rate_in_mt_per_day": 1.2}],
    [{"fuel_type": "LSMGO", "rate_in_mt_per_day": 0.0}]
  ],
  "ae_power_1": [700, 640],
  "ae_power_2": [300, 0],
  "ae_power_total": [1000, 640],

  "boiler_fuel_consumption_1": [
    [{"fuel_type": "VLSFO", "rate_in_mt_per_day": 0.5}],
    [{"fuel_type": "VLSFO", "rate_in_mt_per_day": 0.4}]
  ],

  "turbo_generator_power": [500, 520.5],
  "shaft_generator_power": [800, 810.2],

  "ship_heading": [222.3, 30.6],
  "draft_avg": [21.1, 21],
  "trim": [-0.15, -0.1],
  "sea_depth": [200.5, 30.1]
}
headers = {
    "accept": "application/json",
    "content-type": "application/json",
    "X-API-Key": "your_api_key"
}

response = requests.post(url, json=payload, headers=headers)

print(response.text)

Correcting Data

Data can be corrected by re-uploading samples with the exact same timestamp. We will always use the values of the latest uploaded sample.

In case erroneous timestamps were uploaded, contact us to fix the issue.


What’s Next

Did this page help you?