curl --request GET \
--url https://api.novatrade24.com/v1/partners/{sellerId}/orders/{uuid}/compliance \
--header 'Authorization: Bearer <token>'import requests
url = "https://api.novatrade24.com/v1/partners/{sellerId}/orders/{uuid}/compliance"
headers = {"Authorization": "Bearer <token>"}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {Authorization: 'Bearer <token>'}};
fetch('https://api.novatrade24.com/v1/partners/{sellerId}/orders/{uuid}/compliance', 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/{uuid}/compliance",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "GET",
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>"
],
]);
$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.novatrade24.com/v1/partners/{sellerId}/orders/{uuid}/compliance"
req, _ := http.NewRequest("GET", url, nil)
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.get("https://api.novatrade24.com/v1/partners/{sellerId}/orders/{uuid}/compliance")
.header("Authorization", "Bearer <token>")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.novatrade24.com/v1/partners/{sellerId}/orders/{uuid}/compliance")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Get.new(url)
request["Authorization"] = 'Bearer <token>'
response = http.request(request)
puts response.read_body{
"orderUuid": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"complianceStatus": "INCOMPLETE",
"blockers": [
{
"module": "buyer",
"code": "DOCUMENT",
"message": "<string>",
"documentType": "COC_EXTRACT"
}
],
"modules": {
"buyer": {
"buyerId": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"kycMode": "MARKETPLACE_LED",
"overallStatus": "INCOMPLETE",
"viesLastCheckedAt": "2023-11-07T05:31:56Z",
"viesResult": "VALID",
"documentsComplete": true,
"verificationStatus": "NOT_STARTED",
"amlStatus": "NOT_APPLICABLE"
},
"order": {
"status": "CREATED",
"vins": [
{
"vin": "<string>",
"brand": "<string>",
"model": "<string>",
"purchaseAmount": {
"value": 7900,
"currency": "EUR"
},
"mileage": 1,
"firstRegistrationDate": "2023-12-25",
"complianceStatus": "PENDING"
}
]
},
"invoice": {
"type": "PRELIMINARY",
"invoiceDate": "2023-12-25",
"vatIncluded": true,
"invoiceNumber": "<string>",
"marginScheme": false,
"amount": {
"value": 7900,
"currency": "EUR"
},
"status": "DRAFT",
"finalInvoiceRequired": true,
"finalInvoiceReceived": true,
"version": 123,
"updatedAt": "2023-11-07T05:31:56Z"
},
"payment": {
"paymentDate": "2023-12-25",
"bankAmount": {
"value": 7900,
"currency": "EUR"
},
"cashAmount": {
"value": 7900,
"currency": "EUR"
},
"sourceIban": "DE89370400440532013000",
"sourceAccountComment": "Paid from the managing director's private account; the company account was frozen.",
"status": "DRAFT",
"amountMatchesInvoice": true,
"ibanConsistent": true,
"readyForPickup": true,
"version": 123,
"updatedAt": "2023-11-07T05:31:56Z"
},
"transport": {
"vins": [
{
"vin": "<string>",
"shipmentId": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"status": "NOT_STARTED",
"pickupConfirmed": true,
"deliveryConfirmed": true,
"arrivalConfirmed": true,
"pickupDate": "2023-12-25",
"deliveryDate": "2023-12-25"
}
],
"status": "NOT_STARTED",
"pickupConfirmed": true,
"pickupDate": "2023-12-25",
"deliveryConfirmed": true,
"deliveryDate": "2023-12-25",
"arrivalConfirmed": true,
"cmrUploaded": true
}
},
"updatedAt": "2023-11-07T05:31:56Z"
}{
"type": "<string>",
"title": "<string>",
"status": 123,
"detail": "<string>",
"instance": "<string>",
"traceId": "<string>"
}{
"type": "<string>",
"title": "<string>",
"status": 123,
"detail": "<string>",
"instance": "<string>",
"traceId": "<string>"
}Get end-to-end compliance rollup for an order.
One call instead of five. Returns the order’s compliance status, the
list of blockers, and the per-module sub-state for buyer, order,
invoice, payment and transport — each module the same schema the
module’s own operation returns, so a client that already generates
InvoiceResponse reads modules.invoice with the type it has.
Use with If-None-Match to poll cheaply, 304 when unchanged.
curl --request GET \
--url https://api.novatrade24.com/v1/partners/{sellerId}/orders/{uuid}/compliance \
--header 'Authorization: Bearer <token>'import requests
url = "https://api.novatrade24.com/v1/partners/{sellerId}/orders/{uuid}/compliance"
headers = {"Authorization": "Bearer <token>"}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {Authorization: 'Bearer <token>'}};
fetch('https://api.novatrade24.com/v1/partners/{sellerId}/orders/{uuid}/compliance', 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/{uuid}/compliance",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "GET",
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>"
],
]);
$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.novatrade24.com/v1/partners/{sellerId}/orders/{uuid}/compliance"
req, _ := http.NewRequest("GET", url, nil)
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.get("https://api.novatrade24.com/v1/partners/{sellerId}/orders/{uuid}/compliance")
.header("Authorization", "Bearer <token>")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.novatrade24.com/v1/partners/{sellerId}/orders/{uuid}/compliance")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Get.new(url)
request["Authorization"] = 'Bearer <token>'
response = http.request(request)
puts response.read_body{
"orderUuid": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"complianceStatus": "INCOMPLETE",
"blockers": [
{
"module": "buyer",
"code": "DOCUMENT",
"message": "<string>",
"documentType": "COC_EXTRACT"
}
],
"modules": {
"buyer": {
"buyerId": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"kycMode": "MARKETPLACE_LED",
"overallStatus": "INCOMPLETE",
"viesLastCheckedAt": "2023-11-07T05:31:56Z",
"viesResult": "VALID",
"documentsComplete": true,
"verificationStatus": "NOT_STARTED",
"amlStatus": "NOT_APPLICABLE"
},
"order": {
"status": "CREATED",
"vins": [
{
"vin": "<string>",
"brand": "<string>",
"model": "<string>",
"purchaseAmount": {
"value": 7900,
"currency": "EUR"
},
"mileage": 1,
"firstRegistrationDate": "2023-12-25",
"complianceStatus": "PENDING"
}
]
},
"invoice": {
"type": "PRELIMINARY",
"invoiceDate": "2023-12-25",
"vatIncluded": true,
"invoiceNumber": "<string>",
"marginScheme": false,
"amount": {
"value": 7900,
"currency": "EUR"
},
"status": "DRAFT",
"finalInvoiceRequired": true,
"finalInvoiceReceived": true,
"version": 123,
"updatedAt": "2023-11-07T05:31:56Z"
},
"payment": {
"paymentDate": "2023-12-25",
"bankAmount": {
"value": 7900,
"currency": "EUR"
},
"cashAmount": {
"value": 7900,
"currency": "EUR"
},
"sourceIban": "DE89370400440532013000",
"sourceAccountComment": "Paid from the managing director's private account; the company account was frozen.",
"status": "DRAFT",
"amountMatchesInvoice": true,
"ibanConsistent": true,
"readyForPickup": true,
"version": 123,
"updatedAt": "2023-11-07T05:31:56Z"
},
"transport": {
"vins": [
{
"vin": "<string>",
"shipmentId": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"status": "NOT_STARTED",
"pickupConfirmed": true,
"deliveryConfirmed": true,
"arrivalConfirmed": true,
"pickupDate": "2023-12-25",
"deliveryDate": "2023-12-25"
}
],
"status": "NOT_STARTED",
"pickupConfirmed": true,
"pickupDate": "2023-12-25",
"deliveryConfirmed": true,
"deliveryDate": "2023-12-25",
"arrivalConfirmed": true,
"cmrUploaded": true
}
},
"updatedAt": "2023-11-07T05:31:56Z"
}{
"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.
Path Parameters
UUID of the seller trade partner (must be in caller's authorized list).
Response
OK
Where the order stands, as the platform records it.
INCOMPLETE— the order is open.blockers[]says what is missing.VALID— Novatrade24 staff closed the order.CANCELLED— the order was cancelled. Terminal, and it is why this enum is not simply "open or closed": a cancelled order would otherwise reportINCOMPLETEforever.
VALID is a record of a decision staff made, not a proof that every
artifact is on file. Staff may force-close an order, so VALID with
a non-empty blockers[] is possible and is not a contradiction —
read it as "closed, with these items still outstanding".
INCOMPLETE, VALID, CANCELLED What the order is still waiting for, as the platform's own
missing-items analysis reports it. Empty on an order with nothing
outstanding — and possibly non-empty on a VALID one, see
ComplianceStatus.
Show child attributes
Show child attributes
The five module projections, each typed as the schema its own operation returns. Nothing here is computed for the rollup — these are the same reads, composed into one response so you do not make five calls.
Show child attributes
Show child attributes
The newest of three timestamps: the order's, its live shipments' and their transports'. There is no rollup row of its own, so this is the latest of those rather than a field anybody writes.
It is not a change detector, and the ETag is. Three of the
things this rollup reads carry no timestamp of their own — the
buyer's KYC record, the buyer's contacts and the order's VINs — so
blockers[] can change while this field stands still. Poll with
If-None-Match: the validator is derived from the whole composed
body, so it moves when any published value moves. Comparing
updatedAt is not equivalent to comparing the ETag.