config_id, the stable root ID of its data point config.
Data point configs
Data points are never standalone — they belong to a parent object (step, delivery, emission log) or a nested child (payload container, input/output container). The parent’s config declares which data points exist viadata_point_configs arrays at each nesting level (see nesting structure). Each config entry declares:
type— determines the shape ofinput_value(see data point types).accepts_input— whether values can be submitted for this data point.is_mandatory— whether the data point must be provided to complete the resource.default_input_value— optional value the server uses when you omit this data point.
Example config snippet
GET /v1/delivery-configs/{id}/versions/active).
accepts_input
true— you can submit a value viainput_value.false— server-computed from other data points or dependencies. Read-only.
default_input_value
Some data point configs include default_input_value. If you omit that data point from the request, the server pre-fills the data point with the configured default.
Config with a default
input_value for the data point type. For example, an amount default is an amount object:
If a mandatory data point has no
default_input_value, include it in the request. If a data point has accepts_input: false, do not submit it even if it appears in the config.Input format
When creating or updating a resource, send provided data points as an array ofDataPointInput objects:
config_id and input_value. To use a config default, omit the whole data point object instead of sending a partial object.
Response format
Responses return each data point as aDataPoint object with server-resolved fields:
name— human-readable label from the config.input_value— the value you submitted.result_value— the server-normalized result (e.g. unit conversion from lbs to kg).
Data point types
| Type | input_value type | Notes |
|---|---|---|
short_text | string | Single-line text |
long_text | string | Multi-line text |
multi_text | string[] | Array of strings |
number | number | Numeric value |
percentage | number | 0–1 |
duration | number | Duration in milliseconds |
boolean | boolean | |
amount | { value, unit } | Amount object — see Amounts and units |
timestamp | string | ISO-8601 datetime |
material | ResourceRef | { id } or { external_id } — see resource identity |
container_type | ResourceRef | { id } or { external_id } — see resource identity |
Validation
A data point config may carry an optionalvalidation object. The shape depends on the data point’s type. All validation keys are optional — omit validation entirely if you do not need it. When set, the server rejects any input_value that does not satisfy the constraints.
| Data point type | validation shape (all keys optional) |
|---|---|
short_text, long_text | { "max_length": integer } |
multi_text | { "min_number_of_items": integer } |
number | { "min": number, "max": number } |
percentage | { "min": number, "max": number } — values are in the 0..1 scale and an implicit 0..1 cap is always applied; custom min/max may further restrict it. |
amount | { "min": Amount, "max": Amount } — Amount is { value, unit }, see Amounts and units. |
timestamp | { "min": "ISO-8601", "max": "ISO-8601", "must_be_in_past": boolean, "must_be_in_future": boolean } |
duration | { "min": number, "max": number } — milliseconds. |
boolean | { "must_be_true": boolean, "must_be_false": boolean } |
material, container_type) do not currently expose validation.
Amount min/max
Percentage 0–0.5
Nesting structure
Data points and their configs are nested at the level of the entity that owns them. The config mirrors the runtime structure — each level that carriesdata_points at runtime has a corresponding data_point_configs array in the config.
- Steps — step-level data points, plus container-level data points on input and output containers.
- Deliveries — delivery-level, leg-level, and payload-level data points.
- Emission logs — flat list of data points at the log level.