curl --request PUT \
--url https://api.emidat.com/v2/product-instances/{id} \
--header 'Content-Type: application/json' \
--header 'X-API-Key: <api-key>' \
--data '
{
"plant_id": "11111111-1111-1111-1111-111111111111",
"elementary_id": "22222222-2222-2222-2222-222222222222",
"unit": "KG",
"external_id": "CEM-42.5R-25KG-MUNICH",
"name": "CEM 42.5 R, 25 kg bag (Munich, renamed)",
"production_process_id": "77777777-7777-7777-7777-777777777777",
"produced_from": 2025,
"produced_to": null,
"tech_specs": {
"compressive_strength": 42.5,
"density": 3100
},
"annual_data": [
{
"year": 2025,
"production_output": 135000,
"economic_value_per_unit": 0.35
}
]
}
'import requests
url = "https://api.emidat.com/v2/product-instances/{id}"
payload = {
"plant_id": "11111111-1111-1111-1111-111111111111",
"elementary_id": "22222222-2222-2222-2222-222222222222",
"unit": "KG",
"external_id": "CEM-42.5R-25KG-MUNICH",
"name": "CEM 42.5 R, 25 kg bag (Munich, renamed)",
"production_process_id": "77777777-7777-7777-7777-777777777777",
"produced_from": 2025,
"produced_to": None,
"tech_specs": {
"compressive_strength": 42.5,
"density": 3100
},
"annual_data": [
{
"year": 2025,
"production_output": 135000,
"economic_value_per_unit": 0.35
}
]
}
headers = {
"X-API-Key": "<api-key>",
"Content-Type": "application/json"
}
response = requests.put(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'PUT',
headers: {'X-API-Key': '<api-key>', 'Content-Type': 'application/json'},
body: JSON.stringify({
plant_id: '11111111-1111-1111-1111-111111111111',
elementary_id: '22222222-2222-2222-2222-222222222222',
unit: 'KG',
external_id: 'CEM-42.5R-25KG-MUNICH',
name: 'CEM 42.5 R, 25 kg bag (Munich, renamed)',
production_process_id: '77777777-7777-7777-7777-777777777777',
produced_from: 2025,
produced_to: null,
tech_specs: {compressive_strength: 42.5, density: 3100},
annual_data: [{year: 2025, production_output: 135000, economic_value_per_unit: 0.35}]
})
};
fetch('https://api.emidat.com/v2/product-instances/{id}', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://api.emidat.com/v2/product-instances/{id}",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "PUT",
CURLOPT_POSTFIELDS => json_encode([
'plant_id' => '11111111-1111-1111-1111-111111111111',
'elementary_id' => '22222222-2222-2222-2222-222222222222',
'unit' => 'KG',
'external_id' => 'CEM-42.5R-25KG-MUNICH',
'name' => 'CEM 42.5 R, 25 kg bag (Munich, renamed)',
'production_process_id' => '77777777-7777-7777-7777-777777777777',
'produced_from' => 2025,
'produced_to' => null,
'tech_specs' => [
'compressive_strength' => 42.5,
'density' => 3100
],
'annual_data' => [
[
'year' => 2025,
'production_output' => 135000,
'economic_value_per_unit' => 0.35
]
]
]),
CURLOPT_HTTPHEADER => [
"Content-Type: application/json",
"X-API-Key: <api-key>"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "https://api.emidat.com/v2/product-instances/{id}"
payload := strings.NewReader("{\n \"plant_id\": \"11111111-1111-1111-1111-111111111111\",\n \"elementary_id\": \"22222222-2222-2222-2222-222222222222\",\n \"unit\": \"KG\",\n \"external_id\": \"CEM-42.5R-25KG-MUNICH\",\n \"name\": \"CEM 42.5 R, 25 kg bag (Munich, renamed)\",\n \"production_process_id\": \"77777777-7777-7777-7777-777777777777\",\n \"produced_from\": 2025,\n \"produced_to\": null,\n \"tech_specs\": {\n \"compressive_strength\": 42.5,\n \"density\": 3100\n },\n \"annual_data\": [\n {\n \"year\": 2025,\n \"production_output\": 135000,\n \"economic_value_per_unit\": 0.35\n }\n ]\n}")
req, _ := http.NewRequest("PUT", url, payload)
req.Header.Add("X-API-Key", "<api-key>")
req.Header.Add("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.put("https://api.emidat.com/v2/product-instances/{id}")
.header("X-API-Key", "<api-key>")
.header("Content-Type", "application/json")
.body("{\n \"plant_id\": \"11111111-1111-1111-1111-111111111111\",\n \"elementary_id\": \"22222222-2222-2222-2222-222222222222\",\n \"unit\": \"KG\",\n \"external_id\": \"CEM-42.5R-25KG-MUNICH\",\n \"name\": \"CEM 42.5 R, 25 kg bag (Munich, renamed)\",\n \"production_process_id\": \"77777777-7777-7777-7777-777777777777\",\n \"produced_from\": 2025,\n \"produced_to\": null,\n \"tech_specs\": {\n \"compressive_strength\": 42.5,\n \"density\": 3100\n },\n \"annual_data\": [\n {\n \"year\": 2025,\n \"production_output\": 135000,\n \"economic_value_per_unit\": 0.35\n }\n ]\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.emidat.com/v2/product-instances/{id}")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Put.new(url)
request["X-API-Key"] = '<api-key>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"plant_id\": \"11111111-1111-1111-1111-111111111111\",\n \"elementary_id\": \"22222222-2222-2222-2222-222222222222\",\n \"unit\": \"KG\",\n \"external_id\": \"CEM-42.5R-25KG-MUNICH\",\n \"name\": \"CEM 42.5 R, 25 kg bag (Munich, renamed)\",\n \"production_process_id\": \"77777777-7777-7777-7777-777777777777\",\n \"produced_from\": 2025,\n \"produced_to\": null,\n \"tech_specs\": {\n \"compressive_strength\": 42.5,\n \"density\": 3100\n },\n \"annual_data\": [\n {\n \"year\": 2025,\n \"production_output\": 135000,\n \"economic_value_per_unit\": 0.35\n }\n ]\n}"
response = http.request(request)
puts response.read_body{
"id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"external_id": "<string>",
"plant_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"name": "<string>",
"elementary_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"production_process_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"unit": "KG",
"produced_from": 2025,
"produced_to": 123,
"tech_specs": {
"compressive_strength": 42.5,
"density": 3100
},
"annual_data": [
{
"year": 2025,
"production_output": 120000,
"economic_value_per_unit": 1
}
],
"status": "draft",
"created_at": "2023-11-07T05:31:56Z"
}{
"msg": "supplier product requires a supplier plant",
"err_code": "err_supplier_product_missing_supplier_plant",
"entitlement_limit": {
"dimension": "users",
"usage": 123,
"limit": 123
}
}{
"msg": "supplier product requires a supplier plant",
"err_code": "err_supplier_product_missing_supplier_plant",
"entitlement_limit": {
"dimension": "users",
"usage": 123,
"limit": 123
}
}{
"msg": "supplier product requires a supplier plant",
"err_code": "err_supplier_product_missing_supplier_plant",
"entitlement_limit": {
"dimension": "users",
"usage": 123,
"limit": 123
}
}{
"msg": "supplier product requires a supplier plant",
"err_code": "err_supplier_product_missing_supplier_plant",
"entitlement_limit": {
"dimension": "users",
"usage": 123,
"limit": 123
}
}{
"msg": "supplier product requires a supplier plant",
"err_code": "err_supplier_product_missing_supplier_plant",
"entitlement_limit": {
"dimension": "users",
"usage": 123,
"limit": 123
}
}{
"msg": "supplier product requires a supplier plant",
"err_code": "err_supplier_product_missing_supplier_plant",
"entitlement_limit": {
"dimension": "users",
"usage": 123,
"limit": 123
}
}Update product instance
Full replacement of editable fields. Immutable plant_id,
elementary_id, and unit may be omitted or echoed from the current
resource. external_id is replaced: re-sending this instance’s
own code succeeds unchanged, while a code held by another active instance
returns 409. See External IDs.
annual_data[].production_output and
annual_data[].economic_value_per_unit are
production data: without edit:processes what you send for them is
ignored and the stored values are kept, so echoing back a response that
withheld them does not clear them. A stored year you leave out of
annual_data is kept for the same reason. Keys issued before the process
scopes existed carry them wherever they carry the matching product scope.
curl --request PUT \
--url https://api.emidat.com/v2/product-instances/{id} \
--header 'Content-Type: application/json' \
--header 'X-API-Key: <api-key>' \
--data '
{
"plant_id": "11111111-1111-1111-1111-111111111111",
"elementary_id": "22222222-2222-2222-2222-222222222222",
"unit": "KG",
"external_id": "CEM-42.5R-25KG-MUNICH",
"name": "CEM 42.5 R, 25 kg bag (Munich, renamed)",
"production_process_id": "77777777-7777-7777-7777-777777777777",
"produced_from": 2025,
"produced_to": null,
"tech_specs": {
"compressive_strength": 42.5,
"density": 3100
},
"annual_data": [
{
"year": 2025,
"production_output": 135000,
"economic_value_per_unit": 0.35
}
]
}
'import requests
url = "https://api.emidat.com/v2/product-instances/{id}"
payload = {
"plant_id": "11111111-1111-1111-1111-111111111111",
"elementary_id": "22222222-2222-2222-2222-222222222222",
"unit": "KG",
"external_id": "CEM-42.5R-25KG-MUNICH",
"name": "CEM 42.5 R, 25 kg bag (Munich, renamed)",
"production_process_id": "77777777-7777-7777-7777-777777777777",
"produced_from": 2025,
"produced_to": None,
"tech_specs": {
"compressive_strength": 42.5,
"density": 3100
},
"annual_data": [
{
"year": 2025,
"production_output": 135000,
"economic_value_per_unit": 0.35
}
]
}
headers = {
"X-API-Key": "<api-key>",
"Content-Type": "application/json"
}
response = requests.put(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'PUT',
headers: {'X-API-Key': '<api-key>', 'Content-Type': 'application/json'},
body: JSON.stringify({
plant_id: '11111111-1111-1111-1111-111111111111',
elementary_id: '22222222-2222-2222-2222-222222222222',
unit: 'KG',
external_id: 'CEM-42.5R-25KG-MUNICH',
name: 'CEM 42.5 R, 25 kg bag (Munich, renamed)',
production_process_id: '77777777-7777-7777-7777-777777777777',
produced_from: 2025,
produced_to: null,
tech_specs: {compressive_strength: 42.5, density: 3100},
annual_data: [{year: 2025, production_output: 135000, economic_value_per_unit: 0.35}]
})
};
fetch('https://api.emidat.com/v2/product-instances/{id}', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://api.emidat.com/v2/product-instances/{id}",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "PUT",
CURLOPT_POSTFIELDS => json_encode([
'plant_id' => '11111111-1111-1111-1111-111111111111',
'elementary_id' => '22222222-2222-2222-2222-222222222222',
'unit' => 'KG',
'external_id' => 'CEM-42.5R-25KG-MUNICH',
'name' => 'CEM 42.5 R, 25 kg bag (Munich, renamed)',
'production_process_id' => '77777777-7777-7777-7777-777777777777',
'produced_from' => 2025,
'produced_to' => null,
'tech_specs' => [
'compressive_strength' => 42.5,
'density' => 3100
],
'annual_data' => [
[
'year' => 2025,
'production_output' => 135000,
'economic_value_per_unit' => 0.35
]
]
]),
CURLOPT_HTTPHEADER => [
"Content-Type: application/json",
"X-API-Key: <api-key>"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "https://api.emidat.com/v2/product-instances/{id}"
payload := strings.NewReader("{\n \"plant_id\": \"11111111-1111-1111-1111-111111111111\",\n \"elementary_id\": \"22222222-2222-2222-2222-222222222222\",\n \"unit\": \"KG\",\n \"external_id\": \"CEM-42.5R-25KG-MUNICH\",\n \"name\": \"CEM 42.5 R, 25 kg bag (Munich, renamed)\",\n \"production_process_id\": \"77777777-7777-7777-7777-777777777777\",\n \"produced_from\": 2025,\n \"produced_to\": null,\n \"tech_specs\": {\n \"compressive_strength\": 42.5,\n \"density\": 3100\n },\n \"annual_data\": [\n {\n \"year\": 2025,\n \"production_output\": 135000,\n \"economic_value_per_unit\": 0.35\n }\n ]\n}")
req, _ := http.NewRequest("PUT", url, payload)
req.Header.Add("X-API-Key", "<api-key>")
req.Header.Add("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.put("https://api.emidat.com/v2/product-instances/{id}")
.header("X-API-Key", "<api-key>")
.header("Content-Type", "application/json")
.body("{\n \"plant_id\": \"11111111-1111-1111-1111-111111111111\",\n \"elementary_id\": \"22222222-2222-2222-2222-222222222222\",\n \"unit\": \"KG\",\n \"external_id\": \"CEM-42.5R-25KG-MUNICH\",\n \"name\": \"CEM 42.5 R, 25 kg bag (Munich, renamed)\",\n \"production_process_id\": \"77777777-7777-7777-7777-777777777777\",\n \"produced_from\": 2025,\n \"produced_to\": null,\n \"tech_specs\": {\n \"compressive_strength\": 42.5,\n \"density\": 3100\n },\n \"annual_data\": [\n {\n \"year\": 2025,\n \"production_output\": 135000,\n \"economic_value_per_unit\": 0.35\n }\n ]\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.emidat.com/v2/product-instances/{id}")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Put.new(url)
request["X-API-Key"] = '<api-key>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"plant_id\": \"11111111-1111-1111-1111-111111111111\",\n \"elementary_id\": \"22222222-2222-2222-2222-222222222222\",\n \"unit\": \"KG\",\n \"external_id\": \"CEM-42.5R-25KG-MUNICH\",\n \"name\": \"CEM 42.5 R, 25 kg bag (Munich, renamed)\",\n \"production_process_id\": \"77777777-7777-7777-7777-777777777777\",\n \"produced_from\": 2025,\n \"produced_to\": null,\n \"tech_specs\": {\n \"compressive_strength\": 42.5,\n \"density\": 3100\n },\n \"annual_data\": [\n {\n \"year\": 2025,\n \"production_output\": 135000,\n \"economic_value_per_unit\": 0.35\n }\n ]\n}"
response = http.request(request)
puts response.read_body{
"id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"external_id": "<string>",
"plant_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"name": "<string>",
"elementary_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"production_process_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"unit": "KG",
"produced_from": 2025,
"produced_to": 123,
"tech_specs": {
"compressive_strength": 42.5,
"density": 3100
},
"annual_data": [
{
"year": 2025,
"production_output": 120000,
"economic_value_per_unit": 1
}
],
"status": "draft",
"created_at": "2023-11-07T05:31:56Z"
}{
"msg": "supplier product requires a supplier plant",
"err_code": "err_supplier_product_missing_supplier_plant",
"entitlement_limit": {
"dimension": "users",
"usage": 123,
"limit": 123
}
}{
"msg": "supplier product requires a supplier plant",
"err_code": "err_supplier_product_missing_supplier_plant",
"entitlement_limit": {
"dimension": "users",
"usage": 123,
"limit": 123
}
}{
"msg": "supplier product requires a supplier plant",
"err_code": "err_supplier_product_missing_supplier_plant",
"entitlement_limit": {
"dimension": "users",
"usage": 123,
"limit": 123
}
}{
"msg": "supplier product requires a supplier plant",
"err_code": "err_supplier_product_missing_supplier_plant",
"entitlement_limit": {
"dimension": "users",
"usage": 123,
"limit": 123
}
}{
"msg": "supplier product requires a supplier plant",
"err_code": "err_supplier_product_missing_supplier_plant",
"entitlement_limit": {
"dimension": "users",
"usage": 123,
"limit": 123
}
}{
"msg": "supplier product requires a supplier plant",
"err_code": "err_supplier_product_missing_supplier_plant",
"entitlement_limit": {
"dimension": "users",
"usage": 123,
"limit": 123
}
}Authorizations
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.
Path Parameters
The instance's Emidat UUID.
Body
Full replacement of editable fields. Every editable field is required and
overwrites the stored value. Nullable fields accept null to clear them.
The immutable identity fields may be omitted or echoed from the current
resource.
Your own code for this instance (its SKU / BOM node id). Overwrites the
stored code; pass null to clear it. Must stay unique among your active
instances — a code held by another returns 409 (see
External IDs).
"CEM-42.5R-25KG-MUNICH"
The production process's Emidat UUID. Pass null to leave the instance without a process.
First year this instance is valid. Narrowing the production period discards computed LCA results for the years that fall outside it.
2020 <= x <= 21002025
2020 <= x <= 2100Technical specifications as key/value pairs. Which keys apply depends
on the instance's elementary_id — cement, for example, takes
compressive_strength and density.
{
"compressive_strength": 42.5,
"density": 3100
}
Replaces the stored series wholesale — a year you omit is dropped,
and null clears the series. Each year must include its production
output and economic value; use null to clear either value.
Each year must fall inside the instance's production period.
Show child attributes
Show child attributes
Optional assertion of the resource ID. It must match the path id.
Optional assertion of the current plant. A different value returns
422.
Optional assertion of the current elementary. A different value returns
422.
Optional assertion of the current declared unit. A different value
returns 422.
M, M2, M3, UG, KG, T, L, KWH, MJ, UNIT, METRIC TON*KM Response
Updated product instance.
Your own code for this instance, as provided on creation.
The plant's Emidat UUID. Always present — set at creation and immutable.
Emidat material-type UUID — determines the product type.
The production process's Emidat UUID, or null if none.
M, M2, M3, UG, KG, T, L, KWH, MJ, UNIT, METRIC TON*KM "KG"
First year this instance is valid.
2025
Last valid year, or null if open-ended.
Technical specifications as key/value pairs. Which keys apply depends
on the instance's elementary_id — cement, for example, takes
compressive_strength and density.
{
"compressive_strength": 42.5,
"density": 3100
}
Production output and economic value per year.
Show child attributes
Show child attributes
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.
incomplete, draft "draft"