<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: OpenRegistry</title>
    <description>The latest articles on DEV Community by OpenRegistry (@openregistry).</description>
    <link>https://dev.to/openregistry</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3887433%2F5bf952c8-814a-4f0d-be42-3667f94e9592.png</url>
      <title>DEV Community: OpenRegistry</title>
      <link>https://dev.to/openregistry</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/openregistry"/>
    <language>en</language>
    <item>
      <title>Reading Belgium's KBO/CBE registry: what the live API returns</title>
      <dc:creator>OpenRegistry</dc:creator>
      <pubDate>Sun, 31 May 2026 15:02:17 +0000</pubDate>
      <link>https://dev.to/openregistry/reading-belgiums-kbocbe-registry-what-the-live-api-returns-3410</link>
      <guid>https://dev.to/openregistry/reading-belgiums-kbocbe-registry-what-the-live-api-returns-3410</guid>
      <description>&lt;p&gt;Belgium's Crossroads Bank for Enterprises registers exactly ten digits for every active corporate entity. It formats these as a leading zero followed by nine numbers. This is the enterprise number. Every compliance check on a Belgian vendor must resolve to this unique key. Relying on legacy paid databases is risky because their records are frequently months out of date. We need live data from the official KBO/CBE registry of record to satisfy our auditors.&lt;/p&gt;

&lt;p&gt;The raw registry data returned through the OpenRegistry MCP server preserves the exact structure of the Belgian public search. A profile fetch returns the active legal status. This is typically marked as a normal situation or &lt;em&gt;actief&lt;/em&gt; in Dutch. It lists the legal form, which will be an SRL or an SA for most merchants. You also get the registered address alongside the NACEBEL industry activity codes. NACEBEL codes are Belgium's specific extension of the European NACE system. Compliance engines can parse these codes directly. This categorisation helps flag businesses operating in high-risk sectors.&lt;/p&gt;

&lt;p&gt;The Belgian Ultimate Beneficial Owner registry is managed separately by the Federal Public Service Finance. Accessing this register is no longer straightforward. Following the CJEU ruling in cases C-37/20 and C-601/20 on 22 November 2022, public access was shut down [1]. Belgium codified this restriction via the Royal Decree of 8 February 2023. Now, you must prove a legitimate AML interest to query their UBO database. No open MCP tool can bypass this legal lock. We must design our onboarding workflows around this limitation. Our systems retrieve the public KBO record automatically to verify entity status. We then request signed ownership certificates directly from the corporate officers during onboarding.&lt;/p&gt;

&lt;p&gt;Querying the Belgian registry using the OpenRegistry MCP server is highly efficient for developers. You call the server with the standard tools. For basic company lookups, use the company number as the key. This number is universally formatted across Belgian business registries. Here is how a standard tool call is constructed when requesting a profile from the live database:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"name"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"get_company_profile"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"arguments"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"jurisdiction"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"BE"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"company_number"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"0860136460"&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;You can also query the names of registered directors and legal representatives. The KBO lists these individuals with their appointment dates. Use the get_officers tool on the same enterprise number. The response provides the names of individuals who hold signing authority for the company. This is critical for corporate resolution audits. Here is the schema for the directory query:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"name"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"get_officers"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"arguments"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"jurisdiction"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"BE"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"company_number"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"0860136460"&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Our compliance audits require a verifiable link back to the registry of record. We do not use aggregated credit risk reports for identity verification. Regulators expect to see the raw data retrieved directly from KBO/CBE on the exact day of onboarding. Every single lookup is logged with its timestamp. If a merchant is later found to be operating in an unapproved sector, we have the original NACEBEL codes on file. This proof protects our business during annual financial audits.&lt;/p&gt;

&lt;p&gt;Belgian companies often register different name variants in multiple languages. This includes official French and Dutch translations. The KBO stores all of these official translations. A company might register as a Société de Responsabilité Limitée in Wallonia but use Besloten Vennootschap in Flanders. Our systems must capture both name variants to prevent duplicate records in our database. The MCP server returns these multilingual names in the raw profile response. We match them against the merchant's bank account details to reduce false positive alerts.&lt;/p&gt;

&lt;p&gt;The profile response also includes direct links to Moniteur Belge publications. The Moniteur Belge is the official state gazette where Belgian companies publish corporate changes. If we see a mismatch in our automated directors check, our compliance analyst can click the gazette link. This allows them to manually review the scanned PDF of the original deed. This hybrid flow saves hours of research time. It combines automated retrieval with direct access to official sources.&lt;/p&gt;

&lt;p&gt;For KYC engineers looking to integrate live Belgian registry data into their tool chains, the OpenRegistry server provides a reliable route. You can begin querying the KBO/CBE registry and sibling European databases by visiting the documentation at openregistry.sophymarine.com. The anonymous tier allows you to test queries without an upfront signin. This is the fastest way to verify if your compliance systems can handle raw Belgian corporate records.&lt;/p&gt;

</description>
      <category>programming</category>
      <category>kyb</category>
      <category>compliance</category>
      <category>api</category>
    </item>
    <item>
      <title>Analysing Zefix data: tracking Swiss entities via raw registry access</title>
      <dc:creator>OpenRegistry</dc:creator>
      <pubDate>Sat, 30 May 2026 15:01:47 +0000</pubDate>
      <link>https://dev.to/openregistry/analysing-zefix-data-tracking-swiss-entities-via-raw-registry-access-2n0d</link>
      <guid>https://dev.to/openregistry/analysing-zefix-data-tracking-swiss-entities-via-raw-registry-access-2n0d</guid>
      <description>&lt;p&gt;Switzerland's Federal Office of Justice manages Zefix. This is the central company index pointing to twenty-eight distinct cantonal registries. Each Swiss enterprise receives a twelve-character Corporate Identification Number (UID) styled as CHE-123.456.789. This system became mandatory in 2011 to replace fragmented regional numbers. For M&amp;amp;A analysts, mapping these entities means navigating a system that sits completely outside the European Union's regulatory framework.&lt;/p&gt;

&lt;p&gt;Because Switzerland is not an EU member state, its corporate data does not flow through standard European Business Register channels. Financial analysts tracking cross-border subsidiaries often hit stale aggregator caches that fail to capture sudden changes in signatory powers or insolvency proceedings [1]. This lag represents a significant risk during high-value debt restructuring or diligence cycles.&lt;/p&gt;

&lt;h3&gt;
  
  
  The Swiss cantonal split
&lt;/h3&gt;

&lt;p&gt;The central Zefix index collects high-level metadata, but the legal reality of a Swiss corporation lives at the cantonal level. When you query a Swiss business, the primary record resides with regional registries like Zurich, Geneva, or Zug. Zug is particularly critical for commodity trading firms and investment vehicles due to its historical tax advantages.&lt;/p&gt;

&lt;p&gt;A raw data pull from a Swiss entity contains several specific identifiers. The payload includes the UID, the older cantonal registration number, the legal form, and the registered address. The legal form field distinguishes between an Aktiengesellschaft (AG) and a Gesellschaft mit beschränkter Haftung (GmbH). It also includes the active corporate purpose and the current status of the firm.&lt;/p&gt;

&lt;p&gt;Unlike some European neighbours, Switzerland does not maintain a public central register of beneficial owners. The Federal Council continues to debate a centralised transparency register, but beneficial ownership data remains mostly private. This leaves corporate officers with joint or individual signatory authority as the primary indicators of control. These signatory authorities are recorded in the cantonal commercial register, making officer data queries essential for corporate compliance checks.&lt;/p&gt;

&lt;h3&gt;
  
  
  Current integration status
&lt;/h3&gt;

&lt;p&gt;In the OpenRegistry architecture, the direct Swiss registry integration is currently inactive. The &lt;code&gt;/healthz&lt;/code&gt; matrix confirms that direct Zefix lookups via the code &lt;code&gt;CH&lt;/code&gt; are offline. This occurs because Swiss cantonal endpoints update their security schemas and query interfaces independently, which requires periodic maintenance on programmatic connectors.&lt;/p&gt;

&lt;p&gt;For finance professionals mapping international entities, this does not stop corporate tracing. Active neighbouring registries on the OpenRegistry platform, such as Germany, France, Italy, and Liechtenstein, provide clear audit trails for Swiss corporate networks. Many Swiss parent companies operate through French or German subsidiaries. These foreign entities must file public records of their parent holdings and branch offices in their local corporate registers.&lt;/p&gt;

&lt;p&gt;Querying the active German registry often reveals the precise Swiss holding structure through foreign entity disclosures. For example, a search for a German subsidiary reveals the parent's CHE identification number and cantonal seat.&lt;/p&gt;

&lt;h3&gt;
  
  
  Querying Swiss-linked entities through active sibling registries
&lt;/h3&gt;

&lt;p&gt;To perform an asset-tracing or compliance query, developers use the active tool suite to scan neighbouring European jurisdictions. Here is an example of querying a German branch of a Swiss entity using the OpenRegistry MCP server:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"name"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"search_companies"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"arguments"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"jurisdiction"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"DE"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"query"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Swiss Holding GmbH"&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;When the target profile is retrieved, you request the full officer list to verify who holds signing authority over the European operations:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"name"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"get_officers"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"arguments"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"jurisdiction"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"DE"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"company_id"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"DE_HRB_123456"&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This returns the unmodified data fields exactly as they exist in the German registry database. The response lists the managing directors, their residency details, and any Swiss parent entities registered as sole shareholders. Once Swiss direct access is reactivated in a future release, identical tool calls targeting the &lt;code&gt;CH&lt;/code&gt; jurisdiction code will pull the raw records directly from the Zefix index.&lt;/p&gt;

&lt;h3&gt;
  
  
  Why raw data beats caches
&lt;/h3&gt;

&lt;p&gt;Relying on the legacy paid databases for Swiss corporate data introduces compliance risks. Private aggregators scrape cantonal registers at long intervals, often missing temporary corporate suspensions or sudden changes in signatory powers. During an M&amp;amp;A transaction, a single day of lag in discovering a bankruptcy filing can invalidate a contract.&lt;/p&gt;

&lt;p&gt;Using direct registry calls ensures your analysis rests on the official record of the jurisdiction. For developers building KYC tools or automated compliance pipelines, accessing raw, real-time corporate registries across European borders provides a reliable foundation. You can monitor the current live status of the Swiss integration and browse sibling registries on openregistry.sophymarine.com.&lt;/p&gt;

