Under review — this plugin is pending approval.

openregistry

0

Live, government-identical company data from 27 national registries. Cross-border UBO chain walker. A platform by Sophymarine.

10 skills

Cross-Border UBO Chain Walker

Unmask the real person behind any company. Walks ownership chains across 27 national government registries in one prompt — UK Ltd → Luxembourg SARL → Cayman LP → Jersey trust → individual beneficiary. Every hop is a live, direct-to-government query returning the registry's response unmodified, with source identifiers preserved. Use this skill when the user asks "who really owns", "ultimate beneficial owner", "UBO", "actual controller", "corporate control chain", "ownership structure", "real owner", "pierce the corporate veil", or is doing cross-border AML / KYC / sanctions-screening / investigative journalism. Works on all 27 OpenRegistry jurisdictions; AML-gated registers (DE, ES, IT, NL post CJEU C-37/20) are flagged transparently.

# Cross-Border UBO Chain Walker **Walk the ownership chain across jurisdictions until you reach the real individual — or a transparent AML gate.** ## What you get - **Live government queries at every hop.** Each company in the chain is looked up in its home country's statutory register at the moment you ask. No cache layer, no nightly scrape, no 6-24 hour stale data. - **Unmodified responses.** Every PSC entry, every shareholder row, every corporate-structure detail is returned exactly as the government's own system emits it — field names, status codes, ownership percentages preserved verbatim. - **Traceable provenance.** Every hop identifies the exact registry and record ID so you can click through to the government source to verify. Enterprise tier adds `source_url` / `registry_url` / `data_license` pre-synthesised into every response. - **Cross-border by design.** A UK Ltd → LU SARL → KY LP → Jersey trust → individual ownership walk is a single conversation, not 4 separate research tasks. - **Honest about gaps.** AML-gated registries (DE, ES, IT, NL post CJEU C-37/20 of Nov 2022; RU 115-FZ art. 6.1; KY BOTA legitimate-interest) are flagged in the chain with the exact statutory channel to unblock them. ## Example prompts ``` Who are the ultimate beneficial owners of Revolut Ltd (UK company number 08804411)? Walk the full ownership chain until you reach individuals or AML gates. ``` ``` Trace the corporate control chain of ByteDance's UK operating entity (Companies House 11319901) across all jurisdictions you can reach. ``` ``` For this Luxembourg SARL R.C.S. B123456, map the entire ownership structure in both directions: who controls it AND which entities does it control? ``` ## Workflow ### Step 1 — Resolve the starting entity ``` search_companies({ jurisdiction, query: "<name>" }) // if name given get_company_profile({ jurisdiction, company_id }) // confirm entity ``` ### Step 2 — Pull the UBO register (live, direct) ``` get_persons_with_significant_control({ jurisdiction, company_id }) ``` Free-public-UBO jurisdictions: `GB`, `CZ`, `PL`, `IS`, `CA`, `ID`. For **AML-gated jurisdictions** (DE / ES / IT / NL / LU / AT / MT / PT post CJEU C-37/20) the call returns 501 with `alternative_url` pointing at the statutory AML-obliged-entity portal. Record the gate in the chain — don't silently skip it. ### Step 3 — Fall back to shareholder register where UBO is unavailable ``` get_shareholders({ jurisdiction, company_id }) ``` Shareholder registers (GB, NO, CH, CZ, TW, IS, KR) show *legal* owners — a corporate shareholder may be a nominee or holding vehicle. Document the shareholder ≠ UBO distinction clearly. ### Step 4 — Recurse up the chain For every corporate PSC / shareholder: 1. Resolve the parent entity's `company_id` (may cross jurisdictions — a UK PSC might be a LU SARL, a Dutch B.V., a Cayman LP). 2. Call `get_persons_with_significant_control` on the parent in its home jurisdiction. 3. Stop when you reach an individual, a publicly-traded listed entity, or an AML-gated register. 4. Track cumulative effective ownership (40% × 60% = 24% pass-through stake). ### Step 5 — Render as a tree ``` Revolut Ltd (GB 08804411) ├─ Revolut Group Holdings Ltd (GB 14070460) — 25-50% shares │ └─ [recurse] ├─ Balderton Capital VII LP (GB LP XXXXX) — 10-25% shares │ └─ Balderton Capital General Partner VII Ltd (GB) — 75-100% │ └─ <individual GP> └─ … ``` ### Step 6 — Source citations Under the tree, list for every node: - Registry name + jurisdiction - Company identifier (government-assigned) - Notified date + ceased date if applicable - Direct government URL (reconstructable from jurisdiction + company_id; Enterprise tier has it pre-built) ## Provenance & Auditability Every node in the chain is backed by a specific government record. For a compliance / audit report you can include: - The registry's own identifier (e.g. GB Companies House company number, LU B-number, KY CIMA reference) - The PSC notification date straight from the register (not a recomputed "as-of" date) - The exact nature-of-control the register records ("ownership-of-shares-25-to-50-percent", "voting-rights-25-to-50-percent", "right-to-appoint-or-remove-directors") - Upstream field names preserved in `jurisdiction_data` — no re-labelling This means **every claim in your UBO report is one government URL away from independent verification**. No aggregator in between to say "trust us". ## Known AML gates (flagged transparently) When the chain crosses into one of these jurisdictions, the tool returns a structured 501 with the exact channel to unblock: | Jurisdiction | Gate | Channel to unblock | |---|---|---| | DE / ES / IT / NL / LU / AT / MT / PT | CJEU C-37/20 (Nov 2022): UBO register no longer publicly queryable | AML-obliged-entity credentials (banks, notaries, auditors, lawyers) or legitimate-interest application (journalists / NGOs) | | RU | 115-FZ art. 6.1: UBO permanently AML-gated | ФНС + Росфинмониторинг + licensed banks only | | KY | BOTA 2023: legitimate-interest access | CI$250/year + CI$75/search application; journalist / civil-society / AML-investigator categories | | CN | No public UBO register | — | | US federal | FinCEN BOI currently on hold per judicial injunctions | — | Hitting a gate is transparent — the tree shows exactly where the chain breaks and why. ## You might also need - Want the full statutory dossier on the starting company before walking? → [KYC & Cross-Border Due Diligence](../kyc-cross-border-due-diligence/SKILL.md) - Want to see every OTHER company each individual in the chain has directed? → [Director Search & PEP Screening](../director-search-pep-screening/SKILL.md) - Is the starting company itself suspicious? → [Shell Company Detector](../shell-company-detector/SKILL.md) ## Why the data stays fresh (the moat) - **Live at call-time.** Every hop is a real-time query, not a pre-built graph we refresh nightly. - **Direct to government.** UK Companies House, Lux RCS, Cayman CIMA — we call them directly, not a commercial aggregator. - **No cache layer we control.** The only "delay" is the government's own publication delay (usually <24h), not one we add. - **Source-linked.** Every node resolves back to the government URL — you can always verify independently. - **Production-grade.** Runs on CF Workers' global edge + warm per-jurisdiction workers for stateful registries; resilient to individual-country outages (the rest of the chain keeps walking).

