- Config layer — defines fields, types, units, and validation rules.
- Runtime layer — stores tracking data created during operations.
GET endpoints, then reference them when creating runtime resources.
Config versioning
Tracking requirements change over time: data points are added, formulas change, units are updated, or standards require new evidence fields. Each config keeps a version chain so existing data remains tied to the rules used when it was created. Each config has a stable root ID (e.g.stc_01kqzcjrpxf27tge33jwvjhkff) and a chain of versions. The active version is the latest published one. Common reasons for a new version:
- New data points — a previously untracked measurement becomes required (e.g. adding a moisture content field to a sourcing step).
- Changed calculations — a computed data point’s formula is updated (e.g. switching from a simple weight conversion to a density-adjusted calculation).
- Value drift correction — recalibrating thresholds or conversion factors so that computed values stay accurate over time.
- Regulatory or standard changes — a carbon credit methodology update requires capturing additional evidence fields.
config_id (the root ID). The server resolves it to the active version. Version pinning is not supported in v1.
The response includes config_version_id, so every runtime resource records the config version that defined its data shape and calculations at creation time.
Config types
Config types mirror runtime types:| Config type | Runtime type |
|---|---|
| Material sourcing config | Material sourcing step |
| Material processing config | Material processing step |
| Material application config | Material application step |
| Delivery config | Delivery |
| Periodic emission log config | Emission log |
direction (incoming or outgoing). Deliveries created from a config inherit the direction — there is no separate “incoming delivery” or “outgoing delivery” resource type.
Embedded data point configs
Each config version includes adata_point_configs[] array describing the data points expected for that config. Each data point config has its own stable ID, a type (number, text, amount, etc.), and metadata like the expected unit or label. Two fields drive what you need to send:
is_mandatory— the data point must be provided to complete the resource. If it has adefault_input_value, the server fills it in when omitted.accepts_input— whether you can submit a value. Data points withaccepts_input: falseare server-computed and read-only.
data_points at runtime has a corresponding data_point_configs[] in the config version. See data point nesting structure for the full config-to-runtime mapping.
Discovery workflow
Integration flow:- Read config versions — call the config endpoint for your resource type (e.g.
GET /v1/material-sourcing-configs/{id}for sourcing steps, or the equivalent for processing, application, deliveries, and emission logs) to discover the active version and its embeddeddata_point_configs[]. - Identify required data points — inspect
is_mandatoryandaccepts_inputon each data point config. Include all mandatory, inputtable data points in your request. For configs with nested levels (e.g. a delivery config’spayload_config.data_point_configs[]), apply the same check at each level. - Build your field mapping — map each
data_point_configto the corresponding field in your system based on name, type, and unit. - Create runtime resources — use the stable
config_id(the root config ID) and the discovereddata_point_configIDs when submitting data.
If the config is updated in the Cula platform after you build your mapping, new data point configs may appear. Periodically re-read the config to stay in sync.