</description>
      <category>programming</category>
      <category>kyb</category>
      <category>compliance</category>
      <category>fintech</category>
    </item>
    <item>
      <title>Finland's YTJ Registry — what the official API actually returns</title>
      <dc:creator>OpenRegistry</dc:creator>
      <pubDate>Wed, 27 May 2026 15:00:35 +0000</pubDate>
      <link>https://dev.to/openregistry/finlands-ytj-registry-what-the-official-api-actually-returns-3ijc</link>
      <guid>https://dev.to/openregistry/finlands-ytj-registry-what-the-official-api-actually-returns-3ijc</guid>
      <description>&lt;p&gt;Finland's Patentti- ja rekisterihallitus (PRH) operates a dual-layer registration architecture that directly affects corporate diligence and KYC integrations. The Finnish Business Information System (YTJ) serves as the main portal. The data retrieved programmatically depends on whether you hit the public trade register or the AML-gated beneficial ownership database. Understanding this boundary is critical for compliance teams designing automated client onboarding workflows.&lt;/p&gt;

&lt;p&gt;PRH maintains a relatively accessible digital infrastructure. However, the legal boundaries of what can be queried without an authenticated, legitimate interest under the EU Anti-Money Laundering Directives (AMLD) remain strict.&lt;/p&gt;

&lt;h3&gt;
  
  
  Structure of the Finnish YTJ payload
&lt;/h3&gt;

&lt;p&gt;When querying a Finnish entity via the OpenRegistry MCP server, you interface with the public YTJ database. This registry indexes limited liability companies (&lt;em&gt;Osakeyhtiö&lt;/em&gt;, or Oy), partnerships, and sole traders.&lt;/p&gt;

&lt;p&gt;A successful query to the Finnish registry returns a structured payload where the raw &lt;code&gt;jurisdiction_data&lt;/code&gt; block preserves the upstream Finnish and Swedish field names. Key fields you will parse from a standard profile lookup include:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  &lt;code&gt;businessId&lt;/code&gt; (&lt;em&gt;Y-tunnus&lt;/em&gt;): The standard Finnish nine-character format (e.g., 1234567-8). This is the primary key for all entity matching.&lt;/li&gt;
&lt;li&gt;  &lt;code&gt;name&lt;/code&gt;: The current registered legal name of the entity.&lt;/li&gt;
&lt;li&gt;  &lt;code&gt;companyForm&lt;/code&gt;: The legal structure, typically returned as Code &lt;code&gt;OY&lt;/code&gt; for standard limited companies.&lt;/li&gt;
&lt;li&gt;  &lt;code&gt;registrationDate&lt;/code&gt;: The date of incorporation.&lt;/li&gt;
&lt;li&gt;  &lt;code&gt;liquidations&lt;/code&gt;: An array containing insolvency, liquidation, or bankruptcy proceedings, which serves as a primary flag for credit and legal risk.&lt;/li&gt;
&lt;li&gt;  &lt;code&gt;addresses&lt;/code&gt;: Historical and current postal and street addresses registered with the PRH.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The raw payload exposes the &lt;code&gt;registeredOffices&lt;/code&gt; and &lt;code&gt;postalAddresses&lt;/code&gt; arrays. YTJ tracks the exact source of each address field—whether it originates from the Tax Administration (&lt;em&gt;Verohallinto&lt;/em&gt;) or the PRH itself. This distinction is vital for service-of-process validation, as only the PRH-registered address carries statutory weight for constructive notice.&lt;/p&gt;

&lt;h3&gt;
  
  
  Statutory boundaries of Finnish beneficial ownership data
&lt;/h3&gt;

&lt;p&gt;Finland transposed the Fifth Anti-Money Laundering Directive (5AMLD) by requiring Finnish companies to file beneficial ownership details (&lt;em&gt;Edunsaajatiedot&lt;/em&gt;) directly with the PRH. Following the Court of Justice of the European Union (CJEU) ruling in joined cases C-37/20 and C-601/20, public access to these registers was constrained.&lt;/p&gt;

&lt;p&gt;In Finland, beneficial ownership information is not public record. Under the Finnish Act on Preventing Money Laundering and Terrorist Financing (444/2017), access to the UBO register is restricted to financial institutions, legal professionals under AML obligations, and those who can prove a specific legal interest.&lt;/p&gt;

&lt;p&gt;Consequently, standard programmatic tool calls targeting the PRH via an unauthenticated gateway will not return the &lt;code&gt;get_persons_with_significant_control&lt;/code&gt; dataset. To build an ownership chain, compliance developers must use the public officer registry to map the board of directors (&lt;em&gt;Hallitus&lt;/em&gt;) and then run secondary verifications. The board members are publicly listed and accessible, providing a starting point for identifying the natural persons exercising control over the legal entity.&lt;/p&gt;

&lt;h3&gt;
  
  
  Querying Finland via OpenRegistry MCP
&lt;/h3&gt;

&lt;p&gt;To fetch a Finnish company profile using the OpenRegistry MCP server, your AI agent or compliance tool issues a direct query using the ISO country code &lt;code&gt;FI&lt;/code&gt;. There is no need to pre-parse or clean the inputs.&lt;/p&gt;

&lt;p&gt;Here is how to structure the search tool call inside an agentic workflow:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"name"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"search_companies"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"arguments"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"jurisdiction"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"FI"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"query"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Nokia Oyj"&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Once you obtain the correct &lt;em&gt;Y-tunnus&lt;/em&gt; (business ID) from the search results, you can retrieve the full profile, including historical addresses, active trade names, and registration status, using the profile tool:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"name"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"get_company_profile"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"arguments"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"jurisdiction"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"FI"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"registration_number"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"0111691-0"&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The returned payload contains the unified OpenRegistry schema fields along with the raw &lt;code&gt;jurisdiction_data&lt;/code&gt; block. This allows your downstream parsers to inspect the exact Finnish taxonomic labels if your compliance logic requires matching local registration codes.&lt;/p&gt;

&lt;h3&gt;
  
  
  Designing resilient compliance flows
&lt;/h3&gt;

&lt;p&gt;For engineers building automated KYB and M&amp;amp;A diligence platforms, relying on stale database dumps is a regulatory liability. The legacy paid databases often serve outdated information. The Finnish trade register changes daily as entities update their representation rights, register auxiliary trade names (&lt;em&gt;Aputoiminimi&lt;/em&gt;), or file for restructuring.&lt;/p&gt;

&lt;p&gt;By leveraging the OpenRegistry MCP server, your systems query the live PRH database at the moment of onboarding. This setup eliminates the discrepancy between cached aggregator data and the official register of record. Because the anonymous tier requires no API key or complex OAuth setup, you can deploy and test this live integration within minutes. For high-volume production compliance pipelines, the paid tiers increase the rate limits and support concurrent queries across multiple European jurisdictions.&lt;/p&gt;

&lt;p&gt;To integrate live Finnish registry checks directly into your tooling, visit the server documentation at openregistry.sophymarine.com.&lt;/p&gt;

</description>
      <category>compliance</category>
      <category>kyb</category>
      <category>mcp</category>
      <category>programming</category>
    </item>
    <item>
      <title>Trace Norwegian shell companies directly via Brønnøysundregistrene API</title>
      <dc:creator>OpenRegistry</dc:creator>
      <pubDate>Tue, 26 May 2026 15:00:52 +0000</pubDate>
      <link>https://dev.to/openregistry/trace-norwegian-shell-companies-directly-via-bronnoysundregistrene-api-4kk8</link>
      <guid>https://dev.to/openregistry/trace-norwegian-shell-companies-directly-via-bronnoysundregistrene-api-4kk8</guid>
      <description>&lt;p&gt;Norway issues every legal entity a nine-digit organisation number starting with 8 or 9. The agency in charge is Brønnøysundregistrene, located in the Arctic Circle town of Brønnøysund. Unlike the opaque registries of the English Channel or the Caribbean, Norway publishes this data under an open licence. Pulling it programmatically without getting lost in nested XML arrays or state-run endpoint quirks requires knowing exactly where the boundaries of public data lie.&lt;/p&gt;

&lt;p&gt;When tracing assets or verifying a corporate entity in Norway, you deal with two overlapping databases. The first is Enhetsregisteret, the Central Coordinating Register for Legal Entities, which registers every organisation from an AS (limited company) to a local chess club. The second is Foretaksregisteret, the Register of Business Enterprises, which records liability, capital, and signatories for commercial entities.&lt;/p&gt;

&lt;p&gt;Through OpenRegistry's MCP server, querying these registers bypasses the stale aggregator caches of legacy paid databases. The raw upstream fields are preserved inside the &lt;code&gt;jurisdiction_data&lt;/code&gt; block, giving you the direct statutory truth.&lt;/p&gt;

&lt;p&gt;When you call &lt;code&gt;get_company_profile&lt;/code&gt; for a Norwegian entity, the response exposes critical forensic fields straight from Brønnøysundregistrene. Look at the &lt;code&gt;jurisdiction_data&lt;/code&gt; payload. You will find:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;registreringsdatoForetaksregisteret&lt;/code&gt;: The date the entity became a commercial enterprise.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;konkursdato&lt;/code&gt;: The date bankruptcy proceedings were initiated, if applicable.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;vedtektsfestetFormaal&lt;/code&gt;: The formal statutory purpose of the company as defined in its articles of association.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;organisasjonsform&lt;/code&gt;: The legal structure, such as "AS" (Aksjeselskap) or "NUF" (Norwegian branch of a foreign company).&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Norway has a specific corporate form called the NUF (Norskregistrert utenlandsk foretak). This is a Norwegian branch of a foreign enterprise, which is a common structure used by offshore entities to operate in the North Sea oil sector. When querying a NUF via &lt;code&gt;get_company_profile&lt;/code&gt;, the &lt;code&gt;jurisdiction_data&lt;/code&gt; block contains the field &lt;code&gt;registreringsnummerIHjemland&lt;/code&gt; (registration number in the home country). This single field allows investigators to link the Norwegian branch directly back to its origin jurisdiction, whether that is Delaware, the United Kingdom, or Cyprus.&lt;/p&gt;

&lt;p&gt;Unlike jurisdictions that hide historic officer changes behind paywalls, Norway's register makes board compositions accessible. When you execute the &lt;code&gt;get_officers&lt;/code&gt; tool, you receive structural roles mapped directly to their actual titles: &lt;code&gt;styretsleder&lt;/code&gt; (board chair), &lt;code&gt;daglig leder&lt;/code&gt; (general manager), and &lt;code&gt;revisor&lt;/code&gt; (auditor).&lt;/p&gt;