Corporate Filing Monitor & Event Alert

Live stream of material filings on any company — director changes, new registered charges, capital events, insolvency markers, name / address changes. Pull the last N days of government-registered filings, categorise by severity, fetch the raw document for every high-priority event. All data direct from the government registry, unmodified, source-linked. Use this skill when the user asks to "monitor filings", "watch corporate events", "track changes", "alert on filings", "detect director change", "detect new charge", "insolvency watch", "deal flow monitor", "litigation watch", or builds a portfolio-company watchlist.

# Corporate Filing Monitor & Event Alert **The last N days of government filings on your watchlist — categorised, fetched, flagged.** ## What you get - **Live filing history** from the government registry's own filings index — UK Companies House filing-history API, Korea DART DS001 list, Mexico PSM statutory publications, Iceland Skatturinn typeid-1/2/3 stream. - **Unmodified filing records**: filing_id, filing_date, category code, document_id preserved from the upstream. - **Severity-bucketed output**: LOW (routine accounts / confirmation statement), MEDIUM (resolution / constitution / re-registration), HIGH (officer change / capital event / new charge), CRITICAL (insolvency / administration / liquidation). - **Document fetch** on every HIGH / CRITICAL entry: raw bytes pulled, material specifics extracted (who, what, when, how much). - **Watchlist support**: run across a list of companies, cross-correlate patterns (sector-wide insolvency clusters, shared lender across new charges, director-to-director moves). ## Example prompts ``` Monitor filings on UK company 09446231 (Monzo Bank) in the last 90 days. Flag anything material. ``` ``` Scan the last 30 days of DART disclosures for Samsung Electronics. Summarise any material events (capital / M&A / insolvency markers). ``` ``` Watch this portfolio (7 UK private companies). Report any director changes, new charges, or insolvency filings in the last 14 days. ``` ## Workflow ### Step 1 — Scope - Jurisdiction: `list_filings` is supported on GB / IE / CA / IS / FI / IM / LI / MX / KR. Check with `list_jurisdictions({ jurisdiction })` if unsure. - Window: default 90 days if unspecified. - Watchlist: one company or a list. ### Step 2 — Pull filing history ``` list_filings({ jurisdiction, company_id, limit: 100 }) ``` Filter client-side to `filing_date >= now - N days`. ### Step 3 — Categorise | Category | Severity | Why it matters | |---|---|---| | `accounts`, `annual-return`, `confirmation-statement` | LOW | Routine — entity is alive | | `registered-office` | LOW | Address change (may indicate operational move) | | `resolution`, `constitution`, `conversion`, `name-change` | MEDIUM | Governance document change | | `officers` (appointment / resignation / change-of-particulars) | **HIGH** | Board change — read the form | | `capital` (allotment, reduction, reorganisation) | **HIGH** | Equity event — fundraising or restructuring | | `charges` (MR01 / satisfaction / MR04) | **HIGH** | New collateral / discharge — debt event | | `insolvency` / `liquidation` / `administration` | **CRITICAL** | Distressed — flag immediately | ### Step 4 — Fetch documents for HIGH / CRITICAL ``` get_document_metadata({ jurisdiction, document_id }) fetch_document({ jurisdiction, document_id }) ``` Extract: - **Officer changes**: AP01 / TM01 → name, role, appointment/resignation date - **Charges**: MR01 → chargee / lender + creation date + amount (if disclosed) - **Insolvency**: type (administration / CVA / CVL / compulsory) + appointed practitioner + hearing date - **Capital changes**: SH01 → amount, share class, whether new external equity issued - **KR material events**: DART `pblntf_ty` code J (issuance/swap) / E (material events) — summarise the `rcept_no` filing ### Step 5 — Cross-watchlist correlation If the user passed a list: - Timeline of every HIGH/CRITICAL event across all watched companies - Cluster detection: 3+ insolvency filings in the same sector within 2 weeks - Cross-company signals: director resigning from Company A AND appointed to Company B within 30 days - Lender concentration: same chargee appearing on 5+ new charges in the window ### Step 6 — Report Single-company: headline counts, newest-first timeline, CRITICAL alerts box. Watchlist: per-company rollup, cross-company pattern section. ## Provenance & Auditability - Every filing row has the government's own `filing_id` (Companies House transaction_id, DART rcept_no, PSM folio de publicación) - `document_id` resolves back to the registry's hosted filing page - Government URL reconstructable from (jurisdiction, company_id, filing_id) ## Register-specific signals (surface proactively) - **GB**: `gazette-notice` category often precedes a striking-off — flag these. - **IE**: form B1 = annual return (routine); B10 = director change (HIGH); G1 = special resolution (MEDIUM). - **FI**: `prh-muutosilmoitus` = change notification (look at sub-type); `LOPP` = termination. - **DE**, **LI**, **MX**: filings index is free; individual document body may be paid per doc. Surface cost. - **KR DART**: `pblntf_ty` J (issuance / swap) and E (material events) = highest-signal. ## Missing-data as signal Absence of filings is ALSO a signal. A normally-active company that hasn't filed anything in 18+ months is a yellow flag even without adverse filings. The report surfaces "silent watchlist members" proactively. ## You might also need - Full DD context on a flagged company → [KYC & Cross-Border Due Diligence](../kyc-cross-border-due-diligence/SKILL.md) - Look at historical patterns, not just recent filings → [Phoenix Company Radar](../phoenix-company-radar/SKILL.md) - Cross-check director changes against PEP lists → [Director Search & PEP Screening](../director-search-pep-screening/SKILL.md) ## Why the data stays fresh Every `list_filings` call is a live direct query to the government filing index. UK Companies House updates the filing-history endpoint within 24h of a filing being accepted; DART publishes disclosures in real-time after FSS acceptance. We surface updates the moment the government does. **No delay we add.**

Director Search & PEP Screening

Map every company a person has been a director of — live, direct from government officer registers. Covers UK Companies House, France RNE, Taiwan GCIS cross-company officer indexes. Returns unmodified registry records with officer IDs and appointment dates preserved, plus co-director network for second-order pattern detection. Use this skill when the user asks to "trace", "screen", "background check", "PEP screen", "find every company X has directed", or is doing anti-fraud / AML / sanctions-evasion / investigative-journalism / board-appointment research.

