curl --request POST \
--url https://api.novatrade24.com/v1/partners/{sellerId}/buyers/{buyerId}/kyc/self-service-invitations \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--header 'Idempotency-Key: <idempotency-key>' \
--data '
{
"recipientEmail": "[email protected]",
"expiresInDays": 30,
"language": "en"
}
'import requests
url = "https://api.novatrade24.com/v1/partners/{sellerId}/buyers/{buyerId}/kyc/self-service-invitations"
payload = {
"recipientEmail": "[email protected]",
"expiresInDays": 30,
"language": "en"
}
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({recipientEmail: '[email protected]', expiresInDays: 30, language: 'en'})
};
fetch('https://api.novatrade24.com/v1/partners/{sellerId}/buyers/{buyerId}/kyc/self-service-invitations', 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}/kyc/self-service-invitations",
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([
'recipientEmail' => '[email protected]',
'expiresInDays' => 30,
'language' => 'en'
]),
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}/kyc/self-service-invitations"
payload := strings.NewReader("{\n \"recipientEmail\": \"[email protected]\",\n \"expiresInDays\": 30,\n \"language\": \"en\"\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}/buyers/{buyerId}/kyc/self-service-invitations")
.header("Idempotency-Key", "<idempotency-key>")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"recipientEmail\": \"[email protected]\",\n \"expiresInDays\": 30,\n \"language\": \"en\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.novatrade24.com/v1/partners/{sellerId}/buyers/{buyerId}/kyc/self-service-invitations")
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 \"recipientEmail\": \"[email protected]\",\n \"expiresInDays\": 30,\n \"language\": \"en\"\n}"
response = http.request(request)
puts response.read_body{
"uuid": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"kind": "KYC",
"status": "ACTIVE",
"createdAt": "2023-11-07T05:31:56Z",
"recipientEmail": "[email protected]",
"label": "<string>",
"publicLinkUrl": "<string>",
"expiresAt": "2023-11-07T05:31:56Z",
"lastUsedAt": "2023-11-07T05:31:56Z",
"usageCount": 123,
"revokedAt": "2023-11-07T05:31:56Z",
"revocationReason": "<string>",
"creditedContact": {
"id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"firstName": "<string>",
"lastName": "<string>"
},
"paymentSetting": "SELLER_DEFAULT",
"documentUploadSetting": "SELLER_DEFAULT"
}{
"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 a self-service KYC invitation (emailed link).
Refused with 409 when the buyer’s KYC is decided (latest status
VERIFIED, REJECTED, CANCELLED or EXPIRED), and with 422 when
recipientEmail is neither the buyer’s company email nor an active
contact’s.
The response is the only one that carries publicLinkUrl. A second
create by this seller for a recipient with a live invitation it issued
returns that invitation without it and sends no second email (another
partner holding the KYC creates and sends its own), and an Idempotency-Key replay
answers the stored response without it.
The create answers 5XX when the email is not confirmed as sent. If
the mail provider rejected it, the invitation is revoked and a retry
creates and sends a new one. If the outcome is unknown, the invitation
stays live (the email may have arrived) and is listed; a retry returns
it without the link, so revoke it and create a new one to send another.
curl --request POST \
--url https://api.novatrade24.com/v1/partners/{sellerId}/buyers/{buyerId}/kyc/self-service-invitations \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--header 'Idempotency-Key: <idempotency-key>' \
--data '
{
"recipientEmail": "[email protected]",
"expiresInDays": 30,
"language": "en"
}
'import requests
url = "https://api.novatrade24.com/v1/partners/{sellerId}/buyers/{buyerId}/kyc/self-service-invitations"
payload = {
"recipientEmail": "[email protected]",
"expiresInDays": 30,
"language": "en"
}
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({recipientEmail: '[email protected]', expiresInDays: 30, language: 'en'})
};
fetch('https://api.novatrade24.com/v1/partners/{sellerId}/buyers/{buyerId}/kyc/self-service-invitations', 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}/kyc/self-service-invitations",
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([
'recipientEmail' => '[email protected]',
'expiresInDays' => 30,
'language' => 'en'
]),
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}/kyc/self-service-invitations"
payload := strings.NewReader("{\n \"recipientEmail\": \"[email protected]\",\n \"expiresInDays\": 30,\n \"language\": \"en\"\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}/buyers/{buyerId}/kyc/self-service-invitations")
.header("Idempotency-Key", "<idempotency-key>")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"recipientEmail\": \"[email protected]\",\n \"expiresInDays\": 30,\n \"language\": \"en\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.novatrade24.com/v1/partners/{sellerId}/buyers/{buyerId}/kyc/self-service-invitations")
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 \"recipientEmail\": \"[email protected]\",\n \"expiresInDays\": 30,\n \"language\": \"en\"\n}"
response = http.request(request)
puts response.read_body{
"uuid": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"kind": "KYC",
"status": "ACTIVE",
"createdAt": "2023-11-07T05:31:56Z",
"recipientEmail": "[email protected]",
"label": "<string>",
"publicLinkUrl": "<string>",
"expiresAt": "2023-11-07T05:31:56Z",
"lastUsedAt": "2023-11-07T05:31:56Z",
"usageCount": 123,
"revokedAt": "2023-11-07T05:31:56Z",
"revocationReason": "<string>",
"creditedContact": {
"id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"firstName": "<string>",
"lastName": "<string>"
},
"paymentSetting": "SELLER_DEFAULT",
"documentUploadSetting": "SELLER_DEFAULT"
}{
"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).
UUID of the buyer trade partner.
Body
Response
Invitation created and email queued.
KYC, PROSPECT Expiry outranks revocation: a link revoked after it had already lapsed
reads EXPIRED, not REVOKED. MEMBER_LEFT is for kind: PROSPECT
only: the link is neither revoked nor expired, but the member it
credits (creditedContact) has left the seller, so buyers can no
longer use it.
ACTIVE, REVOKED, EXPIRED, MEMBER_LEFT The link handed to the recipient, rooted at the platform's
configured frontend base url: {frontendBaseUrl}/kyc/selfservice/{token}
for kind: KYC and {frontendBaseUrl}/click2comply?ref={code} for
kind: PROSPECT, which opens the Click2Comply form for the seller.
A kind: KYC invitation carries it only in the response of the
create that made it: the platform stores a hash of the token alone,
so the list, the revoke and a create that returns the recipient's
live invitation leave it out. A kind: PROSPECT invitation carries
it always.
When the link stops working. Always present for kind: KYC.
Absent for a kind: PROSPECT link that never expires: one created
here with neverExpires: true, or one a seller's member made on
the platform without an expiry.
kind: PROSPECT only. The seller's contact the link's prospects are
credited to; absent when they are credited to the seller company.
Show child attributes
Show child attributes
kind: PROSPECT only; always present there.
SELLER_DEFAULT, ENABLED, DISABLED kind: PROSPECT only; always present there.
SELLER_DEFAULT, ENABLED, DISABLED