curl --request POST \
--url https://api.emidat.com/v2/prechain-products \
--header 'Content-Type: application/json' \
--header 'X-API-Key: <api-key>' \
--data '
{
"external_id": "PRECHAIN-CLINKER-001",
"product_instance_id": "44444444-4444-4444-4444-444444444444",
"plant_id": "11111111-1111-1111-1111-111111111111",
"transport_route": {
"truck_distance_km": 120
}
}
'import requests
url = "https://api.emidat.com/v2/prechain-products"
payload = {
"external_id": "PRECHAIN-CLINKER-001",
"product_instance_id": "44444444-4444-4444-4444-444444444444",
"plant_id": "11111111-1111-1111-1111-111111111111",
"transport_route": { "truck_distance_km": 120 }
}
headers = {
"X-API-Key": "<api-key>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {'X-API-Key': '<api-key>', 'Content-Type': 'application/json'},
body: JSON.stringify({
external_id: 'PRECHAIN-CLINKER-001',
product_instance_id: '44444444-4444-4444-4444-444444444444',
plant_id: '11111111-1111-1111-1111-111111111111',
transport_route: {truck_distance_km: 120}
})
};
fetch('https://api.emidat.com/v2/prechain-products', 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/prechain-products",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_POSTFIELDS => json_encode([
'external_id' => 'PRECHAIN-CLINKER-001',
'product_instance_id' => '44444444-4444-4444-4444-444444444444',
'plant_id' => '11111111-1111-1111-1111-111111111111',
'transport_route' => [
'truck_distance_km' => 120
]
]),
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/prechain-products"
payload := strings.NewReader("{\n \"external_id\": \"PRECHAIN-CLINKER-001\",\n \"product_instance_id\": \"44444444-4444-4444-4444-444444444444\",\n \"plant_id\": \"11111111-1111-1111-1111-111111111111\",\n \"transport_route\": {\n \"truck_distance_km\": 120\n }\n}")
req, _ := http.NewRequest("POST", 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.post("https://api.emidat.com/v2/prechain-products")
.header("X-API-Key", "<api-key>")
.header("Content-Type", "application/json")
.body("{\n \"external_id\": \"PRECHAIN-CLINKER-001\",\n \"product_instance_id\": \"44444444-4444-4444-4444-444444444444\",\n \"plant_id\": \"11111111-1111-1111-1111-111111111111\",\n \"transport_route\": {\n \"truck_distance_km\": 120\n }\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.emidat.com/v2/prechain-products")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["X-API-Key"] = '<api-key>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"external_id\": \"PRECHAIN-CLINKER-001\",\n \"product_instance_id\": \"44444444-4444-4444-4444-444444444444\",\n \"plant_id\": \"11111111-1111-1111-1111-111111111111\",\n \"transport_route\": {\n \"truck_distance_km\": 120\n }\n}"
response = http.request(request)
puts response.read_body{
"id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"external_id": "<string>",
"product_instance_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"plant_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"transport_route": {
"truck_distance_km": 123,
"train_distance_km": 123,
"ship_distance_km": 123
},
"impacts_per_kg": [
{
"indicator_name": "GWP-total",
"unit": "kg CO2-Eq",
"value": -1.7838794215158404
}
],
"transport_impacts_per_kg": [
{
"indicator_name": "GWP-total",
"unit": "kg CO2-Eq",
"value": -1.7838794215158404
}
]
}{
"id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"external_id": "<string>",
"product_instance_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"plant_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"transport_route": {
"truck_distance_km": 123,
"train_distance_km": 123,
"ship_distance_km": 123
},
"impacts_per_kg": [
{
"indicator_name": "GWP-total",
"unit": "kg CO2-Eq",
"value": -1.7838794215158404
}
],
"transport_impacts_per_kg": [
{
"indicator_name": "GWP-total",
"unit": "kg CO2-Eq",
"value": -1.7838794215158404
}
]
}{
"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
}
}Create prechain product
Registers an existing product instance as an upstream (“prechain”) input at one of your plants, with an optional transport route.
Idempotent create — a replay of the same Idempotency-Key returns the
original response (200); otherwise a new prechain product is created
(201). See External IDs.
curl --request POST \
--url https://api.emidat.com/v2/prechain-products \
--header 'Content-Type: application/json' \
--header 'X-API-Key: <api-key>' \
--data '
{
"external_id": "PRECHAIN-CLINKER-001",
"product_instance_id": "44444444-4444-4444-4444-444444444444",
"plant_id": "11111111-1111-1111-1111-111111111111",
"transport_route": {
"truck_distance_km": 120
}
}
'import requests
url = "https://api.emidat.com/v2/prechain-products"
payload = {
"external_id": "PRECHAIN-CLINKER-001",
"product_instance_id": "44444444-4444-4444-4444-444444444444",
"plant_id": "11111111-1111-1111-1111-111111111111",
"transport_route": { "truck_distance_km": 120 }
}
headers = {
"X-API-Key": "<api-key>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {'X-API-Key': '<api-key>', 'Content-Type': 'application/json'},
body: JSON.stringify({
external_id: 'PRECHAIN-CLINKER-001',
product_instance_id: '44444444-4444-4444-4444-444444444444',
plant_id: '11111111-1111-1111-1111-111111111111',
transport_route: {truck_distance_km: 120}
})
};
fetch('https://api.emidat.com/v2/prechain-products', 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/prechain-products",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_POSTFIELDS => json_encode([
'external_id' => 'PRECHAIN-CLINKER-001',
'product_instance_id' => '44444444-4444-4444-4444-444444444444',
'plant_id' => '11111111-1111-1111-1111-111111111111',
'transport_route' => [
'truck_distance_km' => 120
]
]),
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/prechain-products"
payload := strings.NewReader("{\n \"external_id\": \"PRECHAIN-CLINKER-001\",\n \"product_instance_id\": \"44444444-4444-4444-4444-444444444444\",\n \"plant_id\": \"11111111-1111-1111-1111-111111111111\",\n \"transport_route\": {\n \"truck_distance_km\": 120\n }\n}")
req, _ := http.NewRequest("POST", 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.post("https://api.emidat.com/v2/prechain-products")
.header("X-API-Key", "<api-key>")
.header("Content-Type", "application/json")
.body("{\n \"external_id\": \"PRECHAIN-CLINKER-001\",\n \"product_instance_id\": \"44444444-4444-4444-4444-444444444444\",\n \"plant_id\": \"11111111-1111-1111-1111-111111111111\",\n \"transport_route\": {\n \"truck_distance_km\": 120\n }\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.emidat.com/v2/prechain-products")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["X-API-Key"] = '<api-key>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"external_id\": \"PRECHAIN-CLINKER-001\",\n \"product_instance_id\": \"44444444-4444-4444-4444-444444444444\",\n \"plant_id\": \"11111111-1111-1111-1111-111111111111\",\n \"transport_route\": {\n \"truck_distance_km\": 120\n }\n}"
response = http.request(request)
puts response.read_body{
"id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"external_id": "<string>",
"product_instance_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"plant_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"transport_route": {
"truck_distance_km": 123,
"train_distance_km": 123,
"ship_distance_km": 123
},
"impacts_per_kg": [
{
"indicator_name": "GWP-total",
"unit": "kg CO2-Eq",
"value": -1.7838794215158404
}
],
"transport_impacts_per_kg": [
{
"indicator_name": "GWP-total",
"unit": "kg CO2-Eq",
"value": -1.7838794215158404
}
]
}{
"id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"external_id": "<string>",
"product_instance_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"plant_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"transport_route": {
"truck_distance_km": 123,
"train_distance_km": 123,
"ship_distance_km": 123
},
"impacts_per_kg": [
{
"indicator_name": "GWP-total",
"unit": "kg CO2-Eq",
"value": -1.7838794215158404
}
],
"transport_impacts_per_kg": [
{
"indicator_name": "GWP-total",
"unit": "kg CO2-Eq",
"value": -1.7838794215158404
}
]
}{
"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.
Headers
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
UUID of the product instance used as the upstream input. Create via
POST /v2/product-instances, or resolve your code with
GET /v2/product-instances?external_id=….
UUID of the plant that consumes this input.
Your own code for this prechain product. Optional, and unique among your active prechain products. See External IDs.
Transport distances from where the product is made to the consuming plant, one per modality (km). Optional.
Show child attributes
Show child attributes
Response
Returned unchanged — an Idempotency-Key replay.
An existing product instance used as an upstream ("prechain") input at one of your plants, with an optional transport route and its per-kg impacts.
Your own code for this prechain product, or null if none.
UUID of the product instance used as the input.
UUID of the consuming plant.
Transport distances to the consuming plant, one per modality (km).
Show child attributes
Show child attributes
Characterized impacts of the input per kg. Null until computed.
Show child attributes
Show child attributes
Transport-only impacts per kg. Null until computed.
Show child attributes
Show child attributes