&lt;p&gt;Norway is transparent, but it is not entirely open. You must navigate three distinct legal and technical boundaries.&lt;/p&gt;

&lt;p&gt;First, national identity numbers are strictly redacted from public APIs. You can see names and birth years of directors, but never the full unique personal identifier unless you have a statutory right to log in via domestic authentication systems. Second, beneficial ownership tracking has changed. Following the Court of Justice of the European Union (CJEU) ruling on UBO registers, public access to the Register of Beneficial Owners (Registeret for reelle rettighetshavere) has become restricted. While OpenRegistry can retrieve public officer lists via &lt;code&gt;get_officers&lt;/code&gt;, the deep AML-gated beneficial owner registers require specific legal credentials. Third, physical copies of filings must be ordered via the registry's webshop for a fee. The raw API endpoints provide metadata and filing dates, but not the physical PDFs of vintage filings.&lt;/p&gt;

&lt;p&gt;To trace a suspected Norwegian holding structure, you begin with a search. The &lt;code&gt;search_companies&lt;/code&gt; tool accepts either the nine-digit organisation number or a name string:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"name"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"search_companies"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"arguments"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"jurisdiction"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"NO"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"query"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Equinor"&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Once you have the precise organisation number, you can query the full profile. The &lt;code&gt;get_company_profile&lt;/code&gt; tool retrieves the active registration details:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"name"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"get_company_profile"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"arguments"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"jurisdiction"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"NO"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"registration_number"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"923609016"&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;To reconstruct the corporate hierarchy and identify who is signing off on transactions, you pull the officer registry. This list maps out the executive and non-executive board:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"name"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"get_officers"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"arguments"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"jurisdiction"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"NO"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"registration_number"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"923609016"&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;While the raw PDFs of annual accounts (årsregnskap) are stored in a separate registry, you can still trace the list of filings using &lt;code&gt;list_filings&lt;/code&gt;. This tool returns the date and type of each submission, allowing you to see when the company last updated its articles or changed its auditor. A sudden change of an auditor (&lt;code&gt;revisor&lt;/code&gt;) or a prolonged delay in submitting the accounts is a classic warning sign.&lt;/p&gt;

&lt;p&gt;This direct access changes how cross-border investigations are structured. Instead of waiting for third-party compliance platforms to normalise and upload data weeks after a filing occurs, you can trigger these tools directly inside your terminal or investigative assistant. If a corporate shell points to a Norwegian AS, you can confirm its active status and current board members in less than three seconds. To test these queries without credentials or configuration delays, query the endpoint directly at openregistry.sophymarine.com.&lt;/p&gt;

</description>
      <category>api</category>
      <category>kyb</category>
      <category>compliance</category>
      <category>opensource</category>
    </item>
    <item>
      <title>Mapping Polish company structures: querying KRS direct via API</title>
      <dc:creator>OpenRegistry</dc:creator>
      <pubDate>Mon, 25 May 2026 15:00:36 +0000</pubDate>
      <link>https://dev.to/openregistry/mapping-polish-company-structures-querying-krs-direct-via-api-7i4</link>
      <guid>https://dev.to/openregistry/mapping-polish-company-structures-querying-krs-direct-via-api-7i4</guid>
      <description>&lt;p&gt;Cross-border subsidiary tracing on a Polish logistics target highlighted the systemic delay built into global corporate data aggregators. The legacy paid databases listed the Warsaw parent company as active but showed zero ownership modifications for over eighteen months. In reality, the Krajowy Rejestr Sądowy (KRS) had recorded a significant capital increase and registered a pledge on outstanding shares in mid-March. Relying on cached aggregator datasets almost mispriced our M&amp;amp;A diligence window because we missed the newly introduced collateral.&lt;/p&gt;

&lt;p&gt;Poland’s KRS operates on a strict, transactional legal basis. Unlike jurisdictions where updates filter through slowly, Polish corporate events are only legally binding once they are entered into the court register. Relying on scraped data dumps is a substantial risk during pre-acquisition checks. Using a direct, live link to the KRS is the only way to avoid acting on stale disclosures.&lt;/p&gt;

&lt;h3&gt;
  
  
  KRS API Data Models
&lt;/h3&gt;

&lt;p&gt;When you pull a profile using the Krajowy Rejestr Sądowy, the JSON structure reflects the precise legal anatomy of Polish entities. The raw &lt;code&gt;jurisdiction_data&lt;/code&gt; block is divided into explicit sections reflecting the official court record. The standard registry payload exposes several critical details:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;NIP and REGON identifiers:&lt;/strong&gt; These are the national tax identification and statistical numbers. Polish entities cannot operate without them, and they serve as absolute anchors for cross-checking tax history.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Capital structure details:&lt;/strong&gt; The registry outputs exact nominal values, including &lt;code&gt;wysokoscKapitaluZakladowego&lt;/code&gt; (the share capital amount) and its currency. It also tracks the total number of issued shares.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;The division registry type:&lt;/strong&gt; Polish entities fall under either Register "P" (przedsiębiorcy for commercial businesses) or Register "S" (stowarzyszenia for associations, foundations, and public health entities).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Direct and proxy representation:&lt;/strong&gt; The &lt;code&gt;reprezentacja&lt;/code&gt; section lists the board members alongside their official roles and their specific representation rules (&lt;code&gt;sposob_reprezentacji&lt;/code&gt;), which dictate exactly who must sign to bind the company.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Historical court identifiers:&lt;/strong&gt; The &lt;code&gt;wydzial&lt;/code&gt; fields indicate which district court holds the physical files. This is invaluable if you need to dispatch a local agent to retrieve paper records.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Polish Registry Boundaries
&lt;/h3&gt;

&lt;p&gt;While the commercial registry is highly transparent about board members and historical company changes, it does not function as an all-encompassing compliance database. Poland has strict operational boundaries:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;UBO Gating:&lt;/strong&gt; Ultimate Beneficial Owner (UBO) information is housed in the Centralny Rejestr Beneficjentów Rzeczywistych (CRBR). Following the CJEU C-601/20 ruling on privacy, this data is kept separate from the open-access KRS company profile APIs. You will not find direct beneficial ownership charts embedded within the standard company profile.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Financial Filings PDFs:&lt;/strong&gt; While the registry tracks whether financial statements have been submitted, the raw XML or PDF copies of these statements reside in the separate Repozytorium Dokumentów Finansowych (RDF). The commercial registry provides metadata about the filing, but accessing the documents themselves requires target-specific paths.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Sanctions list status:&lt;/strong&gt; The KRS does not offer domestic sanctions checks. You will need to query the Ministry of Interior and Administration (MSWiA) list separately to screen for designated entities.&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  Querying KRS Programmatically Using MCP
&lt;/h3&gt;

&lt;p&gt;To bypass stale aggregator tables, you can issue real-time tool calls directly to the court register. This raw, live access runs without intermediate caching, delivering the exact records held by the Ministry of Justice.&lt;/p&gt;

&lt;p&gt;To locate a Polish target, run a localized search command using the official identifier format:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"name"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"search_companies"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"arguments"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"q"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Zabka Polska"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"jurisdiction"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"PL"&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Once you have the ten-digit KRS number, you can query the direct court file. This step extracts the active administrative structure, board of directors, and official legal address:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"name"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"get_company_profile"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"arguments"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"company_id"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"0000414000"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"jurisdiction"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"PL"&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This tool call hits Poland's live court register database. The response returns the original nested Polish registry attributes inside the &lt;code&gt;jurisdiction_data&lt;/code&gt; key, giving your automated agents the raw, unparsed material required to verify signing authorities and actual share values.&lt;/p&gt;

&lt;h3&gt;
  
  
  Corporate Status Verification
&lt;/h3&gt;

&lt;p&gt;In-house corporate development demands direct-from-source precision. When constructing a cross-border corporate structure, discovering a silent partner or an undisclosed court-appointed administrator too late can scuttle a transaction entirely. Incorporating the live Polish register into your automation helps clear regulatory hurdles before drafting the term sheet. Integrating the open-source registry server into your workflow ensures your compliance engine works with the exact legal state registered in Warsaw, rather than a weeks-old copy.&lt;/p&gt;

&lt;p&gt;To run zero-signup testing across any of the 27 supported jurisdictions, configure your AI development client with the open registry server endpoint at openregistry.sophymarine.com.&lt;/p&gt;

</description>
      <category>mcp</category>
      <category>kyb</category>
      <category>compliance</category>
      <category>api</category>
    </item>
    <item>
      <title>Programmatic KYB in the Netherlands: What the KVK API actually reveals</title>
      <dc:creator>OpenRegistry</dc:creator>
      <pubDate>Sun, 24 May 2026 15:01:00 +0000</pubDate>
      <link>https://dev.to/openregistry/programmatic-kyb-in-the-netherlands-what-the-kvk-api-actually-reveals-18jn</link>
      <guid>https://dev.to/openregistry/programmatic-kyb-in-the-netherlands-what-the-kvk-api-actually-reveals-18jn</guid>
      <description>&lt;p&gt;A Dutch company registration number (KVK nummer) contains exactly eight digits, issued by the Kamer van Koophandel. For automated merchant onboarding, this number is the single source of truth. Relying on stale database aggregators to verify Dutch BVs often leads to false negatives. The Dutch corporate registry changes daily. Legal restructurings and address changes happen constantly. Stale records will fail audits.&lt;/p&gt;

&lt;p&gt;Retrieving live registry data directly from the official source is the only defensible verification method. When your system queries the KVK registry programmatically, you receive raw data structures that demand precise parsing.&lt;/p&gt;

&lt;h3&gt;
  
  
  Structuring raw Dutch registry payloads
&lt;/h3&gt;

&lt;p&gt;The standard payload returned from a live KVK query contains specific administrative fields that compliance workflows must handle. Unlike other jurisdictions that abstract these values, retrieving the raw &lt;code&gt;jurisdiction_data&lt;/code&gt; preserves the original Dutch legal taxonomy. This preservation is critical for accurate risk scoring.&lt;/p&gt;

&lt;p&gt;The core fields returned during a lookup include:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;kvkNummer&lt;/code&gt;: The definitive eight-digit identifier.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;rsin&lt;/code&gt;: The Rechtspersonen en Samenwerkingsverbanden Informatie Nummer, used for tax and legal identification.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;statutaireNaam&lt;/code&gt;: The formal name registered in the articles of incorporation.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;handelsnamen&lt;/code&gt;: An array of trade names under which the entity operates.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;rechtsvorm&lt;/code&gt;: The legal structure, such as a Besloten Vennootschap (BV).&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;When performing a search, your system will use the &lt;code&gt;search_companies&lt;/code&gt; tool. A typical payload contains both the active trade names and the historical legal names. This helps compliance teams resolve discrepancies where a merchant operates under a brand different from their legal entity name.&lt;/p&gt;

