curl -X POST https://verification.didit.me/v3/kyb/ubo/ \
-H 'x-api-key: YOUR_API_KEY' \
-H 'Content-Type: application/json' \
-d '{
"kyb_response_id": "69aeeb95febb0f1704042259",
"vendor_data": "company-1234"
}'import os, requests
search = requests.post(
"https://verification.didit.me/v3/kyb/search/",
headers={"x-api-key": os.environ["DIDIT_API_KEY"]},
json={"country_code": "GB", "name": "Tesco"},
timeout=60,
).json()
kyb_response_id = search["kyb_registry"]["companies"][0]["kyb_response_id"]
resp = requests.post(
"https://verification.didit.me/v3/kyb/ubo/",
headers={"x-api-key": os.environ["DIDIT_API_KEY"]},
json={"kyb_response_id": kyb_response_id, "vendor_data": "company-1234"},
timeout=90, # waits for the registry to resolve the full profile
)
resp.raise_for_status()
company = resp.json()["kyb_registry"]
print(company["company_name"], company["registry_status"], company["status"])const res = await fetch('https://verification.didit.me/v3/kyb/ubo/', {
method: 'POST',
headers: {
'x-api-key': 'YOUR_API_KEY',
'Content-Type': 'application/json',
},
body: JSON.stringify({
kyb_response_id: '69aeeb95febb0f1704042259',
vendor_data: 'company-1234',
}),
});
const data = await res.json();
console.log(data.kyb_registry.company_name, data.kyb_registry.registry_status);<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://verification.didit.me/v3/kyb/ubo/",
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([
'kyb_response_id' => '69aeeb95febb0f1704042259',
'vendor_data' => '<string>',
'metadata' => [
],
'save_api_request' => true
]),
CURLOPT_HTTPHEADER => [
"Content-Type: application/json",
"x-api-key: <api-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://verification.didit.me/v3/kyb/ubo/"
payload := strings.NewReader("{\n \"kyb_response_id\": \"69aeeb95febb0f1704042259\",\n \"vendor_data\": \"<string>\",\n \"metadata\": {},\n \"save_api_request\": true\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("x-api-key", "<api-key>")
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://verification.didit.me/v3/kyb/ubo/")
.header("x-api-key", "<api-key>")
.header("Content-Type", "application/json")
.body("{\n \"kyb_response_id\": \"69aeeb95febb0f1704042259\",\n \"vendor_data\": \"<string>\",\n \"metadata\": {},\n \"save_api_request\": true\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://verification.didit.me/v3/kyb/ubo/")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["x-api-key"] = '<api-key>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"kyb_response_id\": \"69aeeb95febb0f1704042259\",\n \"vendor_data\": \"<string>\",\n \"metadata\": {},\n \"save_api_request\": true\n}"
response = http.request(request)
puts response.read_bodyKYB Registry UBOs
Retrieve the Lite profile, the direct shareholders and the ultimate beneficial owners resolved through the ownership chain (registry_data.ubo_resolution carries the corporate parent chain) of one candidate returned by POST /v3/kyb/search/.
Pairing with search. Pass the candidate’s kyb_response_id exactly as returned by a search of the same application. The search runs on the Lite registry chain; when the country’s ownership data lives at another registry Didit re-finds the company there by registration number, at no extra cost.
Billing. Billed at the country’s UBO price — see KYB registry pricing. The tier delivered is the highest the country and the registry can serve: Shareholders when the chain cannot be resolved, Lite when there is no ownership record at all; registry_tier_delivered names what was billed. The balance is checked against the UBO price before any registry call (403 when short).
Availability. v3 only. Every call creates a business session (its id is the request_id).
curl -X POST https://verification.didit.me/v3/kyb/ubo/ \
-H 'x-api-key: YOUR_API_KEY' \
-H 'Content-Type: application/json' \
-d '{
"kyb_response_id": "69aeeb95febb0f1704042259",
"vendor_data": "company-1234"
}'import os, requests
search = requests.post(
"https://verification.didit.me/v3/kyb/search/",
headers={"x-api-key": os.environ["DIDIT_API_KEY"]},
json={"country_code": "GB", "name": "Tesco"},
timeout=60,
).json()
kyb_response_id = search["kyb_registry"]["companies"][0]["kyb_response_id"]
resp = requests.post(
"https://verification.didit.me/v3/kyb/ubo/",
headers={"x-api-key": os.environ["DIDIT_API_KEY"]},
json={"kyb_response_id": kyb_response_id, "vendor_data": "company-1234"},
timeout=90, # waits for the registry to resolve the full profile
)
resp.raise_for_status()
company = resp.json()["kyb_registry"]
print(company["company_name"], company["registry_status"], company["status"])const res = await fetch('https://verification.didit.me/v3/kyb/ubo/', {
method: 'POST',
headers: {
'x-api-key': 'YOUR_API_KEY',
'Content-Type': 'application/json',
},
body: JSON.stringify({
kyb_response_id: '69aeeb95febb0f1704042259',
vendor_data: 'company-1234',
}),
});
const data = await res.json();
console.log(data.kyb_registry.company_name, data.kyb_registry.registry_status);<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://verification.didit.me/v3/kyb/ubo/",
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([
'kyb_response_id' => '69aeeb95febb0f1704042259',
'vendor_data' => '<string>',
'metadata' => [
],
'save_api_request' => true
]),
CURLOPT_HTTPHEADER => [
"Content-Type: application/json",
"x-api-key: <api-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://verification.didit.me/v3/kyb/ubo/"
payload := strings.NewReader("{\n \"kyb_response_id\": \"69aeeb95febb0f1704042259\",\n \"vendor_data\": \"<string>\",\n \"metadata\": {},\n \"save_api_request\": true\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("x-api-key", "<api-key>")
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://verification.didit.me/v3/kyb/ubo/")
.header("x-api-key", "<api-key>")
.header("Content-Type", "application/json")
.body("{\n \"kyb_response_id\": \"69aeeb95febb0f1704042259\",\n \"vendor_data\": \"<string>\",\n \"metadata\": {},\n \"save_api_request\": true\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://verification.didit.me/v3/kyb/ubo/")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["x-api-key"] = '<api-key>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"kyb_response_id\": \"69aeeb95febb0f1704042259\",\n \"vendor_data\": \"<string>\",\n \"metadata\": {},\n \"save_api_request\": true\n}"
response = http.request(request)
puts response.read_bodyPOST /v3/kyb/search/ returns candidate companies when you need the ultimate beneficial owners: the shareholders plus the natural persons and corporate parents resolved through the ownership chain (registry_data.ubo_resolution).
It is billed at the country’s UBO price (per-country prices). The tier delivered is the highest the country and the registry can serve, and registry_tier_delivered names what was billed: shareholders when the chain could not be resolved, basic when there is no ownership record at all.
Available on v3 only. POST /v2/kyb/select/ and POST /v3/kyb/select/ keep their contract and price.Authorizations
Body
Candidate handle from POST /v3/kyb/search/ (kyb_registry.companies[].kyb_response_id). Ephemeral — use it shortly after the search that produced it.
255"69aeeb95febb0f1704042259"
Your identifier for this company; echoed back and stored with the business session.
Free-form JSON stored with the business session and echoed back.
Must be true (the default). KYB registry selects are always persisted so billing and retrieval can be tracked; false returns 400.
Response
Company retrieved and billed. kyb_registry carries the full profile; check data_resolved — when false the registry was still processing and the stored record completes automatically once it resolves.
Id of the business session created for this retrieval. The stored record (visible in the console) keeps updating if the registry resolves after the response.
The tier this endpoint sells: basic (Lite) for select, shareholders, ubo.
basic, shareholders, ubo The tier actually delivered and billed. Lower than requested when the country's registries hold no ownership data, or the registry has no ownership record for this company.
basic, shareholders, ubo Full registry company profile.
Show child attributes
Show child attributes
Echo of the vendor_data you sent.
Echo of the metadata you sent.