UBO Verify automates the analysis of corporate ownership structures, retrieving Enhanced Profiles across jurisdictions and calculating beneficial ownership at each layer of the tree. What would take analysts hours to piece together manually is resolved in minutes.Documentation Index
Fetch the complete documentation index at: https://developer.kyckr.com/llms.txt
Use this file to discover all available pages before exploring further.
How it works
UBO Verify works by iteratively retrieving Enhanced Profiles for each entity in the ownership structure of the root company, tracing shareholders layer by layer until it reaches individuals or terminates for a documented reason. The process follows three steps:Search for the root company
Use Company Search to locate the entity and obtain its
codeField and jurisdiction ISO. If the search response includes a registrationAuthorityCodeField, note this value — it is required when ordering the UBO report for certain jurisdictions (e.g. Germany, Canada).Request an ownership tree
Submit the root company’s code, country ISO, and your cost parameters. Kyckr will begin retrieving Enhanced Profiles for each shareholder layer and return an
orderIdField for polling.Request an ownership tree
Parameters
| Parameter | Type | Required | Description |
|---|---|---|---|
CompanyCode | path | Yes | The codeField of the root entity, obtained from Company Search |
CountryIso | path | Yes | Two-letter ISO country code for the root entity’s jurisdiction |
regAuth | query | Conditional | Required when the search returns a registrationAuthorityCodeField (e.g. for DE, CA) |
maxCreditCost | query | Yes | Maximum credits to spend on this request. Must be a positive integer |
uboThreshold | query | No | Ownership percentage required to qualify as a UBO. Defaults to 25. Accepts 1–100 |
maxLayers | query | No | Maximum ownership layers to unwrap. Minimum value: 3 |
continuationKeys | query | No | One or more continuation keys to resolve previously ambiguous entity matches |
Response
orderIdField to retrieve results.
Retrieve the ownership tree
Poll the list endpoint with theorderIdField until statusField is no longer IN_PROGRESS.
Processing time depends on the depth and complexity of the ownership structure. Shallow trees with a small number of corporate shareholders complete quickly; deep, multi-jurisdiction structures take longer as each layer requires a live Enhanced Profile retrieval.
Ownership tree status values
| Status | Description |
|---|---|
IN_PROGRESS | Analysis is running. Continue polling |
SUCCESS | Ownership tree completed |
COMPANY_NOT_FOUND | The root company could not be located |
NO_SHAREHOLDERS | The root company has no shareholder data available |
REGISTRY_NOT_AVAILABLE | The relevant registry was unavailable at the time of the request |
INSUFFICIENT_CREDITS | Insufficient credits to retrieve the root company’s Enhanced Profile |
INSUFFICIENT_MAX_CREDIT_COST | The maxCreditCost was reached before the root profile could be retrieved |
INSUFFICIENT_MAX_LAYERS | The configured layer limit was reached |
ORDER_NOT_FOUND | The specified order ID does not exist |
SERVICE_UNAVAILABLE | UBO Verify is temporarily unavailable |
Understanding the response
A completed ownership tree response contains several distinct sections. The following example illustrates the key fields:Nodes
ThenodesField array contains every entity in the ownership tree. Each node represents either a company or a person, with edges describing the shareholding relationship to the node below it.
| Field | Description |
|---|---|
levelField | Depth in the ownership tree. Level 1 is the root company |
entityField.idField | Unique node identifier, consistent across polling requests |
entityField.typeField | COMPANY, PERSON, or OTHER |
entityField.nameField | Entity name |
entityField.countryISOField | Jurisdiction of the entity |
entityField.companyCodeField | Company registration number (companies only) |
entityField.addressField | Registered address, when available from Enhanced Profile data |
edgesField | Shareholding relationships connecting this node to its parent |
Edges
Each edge records the shareholding relationship between a parent entity and a child shareholder.| Field | Description |
|---|---|
nodeIdField | The ID of the shareholder node |
typeField | Always SHAREHOLDER |
percentageField | Percentage ownership held at this edge |
nameField | Shareholder name as recorded in the parent company’s declarations |
addressField | Shareholder address as recorded in the parent company’s declarations |
isCircularField | true if circular ownership is detected |
shareholdingsField | Breakdown of individual shareholding entries, including jointly held shares |
Jointly held shares
In jurisdictions such as Australia and New Zealand, shares may be held jointly. TheshareholdingsField on an edge captures this:
jointHoldingGroupIdField belong to the same jointly held block.
Analysis insights
TheuboAnalysisField provides a structured assessment of your UBO discovery, including coverage metrics, recommended next steps, and detection of potential consolidated ownership.
Analysis status
ThestatusField in uboAnalysisField tells you immediately whether the investigation is complete and, if not, what is preventing it.
| Status | Meaning |
|---|---|
COMPLETE_UBO_IDENTIFIED | All UBOs above the threshold have been identified |
COMPLETE_BELOW_THRESHOLD | Analysis is complete, but no entities reached the UBO threshold |
INCOMPLETE_REQUIRED_PROFILES | Additional Enhanced Profiles need to be purchased to continue |
INCOMPLETE_NO_SHAREHOLDERS | The root company has no shareholder data available |
INCOMPLETE_BLOCKING_RFNC | One or more nodes have reasons for non-continuation that require action |
INCOMPLETE_CIRCULAR_OWNERSHIP | A circular ownership structure has been detected |
INDETERMINATE_CORRUPT_DATA | Shareholder data from the registry is corrupt |
INDETERMINATE_INSUFFICIENT_DATA | Shareholding coverage is below the required threshold for conclusive analysis |
PLC_NO_SHAREHOLDERS_EXPECTED | The root entity is a public company; absence of shareholder data is expected |
UNKNOWN | Fallback value — should not occur in practice |
statusField indicates an incomplete analysis, blockingReasonField provides additional context explaining specifically what is preventing completion.
Coverage metrics
ThemetricsField quantifies how complete your analysis is:
| Metric | Description |
|---|---|
uboCoverageField | Percentage of root company ownership traced to identified UBOs |
shareholdingCoverageField | Percentage of the ownership tree that has been explored. For a conclusive analysis, this should exceed 100 - uboThreshold |
unpurchasedTotalField | Percentage of ownership held by entities for which no Enhanced Profile has been purchased |
- If
shareholdingCoverageFieldis 100% butuboCoverageFieldis low, the entire tree has been explored but many branches end at companies without Enhanced Profiles. UserequiredProfilesFieldto identify which profiles to purchase next. - If
unpurchasedTotalFieldis high, there is a clear gap to close. Each profile purchase reduces this value and is likely to improveuboCoverageField.
Required profile recommendations
When further investigation is possible,requiredProfilesField provides a ranked list of the entities whose Enhanced Profiles would have the greatest impact on your UBO coverage:
entityIdField to locate the node in nodesField and the companyCodeField to retrieve its Enhanced Profile directly if needed.
Potential beneficial owners
ThepotentialBeneficialOwnersField surfaces cases where the same individual may appear under multiple name variations across different shareholder declarations. Where combined ownership across those variations exceeds the UBO threshold, the system flags this for review.
| Field | Description |
|---|---|
canonicalNameField | Representative name chosen for the group |
totalOwnershipField | Combined ownership percentage across all group members |
isFuzzyGroupField | true if members were grouped by name similarity; false if exact name matches |
membersField | Individual entries contributing to the group |
Entity resolution
UBO Verify matches company names from shareholder declarations against registered entities globally. Version 2 introduces a stricter resolution algorithm that requires address-based or jurisdiction-specific confirmation before automatically selecting a company match. This means you may encounter more situations requiring manual input — but each resolution will be a high-confidence, verifiable match rather than a potentially incorrect automatic one.Automatic resolution
When the algorithm can confidently identify a unique matching entity, it resolves the node automatically. This is indicated in the node’sentitySelectionMetadataField:
Ambiguous matches and continuation keys
When the algorithm cannot resolve a match with sufficient confidence — for example, when multiple companies share the same name in the same jurisdiction — it returns aCOMPANY_NOT_FOUND reason for non-continuation and provides candidate options:
continuationKeyField of the correct entity in a new create request:
USER_SELECTED:
Only one candidate can be selected per ambiguous node. If you later determine the selection was incorrect, you will need to submit a new create request with a different continuation key.
Audit trail
Every ownership tree maintains a complete record of how it was built and how it has evolved through continuations.Continuation selection history
TheselectedCandidatesField documents every manual disambiguation decision made during the investigation:
Version history
ThepreviousVersionsField records the chain of order IDs that preceded the current tree:
Reasons for non-continuation
When the ownership tree algorithm cannot continue down a branch, it returns areasonForNonContinuationField on the relevant node. Any layers already discovered are always returned.
| Type | Description | Recommended action |
|---|---|---|
COMPANY_NOT_FOUND | The entity could not be uniquely resolved. May include candidates if partial matches were found | Review candidatesField and continue using the appropriate continuation key |
INSUFFICIENT_MAX_CREDIT_COST | The maxCreditCost limit was reached before this node could be retrieved | Resubmit with a higher maxCreditCost. Previously purchased profiles within the 24-hour window are reused |
REGISTRY_NOT_AVAILABLE | The registry was temporarily unavailable | Retry after a short delay. If the issue persists, contact support |
NO_SHAREHOLDERS | The Enhanced Profile for this entity contains no shareholder data | Manual research required. The registry may not publish shareholding information for this entity |
INSUFFICIENT_CREDITS | The account has insufficient credits | Contact your account manager |
DESERIALIZATION_ERROR_ENHANCED_PROFILE | A technical error occurred processing the Enhanced Profile response | Retry. If the error persists, contact support with the order ID |
SERVER_ERROR | The Enhanced Profile API returned an HTTP 500 error | Retry after a short delay |
UNSUPPORTED_JURISDICTION | The entity’s jurisdiction is not supported by UBO Verify | Manual research required. See Supported jurisdictions |
INSUFFICIENT_MAX_LAYERS | The configured maxLayers depth was reached | Increase maxLayers if deeper analysis is required |
SHAREHOLDING_TOO_LOW | A shareholder has a recorded ownership percentage of exactly 0% | Review whether this is a data quality issue. This branch cannot be automatically continued |
INVALID_REGAUTH | The regAuth parameter provided is invalid | Verify that the regAuth value matches the registrationAuthorityCodeField returned by search |
POSSIBLE_PLC | The company name format suggests a publicly listed company | Verify whether the entity is publicly traded. PLCs are typically excluded from UBO analysis requirements |
Cached Enhanced Profiles
Enhanced Profiles purchased as part of a UBO Verify request are cached for 24 hours. If you resubmit a request — for example, with a highermaxCreditCost or an additional continuation key — profiles retrieved within that window are reused, avoiding duplicate purchases.
After 24 hours, all underlying profiles are refreshed to ensure reporting accuracy.
Response codes
Create endpoint
| Code | Message | Description |
|---|---|---|
| 201 | SUCCESS | Ownership tree request accepted |
| 403 | You have insufficient permissions to access UBO Verify | UBO Verify is not enabled on your account |
| 404 | Resource not found | Missing ISO or company code |
| 107 | MaxCreditCost is required | The maxCreditCost parameter was not provided |
| 107 | Invalid jurisdiction | The CountryIso provided is not valid |
| 105 | Company not found | The CompanyCode provided could not be found or is not in the correct format |
| 107 | MaxCreditCost must be an integer greater than 0 | Invalid maxCreditCost value |
| 107 | UboThreshold must be a whole number between 0 - 100 | Invalid uboThreshold value |
List endpoint
| Code | Message | Description |
|---|---|---|
| 200 | — | Successful retrieval (covers in-progress and completed states) |
| 403 | Service unavailable | UBO Verify is temporarily unavailable |
| 403 | Order not found | The UBO Verify feature is not enabled, or the order ID is invalid |
Company Search
Find the root entity and retrieve its
codeField before requesting an ownership treeEnhanced Profile
Retrieve full company profiles including representatives and shareholders
UBO Verify API Reference
Full request and response schema for the UBO Verify endpoints
UBO Verify Release Note
Summary of all changes introduced in v2