curl --request PATCH \
--url https://api.novatrade24.com/v1/partners/{sellerId}/buyers/{buyerId} \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--header 'Idempotency-Key: <idempotency-key>' \
--data '
{
"companyName": "<string>"
}
'import requests
url = "https://api.novatrade24.com/v1/partners/{sellerId}/buyers/{buyerId}"
payload = { "companyName": "<string>" }
headers = {
"Idempotency-Key": "<idempotency-key>",
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.patch(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'PATCH',
headers: {
'Idempotency-Key': '<idempotency-key>',
Authorization: 'Bearer <token>',
'Content-Type': 'application/json'
},
body: JSON.stringify({companyName: '<string>'})
};
fetch('https://api.novatrade24.com/v1/partners/{sellerId}/buyers/{buyerId}', 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}/buyers/{buyerId}",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "PATCH",
CURLOPT_POSTFIELDS => json_encode([
'companyName' => '<string>'
]),
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}/buyers/{buyerId}"
payload := strings.NewReader("{\n \"companyName\": \"<string>\"\n}")
req, _ := http.NewRequest("PATCH", 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.patch("https://api.novatrade24.com/v1/partners/{sellerId}/buyers/{buyerId}")
.header("Idempotency-Key", "<idempotency-key>")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"companyName\": \"<string>\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.novatrade24.com/v1/partners/{sellerId}/buyers/{buyerId}")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Patch.new(url)
request["Idempotency-Key"] = '<idempotency-key>'
request["Authorization"] = 'Bearer <token>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"companyName\": \"<string>\"\n}"
response = http.request(request)
puts response.read_body{
"uuid": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"companyNumber": "NT-4K7M-9XQ2",
"type": "COMPANY",
"companyName": "<string>",
"address": {
"uuid": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"street": "<string>",
"postCode": "<string>",
"city": "<string>",
"country": "DE"
},
"kycMode": "MARKETPLACE_LED",
"status": "ACTIVE",
"version": 123,
"createdAt": "2023-11-07T05:31:56Z",
"updatedAt": "2023-11-07T05:31:56Z",
"vatNumber": "<string>",
"inactiveSince": "2023-11-07T05:31:56Z",
"notApplied": [
"companyName"
]
}{
"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>"
}Update a buyer (including KYC mode upgrade A→B).
Updates mutable fields. kycMode may be upgraded from
MARKETPLACE_LED to NT24_LED but not downgraded.
Requires If-Match header with current ETag for optimistic locking.
The buyer record is shared: one record per buyer, held by every partner
that has its KYC result. A buyer reached through a shared KYC result is
editable here, your edit lands for all of them, and the version can move
without you doing anything — which is what If-Match is for.
curl --request PATCH \
--url https://api.novatrade24.com/v1/partners/{sellerId}/buyers/{buyerId} \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--header 'Idempotency-Key: <idempotency-key>' \
--data '
{
"companyName": "<string>"
}
'import requests
url = "https://api.novatrade24.com/v1/partners/{sellerId}/buyers/{buyerId}"
payload = { "companyName": "<string>" }
headers = {
"Idempotency-Key": "<idempotency-key>",
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.patch(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'PATCH',
headers: {
'Idempotency-Key': '<idempotency-key>',
Authorization: 'Bearer <token>',
'Content-Type': 'application/json'
},
body: JSON.stringify({companyName: '<string>'})
};
fetch('https://api.novatrade24.com/v1/partners/{sellerId}/buyers/{buyerId}', 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}/buyers/{buyerId}",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "PATCH",
CURLOPT_POSTFIELDS => json_encode([
'companyName' => '<string>'
]),
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}/buyers/{buyerId}"
payload := strings.NewReader("{\n \"companyName\": \"<string>\"\n}")
req, _ := http.NewRequest("PATCH", 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.patch("https://api.novatrade24.com/v1/partners/{sellerId}/buyers/{buyerId}")
.header("Idempotency-Key", "<idempotency-key>")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"companyName\": \"<string>\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.novatrade24.com/v1/partners/{sellerId}/buyers/{buyerId}")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Patch.new(url)
request["Idempotency-Key"] = '<idempotency-key>'
request["Authorization"] = 'Bearer <token>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"companyName\": \"<string>\"\n}"
response = http.request(request)
puts response.read_body{
"uuid": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"companyNumber": "NT-4K7M-9XQ2",
"type": "COMPANY",
"companyName": "<string>",
"address": {
"uuid": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"street": "<string>",
"postCode": "<string>",
"city": "<string>",
"country": "DE"
},
"kycMode": "MARKETPLACE_LED",
"status": "ACTIVE",
"version": 123,
"createdAt": "2023-11-07T05:31:56Z",
"updatedAt": "2023-11-07T05:31:56Z",
"vatNumber": "<string>",
"inactiveSince": "2023-11-07T05:31:56Z",
"notApplied": [
"companyName"
]
}{
"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 - 255ETag value from a previous response, used for optimistic concurrency.
Mismatch returns 409 with the current resource.
Path Parameters
UUID of the seller trade partner (must be in caller's authorized list).
UUID of the buyer trade partner.
Body
All fields optional. kycMode may be upgraded MARKETPLACE_LED → NT24_LED only.
MARKETPLACE_LED (Mode A), partner provides KYC data; NT24 stores + runs VIES only.
Not available yet: a buyer write naming it is refused with 403.
NT24_LED (Mode B), NT24 runs full verification (iDenfy + AML) and generates a profile.
MARKETPLACE_LED, NT24_LED Show child attributes
Show child attributes
Response
Updated
The Novatrade24-issued partner number. Every partner has one,
whatever its type, which is why this — and not vatNumber — is
the identifier that resolves any buyer.
^NT-[A-Z0-9]{4}-[A-Z0-9]{4}$"NT-4K7M-9XQ2"
Whether the party is a legal entity or a natural person. Shared by
BuyerResponse and ProspectResponse, which describe the same two
kinds of party at different points of the onboarding flow.
The webhook contract publishes these same two values as ProspectType
in asyncapi-integration-v1.yaml. Two names, one set of values.
COMPANY, CONSUMER The legal company name for a COMPANY buyer, the natural person's
full name for a CONSUMER buyer.
Show child attributes
Show child attributes
MARKETPLACE_LED (Mode A), partner provides KYC data; NT24 stores + runs VIES only.
Not available yet: a buyer write naming it is refused with 403.
NT24_LED (Mode B), NT24 runs full verification (iDenfy + AML) and generates a profile.
MARKETPLACE_LED, NT24_LED ACTIVE, BLOCKED Optimistic-concurrency version.
The buyer's VAT number, present only when the platform holds one.
Its presence does not classify the buyer: no onboarding path gives
a natural person a VAT number and a company may never have supplied
one, but neither is a guarantee this API makes. Read type for the
kind of party.
When the buyer closed its account on Novatrade24 and became inactive; null while it is active. An inactive buyer takes no new order, KYC request or invitation (409), and its existing orders are read-only.
Fields of an upsert body that named something other than what this record says, and were therefore not written. Two groups, in one list:
- the buyer's own fields —
companyName,address.street,address.postCode,address.city,address.country; - a
contactsentry that disagreed with the person already recorded under its email address —contacts[0].firstName,contacts[0].lastName,contacts[0].phone, where the index is the entry's position in the array you sent — or that asked for arolethe person did not get,contacts[0].role.
Present on POST /buyers only, and only when there was something to
report. Absent on every read and on a call that agreed with the
record. Absent on a 201 for the buyer's own fields — a buyer this
call just created cannot disagree with the body that created it —
but a contacts entry can still be reported on a 201, because an
array naming two different people on one email address contradicts
itself whatever the buyer's age.
Change a buyer field with PATCH under If-Match. A contact person
cannot be changed through this API at all; ask Novatrade24 support.
notApplied describes your request, not the resource, so it is not
part of the buyer's ETag and two callers reading the same buyer
still see the same tag.