curl --request GET \
--url https://api.novatrade24.com/v1/partners/{sellerId}/buyers \
--header 'Authorization: Bearer <token>'import requests
url = "https://api.novatrade24.com/v1/partners/{sellerId}/buyers"
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}/buyers', 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",
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}/buyers"
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}/buyers")
.header("Authorization", "Bearer <token>")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.novatrade24.com/v1/partners/{sellerId}/buyers")
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{
"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>"
}{
"type": "<string>",
"title": "<string>",
"status": 123,
"detail": "<string>",
"instance": "<string>",
"traceId": "<string>"
}{
"type": "<string>",
"title": "<string>",
"status": 123,
"detail": "<string>",
"instance": "<string>",
"traceId": "<string>"
}Lookup buyer by VAT number or company number.
Resolves exactly one buyer of this seller. Supply exactly one of
vat or companyNumber; neither and both are both 400.
companyNumber is the Novatrade24 partner number, which every buyer
has. vat matches on the buyer’s VAT number alone, so a buyer for whom
the platform holds none — a natural person, or a company that never
supplied one — is reachable by companyNumber only. Which key resolved
a buyer says nothing about what kind of party it is: read type on the
response.
Either value is matched exactly, ignoring case and surrounding whitespace. There is no partial or fuzzy matching: a prefix of a real number is a miss, not a hit. A value of the wrong shape is a miss too, not a validation error.
A VAT number is not unique, so it can reach both a buyer you recorded
yourself and one you reach through another partner’s shared KYC result.
Where it reaches both, this answers with your own record — the one
your orders point at and the one a PATCH from you should correct. The
shared record stays reachable by companyNumber and by its uuid.
curl --request GET \
--url https://api.novatrade24.com/v1/partners/{sellerId}/buyers \
--header 'Authorization: Bearer <token>'import requests
url = "https://api.novatrade24.com/v1/partners/{sellerId}/buyers"
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}/buyers', 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",
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}/buyers"
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}/buyers")
.header("Authorization", "Bearer <token>")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.novatrade24.com/v1/partners/{sellerId}/buyers")
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{
"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>"
}{
"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
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.