curl --request POST \
--url https://api.jtl-cloud.com/erp/v2/items/{itemId}/kit-items/convert \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--header 'x-tenant-id: <x-tenant-id>' \
--data '
{
"components": [
{
"componentItemId": "b45f6432-2462-4c6f-b00f-1d9d01000000",
"quantity": 123,
"comment": "<string>",
"position": 123
}
]
}
'import requests
url = "https://api.jtl-cloud.com/erp/v2/items/{itemId}/kit-items/convert"
payload = { "components": [
{
"componentItemId": "b45f6432-2462-4c6f-b00f-1d9d01000000",
"quantity": 123,
"comment": "<string>",
"position": 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({
components: [
{
componentItemId: 'b45f6432-2462-4c6f-b00f-1d9d01000000',
quantity: 123,
comment: '<string>',
position: 123
}
]
})
};
fetch('https://api.jtl-cloud.com/erp/v2/items/{itemId}/kit-items/convert', 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/items/{itemId}/kit-items/convert",
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([
'components' => [
[
'componentItemId' => 'b45f6432-2462-4c6f-b00f-1d9d01000000',
'quantity' => 123,
'comment' => '<string>',
'position' => 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/items/{itemId}/kit-items/convert"
payload := strings.NewReader("{\n \"components\": [\n {\n \"componentItemId\": \"b45f6432-2462-4c6f-b00f-1d9d01000000\",\n \"quantity\": 123,\n \"comment\": \"<string>\",\n \"position\": 123\n }\n ]\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/items/{itemId}/kit-items/convert")
.header("x-tenant-id", "<x-tenant-id>")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"components\": [\n {\n \"componentItemId\": \"b45f6432-2462-4c6f-b00f-1d9d01000000\",\n \"quantity\": 123,\n \"comment\": \"<string>\",\n \"position\": 123\n }\n ]\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.jtl-cloud.com/erp/v2/items/{itemId}/kit-items/convert")
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 \"components\": [\n {\n \"componentItemId\": \"b45f6432-2462-4c6f-b00f-1d9d01000000\",\n \"quantity\": 123,\n \"comment\": \"<string>\",\n \"position\": 123\n }\n ]\n}"
response = http.request(request)
puts response.read_body{
"itemId": "b45f6432-2462-4c6f-b00f-1d9d01000000",
"components": [
{
"componentItemId": "b45f6432-2462-4c6f-b00f-1d9d01000000",
"quantity": 123,
"comment": "<string>",
"position": 123
}
]
}{
"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>"
}
]
}Convert Item To Kit Item
Converts an existing standard item into a kit, so that selling one unit of it consumes a fixed set of component items from then on. The full component list is mandatory, because a standard item has no component list to fall back on - supplying at least one component is what makes the item a kit. The item keeps its ID, but the conversion resets several settings and converting back does not restore them: the suppliers are removed, because a kit has no suppliers; stock management is switched off first, which clears the per-warehouse minimum and maximum stock levels written through “PATCH /v2/items//warehouse-constraints” and switches “allowNegativeStock” off; and divisible stock is switched off. An item that tracks best-before dates, batches or serial numbers is not converted at all (409). The kit’s stock management is then derived from its components - it is stock-managed as soon as one component is - so read the item after the conversion to see the resulting settings. There is no direct reverse operation: removing the last component with “DELETE /v2/items//kit-items/components/” or “DeleteKitItemComponent” dissolves the kit and turns the item back into a standard item. Because an item that is itself a kit is never an eligible component, kits cannot be nested. Use “POST /v2/items//kit-items/components” or “AddKitItemComponent” to add a further component to a kit that already exists.
curl --request POST \
--url https://api.jtl-cloud.com/erp/v2/items/{itemId}/kit-items/convert \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--header 'x-tenant-id: <x-tenant-id>' \
--data '
{
"components": [
{
"componentItemId": "b45f6432-2462-4c6f-b00f-1d9d01000000",
"quantity": 123,
"comment": "<string>",
"position": 123
}
]
}
'import requests
url = "https://api.jtl-cloud.com/erp/v2/items/{itemId}/kit-items/convert"
payload = { "components": [
{
"componentItemId": "b45f6432-2462-4c6f-b00f-1d9d01000000",
"quantity": 123,
"comment": "<string>",
"position": 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({
components: [
{
componentItemId: 'b45f6432-2462-4c6f-b00f-1d9d01000000',
quantity: 123,
comment: '<string>',
position: 123
}
]
})
};
fetch('https://api.jtl-cloud.com/erp/v2/items/{itemId}/kit-items/convert', 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/items/{itemId}/kit-items/convert",
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([
'components' => [
[
'componentItemId' => 'b45f6432-2462-4c6f-b00f-1d9d01000000',
'quantity' => 123,
'comment' => '<string>',
'position' => 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/items/{itemId}/kit-items/convert"
payload := strings.NewReader("{\n \"components\": [\n {\n \"componentItemId\": \"b45f6432-2462-4c6f-b00f-1d9d01000000\",\n \"quantity\": 123,\n \"comment\": \"<string>\",\n \"position\": 123\n }\n ]\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/items/{itemId}/kit-items/convert")
.header("x-tenant-id", "<x-tenant-id>")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"components\": [\n {\n \"componentItemId\": \"b45f6432-2462-4c6f-b00f-1d9d01000000\",\n \"quantity\": 123,\n \"comment\": \"<string>\",\n \"position\": 123\n }\n ]\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.jtl-cloud.com/erp/v2/items/{itemId}/kit-items/convert")
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 \"components\": [\n {\n \"componentItemId\": \"b45f6432-2462-4c6f-b00f-1d9d01000000\",\n \"quantity\": 123,\n \"comment\": \"<string>\",\n \"position\": 123\n }\n ]\n}"
response = http.request(request)
puts response.read_body{
"itemId": "b45f6432-2462-4c6f-b00f-1d9d01000000",
"components": [
{
"componentItemId": "b45f6432-2462-4c6f-b00f-1d9d01000000",
"quantity": 123,
"comment": "<string>",
"position": 123
}
]
}{
"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.
Scopes
Grants permission to create and modify item data.
Grants permission to create and modify item data.
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
Unique ID of the item that is converted into a kit.
"b45f6432-2462-4c6f-b00f-1d9d01000000"
Body
Request model for ConvertItemToKitItem command endpoint. Route parameters bind from the route, query parameters from the query string, everything else from the body.
The component items the kit consists of after the conversion. At least one component is required - it is what makes the item a kit. Components are stored in the order they are sent unless a component carries an explicit "position". The same component item may appear only once.
Show child attributes
Show child attributes
Response
The item was successfully converted into a kit.
Converts an existing standard item into a kit, so that selling one unit of it consumes a fixed set of component items from then on. The full component list is mandatory, because a standard item has no component list to fall back on - supplying at least one component is what makes the item a kit. The item keeps its ID, but the conversion resets several settings and converting back does not restore them: the suppliers are removed, because a kit has no suppliers; stock management is switched off first, which clears the per-warehouse minimum and maximum stock levels written through "PATCH /v2/items/{itemId}/warehouse-constraints" and switches "allowNegativeStock" off; and divisible stock is switched off. An item that tracks best-before dates, batches or serial numbers is not converted at all (409). The kit's stock management is then derived from its components - it is stock-managed as soon as one component is - so read the item after the conversion to see the resulting settings. There is no direct reverse operation: removing the last component with "DELETE /v2/items/{itemId}/kit-items/components/{componentItemId}" or "DeleteKitItemComponent" dissolves the kit and turns the item back into a standard item. Because an item that is itself a kit is never an eligible component, kits cannot be nested. Use "POST /v2/items/{itemId}/kit-items/components" or "AddKitItemComponent" to add a further component to a kit that already exists. - Response
Unique ID of the converted item. Unchanged - a kit keeps the ID it had as a standard item.
"b45f6432-2462-4c6f-b00f-1d9d01000000"
The components as they were stored, in their effective order. Worth reading for the effective position of each component, which differs from the requested one when a requested position was out of bounds and got clamped.
Show child attributes
Show child attributes
Was this page helpful?