# Director Search & PEP Screening **From a single name to the full corporate footprint, live from the government officer register.** ## What you get - **Live officer search** across UK Companies House, France RNE, Taiwan GCIS — the 3 jurisdictions that publish free cross-company officer indexes. - **Unmodified upstream records**: every appointment returned with the registry's own officer_id, role code, appointed_on / resigned_on dates preserved verbatim. - **Co-director network** (second-order): for each active company, pull the full board to identify repeat co-directors — a 2+ shared-company signal often indicates TCSP / nominee relationships or coordinated vehicles. - **Pattern detection** built in: phoenix churn (rapid incorporation → resignation → dissolution), sole-director shell companies, address concentration, adverse-event correlation. - **Transparent disambiguation**: common names get multiple candidate profiles (partial DoB, nationality, occupation) — the skill asks the user to pick rather than silently guessing. ## Example prompts ``` Find every UK company Elon Musk has been a director of. Include resigned appointments. ``` ``` PEP screen: map all active directorships of "Sundar Pichai" in Companies House + French RNE. ``` ``` For Anne Boden (Starling Bank founder), show her full UK appointment history plus any co-directors who appear alongside her in 2+ companies. ``` ## Workflow ### Step 1 — Find officer matches ``` search_officers({ jurisdiction: "GB", query: "<name>" }) search_officers({ jurisdiction: "FR", query: "<name>" }) search_officers({ jurisdiction: "TW", query: "<name>" }) ``` If multiple candidates (common names), surface top 5 with DoB (partial) / nationality / occupation and ask the user to pick before proceeding. ### Step 2 — Full appointment history (GB) ``` get_officer_appointments({ jurisdiction: "GB", officer_id: "<id>" }) ``` Returns every appointment: company_id, company_name, role, appointed_on, resigned_on, is_active. GB Companies House is the only jurisdiction with a native person-indexed appointment endpoint. ### Step 3 — Enrich each appointed company ``` get_company_profile({ jurisdiction: "GB", company_id: "<id>" }) ``` Record status (active / dissolved / liquidation), SIC code, registered address, accounts status. ### Step 4 — Co-director network For each active company in the list: ``` get_officers({ jurisdiction: "GB", company_id, include_resigned: false }) ``` Count co-occurrences. Any person appearing in 2+ companies alongside the subject = "repeat co-director". Report top 5. ### Step 5 — Pattern flags Flag proactively: - Active appointment on company with registered charges / insolvency history / overdue accounts - Resignation within 90 days of an adverse event (insolvency filing, CCJ, striking-off notice) - Sole-director appointments (single person responsible) - Address concentration (3+ companies at the same registered office = TCSP / nominee address) - Rapid incorporation → resignation → dissolution cycles (phoenix pattern — cross-link to [Phoenix Company Radar](../phoenix-company-radar/SKILL.md)) ### Step 6 — Report - **Subject identity** (name + disambiguating DoB / nationality) - **Active appointments table**: company, role, appointed_on, company_status - **Resigned appointments table**: company, role, appointed_on, resigned_on, company_status - **Top 5 repeat co-directors** with shared-company count - **Red flags** ## Provenance & Auditability Each appointment row can be traced back to the government officer record by `officer_id` + the hosting company's `company_id`. The GB Companies House URL pattern is `https://find-and-update.company-information.service.gov.uk/officers/{officer_id}/appointments`. Every fact is one click from verification at the government source. ## Limitations (surface proactively) - **Scope**: full cross-company officer search is GB / FR / TW only. Other jurisdictions have no free officer index — to check "has this person directed a company in country X?" you must go company-by-company. - **DoB**: GB Companies House publishes partial DoB (month + year) — use for disambiguation only, not identity confirmation. - **Common names**: match false positives expected. Always require the user to confirm the right candidate before publishing a report. - **Foreign-language names**: Taiwan GCIS indexes 中文姓名; French RNE indexes Latin-alphabet names. Searching "Jean Dupont" won't find him in Taiwan; searching "郭台銘" won't find him in France. ## You might also need - Once you've identified a suspicious person, check if their companies are shell entities → [Shell Company Detector](../shell-company-detector/SKILL.md) - Follow the ownership trail upstream from a person's company → [Cross-Border UBO Chain Walker](../ubo-cross-border-chain-walker/SKILL.md) - Watch for their next appointment → [Corporate Filing Monitor & Event Alert](../corporate-filing-monitor/SKILL.md) ## Why the data stays fresh Every `search_officers` / `get_officer_appointments` call is a live direct query to the government officer register. Companies House updates appointments within 24 hours of the AP01 / TM01 filing; we reflect the update the moment the government does. No cache layer we control.

Global Company Name Availability Check

Check whether a proposed company name is free to register across 10+ countries — live, direct from each government register. Returns unmodified registry match records with exact-match / dissolved / fuzzy-substring breakdowns per jurisdiction. Use this skill when the user asks "is [name] available as a company name", "can I register a company called [name]", "is this name taken", "company name availability check", "trademark / entity formation research", or is choosing a multi-country brand.

# Global Company Name Availability Check **Run a name across 10+ government company registers in one prompt. Get exact-match / cooling-off / confusingly-similar results per jurisdiction.** ## What you get - **Live name search** against each target country's statutory register — no commercial-data-provider lag, no stale index. - **Native availability probe** for Isle of Man (`check_name_availability` endpoint, authoritative). - **Pattern-match fallback** for every other jurisdiction via `search_companies` (name is a substring of or matches existing entities). - **Cooling-off awareness**: flags exact-match *dissolved* entities where the registry requires a waiting period (GB: 20 years post-dissolution; DE: case-by-case via Registergericht; FR: no wait but INPI trademark check advised). - **Sensitive-word flagging**: names containing "British" / "National" / "Royal" (GB), "Bank" / "Bundes" (DE), "Malaysia" / "royal" (MY) → ministerial approval required. ## Example prompts ``` Is "Sophy Marine" available as a company name in GB, IE, FR, DE, NL, and BE? ``` ``` Check "BlueStreak Analytics" across the top 10 EU registries. ``` ``` I want to register "Apex Robotics" in 5 countries. Check GB, US-NY, US-CA, DE, KR — report exact and fuzzy matches. ``` ## Workflow ### Step 0 — Preflight Call `about` to see the caller's tier. Multi-country fan-out capped at: - Anonymous / Free: 3 countries / 60s - Pro: 10 / 60s - Max: 30 / 60s - Enterprise: unlimited ### Step 1 — Parse target list Accept comma-separated ISO codes or "all" (top-10 default: GB, NO, IE, FR, DE, FI, CZ, PL, CH, US-NY). ### Step 2 — IoM native probe (if IM in list) ``` check_name_availability({ jurisdiction: "IM", query: "<name>" }) ``` Authoritative — IoM's own duplicate + confusingly-similar checks. ### Step 3 — Pattern match every other jurisdiction ``` search_companies({ jurisdiction, query: "<name>" }) ``` Per jurisdiction, classify: - **Exact-match active** → TAKEN. Report company_id + incorporation date + status. - **Exact-match dissolved** → COOLING-OFF. Name *may* be free, but registry rules vary. - **Fuzzy substring match** → CONFUSINGLY-SIMILAR RISK. Report top 5 fuzzy hits. - **No match** → APPEARS AVAILABLE. ### Step 4 — Sensitive-word / legal-form flags Proactively flag: - "British" / "National" / "Royal" in GB (Secretary of State approval) - "Bank" / "Bundesbank" / "Bundes-" in DE (BaFin licensing gate) - "Société Européenne" / "SE" (requires SE formation compliance under Council Regulation EC 2157/2001) - Required legal-form suffix the user's plan should include (PLC / Ltd / GmbH / S.A. / SARL / B.V. / OOO / AG / SAS) ### Step 5 — Trademark caveat Surface prominently: **company-name availability ≠ trademark availability**. Even when the registry accepts the name, an existing trademark in the same class can block commercial use. Recommend WIPO Global Brand Database + national IPO searches as follow-up (not covered by OpenRegistry — outside our scope). ### Step 6 — Per-jurisdiction report | Jurisdiction | Status | Evidence | Follow-up | |---|---|---|---| | GB | TAKEN (exact active) | Company 12345678 inc 2022 | N/A | | IE | AVAILABLE | — | Add "Ltd" / "Teoranta" suffix | | FR | FUZZY RISK | 3 fuzzy hits, top: SIREN 552100554 | Check INPI trademark | | DE | COOLING-OFF | HRB 98765 dissolved 2018 | Contact Registergericht for reuse rules | ## Provenance & Auditability Every "taken" / "fuzzy hit" includes the government-assigned company_id so you can verify the conflicting entity at source. ## Jurisdictional limits (surface proactively) - **BR, TW**: identifier-only search — no name lookup. Tell user to check `receitafederal.gov.br` / `findbiz.nat.gov.tw` manually. - **US**: naming rules are state-level. A name free in Nevada may collide with a Delaware incumbent. Always ask which state. - **DE**: `search_companies` uses the gemeinsames Registerportal — covers registered Handelsregister firms but not sole traders under Gewerbeanmeldung (municipal level). ## You might also need - Want to check trademark availability (different question)? Not in OpenRegistry's scope — recommend WIPO + national IPOs. - Want to see who's currently running the conflicting entity? → [KYC & Cross-Border Due Diligence](../kyc-cross-border-due-diligence/SKILL.md) - Want to see an industry landscape before branding? → [Industry & Competitor Company Search](../industry-competitor-search/SKILL.md) ## Why the data stays fresh Every name check is a live search against the government register at call-time. When a new company incorporates in Companies House, our search shows the conflict within the Companies House publication cycle — no intermediary crawler with a weekly refresh.

