curl --request POST \
--url https://api.emidat.com/v2/supplier-companies \
--header 'Content-Type: application/json' \
--header 'X-API-Key: <api-key>' \
--data '
{
"external_id": "SUPPLIER-ACME",
"name": "Acme Materials GmbH"
}
'import requests
url = "https://api.emidat.com/v2/supplier-companies"
payload = {
"external_id": "SUPPLIER-ACME",
"name": "Acme Materials GmbH"
}
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: 'SUPPLIER-ACME', name: 'Acme Materials GmbH'})
};
fetch('https://api.emidat.com/v2/supplier-companies', 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-companies",
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' => 'SUPPLIER-ACME',
'name' => 'Acme Materials GmbH'
]),
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-companies"
payload := strings.NewReader("{\n \"external_id\": \"SUPPLIER-ACME\",\n \"name\": \"Acme Materials GmbH\"\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-companies")
.header("X-API-Key", "<api-key>")
.header("Content-Type", "application/json")
.body("{\n \"external_id\": \"SUPPLIER-ACME\",\n \"name\": \"Acme Materials GmbH\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.emidat.com/v2/supplier-companies")
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\": \"SUPPLIER-ACME\",\n \"name\": \"Acme Materials GmbH\"\n}"
response = http.request(request)
puts response.read_body{
"id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"external_id": "<string>",
"name": "Acme Materials GmbH",
"created_at": "2023-11-07T05:31:56Z"
}{
"id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"external_id": "<string>",
"name": "Acme Materials GmbH",
"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
},
"product_categories": [
"<string>"
],
"epd_category": 123
}{
"msg": "supplier product requires a supplier plant",
"err_code": "err_supplier_product_missing_supplier_plant",
"entitlement_limit": {
"dimension": "users",
"usage": 123,
"limit": 123
},
"product_categories": [
"<string>"
],
"epd_category": 123
}{
"msg": "supplier product requires a supplier plant",
"err_code": "err_supplier_product_missing_supplier_plant",
"entitlement_limit": {
"dimension": "users",
"usage": 123,
"limit": 123
},
"product_categories": [
"<string>"
],
"epd_category": 123
}{
"msg": "supplier product requires a supplier plant",
"err_code": "err_supplier_product_missing_supplier_plant",
"entitlement_limit": {
"dimension": "users",
"usage": 123,
"limit": 123
},
"product_categories": [
"<string>"
],
"epd_category": 123
}{
"msg": "supplier product requires a supplier plant",
"err_code": "err_supplier_product_missing_supplier_plant",
"entitlement_limit": {
"dimension": "users",
"usage": 123,
"limit": 123
},
"product_categories": [
"<string>"
],
"epd_category": 123
}Create supplier company
Creates a supplier company — the organization a supplier plant belongs to. It is global to your account: creating it does not associate it with any plant, only a material’s own reference to one of its supplier plants does that.
Idempotent create — a replay of the same Idempotency-Key returns the
original response (200); otherwise a new supplier company is created
(201). Your external_id must be unique: reusing one returns 409. See
External IDs.
name must also be unique among your active supplier companies,
compared case- and surrounding-whitespace-insensitively; a name already
held returns 409.
curl --request POST \
--url https://api.emidat.com/v2/supplier-companies \
--header 'Content-Type: application/json' \
--header 'X-API-Key: <api-key>' \
--data '
{
"external_id": "SUPPLIER-ACME",
"name": "Acme Materials GmbH"
}
'import requests
url = "https://api.emidat.com/v2/supplier-companies"
payload = {
"external_id": "SUPPLIER-ACME",
"name": "Acme Materials GmbH"
}
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: 'SUPPLIER-ACME', name: 'Acme Materials GmbH'})
};
fetch('https://api.emidat.com/v2/supplier-companies', 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-companies",
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' => 'SUPPLIER-ACME',
'name' => 'Acme Materials GmbH'
]),
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-companies"
payload := strings.NewReader("{\n \"external_id\": \"SUPPLIER-ACME\",\n \"name\": \"Acme Materials GmbH\"\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-companies")
.header("X-API-Key", "<api-key>")
.header("Content-Type", "application/json")
.body("{\n \"external_id\": \"SUPPLIER-ACME\",\n \"name\": \"Acme Materials GmbH\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.emidat.com/v2/supplier-companies")
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\": \"SUPPLIER-ACME\",\n \"name\": \"Acme Materials GmbH\"\n}"
response = http.request(request)
puts response.read_body{
"id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"external_id": "<string>",
"name": "Acme Materials GmbH",
"created_at": "2023-11-07T05:31:56Z"
}{
"id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"external_id": "<string>",
"name": "Acme Materials GmbH",
"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
},
"product_categories": [
"<string>"
],
"epd_category": 123
}{
"msg": "supplier product requires a supplier plant",
"err_code": "err_supplier_product_missing_supplier_plant",
"entitlement_limit": {
"dimension": "users",
"usage": 123,
"limit": 123
},
"product_categories": [
"<string>"
],
"epd_category": 123
}{
"msg": "supplier product requires a supplier plant",
"err_code": "err_supplier_product_missing_supplier_plant",
"entitlement_limit": {
"dimension": "users",
"usage": 123,
"limit": 123
},
"product_categories": [
"<string>"
],
"epd_category": 123
}{
"msg": "supplier product requires a supplier plant",
"err_code": "err_supplier_product_missing_supplier_plant",
"entitlement_limit": {
"dimension": "users",
"usage": 123,
"limit": 123
},
"product_categories": [
"<string>"
],
"epd_category": 123
}{
"msg": "supplier product requires a supplier plant",
"err_code": "err_supplier_product_missing_supplier_plant",
"entitlement_limit": {
"dimension": "users",
"usage": 123,
"limit": 123
},
"product_categories": [
"<string>"
],
"epd_category": 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 of 1–255 characters (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 (compared byte for byte) or create endpoint is
rejected with 409 err_idempotency_key_reused. Concurrent requests with
the same key receive 409 err_idempotency_in_progress. Keys are scoped
to your manufacturer; successful responses are retained for 6h without
extending that window on replay. Current permissions are required on
every retry; product-instance replays also require the original
production-data scopes. Deduplication is best effort: Redis data loss
can end the window early, and Redis unavailability, timeouts, or unreadable
cache entries can allow creation without replay protection. Successful
creates still return 201 if caching fails. Redis waits share a two-second
budget excluding creation time. Incompatible replay-format upgrades
reset replay protection, so retries across that boundary can create again.
An interrupted create can reserve the key for up to 6h.
See External IDs for recovery guidance.
1 - 255Body
Your own code for this supplier company. Required; pass null if
unset. A non-null code must be unique among your active supplier
companies; a duplicate returns 409 (see External
IDs).
"SUPPLIER-ACME"
Name of the supplier company. Unique among your active supplier
companies, compared ignoring case and surrounding whitespace — a name
already held returns 409 (err_supplier_name_exists).
"Acme Materials GmbH"