&lt;p&gt;Different legal structures in the Netherlands dictate different reporting requirements. A Besloten Vennootschap (BV) has strict registration rules. By contrast, a Vennootschap onder firma (VOF) operates under a partnership model. When parsing the &lt;code&gt;rechtsvorm&lt;/code&gt; field, your compliance engine must route the onboarding flow down different risk paths. A partnership might not register directors in the same format as a BV, requiring you to adapt your parsing logic.&lt;/p&gt;

&lt;h3&gt;
  
  
  Navigating the post-CJEU UBO landscape
&lt;/h3&gt;

&lt;p&gt;A European Court of Justice ruling in 2022 dismantled public access to Ultimate Beneficial Owner (UBO) registers across the European Union. In response, the KVK immediately restricted public access to the Dutch UBO register. Today, compliance teams cannot programmatically extract the complete ownership chain of a Dutch entity using public tools.&lt;/p&gt;

&lt;p&gt;This limitation forces a trade-off. While you can verify that an entity is active and retrieve its legal representatives via the registry, resolving the exact ownership percentages of shareholders holding over 25 percent requires alternative verification steps. Compliance officers must collect self-attested corporate charts from the customer during onboarding. You then cross-reference the active directors found in the registry to confirm authorization.&lt;/p&gt;

&lt;p&gt;The standard officer tools, such as &lt;code&gt;get_officers&lt;/code&gt;, return the registered board members and legal representatives where the KVK public registry exposes them. This lookup confirms whether the individual signing a contract actually holds the legal authority to bind the company.&lt;/p&gt;

&lt;h3&gt;
  
  
  Implementing KVK lookup tools
&lt;/h3&gt;

&lt;p&gt;Integrating these checks into an automated compliance flow requires standardisation. The OpenRegistry MCP server provides direct, real-time access to the KVK without intermediary parsing, delivering the raw upstream fields directly to your internal decision engines.&lt;/p&gt;

&lt;p&gt;To initiate a search for a Dutch company by name, the assistant executes the &lt;code&gt;search_companies&lt;/code&gt; tool with the appropriate country filter:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"name"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Acme Netherlands"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"jurisdiction"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"NL"&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Once you identify the correct entity, you can pull the registry profile using the unique registration identifier. Call the &lt;code&gt;get_company_profile&lt;/code&gt; tool:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"company_id"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"12345678"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"jurisdiction"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"NL"&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This call hits the live registry of record in real time. It bypasses the stale caches typical of legacy paid databases. This ensures that your compliance logs reflect the exact state of the KVK database at the millisecond of onboarding.&lt;/p&gt;

&lt;h3&gt;
  
  
  Ensuring an audit trail for regulators
&lt;/h3&gt;

&lt;p&gt;Internal auditors and external regulators expect a clear provenance for every corporate check. Screenshots of registry web portals are no longer sufficient for automated high-volume onboarding environments. Your system must store the raw JSON payload alongside a timestamp. This proves that the company was active and registered at the time of transaction approval.&lt;/p&gt;

&lt;p&gt;By maintaining direct lookups, compliance teams can confidently defend their Know Your Business (KYB) decisions during regulatory reviews. To integrate live Dutch registry access into your own automated compliance workflows without signing up for complex contracts, you can get started directly by using openregistry.sophymarine.com today.&lt;/p&gt;

</description>
      <category>programming</category>
      <category>kyc</category>
      <category>kyb</category>
      <category>compliance</category>
    </item>
    <item>
      <title>Querying Spain's Registro Mercantil: how to parse BORME data via MCP</title>
      <dc:creator>OpenRegistry</dc:creator>
      <pubDate>Sat, 23 May 2026 15:00:37 +0000</pubDate>
      <link>https://dev.to/openregistry/querying-spains-registro-mercantil-how-to-parse-borme-data-via-mcp-532j</link>
      <guid>https://dev.to/openregistry/querying-spains-registro-mercantil-how-to-parse-borme-data-via-mcp-532j</guid>
      <description>&lt;p&gt;Spain's corporate registry network distributes company filings across local provincial databases. The central Registro Mercantil Central in Madrid acts as an oversight body, but the records reside locally. Every registered Spanish company carries a unique nine-character Número de Identificación Fiscal (NIF). The leading character of this tax number indicates the corporate form. A "B" denotes a limited liability company (Sociedad de Responsabilidad Limitada). An "A" signals a public limited company (Sociedad Anónima). By law, any corporate filing or change only becomes opposable to third parties once published in the Boletín Oficial del Registro Mercantil (BORME).&lt;/p&gt;

&lt;p&gt;For analysts and compliance officers conducting M&amp;amp;A diligence, querying these provincial databases directly is the only way to guarantee data integrity. Relying on cached data from the legacy paid databases risks missing recent management changes or insolvency filings. The OpenRegistry Model Context Protocol (MCP) server connects directly to these official sources. This connection enables AI assistants and programmatic workflows to query live Spanish registry records.&lt;/p&gt;

&lt;h3&gt;
  
  
  Raw registry payload structure
&lt;/h3&gt;

&lt;p&gt;When you query a Spanish entity, the registry returns provincial filings alongside basic company identifiers. The OpenRegistry MCP server delivers this raw payload inside the &lt;code&gt;jurisdiction_data&lt;/code&gt; object. It leaves the schema intact.&lt;/p&gt;

&lt;p&gt;The JSON payload contains several key fields:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  &lt;code&gt;nif&lt;/code&gt;: The registered tax identification number.&lt;/li&gt;
&lt;li&gt;  &lt;code&gt;denominacion&lt;/code&gt;: The official registered name of the corporation.&lt;/li&gt;
&lt;li&gt;  &lt;code&gt;provincia&lt;/code&gt;: The provincial registry office holding the company’s books.&lt;/li&gt;
&lt;li&gt;  &lt;code&gt;estado&lt;/code&gt;: The legal status of the company.&lt;/li&gt;
&lt;li&gt;  &lt;code&gt;actos_inscritos&lt;/code&gt;: The chronological ledger of gazetted acts published in the BORME.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The &lt;code&gt;actos_inscritos&lt;/code&gt; array provides crucial compliance data. Each item includes a publication date, a section code, and a description of the corporate action. These events include capital modifications, director appointments, or dissolution proceedings. Capital markets teams use this array to build a verified timeline of corporate changes directly from the primary source.&lt;/p&gt;

&lt;h3&gt;
  
  
  The CJEU ruling and beneficial ownership
&lt;/h3&gt;

&lt;p&gt;Following the Court of Justice of the European Union (CJEU) ruling in joined cases C-37/20 and C-601/20, access to ultimate beneficial ownership (UBO) databases changed across Europe. Spain codifies these restrictions strictly. Access to the Registro de Titularidades Reales is legally gated. Only entities demonstrating a statutory legitimate interest can query it. This includes financial institutions, notary publics, and law enforcement executing anti-money laundering (AML) tasks.&lt;/p&gt;

&lt;p&gt;Because of these rules, no public API can return automated Spanish UBO data. OpenRegistry operates within these regulatory boundaries. The tools return public officers, administrators, and historical gazette filings. They do not bypass statutory AML gates. If a data vendor claims to offer instant, ungated Spanish UBO data, they are serving stale, scraped databases. Or they are using probabilistic estimates instead of live registry records.&lt;/p&gt;

&lt;h3&gt;
  
  
  Querying the registry via MCP
&lt;/h3&gt;

&lt;p&gt;To find a Spanish entity, invoke the &lt;code&gt;search_companies&lt;/code&gt; tool with the &lt;code&gt;ES&lt;/code&gt; jurisdiction code. Searching by NIF provides the most direct match. Name queries are also supported.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"name"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"search_companies"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"arguments"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"query"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"B88123456"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"jurisdiction"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"ES"&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Once you have the registration identifier from the search results, query the profile details using the &lt;code&gt;get_company_profile&lt;/code&gt; tool to retrieve the current state of the company.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"name"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"get_company_profile"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"arguments"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"company_id"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"ES-B88123456"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"jurisdiction"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"ES"&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This request connects directly to the provincial registry system to fetch the company's standing, registered address, and gazetted BORME filings. The integration bypasses middle-tier databases, keeping your compliance trail clean and verifiable.&lt;/p&gt;

&lt;h3&gt;
  
  
  Verification workflows for finance teams
&lt;/h3&gt;

&lt;p&gt;For analysts checking acquisition targets or compliance officers assessing counterparties, live data prevents transaction errors. When a Spanish counterparty changes its sole administrator or reduces its share capital, global corporate aggregators often take weeks to reflect the update.&lt;/p&gt;

&lt;p&gt;Integrating the BORME gazette timeline into your analytical platform lets your team verify active signers before executing agreements. This approach mitigates risk and aligns with European diligence standards. To query the Spanish registry alongside 26 other national jurisdictions without API key barriers, point your client to openregistry.sophymarine.com and start the server.&lt;/p&gt;

</description>
      <category>compliance</category>
      <category>mcp</category>
      <category>fintech</category>
      <category>programming</category>
    </item>
    <item>
      <title>Italy’s Registro delle Imprese via BRIS: fields returned</title>
      <dc:creator>OpenRegistry</dc:creator>
      <pubDate>Thu, 21 May 2026 15:03:55 +0000</pubDate>
      <link>https://dev.to/openregistry/italys-registro-delle-imprese-via-bris-fields-returned-372b</link>
      <guid>https://dev.to/openregistry/italys-registro-delle-imprese-via-bris-fields-returned-372b</guid>
      <description>&lt;p&gt;Italian company filings sit in a distributed register run by the chambers of commerce. Unioncamere coordinates the network. The EU Business Registers Interconnection System (BRIS) then publishes the cross‑border slice. Each company record carries two numbers: a provincial REA identifier and a national fiscal code. Query an Italian company through software and both usually appear immediately.&lt;/p&gt;

&lt;h3&gt;
  
  
  A register run through the chambers of commerce
&lt;/h3&gt;

&lt;p&gt;The Registro delle imprese is set out in the Italian Civil Code and administered by the Camere di Commercio. Every chamber maintains the legal record for companies within its province. Those provincial databases feed the national system.&lt;/p&gt;

