curl --request POST \
--url https://api.novatrade24.com/v1/partners/{sellerId}/orders \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--header 'Idempotency-Key: <idempotency-key>' \
--data '
{
"externalOrderId": "<string>",
"buyerId": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"purchaseDate": "2023-12-25",
"vins": [
{
"vin": "<string>",
"brand": "<string>",
"model": "<string>",
"purchaseAmount": {
"value": 7900,
"currency": "EUR"
},
"mileage": 1,
"firstRegistrationDate": "2023-12-25"
}
],
"totalAmount": {
"value": 7900,
"currency": "EUR"
}
}
'import requests
url = "https://api.novatrade24.com/v1/partners/{sellerId}/orders"
payload = {
"externalOrderId": "<string>",
"buyerId": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"purchaseDate": "2023-12-25",
"vins": [
{
"vin": "<string>",
"brand": "<string>",
"model": "<string>",
"purchaseAmount": {
"value": 7900,
"currency": "EUR"
},
"mileage": 1,
"firstRegistrationDate": "2023-12-25"
}
],
"totalAmount": {
"value": 7900,
"currency": "EUR"
}
}
headers = {
"Idempotency-Key": "<idempotency-key>",
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {
'Idempotency-Key': '<idempotency-key>',
Authorization: 'Bearer <token>',
'Content-Type': 'application/json'
},
body: JSON.stringify({
externalOrderId: '<string>',
buyerId: '3c90c3cc-0d44-4b50-8888-8dd25736052a',
purchaseDate: '2023-12-25',
vins: [
{
vin: '<string>',
brand: '<string>',
model: '<string>',
purchaseAmount: {value: 7900, currency: 'EUR'},
mileage: 1,
firstRegistrationDate: '2023-12-25'
}
],
totalAmount: {value: 7900, currency: 'EUR'}
})
};
fetch('https://api.novatrade24.com/v1/partners/{sellerId}/orders', 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.novatrade24.com/v1/partners/{sellerId}/orders",
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([
'externalOrderId' => '<string>',
'buyerId' => '3c90c3cc-0d44-4b50-8888-8dd25736052a',
'purchaseDate' => '2023-12-25',
'vins' => [
[
'vin' => '<string>',
'brand' => '<string>',
'model' => '<string>',
'purchaseAmount' => [
'value' => 7900,
'currency' => 'EUR'
],
'mileage' => 1,
'firstRegistrationDate' => '2023-12-25'
]
],
'totalAmount' => [
'value' => 7900,
'currency' => 'EUR'
]
]),
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>",
"Content-Type: application/json",
"Idempotency-Key: <idempotency-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.novatrade24.com/v1/partners/{sellerId}/orders"
payload := strings.NewReader("{\n \"externalOrderId\": \"<string>\",\n \"buyerId\": \"3c90c3cc-0d44-4b50-8888-8dd25736052a\",\n \"purchaseDate\": \"2023-12-25\",\n \"vins\": [\n {\n \"vin\": \"<string>\",\n \"brand\": \"<string>\",\n \"model\": \"<string>\",\n \"purchaseAmount\": {\n \"value\": 7900,\n \"currency\": \"EUR\"\n },\n \"mileage\": 1,\n \"firstRegistrationDate\": \"2023-12-25\"\n }\n ],\n \"totalAmount\": {\n \"value\": 7900,\n \"currency\": \"EUR\"\n }\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("Idempotency-Key", "<idempotency-key>")
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.novatrade24.com/v1/partners/{sellerId}/orders")
.header("Idempotency-Key", "<idempotency-key>")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"externalOrderId\": \"<string>\",\n \"buyerId\": \"3c90c3cc-0d44-4b50-8888-8dd25736052a\",\n \"purchaseDate\": \"2023-12-25\",\n \"vins\": [\n {\n \"vin\": \"<string>\",\n \"brand\": \"<string>\",\n \"model\": \"<string>\",\n \"purchaseAmount\": {\n \"value\": 7900,\n \"currency\": \"EUR\"\n },\n \"mileage\": 1,\n \"firstRegistrationDate\": \"2023-12-25\"\n }\n ],\n \"totalAmount\": {\n \"value\": 7900,\n \"currency\": \"EUR\"\n }\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.novatrade24.com/v1/partners/{sellerId}/orders")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Idempotency-Key"] = '<idempotency-key>'
request["Authorization"] = 'Bearer <token>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"externalOrderId\": \"<string>\",\n \"buyerId\": \"3c90c3cc-0d44-4b50-8888-8dd25736052a\",\n \"purchaseDate\": \"2023-12-25\",\n \"vins\": [\n {\n \"vin\": \"<string>\",\n \"brand\": \"<string>\",\n \"model\": \"<string>\",\n \"purchaseAmount\": {\n \"value\": 7900,\n \"currency\": \"EUR\"\n },\n \"mileage\": 1,\n \"firstRegistrationDate\": \"2023-12-25\"\n }\n ],\n \"totalAmount\": {\n \"value\": 7900,\n \"currency\": \"EUR\"\n }\n}"
response = http.request(request)
puts response.read_body{
"uuid": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"externalOrderId": "<string>",
"buyerId": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"status": "CREATED",
"vins": [
{
"vin": "<string>",
"brand": "<string>",
"model": "<string>",
"purchaseAmount": {
"value": 7900,
"currency": "EUR"
},
"mileage": 1,
"firstRegistrationDate": "2023-12-25",
"complianceStatus": "PENDING"
}
],
"shipmentIds": [
"3c90c3cc-0d44-4b50-8888-8dd25736052a"
],
"totalAmount": {
"value": 7900,
"currency": "EUR"
},
"version": 123,
"createdAt": "2023-11-07T05:31:56Z",
"updatedAt": "2023-11-07T05:31:56Z",
"purchaseDate": "2023-12-25",
"responsibleContact": {
"firstName": "<string>",
"lastName": "<string>",
"email": "[email protected]",
"phone": "<string>"
},
"notApplied": [
"responsibleContact.lastName"
]
}{
"uuid": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"externalOrderId": "<string>",
"buyerId": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"status": "CREATED",
"vins": [
{
"vin": "<string>",
"brand": "<string>",
"model": "<string>",
"purchaseAmount": {
"value": 7900,
"currency": "EUR"
},
"mileage": 1,
"firstRegistrationDate": "2023-12-25",
"complianceStatus": "PENDING"
}
],
"shipmentIds": [
"3c90c3cc-0d44-4b50-8888-8dd25736052a"
],
"totalAmount": {
"value": 7900,
"currency": "EUR"
},
"version": 123,
"createdAt": "2023-11-07T05:31:56Z",
"updatedAt": "2023-11-07T05:31:56Z",
"purchaseDate": "2023-12-25",
"responsibleContact": {
"firstName": "<string>",
"lastName": "<string>",
"email": "[email protected]",
"phone": "<string>"
},
"notApplied": [
"responsibleContact.lastName"
]
}{
"type": "<string>",
"title": "<string>",
"status": 123,
"detail": "<string>",
"instance": "<string>",
"traceId": "<string>"
}{
"type": "<string>",
"title": "<string>",
"status": 123,
"detail": "<string>",
"instance": "<string>",
"traceId": "<string>"
}{
"type": "<string>",
"title": "<string>",
"status": 123,
"detail": "<string>",
"instance": "<string>",
"traceId": "<string>"
}Create an order.
externalOrderId is required and unique per (sellerId, externalOrderId).
Second call with same body returns 200; different body returns 409.
vins is always an array. Single-VIN orders are the common case.
Multi-VIN requires the allowMultiVinOrders capability; otherwise
arrays of length > 1 return 403.
responsibleContact resolves on its email address, compared trimmed and
case-insensitively, exactly as POST /contacts does: a usable contact
person of the buyer whose address matches is reused, one archived at
the buyer is reactivated under the same membership rules as
POST /contacts (a person with a platform account whom the company
removed answers 409; one whose removal is pending is used as they
are; a reactivated owner stays owner only when the buyer has none and
you may name one), and otherwise one is recorded. Omit it and the buyer’s oldest usable contact person is
taken; a buyer with none is 409.
Where your body names a different person under an address the buyer
already has, the order resolves to the person on file and the response
names the differing fields in notApplied. Read it: the responsible
contact is who Novatrade24 holds accountable for this order and who a
Confirmation-of-Arrival chase reaches, so an order that came back with
notApplied: ["responsibleContact.lastName"] is pointed at somebody
whose name is not the one you sent. responsibleContact on the response
carries the person the order actually points at.
curl --request POST \
--url https://api.novatrade24.com/v1/partners/{sellerId}/orders \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--header 'Idempotency-Key: <idempotency-key>' \
--data '
{
"externalOrderId": "<string>",
"buyerId": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"purchaseDate": "2023-12-25",
"vins": [
{
"vin": "<string>",
"brand": "<string>",
"model": "<string>",
"purchaseAmount": {
"value": 7900,
"currency": "EUR"
},
"mileage": 1,
"firstRegistrationDate": "2023-12-25"
}
],
"totalAmount": {
"value": 7900,
"currency": "EUR"
}
}
'import requests
url = "https://api.novatrade24.com/v1/partners/{sellerId}/orders"
payload = {
"externalOrderId": "<string>",
"buyerId": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"purchaseDate": "2023-12-25",
"vins": [
{
"vin": "<string>",
"brand": "<string>",
"model": "<string>",
"purchaseAmount": {
"value": 7900,
"currency": "EUR"
},
"mileage": 1,
"firstRegistrationDate": "2023-12-25"
}
],
"totalAmount": {
"value": 7900,
"currency": "EUR"
}
}
headers = {
"Idempotency-Key": "<idempotency-key>",
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {
'Idempotency-Key': '<idempotency-key>',
Authorization: 'Bearer <token>',
'Content-Type': 'application/json'
},
body: JSON.stringify({
externalOrderId: '<string>',
buyerId: '3c90c3cc-0d44-4b50-8888-8dd25736052a',
purchaseDate: '2023-12-25',
vins: [
{
vin: '<string>',
brand: '<string>',
model: '<string>',
purchaseAmount: {value: 7900, currency: 'EUR'},
mileage: 1,
firstRegistrationDate: '2023-12-25'
}
],
totalAmount: {value: 7900, currency: 'EUR'}
})
};
fetch('https://api.novatrade24.com/v1/partners/{sellerId}/orders', 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.novatrade24.com/v1/partners/{sellerId}/orders",
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([
'externalOrderId' => '<string>',
'buyerId' => '3c90c3cc-0d44-4b50-8888-8dd25736052a',
'purchaseDate' => '2023-12-25',
'vins' => [
[
'vin' => '<string>',
'brand' => '<string>',
'model' => '<string>',
'purchaseAmount' => [
'value' => 7900,
'currency' => 'EUR'
],
'mileage' => 1,
'firstRegistrationDate' => '2023-12-25'
]
],
'totalAmount' => [
'value' => 7900,
'currency' => 'EUR'
]
]),
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>",
"Content-Type: application/json",
"Idempotency-Key: <idempotency-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.novatrade24.com/v1/partners/{sellerId}/orders"
payload := strings.NewReader("{\n \"externalOrderId\": \"<string>\",\n \"buyerId\": \"3c90c3cc-0d44-4b50-8888-8dd25736052a\",\n \"purchaseDate\": \"2023-12-25\",\n \"vins\": [\n {\n \"vin\": \"<string>\",\n \"brand\": \"<string>\",\n \"model\": \"<string>\",\n \"purchaseAmount\": {\n \"value\": 7900,\n \"currency\": \"EUR\"\n },\n \"mileage\": 1,\n \"firstRegistrationDate\": \"2023-12-25\"\n }\n ],\n \"totalAmount\": {\n \"value\": 7900,\n \"currency\": \"EUR\"\n }\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("Idempotency-Key", "<idempotency-key>")
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.novatrade24.com/v1/partners/{sellerId}/orders")
.header("Idempotency-Key", "<idempotency-key>")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"externalOrderId\": \"<string>\",\n \"buyerId\": \"3c90c3cc-0d44-4b50-8888-8dd25736052a\",\n \"purchaseDate\": \"2023-12-25\",\n \"vins\": [\n {\n \"vin\": \"<string>\",\n \"brand\": \"<string>\",\n \"model\": \"<string>\",\n \"purchaseAmount\": {\n \"value\": 7900,\n \"currency\": \"EUR\"\n },\n \"mileage\": 1,\n \"firstRegistrationDate\": \"2023-12-25\"\n }\n ],\n \"totalAmount\": {\n \"value\": 7900,\n \"currency\": \"EUR\"\n }\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.novatrade24.com/v1/partners/{sellerId}/orders")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Idempotency-Key"] = '<idempotency-key>'
request["Authorization"] = 'Bearer <token>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"externalOrderId\": \"<string>\",\n \"buyerId\": \"3c90c3cc-0d44-4b50-8888-8dd25736052a\",\n \"purchaseDate\": \"2023-12-25\",\n \"vins\": [\n {\n \"vin\": \"<string>\",\n \"brand\": \"<string>\",\n \"model\": \"<string>\",\n \"purchaseAmount\": {\n \"value\": 7900,\n \"currency\": \"EUR\"\n },\n \"mileage\": 1,\n \"firstRegistrationDate\": \"2023-12-25\"\n }\n ],\n \"totalAmount\": {\n \"value\": 7900,\n \"currency\": \"EUR\"\n }\n}"
response = http.request(request)
puts response.read_body{
"uuid": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"externalOrderId": "<string>",
"buyerId": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"status": "CREATED",
"vins": [
{
"vin": "<string>",
"brand": "<string>",
"model": "<string>",
"purchaseAmount": {
"value": 7900,
"currency": "EUR"
},
"mileage": 1,
"firstRegistrationDate": "2023-12-25",
"complianceStatus": "PENDING"
}
],
"shipmentIds": [
"3c90c3cc-0d44-4b50-8888-8dd25736052a"
],
"totalAmount": {
"value": 7900,
"currency": "EUR"
},
"version": 123,
"createdAt": "2023-11-07T05:31:56Z",
"updatedAt": "2023-11-07T05:31:56Z",
"purchaseDate": "2023-12-25",
"responsibleContact": {
"firstName": "<string>",
"lastName": "<string>",
"email": "[email protected]",
"phone": "<string>"
},
"notApplied": [
"responsibleContact.lastName"
]
}{
"uuid": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"externalOrderId": "<string>",
"buyerId": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"status": "CREATED",
"vins": [
{
"vin": "<string>",
"brand": "<string>",
"model": "<string>",
"purchaseAmount": {
"value": 7900,
"currency": "EUR"
},
"mileage": 1,
"firstRegistrationDate": "2023-12-25",
"complianceStatus": "PENDING"
}
],
"shipmentIds": [
"3c90c3cc-0d44-4b50-8888-8dd25736052a"
],
"totalAmount": {
"value": 7900,
"currency": "EUR"
},
"version": 123,
"createdAt": "2023-11-07T05:31:56Z",
"updatedAt": "2023-11-07T05:31:56Z",
"purchaseDate": "2023-12-25",
"responsibleContact": {
"firstName": "<string>",
"lastName": "<string>",
"email": "[email protected]",
"phone": "<string>"
},
"notApplied": [
"responsibleContact.lastName"
]
}{
"type": "<string>",
"title": "<string>",
"status": 123,
"detail": "<string>",
"instance": "<string>",
"traceId": "<string>"
}{
"type": "<string>",
"title": "<string>",
"status": 123,
"detail": "<string>",
"instance": "<string>",
"traceId": "<string>"
}{
"type": "<string>",
"title": "<string>",
"status": 123,
"detail": "<string>",
"instance": "<string>",
"traceId": "<string>"
}Authorizations
OAuth 2.0 client_credentials grant via Keycloak service account.
Clients are provisioned per IntegrationOrganization in the
nt24-idp realm.
Headers
Client-generated unique key (UUID recommended) for this write operation.
Identical key + identical body within 24h returns the cached response.
Identical key + different body returns 422.
1 - 255Path Parameters
UUID of the seller trade partner (must be in caller's authorized list).
Body
Response
Existing order returned (idempotent replay), unchanged. notApplied
names the fields of responsibleContact that the person this order
already points at disagreed with, and is absent when there were
none: the replayed body is matched on externalOrderId, and its
responsibleContact on that person's email address alone, so a body
naming a different person on that address reaches this response
rather than the 409. Nothing is written — read
responsibleContact on the response to see who the order points at.
CREATED, INVOICE_SUBMITTED, PAYMENT_SUBMITTED, READY_FOR_PICKUP, TRANSPORT_IN_PROGRESS, TRANSPORT_COMPLETED, COMPLIANCE_VALID, CANCELLED Show child attributes
Show child attributes
The order's live shipments, oldest first. One entry for an ordinary
order; more once NT24 has split it. Each id addresses that half's
payment under
/partners/{sellerId}/orders/{uuid}/shipments/{shipmentId}/payment.
Show child attributes
Show child attributes
Show child attributes
Show child attributes
Fields of the request's responsibleContact that named something
other than what the person already recorded under that email address
says, and were therefore not written —
responsibleContact.firstName, responsibleContact.lastName,
responsibleContact.phone. responsibleContact.email is never
listed: it is the key the two were matched on.
Present only on POST /orders and PATCH /orders/{uuid}, and only
when there was something to report. Absent on every read, on a newly
recorded person and on a call that agreed with the record. Present
on a call that moved nothing, too — a body that named a different
person on the address this order's contact already holds changes
nothing AND disagrees with the record — so both the 200 of a
replayed POST /orders and a PATCH that wrote nothing can carry
it.
responsibleContact on the response carries the person the order
actually points at. Nothing here is applied: a stored contact person
is never overwritten through this API.
notApplied describes your request, not the order, so it is not
part of the order's ETag and a read of the same order reproduces
the tag the write returned.