curl --request POST \
--url https://api.emidat.com/v2/supplier-products \
--header 'Content-Type: application/json' \
--header 'X-API-Key: <api-key>' \
--data '
{
"external_id": "CEMENT-SUPPLIER-DE-001",
"name": "Portland Cement CEM I 42.5 R",
"material_type": {
"category": "emidat-elementary",
"elementary_id": "22222222-2222-2222-2222-222222222222"
},
"supplier_plant_id": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
"transport_route": {
"truck_distance_km": 80
},
"plant_id": "11111111-1111-1111-1111-111111111111",
"epd_id": null
}
'import requests
url = "https://api.emidat.com/v2/supplier-products"
payload = {
"external_id": "CEMENT-SUPPLIER-DE-001",
"name": "Portland Cement CEM I 42.5 R",
"material_type": {
"category": "emidat-elementary",
"elementary_id": "22222222-2222-2222-2222-222222222222"
},
"supplier_plant_id": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
"transport_route": { "truck_distance_km": 80 },
"plant_id": "11111111-1111-1111-1111-111111111111",
"epd_id": None
}
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: 'CEMENT-SUPPLIER-DE-001',
name: 'Portland Cement CEM I 42.5 R',
material_type: {
category: 'emidat-elementary',
elementary_id: '22222222-2222-2222-2222-222222222222'
},
supplier_plant_id: 'a1b2c3d4-e5f6-7890-abcd-ef1234567890',
transport_route: {truck_distance_km: 80},
plant_id: '11111111-1111-1111-1111-111111111111',
epd_id: null
})
};
fetch('https://api.emidat.com/v2/supplier-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/supplier-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' => 'CEMENT-SUPPLIER-DE-001',
'name' => 'Portland Cement CEM I 42.5 R',
'material_type' => [
'category' => 'emidat-elementary',
'elementary_id' => '22222222-2222-2222-2222-222222222222'
],
'supplier_plant_id' => 'a1b2c3d4-e5f6-7890-abcd-ef1234567890',
'transport_route' => [
'truck_distance_km' => 80
],
'plant_id' => '11111111-1111-1111-1111-111111111111',
'epd_id' => null
]),
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/supplier-products"
payload := strings.NewReader("{\n \"external_id\": \"CEMENT-SUPPLIER-DE-001\",\n \"name\": \"Portland Cement CEM I 42.5 R\",\n \"material_type\": {\n \"category\": \"emidat-elementary\",\n \"elementary_id\": \"22222222-2222-2222-2222-222222222222\"\n },\n \"supplier_plant_id\": \"a1b2c3d4-e5f6-7890-abcd-ef1234567890\",\n \"transport_route\": {\n \"truck_distance_km\": 80\n },\n \"plant_id\": \"11111111-1111-1111-1111-111111111111\",\n \"epd_id\": null\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/supplier-products")
.header("X-API-Key", "<api-key>")
.header("Content-Type", "application/json")
.body("{\n \"external_id\": \"CEMENT-SUPPLIER-DE-001\",\n \"name\": \"Portland Cement CEM I 42.5 R\",\n \"material_type\": {\n \"category\": \"emidat-elementary\",\n \"elementary_id\": \"22222222-2222-2222-2222-222222222222\"\n },\n \"supplier_plant_id\": \"a1b2c3d4-e5f6-7890-abcd-ef1234567890\",\n \"transport_route\": {\n \"truck_distance_km\": 80\n },\n \"plant_id\": \"11111111-1111-1111-1111-111111111111\",\n \"epd_id\": null\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.emidat.com/v2/supplier-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\": \"CEMENT-SUPPLIER-DE-001\",\n \"name\": \"Portland Cement CEM I 42.5 R\",\n \"material_type\": {\n \"category\": \"emidat-elementary\",\n \"elementary_id\": \"22222222-2222-2222-2222-222222222222\"\n },\n \"supplier_plant_id\": \"a1b2c3d4-e5f6-7890-abcd-ef1234567890\",\n \"transport_route\": {\n \"truck_distance_km\": 80\n },\n \"plant_id\": \"11111111-1111-1111-1111-111111111111\",\n \"epd_id\": null\n}"
response = http.request(request)
puts response.read_body{
"id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"external_id": "<string>",
"name": "Portland Cement CEM I 42.5 R",
"material_type": {
"category": "emidat-elementary",
"elementary_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a"
},
"plant_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"supplier_plant_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"transport_route": {
"truck_distance_km": 123,
"train_distance_km": 123,
"ship_distance_km": 123
},
"epd_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"hazardous_substances": [
{
"cas_number": "7732-18-5",
"percentage": 2.5
}
],
"lifetime_years": 123,
"secondary_percentage": 123,
"moisture_content_percentage": 123,
"unit": "KG",
"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
}
],
"secondary_datasets": [
{
"name": "<string>",
"name_extra": "<string>",
"source_url": "<string>",
"database": "<string>",
"geography": "<string>",
"base_unit": "<string>"
}
],
"created_at": "2023-11-07T05:31:56Z"
}{
"id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"external_id": "<string>",
"name": "Portland Cement CEM I 42.5 R",
"material_type": {
"category": "emidat-elementary",
"elementary_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a"
},
"plant_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"supplier_plant_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"transport_route": {
"truck_distance_km": 123,
"train_distance_km": 123,
"ship_distance_km": 123
},
"epd_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"hazardous_substances": [
{
"cas_number": "7732-18-5",
"percentage": 2.5
}
],
"lifetime_years": 123,
"secondary_percentage": 123,
"moisture_content_percentage": 123,
"unit": "KG",
"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
}
],
"secondary_datasets": [
{
"name": "<string>",
"name_extra": "<string>",
"source_url": "<string>",
"database": "<string>",
"geography": "<string>",
"base_unit": "<string>"
}
],
"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
}
}Create supplier product
Creates a supplier product referencing an existing supplier plant by UUID.
The authenticated manufacturer is inferred from the API key. LCA impact
data is sourced from the linked epd_id (if provided) or from Emidat’s
background datasets behind material_type — the elementary_id for an
emidat-elementary, or the composite’s materials for a
custom-composite.
Idempotent create — a replay of the same Idempotency-Key returns the
original response (200); otherwise a new supplier product is created
(201). Your external_id must be unique: reusing one returns 409. See
External IDs.
curl --request POST \
--url https://api.emidat.com/v2/supplier-products \
--header 'Content-Type: application/json' \
--header 'X-API-Key: <api-key>' \
--data '
{
"external_id": "CEMENT-SUPPLIER-DE-001",
"name": "Portland Cement CEM I 42.5 R",
"material_type": {
"category": "emidat-elementary",
"elementary_id": "22222222-2222-2222-2222-222222222222"
},
"supplier_plant_id": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
"transport_route": {
"truck_distance_km": 80
},
"plant_id": "11111111-1111-1111-1111-111111111111",
"epd_id": null
}
'import requests
url = "https://api.emidat.com/v2/supplier-products"
payload = {
"external_id": "CEMENT-SUPPLIER-DE-001",
"name": "Portland Cement CEM I 42.5 R",
"material_type": {
"category": "emidat-elementary",
"elementary_id": "22222222-2222-2222-2222-222222222222"
},
"supplier_plant_id": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
"transport_route": { "truck_distance_km": 80 },
"plant_id": "11111111-1111-1111-1111-111111111111",
"epd_id": None
}
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: 'CEMENT-SUPPLIER-DE-001',
name: 'Portland Cement CEM I 42.5 R',
material_type: {
category: 'emidat-elementary',
elementary_id: '22222222-2222-2222-2222-222222222222'
},
supplier_plant_id: 'a1b2c3d4-e5f6-7890-abcd-ef1234567890',
transport_route: {truck_distance_km: 80},
plant_id: '11111111-1111-1111-1111-111111111111',
epd_id: null
})
};
fetch('https://api.emidat.com/v2/supplier-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/supplier-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' => 'CEMENT-SUPPLIER-DE-001',
'name' => 'Portland Cement CEM I 42.5 R',
'material_type' => [
'category' => 'emidat-elementary',
'elementary_id' => '22222222-2222-2222-2222-222222222222'
],
'supplier_plant_id' => 'a1b2c3d4-e5f6-7890-abcd-ef1234567890',
'transport_route' => [
'truck_distance_km' => 80
],
'plant_id' => '11111111-1111-1111-1111-111111111111',
'epd_id' => null
]),
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/supplier-products"
payload := strings.NewReader("{\n \"external_id\": \"CEMENT-SUPPLIER-DE-001\",\n \"name\": \"Portland Cement CEM I 42.5 R\",\n \"material_type\": {\n \"category\": \"emidat-elementary\",\n \"elementary_id\": \"22222222-2222-2222-2222-222222222222\"\n },\n \"supplier_plant_id\": \"a1b2c3d4-e5f6-7890-abcd-ef1234567890\",\n \"transport_route\": {\n \"truck_distance_km\": 80\n },\n \"plant_id\": \"11111111-1111-1111-1111-111111111111\",\n \"epd_id\": null\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/supplier-products")
.header("X-API-Key", "<api-key>")
.header("Content-Type", "application/json")
.body("{\n \"external_id\": \"CEMENT-SUPPLIER-DE-001\",\n \"name\": \"Portland Cement CEM I 42.5 R\",\n \"material_type\": {\n \"category\": \"emidat-elementary\",\n \"elementary_id\": \"22222222-2222-2222-2222-222222222222\"\n },\n \"supplier_plant_id\": \"a1b2c3d4-e5f6-7890-abcd-ef1234567890\",\n \"transport_route\": {\n \"truck_distance_km\": 80\n },\n \"plant_id\": \"11111111-1111-1111-1111-111111111111\",\n \"epd_id\": null\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.emidat.com/v2/supplier-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\": \"CEMENT-SUPPLIER-DE-001\",\n \"name\": \"Portland Cement CEM I 42.5 R\",\n \"material_type\": {\n \"category\": \"emidat-elementary\",\n \"elementary_id\": \"22222222-2222-2222-2222-222222222222\"\n },\n \"supplier_plant_id\": \"a1b2c3d4-e5f6-7890-abcd-ef1234567890\",\n \"transport_route\": {\n \"truck_distance_km\": 80\n },\n \"plant_id\": \"11111111-1111-1111-1111-111111111111\",\n \"epd_id\": null\n}"
response = http.request(request)
puts response.read_body{
"id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"external_id": "<string>",
"name": "Portland Cement CEM I 42.5 R",
"material_type": {
"category": "emidat-elementary",
"elementary_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a"
},
"plant_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"supplier_plant_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"transport_route": {
"truck_distance_km": 123,
"train_distance_km": 123,
"ship_distance_km": 123
},
"epd_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"hazardous_substances": [
{
"cas_number": "7732-18-5",
"percentage": 2.5
}
],
"lifetime_years": 123,
"secondary_percentage": 123,
"moisture_content_percentage": 123,
"unit": "KG",
"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
}
],
"secondary_datasets": [
{
"name": "<string>",
"name_extra": "<string>",
"source_url": "<string>",
"database": "<string>",
"geography": "<string>",
"base_unit": "<string>"
}
],
"created_at": "2023-11-07T05:31:56Z"
}{
"id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"external_id": "<string>",
"name": "Portland Cement CEM I 42.5 R",
"material_type": {
"category": "emidat-elementary",
"elementary_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a"
},
"plant_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"supplier_plant_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"transport_route": {
"truck_distance_km": 123,
"train_distance_km": 123,
"ship_distance_km": 123
},
"epd_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"hazardous_substances": [
{
"cas_number": "7732-18-5",
"percentage": 2.5
}
],
"lifetime_years": 123,
"secondary_percentage": 123,
"moisture_content_percentage": 123,
"unit": "KG",
"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
}
],
"secondary_datasets": [
{
"name": "<string>",
"name_extra": "<string>",
"source_url": "<string>",
"database": "<string>",
"geography": "<string>",
"base_unit": "<string>"
}
],
"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.
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
Name of the supplier product.
"Portland Cement CEM I 42.5 R"
What this supplier product is made of — either an Emidat elementary or
a composite you defined. Discriminated by category.
- Option 1
- Option 2
Show child attributes
Show child attributes
The plant's Emidat UUID.
Your own code for this supplier product (e.g. from your ERP). Optional.
When provided it is unique among your active supplier products —
creating another with the same code returns 409 (see
External IDs).
"COMP-001"
UUID of the supplier plant. Create via POST /v2/supplier-plants. Optional.
Transport distances from the supplier plant to your gate, one per modality (km). Optional.
Show child attributes
Show child attributes
Optional EPD UUID to link to this supplier product, if one was identified during setup.
Hazardous substances in this material, each by CAS number and mass share. Optional; defaults to none.
Show child attributes
Show child attributes
Expected service life in years. Optional.
Share of secondary (recycled) content, 0–100. Optional.
Moisture content as a percentage. Optional.
Response
Returned unchanged — an Idempotency-Key replay.
Your own code for this supplier product, as provided on creation.
"Portland Cement CEM I 42.5 R"
What this supplier product is made of — an Emidat elementary or a
composite, by reference. Discriminated by category. Resolve a
composite_id with GET /v2/composites/{id}.
- Option 1
- Option 2
Show child attributes
Show child attributes
The plant's Emidat UUID.
UUID of the supplier plant this material is sourced from. Resolve it
with GET /v2/supplier-plants/{id}.
Transport distances from the supplier plant to your gate, one per modality (km).
Show child attributes
Show child attributes
Hazardous substances in this material, each by CAS number and mass share.
Show child attributes
Show child attributes
M, M2, M3, UG, KG, T, L, KWH, MJ, UNIT, METRIC TON*KM "KG"
Characterized cradle-to-gate impacts of this supplier product per kg. Null until computed.
Show child attributes
Show child attributes
The transport portion of this product's impacts per kg. Null until computed.
Show child attributes
Show child attributes
Background datasets used to compute the impacts.
Show child attributes
Show child attributes