curl --request POST \
--url https://api.jtl-cloud.com/erp/v2/sales-channels/connector/accounts \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--header 'x-tenant-id: <x-tenant-id>' \
--data '
{
"url": "<string>",
"apiToken": "<string>",
"name": "<string>",
"companyId": "b45f6432-2462-4c6f-b00f-1d9d01000000",
"isActive": true,
"isLocked": true,
"rootCategoryId": "b45f6432-2462-4c6f-b00f-1d9d01000000",
"useShopOrderNumber": true,
"canImport": true,
"shouldImportItemsAndCategories": true,
"shouldImportOrdersAndCustomers": true,
"shouldImportImages": true,
"canUpload": true,
"shouldUploadItemComplete": true,
"shouldUploadItemPriceRestricted": true,
"shouldUploadItemStockRestricted": true,
"shouldUploadCustomers": true,
"shouldUploadImages": true,
"shouldRefreshExistingItems": true,
"shouldRefreshCustomers": true,
"shouldDeleteImagesOnImport": true,
"shouldWawiCalculateTaxRate": true,
"shouldWawiCalculateTaxRateForShipping": true,
"shippingCountryIso": "<string>",
"entityCount": 123,
"pullCount": 123,
"imagesCount": 123,
"maximumTransferRate": 123,
"quickSyncCount": 123
}
'import requests
url = "https://api.jtl-cloud.com/erp/v2/sales-channels/connector/accounts"
payload = {
"url": "<string>",
"apiToken": "<string>",
"name": "<string>",
"companyId": "b45f6432-2462-4c6f-b00f-1d9d01000000",
"isActive": True,
"isLocked": True,
"rootCategoryId": "b45f6432-2462-4c6f-b00f-1d9d01000000",
"useShopOrderNumber": True,
"canImport": True,
"shouldImportItemsAndCategories": True,
"shouldImportOrdersAndCustomers": True,
"shouldImportImages": True,
"canUpload": True,
"shouldUploadItemComplete": True,
"shouldUploadItemPriceRestricted": True,
"shouldUploadItemStockRestricted": True,
"shouldUploadCustomers": True,
"shouldUploadImages": True,
"shouldRefreshExistingItems": True,
"shouldRefreshCustomers": True,
"shouldDeleteImagesOnImport": True,
"shouldWawiCalculateTaxRate": True,
"shouldWawiCalculateTaxRateForShipping": True,
"shippingCountryIso": "<string>",
"entityCount": 123,
"pullCount": 123,
"imagesCount": 123,
"maximumTransferRate": 123,
"quickSyncCount": 123
}
headers = {
"x-tenant-id": "<x-tenant-id>",
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {
'x-tenant-id': '<x-tenant-id>',
Authorization: 'Bearer <token>',
'Content-Type': 'application/json'
},
body: JSON.stringify({
url: '<string>',
apiToken: '<string>',
name: '<string>',
companyId: 'b45f6432-2462-4c6f-b00f-1d9d01000000',
isActive: true,
isLocked: true,
rootCategoryId: 'b45f6432-2462-4c6f-b00f-1d9d01000000',
useShopOrderNumber: true,
canImport: true,
shouldImportItemsAndCategories: true,
shouldImportOrdersAndCustomers: true,
shouldImportImages: true,
canUpload: true,
shouldUploadItemComplete: true,
shouldUploadItemPriceRestricted: true,
shouldUploadItemStockRestricted: true,
shouldUploadCustomers: true,
shouldUploadImages: true,
shouldRefreshExistingItems: true,
shouldRefreshCustomers: true,
shouldDeleteImagesOnImport: true,
shouldWawiCalculateTaxRate: true,
shouldWawiCalculateTaxRateForShipping: true,
shippingCountryIso: '<string>',
entityCount: 123,
pullCount: 123,
imagesCount: 123,
maximumTransferRate: 123,
quickSyncCount: 123
})
};
fetch('https://api.jtl-cloud.com/erp/v2/sales-channels/connector/accounts', 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.jtl-cloud.com/erp/v2/sales-channels/connector/accounts",
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([
'url' => '<string>',
'apiToken' => '<string>',
'name' => '<string>',
'companyId' => 'b45f6432-2462-4c6f-b00f-1d9d01000000',
'isActive' => true,
'isLocked' => true,
'rootCategoryId' => 'b45f6432-2462-4c6f-b00f-1d9d01000000',
'useShopOrderNumber' => true,
'canImport' => true,
'shouldImportItemsAndCategories' => true,
'shouldImportOrdersAndCustomers' => true,
'shouldImportImages' => true,
'canUpload' => true,
'shouldUploadItemComplete' => true,
'shouldUploadItemPriceRestricted' => true,
'shouldUploadItemStockRestricted' => true,
'shouldUploadCustomers' => true,
'shouldUploadImages' => true,
'shouldRefreshExistingItems' => true,
'shouldRefreshCustomers' => true,
'shouldDeleteImagesOnImport' => true,
'shouldWawiCalculateTaxRate' => true,
'shouldWawiCalculateTaxRateForShipping' => true,
'shippingCountryIso' => '<string>',
'entityCount' => 123,
'pullCount' => 123,
'imagesCount' => 123,
'maximumTransferRate' => 123,
'quickSyncCount' => 123
]),
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>",
"Content-Type: application/json",
"x-tenant-id: <x-tenant-id>"
],
]);
$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.jtl-cloud.com/erp/v2/sales-channels/connector/accounts"
payload := strings.NewReader("{\n \"url\": \"<string>\",\n \"apiToken\": \"<string>\",\n \"name\": \"<string>\",\n \"companyId\": \"b45f6432-2462-4c6f-b00f-1d9d01000000\",\n \"isActive\": true,\n \"isLocked\": true,\n \"rootCategoryId\": \"b45f6432-2462-4c6f-b00f-1d9d01000000\",\n \"useShopOrderNumber\": true,\n \"canImport\": true,\n \"shouldImportItemsAndCategories\": true,\n \"shouldImportOrdersAndCustomers\": true,\n \"shouldImportImages\": true,\n \"canUpload\": true,\n \"shouldUploadItemComplete\": true,\n \"shouldUploadItemPriceRestricted\": true,\n \"shouldUploadItemStockRestricted\": true,\n \"shouldUploadCustomers\": true,\n \"shouldUploadImages\": true,\n \"shouldRefreshExistingItems\": true,\n \"shouldRefreshCustomers\": true,\n \"shouldDeleteImagesOnImport\": true,\n \"shouldWawiCalculateTaxRate\": true,\n \"shouldWawiCalculateTaxRateForShipping\": true,\n \"shippingCountryIso\": \"<string>\",\n \"entityCount\": 123,\n \"pullCount\": 123,\n \"imagesCount\": 123,\n \"maximumTransferRate\": 123,\n \"quickSyncCount\": 123\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("x-tenant-id", "<x-tenant-id>")
req.Header.Add("Authorization", "Bearer <token>")
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.jtl-cloud.com/erp/v2/sales-channels/connector/accounts")
.header("x-tenant-id", "<x-tenant-id>")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"url\": \"<string>\",\n \"apiToken\": \"<string>\",\n \"name\": \"<string>\",\n \"companyId\": \"b45f6432-2462-4c6f-b00f-1d9d01000000\",\n \"isActive\": true,\n \"isLocked\": true,\n \"rootCategoryId\": \"b45f6432-2462-4c6f-b00f-1d9d01000000\",\n \"useShopOrderNumber\": true,\n \"canImport\": true,\n \"shouldImportItemsAndCategories\": true,\n \"shouldImportOrdersAndCustomers\": true,\n \"shouldImportImages\": true,\n \"canUpload\": true,\n \"shouldUploadItemComplete\": true,\n \"shouldUploadItemPriceRestricted\": true,\n \"shouldUploadItemStockRestricted\": true,\n \"shouldUploadCustomers\": true,\n \"shouldUploadImages\": true,\n \"shouldRefreshExistingItems\": true,\n \"shouldRefreshCustomers\": true,\n \"shouldDeleteImagesOnImport\": true,\n \"shouldWawiCalculateTaxRate\": true,\n \"shouldWawiCalculateTaxRateForShipping\": true,\n \"shippingCountryIso\": \"<string>\",\n \"entityCount\": 123,\n \"pullCount\": 123,\n \"imagesCount\": 123,\n \"maximumTransferRate\": 123,\n \"quickSyncCount\": 123\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.jtl-cloud.com/erp/v2/sales-channels/connector/accounts")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["x-tenant-id"] = '<x-tenant-id>'
request["Authorization"] = 'Bearer <token>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"url\": \"<string>\",\n \"apiToken\": \"<string>\",\n \"name\": \"<string>\",\n \"companyId\": \"b45f6432-2462-4c6f-b00f-1d9d01000000\",\n \"isActive\": true,\n \"isLocked\": true,\n \"rootCategoryId\": \"b45f6432-2462-4c6f-b00f-1d9d01000000\",\n \"useShopOrderNumber\": true,\n \"canImport\": true,\n \"shouldImportItemsAndCategories\": true,\n \"shouldImportOrdersAndCustomers\": true,\n \"shouldImportImages\": true,\n \"canUpload\": true,\n \"shouldUploadItemComplete\": true,\n \"shouldUploadItemPriceRestricted\": true,\n \"shouldUploadItemStockRestricted\": true,\n \"shouldUploadCustomers\": true,\n \"shouldUploadImages\": true,\n \"shouldRefreshExistingItems\": true,\n \"shouldRefreshCustomers\": true,\n \"shouldDeleteImagesOnImport\": true,\n \"shouldWawiCalculateTaxRate\": true,\n \"shouldWawiCalculateTaxRateForShipping\": true,\n \"shippingCountryIso\": \"<string>\",\n \"entityCount\": 123,\n \"pullCount\": 123,\n \"imagesCount\": 123,\n \"maximumTransferRate\": 123,\n \"quickSyncCount\": 123\n}"
response = http.request(request)
puts response.read_body{
"isActive": true,
"isLocked": true,
"canImport": true,
"shouldImportItemsAndCategories": true,
"shouldImportOrdersAndCustomers": true,
"shouldImportImages": true,
"canUpload": true,
"shouldUploadItemComplete": true,
"shouldUploadItemPriceRestricted": true,
"shouldUploadItemStockRestricted": true,
"shouldUploadCustomers": true,
"shouldUploadImages": true,
"shouldRefreshExistingItems": true,
"shouldRefreshCustomers": true,
"shouldDeleteImagesOnImport": true,
"shouldWawiCalculateTaxRate": true,
"shouldWawiCalculateTaxRateForShipping": true,
"pullCount": 123,
"quickSyncCount": 123,
"sendOnlyAssignedManufacturers": true,
"useShopOrderNumber": true,
"languages": [
{
"iso": "<string>",
"isAssigned": true,
"isDefault": true,
"nameGerman": "<string>",
"nameEnglish": "<string>"
}
],
"currencies": [
{
"currencyCode": "<string>",
"codeSource": 0,
"isAssigned": true,
"isDefault": true,
"name": "<string>"
}
],
"features": [
{
"feature": 1,
"isEnabled": true
}
],
"taxRates": [
{
"rate": 123,
"taxRateId": "b45f6432-2462-4c6f-b00f-1d9d01000000"
}
],
"serverInfo": {
"isOldConnector": true,
"platformName": "<string>",
"platformVersion": "<string>",
"protocolVersion": "<string>",
"endpointVersion": "<string>"
},
"salesChannelId": "<string>",
"name": "<string>",
"url": "<string>",
"companyId": "b45f6432-2462-4c6f-b00f-1d9d01000000",
"maximumTransferRate": 123,
"imagesCount": 123,
"entityCount": 123,
"shippingCountryIso": "<string>",
"dummyCategoryId": "b45f6432-2462-4c6f-b00f-1d9d01000000",
"rootCategoryId": "b45f6432-2462-4c6f-b00f-1d9d01000000"
}{
"type": "https://www.rfc-editor.org/rfc/rfc7231#section-6.5.1",
"title": "One or more validation errors occurred.",
"status": 400,
"instance": "/api/route",
"traceId": "0HMPNHL0JHL76:00000001",
"detail": "<string>",
"errors": [
{
"name": "Error or field name",
"reason": "Error reason",
"code": "<string>",
"severity": "<string>"
}
]
}{
"type": "https://www.rfc-editor.org/rfc/rfc7231#section-6.5.1",
"title": "One or more validation errors occurred.",
"status": 400,
"instance": "/api/route",
"traceId": "0HMPNHL0JHL76:00000001",
"detail": "<string>",
"errors": [
{
"name": "Error or field name",
"reason": "Error reason",
"code": "<string>",
"severity": "<string>"
}
]
}{
"type": "https://www.rfc-editor.org/rfc/rfc7231#section-6.5.1",
"title": "One or more validation errors occurred.",
"status": 400,
"instance": "/api/route",
"traceId": "0HMPNHL0JHL76:00000001",
"detail": "<string>",
"errors": [
{
"name": "Error or field name",
"reason": "Error reason",
"code": "<string>",
"severity": "<string>"
}
]
}{
"type": "https://www.rfc-editor.org/rfc/rfc7231#section-6.5.1",
"title": "One or more validation errors occurred.",
"status": 400,
"instance": "/api/route",
"traceId": "0HMPNHL0JHL76:00000001",
"detail": "<string>",
"errors": [
{
"name": "Error or field name",
"reason": "Error reason",
"code": "<string>",
"severity": "<string>"
}
]
}{
"type": "https://www.rfc-editor.org/rfc/rfc7231#section-6.5.1",
"title": "One or more validation errors occurred.",
"status": 400,
"instance": "/api/route",
"traceId": "0HMPNHL0JHL76:00000001",
"detail": "<string>",
"errors": [
{
"name": "Error or field name",
"reason": "Error reason",
"code": "<string>",
"severity": "<string>"
}
]
}{
"type": "https://www.rfc-editor.org/rfc/rfc7231#section-6.5.1",
"title": "One or more validation errors occurred.",
"status": 400,
"instance": "/api/route",
"traceId": "0HMPNHL0JHL76:00000001",
"detail": "<string>",
"errors": [
{
"name": "Error or field name",
"reason": "Error reason",
"code": "<string>",
"severity": "<string>"
}
]
}Creates a new JTL-Connector account.
Creates a new JTL-Connector account. The salesChannelId is derived server-side from the persisted tShop row (--, ADR-69) and cannot be supplied by the client - hence POST with no id in the route. The route matches the sibling collection GET sales-channels/connector/accounts (QueryConnectorAccounts) one-to-one - same collection, POST creates what GET lists. ResyncConnector/DeleteConnectorLink are not a precedent for this route shape: both act on an already-existing connector and therefore correctly carry instead. Performs a live handshake against the endpoint (init + features + global-data pull) using the ShopKey-less clients from WAWI-91760, then validates every taxrate the connector reports against the chosen company’s tSteuersatz (400 if any is unmapped). If the live call or taxrate validation fails, nothing is persisted. Otherwise tShop + tShopKonfiguration are inserted in one transaction, followed by a separate transaction for the full metadata mirror; if that second step fails, the handler compensates by deleting the shop row pair rather than leaving an orphaned, metadata-less account - not a single atomic transaction end-to-end. Connector-driven sections of the response (Languages, Currencies, Features, TaxRates, ServerInfo) are always sourced live from the handshake and are never accepted as request input - persisting client-supplied connector metadata would re-introduce the user-write semantics rejected in WAWI-90486/WAWI-90484, and would persist potentially stale data.
curl --request POST \
--url https://api.jtl-cloud.com/erp/v2/sales-channels/connector/accounts \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--header 'x-tenant-id: <x-tenant-id>' \
--data '
{
"url": "<string>",
"apiToken": "<string>",
"name": "<string>",
"companyId": "b45f6432-2462-4c6f-b00f-1d9d01000000",
"isActive": true,
"isLocked": true,
"rootCategoryId": "b45f6432-2462-4c6f-b00f-1d9d01000000",
"useShopOrderNumber": true,
"canImport": true,
"shouldImportItemsAndCategories": true,
"shouldImportOrdersAndCustomers": true,
"shouldImportImages": true,
"canUpload": true,
"shouldUploadItemComplete": true,
"shouldUploadItemPriceRestricted": true,
"shouldUploadItemStockRestricted": true,
"shouldUploadCustomers": true,
"shouldUploadImages": true,
"shouldRefreshExistingItems": true,
"shouldRefreshCustomers": true,
"shouldDeleteImagesOnImport": true,
"shouldWawiCalculateTaxRate": true,
"shouldWawiCalculateTaxRateForShipping": true,
"shippingCountryIso": "<string>",
"entityCount": 123,
"pullCount": 123,
"imagesCount": 123,
"maximumTransferRate": 123,
"quickSyncCount": 123
}
'import requests
url = "https://api.jtl-cloud.com/erp/v2/sales-channels/connector/accounts"
payload = {
"url": "<string>",
"apiToken": "<string>",
"name": "<string>",
"companyId": "b45f6432-2462-4c6f-b00f-1d9d01000000",
"isActive": True,
"isLocked": True,
"rootCategoryId": "b45f6432-2462-4c6f-b00f-1d9d01000000",
"useShopOrderNumber": True,
"canImport": True,
"shouldImportItemsAndCategories": True,
"shouldImportOrdersAndCustomers": True,
"shouldImportImages": True,
"canUpload": True,
"shouldUploadItemComplete": True,
"shouldUploadItemPriceRestricted": True,
"shouldUploadItemStockRestricted": True,
"shouldUploadCustomers": True,
"shouldUploadImages": True,
"shouldRefreshExistingItems": True,
"shouldRefreshCustomers": True,
"shouldDeleteImagesOnImport": True,
"shouldWawiCalculateTaxRate": True,
"shouldWawiCalculateTaxRateForShipping": True,
"shippingCountryIso": "<string>",
"entityCount": 123,
"pullCount": 123,
"imagesCount": 123,
"maximumTransferRate": 123,
"quickSyncCount": 123
}
headers = {
"x-tenant-id": "<x-tenant-id>",
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {
'x-tenant-id': '<x-tenant-id>',
Authorization: 'Bearer <token>',
'Content-Type': 'application/json'
},
body: JSON.stringify({
url: '<string>',
apiToken: '<string>',
name: '<string>',
companyId: 'b45f6432-2462-4c6f-b00f-1d9d01000000',
isActive: true,
isLocked: true,
rootCategoryId: 'b45f6432-2462-4c6f-b00f-1d9d01000000',
useShopOrderNumber: true,
canImport: true,
shouldImportItemsAndCategories: true,
shouldImportOrdersAndCustomers: true,
shouldImportImages: true,
canUpload: true,
shouldUploadItemComplete: true,
shouldUploadItemPriceRestricted: true,
shouldUploadItemStockRestricted: true,
shouldUploadCustomers: true,
shouldUploadImages: true,
shouldRefreshExistingItems: true,
shouldRefreshCustomers: true,
shouldDeleteImagesOnImport: true,
shouldWawiCalculateTaxRate: true,
shouldWawiCalculateTaxRateForShipping: true,
shippingCountryIso: '<string>',
entityCount: 123,
pullCount: 123,
imagesCount: 123,
maximumTransferRate: 123,
quickSyncCount: 123
})
};
fetch('https://api.jtl-cloud.com/erp/v2/sales-channels/connector/accounts', 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.jtl-cloud.com/erp/v2/sales-channels/connector/accounts",
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([
'url' => '<string>',
'apiToken' => '<string>',
'name' => '<string>',
'companyId' => 'b45f6432-2462-4c6f-b00f-1d9d01000000',
'isActive' => true,
'isLocked' => true,
'rootCategoryId' => 'b45f6432-2462-4c6f-b00f-1d9d01000000',
'useShopOrderNumber' => true,
'canImport' => true,
'shouldImportItemsAndCategories' => true,
'shouldImportOrdersAndCustomers' => true,
'shouldImportImages' => true,
'canUpload' => true,
'shouldUploadItemComplete' => true,
'shouldUploadItemPriceRestricted' => true,
'shouldUploadItemStockRestricted' => true,
'shouldUploadCustomers' => true,
'shouldUploadImages' => true,
'shouldRefreshExistingItems' => true,
'shouldRefreshCustomers' => true,
'shouldDeleteImagesOnImport' => true,
'shouldWawiCalculateTaxRate' => true,
'shouldWawiCalculateTaxRateForShipping' => true,
'shippingCountryIso' => '<string>',
'entityCount' => 123,
'pullCount' => 123,
'imagesCount' => 123,
'maximumTransferRate' => 123,
'quickSyncCount' => 123
]),
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>",
"Content-Type: application/json",
"x-tenant-id: <x-tenant-id>"
],
]);
$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.jtl-cloud.com/erp/v2/sales-channels/connector/accounts"
payload := strings.NewReader("{\n \"url\": \"<string>\",\n \"apiToken\": \"<string>\",\n \"name\": \"<string>\",\n \"companyId\": \"b45f6432-2462-4c6f-b00f-1d9d01000000\",\n \"isActive\": true,\n \"isLocked\": true,\n \"rootCategoryId\": \"b45f6432-2462-4c6f-b00f-1d9d01000000\",\n \"useShopOrderNumber\": true,\n \"canImport\": true,\n \"shouldImportItemsAndCategories\": true,\n \"shouldImportOrdersAndCustomers\": true,\n \"shouldImportImages\": true,\n \"canUpload\": true,\n \"shouldUploadItemComplete\": true,\n \"shouldUploadItemPriceRestricted\": true,\n \"shouldUploadItemStockRestricted\": true,\n \"shouldUploadCustomers\": true,\n \"shouldUploadImages\": true,\n \"shouldRefreshExistingItems\": true,\n \"shouldRefreshCustomers\": true,\n \"shouldDeleteImagesOnImport\": true,\n \"shouldWawiCalculateTaxRate\": true,\n \"shouldWawiCalculateTaxRateForShipping\": true,\n \"shippingCountryIso\": \"<string>\",\n \"entityCount\": 123,\n \"pullCount\": 123,\n \"imagesCount\": 123,\n \"maximumTransferRate\": 123,\n \"quickSyncCount\": 123\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("x-tenant-id", "<x-tenant-id>")
req.Header.Add("Authorization", "Bearer <token>")
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.jtl-cloud.com/erp/v2/sales-channels/connector/accounts")
.header("x-tenant-id", "<x-tenant-id>")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"url\": \"<string>\",\n \"apiToken\": \"<string>\",\n \"name\": \"<string>\",\n \"companyId\": \"b45f6432-2462-4c6f-b00f-1d9d01000000\",\n \"isActive\": true,\n \"isLocked\": true,\n \"rootCategoryId\": \"b45f6432-2462-4c6f-b00f-1d9d01000000\",\n \"useShopOrderNumber\": true,\n \"canImport\": true,\n \"shouldImportItemsAndCategories\": true,\n \"shouldImportOrdersAndCustomers\": true,\n \"shouldImportImages\": true,\n \"canUpload\": true,\n \"shouldUploadItemComplete\": true,\n \"shouldUploadItemPriceRestricted\": true,\n \"shouldUploadItemStockRestricted\": true,\n \"shouldUploadCustomers\": true,\n \"shouldUploadImages\": true,\n \"shouldRefreshExistingItems\": true,\n \"shouldRefreshCustomers\": true,\n \"shouldDeleteImagesOnImport\": true,\n \"shouldWawiCalculateTaxRate\": true,\n \"shouldWawiCalculateTaxRateForShipping\": true,\n \"shippingCountryIso\": \"<string>\",\n \"entityCount\": 123,\n \"pullCount\": 123,\n \"imagesCount\": 123,\n \"maximumTransferRate\": 123,\n \"quickSyncCount\": 123\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.jtl-cloud.com/erp/v2/sales-channels/connector/accounts")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["x-tenant-id"] = '<x-tenant-id>'
request["Authorization"] = 'Bearer <token>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"url\": \"<string>\",\n \"apiToken\": \"<string>\",\n \"name\": \"<string>\",\n \"companyId\": \"b45f6432-2462-4c6f-b00f-1d9d01000000\",\n \"isActive\": true,\n \"isLocked\": true,\n \"rootCategoryId\": \"b45f6432-2462-4c6f-b00f-1d9d01000000\",\n \"useShopOrderNumber\": true,\n \"canImport\": true,\n \"shouldImportItemsAndCategories\": true,\n \"shouldImportOrdersAndCustomers\": true,\n \"shouldImportImages\": true,\n \"canUpload\": true,\n \"shouldUploadItemComplete\": true,\n \"shouldUploadItemPriceRestricted\": true,\n \"shouldUploadItemStockRestricted\": true,\n \"shouldUploadCustomers\": true,\n \"shouldUploadImages\": true,\n \"shouldRefreshExistingItems\": true,\n \"shouldRefreshCustomers\": true,\n \"shouldDeleteImagesOnImport\": true,\n \"shouldWawiCalculateTaxRate\": true,\n \"shouldWawiCalculateTaxRateForShipping\": true,\n \"shippingCountryIso\": \"<string>\",\n \"entityCount\": 123,\n \"pullCount\": 123,\n \"imagesCount\": 123,\n \"maximumTransferRate\": 123,\n \"quickSyncCount\": 123\n}"
response = http.request(request)
puts response.read_body{
"isActive": true,
"isLocked": true,
"canImport": true,
"shouldImportItemsAndCategories": true,
"shouldImportOrdersAndCustomers": true,
"shouldImportImages": true,
"canUpload": true,
"shouldUploadItemComplete": true,
"shouldUploadItemPriceRestricted": true,
"shouldUploadItemStockRestricted": true,
"shouldUploadCustomers": true,
"shouldUploadImages": true,
"shouldRefreshExistingItems": true,
"shouldRefreshCustomers": true,
"shouldDeleteImagesOnImport": true,
"shouldWawiCalculateTaxRate": true,
"shouldWawiCalculateTaxRateForShipping": true,
"pullCount": 123,
"quickSyncCount": 123,
"sendOnlyAssignedManufacturers": true,
"useShopOrderNumber": true,
"languages": [
{
"iso": "<string>",
"isAssigned": true,
"isDefault": true,
"nameGerman": "<string>",
"nameEnglish": "<string>"
}
],
"currencies": [
{
"currencyCode": "<string>",
"codeSource": 0,
"isAssigned": true,
"isDefault": true,
"name": "<string>"
}
],
"features": [
{
"feature": 1,
"isEnabled": true
}
],
"taxRates": [
{
"rate": 123,
"taxRateId": "b45f6432-2462-4c6f-b00f-1d9d01000000"
}
],
"serverInfo": {
"isOldConnector": true,
"platformName": "<string>",
"platformVersion": "<string>",
"protocolVersion": "<string>",
"endpointVersion": "<string>"
},
"salesChannelId": "<string>",
"name": "<string>",
"url": "<string>",
"companyId": "b45f6432-2462-4c6f-b00f-1d9d01000000",
"maximumTransferRate": 123,
"imagesCount": 123,
"entityCount": 123,
"shippingCountryIso": "<string>",
"dummyCategoryId": "b45f6432-2462-4c6f-b00f-1d9d01000000",
"rootCategoryId": "b45f6432-2462-4c6f-b00f-1d9d01000000"
}{
"type": "https://www.rfc-editor.org/rfc/rfc7231#section-6.5.1",
"title": "One or more validation errors occurred.",
"status": 400,
"instance": "/api/route",
"traceId": "0HMPNHL0JHL76:00000001",
"detail": "<string>",
"errors": [
{
"name": "Error or field name",
"reason": "Error reason",
"code": "<string>",
"severity": "<string>"
}
]
}{
"type": "https://www.rfc-editor.org/rfc/rfc7231#section-6.5.1",
"title": "One or more validation errors occurred.",
"status": 400,
"instance": "/api/route",
"traceId": "0HMPNHL0JHL76:00000001",
"detail": "<string>",
"errors": [
{
"name": "Error or field name",
"reason": "Error reason",
"code": "<string>",
"severity": "<string>"
}
]
}{
"type": "https://www.rfc-editor.org/rfc/rfc7231#section-6.5.1",
"title": "One or more validation errors occurred.",
"status": 400,
"instance": "/api/route",
"traceId": "0HMPNHL0JHL76:00000001",
"detail": "<string>",
"errors": [
{
"name": "Error or field name",
"reason": "Error reason",
"code": "<string>",
"severity": "<string>"
}
]
}{
"type": "https://www.rfc-editor.org/rfc/rfc7231#section-6.5.1",
"title": "One or more validation errors occurred.",
"status": 400,
"instance": "/api/route",
"traceId": "0HMPNHL0JHL76:00000001",
"detail": "<string>",
"errors": [
{
"name": "Error or field name",
"reason": "Error reason",
"code": "<string>",
"severity": "<string>"
}
]
}{
"type": "https://www.rfc-editor.org/rfc/rfc7231#section-6.5.1",
"title": "One or more validation errors occurred.",
"status": 400,
"instance": "/api/route",
"traceId": "0HMPNHL0JHL76:00000001",
"detail": "<string>",
"errors": [
{
"name": "Error or field name",
"reason": "Error reason",
"code": "<string>",
"severity": "<string>"
}
]
}{
"type": "https://www.rfc-editor.org/rfc/rfc7231#section-6.5.1",
"title": "One or more validation errors occurred.",
"status": 400,
"instance": "/api/route",
"traceId": "0HMPNHL0JHL76:00000001",
"detail": "<string>",
"errors": [
{
"name": "Error or field name",
"reason": "Error reason",
"code": "<string>",
"severity": "<string>"
}
]
}Authorizations
The access token received from the authorization server in the OAuth 2.0 flow.
Headers
Optional, client-generated key for deduplicating repeated write requests. A repeated request with the same key returns the originally recorded result instead of executing the effect again.
1 - 255The tenant ID for the target ERP instance.
Query Parameters
When true, runs the identical live handshake and taxrate validation but writes nothing to the database - a connection test before the real create. Defaults to false when omitted. Note: the response shape differs when true - nothing is persisted and SalesChannelId is null - see the response description for the transport-specific details of this deviation.
Body
Request model for CreateConnector command endpoint. Route parameters bind from the route, query parameters from the query string, everything else from the body.
URL of the connector endpoint. Mandatory.
API token used to authenticate against the connector endpoint. Mandatory. Write-only - never echoed back in the response.
Name of the connector account. Mandatory.
ID of the company the connector account belongs to. Mandatory - also the company whose tSteuersatz the connector-reported taxrates are validated against.
"b45f6432-2462-4c6f-b00f-1d9d01000000"
Connector account is active. Optional - defaults to the WPF editor default when omitted.
Connector account is locked. Optional - defaults to the WPF editor default when omitted.
Root category for imported items. Optional - defaults to the WPF editor default when omitted.
"b45f6432-2462-4c6f-b00f-1d9d01000000"
Use the shop-assigned order number instead of the Wawi-generated one. Optional - defaults to the WPF editor default when omitted.
The connector account is allowed to import data from the endpoint. Optional - defaults to the WPF editor default when omitted.
Items and categories are imported. Optional - defaults to the WPF editor default when omitted.
Orders and customers are imported. Optional - defaults to the WPF editor default when omitted.
Item images are imported. Optional - defaults to the WPF editor default when omitted.
The connector account is allowed to upload data to the endpoint. Optional - defaults to the WPF editor default when omitted.
Items are uploaded completely, rather than price/stock-restricted. Optional - defaults to the WPF editor default when omitted.
Item uploads are restricted to prices only. Optional - defaults to the WPF editor default when omitted.
Item uploads are restricted to stock only. Optional - defaults to the WPF editor default when omitted.
Customer data is uploaded. Optional - defaults to the WPF editor default when omitted.
Images are uploaded. Optional - defaults to the WPF editor default when omitted.
Existing items are merged/refreshed rather than only added. Optional - defaults to the WPF editor default when omitted.
Existing customer data is refreshed. Optional - defaults to the WPF editor default when omitted.
Images are deleted on import. Optional - defaults to the WPF editor default when omitted.
The Wawi calculates the tax rate for items, rather than taking the endpoint-reported one. Optional - defaults to the WPF editor default when omitted.
The Wawi calculates the tax rate for shipping, rather than taking the endpoint-reported one. Optional - defaults to the WPF editor default when omitted.
The shipping/departure country as an ISO 3166-1 alpha-2 country code. Optional - defaults to the WPF editor default when omitted. Canonical form is UPPERCASE (ADR-85); matching is case-insensitive.
Maximum number of entities transferred per run, or null for unrestricted. Optional - defaults to the WPF editor default when omitted.
Maximum pull count per sync run. Optional - defaults to the WPF editor default when omitted.
Maximum number of images transferred per run, or null for unrestricted. Optional - defaults to the WPF editor default when omitted.
Maximum transfer rate for uploads, in megabytes, or null for unrestricted. Optional - defaults to the WPF editor default when omitted.
Maximum quick-sync count per sync run. Optional - defaults to the WPF editor default when omitted.
Response
The Connector account was created (or, for ?simulate=true, the identical live handshake and taxrate validation ran with zero database writes) and the response carries the full metadata mirror. The response is always 201, for both a real create and ?simulate=true - distinguish the two by SalesChannelId being null for ?simulate=true, since no account was persisted. No Location header is ever set. Both are permanent limitations of the current generated endpoint, not omissions of this handler: the generated Send.ResponseAsync(dto, 201, ct) call hardcodes a single status literal and never sets response headers, and HandleAsync is not partial, so no handler-level code can vary the status or add a header. A second, ?simulate=true-only success code and a Location header therefore cannot be represented with the current REST generator. Deliberate ADR-4 deviation: ADR-4 ("Resultset of Commands") calls for a Create command to return only the new Id, but this command returns the full Connector object instead. This is intentional: ?simulate=true has no Id to return (nothing is persisted) but still needs to deliver the live-handshake preview (languages, currencies, features, taxrates, server info) that only a full object can carry, so an Id-only result is not a viable shape for that path. The non-simulate 201 path returns the same full shape for symmetry with simulate, rather than switching shapes based on the query parameter.
Full result of the CreateConnector live pipeline: the created (or, for ?simulate=true, merely verified) connector account together with its complete metadata mirror. Base data and configuration are the persisted DB state (null/default-filled from the WPF editor defaults where the request omitted them); the connector-driven sections (Languages, Currencies, Features, TaxRates, ServerInfo) are always sourced live from the endpoint handshake, ISO-identified per the ADR-85 pattern established by ConnectorCurrency. Deliberate ADR-4 deviation: ADR-4 asks Create commands to return only the created Id, but this command returns the full object instead, because ?simulate=true never persists anything and therefore has no Id to return - the live handshake/taxrate-validation result (Languages, Currencies, Features, TaxRates, ServerInfo) is the only useful response for that preview path, so the same shape is used for the persisted case too rather than modeling two different response contracts. Known limitations: (1) RootCategoryId and UseShopOrderNumber are modeled here rather than folded into ConnectorAccount/ConnectorConfiguration, because those two shared GET models are out of this ticket's scope - reconcile once WAWI-91760 lands; (2) synchronisation settings (send/receive/delete per object type) are deliberately NOT included here - ConnectorSynchronisationEntityType is a 90+ value enum owned by JTL.Wawi.Connector.Core.Contracts, and duplicating it into this response ahead of WAWI-91760's actual mapping design risked a stale/incorrect mirror; use the existing QueryConnectorSynchronisationSettings endpoint for now and fold it in here once the orchestration lands.
Connector account is active.
Connector account is locked.
The connector account is allowed to import data from the endpoint.
Items and categories are imported.
Orders and customers are imported.
Item images are imported.
The connector account is allowed to upload data to the endpoint.
Items are uploaded completely, rather than price/stock-restricted.
Item uploads are restricted to prices only.
Item uploads are restricted to stock only.
Customer data is uploaded.
Images are uploaded.
Existing items are merged/refreshed rather than only added.
Existing customer data is refreshed.
Images are deleted on import.
The Wawi calculates the tax rate for items, rather than taking the endpoint-reported one.
The Wawi calculates the tax rate for shipping, rather than taking the endpoint-reported one.
Maximum pull count per sync run.
Maximum quick-sync count per sync run.
Manufacturer data sent to the endpoint is filtered to only assigned manufacturers.
The shop-assigned order number is used instead of the Wawi-generated one.
Languages available in the Wawi, annotated with the assignment/default state reported by the connector endpoint's live handshake.
Show child attributes
Show child attributes
ISO 4217 currencies known to the Wawi, annotated with the assignment/default state reported by the connector endpoint's live handshake.
Show child attributes
Show child attributes
Every known connector feature, each marked whether the connector endpoint reported it as enabled.
Show child attributes
Show child attributes
Taxrates reported by the connector endpoint's live handshake, each merged with the internal Wawi taxrate it was validated against.
Show child attributes
Show child attributes
Live-only metadata about the connected endpoint's platform and protocol version, as reported by its handshake.
Show child attributes
Show child attributes
Sales channel id of this connector account. Null when the request used ?simulate=true - no account was persisted, so no id could be assigned.
Name of the connector account.
URL of the connector endpoint.
ID of the company the connector account belongs to.
"b45f6432-2462-4c6f-b00f-1d9d01000000"
Maximum transfer rate for uploads, in megabytes, or null if unrestricted.
Maximum number of images transferred per run, or null if unrestricted.
Maximum number of entities transferred per run, or null if unrestricted.
The shipping/departure country as an ISO 3166-1 alpha-2 country code, or null if not set. Canonical form is UPPERCASE (ADR-85); matching is case-insensitive.
Fallback category for uncategorized imported items, or null if not set.
"b45f6432-2462-4c6f-b00f-1d9d01000000"
Root category for imported items, or null if not set.
"b45f6432-2462-4c6f-b00f-1d9d01000000"
Was this page helpful?