Machine data is time-series sensor readings from physical equipment. Cula separates config-time resources (what can be measured) from runtime data (actual readings).Documentation Index
Fetch the complete documentation index at: https://docs.cula.tech/llms.txt
Use this file to discover all available pages before exploring further.
Config hierarchy
Three read-only resources define what you can ingest. Cula manages them and exposes them through the API.Machine
A physical device at a site, such as a pyrolysis reactor or truck scale.GET /machines. Filter by site.
Measurement
A group of related sensors on a machine, such as “Rawgas Upgrade 1 Flow Rates”.GET /measurements. Filter by site or machine.
Machine data point config
A metric definition. Declares the unit and factor applied to raw values during ingestion.GET /machine-data-point-configs. Filter by site, machine, or measurement.
Machines, measurements, and machine data point configs are platform-managed. They use server-assigned TypeIDs only; external IDs are not supported.
Runtime ingestion
At runtime, you ingest machine data items: timestamped values linked to a machine data point config.Data shape
Each item contains:| Field | Type | Description |
|---|---|---|
timestamp | string (ISO-8601) | Measurement time with UTC offset and millisecond precision. |
machine_data_point_config_id | string | TypeID of the related machine data point config. |
value | number | Raw measured value. The server applies the config’s factor. |
Ingestion semantics
Duplicates and corrections
The tuple(machine_data_point_config_id, timestamp) identifies a stored value. Sending another value with the same tuple replaces the previous one. No correction history is retained.
To correct or re-send data, send the correct value at the original timestamp.
Late arrival and backfill
Out-of-order data is ingested normally. Dependent logic (aggregations, threshold evaluations, derived calculations) retries until enough data is available. Callers do not need special ordering.Ingestion paths
| Path | Use case | Limit |
|---|---|---|
| MQTT streaming | Continuous real-time ingestion from PLCs and gateways | - |
POST /machine-data/batch | Synchronous HTTP ingestion | 200 items per request |
POST /machine-data/import-jobs | Async file upload for large backfills | 128 MB per file |
MQTT streaming
Use MQTT for high-frequency continuous streams. Connect over TLS and publish metrics to structured topics. See MQTT streaming for connection details and wire format.HTTP batch
Use HTTP batch for moderate volumes. Items are validated and written atomically. Returns201 on success.
Import jobs
Upload a JSON file for asynchronous processing. The endpoint returns a job ID immediately (202 Accepted). Poll the job for progress.
- Retried automatically on internal server errors.
- Not retried if the file has schema or validation errors. The job transitions to
failedimmediately.
Best practices
- For corrections, re-send the value at the original timestamp.
- For real-time streams, prefer MQTT. For historical backfills, use import jobs.
- Always include explicit timezone offsets in timestamps to avoid ambiguity.
- Reference machine data point configs by TypeID (
mdp_...). They are platform-managed and do not support external IDs.