Beneficial Ownership Investigation
Beneficial ownership investigation that traces the true controllers of any corporate entity using 6 advanced algorithms across 15 international data sources. Built for KYC/AML compliance teams, anti-corruption investigators, and financial crime analysts who need to cut through layered corporate structures to identify the natural persons who ultimately own or control a legal entity.
Maintenance Pulse
90/100Cost Estimate
How many results do you need?
Pricing
Pay Per Event model. You only pay for what you use.
| Event | Description | Price |
|---|---|---|
| analysis-run | Full intelligence analysis run | $0.80 |
Example: 100 events = $80.00 Β· 1,000 events = $800.00
Documentation
Beneficial ownership investigation that traces the true controllers of any corporate entity using 6 advanced algorithms across 15 international data sources. Built for KYC/AML compliance teams, anti-corruption investigators, and financial crime analysts who need to cut through layered corporate structures to identify the natural persons who ultimately own or control a legal entity.
The actor runs four sequential investigation phases: corporate registry collection from OpenCorporates (140+ jurisdictions), GLEIF, and jurisdiction-specific registries; director screening against INTERPOL, FBI, OFAC, and OpenSanctions; geocoded address clustering for shell company detection; and a composite scoring engine that applies six distinct algorithms to produce a graded opacity score with actionable findings. All phases run with parallel actor execution for speed.
What data can you extract?
| Data Point | Source | Example |
|---|---|---|
| π Overall opacity score | 6-algorithm composite | 0.72 (0.0β1.0 scale) |
| π·οΈ Risk grade | Computed from opacity | HIGH β Significant opacity detected |
| πΈοΈ Ownership graph nodes | Corporate registries | 14 entities, max depth 5 |
| π Ownership edges | GLEIF + OpenCorporates | 18 edges, circular detected |
| π€ Nominee directors found | OpenCorporates records | 3 nominee directors |
| π’ Formation agents detected | Pattern matching | 2 formation agents (Trident Corp Services) |
| π Secrecy jurisdiction hops | BVI, Cayman, Panama, 22 others | 4 hops through PA, VG, KY |
| β οΈ Sanctions/watchlist matches | OFAC, OpenSanctions, INTERPOL, FBI | 2 matches, severity: HIGH |
| π Registration bursts | Kleinberg automaton | 1 burst, level 3, 6 entities, 2019-03 |
| π Address co-location clusters | DBSCAN on geocoded data | 3 clusters, 11 entities sharing addresses |
| π Inferred beneficial owner | Bayesian inference | Jan Marsalek, 73.4% confidence |
| π Actionable recommendations | Rule-based engine | File SAR, request UBO declarations |
Why use Beneficial Ownership Investigation?
Manual beneficial ownership tracing for a complex corporate structure takes a compliance analyst 8β40 hours per entity: searching multiple registries, cross-referencing sanctions lists, geocoding registered addresses, and reasoning about probabilistic ownership. A single analyst hour costs $50β150. For high-risk counterparty reviews or regulatory submissions, this adds up fast.
Automated tools exist, but most provide only a corporate tree diagram with no risk scoring, no sanctions matching, and no statistical analysis of shell company patterns. This actor automates the full enhanced due diligence workflow β registry collection, person screening, geocoded clustering, and Bayesian inference β and outputs structured, machine-readable findings your compliance system can act on directly.
- Scheduling β run quarterly or triggered-by-event re-screens to keep beneficial ownership data current with registry changes
- API access β trigger investigations from your compliance workflow in Python, JavaScript, or any HTTP client without manual steps
- Proxy rotation β registry and watchlist queries route through Apify's proxy infrastructure to avoid rate limiting at scale
- Monitoring β receive Slack or email alerts when a run flags new CRITICAL or HIGH findings on a re-screened entity
- Integrations β connect to Zapier, Make, Google Sheets, or your CRM to push findings into existing compliance workflows
Features
- Recursive Ownership Unfolding (BFS with adversarial pruning) β traverses the ownership graph from the target entity outward, tracking depth, ownership percentages (stored as edge weights), and jurisdictional hops. Detects circular ownership structures and applies adversarial pruning to avoid infinite loops in deliberately obfuscated chains.
- Cross-Lingual Transliteration Matching (5-stage phonetic pipeline) β applies Unicode normalization, Double Metaphone, Caverphone, Jaro-Winkler similarity, and token set ratio in sequence. Detects when sanctioned persons or entities appear under variant spellings across Latin, Cyrillic, Arabic, and CJK scripts β the most common sanctions evasion technique.
- Temporal Registration Burst Detection (Kleinberg automaton) β models entity registration timestamps as a bursty event stream and fits a Kleinberg infinite-state automaton to identify periods of anomalously high registration frequency. Bursts, their level, duration, and the entities involved are all reported separately from the overall score.
- Address Co-Location Clustering (DBSCAN) β geocodes up to 15 registered addresses per investigation using the Nominatim actor and applies DBSCAN density-based clustering. Multiple entities sharing the same registered address is a primary shell company indicator; each cluster receives a suspicion score weighted by jurisdictional risk.
- Infrastructure Fingerprint Correlation (Weisfeiler-Lehman graph kernel) β compares shared digital infrastructure (domains, IP addresses, nameservers, TLS certificate issuers) across entities in the ownership network. The Weisfeiler-Lehman graph kernel measures structural similarity between infrastructure graphs to detect hidden connections not visible in registry data.
- Bayesian Beneficial Ownership Inference (loopy belief propagation) β combines six evidence channels (ownership registration, officer overlap, address co-location, infrastructure sharing, sanctions co-occurrence, temporal co-registration) into a factor graph and runs loopy belief propagation to compute posterior ownership probabilities for each identified person. Reports convergence status and iteration count.
- 22-jurisdiction secrecy scoring β tracks ownership hops through all 22 known secrecy jurisdictions (Panama, British Virgin Islands, Cayman Islands, Seychelles, Vanuatu, Marshall Islands, Liechtenstein, Monaco, and others) and applies a per-hop penalty to the opacity score.
- Formation agent pattern detection β matches officer and company names against 18 known patterns including "nominee", "registered agent", "corporate services", "fiduciary", "offshore", and named formation agents (Mossack Fonseca, Asiaciti, Trident, Portcullis).
- Director screening across 4 watchlists β screens up to 5 identified directors and officers against INTERPOL Red Notices, FBI Most Wanted, OFAC SDN List, and OpenSanctions simultaneously.
- Parallel actor execution β Phase 1 registry calls and Phase 2 person screening calls run in parallel via
Promise.all, cutting investigation time to under 5 minutes for most entities. - Weighted composite opacity score β the six algorithm scores combine with fixed weights (ownership 25%, Bayesian 20%, transliteration 15%, co-location 15%, infrastructure 15%, burst 10%) into a single 0.0β1.0 opacity value, graded CRITICAL / HIGH / ELEVATED / MODERATE / LOW.
- Tiered recommendations β findings automatically trigger one of four recommendation tiers: annual re-screen (LOW), quarterly re-screen (MODERATE), enhanced monitoring + UBO declarations (HIGH), or SAR referral + forensic investigation (CRITICAL).
Use cases for beneficial ownership investigation
KYC/AML onboarding due diligence
Compliance teams at banks, fintechs, and payment processors must verify the beneficial owners of every new corporate client before onboarding. Manual registry searches across multiple jurisdictions take days and frequently miss nominee structures. This actor runs a full enhanced due diligence workflow in minutes, outputting a risk grade and ownership graph that feeds directly into the compliance decision.
Anti-corruption and financial crime investigation
Anti-corruption units and financial intelligence units need to trace ownership chains through secrecy jurisdictions to identify the natural persons behind suspected shell networks. The actor detects nominee directors, formation agents, and circular ownership β the three primary mechanisms used to conceal beneficial ownership β and scores each finding by severity for prioritized investigation.
Regulatory examination and supervisory review
Bank examiners and regulatory supervisors reviewing a financial institution's corporate client portfolio need to assess beneficial ownership risk at scale. The actor's structured JSON output integrates with compliance case management systems and provides the documentation trail regulators require to demonstrate adequate due diligence.
Asset tracing and litigation support
Law firms conducting asset tracing in fraud, divorce, or insolvency proceedings need to map corporate networks and identify controllers who may be hiding assets in nominee-held entities. The ownership graph, address clusters, and Bayesian inference output give litigators a starting map for further investigation and subpoena targeting.
Correspondent banking and de-risking decisions
Correspondent banks deciding whether to maintain or terminate banking relationships with foreign financial institutions need to assess the beneficial ownership opacity of their counterparty's client base. Periodic automated re-screening surfaces new risk indicators between manual review cycles.
Sanctions compliance and watchlist monitoring
Compliance officers responsible for ongoing sanctions monitoring need to detect when known or suspected sanctioned individuals gain ownership or control of previously clean entities. The cross-lingual transliteration matching catches name variants across scripts that standard exact-match screening misses.
How to investigate beneficial ownership
- Enter the entity name β type the exact legal name of the company to investigate, such as "Meridian Capital Holdings Ltd" or "Trident Global Services BV". The search is not case-sensitive and partial matches will be included.
- Set a jurisdiction (optional) β enter a two-letter ISO country code such as "GB", "KY", or "PA" to focus the search on a specific registry. Leave this field blank to query all supported registries globally.
- Run the investigation β click "Start" and wait approximately 3β8 minutes for the full 6-phase analysis to complete. Entities with large corporate networks or many directors will take longer.
- Download the report β click the Dataset tab to view results in the Apify console, or export as JSON, CSV, or Excel for your compliance system.
Input parameters
| Parameter | Type | Required | Default | Description |
|---|---|---|---|---|
entityName | string | Yes | β | Legal name of the corporate entity to investigate. Partial matches are included. Example: "Wirecard AG" |
jurisdiction | string | No | (all) | ISO 3166-1 alpha-2 country code to focus on a specific national registry. Supported: GB, UK, CA, AU, NZ, and all OpenCorporates jurisdictions. Leave blank for global search. |
includeDirectors | boolean | No | true | When true, screens all identified directors and officers against INTERPOL, FBI, OFAC, and OpenSanctions. Disable to speed up runs when director screening is not required. |
Input examples
Standard investigation (global search with director screening):
{
"entityName": "Meridian Capital Holdings",
"includeDirectors": true
}
Jurisdiction-focused investigation:
{
"entityName": "Trident Global Services",
"jurisdiction": "KY",
"includeDirectors": true
}
Fast registry-only scan (no director screening):
{
"entityName": "Apex Innovations Ltd",
"jurisdiction": "GB",
"includeDirectors": false
}
Input tips
- Use the full legal name β include "Ltd", "GmbH", "BV", or "LLC" when known. The search is tolerant of partial matches, but a precise name reduces false-positive records in the ownership graph.
- Leave jurisdiction blank for offshore entities β if the entity might be registered in Panama, BVI, or Cayman Islands, a blank jurisdiction searches OpenCorporates' 140+ jurisdictions rather than a single registry.
- Disable director screening for bulk runs β setting
includeDirectors: falsecuts run time by 30β60% when you only need the ownership graph and registry findings. - Run quarterly for high-risk counterparties β corporate structures change. Schedule periodic re-runs on CRITICAL and HIGH-graded entities to catch new nominees or registration events.
Output example
{
"entity": "Meridian Capital Holdings Ltd",
"jurisdiction": "global",
"investigationDate": "2026-03-20T09:14:37.000Z",
"overallRiskScore": 0.7143,
"riskGrade": "HIGH β Significant opacity detected",
"findings": [
"CRITICAL: Circular ownership structure detected β potential concealment of beneficial ownership",
"WARNING: 3 nominee director(s) detected in ownership chain",
"ELEVATED: 4 hop(s) through secrecy jurisdictions",
"ELEVATED: 1 temporal registration burst(s) detected β possible coordinated shell creation",
"WARNING: 2 potential watchlist match(es) via transliteration matching",
"WARNING: 2 address co-location cluster(s) β 9 entities sharing locations",
"Inferred beneficial owner: Viktor Serov (confidence: 71.4%)"
],
"recommendations": [
"Enhanced monitoring required β significant opacity detected",
"Verify beneficial ownership through independent sources",
"Request certified UBO declarations from all identified controllers"
],
"ownershipAnalysis": {
"graph": {
"nodes": [
{
"id": "OC-00847291",
"name": "Meridian Capital Holdings Ltd",
"jurisdiction": "KY",
"depth": 0,
"opacityScore": 0.61,
"isNominee": false,
"isFormationAgent": false,
"registrationDate": "2018-04-12",
"address": "Harbour Place, 2nd Floor, 103 South Church Street, Grand Cayman",
"officers": ["Viktor Serov", "Trident Corporate Services Ltd"]
}
],
"edges": [
{ "source": "OC-00847291", "target": "OC-01922443", "ownershipPct": 100, "hopPenalty": 0.4 }
],
"maxDepth": 5,
"totalOpacity": 3.82,
"circularOwnershipDetected": true,
"nomineeCount": 3,
"formationAgentCount": 2,
"secrecyJurisdictionHops": 4
},
"summary": {
"totalNodes": 14,
"totalEdges": 18,
"maxDepthReached": 5,
"circularOwnership": true,
"nominees": 3,
"formationAgents": 2,
"secrecyHops": 4,
"totalOpacity": 3.82
}
},
"sanctionsScreening": {
"result": {
"matches": [
{
"entityName": "Viktor Serov",
"watchlistName": "Viktor Sergeyev",
"stage": "double_metaphone",
"similarity": 0.87,
"phoneticBonus": 0.09,
"finalScore": 0.96,
"source": "opensanctions"
}
],
"totalScreened": 8,
"totalMatches": 2,
"pipelineStats": [
{ "stage": "unicode_normalization", "matchesFound": 0 },
{ "stage": "double_metaphone", "matchesFound": 2 },
{ "stage": "caverphone", "matchesFound": 0 },
{ "stage": "jaro_winkler", "matchesFound": 0 },
{ "stage": "token_set_ratio", "matchesFound": 0 }
]
},
"severity": "CRITICAL",
"personsScreened": 8
},
"registrationBursts": {
"result": {
"bursts": [
{
"startDate": "2019-03-01",
"endDate": "2019-03-29",
"burstLevel": 3,
"entityCount": 6,
"entities": ["Meridian Capital Holdings Ltd", "Tidal Wave Holdings BV", "Coastal Ridge Investments Ltd"],
"jurisdiction": "KY",
"burstScore": 2.14,
"periodicity": null
}
],
"stateSequence": [0, 0, 1, 3, 3, 2, 0],
"totalRegistrations": 14,
"maxBurstLevel": 3
},
"summary": {
"totalRegistrations": 14,
"burstsDetected": 1,
"maxBurstLevel": 3
}
},
"addressClusters": {
"summary": {
"totalAddresses": 11,
"totalGeocoded": 9,
"clustersFound": 2,
"noisePoints": 1,
"maxSuspicionScore": 7.8
}
},
"beneficialOwnership": {
"summary": {
"totalInferences": 5,
"convergenceAchieved": true,
"iterations": 12,
"topInference": {
"person": "Viktor Serov",
"entity": "Meridian Capital Holdings Ltd",
"posteriorProbability": 0.714,
"evidenceBreakdown": {
"ownershipRegistration": 0.8,
"officerOverlap": 0.85,
"addressCoLocation": 0.5,
"infrastructureSharing": 0.5,
"sanctionsCoOccurrence": 0.5,
"temporalCoRegistration": 0.5
},
"iterations": 12,
"converged": true
}
}
},
"opacityScore": {
"entity": "Meridian Capital Holdings Ltd",
"overallOpacity": 0.7143,
"ownershipDepthScore": 0.6820,
"transliterationRisk": 0.4800,
"burstAnomalyScore": 0.3500,
"coLocationScore": 0.6100,
"infraConcealmentScore": 0.2200,
"beneficialOwnerUncertainty": 0.2860,
"grade": "HIGH β Significant opacity detected"
},
"dataSources": {
"corporateRecords": 34,
"leiRecords": 2,
"watchlistEntries": 7,
"geocodedAddresses": 9,
"personsIdentified": 8
}
}
Output fields
| Field | Type | Description |
|---|---|---|
entity | string | Entity name as submitted |
jurisdiction | string | Jurisdiction searched ("global" if not specified) |
investigationDate | string | ISO 8601 timestamp of the investigation run |
overallRiskScore | number | Composite opacity score, 0.0β1.0 (higher = more opaque) |
riskGrade | string | Risk label: LOW / MODERATE / ELEVATED / HIGH / CRITICAL |
findings[] | array | Human-readable findings, each prefixed with severity (CRITICAL / WARNING / ELEVATED) |
recommendations[] | array | Tiered action items derived from opacity score threshold |
ownershipAnalysis.graph.nodes[] | array | One entry per discovered entity in the ownership graph |
ownershipAnalysis.graph.nodes[].id | string | OpenCorporates company number or GLEIF LEI |
ownershipAnalysis.graph.nodes[].name | string | Legal entity name |
ownershipAnalysis.graph.nodes[].jurisdiction | string | Registration jurisdiction ISO code |
ownershipAnalysis.graph.nodes[].depth | number | Hops from the target entity in the ownership graph |
ownershipAnalysis.graph.nodes[].opacityScore | number | Per-node opacity contribution (0.0β1.0) |
ownershipAnalysis.graph.nodes[].isNominee | boolean | True if node matched formation agent / nominee patterns |
ownershipAnalysis.graph.nodes[].officers[] | array | Director and officer names extracted from registry |
ownershipAnalysis.graph.edges[] | array | Ownership relationships between graph nodes |
ownershipAnalysis.graph.edges[].ownershipPct | number | Stated ownership percentage from registry |
ownershipAnalysis.graph.edges[].hopPenalty | number | Secrecy jurisdiction hop penalty applied to this edge |
ownershipAnalysis.summary.circularOwnership | boolean | True if circular ownership detected (concealment indicator) |
ownershipAnalysis.summary.secrecyHops | number | Total hops through the 22 tracked secrecy jurisdictions |
sanctionsScreening.result.matches[] | array | Individual watchlist match records |
sanctionsScreening.result.matches[].stage | string | Phonetic pipeline stage that produced the match |
sanctionsScreening.result.matches[].finalScore | number | Match confidence 0.0β1.0 (>0.95 = CRITICAL) |
sanctionsScreening.severity | string | CLEAR / MODERATE / HIGH / CRITICAL |
registrationBursts.result.bursts[] | array | Detected temporal registration anomalies |
registrationBursts.result.bursts[].burstLevel | number | Kleinberg automaton burst level (higher = more anomalous) |
addressClusters.summary.clustersFound | number | Number of DBSCAN clusters (address co-location groups) |
beneficialOwnership.summary.topInference | object | Highest-probability beneficial owner inference |
beneficialOwnership.summary.topInference.posteriorProbability | number | Bayesian posterior ownership probability |
beneficialOwnership.summary.convergenceAchieved | boolean | Whether loopy belief propagation converged |
opacityScore.ownershipDepthScore | number | Ownership complexity sub-score (weight: 25%) |
opacityScore.transliterationRisk | number | Sanctions phonetic match sub-score (weight: 15%) |
opacityScore.burstAnomalyScore | number | Registration burst sub-score (weight: 10%) |
opacityScore.coLocationScore | number | Address co-location sub-score (weight: 15%) |
opacityScore.infraConcealmentScore | number | Infrastructure correlation sub-score (weight: 15%) |
opacityScore.beneficialOwnerUncertainty | number | Bayesian uncertainty sub-score (weight: 20%) |
dataSources.corporateRecords | number | Total corporate registry records retrieved |
dataSources.leiRecords | number | GLEIF LEI records retrieved |
dataSources.watchlistEntries | number | Total watchlist entries matched |
dataSources.personsIdentified | number | Directors and officers identified and screened |
How much does it cost to investigate beneficial ownership?
Beneficial Ownership Investigation uses pay-per-run pricing β you pay for the Apify platform compute time consumed. Each investigation typically costs $0.40β$1.00 depending on how many entities are discovered, how many directors are screened, and how many jurisdictions are searched. The free plan provides $5 of monthly credits β enough for 5β12 investigations.
| Scenario | Investigations | Estimated cost each | Estimated total |
|---|---|---|---|
| Quick test (single entity, no directors) | 1 | ~$0.40 | ~$0.40 |
| Standard investigation (global search) | 1 | ~$0.70 | ~$0.70 |
| Small batch (10 entities) | 10 | ~$0.65 | ~$6.50 |
| Medium batch (50 entities) | 50 | ~$0.65 | ~$32.50 |
| Ongoing compliance (200 re-screens/month) | 200 | ~$0.60 | ~$120 |
You can set a maximum spending limit per run to control costs. The actor stops when your budget is reached.
Comparable manual enhanced due diligence from a specialist provider costs $150β800 per entity report. With this actor, most compliance teams spend $20β120/month for the same coverage with machine-readable output.
Beneficial ownership investigation using the API
Python
from apify_client import ApifyClient
client = ApifyClient("YOUR_API_TOKEN")
run = client.actor("ryanclinton/beneficial-ownership-investigation").call(run_input={
"entityName": "Meridian Capital Holdings Ltd",
"jurisdiction": "KY",
"includeDirectors": True
})
for item in client.dataset(run["defaultDatasetId"]).iterate_items():
print(f"Entity: {item['entity']}")
print(f"Risk grade: {item['riskGrade']}")
print(f"Opacity score: {item['overallRiskScore']:.3f}")
print(f"Top finding: {item['findings'][0] if item['findings'] else 'None'}")
top = item.get("beneficialOwnership", {}).get("summary", {}).get("topInference")
if top:
print(f"Inferred owner: {top['person']} ({top['posteriorProbability']*100:.1f}% confidence)")
JavaScript
import { ApifyClient } from "apify-client";
const client = new ApifyClient({ token: "YOUR_API_TOKEN" });
const run = await client.actor("ryanclinton/beneficial-ownership-investigation").call({
entityName: "Meridian Capital Holdings Ltd",
jurisdiction: "KY",
includeDirectors: true
});
const { items } = await client.dataset(run.defaultDatasetId).listItems();
for (const item of items) {
console.log(`Entity: ${item.entity}`);
console.log(`Risk grade: ${item.riskGrade}`);
console.log(`Opacity score: ${item.overallRiskScore.toFixed(3)}`);
const top = item.beneficialOwnership?.summary?.topInference;
if (top) {
console.log(`Inferred owner: ${top.person} (${(top.posteriorProbability * 100).toFixed(1)}% confidence)`);
}
}
cURL
# Start the investigation run
curl -X POST "https://api.apify.com/v2/acts/ryanclinton~beneficial-ownership-investigation/runs?token=YOUR_API_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"entityName": "Meridian Capital Holdings Ltd",
"jurisdiction": "KY",
"includeDirectors": true
}'
# Fetch results (replace DATASET_ID from the run response above)
curl "https://api.apify.com/v2/datasets/DATASET_ID/items?token=YOUR_API_TOKEN&format=json"
How Beneficial Ownership Investigation works
Phase 1: Corporate registry collection (parallel)
The actor assembles a set of registry calls based on the input jurisdiction. All searches run in parallel using Promise.all. OpenCorporates (covering 140+ jurisdictions) and the GLEIF LEI registry are always queried. Jurisdiction-specific registries are conditionally added: UK Companies House for GB/UK, the Canada Business Registry for CA, the Australian Business Register for AU, and the New Zealand Companies Register for NZ. OFAC and OpenSanctions are also queried in this phase to build the watchlist baseline. Up to 40 OpenCorporates results and 15 LEI records are collected per entity name.
Phase 2: Director and officer screening (parallel)
If includeDirectors is enabled, the actor extracts all officer and director names from the corporate records collected in Phase 1. Up to 5 directors are screened in parallel against INTERPOL Red Notices and FBI Most Wanted. Each person triggers two simultaneous actor calls, so up to 10 parallel watchlist queries run in this phase. Results are merged into the consolidated watchlist entry list for use in Phase 4 algorithm scoring.
Phase 3: Geocoding for address clustering
Up to 15 unique registered addresses extracted from corporate records are geocoded using the Nominatim geocoder actor. Geocoded results (latitude, longitude) become the input to the DBSCAN clustering algorithm in Phase 4. The geocoding phase runs in parallel and skips addresses shorter than 5 characters (likely incomplete data).
Phase 4: Six-algorithm scoring engine
All six algorithms run sequentially on the data collected in Phases 1β3:
Algorithm 1 (BFS Unfolding) seeds a BFS queue with matching corporate records. Each node is scored against 18 nominee/formation-agent keyword patterns. Secrecy jurisdiction hops are counted using 22 ISO codes. Circular ownership is detected by tracking visited node IDs.
Algorithm 2 (Transliteration) runs up to 25 entity and person names through the 5-stage pipeline against all watchlist entries. Stages: Unicode normalization, Double Metaphone (30+ phoneme rules), Caverphone, Jaro-Winkler, and token set ratio. Each stage reports matches independently.
Algorithm 3 (Burst Detection) extracts registration dates, bins them into monthly intervals, and fits a Kleinberg infinite-state automaton assigning burst levels 0β3 to each interval. Consecutive level-1+ intervals are reported as burst events.
Algorithm 4 (DBSCAN Clustering) applies DBSCAN with eps = 0.001 degrees (~111 meters) and minPts = 2 to geocoded coordinates. Each cluster receives a suspicion score weighted by entity count, jurisdictional risk, and diversity index.
Algorithm 5 (WL Graph Kernel) builds an infrastructure graph from domains, IPs, nameservers, and TLS certificate issuers, then applies the Weisfeiler-Lehman graph kernel to compare structural similarity. High-kernel-value pairs are grouped into suspected shell networks.
Algorithm 6 (Bayesian Inference) constructs a factor graph over persons and entities with six evidence channels. Loopy belief propagation computes posterior ownership probabilities with convergence status reported in output.
Phase 5: Composite opacity scoring and report generation
The six sub-scores combine with fixed weights into a single overallOpacity value (0.0β1.0). Threshold-based rules map findings to severity labels (CRITICAL / WARNING / ELEVATED). Recommendation tiers fire at opacity thresholds of 0.75, 0.55, and 0.35. The complete structured report is pushed to the Apify dataset.
Tips for best results
-
Use the full registered legal name. Including legal suffixes ("Ltd", "GmbH", "BV", "SA") significantly reduces false-positive records in the ownership graph. The actor uses partial matching, so "Meridian Capital" will find "Meridian Capital Holdings Ltd", but specificity improves precision.
-
Start with a global search, then narrow. Leave the jurisdiction field blank on the first run to discover all registry presences. Once you have the ownership graph, re-run with specific jurisdiction codes for entities of interest to get deeper registry detail.
-
Treat opacity scores above 0.55 as review triggers. The HIGH and CRITICAL thresholds (0.55 and 0.75) are calibrated against known shell company cases. Scores in these ranges warrant manual review even when individual findings seem ambiguous.
-
Check the
pipelineStatsarray in sanctions results. The 5-stage transliteration pipeline reports which stages produced matches. A match at thedouble_metaphonestage with afinalScoreabove 0.90 is highly reliable. A match only attoken_set_ratiowith a score below 0.80 may be a false positive. -
Combine with WHOIS Domain Lookup for infrastructure correlation. The actor's infrastructure phase is most effective when entity domains are known. Run WHOIS lookups on entity domains before or after this investigation to enrich the infrastructure fingerprint data.
-
Schedule quarterly re-runs on all HIGH and CRITICAL entities. Corporate structures change. Nominee directors are replaced, new entities are registered in burst patterns, and addresses change. Periodic re-screening detects these changes before your next manual review cycle.
-
Pipe HIGH-grade results directly into HubSpot Lead Pusher to create compliance case records automatically in your CRM for follow-up assignment.
-
For large entity portfolios, batch by jurisdiction. Searching all jurisdictions simultaneously maximizes coverage but increases run time. For known-jurisdiction entities, specifying the jurisdiction code reduces Phase 1 call volume and cuts run time by 30β50%.
Combine with other Apify actors
| Actor | How to combine |
|---|---|
| OFAC Sanctions Search | Run standalone OFAC checks before a full investigation to pre-screen low-risk entities and only trigger the full investigation for partial matches |
| OpenSanctions Search | Use as a supplementary global watchlist source for entities in jurisdictions not covered by OFAC |
| OpenCorporates Search | Query the corporate registry directly for entities where you already know the jurisdiction, then feed the company numbers into this actor |
| WHOIS Domain Lookup | Extract domain registration data for the entity and its known subsidiaries to enrich the infrastructure fingerprint phase |
| GLEIF LEI Lookup | Resolve the entity's Legal Entity Identifier before the investigation to anchor the ownership graph with authoritative LEI data |
| UK Companies House | Pull detailed PSC (Persons with Significant Control) filings for UK-registered entities to supplement the beneficial ownership inference |
| Company Deep Research | Run after a HIGH or CRITICAL finding to compile a comprehensive intelligence dossier on the entity and its identified controllers |
Limitations
- No real-time registry updates. The actor queries live APIs, but registry data latency varies by jurisdiction. Companies House typically updates within 24 hours; some registries update weekly or monthly.
- OpenCorporates coverage varies. Some jurisdictions have incomplete or historical-only data in OpenCorporates. Offshore registries (BVI, Cayman, Seychelles) have limited publicly searchable records by design.
- Infrastructure correlation requires domain data. The Weisfeiler-Lehman graph kernel phase requires known entity domains to produce meaningful correlations. In standalone mode with no domain input, the infrastructure sub-score defaults to near-zero and does not contribute meaningfully to the overall opacity score.
- Director screening is capped at 5 persons. To control run time and cost, only the first 5 identified directors are screened against law enforcement databases. Entities with large boards may have unscreened officers.
- Transliteration matching can produce false positives. Phonetic similarity across languages produces occasional false-positive watchlist matches. Always review matches with
finalScorebelow 0.85 manually before taking compliance action. - Geocoding depends on address quality. Registered addresses in corporate records are often abbreviated or formatted inconsistently. Low-quality address strings may fail geocoding and be excluded from DBSCAN clustering, reducing cluster coverage.
- Bayesian inference convergence is not guaranteed. The loopy belief propagation algorithm may not converge for highly circular or sparse evidence graphs. Non-converged results are flagged in the output with
convergenceAchieved: falseand should be treated as preliminary. - The actor does not access closed or paid registries. Beneficial Register data in many jurisdictions (e.g., Luxembourg, Netherlands, many US states) requires authenticated or paid API access not available in this actor.
- Re-running produces slightly different results. API query ordering and parallel execution timing can cause minor variation in which records are included in the ownership graph between runs on the same entity.
Integrations
- Zapier β trigger an investigation automatically when a new counterparty is added to your CRM and push findings back as a contact note
- Make β build multi-step compliance workflows: run investigation, filter by risk grade, create tasks in Jira or Monday for HIGH and CRITICAL cases
- Google Sheets β export investigation results to a compliance tracker spreadsheet for review and sign-off workflows
- Apify API β trigger investigations programmatically from your compliance case management system and receive structured JSON results
- Webhooks β receive a webhook notification when a HIGH or CRITICAL investigation completes, triggering downstream alert or escalation workflows
- LangChain / LlamaIndex β feed investigation findings into an AI compliance assistant to generate narrative due diligence memos or answer investigator questions about the ownership structure
Troubleshooting
-
Run returns empty findings or all findings say "No significant concealment indicators detected". This typically means the entity name did not match any corporate records. Check spelling, try removing legal suffixes ("Ltd", "Inc"), or try a shorter partial name. If the entity is registered exclusively in a jurisdiction not covered by OpenCorporates, no records will be retrieved.
-
Sanctions screening shows no matches even though the entity is sanctioned. The OFAC and OpenSanctions queries use the entity name as submitted. If the sanctioned entity uses a significantly different name, the transliteration pipeline may not bridge the gap. Try submitting alternative known names or transliterations of the entity name.
-
Run times exceed 10 minutes. Large corporate networks with many subsidiaries and directors trigger more parallel actor calls. Set
includeDirectors: falseto cut run time, or specify a jurisdiction code to reduce registry calls. If runs are consistently slow, increase memory allocation to 512 MB in the actor settings. -
The
beneficialOwnership.summary.convergenceAchievedfield is false. The loopy belief propagation algorithm did not reach a stable state, typically because the evidence graph is too sparse or too circular. ThetopInferenceresult is still useful as a directional indicator but should not be relied on as a definitive ownership conclusion. -
Address clusters are empty despite many registered addresses. Geocoding failures on non-standard address formats (e.g., P.O. Box addresses, addresses in non-Latin scripts) reduce the geocoded address count below the DBSCAN
minPts = 2threshold. The ownership graph and watchlist findings remain valid even without clustering results.
Responsible use
- This actor queries publicly available corporate registry data, sanctions watchlists, and law enforcement databases.
- Beneficial ownership findings are probabilistic, not legal determinations. Do not use investigation output as the sole basis for regulatory filings or legal action without independent verification.
- Comply with GDPR and applicable data protection laws when processing personal data about directors and officers identified in the investigation.
- Do not use this actor to investigate individuals who are not in their capacity as corporate officers or beneficial owners of legal entities.
- For guidance on web scraping and data processing legality, see Apify's guide.
FAQ
How does beneficial ownership investigation work? The actor runs four phases: it collects corporate records from up to 7 registries in parallel, screens identified directors against 4 law enforcement and sanctions databases, geocodes registered addresses for clustering, then runs 6 algorithms (BFS ownership unfolding, 5-stage transliteration matching, Kleinberg burst detection, DBSCAN clustering, Weisfeiler-Lehman graph kernel, and Bayesian loopy belief propagation) to produce a composite opacity score graded LOW through CRITICAL.
What registries does the beneficial ownership investigation search? The actor always queries OpenCorporates (140+ jurisdictions), the GLEIF LEI registry, OFAC, and OpenSanctions. Based on the jurisdiction input, it additionally queries UK Companies House (GB/UK), the Canada Business Registry (CA), the Australian Business Register (AU), or the New Zealand Companies Register (NZ). Leave the jurisdiction field blank to query all supported registries.
How accurate is the beneficial ownership inference? The Bayesian inference engine reports a posterior probability for each person-entity ownership pair. Probabilities above 70% indicate strong evidence from multiple channels; below 50% indicates weak or conflicting evidence. The inference is a probabilistic estimate from public data, not a definitive legal determination. It should be used to direct further investigation, not as a standalone compliance conclusion.
How many beneficial ownership investigations can I run per month? As many as your Apify budget allows. Each investigation costs approximately $0.40β$1.00. Apify's free plan provides $5 of monthly credits (5β12 investigations). The $49/month Starter plan provides $49 of credits (50β120 investigations). There is no hard per-month cap β you pay for what you use.
Is it legal to investigate beneficial ownership using public registry data? Yes. All data sources queried (OpenCorporates, Companies House, GLEIF, OFAC, OpenSanctions, INTERPOL, FBI) are publicly available databases. Beneficial ownership investigation is a legally required activity under AML/KYC regulations in most jurisdictions. For a detailed analysis, see Apify's web scraping legality guide.
How is this different from commercial beneficial ownership databases like Refinitiv World-Check or Bureau van Dijk Orbis? Commercial platforms charge $15,000β$100,000+ per year for subscription access to proprietary beneficial ownership databases. This actor uses the same publicly available primary sources but applies advanced algorithmic analysis (transliteration matching, Kleinberg burst detection, Bayesian inference) that many commercial tools do not offer. It does not include proprietary data from paid closed registries.
What is an opacity score and how is it calculated? The opacity score (0.0β1.0) measures how difficult it is to determine the true beneficial owner of an entity. It combines six sub-scores with fixed weights: ownership complexity from BFS unfolding (25%), Bayesian owner uncertainty (20%), transliteration risk (15%), address co-location (15%), infrastructure correlation (15%), and registration burst anomaly (10%). Scores above 0.75 trigger CRITICAL grade; above 0.55 trigger HIGH; above 0.35 trigger ELEVATED; above 0.15 trigger MODERATE; below 0.15 is LOW.
What secrecy jurisdictions does the actor track? The actor tracks 22 secrecy jurisdictions: Panama (PA), British Virgin Islands (VG), Cayman Islands (KY), Belize (BZ), Seychelles (SC), Samoa (WS), Vanuatu (VU), Marshall Islands (MH), Bermuda (BM), Turks and Caicos (TC), Anguilla (AI), Montserrat (MS), Jersey (JE), Guernsey (GG), Isle of Man (IM), Gibraltar (GI), Liechtenstein (LI), Monaco (MC), Andorra (AD), San Marino (SM), Mauritius (MU), and Lebanon (LB). Each hop through a secrecy jurisdiction adds a penalty to the opacity score.
Can I use this for Corporate Transparency Act (CTA) or EU AMLD beneficial ownership compliance? Yes. The investigation output documents the ownership chain, identifies persons of interest, and provides supporting evidence from independent registry data β the components needed for Beneficial Ownership Information (BOI) reports under FinCEN's CTA rules or PSC declarations under EU AMLD directives. The output does not constitute a legal filing; it supports the documentation your compliance team prepares.
What happens if the entity name matches many unrelated companies?
The actor retrieves up to 40 records from OpenCorporates and 15 from GLEIF. Records are filtered by name similarity to the target entity. If many partial matches exist, the ownership graph will include unrelated entities, which may produce false-positive clustering or burst detections. Use the jurisdiction parameter to scope the search, or use a more specific entity name.
Can I schedule this actor to run automatically?
Yes. Apify's built-in scheduler allows you to run this actor on any interval (daily, weekly, monthly). Set up a scheduled task in the Apify console or via the API with a fixed entityName input. Use webhooks to receive notifications when a re-screen produces a higher risk grade than the previous run.
Help us improve
If you encounter issues, you can help us debug faster by enabling run sharing in your Apify account:
- Go to Account Settings > Privacy
- Enable Share runs with public Actor creators
This lets us see your run details when something goes wrong, so we can fix issues faster. Your data is only visible to the actor developer, not publicly.
Support
Found a bug or have a feature request? Open an issue in the Issues tab on this actor's page. For custom solutions or enterprise compliance integrations, reach out through the Apify platform.
How it works
Configure
Set your parameters in the Apify Console or pass them via API.
Run
Click Start, trigger via API, webhook, or set up a schedule.
Get results
Download as JSON, CSV, or Excel. Integrate with 1,000+ apps.
Use cases
Sales Teams
Build targeted lead lists with verified contact data.
Marketing
Research competitors and identify outreach opportunities.
Data Teams
Automate data collection pipelines with scheduled runs.
Developers
Integrate via REST API or use as an MCP tool in AI workflows.
Related actors
Bulk Email Verifier
Verify email deliverability at scale. MX record validation, SMTP mailbox checks, disposable and role-based detection, catch-all flagging, and confidence scoring. No external API costs.
GitHub Repository Search
Search GitHub repositories by keyword, language, topic, stars, forks. Sort by stars, forks, or recently updated. Returns metadata, topics, license, owner info, URLs. Free API, optional token for higher limits.
Website Content to Markdown
Convert any website to clean Markdown for RAG pipelines, LLM training, and AI apps. Crawls pages, strips boilerplate, preserves headings, tables, and code blocks. GFM support.
Website Tech Stack Detector
Detect 100+ web technologies on any website. Identifies CMS, frameworks, analytics, marketing tools, chat widgets, CDNs, payment systems, hosting, and more. Batch-analyze multiple sites with version detection and confidence scoring.
Ready to try Beneficial Ownership Investigation?
Start for free on Apify. No credit card required.
Open on Apify Store