Industry & Competitor Company Search

Find every company operating in a sector across 27 national government registries in parallel. Returns live, unmodified registry records enriched with profile + officers + latest-accounts size proxy. Use this skill when the user asks to "find companies in [industry]", "competitor research", "market landscape", "map a sector", "find players in [market]", "M&A targeting", "competitive analysis". Works across all 27 OpenRegistry jurisdictions; respects per-tier cross-border fan-out caps.

# Industry & Competitor Company Search **Map an industry across jurisdictions in one prompt — live government data, no aggregator lag.** ## What you get - **Parallel search across multiple government registries** (anon/free 3 countries / 60s; Pro 10; Max 30; Enterprise unlimited). - **Unmodified match records** from each registry with the native SIC / NACE / industry code preserved so you can validate sector-fit after retrieval. - **Structured filters where native** — AU supports SOAP-style filters (`postcode:`, `state:`, `type:`, `charity:Y`, `registered:YYYY-MM`), CZ has sub-register filtering via `search_specialised_records`, IE supports match_type + bus_ind + address + alpha filters. - **Enrichment + filter**: per-candidate `get_company_profile` + industry-code match to trim false positives. - **Top-10 deep-dive**: for most-interesting candidates, pull officers + latest accounts (via [Live Company Accounts & XBRL Financials](../live-company-accounts-xbrl/SKILL.md)) to build actionable M&A / partnership shortlists. ## Example prompts ``` Find the top 5 Canadian fintech startups. Active, incorporated since 2015. ``` ``` Map the UK pet food manufacturing industry — list active producers with latest turnover where accounts are available. ``` ``` Find every company with "payments" in the name across GB, IE, FR, DE, NL, BE, LU. Rank by incorporation date, flag the ones still active. ``` ## Workflow ### Step 0 — Preflight ``` about // returns caller's tier + fan-out cap ``` ### Step 1 — Clarify scope Ask the user (don't guess): - **Industry specificity**: "SaaS" is too broad; "vertical SaaS for veterinary clinics" is tractable. - **Jurisdictions**: explicit list or top-N default. - **Size cut-off**: active-only? incorporated after YYYY? >N employees? ### Step 2 — Build queries Structured (AU / IE / CZ sub-registers) or name-fragment (everything else): - Split industry phrase into keywords + synonyms. - Tech: "tech", "software", "data", "AI", "digital" - Pharma: "pharma", "biotech", "labs", "sciences" (noisy — validate with SIC) - Finance: "capital", "partners", "investments", "advisors" (very noisy — enrich with SIC/NACE) ### Step 3 — Run in parallel ``` search_companies({ jurisdiction, query: "<keyword>", limit: 100 }) // ... per jurisdiction ``` Dedupe by `(jurisdiction, company_id)`. ### Step 4 — Enrich + filter ``` get_company_profile({ jurisdiction, company_id }) // per candidate ``` Drop: `dissolved` (unless user wants historical), SIC/NACE mismatch, pre-cutoff incorporation year. ### Step 5 — Segment - By country - By incorporation vintage (pre-2000 / 2000-10 / 2010-20 / 2020+) - By size proxy (where accounts available: turnover / employees) - Active vs dormant (no accounts filed in 24 months = dormant flag) ### Step 6 — Top-10 deep dive For the most interesting 10: ``` get_officers({ jurisdiction, company_id }) list_filings({ jurisdiction, company_id, category: "accounts", limit: 1 }) → fetch_document ``` Extract latest turnover + net income. ### Step 7 — Deliver - **Scope summary**: industry keywords, countries, filters applied - **Per-country hit table**: count of matches per jurisdiction - **Segment breakdown**: vintage quartiles, size quartiles, dormant count - **Top-10 shortlist**: mini-profile with officers + latest financials - **Data-quality notes**: which jurisdictions had structured search (reliable) vs name-fragment (noisy) ## Provenance & Auditability Each company in the output traces back to the government register via `(jurisdiction, company_id)`. If the shortlist feeds an M&A target list, every target is one government-URL click from independent verification. ## Jurisdictional reality - **BRIS (IT) via EU Gateway**: exact-match CF or name-match only — no SIC-filter. - **RU, CN, IN**: registries in local scripts (Cyrillic / 简体中文 / Devanagari) — queries in the relevant script for best recall. - **Name-fragment noise**: cross-27-registry name search will return "retail" companies when you asked for "B2B retail-tech". Always confirm with profile enrichment; report both the raw hit count AND the post-enrichment qualified count. ## You might also need - Once you have a target list, run full DD on each → [KYC & Cross-Border Due Diligence](../kyc-cross-border-due-diligence/SKILL.md) - Spot the shell companies in your list → [Shell Company Detector](../shell-company-detector/SKILL.md) - Check ownership structure of top candidates → [Cross-Border UBO Chain Walker](../ubo-cross-border-chain-walker/SKILL.md) ## Why the data stays fresh Every `search_companies` call is live to the government register — if a new company incorporated yesterday, it's in our result today (subject to the government's own publication cycle, typically <24h). No index we build overnight.

