curl --request POST \
--url https://api.jtl-cloud.com/erp/authentication \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--header 'x-challengecode: <x-challengecode>' \
--header 'x-tenant-id: <x-tenant-id>' \
--data '
{
"AppId": "myApp/v1",
"DisplayName": "My App",
"Description": "Demo app for testing purposes",
"Version": "1.0.0",
"ProviderName": "JTL-Software-GmbH",
"ProviderWebsite": "https://www.jtl-software.de",
"MandatoryApiScopes": "",
"AppIcon": "aSDinaTvuI8gbWludGxpZnk=",
"LocalizedDisplayNames": [
{
"LanguageIso": "DE",
"Name": "German"
}
],
"LocalizedDescriptions": [
{
"LanguageIso": "DE",
"Name": "German"
}
],
"OptionalApiScopes": "",
"Signature": "aSDinaTvuI8gbWludGxpZnk=",
"SignatureData": "2025-03-20T08:57:00.0000000+01:00"
}
'import requests
url = "https://api.jtl-cloud.com/erp/authentication"
payload = {
"AppId": "myApp/v1",
"DisplayName": "My App",
"Description": "Demo app for testing purposes",
"Version": "1.0.0",
"ProviderName": "JTL-Software-GmbH",
"ProviderWebsite": "https://www.jtl-software.de",
"MandatoryApiScopes": "",
"AppIcon": "aSDinaTvuI8gbWludGxpZnk=",
"LocalizedDisplayNames": [
{
"LanguageIso": "DE",
"Name": "German"
}
],
"LocalizedDescriptions": [
{
"LanguageIso": "DE",
"Name": "German"
}
],
"OptionalApiScopes": "",
"Signature": "aSDinaTvuI8gbWludGxpZnk=",
"SignatureData": "2025-03-20T08:57:00.0000000+01:00"
}
headers = {
"x-challengecode": "<x-challengecode>",
"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-challengecode': '<x-challengecode>',
'x-tenant-id': '<x-tenant-id>',
Authorization: 'Bearer <token>',
'Content-Type': 'application/json'
},
body: JSON.stringify({
AppId: 'myApp/v1',
DisplayName: 'My App',
Description: 'Demo app for testing purposes',
Version: '1.0.0',
ProviderName: 'JTL-Software-GmbH',
ProviderWebsite: 'https://www.jtl-software.de',
MandatoryApiScopes: '',
AppIcon: 'aSDinaTvuI8gbWludGxpZnk=',
LocalizedDisplayNames: [{LanguageIso: 'DE', Name: 'German'}],
LocalizedDescriptions: [{LanguageIso: 'DE', Name: 'German'}],
OptionalApiScopes: '',
Signature: 'aSDinaTvuI8gbWludGxpZnk=',
SignatureData: '2025-03-20T08:57:00.0000000+01:00'
})
};
fetch('https://api.jtl-cloud.com/erp/authentication', 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/authentication",
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([
'AppId' => 'myApp/v1',
'DisplayName' => 'My App',
'Description' => 'Demo app for testing purposes',
'Version' => '1.0.0',
'ProviderName' => 'JTL-Software-GmbH',
'ProviderWebsite' => 'https://www.jtl-software.de',
'MandatoryApiScopes' => '',
'AppIcon' => 'aSDinaTvuI8gbWludGxpZnk=',
'LocalizedDisplayNames' => [
[
'LanguageIso' => 'DE',
'Name' => 'German'
]
],
'LocalizedDescriptions' => [
[
'LanguageIso' => 'DE',
'Name' => 'German'
]
],
'OptionalApiScopes' => '',
'Signature' => 'aSDinaTvuI8gbWludGxpZnk=',
'SignatureData' => '2025-03-20T08:57:00.0000000+01:00'
]),
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>",
"Content-Type: application/json",
"x-challengecode: <x-challengecode>",
"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/authentication"
payload := strings.NewReader("{\n \"AppId\": \"myApp/v1\",\n \"DisplayName\": \"My App\",\n \"Description\": \"Demo app for testing purposes\",\n \"Version\": \"1.0.0\",\n \"ProviderName\": \"JTL-Software-GmbH\",\n \"ProviderWebsite\": \"https://www.jtl-software.de\",\n \"MandatoryApiScopes\": \"\",\n \"AppIcon\": \"aSDinaTvuI8gbWludGxpZnk=\",\n \"LocalizedDisplayNames\": [\n {\n \"LanguageIso\": \"DE\",\n \"Name\": \"German\"\n }\n ],\n \"LocalizedDescriptions\": [\n {\n \"LanguageIso\": \"DE\",\n \"Name\": \"German\"\n }\n ],\n \"OptionalApiScopes\": \"\",\n \"Signature\": \"aSDinaTvuI8gbWludGxpZnk=\",\n \"SignatureData\": \"2025-03-20T08:57:00.0000000+01:00\"\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("x-challengecode", "<x-challengecode>")
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/authentication")
.header("x-challengecode", "<x-challengecode>")
.header("x-tenant-id", "<x-tenant-id>")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"AppId\": \"myApp/v1\",\n \"DisplayName\": \"My App\",\n \"Description\": \"Demo app for testing purposes\",\n \"Version\": \"1.0.0\",\n \"ProviderName\": \"JTL-Software-GmbH\",\n \"ProviderWebsite\": \"https://www.jtl-software.de\",\n \"MandatoryApiScopes\": \"\",\n \"AppIcon\": \"aSDinaTvuI8gbWludGxpZnk=\",\n \"LocalizedDisplayNames\": [\n {\n \"LanguageIso\": \"DE\",\n \"Name\": \"German\"\n }\n ],\n \"LocalizedDescriptions\": [\n {\n \"LanguageIso\": \"DE\",\n \"Name\": \"German\"\n }\n ],\n \"OptionalApiScopes\": \"\",\n \"Signature\": \"aSDinaTvuI8gbWludGxpZnk=\",\n \"SignatureData\": \"2025-03-20T08:57:00.0000000+01:00\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.jtl-cloud.com/erp/authentication")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["x-challengecode"] = '<x-challengecode>'
request["x-tenant-id"] = '<x-tenant-id>'
request["Authorization"] = 'Bearer <token>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"AppId\": \"myApp/v1\",\n \"DisplayName\": \"My App\",\n \"Description\": \"Demo app for testing purposes\",\n \"Version\": \"1.0.0\",\n \"ProviderName\": \"JTL-Software-GmbH\",\n \"ProviderWebsite\": \"https://www.jtl-software.de\",\n \"MandatoryApiScopes\": \"\",\n \"AppIcon\": \"aSDinaTvuI8gbWludGxpZnk=\",\n \"LocalizedDisplayNames\": [\n {\n \"LanguageIso\": \"DE\",\n \"Name\": \"German\"\n }\n ],\n \"LocalizedDescriptions\": [\n {\n \"LanguageIso\": \"DE\",\n \"Name\": \"German\"\n }\n ],\n \"OptionalApiScopes\": \"\",\n \"Signature\": \"aSDinaTvuI8gbWludGxpZnk=\",\n \"SignatureData\": \"2025-03-20T08:57:00.0000000+01:00\"\n}"
response = http.request(request)
puts response.read_body{
"AppId": "myApp/V3",
"RegistrationRequestId": "295C196B-CBB0-4E76-9050-ECEC3356DDA6"
}{
"ErrorCode": "<string>",
"ValidationErrors": {},
"Errors": {},
"ErrorMessage": "<string>",
"Stacktrace": "<string>"
}{
"ErrorCode": "<string>",
"ValidationErrors": {},
"Errors": {},
"ErrorMessage": "<string>",
"Stacktrace": "<string>"
}Register App
Send a registration request for an (external) application
curl --request POST \
--url https://api.jtl-cloud.com/erp/authentication \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--header 'x-challengecode: <x-challengecode>' \
--header 'x-tenant-id: <x-tenant-id>' \
--data '
{
"AppId": "myApp/v1",
"DisplayName": "My App",
"Description": "Demo app for testing purposes",
"Version": "1.0.0",
"ProviderName": "JTL-Software-GmbH",
"ProviderWebsite": "https://www.jtl-software.de",
"MandatoryApiScopes": "",
"AppIcon": "aSDinaTvuI8gbWludGxpZnk=",
"LocalizedDisplayNames": [
{
"LanguageIso": "DE",
"Name": "German"
}
],
"LocalizedDescriptions": [
{
"LanguageIso": "DE",
"Name": "German"
}
],
"OptionalApiScopes": "",
"Signature": "aSDinaTvuI8gbWludGxpZnk=",
"SignatureData": "2025-03-20T08:57:00.0000000+01:00"
}
'import requests
url = "https://api.jtl-cloud.com/erp/authentication"
payload = {
"AppId": "myApp/v1",
"DisplayName": "My App",
"Description": "Demo app for testing purposes",
"Version": "1.0.0",
"ProviderName": "JTL-Software-GmbH",
"ProviderWebsite": "https://www.jtl-software.de",
"MandatoryApiScopes": "",
"AppIcon": "aSDinaTvuI8gbWludGxpZnk=",
"LocalizedDisplayNames": [
{
"LanguageIso": "DE",
"Name": "German"
}
],
"LocalizedDescriptions": [
{
"LanguageIso": "DE",
"Name": "German"
}
],
"OptionalApiScopes": "",
"Signature": "aSDinaTvuI8gbWludGxpZnk=",
"SignatureData": "2025-03-20T08:57:00.0000000+01:00"
}
headers = {
"x-challengecode": "<x-challengecode>",
"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-challengecode': '<x-challengecode>',
'x-tenant-id': '<x-tenant-id>',
Authorization: 'Bearer <token>',
'Content-Type': 'application/json'
},
body: JSON.stringify({
AppId: 'myApp/v1',
DisplayName: 'My App',
Description: 'Demo app for testing purposes',
Version: '1.0.0',
ProviderName: 'JTL-Software-GmbH',
ProviderWebsite: 'https://www.jtl-software.de',
MandatoryApiScopes: '',
AppIcon: 'aSDinaTvuI8gbWludGxpZnk=',
LocalizedDisplayNames: [{LanguageIso: 'DE', Name: 'German'}],
LocalizedDescriptions: [{LanguageIso: 'DE', Name: 'German'}],
OptionalApiScopes: '',
Signature: 'aSDinaTvuI8gbWludGxpZnk=',
SignatureData: '2025-03-20T08:57:00.0000000+01:00'
})
};
fetch('https://api.jtl-cloud.com/erp/authentication', 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/authentication",
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([
'AppId' => 'myApp/v1',
'DisplayName' => 'My App',
'Description' => 'Demo app for testing purposes',
'Version' => '1.0.0',
'ProviderName' => 'JTL-Software-GmbH',
'ProviderWebsite' => 'https://www.jtl-software.de',
'MandatoryApiScopes' => '',
'AppIcon' => 'aSDinaTvuI8gbWludGxpZnk=',
'LocalizedDisplayNames' => [
[
'LanguageIso' => 'DE',
'Name' => 'German'
]
],
'LocalizedDescriptions' => [
[
'LanguageIso' => 'DE',
'Name' => 'German'
]
],
'OptionalApiScopes' => '',
'Signature' => 'aSDinaTvuI8gbWludGxpZnk=',
'SignatureData' => '2025-03-20T08:57:00.0000000+01:00'
]),
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>",
"Content-Type: application/json",
"x-challengecode: <x-challengecode>",
"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/authentication"
payload := strings.NewReader("{\n \"AppId\": \"myApp/v1\",\n \"DisplayName\": \"My App\",\n \"Description\": \"Demo app for testing purposes\",\n \"Version\": \"1.0.0\",\n \"ProviderName\": \"JTL-Software-GmbH\",\n \"ProviderWebsite\": \"https://www.jtl-software.de\",\n \"MandatoryApiScopes\": \"\",\n \"AppIcon\": \"aSDinaTvuI8gbWludGxpZnk=\",\n \"LocalizedDisplayNames\": [\n {\n \"LanguageIso\": \"DE\",\n \"Name\": \"German\"\n }\n ],\n \"LocalizedDescriptions\": [\n {\n \"LanguageIso\": \"DE\",\n \"Name\": \"German\"\n }\n ],\n \"OptionalApiScopes\": \"\",\n \"Signature\": \"aSDinaTvuI8gbWludGxpZnk=\",\n \"SignatureData\": \"2025-03-20T08:57:00.0000000+01:00\"\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("x-challengecode", "<x-challengecode>")
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/authentication")
.header("x-challengecode", "<x-challengecode>")
.header("x-tenant-id", "<x-tenant-id>")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"AppId\": \"myApp/v1\",\n \"DisplayName\": \"My App\",\n \"Description\": \"Demo app for testing purposes\",\n \"Version\": \"1.0.0\",\n \"ProviderName\": \"JTL-Software-GmbH\",\n \"ProviderWebsite\": \"https://www.jtl-software.de\",\n \"MandatoryApiScopes\": \"\",\n \"AppIcon\": \"aSDinaTvuI8gbWludGxpZnk=\",\n \"LocalizedDisplayNames\": [\n {\n \"LanguageIso\": \"DE\",\n \"Name\": \"German\"\n }\n ],\n \"LocalizedDescriptions\": [\n {\n \"LanguageIso\": \"DE\",\n \"Name\": \"German\"\n }\n ],\n \"OptionalApiScopes\": \"\",\n \"Signature\": \"aSDinaTvuI8gbWludGxpZnk=\",\n \"SignatureData\": \"2025-03-20T08:57:00.0000000+01:00\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.jtl-cloud.com/erp/authentication")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["x-challengecode"] = '<x-challengecode>'
request["x-tenant-id"] = '<x-tenant-id>'
request["Authorization"] = 'Bearer <token>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"AppId\": \"myApp/v1\",\n \"DisplayName\": \"My App\",\n \"Description\": \"Demo app for testing purposes\",\n \"Version\": \"1.0.0\",\n \"ProviderName\": \"JTL-Software-GmbH\",\n \"ProviderWebsite\": \"https://www.jtl-software.de\",\n \"MandatoryApiScopes\": \"\",\n \"AppIcon\": \"aSDinaTvuI8gbWludGxpZnk=\",\n \"LocalizedDisplayNames\": [\n {\n \"LanguageIso\": \"DE\",\n \"Name\": \"German\"\n }\n ],\n \"LocalizedDescriptions\": [\n {\n \"LanguageIso\": \"DE\",\n \"Name\": \"German\"\n }\n ],\n \"OptionalApiScopes\": \"\",\n \"Signature\": \"aSDinaTvuI8gbWludGxpZnk=\",\n \"SignatureData\": \"2025-03-20T08:57:00.0000000+01:00\"\n}"
response = http.request(request)
puts response.read_body{
"AppId": "myApp/V3",
"RegistrationRequestId": "295C196B-CBB0-4E76-9050-ECEC3356DDA6"
}{
"ErrorCode": "<string>",
"ValidationErrors": {},
"Errors": {},
"ErrorMessage": "<string>",
"Stacktrace": "<string>"
}{
"ErrorCode": "<string>",
"ValidationErrors": {},
"Errors": {},
"ErrorMessage": "<string>",
"Stacktrace": "<string>"
}Authorizations
The access token received from the authorization server in the OAuth 2.0 flow.
Headers
You can enter any custom value here. The X-ChallengeCode is used during app registration and must be the same for all registration requests. The maximum length is 30 characters.
The tenant ID for the target ERP instance.
Body
Contains the registration request's data
Model Class: CreateAppRegistrationRequest
Unique identifier of the application
"myApp/v1"
Default display name of the application
"My App"
Default description of the application
"Demo app for testing purposes"
Version of the application to be registered
"1.0.0"
Name of the application's provider
"JTL-Software-GmbH"
Website of the application's provider
"https://www.jtl-software.de"
Mandatory required API scopes for the application to work
""
Base64 encoded data of an image.
Show child attributes
Show child attributes
Show child attributes
Show child attributes
""
0 = OneInstance, 1 = MultiInstance, 2 = PerUserInstance, 3 = PerUserLoginInstance
0, 1, 2, 3 "2025-03-20T08:57:00.0000000+01:00"
Response
Status of the registration process (including the unique identifiers for application and registration request)
Model Class: RegistrationRequestStatusInfo
Was this page helpful?