&lt;p&gt;BRIS republishes a restricted EU dataset required by Directive (EU) 2017/1132. Restricted is the key word. The BRIS layer does not expose the entire chamber archive. Only the statutory fields intended for cross‑border disclosure leave Italy through that channel.&lt;/p&gt;

&lt;p&gt;That separation carries legal weight. Statutory notice attaches to filings accepted by the chamber register itself. BRIS distributes the information across the Union but it is not the place where registration legally occurs. Software that queries BRIS therefore reads the harmonised disclosure layer used for European company lookups.&lt;/p&gt;

&lt;h3&gt;
  
  
  Fields that come back through BRIS
&lt;/h3&gt;

&lt;p&gt;A typical Italian company profile returned through the MCP interface exposes several identifiers that compliance teams recognise straight away.&lt;/p&gt;

&lt;p&gt;Near the top sits the &lt;strong&gt;REA number&lt;/strong&gt; (Repertorio Economico Amministrativo). This identifier links the entity to its provincial chamber entry. Investigations often begin there. The number anchors the company to a specific chamber office and its filings.&lt;/p&gt;

&lt;p&gt;Another field is the &lt;strong&gt;codice fiscale&lt;/strong&gt;. For companies it usually matches the VAT number. Across datasets it behaves as the most stable reference because the same code appears in tax records as well as corporate filings.&lt;/p&gt;

&lt;p&gt;The registered office appears as a structured address within the BRIS payload. The upstream Italian entry normally includes municipality and province codes embedded in the jurisdiction fields. When OpenRegistry returns the raw &lt;code&gt;jurisdiction_data&lt;/code&gt;, those source values remain visible. No translation layer sits in between.&lt;/p&gt;

&lt;p&gt;Legal form is another useful signal. Italian entries use abbreviations such as &lt;em&gt;S.r.l.&lt;/em&gt; or &lt;em&gt;S.p.A.&lt;/em&gt;. Each abbreviation maps to a company type defined in the Civil Code. Registries tend to store the value exactly as filed rather than converting it into another language.&lt;/p&gt;

&lt;p&gt;Officer data arrives through the filings record. Directors and legal representatives appear as officers linked to the company entry. Titles usually remain in Italian. Small detail, real impact. The legal meaning of a role often depends on the precise wording recorded in the registry.&lt;/p&gt;

&lt;h3&gt;
  
  
  Gaps and legally gated data
&lt;/h3&gt;

&lt;p&gt;Beneficial ownership is the largest gap right now. Legislative Decree 55/2022 created the central &lt;em&gt;titolare effettivo&lt;/em&gt; register to meet EU transparency rules. Public access did not last long. The Court of Justice of the European Union ruled on the issue in Joined Cases C‑37/20 and C‑601/20.&lt;/p&gt;

&lt;p&gt;Following that judgment, access rules tightened across several member states. Italy followed the same path. Orders from the Consiglio di Stato late in 2024 kept the public portal restricted while a new legitimate‑interest regime is prepared.&lt;/p&gt;

&lt;p&gt;The result is simple. Programmatic access to UBO filings is not available through BRIS. OpenRegistry cannot surface what the upstream system does not publish.&lt;/p&gt;

&lt;p&gt;Practitioners often fall back on chamber extracts known as a &lt;em&gt;visura camerale&lt;/em&gt;. These documents come directly from the chamber record. They may include shareholder details or historical governance data that never travels through the EU interoperability layer.&lt;/p&gt;

&lt;p&gt;Document access has similar limits. Some filings exist only as chamber PDFs. BRIS may publish a filing reference yet omit the document file itself. The metadata appears. The scan does not.&lt;/p&gt;

&lt;h3&gt;
  
  
  Querying it through the MCP server
&lt;/h3&gt;

&lt;p&gt;OpenRegistry exposes the Italian register through the same MCP interface used for the other jurisdictions on the server. The pattern is straightforward. Run a search. Then request the profile using the company number returned.&lt;/p&gt;

&lt;p&gt;Example search:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="err"&gt;search_companies(&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"jurisdiction"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"IT"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"query"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"ENI S.P.A."&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="err"&gt;)&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The response includes the identifier assigned by the chamber record. That value feeds directly into the next call.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="err"&gt;get_company_profile(&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"jurisdiction"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"IT"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"company_number"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"00905811006"&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="err"&gt;)&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Officer data can be requested separately when BRIS publishes it.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="err"&gt;get_officers(&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"jurisdiction"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"IT"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"company_number"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"00905811006"&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="err"&gt;)&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Filings metadata follows the same structure.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="err"&gt;list_filings(&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"jurisdiction"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"IT"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"company_number"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"00905811006"&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="err"&gt;)&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Each response contains the harmonised EU fields together with the original Italian payload stored inside &lt;code&gt;jurisdiction_data&lt;/code&gt;. That raw block often includes chamber identifiers or classification codes that receive little attention in the official BRIS notes.&lt;/p&gt;

&lt;h3&gt;
  
  
  Practical use in diligence
&lt;/h3&gt;

&lt;p&gt;Cross‑border M&amp;amp;A work often begins with a basic question: which Italian entity actually signed the agreement. The chamber record answers that quickly. It confirms legal existence, the registered office, and the individuals listed as legal representatives.&lt;/p&gt;

&lt;p&gt;Sanctions and AML teams start from the same entry when mapping control. Even without public UBO access, the officer list and filing trail can hint at influence. Repeated directors across related firms. Representatives appearing in nominee roles. Patterns emerge.&lt;/p&gt;

&lt;p&gt;Journalists use the identifiers differently. The REA number and fiscal code act as bridges when linking Italian companies to foreign subsidiaries disclosed through BRIS. One number opens the door to another dataset.&lt;/p&gt;

&lt;p&gt;Developers building compliance tooling usually focus on a smaller detail. OpenRegistry preserves the raw Italian registry fields instead of rewriting them into a simplified schema. That choice avoids the data loss common in the legacy paid databases and leaves interpretation to the client.&lt;/p&gt;

&lt;p&gt;OpenRegistry exposes the Italian BRIS dataset alongside 27 other national company registers through one MCP endpoint. Documentation and connection details sit at &lt;a href="https://openregistry.sophymarine.com" rel="noopener noreferrer"&gt;https://openregistry.sophymarine.com&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>programming</category>
      <category>mcp</category>
      <category>compliance</category>
      <category>legaltech</category>
    </item>
    <item>
      <title>Germany’s Handelsregister via API: what the record actually shows</title>
      <dc:creator>OpenRegistry</dc:creator>
      <pubDate>Wed, 20 May 2026 15:03:19 +0000</pubDate>
      <link>https://dev.to/openregistry/germanys-handelsregister-via-api-what-the-record-actually-shows-3a8e</link>
      <guid>https://dev.to/openregistry/germanys-handelsregister-via-api-what-the-record-actually-shows-3a8e</guid>
      <description>&lt;p&gt;Every German company receives a court file number. A Berlin GmbH may appear as &lt;strong&gt;HRB 123456 B&lt;/strong&gt;. Those letters indicate the register type and the local court, the Registergericht, that keeps the file. Germany has no single nationwide companies database. Each regional court maintains its own section of the Handelsregister and republishes notices through federal portals.&lt;/p&gt;

&lt;p&gt;This layout shapes investigative work. A shell chain touching Hamburg and Bavaria means reading entries written by different courts, each with its own formatting habits. The legal framework stays standard. The presentation does not.&lt;/p&gt;

&lt;p&gt;OpenRegistry queries the register endpoints used by those courts and returns the raw entry they publish. No aggregation layer sits in between. The response carries a &lt;code&gt;jurisdiction_data&lt;/code&gt; block that reflects the court output line for line.&lt;/p&gt;

&lt;h3&gt;
  
  
  What the Handelsregister record actually contains
&lt;/h3&gt;

&lt;p&gt;The core company profile exposes fields reporters often rely on when tracing control or mapping a corporate chain.&lt;/p&gt;

&lt;p&gt;• &lt;code&gt;register_number&lt;/code&gt; — the HRB or HRA number issued by the court. HRB denotes corporations such as GmbH or AG. HRA denotes partnerships such as KG.&lt;/p&gt;

&lt;p&gt;• &lt;code&gt;register_court&lt;/code&gt; — the court responsible for the entry, for instance &lt;code&gt;Amtsgericht München&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;• &lt;code&gt;company_name&lt;/code&gt; — the legal name exactly as filed.&lt;/p&gt;

&lt;p&gt;• &lt;code&gt;legal_form&lt;/code&gt; — GmbH, AG, UG (haftungsbeschränkt), KG, along with other legal forms recognised by German company law.&lt;/p&gt;

&lt;p&gt;• &lt;code&gt;registered_address&lt;/code&gt; and &lt;code&gt;city&lt;/code&gt; — the statutory seat, known as the Sitz.&lt;/p&gt;

&lt;p&gt;Within &lt;code&gt;jurisdiction_data&lt;/code&gt; you often see the original German labels carried over from the register. &lt;code&gt;Sitz&lt;/code&gt; marks the legal seat. &lt;code&gt;Gegenstand des Unternehmens&lt;/code&gt; describes the declared business activity. &lt;code&gt;Vertretungsbefugnis&lt;/code&gt; explains how directors may represent the company in legal acts. Some entries specify that two managing directors must act together. That detail matters when verifying contracts or signatures.&lt;/p&gt;

&lt;p&gt;Officer data comes from the same court record. A &lt;code&gt;get_officers&lt;/code&gt; query usually returns managing directors for a GmbH or the Vorstand for an AG. The raw strings often include role titles such as &lt;code&gt;Geschäftsführer&lt;/code&gt; or &lt;code&gt;Vorstand&lt;/code&gt;. Anyone who needs structured role categories can extract them from those fragments in code.&lt;/p&gt;

&lt;p&gt;Filings surface through the publication stream attached to the register entry. These notices include amendments to articles of association, director appointments, or changes to share capital. Many reference supporting documents such as the &lt;strong&gt;Gesellschafterliste&lt;/strong&gt;. That shareholder list is often the only direct signal of ownership inside the Handelsregister itself.&lt;/p&gt;

&lt;h3&gt;
  
  
  What the registry does not give you
&lt;/h3&gt;

&lt;p&gt;Corporate transparency in Germany sits across several registries rather than one system. The Handelsregister records formal corporate facts. Beneficial ownership belongs to the &lt;strong&gt;Transparenzregister&lt;/strong&gt;. Access changed after the Court of Justice of the European Union ruling in case C‑601/20. Public access closed in 2022. Journalists can still request extracts in certain cases, though the process now requires identity checks and a declared interest.&lt;/p&gt;