KYC & Cross-Border Due Diligence

Ship a full statutory due-diligence dossier in one prompt — profile, directors, UBO, shareholders, charges, latest accounts — across 27 national government registries. Every data point is a live, direct-to-government query returning the registry's response unmodified, with source identifiers preserved so any fact traces back to the government record. Use this skill when the user asks to "run DD on", "do due diligence", "KYC", "counterparty check", "screen", "assess", "research", or "vet" a company / counterparty / acquisition target / new supplier / new investor. Covers investor DD, M&A pre-flight, AML/KYC onboarding, corporate investigation.

# KYC & Cross-Border Due Diligence **Replace 3 hours of research across 27 government websites with one AI prompt — and every fact in your report links back to the government source.** ## What you get - **Live statutory dossier**: profile, directors, beneficial owners, shareholders, registered charges, latest filed accounts — pulled at query time from the government registry of record. - **Unmodified upstream data** in every section: field names, status codes, document bytes preserved verbatim. No aggregator markup, no AI reinterpretation. - **Source citations** on every claim: the registry's own identifier (Companies House number / SIREN / HRB-Nummer / CIN / CVR …) is surfaced so you can click through to the government URL for verification. - **Cross-border awareness**: if the target has overseas parents / branches / subsidiaries, the workflow surfaces their company IDs so you can chain to the Cross-Border UBO Chain Walker skill. - **Transparent gap reporting**: where a jurisdiction gates data behind paid portals (FR INPI accounts, IE CORE officers, DE Transparenzregister UBO post CJEU C-37/20), the workflow surfaces the statutory channel to unblock — we don't silently skip. ## Example prompts ``` Run due diligence on Monzo Bank (GB). Full dossier. ``` ``` KYC check on company IČO 27074358 in Czechia — directors, UBO, charges, latest accounts. ``` ``` Screen this potential supplier: Hyundai Motor Company, South Korea. Full statutory profile plus latest annual accounts figures. ``` ## Workflow ### Step 1 — Resolve the entity ``` search_companies({ jurisdiction, query: "<name>" }) // or use given identifier get_company_profile({ jurisdiction, company_id }) ``` ### Step 2 — People: directors + UBO ``` get_officers({ jurisdiction, company_id, include_resigned: false }) get_persons_with_significant_control({ jurisdiction, company_id }) get_shareholders({ jurisdiction, company_id }) ``` If PSC returns 501 with `alternative_url`, surface it (UBO is AML-gated in most EU post CJEU C-37/20). ### Step 3 — Charges and encumbrances ``` get_charges({ jurisdiction, company_id }) ``` (GB / CZ native; other jurisdictions return 501 with pointer to property-charge / movable-asset registers.) ### Step 4 — Financial health ``` list_filings({ jurisdiction, company_id, category: "accounts", limit: 1 }) fetch_document({ jurisdiction, document_id }) ``` Extract from the XHTML iXBRL / PDF / XBRL bytes: revenue, operating profit, net income, total assets, liabilities, equity, cash, employees. ### Step 5 — Structured summary Deliver a report with sections: - **Entity status** — active / liquidation / dissolved + incorporation age - **Governance** — director count, recent board changes, concentration flags - **Ownership** — top PSCs / shareholders with percentages + cross-border parents flagged - **Financial health** — latest figures + going-concern notes - **Encumbrances** — outstanding charges with lender + creation date - **Red flags** — director churn, PSC changes, overdue accounts, recent dissolution attempts **Cite the government record ID + URL for every claim.** Example citation line: "Registered mortgage 0944623100001, created 2016-07-15 in favour of Silicon Valley Bank, status outstanding (GB Companies House, company 09446231, `get_charges` response)." ## Provenance & Auditability Every fact in the report is backed by: - The registry's own identifier (company_id, document_id, officer_id) - The registry name (surfaced in `list_jurisdictions` metadata) - The upstream field value preserved in `jurisdiction_data` — no reformatting - A reconstructable government URL (Enterprise tier gets it pre-synthesised) Pass this citation-rich report into a compliance file and every data point is one click from independent verification at the government source. ## Jurisdictional reality (surface proactively) - **IE, FR, FI**: officer rosters and/or PSC gated behind paid upstream portals — 501 returned with exact pointer. - **DE, ES, IT, NL, LU, AT, MT, PT**: UBO register AML-gated post CJEU C-37/20 (Nov 2022). Need AML-obliged credentials OR legitimate-interest application. - **US state registries**: no UBO register at state level; federal FinCEN BOI currently on hold per judicial injunctions. - **MX, RU**: individual records redacted under domestic data protection — surfaced with `is_masked: true` preserved. ## You might also need - Need to walk the ownership chain across jurisdictions? → [Cross-Border UBO Chain Walker](../ubo-cross-border-chain-walker/SKILL.md) - Want to check every other company the directors are running? → [Director Search & PEP Screening](../director-search-pep-screening/SKILL.md) - Want to monitor future filings on this entity? → [Corporate Filing Monitor & Event Alert](../corporate-filing-monitor/SKILL.md) ## Why the data stays fresh - **Live at call-time.** Every `get_*` tool is a real-time call to the government registry. - **No cache layer we control can go stale.** We see updates the moment the government records them. - **Unmodified responses.** Field names, status codes, filing bytes preserved verbatim — no "normalization" layer that could drop or rename data. - **Direct-to-government.** No commercial aggregator with its own refresh cycle.

Live Company Accounts & XBRL Financials

Pull the most recent statutory financial statements for any company — live, direct from the government registry — as machine-readable XBRL / iXBRL / raw PDF. Every filing byte is returned unmodified; no re-rendering, no OCR, no extraction layer we control. Extract turnover, operating profit, EBITDA, net income, total assets, equity, cash. Works natively on GB, IE, FI, CA, IS, MX, KR. Use this skill when the user asks for "annual accounts", "financial statements", "balance sheet", "P&L", "income statement", "cash-flow statement", "XBRL filing", "revenue", "EBITDA", "net income", "turnover", "total assets" of any company.

