curl --request POST \
--url https://api.jtl-cloud.com/erp/v2/sales-channels/{salesChannelId}/connector/refresh \
--header 'Authorization: Bearer <token>' \
--header 'x-tenant-id: <x-tenant-id>'import requests
url = "https://api.jtl-cloud.com/erp/v2/sales-channels/{salesChannelId}/connector/refresh"
headers = {
"x-tenant-id": "<x-tenant-id>",
"Authorization": "Bearer <token>"
}
response = requests.post(url, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {'x-tenant-id': '<x-tenant-id>', Authorization: 'Bearer <token>'}
};
fetch('https://api.jtl-cloud.com/erp/v2/sales-channels/{salesChannelId}/connector/refresh', 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/{salesChannelId}/connector/refresh",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>",
"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"
"net/http"
"io"
)
func main() {
url := "https://api.jtl-cloud.com/erp/v2/sales-channels/{salesChannelId}/connector/refresh"
req, _ := http.NewRequest("POST", url, nil)
req.Header.Add("x-tenant-id", "<x-tenant-id>")
req.Header.Add("Authorization", "Bearer <token>")
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/{salesChannelId}/connector/refresh")
.header("x-tenant-id", "<x-tenant-id>")
.header("Authorization", "Bearer <token>")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.jtl-cloud.com/erp/v2/sales-channels/{salesChannelId}/connector/refresh")
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>'
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>"
}
]
}{
"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>"
}
]
}Refresh Connector
Re-mirrors all connector-driven metadata of an existing JTL-Connector account on demand: performs a live handshake against the endpoint (core.connector.init, connector.identify, core.connector.features, global_data.pull), maps the reported metadata onto Wawi data, persists the connector’s mirror tables in one transaction, runs the four global-data sync services (shipping methods, cross-selling groups, units, measurement units) and finally pushes the acknowledgements. The modern equivalent of the legacy global-data import performed today by both the Abgleich and the WPF editor save; without that persisted mirror the Abgleich lacks data (tShopSprache, tShopWaehrung) and fails. Returns the same full object as CreateConnector. Two things are deliberately NOT modified: the customer-group assignment - which Wawi customer group an endpoint-side group maps to - which stays the separate user decision owned by PUT sales-channels//connector/customer-groups, and the locally editable configuration (tShop/tShopKonfiguration). The endpoint side of those mappings IS refreshed: the endpoint-reported name of an existing mapping is updated, a mapping whose endpoint group the endpoint no longer reports is removed, and a live group with no existing mapping is never auto-assigned - choosing its Wawi counterpart stays the user decision owned by the customer-groups endpoint, which lists it as an unassigned candidate. Distinct from ResyncConnector, which clears the Wawi-to-Connector shop mappings so the next sync re-imports everything - this command imports nothing item-level and only refreshes the metadata mirror. Concurrency with a running Abgleich is uncritical: both paths upsert the same semantics from the same live source, so the outcome is last-writer-wins. Caveat inherited from the live pull: each global-data collection is fetched with the connector protocol’s default page limit of 50 items, and the mirror write is a full-state replacement, so a connector reporting more than 50 entries in a collection has the excess assignments removed.
curl --request POST \
--url https://api.jtl-cloud.com/erp/v2/sales-channels/{salesChannelId}/connector/refresh \
--header 'Authorization: Bearer <token>' \
--header 'x-tenant-id: <x-tenant-id>'import requests
url = "https://api.jtl-cloud.com/erp/v2/sales-channels/{salesChannelId}/connector/refresh"
headers = {
"x-tenant-id": "<x-tenant-id>",
"Authorization": "Bearer <token>"
}
response = requests.post(url, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {'x-tenant-id': '<x-tenant-id>', Authorization: 'Bearer <token>'}
};
fetch('https://api.jtl-cloud.com/erp/v2/sales-channels/{salesChannelId}/connector/refresh', 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/{salesChannelId}/connector/refresh",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>",
"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"
"net/http"
"io"
)
func main() {
url := "https://api.jtl-cloud.com/erp/v2/sales-channels/{salesChannelId}/connector/refresh"
req, _ := http.NewRequest("POST", url, nil)
req.Header.Add("x-tenant-id", "<x-tenant-id>")
req.Header.Add("Authorization", "Bearer <token>")
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/{salesChannelId}/connector/refresh")
.header("x-tenant-id", "<x-tenant-id>")
.header("Authorization", "Bearer <token>")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.jtl-cloud.com/erp/v2/sales-channels/{salesChannelId}/connector/refresh")
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>'
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>"
}
]
}{
"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.
Path Parameters
Sales channel id of the Connector account whose metadata is re-mirrored.
Response
Declares the response for a completed refresh: the connector-driven metadata has been re-mirrored and the full object is returned. Deliberately the same model as CreateConnector rather than an id or a 204: the point of a refresh is to show the caller what the endpoint now reports, which only the full object carries. The connector-driven sections (Languages, Currencies, Features, TaxRates, ServerInfo) are sourced from the live handshake the call performs and are never accepted as request input. SalesChannelId is always populated here - unlike CreateConnector's simulate path, this command requires an account that already exists. The response reflects what was persisted and the live snapshot behind it; it does not depend on the outcome of the acknowledgement push that follows, which is best-effort by design.
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?