&lt;p&gt;Because of that split, the Handelsregister does not expose UBO data in its public entries. A dataset similar to &lt;code&gt;get_persons_with_significant_control&lt;/code&gt; does not exist in this register.&lt;/p&gt;

&lt;p&gt;Another limitation involves shareholder structure. The Gesellschafterliste normally arrives as a PDF attached to the filing record. The court logs that the document was submitted. It does not convert each shareholder row into machine‑readable fields. Anyone who needs ownership percentages has to retrieve the document and read it directly or run their own parser.&lt;/p&gt;

&lt;p&gt;Historical coverage also differs between courts. Some began digitising older files early. Others only publish modern filings through their online interfaces. Activity before 2007 often appears as scanned paperwork rather than structured entries.&lt;/p&gt;

&lt;h3&gt;
  
  
  Querying the German register through MCP
&lt;/h3&gt;

&lt;p&gt;An assistant connected to the OpenRegistry MCP server can query the German register directly. Start with a company search.&lt;/p&gt;

&lt;p&gt;Example tool call:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="err"&gt;search_companies(&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"jurisdiction"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"DE"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"query"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Wirecard AG"&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="err"&gt;)&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The result returns candidate matches with their HR numbers and the relevant court. Once you have the register number, request the full profile.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="err"&gt;get_company_profile(&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"jurisdiction"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"DE"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"company_number"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"HRB 195317"&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="err"&gt;)&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Officer data comes from the same file.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="err"&gt;get_officers(&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"jurisdiction"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"DE"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"company_number"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"HRB 195317"&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="err"&gt;)&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Corporate changes appear through the filing history.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="err"&gt;list_filings(&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"jurisdiction"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"DE"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"company_number"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"HRB 195317"&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="err"&gt;)&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;If a filing references a document such as a Gesellschafterliste, fetch it with &lt;code&gt;fetch_document&lt;/code&gt; using the identifier returned in the filings list.&lt;/p&gt;

&lt;h3&gt;
  
  
  Field notes from the German system
&lt;/h3&gt;

&lt;p&gt;German corporate records reward slow reading. A director resignation may appear as a dense block of legal prose instead of a clean event record. Courts often publish the change notice in the register first. The same wording later shows up in the Unternehmensregister announcement feed.&lt;/p&gt;

&lt;p&gt;This pattern matters in cross‑border reporting. Investigations touching Austria, Liechtenstein, or Cyprus often rely on German entries for the local picture. The Handelsregister typically lists the managing directors and the statutory seat. Ownership sometimes sits one jurisdiction higher.&lt;/p&gt;

&lt;p&gt;Another detail involves timing around the shareholder list. A GmbH must submit a revised Gesellschafterliste when ownership changes. Delays still happen. During the Wirecard collapse, reporters compared several versions of those lists to see which investors appeared shortly before insolvency.&lt;/p&gt;

&lt;h3&gt;
  
  
  Why reporters still query it directly
&lt;/h3&gt;

&lt;p&gt;A sanctions or corruption investigation often produces a large corporate graph. Editors and lawyers will ask where each fact originated. A court register entry answers that question. Anyone reviewing the work can repeat the same lookup and reach the same record.&lt;/p&gt;

&lt;p&gt;OpenRegistry exposes Handelsregister entries through MCP using the same fields published by the court. The audit trail stays intact and the usual CAPTCHA loops on public portals disappear. Documentation and access details sit at &lt;a href="https://openregistry.sophymarine.com" rel="noopener noreferrer"&gt;https://openregistry.sophymarine.com&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>programming</category>
      <category>mcp</category>
      <category>kyc</category>
      <category>legaltech</category>
    </item>
    <item>
      <title>France's Recherche d’entreprises: what the registry returns</title>
      <dc:creator>OpenRegistry</dc:creator>
      <pubDate>Tue, 19 May 2026 07:43:09 +0000</pubDate>
      <link>https://dev.to/openregistry/frances-recherche-dentreprises-what-the-registry-returns-2o78</link>
      <guid>https://dev.to/openregistry/frances-recherche-dentreprises-what-the-registry-returns-2o78</guid>
      <description>&lt;p&gt;France assigns every company a nine‑digit SIREN number. It follows the legal entity for its entire life. Change the address. Close a branch. The SIREN stays.&lt;/p&gt;

&lt;p&gt;That detail surfaces quickly in cross‑border diligence. During a review of French logistics targets last quarter, a legacy paid database listed two operators as separate companies. The official register told a different story. Both records pointed to one SIREN, with several establishments attached through SIRET numbers. One entity. Several operating sites.&lt;/p&gt;

&lt;p&gt;The public interface is called &lt;strong&gt;Recherche d’entreprises&lt;/strong&gt;. It sits above the Registre national des entreprises, with data distributed through the INPI pipeline. Most users see a search page in their browser. Beneath that page sits a structured register keyed by SIREN. Ask for the identifier and the response comes from the official record, not a vendor’s interpretation.&lt;/p&gt;

&lt;h3&gt;
  
  
  Fields that appear in a registry record
&lt;/h3&gt;

&lt;p&gt;A French company profile carries a dense set of fields. Several appear consistently when queried through OpenRegistry.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;company_name&lt;/code&gt; stores the legal name recorded with the relevant authority, often the Registre du commerce et des sociétés. French firms often keep both a trading name and a legal denomination. The register keeps them as separate entries.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;company_number&lt;/code&gt; corresponds to the SIREN identifier. Individual establishments appear upstream with their own SIRET numbers, each linked back to that parent number.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;jurisdiction_data.forme_juridique&lt;/code&gt; records the legal structure. This is where the record states whether the entity is an SAS, SARL, SA, or another form. Guessing from a suffix in the name often fails.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;jurisdiction_data.date_immatriculation&lt;/code&gt; shows the date the company first entered the trade register.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;jurisdiction_data.code_ape&lt;/code&gt; holds the activity code under the NAF classification system.&lt;/p&gt;

&lt;p&gt;Officer information usually sits in registry sections such as &lt;code&gt;dirigeants&lt;/code&gt; within &lt;code&gt;jurisdiction_data&lt;/code&gt;. Titles matter here. A président in an SAS holds a role that differs from a gérant in an SARL. The register keeps the wording exactly as filed. That wording becomes useful when tracing individuals across multiple entities, where a small title change can indicate a different legal position.&lt;/p&gt;

&lt;p&gt;Filings also appear in the company record. Typical entries include capital increases, director appointments, and registered address updates. Filing metadata often links to the underlying document when the register publishes it.&lt;/p&gt;

&lt;h3&gt;
  
  
  Areas where the record is incomplete
&lt;/h3&gt;

&lt;p&gt;France keeps beneficial ownership filings in the &lt;strong&gt;Registre des bénéficiaires effectifs (RBE)&lt;/strong&gt;. Access rules shifted after the Court of Justice of the European Union decision in case C‑601/20. Several EU countries limited open public access to those registers. France kept partial access for authorised users, though the data is not broadly open.&lt;/p&gt;

&lt;p&gt;Run a standard registry query and you usually see company form and officers. Beneficial owners may not appear unless the legal framework allows that information to be shown publicly.&lt;/p&gt;

&lt;p&gt;Financial statements follow a similar pattern. Many French companies file annual accounts with the registry. Smaller entities can request confidentiality for certain sections. When that happens the filing still appears in the register. The document itself may remain restricted.&lt;/p&gt;

&lt;p&gt;These gaps often slip past cached datasets. Officer lists in subscription databases sometimes lag months behind the official record. A filing lands in the registry. The cached profile stays unchanged.&lt;/p&gt;

&lt;h3&gt;
  
  
  Querying the French registry through MCP
&lt;/h3&gt;

&lt;p&gt;OpenRegistry connects an AI client directly to the registry query layer. The MCP server passes through the raw fields as they appear upstream. Your software decides what to do with them.&lt;/p&gt;

&lt;p&gt;A search by company name or SIREN might look like this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="nf"&gt;search_companies&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
  &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;jurisdiction&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;FR&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;query&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;BLADE SAS&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;
&lt;span class="p"&gt;})&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The response returns matching entities and their SIREN numbers. Once the identifier is known, the full company record can be requested.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="nf"&gt;get_company_profile&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
  &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;jurisdiction&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;FR&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;company_number&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;552100554&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;
&lt;span class="p"&gt;})&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Officer data comes through a separate call.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="nf"&gt;get_officers&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
  &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;jurisdiction&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;FR&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;company_number&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;552100554&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;
&lt;span class="p"&gt;})&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;To inspect the filing history:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="nf"&gt;list_filings&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
  &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;jurisdiction&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;FR&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;company_number&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;552100554&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;
&lt;span class="p"&gt;})&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;One field deserves close attention: &lt;code&gt;jurisdiction_data&lt;/code&gt;. OpenRegistry leaves these labels unchanged from the upstream register. If the French record calls a field &lt;code&gt;date_immatriculation&lt;/code&gt;, that exact label remains in the response. Downstream systems can parse the field or store it unchanged. No intermediary renaming step sits in the middle.&lt;/p&gt;

&lt;h3&gt;
  
  
  Why diligence teams start with the registry
&lt;/h3&gt;

&lt;p&gt;A French operating company rarely sits alone. Structures often stretch across borders. A holding entity might sit in Luxembourg. The operating subsidiary sits in France. Sales branches appear elsewhere in Europe.&lt;/p&gt;

&lt;p&gt;The first lookup matters.&lt;/p&gt;

&lt;p&gt;If the starting record is stale, every ownership trace that follows may begin from the wrong assumption. A mistaken officer list. A missing filing. Small errors propagate quickly.&lt;/p&gt;

&lt;p&gt;Direct register queries reduce that risk. SIREN numbers remain constant even when establishments change. Officer titles match the wording used in the filing. Filing timestamps line up with the official publication.&lt;/p&gt;

&lt;p&gt;A recent screening of mid‑market software firms showed how quickly the picture can shift. One French SAS appeared dormant in an export from a paid database. The official register showed a capital increase filed two weeks earlier. That single filing changed the view of the shareholder structure before the management meeting even began.&lt;/p&gt;

