curl --request POST \
--url https://api.emidat.com/v2/silos \
--header 'Content-Type: application/json' \
--header 'X-API-Key: <api-key>' \
--data '
{
"external_id": "CEMENT_SILO_MUNICH_1",
"plant_id": "11111111-1111-1111-1111-111111111111",
"name": "Cement Silo 1 (Munich)",
"items": [
{
"supplier_product_id": "33333333-3333-3333-3333-333333333333",
"annual_items": [
{
"year": 2024,
"amount": 600000
},
{
"year": 2025,
"amount": 650000
}
]
},
{
"supplier_product_id": "44444444-4444-4444-4444-444444444444",
"annual_items": [
{
"year": 2024,
"amount": 400000
}
]
}
]
}
'import requests
url = "https://api.emidat.com/v2/silos"
payload = {
"external_id": "CEMENT_SILO_MUNICH_1",
"plant_id": "11111111-1111-1111-1111-111111111111",
"name": "Cement Silo 1 (Munich)",
"items": [
{
"supplier_product_id": "33333333-3333-3333-3333-333333333333",
"annual_items": [
{
"year": 2024,
"amount": 600000
},
{
"year": 2025,
"amount": 650000
}
]
},
{
"supplier_product_id": "44444444-4444-4444-4444-444444444444",
"annual_items": [
{
"year": 2024,
"amount": 400000
}
]
}
]
}
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_SILO_MUNICH_1',
plant_id: '11111111-1111-1111-1111-111111111111',
name: 'Cement Silo 1 (Munich)',
items: [
{
supplier_product_id: '33333333-3333-3333-3333-333333333333',
annual_items: [{year: 2024, amount: 600000}, {year: 2025, amount: 650000}]
},
{
supplier_product_id: '44444444-4444-4444-4444-444444444444',
annual_items: [{year: 2024, amount: 400000}]
}
]
})
};
fetch('https://api.emidat.com/v2/silos', 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/silos",
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_SILO_MUNICH_1',
'plant_id' => '11111111-1111-1111-1111-111111111111',
'name' => 'Cement Silo 1 (Munich)',
'items' => [
[
'supplier_product_id' => '33333333-3333-3333-3333-333333333333',
'annual_items' => [
[
'year' => 2024,
'amount' => 600000
],
[
'year' => 2025,
'amount' => 650000
]
]
],
[
'supplier_product_id' => '44444444-4444-4444-4444-444444444444',
'annual_items' => [
[
'year' => 2024,
'amount' => 400000
]
]
]
]
]),
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/silos"
payload := strings.NewReader("{\n \"external_id\": \"CEMENT_SILO_MUNICH_1\",\n \"plant_id\": \"11111111-1111-1111-1111-111111111111\",\n \"name\": \"Cement Silo 1 (Munich)\",\n \"items\": [\n {\n \"supplier_product_id\": \"33333333-3333-3333-3333-333333333333\",\n \"annual_items\": [\n {\n \"year\": 2024,\n \"amount\": 600000\n },\n {\n \"year\": 2025,\n \"amount\": 650000\n }\n ]\n },\n {\n \"supplier_product_id\": \"44444444-4444-4444-4444-444444444444\",\n \"annual_items\": [\n {\n \"year\": 2024,\n \"amount\": 400000\n }\n ]\n }\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/silos")
.header("X-API-Key", "<api-key>")
.header("Content-Type", "application/json")
.body("{\n \"external_id\": \"CEMENT_SILO_MUNICH_1\",\n \"plant_id\": \"11111111-1111-1111-1111-111111111111\",\n \"name\": \"Cement Silo 1 (Munich)\",\n \"items\": [\n {\n \"supplier_product_id\": \"33333333-3333-3333-3333-333333333333\",\n \"annual_items\": [\n {\n \"year\": 2024,\n \"amount\": 600000\n },\n {\n \"year\": 2025,\n \"amount\": 650000\n }\n ]\n },\n {\n \"supplier_product_id\": \"44444444-4444-4444-4444-444444444444\",\n \"annual_items\": [\n {\n \"year\": 2024,\n \"amount\": 400000\n }\n ]\n }\n ]\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.emidat.com/v2/silos")
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_SILO_MUNICH_1\",\n \"plant_id\": \"11111111-1111-1111-1111-111111111111\",\n \"name\": \"Cement Silo 1 (Munich)\",\n \"items\": [\n {\n \"supplier_product_id\": \"33333333-3333-3333-3333-333333333333\",\n \"annual_items\": [\n {\n \"year\": 2024,\n \"amount\": 600000\n },\n {\n \"year\": 2025,\n \"amount\": 650000\n }\n ]\n },\n {\n \"supplier_product_id\": \"44444444-4444-4444-4444-444444444444\",\n \"annual_items\": [\n {\n \"year\": 2024,\n \"amount\": 400000\n }\n ]\n }\n ]\n}"
response = http.request(request)
puts response.read_body{
"id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"external_id": "CEMENT_SILO_MUNICH_1",
"plant_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"name": "Cement Silo 1 (Munich)",
"items": [
{
"supplier_product_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"annual_items": [
{
"year": 2024,
"amount": 5000
}
]
}
],
"created_at": "2023-11-07T05:31:56Z"
}{
"id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"external_id": "CEMENT_SILO_MUNICH_1",
"plant_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"name": "Cement Silo 1 (Munich)",
"items": [
{
"supplier_product_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"annual_items": [
{
"year": 2024,
"amount": 5000
}
]
}
],
"created_at": "2023-11-07T05:31:56Z"
}{
"msg": "supplier product requires a supplier plant",
"err_code": "err_supplier_product_missing_supplier_plant"
}{
"msg": "supplier product requires a supplier plant",
"err_code": "err_supplier_product_missing_supplier_plant"
}{
"msg": "supplier product requires a supplier plant",
"err_code": "err_supplier_product_missing_supplier_plant"
}{
"msg": "supplier product requires a supplier plant",
"err_code": "err_supplier_product_missing_supplier_plant"
}{
"msg": "supplier product requires a supplier plant",
"err_code": "err_supplier_product_missing_supplier_plant"
}Create silo
Creates a silo at one of your plants. A silo holds same-type
supplier products from one or more suppliers; a BOM can reference
the silo instead of individual supplier products by using
type: silo.
Idempotent create — a replay of the same Idempotency-Key returns the
original response (200); otherwise a new silo 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/silos \
--header 'Content-Type: application/json' \
--header 'X-API-Key: <api-key>' \
--data '
{
"external_id": "CEMENT_SILO_MUNICH_1",
"plant_id": "11111111-1111-1111-1111-111111111111",
"name": "Cement Silo 1 (Munich)",
"items": [
{
"supplier_product_id": "33333333-3333-3333-3333-333333333333",
"annual_items": [
{
"year": 2024,
"amount": 600000
},
{
"year": 2025,
"amount": 650000
}
]
},
{
"supplier_product_id": "44444444-4444-4444-4444-444444444444",
"annual_items": [
{
"year": 2024,
"amount": 400000
}
]
}
]
}
'import requests
url = "https://api.emidat.com/v2/silos"
payload = {
"external_id": "CEMENT_SILO_MUNICH_1",
"plant_id": "11111111-1111-1111-1111-111111111111",
"name": "Cement Silo 1 (Munich)",
"items": [
{
"supplier_product_id": "33333333-3333-3333-3333-333333333333",
"annual_items": [
{
"year": 2024,
"amount": 600000
},
{
"year": 2025,
"amount": 650000
}
]
},
{
"supplier_product_id": "44444444-4444-4444-4444-444444444444",
"annual_items": [
{
"year": 2024,
"amount": 400000
}
]
}
]
}
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_SILO_MUNICH_1',
plant_id: '11111111-1111-1111-1111-111111111111',
name: 'Cement Silo 1 (Munich)',
items: [
{
supplier_product_id: '33333333-3333-3333-3333-333333333333',
annual_items: [{year: 2024, amount: 600000}, {year: 2025, amount: 650000}]
},
{
supplier_product_id: '44444444-4444-4444-4444-444444444444',
annual_items: [{year: 2024, amount: 400000}]
}
]
})
};
fetch('https://api.emidat.com/v2/silos', 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/silos",
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_SILO_MUNICH_1',
'plant_id' => '11111111-1111-1111-1111-111111111111',
'name' => 'Cement Silo 1 (Munich)',
'items' => [
[
'supplier_product_id' => '33333333-3333-3333-3333-333333333333',
'annual_items' => [
[
'year' => 2024,
'amount' => 600000
],
[
'year' => 2025,
'amount' => 650000
]
]
],
[
'supplier_product_id' => '44444444-4444-4444-4444-444444444444',
'annual_items' => [
[
'year' => 2024,
'amount' => 400000
]
]
]
]
]),
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/silos"
payload := strings.NewReader("{\n \"external_id\": \"CEMENT_SILO_MUNICH_1\",\n \"plant_id\": \"11111111-1111-1111-1111-111111111111\",\n \"name\": \"Cement Silo 1 (Munich)\",\n \"items\": [\n {\n \"supplier_product_id\": \"33333333-3333-3333-3333-333333333333\",\n \"annual_items\": [\n {\n \"year\": 2024,\n \"amount\": 600000\n },\n {\n \"year\": 2025,\n \"amount\": 650000\n }\n ]\n },\n {\n \"supplier_product_id\": \"44444444-4444-4444-4444-444444444444\",\n \"annual_items\": [\n {\n \"year\": 2024,\n \"amount\": 400000\n }\n ]\n }\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/silos")
.header("X-API-Key", "<api-key>")
.header("Content-Type", "application/json")
.body("{\n \"external_id\": \"CEMENT_SILO_MUNICH_1\",\n \"plant_id\": \"11111111-1111-1111-1111-111111111111\",\n \"name\": \"Cement Silo 1 (Munich)\",\n \"items\": [\n {\n \"supplier_product_id\": \"33333333-3333-3333-3333-333333333333\",\n \"annual_items\": [\n {\n \"year\": 2024,\n \"amount\": 600000\n },\n {\n \"year\": 2025,\n \"amount\": 650000\n }\n ]\n },\n {\n \"supplier_product_id\": \"44444444-4444-4444-4444-444444444444\",\n \"annual_items\": [\n {\n \"year\": 2024,\n \"amount\": 400000\n }\n ]\n }\n ]\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.emidat.com/v2/silos")
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_SILO_MUNICH_1\",\n \"plant_id\": \"11111111-1111-1111-1111-111111111111\",\n \"name\": \"Cement Silo 1 (Munich)\",\n \"items\": [\n {\n \"supplier_product_id\": \"33333333-3333-3333-3333-333333333333\",\n \"annual_items\": [\n {\n \"year\": 2024,\n \"amount\": 600000\n },\n {\n \"year\": 2025,\n \"amount\": 650000\n }\n ]\n },\n {\n \"supplier_product_id\": \"44444444-4444-4444-4444-444444444444\",\n \"annual_items\": [\n {\n \"year\": 2024,\n \"amount\": 400000\n }\n ]\n }\n ]\n}"
response = http.request(request)
puts response.read_body{
"id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"external_id": "CEMENT_SILO_MUNICH_1",
"plant_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"name": "Cement Silo 1 (Munich)",
"items": [
{
"supplier_product_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"annual_items": [
{
"year": 2024,
"amount": 5000
}
]
}
],
"created_at": "2023-11-07T05:31:56Z"
}{
"id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"external_id": "CEMENT_SILO_MUNICH_1",
"plant_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"name": "Cement Silo 1 (Munich)",
"items": [
{
"supplier_product_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"annual_items": [
{
"year": 2024,
"amount": 5000
}
]
}
],
"created_at": "2023-11-07T05:31:56Z"
}{
"msg": "supplier product requires a supplier plant",
"err_code": "err_supplier_product_missing_supplier_plant"
}{
"msg": "supplier product requires a supplier plant",
"err_code": "err_supplier_product_missing_supplier_plant"
}{
"msg": "supplier product requires a supplier plant",
"err_code": "err_supplier_product_missing_supplier_plant"
}{
"msg": "supplier product requires a supplier plant",
"err_code": "err_supplier_product_missing_supplier_plant"
}{
"msg": "supplier product requires a supplier plant",
"err_code": "err_supplier_product_missing_supplier_plant"
}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
The plant's Emidat UUID.
Human-readable silo name.
"Cement Silo 1 (Munich)"
Supplier products that constitute this silo — at least 1, all the
same material type (see SiloItem), at this silo's plant, with no
duplicates.
1Show child attributes
Show child attributes
Your own silo code. Optional. When provided it is unique among your
active silos — creating another with the same code returns 409 (see
External IDs).
"CEMENT_SILO_MUNICH_1"
Response
Returned unchanged — an Idempotency-Key replay.
Emidat-assigned silo UUID.
Your own code for this silo, null when none is set. BOM entries reference it by its Emidat id, not this code.
"CEMENT_SILO_MUNICH_1"
The plant's Emidat UUID.
Human-readable silo name.
"Cement Silo 1 (Munich)"
Supplier products constituting this silo, with yearly purchase volumes.
Show child attributes
Show child attributes