IDN KYB Comprehensive
curl --request POST \
--url https://{environment-subdomain}.idmetagroup.com/api/v3/verifications/kyb/idn/comprehensive \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"companyName": "<string>",
"country": "<string>",
"registrationNumber": "<string>",
"trustFlowId": 0,
"trustValidationId": "{your_trust_validation_id}"
}
'import requests
url = "https://{environment-subdomain}.idmetagroup.com/api/v3/verifications/kyb/idn/comprehensive"
payload = {
"companyName": "<string>",
"country": "<string>",
"registrationNumber": "<string>",
"trustFlowId": 0,
"trustValidationId": "{your_trust_validation_id}"
}
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({
companyName: '<string>',
country: '<string>',
registrationNumber: '<string>',
trustFlowId: 0,
trustValidationId: '{your_trust_validation_id}'
})
};
fetch('https://{environment-subdomain}.idmetagroup.com/api/v3/verifications/kyb/idn/comprehensive', 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://{environment-subdomain}.idmetagroup.com/api/v3/verifications/kyb/idn/comprehensive",
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([
'companyName' => '<string>',
'country' => '<string>',
'registrationNumber' => '<string>',
'trustFlowId' => 0,
'trustValidationId' => '{your_trust_validation_id}'
]),
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>",
"Content-Type: application/json"
],
]);
$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://{environment-subdomain}.idmetagroup.com/api/v3/verifications/kyb/idn/comprehensive"
payload := strings.NewReader("{\n \"companyName\": \"<string>\",\n \"country\": \"<string>\",\n \"registrationNumber\": \"<string>\",\n \"trustFlowId\": 0,\n \"trustValidationId\": \"{your_trust_validation_id}\"\n}")
req, _ := http.NewRequest("POST", url, payload)
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://{environment-subdomain}.idmetagroup.com/api/v3/verifications/kyb/idn/comprehensive")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"companyName\": \"<string>\",\n \"country\": \"<string>\",\n \"registrationNumber\": \"<string>\",\n \"trustFlowId\": 0,\n \"trustValidationId\": \"{your_trust_validation_id}\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://{environment-subdomain}.idmetagroup.com/api/v3/verifications/kyb/idn/comprehensive")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Authorization"] = 'Bearer <token>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"companyName\": \"<string>\",\n \"country\": \"<string>\",\n \"registrationNumber\": \"<string>\",\n \"trustFlowId\": 0,\n \"trustValidationId\": \"{your_trust_validation_id}\"\n}"
response = http.request(request)
puts response.read_body{
"success": true,
"message": "IDN KYB Comprehensive Request Received",
"data": {
"companyFound": true
},
"verificationStatus": "IN_PROGRESS",
"verificationStatusCode": 5,
"trustFlowId": 189,
"trustValidationId": "{your_trust_validation_id}",
"metadata": null,
"createdAt": "2026-06-05 06:31:31+0000"
}Indonesia
IDN KYB Comprehensive
Comprehensive Know Your Business verification for Indonesian companies. Two-step asynchronous flow.
POST
/
api
/
v3
/
verifications
/
kyb
/
idn
/
comprehensive
IDN KYB Comprehensive
curl --request POST \
--url https://{environment-subdomain}.idmetagroup.com/api/v3/verifications/kyb/idn/comprehensive \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"companyName": "<string>",
"country": "<string>",
"registrationNumber": "<string>",
"trustFlowId": 0,
"trustValidationId": "{your_trust_validation_id}"
}
'import requests
url = "https://{environment-subdomain}.idmetagroup.com/api/v3/verifications/kyb/idn/comprehensive"
payload = {
"companyName": "<string>",
"country": "<string>",
"registrationNumber": "<string>",
"trustFlowId": 0,
"trustValidationId": "{your_trust_validation_id}"
}
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({
companyName: '<string>',
country: '<string>',
registrationNumber: '<string>',
trustFlowId: 0,
trustValidationId: '{your_trust_validation_id}'
})
};
fetch('https://{environment-subdomain}.idmetagroup.com/api/v3/verifications/kyb/idn/comprehensive', 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://{environment-subdomain}.idmetagroup.com/api/v3/verifications/kyb/idn/comprehensive",
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([
'companyName' => '<string>',
'country' => '<string>',
'registrationNumber' => '<string>',
'trustFlowId' => 0,
'trustValidationId' => '{your_trust_validation_id}'
]),
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>",
"Content-Type: application/json"
],
]);
$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://{environment-subdomain}.idmetagroup.com/api/v3/verifications/kyb/idn/comprehensive"
payload := strings.NewReader("{\n \"companyName\": \"<string>\",\n \"country\": \"<string>\",\n \"registrationNumber\": \"<string>\",\n \"trustFlowId\": 0,\n \"trustValidationId\": \"{your_trust_validation_id}\"\n}")
req, _ := http.NewRequest("POST", url, payload)
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://{environment-subdomain}.idmetagroup.com/api/v3/verifications/kyb/idn/comprehensive")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"companyName\": \"<string>\",\n \"country\": \"<string>\",\n \"registrationNumber\": \"<string>\",\n \"trustFlowId\": 0,\n \"trustValidationId\": \"{your_trust_validation_id}\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://{environment-subdomain}.idmetagroup.com/api/v3/verifications/kyb/idn/comprehensive")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Authorization"] = 'Bearer <token>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"companyName\": \"<string>\",\n \"country\": \"<string>\",\n \"registrationNumber\": \"<string>\",\n \"trustFlowId\": 0,\n \"trustValidationId\": \"{your_trust_validation_id}\"\n}"
response = http.request(request)
puts response.read_body{
"success": true,
"message": "IDN KYB Comprehensive Request Received",
"data": {
"companyFound": true
},
"verificationStatus": "IN_PROGRESS",
"verificationStatusCode": 5,
"trustFlowId": 189,
"trustValidationId": "{your_trust_validation_id}",
"metadata": null,
"createdAt": "2026-06-05 06:31:31+0000"
}Run a comprehensive Know Your Business verification on an Indonesian company by name. This verification uses a two-step asynchronous flow because the Indonesian AHU registry is slow.
The HTTP response samples for the first four cases are in the response panel.
- The initial API request searches for the company. It usually takes up to 45 seconds.
- If the company is found, the API responds with
verificationStatus: IN_PROGRESSand starts gathering the full company information. This takes up to 3 minutes. IDmeta then sends the final result to theresultNotificationURLyou supply.
verificationStatus: REJECTED. See Rejected responses.
The webhook envelope carries type: "verification.idn_kyb_comprehensive" and a verificationStatus of VERIFIED (company information returned) or REJECTED.
Data source
Company information is retrieved from Administrasi Hukum Umum (AHU).Webhook callback
When the search-and-detail flow completes, IDmeta sends a POST to yourresultNotificationURL with the payload below.
{
"type": "verification.idn_kyb_comprehensive",
"success": true,
"message": "IDN KYB Comprehensive Completed",
"data": {
"shareholders": {
"total": 2,
"data": {
"individual": [
{
"shareholderNameOG": "Example Shareholder One",
"isTranslated": false,
"shareholderNameEN": "Example Shareholder One",
"entityType": "COMPANY",
"percentageOwned": "50.00%",
"capital": "17910171500",
"currency": "IDR",
"shareholderID": null,
"shareholderLocation": null,
"shareType": null,
"numberOfShares": null,
"dob": null
},
{
"shareholderNameOG": "Example Shareholder Two",
"isTranslated": false,
"shareholderNameEN": "Example Shareholder Two",
"entityType": "COMPANY",
"percentageOwned": "50.00%",
"capital": "17712500",
"currency": "IDR",
"shareholderID": null,
"shareholderLocation": null,
"shareType": null,
"numberOfShares": null,
"dob": null
}
]
}
},
"companyInformation": {
"total": 1,
"data": [
{
"name": {
"companyName": "Example Company Indonesia",
"isTranslated": false,
"companyNameOG": null
},
"companyStatus": "TERTUTUP",
"entityType": "PMA",
"industry": [
{
"industryCode": "47919",
"industryName": "Perdagangan Eceran Melalui Media Untuk Berbagai Macam Barang Lainnya"
},
{
"industryCode": "47920",
"industryName": "Perdagangan Eceran Atas Dasar Balas Jasa (Fee) Atau Kontrak"
},
{
"industryCode": "62019",
"industryName": "Aktivitas Pemrograman Komputer Lainnya"
},
{
"industryCode": "66413",
"industryName": "Penyelenggara Penunjang Sistem Pembayaran"
},
{
"industryCode": "77322",
"industryName": "Aktivitas Penyewaan dan Sewa Guna Tanpa Hak Opsi Alat Alat Bantu Teknologi Digital"
}
],
"regAddress": {
"full": "Example Commercial Area, Jl. Contoh Raya RT: 000 RW: 000, Jakarta Selatan"
},
"capital": [
{
"capitalAmount": "17927884000",
"currency": "IDR",
"numberOfShares": "25304",
"paidUpCapital": "17927884000"
}
],
"companyIDOther1": null,
"companyID": null,
"incorpDate": null
}
]
},
"majorPerson": {
"total": 5,
"data": [
{
"enName": "Example Person One",
"ogName": "Example Person One",
"isTranslated": false,
"role": "DIREKTUR",
"address": null,
"identity": null
},
{
"enName": "Example Person Two",
"ogName": "Example Person Two",
"isTranslated": false,
"role": "KOMISARIS",
"address": "Jl. Contoh Raya No. 1, Jakarta Selatan",
"identity": null
}
]
}
},
"verificationStatus": "VERIFIED",
"verificationStatusCode": 3,
"trustFlowId": 189,
"trustValidationId": "{your_trust_validation_id}",
"metadata": null
}
Rejected responses
Every rejected response hasverificationStatus: "REJECTED" and verificationStatusCode: 1. The HTTP status is 200. success is true even when the verification is rejected, so check verificationStatus for the verdict, not success. The only exception is a rejection after the request is received, which has success: false.
| Case | When it happens | How you receive it | Billed |
|---|---|---|---|
| Company not found | The search ran but found no matching Indonesian company. data.companyFound is false. | HTTP response and trust flow webhook | Yes |
| Company search failed | The search service could not be reached or returned an error. data.companyFound is null. | HTTP response and trust flow webhook | No |
| Company lookup not started | The company was found, but the full company lookup could not be started. data.companyFound is null. | HTTP response and trust flow webhook | No |
| Data source error | The company was found, but the data source returned an error. data.companyFound is null. | HTTP response and trust flow webhook | No |
| Rejected after the request is received | The API responded with IN_PROGRESS, but the full company lookup later failed. | Trust flow webhook and resultNotificationURL | Yes. The credit charged for the IN_PROGRESS response is not refunded. |
Error messages
Whendata.companyFound is null, data.error explains why the request failed.
| Case | Possible data.error values |
|---|---|
| Company search failed | Unable to connect to search serviceData source under maintenance. Please try again later.Company search failed, or the data source’s own error messageInternal server error |
| Company lookup not started | Unable to connect to verification serviceData source under maintenance. Please try again later.KYB request failed, or the data source’s own error messageInternal server error |
| Data source error | The data source’s error message, for example Data Source Error. If the data source sends no message, the value is Data source error. |
Webhook for immediate rejections
IDmeta also sends the first four cases to your trust flow’s webhook URL. The payload matches the HTTP response, withtype added and verificationType removed.
{
"type": "verification.idn_kyb_comprehensive",
"success": true,
"message": "IDN KYB Comprehensive Request Completed",
"data": {
"companyFound": false
},
"verificationStatus": "REJECTED",
"verificationStatusCode": 1,
"trustFlowId": 189,
"trustValidationId": "{your_trust_validation_id}",
"metadata": null,
"createdAt": "2026-10-29 08:15:42+0000"
}
Rejected after the request is received
If the API already responded withIN_PROGRESS and the full company lookup then fails, IDmeta sends a rejected webhook to your trust flow’s webhook URL and to your resultNotificationURL.
successisfalse.messageis the data source’s error message. If the data source sends no message,messageisKYB verification could not be completed.datacontains the data source’s error details, with key names in camelCase.- The payload has no
createdAt.
{
"type": "verification.idn_kyb_comprehensive",
"success": false,
"message": "Data Source Error",
"data": {
"errorCode": "100209"
},
"verificationStatus": "REJECTED",
"verificationStatusCode": 1,
"trustFlowId": 189,
"trustValidationId": "{your_trust_validation_id}",
"metadata": null
}
Authorizations
Use Bearer {your_api_token} in the Authorization header.
Body
application/json
Name of the company to be verified.
Country where the company is registered.
Official company registration number.
Trust flow identifier used to categorize or group requests for tracking or reporting.
Trust validation identifier for the verification request.
Response
200 - application/json
Verification accepted (async). Final result is delivered via webhook.