&lt;p&gt;OpenRegistry exposes that same registry surface to AI assistants through MCP. Instead of copying records from web portals or relying on cached exports, software can request the French company record directly from the source. Connection details for MCP clients are at &lt;a href="https://openregistry.sophymarine.com" rel="noopener noreferrer"&gt;https://openregistry.sophymarine.com&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>programming</category>
      <category>mcp</category>
      <category>kyb</category>
      <category>legaltech</category>
    </item>
    <item>
      <title>Hit OpenCorporates' 200/month limit? Here's a free passthrough to UK/EU registries</title>
      <dc:creator>OpenRegistry</dc:creator>
      <pubDate>Sun, 17 May 2026 06:22:41 +0000</pubDate>
      <link>https://dev.to/openregistry/hit-opencorporates-200month-limit-heres-a-free-passthrough-to-ukeu-registries-3h7a</link>
      <guid>https://dev.to/openregistry/hit-opencorporates-200month-limit-heres-a-free-passthrough-to-ukeu-registries-3h7a</guid>
      <description>&lt;h1&gt;
  
  
  Hit OpenCorporates' 200/month limit? Here's a free passthrough to UK/EU registries
&lt;/h1&gt;

&lt;p&gt;OpenCorporates' free key allows 50 calls a day. OpenRegistry's anonymous tier allows 20 calls a &lt;em&gt;minute&lt;/em&gt;, across 16 UK/EU/EEA company registries.&lt;/p&gt;

&lt;p&gt;If you've been rationing OC quota all month, paste this and you have data:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl &lt;span class="s2"&gt;"https://openregistry.sophymarine.com/api/v1/companies?q=monzo&amp;amp;jurisdiction=GB"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The rest of this post is the comparison numbers, what you actually get in the response, two concrete use cases, and the three ways to call the API (HTTP REST, HTTP RPC, or MCP for AI agents).&lt;/p&gt;

&lt;h2&gt;
  
  
  The free-tier numbers, side by side
&lt;/h2&gt;

&lt;p&gt;OpenCorporates' published pricing:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Tier&lt;/th&gt;
&lt;th&gt;Monthly cap&lt;/th&gt;
&lt;th&gt;Daily cap&lt;/th&gt;
&lt;th&gt;Annual price&lt;/th&gt;
&lt;th&gt;Commercial use&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Free&lt;/td&gt;
&lt;td&gt;200 calls&lt;/td&gt;
&lt;td&gt;50 calls&lt;/td&gt;
&lt;td&gt;£0&lt;/td&gt;
&lt;td&gt;Open-data / public-benefit only&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Essentials&lt;/td&gt;
&lt;td&gt;500 calls&lt;/td&gt;
&lt;td&gt;200 calls&lt;/td&gt;
&lt;td&gt;£2,250&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Starter&lt;/td&gt;
&lt;td&gt;2,500 calls&lt;/td&gt;
&lt;td&gt;500 calls&lt;/td&gt;
&lt;td&gt;£6,600&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Basic&lt;/td&gt;
&lt;td&gt;5,000 calls&lt;/td&gt;
&lt;td&gt;1,000 calls&lt;/td&gt;
&lt;td&gt;£12,000&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;OpenRegistry's published pricing:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Tier&lt;/th&gt;
&lt;th&gt;Rate limit&lt;/th&gt;
&lt;th&gt;Monthly price&lt;/th&gt;
&lt;th&gt;Commercial use&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Anonymous&lt;/td&gt;
&lt;td&gt;20 req/min/IP&lt;/td&gt;
&lt;td&gt;$0&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Free (signed in)&lt;/td&gt;
&lt;td&gt;30 req/min/user&lt;/td&gt;
&lt;td&gt;$0&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Pro&lt;/td&gt;
&lt;td&gt;higher per-country fan-out, higher rate&lt;/td&gt;
&lt;td&gt;$9&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Max&lt;/td&gt;
&lt;td&gt;enterprise rates&lt;/td&gt;
&lt;td&gt;$29&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The headline: 20 calls/min sustained is roughly 28,800/day. OC's free tier is 50/day. Same direction, about 576× the daily headroom, no licence clause attached. When you do outgrow free, $9/mo is the next step instead of a £2,250 annual contract.&lt;/p&gt;

&lt;h2&gt;
  
  
  How the free tier works
&lt;/h2&gt;

&lt;p&gt;There is no ingested snapshot. Each tool call is a real-time HTTP request from the worker out to the upstream government registry. Your response carries a unified envelope plus the registry's own JSON payload preserved under &lt;code&gt;jurisdiction_data&lt;/code&gt;, so an audit reviewer can trace any field back to the statutory source.&lt;/p&gt;

&lt;p&gt;A real response from &lt;code&gt;/api/v1/companies/GB/09446231&lt;/code&gt;, trimmed:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"queried_at"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"2026-05-17T06:02:24+01:00 (Europe/London)"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"jurisdiction"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"GB"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"company_id"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"09446231"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"company_name"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"MONZO BANK LIMITED"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"status"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"active"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"incorporation_date"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"2015-02-18"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"registered_address"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Broadwalk House, 5 Appold Street, London, EC2A 2AG, England"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"jurisdiction_data"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"company_number"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"09446231"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"company_status"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"active"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"type"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"ltd"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"date_of_creation"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"2015-02-18"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"sic_codes"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"64191"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"64999"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"has_charges"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"has_insolvency_history"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"accounts"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;/*&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;full&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;Companies&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;House&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;accounts&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;block&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;*/&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;A 3-country per-minute cross-border fan-out cap applies on the anonymous tier (raised on Pro/Max). Cayman Islands is paid-tier only because the upstream CIMA register charges per query; everywhere else is free anonymous.&lt;/p&gt;

&lt;h2&gt;
  
  
  UK, EU and EEA coverage today
&lt;/h2&gt;

