Skip to main content
Use MQTT for continuous machine data ingestion from PLCs, SCADA systems, and IoT gateways. For an overview of machine data concepts, config hierarchy, and ingestion semantics, see Machine data.

Connection

Connect to the Cula MQTT ingestion cluster over TLS (port 8883). Credentials are issued by the Cula team alongside your OAuth2 client credentials.
ParameterValue
ProtocolMQTT over TLS
Port8883
AuthenticationUsername + password (issued by Cula)

Topic format

{payloadFormat}/{customerName}/{siteName}/{measurementName}
SegmentDescription
payloadFormatData format identifier (e.g. ixon, sparkplug)
customerNameYour organisation identifier
siteNameThe site the data originates from
measurementNameThe measurement group name

Payload

The payload is a JSON object with a metrics array. Each metric references a machine data point config by name, using the config ID.
{
  "metrics": [
    {
      "datatype": 9,
      "timestamp": 1761390172932,
      "name": "mdp_01kqzcjrpyf27tge9dnvsqv8t2",
      "value": 33.3
    },
    {
      "datatype": 9,
      "timestamp": 1761390172932,
      "name": "mdp_01kqzcjrpyf27tge9mg18vyhr2",
      "value": 66.7
    }
  ]
}
FieldTypeDescription
datatypeintegerData type identifier from the source system
timestampintegerUnix timestamp in milliseconds
namestringMachine data point config ID (mdp_...)
valuenumberMeasured value
The MQTT wire format uses timestamp as Unix milliseconds and name for the config ID. The HTTP endpoints use ISO-8601 timestamps and machine_data_point_config_id instead. See data shape for the canonical HTTP format.

Example: IXON gateway

Topic: ixon/greencarbon/gc-refinery/rawgas-upgrade-1
{
  "metrics": [
    {
      "datatype": 9,
      "timestamp": 1761390172932,
      "name": "mdp_01kqzcjrpyf27tge9dnvsqv8t2",
      "value": 33.3
    },
    {
      "datatype": 9,
      "timestamp": 1761390172932,
      "name": "mdp_01kqzcjrpyf27tge9mg18vyhr2",
      "value": 66.7
    }
  ]
}
MQTT is for continuous, high-frequency data streams. For one-off imports or backfills, use the HTTP batch ingest or import jobs endpoints instead.