Skip to main content
POST
Create product instance

Authorizations

X-API-Key
string
header
required

Per-manufacturer API key in the X-API-Key header, format emidat-{key_id}-{secret} where key_id is a random public handle. Issued by an owner in the Emidat dashboard; carries its own permission scopes, optional plant restrictions, and optional expiry. A revoked, expired, or unknown key returns 401. See the Authentication guide for details.

Headers

Idempotency-Key
string

Optional client-generated key (e.g. a UUID) that makes a create idempotent — the only mechanism that does so. A replay carrying the same key returns the original response unchanged (200); reusing a key with a different request body is rejected with 409. Keys are scoped to your manufacturer and retained for 6h. See External IDs.

Body

application/json
plant_id
string<uuid>
required

The plant's Emidat UUID.

name
string
required
Example:

"CEM 42.5 R, 25 kg bag (Munich)"

elementary_id
string<uuid>
required

Emidat material-type UUID — determines the product type.

unit
enum<string>
required
Available options:
M,
M2,
M3,
KG,
T,
L,
KWH,
MJ,
UNIT,
METRIC TON*KM
Example:

"KG"

produced_from
integer
required

First year this instance is valid.

Required range: 2020 <= x <= 2100
Example:

2025

external_id
string | null

Your own code for this instance (its SKU / BOM node id). Optional. When provided it is unique among your active instances — creating another with the same code returns 409 (see External IDs).

Example:

"CEM-42.5R-25KG-MUNICH"

production_process_id
string<uuid> | null

The production process's Emidat UUID. Optional.

produced_to
integer | null

Last valid year, or null if open-ended.

Required range: 2020 <= x <= 2100
tech_specs
object | null

Technical specifications as key/value pairs. Which keys apply depends on the instance's elementary_id — cement, for example, takes compressive_strength and density.

Example:
annual_data
object[] | null

Production output per year; drives the computable LCA years. Each year must fall inside the instance's production period.

economic_value_per_unit
number | null

Economic value in EUR per declared product unit. Optional allocation input; omit it or pass null when no economic value is available.

Required range: x >= 0
Example:

0.35

Response

Returned unchanged — an Idempotency-Key replay.

id
string<uuid>
required
external_id
string | null
required

Your own code for this instance, as provided on creation.

plant_id
string<uuid>
required

The plant's Emidat UUID. Always present — set at creation and immutable.

name
string
required
elementary_id
string<uuid>
required

Emidat material-type UUID — determines the product type.

production_process_id
string<uuid> | null
required

The production process's Emidat UUID, or null if none.

unit
enum<string>
required
Available options:
M,
M2,
M3,
KG,
T,
L,
KWH,
MJ,
UNIT,
METRIC TON*KM
Example:

"KG"

produced_from
integer
required

First year this instance is valid.

Example:

2025

produced_to
integer | null
required

Last valid year, or null if open-ended.

tech_specs
object | null
required

Technical specifications as key/value pairs. Which keys apply depends on the instance's elementary_id — cement, for example, takes compressive_strength and density.

Example:
annual_data
object[]
required

Production output per year.

economic_value_per_unit
number | null
required

Economic value in EUR per declared product unit, or null when it has not been provided. Reads return null without view:processes, whatever is stored; writes are ignored without edit:processes.

Required range: x >= 0
Example:

0.35

status
enum<string>
required

Whether the instance is modelled far enough to run an LCA. Derived on every read, never set directly.

incomplete — something structural is still missing: tech_specs is empty, production_process_id is null, or the material type needs a BOM (PUT …/bom) and none is set. draft — all of that is present.

draft is about structure only. It does not mean any year is computable: per-year gaps such as missing production data surface as blocked_by entries on the LCA results, not here.

Available options:
incomplete,
draft
Example:

"draft"

created_at
string<date-time>
required