&lt;p&gt;The 16 registries with first-party government APIs already wired for search and profile:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;UK &amp;amp; Crown dependencies&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;UK Companies House (&lt;code&gt;GB&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;Isle of Man Companies Registry (&lt;code&gt;IM&lt;/code&gt;)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;EU member states&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;France Recherche d'entreprises (Sirene + RNE + RNA, open API) (&lt;code&gt;FR&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;Ireland CRO (&lt;code&gt;IE&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;Belgium Crossroads Bank for Enterprises (CBE / KBO / BCE) (&lt;code&gt;BE&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;Italy InfoCamere via the EU BRIS e-Justice gateway (&lt;code&gt;IT&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;Spain BORME (&lt;code&gt;ES&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;Poland KRS (&lt;code&gt;PL&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;Czechia ARES (&lt;code&gt;CZ&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;Finland PRH avoindata (&lt;code&gt;FI&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;Cyprus DRCOR (&lt;code&gt;CY&lt;/code&gt;)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;EEA + EFTA + microstates&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Norway Brreg / Enhetsregisteret (&lt;code&gt;NO&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;Switzerland Zefix (&lt;code&gt;CH&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;Iceland Skatturinn / Fyrirtækjaskrá (&lt;code&gt;IS&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;Liechtenstein Handelsregister (&lt;code&gt;LI&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;Monaco RCI (&lt;code&gt;MC&lt;/code&gt;)&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Three ways to call it
&lt;/h2&gt;

&lt;p&gt;Same handlers, same auth, same rate-limit pipeline behind all three. Pick by client.&lt;/p&gt;

&lt;h3&gt;
  
  
  Option A — HTTP REST (&lt;code&gt;/api/v1/...&lt;/code&gt;)
&lt;/h3&gt;

&lt;p&gt;For backend code that already speaks resource-oriented HTTP. Routes:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;GET /api/v1/jurisdictions[/{cc}]
GET /api/v1/companies?q=&amp;amp;jurisdiction=
GET /api/v1/companies/{jur}/{id}
GET /api/v1/companies/{jur}/{id}/officers
GET /api/v1/companies/{jur}/{id}/shareholders
GET /api/v1/companies/{jur}/{id}/filings
GET /api/v1/officers?q=&amp;amp;jurisdiction=
GET /api/v1/documents/{jur}/{id}
GET /api/v1/documents/{jur}/{id}/content       (raw bytes)
GET /api/v1/documents/{jur}/{id}/navigation
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Two lines of Python:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;requests&lt;/span&gt;

&lt;span class="n"&gt;r&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;requests&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;https://openregistry.sophymarine.com/api/v1/companies&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;params&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;q&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;monzo bank&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;jurisdiction&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;GB&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;r&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;json&lt;/span&gt;&lt;span class="p"&gt;()[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;results&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;A profile per country, using the registry's own company ID:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# UK Companies House (Monzo Bank)&lt;/span&gt;
curl &lt;span class="s2"&gt;"https://openregistry.sophymarine.com/api/v1/companies/GB/09446231"&lt;/span&gt;

&lt;span class="c"&gt;# France Sirene/RNE (Danone, SIREN)&lt;/span&gt;
curl &lt;span class="s2"&gt;"https://openregistry.sophymarine.com/api/v1/companies/FR/552032534"&lt;/span&gt;

&lt;span class="c"&gt;# Poland KRS (Polskie Koleje Państwowe / PKP)&lt;/span&gt;
curl &lt;span class="s2"&gt;"https://openregistry.sophymarine.com/api/v1/companies/PL/0000019193"&lt;/span&gt;

&lt;span class="c"&gt;# Norway Brreg (Equinor ASA, org.nr)&lt;/span&gt;
curl &lt;span class="s2"&gt;"https://openregistry.sophymarine.com/api/v1/companies/NO/923609016"&lt;/span&gt;

&lt;span class="c"&gt;# Italy InfoCamere via BRIS (Candy Hoover Group)&lt;/span&gt;
curl &lt;span class="s2"&gt;"https://openregistry.sophymarine.com/api/v1/companies/IT/04666310158"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Officers, beneficial owners and the share register sit on separate sub-paths because in most EU registries they correspond to separate filings and collapsing them loses information.&lt;/p&gt;

&lt;h3&gt;
  
  
  Option B — HTTP RPC (&lt;code&gt;/api/v1/rpc/{tool_name}&lt;/code&gt;)
&lt;/h3&gt;

&lt;p&gt;For code that already thinks in tool names, or for tools whose input is awkward to encode as a REST path. URL is always &lt;code&gt;/api/v1/rpc/{tool_name}&lt;/code&gt;; args go in the query string on GET or a JSON body on POST:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Same call as the REST search, RPC style:&lt;/span&gt;
curl &lt;span class="s2"&gt;"https://openregistry.sophymarine.com/api/v1/rpc/search_companies?q=monzo&amp;amp;jurisdiction=GB"&lt;/span&gt;

&lt;span class="c"&gt;# Profile via POST + JSON body:&lt;/span&gt;
curl &lt;span class="nt"&gt;-X&lt;/span&gt; POST https://openregistry.sophymarine.com/api/v1/rpc/get_company_profile &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-H&lt;/span&gt; &lt;span class="s2"&gt;"Content-Type: application/json"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-d&lt;/span&gt; &lt;span class="s1"&gt;'{"jurisdiction":"GB","company_id":"09446231"}'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Easiest path if you already have working MCP-tool code and want to drop it onto a plain HTTPS client without rewriting argument plumbing.&lt;/p&gt;

&lt;h3&gt;
  
  
  Option C — MCP transport (&lt;code&gt;/mcp&lt;/code&gt;)
&lt;/h3&gt;

&lt;p&gt;For AI agents. Works in Claude Desktop, Cursor, Cline, Goose, Zed, Claude Code:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json-doc"&gt;&lt;code&gt;&lt;span class="c1"&gt;// claude_desktop_config.json&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"mcpServers"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"openregistry"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"url"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"https://openregistry.sophymarine.com/mcp"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"transport"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"http"&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;For Claude Code:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;claude mcp add &lt;span class="nt"&gt;--transport&lt;/span&gt; http OpenRegistry https://openregistry.sophymarine.com/mcp
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Visible tools: &lt;code&gt;search_companies&lt;/code&gt;, &lt;code&gt;search_officers&lt;/code&gt;, &lt;code&gt;get_company_profile&lt;/code&gt;, &lt;code&gt;get_officers&lt;/code&gt;, &lt;code&gt;get_shareholders&lt;/code&gt;, &lt;code&gt;list_filings&lt;/code&gt;, &lt;code&gt;get_document_metadata&lt;/code&gt;, &lt;code&gt;get_document_navigation&lt;/code&gt;, &lt;code&gt;fetch_document&lt;/code&gt;, &lt;code&gt;list_jurisdictions&lt;/code&gt;. Each comes with an MCP input + output schema, so the agent gets static validation without you writing a wrapper.&lt;/p&gt;

&lt;h3&gt;
  
  
  Which to pick
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Your client&lt;/th&gt;
&lt;th&gt;Best shape&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Backend service / cron / notebook&lt;/td&gt;
&lt;td&gt;HTTP REST&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Existing code that already speaks MCP tools&lt;/td&gt;
&lt;td&gt;HTTP RPC&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;LLM agent&lt;/td&gt;
&lt;td&gt;MCP at &lt;code&gt;/mcp&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Auth, redaction, rate limiting and the per-country fan-out cap are identical across all three.&lt;/p&gt;

&lt;h2&gt;
  
  
  Try it
&lt;/h2&gt;

&lt;p&gt;Three things you can do right now:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Run the search&lt;/strong&gt;: &lt;code&gt;curl "https://openregistry.sophymarine.com/api/v1/companies?q=apple&amp;amp;jurisdiction=GB"&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Wire the MCP endpoint&lt;/strong&gt; into your Claude Desktop / Cursor / Cline config and ask it "look up Monzo Bank on Companies House and summarise its latest filing".&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Read the full comparison&lt;/strong&gt; against Sayari, BvD/Orbis, D&amp;amp;B and GLEIF: &lt;a href="https://dev.to/sophymarine/opencorporates-alternatives-compared"&gt;OpenCorporates alternatives compared&lt;/a&gt;.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Docs and the live capability matrix are at &lt;a href="https://openregistry.sophymarine.com" rel="noopener noreferrer"&gt;openregistry.sophymarine.com&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;OpenRegistry is a platform by &lt;a href="https://sophymarine.com" rel="noopener noreferrer"&gt;Sophymarine&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>api</category>
      <category>mcp</category>
      <category>ai</category>
      <category>python</category>
    </item>
    <item>
      <title>OpenCorporates vs. official registries: when caching breaks KYB</title>
      <dc:creator>OpenRegistry</dc:creator>
      <pubDate>Sun, 17 May 2026 02:33:13 +0000</pubDate>
      <link>https://dev.to/openregistry/opencorporates-vs-official-registries-when-caching-breaks-kyb-35ah</link>
      <guid>https://dev.to/openregistry/opencorporates-vs-official-registries-when-caching-breaks-kyb-35ah</guid>
      <description>&lt;p&gt;Companies House processed over 6 million filings during 2024. Many reach the public register minutes after submission. That speed is routine for a statutory register. Aggregator databases work differently. They pull periodic snapshots and refresh on their own timetable.&lt;/p&gt;

&lt;p&gt;KYB teams feel the gap during onboarding. A merchant signs up and states the company formed last week. Your system queries an aggregator cache and returns nothing because the last bulk import ran months earlier. The record exists already. The vendor has simply not collected it.&lt;/p&gt;

&lt;p&gt;On paper the delay looks minor. In operations it produces false negatives, manual review queues, and audit trails that do not line up with the public record.&lt;/p&gt;

&lt;h3&gt;
  
  
  The registry of record behaves differently
&lt;/h3&gt;

&lt;p&gt;National registers publish the fields the law requires. In the United Kingdom that means Companies House exposes the official company number, incorporation date, registered office address, officer appointments, and the filing log. Each identifier originates inside the registrar’s own system.&lt;/p&gt;

&lt;p&gt;Query the register directly and you see those upstream attributes without reinterpretation. A typical company profile response contains fields such as:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;company_number&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;company_name&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;company_status&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;date_of_creation&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;registered_office_address&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Officer data appears through a separate endpoint. Those entries carry attributes like &lt;code&gt;officer_role&lt;/code&gt;, &lt;code&gt;appointed_on&lt;/code&gt;, and &lt;code&gt;resigned_on&lt;/code&gt;. Filings follow the same pattern. When a company submits accounts or a confirmation statement, the register lists the event with fields including &lt;code&gt;category&lt;/code&gt;, &lt;code&gt;date&lt;/code&gt;, and &lt;code&gt;transaction_id&lt;/code&gt;, which points to the original submission record.&lt;/p&gt;

&lt;p&gt;These are register facts. Not derived fields. That distinction matters the moment compliance asks where a value originated.&lt;/p&gt;

&lt;h3&gt;
  
  
  Where aggregator caching causes KYB failures
&lt;/h3&gt;

&lt;p&gt;Cached datasets drift away from the source over time. A register entry might change this morning. The mirrored dataset could sit unchanged for weeks. If onboarding checks read the mirror rather than the register, the system evaluates stale information.&lt;/p&gt;

&lt;p&gt;Three patterns show up again and again in KYB queues.&lt;/p&gt;

&lt;p&gt;A newly incorporated company applies for an account. The registrar already issued the company number. Your provider still shows no match, so the onboarding flow marks the applicant as unverifiable.&lt;/p&gt;

&lt;p&gt;A director resigns after enforcement action. The update appears at the register the same day. The cached dataset still lists the officer as active. Internal review assumes the person retains control.&lt;/p&gt;

&lt;p&gt;A dissolved company restores its status through court order. The registrar updates the &lt;code&gt;company_status&lt;/code&gt; field soon after restoration. Mirror datasets sometimes keep the dissolved flag until the next import cycle.&lt;/p&gt;

&lt;p&gt;Each case creates the same problem. The register says one thing. Your dataset says another.&lt;/p&gt;

&lt;h3&gt;
  
  
  What direct registry queries look like
&lt;/h3&gt;

&lt;p&gt;The practical option is simple: query the register when the KYB check runs. An MCP client using OpenRegistry sends a tool call and receives the fields returned by the jurisdiction.&lt;/p&gt;

&lt;p&gt;Searching Companies House by name might look like this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="nf"&gt;search_companies&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
  &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;jurisdiction&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;GB&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;query&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;ACME PAYMENTS LTD&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;
&lt;span class="p"&gt;})&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Once you have the company number, the profile request is straightforward:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="nf"&gt;get_company_profile&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
  &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;jurisdiction&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;GB&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;company_number&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;12345678&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;
&lt;span class="p"&gt;})&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The response includes a &lt;code&gt;jurisdiction_data&lt;/code&gt; block that mirrors the payload supplied by Companies House. No reinterpretation. No enrichment layer. Only the minimal schema fields needed so cross‑country queries stay consistent.&lt;/p&gt;

&lt;p&gt;That detail becomes useful during regulatory review. An auditor can trace the field directly to the upstream register entry.&lt;/p&gt;

&lt;p&gt;Officers and filing history come through separate calls. The structure follows the source register closely. Little abstraction.&lt;/p&gt;

&lt;h3&gt;
  
  
  What you will not get from the registry
&lt;/h3&gt;

&lt;p&gt;Direct register queries do not answer every KYB question. Some ownership information in Europe moved behind AML access gates after the CJEU ruling in case C‑601/20. Germany’s Transparenzregister is a well‑known example. Public company registers still expose directors and filings. Beneficial ownership often requires authorised access.&lt;/p&gt;

&lt;p&gt;Registers also do not provide sanctions checks, credit assessments, or risk scoring. Those sit in separate systems layered on top of the base company record.&lt;/p&gt;

&lt;p&gt;Treat the register as the reference point for legal existence and current status. Additional analysis happens afterwards.&lt;/p&gt;

&lt;h3&gt;
  
  
  Why auditors favour the registry path
&lt;/h3&gt;

&lt;p&gt;Audit reviews usually circle back to a simple question: where did this company record originate?&lt;/p&gt;

&lt;p&gt;If the answer is an aggregator dataset, the next conversation covers refresh frequency, reconciliation routines, and how the system handles conflicts between the dataset and the official register. That explanation can grow complicated, especially when values diverge.&lt;/p&gt;

&lt;p&gt;If the answer is the register itself, the chain of evidence stays short. The onboarding system queried the official register at a specific timestamp. The returned fields match the state of the register at that moment.&lt;/p&gt;

&lt;p&gt;Clear provenance matters. Compliance teams increasingly query national registers during onboarding rather than relying on cached mirrors. The register remains the authoritative source for company existence and legal status.&lt;/p&gt;

&lt;p&gt;OpenRegistry exposes 27 national company registers through a single MCP endpoint so an AI assistant or internal agent can query the register of incorporation during KYB checks. Details and connection instructions are at &lt;a href="https://openregistry.sophymarine.com" rel="noopener noreferrer"&gt;https://openregistry.sophymarine.com&lt;/a&gt;&lt;/p&gt;

</description>
      <category>programming</category>
      <category>kyb</category>
      <category>compliance</category>
      <category>api</category>
    </item>
  </channel>
</rss>
