curl --request POST \
--url https://api.comstruct.com/v1/suppliers/sap \
--header 'Content-Type: application/json' \
--header 'X-API-Key: <api-key>' \
--data '
[
{
"number": "EXTERNAL-09092",
"title": "Beispiel GmbH-8",
"legal_uid": "D456789900022202",
"country_code": "US",
"comment": "Bevorzugter Kontakt per E-Mail",
"payment_term": "90T",
"wth_tax_code": "90",
"bank_details": [
{
"number": "9999912",
"iban": "DE89370400440532013000"
},
{
"external_id": "8881112",
"iban": "GB33BUKB20201555555555"
}
],
"address": {
"address": "Müllerstraße 1",
"city": "Berlin",
"zip": "10115",
"country_code": "DE"
}
}
]
'import requests
url = "https://api.comstruct.com/v1/suppliers/sap"
payload = [
{
"number": "EXTERNAL-09092",
"title": "Beispiel GmbH-8",
"legal_uid": "D456789900022202",
"country_code": "US",
"comment": "Bevorzugter Kontakt per E-Mail",
"payment_term": "90T",
"wth_tax_code": "90",
"bank_details": [
{
"number": "9999912",
"iban": "DE89370400440532013000"
},
{
"external_id": "8881112",
"iban": "GB33BUKB20201555555555"
}
],
"address": {
"address": "Müllerstraße 1",
"city": "Berlin",
"zip": "10115",
"country_code": "DE"
}
}
]
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([
{
number: 'EXTERNAL-09092',
title: 'Beispiel GmbH-8',
legal_uid: 'D456789900022202',
country_code: 'US',
comment: 'Bevorzugter Kontakt per E-Mail',
payment_term: '90T',
wth_tax_code: '90',
bank_details: [
{number: '9999912', iban: 'DE89370400440532013000'},
{external_id: '8881112', iban: 'GB33BUKB20201555555555'}
],
address: {address: 'Müllerstraße 1', city: 'Berlin', zip: '10115', country_code: 'DE'}
}
])
};
fetch('https://api.comstruct.com/v1/suppliers/sap', 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.comstruct.com/v1/suppliers/sap",
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([
[
'number' => 'EXTERNAL-09092',
'title' => 'Beispiel GmbH-8',
'legal_uid' => 'D456789900022202',
'country_code' => 'US',
'comment' => 'Bevorzugter Kontakt per E-Mail',
'payment_term' => '90T',
'wth_tax_code' => '90',
'bank_details' => [
[
'number' => '9999912',
'iban' => 'DE89370400440532013000'
],
[
'external_id' => '8881112',
'iban' => 'GB33BUKB20201555555555'
]
],
'address' => [
'address' => 'Müllerstraße 1',
'city' => 'Berlin',
'zip' => '10115',
'country_code' => 'DE'
]
]
]),
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.comstruct.com/v1/suppliers/sap"
payload := strings.NewReader("[\n {\n \"number\": \"EXTERNAL-09092\",\n \"title\": \"Beispiel GmbH-8\",\n \"legal_uid\": \"D456789900022202\",\n \"country_code\": \"US\",\n \"comment\": \"Bevorzugter Kontakt per E-Mail\",\n \"payment_term\": \"90T\",\n \"wth_tax_code\": \"90\",\n \"bank_details\": [\n {\n \"number\": \"9999912\",\n \"iban\": \"DE89370400440532013000\"\n },\n {\n \"external_id\": \"8881112\",\n \"iban\": \"GB33BUKB20201555555555\"\n }\n ],\n \"address\": {\n \"address\": \"Müllerstraße 1\",\n \"city\": \"Berlin\",\n \"zip\": \"10115\",\n \"country_code\": \"DE\"\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.comstruct.com/v1/suppliers/sap")
.header("X-API-Key", "<api-key>")
.header("Content-Type", "application/json")
.body("[\n {\n \"number\": \"EXTERNAL-09092\",\n \"title\": \"Beispiel GmbH-8\",\n \"legal_uid\": \"D456789900022202\",\n \"country_code\": \"US\",\n \"comment\": \"Bevorzugter Kontakt per E-Mail\",\n \"payment_term\": \"90T\",\n \"wth_tax_code\": \"90\",\n \"bank_details\": [\n {\n \"number\": \"9999912\",\n \"iban\": \"DE89370400440532013000\"\n },\n {\n \"external_id\": \"8881112\",\n \"iban\": \"GB33BUKB20201555555555\"\n }\n ],\n \"address\": {\n \"address\": \"Müllerstraße 1\",\n \"city\": \"Berlin\",\n \"zip\": \"10115\",\n \"country_code\": \"DE\"\n }\n }\n]")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.comstruct.com/v1/suppliers/sap")
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 {\n \"number\": \"EXTERNAL-09092\",\n \"title\": \"Beispiel GmbH-8\",\n \"legal_uid\": \"D456789900022202\",\n \"country_code\": \"US\",\n \"comment\": \"Bevorzugter Kontakt per E-Mail\",\n \"payment_term\": \"90T\",\n \"wth_tax_code\": \"90\",\n \"bank_details\": [\n {\n \"number\": \"9999912\",\n \"iban\": \"DE89370400440532013000\"\n },\n {\n \"external_id\": \"8881112\",\n \"iban\": \"GB33BUKB20201555555555\"\n }\n ],\n \"address\": {\n \"address\": \"Müllerstraße 1\",\n \"city\": \"Berlin\",\n \"zip\": \"10115\",\n \"country_code\": \"DE\"\n }\n }\n]"
response = http.request(request)
puts response.read_body{
"message": "Supplier data received successfully"
}{
"error": "<string>",
"message": "<string>"
}{
"error": "Unauthorized. Key is not linked to any customer."
}{
"error": "Unauthorized. Missing scope: suppliers:write"
}{
"error": "<string>"
}SAP-Lieferanten erstellen oder aktualisieren
Erforderliche Berechtigungen: suppliers:write
Empfängt und verarbeitet Lieferanten aus dem SAP-System. Akzeptiert ein Array von SAP-Lieferanten als Rohdaten.
number wird als external_id gespeichert und für Upserts pro Kunde verwendet.
API-Schlüssel muss mit einem Kunden verknüpft sein.
Validierung: Der Body muss ein Array sein, title ist je Lieferant erforderlich, und angegebene Zahlungsbedingungen müssen im comstruct-Mandanten existieren.
curl --request POST \
--url https://api.comstruct.com/v1/suppliers/sap \
--header 'Content-Type: application/json' \
--header 'X-API-Key: <api-key>' \
--data '
[
{
"number": "EXTERNAL-09092",
"title": "Beispiel GmbH-8",
"legal_uid": "D456789900022202",
"country_code": "US",
"comment": "Bevorzugter Kontakt per E-Mail",
"payment_term": "90T",
"wth_tax_code": "90",
"bank_details": [
{
"number": "9999912",
"iban": "DE89370400440532013000"
},
{
"external_id": "8881112",
"iban": "GB33BUKB20201555555555"
}
],
"address": {
"address": "Müllerstraße 1",
"city": "Berlin",
"zip": "10115",
"country_code": "DE"
}
}
]
'import requests
url = "https://api.comstruct.com/v1/suppliers/sap"
payload = [
{
"number": "EXTERNAL-09092",
"title": "Beispiel GmbH-8",
"legal_uid": "D456789900022202",
"country_code": "US",
"comment": "Bevorzugter Kontakt per E-Mail",
"payment_term": "90T",
"wth_tax_code": "90",
"bank_details": [
{
"number": "9999912",
"iban": "DE89370400440532013000"
},
{
"external_id": "8881112",
"iban": "GB33BUKB20201555555555"
}
],
"address": {
"address": "Müllerstraße 1",
"city": "Berlin",
"zip": "10115",
"country_code": "DE"
}
}
]
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([
{
number: 'EXTERNAL-09092',
title: 'Beispiel GmbH-8',
legal_uid: 'D456789900022202',
country_code: 'US',
comment: 'Bevorzugter Kontakt per E-Mail',
payment_term: '90T',
wth_tax_code: '90',
bank_details: [
{number: '9999912', iban: 'DE89370400440532013000'},
{external_id: '8881112', iban: 'GB33BUKB20201555555555'}
],
address: {address: 'Müllerstraße 1', city: 'Berlin', zip: '10115', country_code: 'DE'}
}
])
};
fetch('https://api.comstruct.com/v1/suppliers/sap', 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.comstruct.com/v1/suppliers/sap",
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([
[
'number' => 'EXTERNAL-09092',
'title' => 'Beispiel GmbH-8',
'legal_uid' => 'D456789900022202',
'country_code' => 'US',
'comment' => 'Bevorzugter Kontakt per E-Mail',
'payment_term' => '90T',
'wth_tax_code' => '90',
'bank_details' => [
[
'number' => '9999912',
'iban' => 'DE89370400440532013000'
],
[
'external_id' => '8881112',
'iban' => 'GB33BUKB20201555555555'
]
],
'address' => [
'address' => 'Müllerstraße 1',
'city' => 'Berlin',
'zip' => '10115',
'country_code' => 'DE'
]
]
]),
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.comstruct.com/v1/suppliers/sap"
payload := strings.NewReader("[\n {\n \"number\": \"EXTERNAL-09092\",\n \"title\": \"Beispiel GmbH-8\",\n \"legal_uid\": \"D456789900022202\",\n \"country_code\": \"US\",\n \"comment\": \"Bevorzugter Kontakt per E-Mail\",\n \"payment_term\": \"90T\",\n \"wth_tax_code\": \"90\",\n \"bank_details\": [\n {\n \"number\": \"9999912\",\n \"iban\": \"DE89370400440532013000\"\n },\n {\n \"external_id\": \"8881112\",\n \"iban\": \"GB33BUKB20201555555555\"\n }\n ],\n \"address\": {\n \"address\": \"Müllerstraße 1\",\n \"city\": \"Berlin\",\n \"zip\": \"10115\",\n \"country_code\": \"DE\"\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.comstruct.com/v1/suppliers/sap")
.header("X-API-Key", "<api-key>")
.header("Content-Type", "application/json")
.body("[\n {\n \"number\": \"EXTERNAL-09092\",\n \"title\": \"Beispiel GmbH-8\",\n \"legal_uid\": \"D456789900022202\",\n \"country_code\": \"US\",\n \"comment\": \"Bevorzugter Kontakt per E-Mail\",\n \"payment_term\": \"90T\",\n \"wth_tax_code\": \"90\",\n \"bank_details\": [\n {\n \"number\": \"9999912\",\n \"iban\": \"DE89370400440532013000\"\n },\n {\n \"external_id\": \"8881112\",\n \"iban\": \"GB33BUKB20201555555555\"\n }\n ],\n \"address\": {\n \"address\": \"Müllerstraße 1\",\n \"city\": \"Berlin\",\n \"zip\": \"10115\",\n \"country_code\": \"DE\"\n }\n }\n]")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.comstruct.com/v1/suppliers/sap")
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 {\n \"number\": \"EXTERNAL-09092\",\n \"title\": \"Beispiel GmbH-8\",\n \"legal_uid\": \"D456789900022202\",\n \"country_code\": \"US\",\n \"comment\": \"Bevorzugter Kontakt per E-Mail\",\n \"payment_term\": \"90T\",\n \"wth_tax_code\": \"90\",\n \"bank_details\": [\n {\n \"number\": \"9999912\",\n \"iban\": \"DE89370400440532013000\"\n },\n {\n \"external_id\": \"8881112\",\n \"iban\": \"GB33BUKB20201555555555\"\n }\n ],\n \"address\": {\n \"address\": \"Müllerstraße 1\",\n \"city\": \"Berlin\",\n \"zip\": \"10115\",\n \"country_code\": \"DE\"\n }\n }\n]"
response = http.request(request)
puts response.read_body{
"message": "Supplier data received successfully"
}{
"error": "<string>",
"message": "<string>"
}{
"error": "Unauthorized. Key is not linked to any customer."
}{
"error": "Unauthorized. Missing scope: suppliers:write"
}{
"error": "<string>"
}Übersicht
Mit diesem Endpunkt synchronisieren Kundensysteme Lieferanten aus SAP nach comstruct. Der Request-Body ist immer ein Array, sodass ein einzelner Lieferant und Batches über denselbenPOST-Aufruf verarbeitet werden.
Wenn number gesetzt ist, wird sie als external_id des Lieferanten gespeichert.
Existiert für denselben Kunden bereits ein Lieferant mit dieser external_id,
wird der Datensatz aktualisiert.
number für jeden SAP-Lieferanten mit. Das Feld ist für die
Schema-Validierung nicht zwingend, wird aber für idempotente SAP-Syncs und
spätere Lookups benötigt.Berechtigungen
| Scope | Tenant-Typ |
|---|---|
suppliers:write | Kunden-API-Schlüssel |
Header
| Header | Pflicht | Beschreibung |
|---|---|---|
x-api-key | Ja | API-Schlüssel mit Scope suppliers:write |
Content-Type | Ja | application/json |
Request-Body
Der Body muss ein JSON-Array von Lieferanten enthalten.Lieferantenfelder
| Feld | Pflicht | Beschreibung |
|---|---|---|
title | Ja | Lieferantenname |
number | Nein | SAP-Lieferantennummer; wird zu external_id gemappt und für Upserts genutzt |
legal_uid | Nein | USt-IdNr. oder Steuernummer |
country_code | Nein | ISO 3166-1 Alpha-2 Ländercode |
comment | Nein | Freitext-Kommentar zum Lieferanten |
payment_term | Nein | Zahlungsbedingungsschlüssel; muss im comstruct-Mandanten existieren |
default_account | Nein | Kontonummer des Standardkontos; muss im comstruct-Mandanten existieren |
wth_tax_code | Nein | Quellensteuercode; Standardwert ist 00 |
bank_details | Nein | Bankverbindungen des Lieferanten |
address | Nein | Lieferantenadresse |
Bankverbindungen (bank_details[])
| Feld | Pflicht | Beschreibung |
|---|---|---|
iban | Nein | Gültige IBAN; Einträge ohne IBAN werden ignoriert |
number | Nein | Externe Nummer der Bankverbindung; wird bevorzugt als ID gespeichert |
external_id | Nein | Alternative externe ID, falls number nicht gesetzt ist |
Adresse (address)
| Feld | Pflicht | Beschreibung |
|---|---|---|
address | Nein | Straße und Hausnummer |
city | Nein | Ort |
zip | Nein | Postleitzahl |
country_code | Nein | ISO 3166-1 Alpha-2 Ländercode |
Beispiel
curl -X POST "https://api.comstruct.com/v1/suppliers/sap" \
-H "x-api-key: IHR_API_SCHLUESSEL" \
-H "Content-Type: application/json" \
-d '[
{
"number": "SAP-SUP-001",
"title": "Beispiel Lieferant GmbH",
"legal_uid": "DE123456789",
"country_code": "DE",
"comment": "Bevorzugter Kontakt per E-Mail",
"payment_term": "30T",
"default_account": "4000",
"wth_tax_code": "00",
"bank_details": [
{
"number": "BANK-001",
"iban": "DE89370400440532013000"
}
],
"address": {
"address": "Musterstraße 1",
"city": "Berlin",
"zip": "10115",
"country_code": "DE"
}
}
]'
Verhalten
numberwird alsexternal_idgespeichert; vorhandene Lieferanten mit derselbenexternal_idund demselben Kunden werden aktualisiert.- Nur die Felder
external_id,legal_uid,country_code,withholding_tax_code,payment_term_id,title,comment,address,cityundzipwerden bei Konflikten aktualisiert. payment_termwird gegen die Zahlungsbedingungen des Kunden aufgelöst. Unbekannte Werte führen zu400.default_accountwird gegen die Konten des Kunden aufgelöst. Unbekannte Werte führen zu400. Fehlt das Feld beim Upsert, bleibt ein vorhandenesdefault_account_iderhalten.- Fehlt
wth_tax_code, speichert comstruct den Standardwert00. - Bankverbindungen werden anhand von IBAN, Lieferant und Tenant zusammengeführt; bei Konflikten wird die externe ID der Bankverbindung aktualisiert.
Response Codes
| Code | Beschreibung |
|---|---|
200 | Lieferantendaten erfolgreich verarbeitet |
400 | Ungültiger Body, Validierungsfehler, unbekannte Zahlungsbedingung oder unbekanntes Standardkonto |
401 | Nicht autorisiert — API-Schlüssel ist mit keinem Kunden verknüpft |
403 | Verboten — fehlender Scope suppliers:write |
500 | Interner Serverfehler |
Autorisierungen
API-Schlüssel zur Authentifizierung. Kontaktieren Sie Ihren Customer Success Manager, um einen API-Schlüssel zu erhalten.
Jeder Endpunkt erfordert spezifische Berechtigungen (Scopes); die erforderlichen Scopes werden pro Endpunkt angezeigt.
Body
Lieferantenname/Titel
"Beispiel GmbH-8"
Lieferantennummer aus SAP; wird als external_id gespeichert und für Upserts verwendet
"EXTERNAL-09092"
Optionale Umsatzsteuer-ID
"D456789900022202"
ISO 3166-1 alpha-2 Ländercode
"US"
Freitext-Kommentar zum Lieferanten
"Bevorzugter Kontakt per E-Mail"
Optionaler SAP-Zahlungsbedingungsschlüssel; muss, falls angegeben, im comstruct-Mandanten existieren
"90T"
Optionale Kontonummer des Standardkontos; muss, falls angegeben, im comstruct-Mandanten existieren
"4000"
Optionaler Quellensteuercode
"90"
Optionale Bankverbindungen
Show child attributes
Show child attributes
Show child attributes
Show child attributes
Antwort
Lieferantendaten erfolgreich empfangen
"Supplier data received successfully"