# Live Company Accounts & XBRL Financials **The actual statutory filing bytes — as the company filed them with the government, not an aggregator's summary.** ## What you get - **Live document retrieval** from the government filing archive — UK Companies House document API, Korea DART DS003 XBRL bundle, Iceland Skatturinn free-PDF cart, Mexico PSM folio de publicación. - **Unmodified filing bytes**: XHTML iXBRL / PDF / XBRL ZIP returned as the company submitted them, not re-rendered, not OCR'd, not parsed by us. - **Native XBRL access** for FI (PRH) and KR (DART DS003) — structured financial-statement XML ready for any XBRL processor. - **Multi-year trend** supported: pull 3-5 years of accounts and build a YoY time series for any line item. - **Machine-readable by design**: iXBRL `<ix:nonFraction>` tags carry canonical GAAP / IFRS concept URIs so the AI can extract `ifrs-full:Revenue`, `uk-gaap:TurnoverRevenue` etc. directly from the bytes. ## Example prompts ``` Get Monzo Bank's most recent annual accounts and extract revenue, operating profit, and total assets. ``` ``` Build a 5-year revenue + net income trend for Samsung Electronics (KR corp_code 00126380) from DART XBRL filings. ``` ``` Pull the latest audited accounts for this Irish company (CRO 104547 Ryanair DAC) and show key figures. ``` ## Workflow ### Step 1 — Resolve the entity ``` search_companies + get_company_profile ``` ### Step 2 — Choose the financial-access path | Jurisdiction | Path | |---|---| | **GB** | `list_filings(category="accounts")` → `fetch_document` returns XHTML iXBRL inline (modern filings) or PDF (pre-2017) | | **IE** | `list_filings(category="annual-return")` → document metadata (paid TIFF via upstream paid portal) | | **FI** | `get_financials` — native XBRL with normalised fiscal-period shape | | **CA** | `list_filings(category="accounts")` from ISED | | **IS** | `list_filings` with typeid=1/2/3 → free PDF of Ársreikningur via `fetch_document` | | **MX** | PSM annual financial-statement publications via `list_filings` | | **KR** | `get_financials` → `document_id=xbrl:{corp_code}:{bsns_year}:{reprt_code}` → ZIP with DS003 `fnlttXbrl.xml` | ### Step 3 — Fetch the bytes ``` get_document_metadata({ jurisdiction, document_id }) // check format + size first fetch_document({ jurisdiction, document_id }) // returns raw bytes ``` ### Step 4 — Extract line items For each year, produce: - **Income statement**: Revenue / Turnover, Cost of sales, Gross profit, Operating profit / EBIT, EBITDA (derive), Profit before tax, Tax, Net income - **Balance sheet**: Total assets, Current / non-current assets, Total liabilities, Current / non-current liabilities, Shareholders' equity, Cash and equivalents - **Other**: average employees, dividends declared, going-concern note, qualified audit opinion flag For every figure record: the **XBRL concept URI** (`ifrs-full:Revenue`, `uk-gaap:TurnoverRevenue`), the **currency**, and whether amounts are in thousands / millions. ### Step 5 — Deliver Single-year mode: tabulated statement with prior-year comparators. Multi-year mode: YoY line-item time series with % change. ## Provenance & Auditability - Every filing has the government's own `document_id` - `source_url` (Enterprise tier) links back to the Companies House filing-history page - Raw iXBRL bytes contain the company's XBRL tagging — a taxonomy-aware reader can verify every extracted figure against the tagged value This is what compliance / audit teams mean by **defensible data**: the figure in your spreadsheet and the figure in the government record are byte-identical, and you can prove it. ## Jurisdictional caveats (surface proactively) - **GB**: micro-entity / small-company exemption → smaller firms file abridged balance sheets with no P&L. - **FR**: accounts NOT in the free API. `list_filings` points at INPI paid portal (data.inpi.fr) with exact cost. - **DE**: Jahresabschluss filings free per DiRUG since 2022-08-01 — `list_filings` reaches them. - **US states**: state registries do NOT hold company accounts. For US private accounts use Dun & Bradstreet (paid, not proxied). For US public SEC filings use SEC EDGAR directly. - **MX**: SAT-confidential P&L detail not published; only statutory short-form "estados financieros sintéticos". ## You might also need - Want the full DD context alongside the accounts? → [KYC & Cross-Border Due Diligence](../kyc-cross-border-due-diligence/SKILL.md) - Monitor when new accounts are filed → [Corporate Filing Monitor & Event Alert](../corporate-filing-monitor/SKILL.md) - Compare across an industry → [Industry & Competitor Company Search](../industry-competitor-search/SKILL.md) ## Why the data stays fresh `fetch_document` is a live pull from the government archive every time. When Companies House accepts a new iXBRL filing, it's available through `fetch_document` within the same Companies House publication cycle — no intermediary to re-host or re-ingest.

Phoenix Company Radar

Detect phoenix-company fraud patterns from live government registry data — dissolved companies reborn with the same director(s) and same registered office at a new entity. Pulls live unmodified registry records and cross-references dissolution + director history + address reuse to surface phoenix candidates. Use this skill when the user asks to "detect phoenix company", "phoenix fraud", "rebirth fraud", "insolvency-then-new-company", "UK-insolvency-director-ban check", "creditor-fraud investigation", or is doing AML / insolvency / creditor-loss recovery work.

# Phoenix Company Radar **Spot dissolved-then-reborn fraud patterns — live from the government registers, cross-referenced across director + address + filing-history.** A phoenix company is a classic UK/common-law creditor-fraud pattern: a director runs a company into insolvency, dissolves it, then spins up a "new" company at the same address with the same trade and often the same director — leaving creditors of the old entity unpaid. This skill catches the pattern by correlating live registry data across the dissolution → rebirth timeline. ## What you get - **Live cross-reference** of three registry streams: dissolved companies + current-director appointments + registered-office reuse, all pulled at query time. - **Unmodified evidence** for every match: the dissolved predecessor's company_id + dissolution date + registered office at time of dissolution; the reborn entity's company_id + incorporation date + registered office + director roster. - **Temporal filters**: skill supports "any phoenix in the last N years" windows (UK common pattern is dissolution → rebirth within 6 months). - **Configurable signals**: shared director (strong), shared address (medium), same SIC code (weak), similar name (very strong). ## Example prompts ``` Is UK company 14234567 a phoenix? Check for dissolved predecessors with the same directors or same registered office. ``` ``` For director John Smith (GB Companies House officer_id xyz), check if any of his resigned companies were dissolved and a successor now trades. ``` ``` For UK registered office "123 High Street, London" — list all companies that ever had this address, flag any dissolved→rebirth pairs. ``` ## Workflow ### Mode A — Start from a company (is it a phoenix?) #### Step 1 — Profile the current entity ``` get_company_profile({ jurisdiction: "GB", company_id }) get_officers({ jurisdiction: "GB", company_id, include_resigned: false }) ``` Record: incorporation date, registered office, current director names, SIC code. #### Step 2 — For each current director, check prior dissolved companies ``` get_officer_appointments({ jurisdiction: "GB", officer_id }) ``` Filter to: resigned_on exists + company_status = "dissolved". For each dissolved predecessor: ``` get_company_profile({ jurisdiction: "GB", company_id: <predecessor> }) ``` Signal flags: - ✅ Same registered office as current entity - ✅ Same SIC code - ✅ Dissolved within 12 months of current entity's incorporation - ✅ Company name is a near-variant (e.g. "Smith Trading Ltd" → "Smith Trading 2024 Ltd") #### Step 3 — Check insolvency markers on predecessors ``` list_filings({ jurisdiction: "GB", company_id: <predecessor>, category: "insolvency" }) ``` Strong signal: predecessor went into administration / CVL before dissolution → creditor loss. ### Mode B — Start from a director (what's their phoenix history?) 1. `get_officer_appointments(officer_id)` → all companies ever directed. 2. Filter to dissolved companies. For each: fetch incorporation date, dissolution date, registered office. 3. Cross-match: any current active company with this director that shares address / SIC with a dissolved one? ### Mode C — Start from a registered office 1. Reverse-lookup companies at this address (where registry supports it — IE native, GB via Companies House web search). 2. Identify dissolution → incorporation pairs at the same address. 3. For each pair, check director overlap. ### Step 4 — Score & report Per phoenix-candidate pair, report: - **Predecessor**: company_id, name, status=dissolved, dissolution_date, insolvency_type (if any), creditors noted (from last CS01 / insolvency filing) - **Successor**: company_id, name, status=active, incorporation_date, registered office - **Overlap signals**: director match, address match, SIC match, name similarity, time gap - **Phoenix score**: 0-100, weighted by signal strength ## Provenance & Auditability Every identified pair cites: - GB Companies House URLs for predecessor + successor - Director officer_id that ties them together - Dissolution Gazette notice (if available via `list_filings(category="gazette-notice")`) - Insolvency filing doc_id (if predecessor went insolvent) A creditor-loss recovery report can cite each of these for legal action under Insolvency Act 1986 s.216 / s.217 (restricting use of company names after liquidation). ## Jurisdictional scope - **GB** (UK Companies House): full mode A / B / C support. `get_officer_appointments` provides the director-to-company reverse lookup. - **FR, TW**: partial (officer search available but no appointment history endpoint) — mode A works, B limited, C depends on reverse-address lookup. - **Other jurisdictions**: one-hop only — cannot reliably detect phoenix without cross-company officer index. ## Legal context (UK-specific) Under **Insolvency Act 1986 ss.216–217**, a director of a liquidated company cannot re-use the company's name (or a similar name) for a new company within 5 years without court permission. Violating this is a criminal offence AND makes the director personally liable for the new company's debts. Phoenix-company patterns often violate this — the skill's output can feed directly into complaints to the Insolvency Service. ## You might also need - Full DD on a suspected phoenix successor → [KYC & Cross-Border Due Diligence](../kyc-cross-border-due-diligence/SKILL.md) - Full director footprint across other companies → [Director Search & PEP Screening](../director-search-pep-screening/SKILL.md) - Is the successor ALSO a shell? → [Shell Company Detector](../shell-company-detector/SKILL.md) ## Why the data stays fresh Dissolution events, new incorporations, director appointments — all are reflected in Companies House within 24h of filing. Our skill runs live against Companies House, so a newly-spawned phoenix is detectable the day it's incorporated. Commercial data providers with weekly refresh cycles would miss it.

Sector Gatekeeper List

List every regulated / licensed entity in a sector — CIMA-authorised funds, FCA-authorised firms, BaFin-licensed banks, CSRC-registered brokers, FSS-supervised listed issuers — pulled live from the relevant government/regulator register. Returns unmodified native records with licence categories, authorization dates, and status preserved. Use this skill when the user asks for "regulated entity list", "licensed [sector] firms in [country]", "who has a licence", "regulatory perimeter", "sectoral census", "compare authorised firms", or is doing M&A sourcing / competitive-landscape / regulatory-benchmark work.

# Sector Gatekeeper List **List every regulated / licensed entity in a sector, direct from the regulator's register.** ## What you get - **Live regulator register access** where the jurisdiction exposes it freely — Cayman CIMA (all 35 authorization categories from Banking Class A/B to Virtual Asset Service Provider), UK Companies House + (limited) FCA Register, Korean DART (supervised issuers), Hong Kong SFC (via equivalent), Canadian CBCA (federal corps). - **Unmodified native records**: licence reference, authorization type, status, effective dates — field names preserved as the regulator emits them. - **Native category filtering** where the regulator supports type-filter search (CIMA uses `type:` prefix for any of its 35 categories). - **Cross-jurisdiction when needed**: for a global "all licensed crypto brokers" view, chain queries across multiple regulators in parallel. ## Example prompts ``` List every CIMA-authorised Mutual Fund in the Cayman Islands. Split by category (Licenced / Registered / Master / Administered / Limited Investor). ``` ``` Show all Cayman Islands Virtual Asset Service Providers (VASPs) with a current licence. ``` ``` For Korea, list the top 20 listed issuers on KOSPI by most recent annual-report filing date. ``` ## Workflow — CIMA (Cayman) example ### Native type-filter search ``` search_companies({ jurisdiction: "KY", query: "type:Mutual Fund - Registered" }) ``` CIMA's 35 authorization types (from `list_jurisdictions({ jurisdiction: "KY" })`): - **Banking**: Class A, Class B - **Mutual Funds**: Licenced, Registered, Master, Administered, Limited Investor - **Private Fund** - **Mutual Fund Administrators**: Full, Restricted - **Insurance**: Class A/B/C/D Insurer, Insurance Agent, Broker, Manager - **Corporate Services**: Company Manager, Corporate Service Provider - **Money Services** - **Trusts**: Trust, Trust (Controlled Subsidiary), Trust (Registered PTC), Trust (Restricted), Nominee (Trust) - **Building Societies / Credit Unions / Development Bank** - **Portfolio Insurance Company** - **Securities**: Full, Restricted, Registered Person - **Virtual Asset Service Providers**: Licence, Registration Pass any of those as a `type:<category>` prefix. ### Step 2 — Enrich each entity For interesting candidates: ``` get_company_profile({ jurisdiction: "KY", company_id }) ``` Returns the full CIMA record including authorization date, status, address. ### Step 3 — Report - **Category breakdown**: count per authorization type - **Recent authorizations**: entities added in the last 6/12 months - **Cross-reference**: if the user provided an entity name, check if it's on the regulated list ## Workflow — other jurisdictions Not every regulator exposes its register through OpenRegistry. Where native access isn't available, the skill tells the user: - **UK FCA Register**: separate API, not covered by OpenRegistry. Use register.fca.org.uk directly. - **DE BaFin**: BaFin database, separate. Not covered. - **FR ACPR / AMF**: separate registers. Not covered. - **US SEC / FINRA / CFTC**: SEC EDGAR / FINRA BrokerCheck / CFTC list — out of scope. OpenRegistry covers **government company registers**. Financial-supervisor registers are separate systems. Where we pass-through data (CIMA, Korean DART for listed issuers), we use it. ## Provenance & Auditability CIMA records carry: - CIMA reference number (e.g. 77003, 100088) - Authorization type exactly as CIMA lists it - Address as CIMA has it - Status (active / surrendered / revoked) — CIMA's own enum Every listed entity is one click from the CIMA Regulated Entities register for independent verification. ## Jurisdictional scope | Sector | Jurisdiction | Coverage | |---|---|---| | Offshore funds / trust / VASP | Cayman Islands | ✅ full CIMA 35-category index | | Listed issuers (annual / semi-annual / quarterly) | South Korea | ✅ via DART `corp_code` master | | Listed + audit-required | Korea | ✅ DART covers ~3K listed + ~35K audit-required | | Federal-corp census | Canada | ✅ CBCA via ISED | | Hong Kong listed | HK | Partial — live Local + Non-HK Companies via CR | | UK / EU sector registers | GB / EU | Not in OpenRegistry scope — use regulator-specific APIs | ## You might also need - Once you've identified regulated entities, run DD on the top ones → [KYC & Cross-Border Due Diligence](../kyc-cross-border-due-diligence/SKILL.md) - Walk ownership of a regulated entity → [Cross-Border UBO Chain Walker](../ubo-cross-border-chain-walker/SKILL.md) - Compare competitive landscape → [Industry & Competitor Company Search](../industry-competitor-search/SKILL.md) ## Why the data stays fresh CIMA updates its Regulated Entities register in near-real-time as licences are issued / surrendered / revoked; DART updates its corpCode master nightly. Our skill reflects updates the moment the regulator does. **A licence granted this morning is in our result this afternoon.**

Shell Company Detector

Detect shell-company signals from live government registry data — single director, no accounts ever filed, overseas registered-office concentration, no employees, nominee address patterns. Pulls live unmodified registry records and scores the shell-probability. Use this skill when the user asks to "detect shell company", "is this a shell", "AML check", "flag suspicious entity", "money-laundering screening", "sanctions evasion indicator", or is doing compliance / investigation / fraud-research work.

# Shell Company Detector **Score shell-probability from live government registry data — no aggregator "shell flags", the actual raw signals.** ## What you get - **Live multi-signal probe** of every well-known shell-entity indicator, pulled from the government register at query time. - **Unmodified evidence** for every signal: director count, accounts filing history, registered address, employee headcount (from accounts), director multi-company concentration, nominee-address patterns. - **Transparent scoring**: a shell-probability score (0-100) with each signal's contribution shown, so a compliance officer can justify or dispute the conclusion. - **Cross-jurisdiction applicable** — signals are defined generically; per-jurisdiction availability is surfaced. ## Shell signals detected | # | Signal | Why it matters | Data source | |---|---|---|---| | 1 | Single director | Traditional shell indicator — no board oversight | `get_officers` | | 2 | Zero filed accounts (after required date) | Dormant / paper entity | `list_filings(category=accounts)` count | | 3 | Only micro-entity accounts ever filed | Minimal operational activity | `get_company_profile` (accounts type) + filing history | | 4 | Overseas registered office | Cross-border structuring (not necessarily shell but a multiplier) | `get_company_profile` (address) | | 5 | Registered-office address shared by 50+ companies | TCSP / nominee address concentration | Reverse-lookup via `search_companies({ query: "<address>" })` for registries that support it (IE offers this natively) | | 6 | Director holds 10+ appointments | Nominee director pattern | `get_officer_appointments` (GB) | | 7 | PSC and director are the same natural person | Sole-beneficiary structure | `get_persons_with_significant_control` cross-reference with `get_officers` | | 8 | No employees reported in accounts | Paper entity | XBRL `average-number-of-employees` (GB iXBRL accounts) | | 9 | Incorporated <18 months ago + zero filings | Young dormant | `get_company_profile` inc date + filing count | | 10 | Name collision with known shell patterns | Often-reused naming (e.g. "Nominees Ltd", number-only names) | Name regex | ## Example prompts ``` Is UK company 14123456 a shell? Run all signals and score it. ``` ``` Screen this Delaware LLC (we have the name, no ID) for shell-company red flags. How confident can you be with only a name? ``` ``` For this list of 20 UK counterparties, flag any with >3 shell signals. ``` ## Workflow ### Step 1 — Resolve the entity ``` search_companies + get_company_profile ``` ### Step 2 — Signal collection ``` get_officers({ include_resigned: false }) // Signal 1 list_filings({ category: "accounts", limit: 100 }) // Signal 2, 3 get_company_profile (already have) // Signal 4, 9 get_officer_appointments (for each director, GB) // Signal 6 get_persons_with_significant_control // Signal 7 fetch_document on latest accounts → parse employees // Signal 8 ``` For Signal 5 (shared-address reverse lookup): limited native support — IE CRO supports address search via `search_companies(query=<address>)`; for others, the skill reports "Signal 5 unavailable for jurisdiction X" and advises the user to check the address manually via Companies House or equivalent. ### Step 3 — Score Each signal contributes a weight to a 0-100 shell-probability score: - Strong signals (1-3): 20 points each - Multipliers (4-7): 10 points each - Weak signals (8-10): 5 points each Cap at 100. Report **each contributing signal with its evidence**: > **Shell probability: 75/100** > - ✅ Signal 1 (single director): found 1 officer (John Smith, appointed 2024-01) > - ✅ Signal 2 (zero accounts): incorporated 2023-06, no accounts filed (overdue since 2025-03) > - ✅ Signal 4 (overseas registered office): address in Marshall Islands > - ✅ Signal 6 (nominee director pattern): Smith holds 47 other active appointments (via `get_officer_appointments`) > - ❌ Signal 7: no PSC filings at all (insufficient data to check PSC=director match) > - ❌ Signal 8: no accounts → no employee data > - **Total: 20+20+10+10 = 60. Adjusting upward for missing-PSC anomaly (+15 = 75)** ### Step 4 — Cross-link for deeper investigation If shell-probability > 50, suggest follow-ups: - Walk the ownership chain → [Cross-Border UBO Chain Walker](../ubo-cross-border-chain-walker/SKILL.md) - Check the director's other companies → [Director Search & PEP Screening](../director-search-pep-screening/SKILL.md) - Check for phoenix pattern (dissolved predecessor at same address / same director) → [Phoenix Company Radar](../phoenix-company-radar/SKILL.md) ## Provenance & Auditability Every signal is backed by a specific government record cited inline: the officer roster CURL, the filing history entry, the PSC notification record. A compliance officer reviewing the conclusion can verify every signal at the government source. ## Important caveats - **Shell signals ≠ proof of fraud.** Many legitimate holding vehicles tick several of these boxes (e.g. a personal investment SPV may be single-director + micro-entity accounts). The score is a **screening heuristic**, not a verdict. - **Jurisdiction-dependent accuracy**: Signal 6 (cross-company director footprint) is reliable on GB (native `get_officer_appointments`), partial on FR / TW, unavailable elsewhere. Signal 8 (employee count) requires accounts to be filed and parseable (GB iXBRL, KR XBRL — rest may not be parseable from PDF). - **False negatives**: a sophisticated shell with nominee directors rotated regularly, filed accounts showing minimal but non-zero activity, and a non-shared address can score <30. Use the skill as ONE layer in a multi-layer AML pipeline, not the sole check. ## You might also need - Walk ownership upstream → [Cross-Border UBO Chain Walker](../ubo-cross-border-chain-walker/SKILL.md) - Check director's full footprint → [Director Search & PEP Screening](../director-search-pep-screening/SKILL.md) - Detect phoenix pattern → [Phoenix Company Radar](../phoenix-company-radar/SKILL.md) ## Why the data stays fresh Every signal is collected from live `get_*` / `list_filings` calls at query time. When a new filing changes the signals (new director appointed, accounts now overdue → no longer "zero filed"), the next run of the skill reflects it within the government's publication cycle. **No stale score.**