<?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.us-east-2.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>How stale is company registry data? Measuring lag against the Companies House API</title>
      <dc:creator>OpenRegistry</dc:creator>
      <pubDate>Fri, 11 Sep 2026 03:15:44 +0000</pubDate>
      <link>https://dev.to/openregistry/how-stale-is-company-registry-data-measuring-lag-against-the-companies-house-api-1egn</link>
      <guid>https://dev.to/openregistry/how-stale-is-company-registry-data-measuring-lag-against-the-companies-house-api-1egn</guid>
      <description>&lt;p&gt;We build OpenRegistry, a live registry API. This post was written with AI assistance.&lt;/p&gt;

&lt;p&gt;Every company-data product is either a live query or a copy. Copies are fine until the thing you care about changes after the copy was taken. This post shows how to measure that gap for UK companies yourself, using the free Companies House API, and what we saw when we tried it on four companies.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why freshness matters
&lt;/h2&gt;

&lt;p&gt;Know-your-business (KYB) checks ask simple questions: does this company exist, is it active, and who runs it? The answers change.&lt;/p&gt;

&lt;p&gt;Picture a supplier-onboarding check on a Thursday. The director who signed your contract resigned on Monday, and the company filed the resignation on Wednesday. If your data source last synced on Tuesday, your check says she is still a director, and your file records that you verified her authority to sign. Nothing in the data is invented. It is just two days old.&lt;/p&gt;

&lt;p&gt;So the useful question is not whether a source is "right", but how old it is at the moment you look.&lt;/p&gt;

&lt;h2&gt;
  
  
  How registry changes happen
&lt;/h2&gt;

&lt;p&gt;A UK company tells Companies House about changes by filing forms. These are the ones that matter most for KYB:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Form&lt;/th&gt;
&lt;th&gt;What it records&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;AP01&lt;/td&gt;
&lt;td&gt;Director appointed&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;AP03&lt;/td&gt;
&lt;td&gt;Secretary appointed&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;TM01&lt;/td&gt;
&lt;td&gt;Director's appointment ended (resigned or removed)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;TM02&lt;/td&gt;
&lt;td&gt;Secretary's appointment ended&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;DS01&lt;/td&gt;
&lt;td&gt;Company applies to be struck off voluntarily&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;GAZ1 / GAZ1(A)&lt;/td&gt;
&lt;td&gt;Gazette notice of proposed strike-off (compulsory / voluntary)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;NEWINC&lt;/td&gt;
&lt;td&gt;Company incorporated&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Two details make lag harder to measure than it looks:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Every change has two dates.&lt;/strong&gt; The &lt;em&gt;effective&lt;/em&gt; date is when the director actually resigned. The &lt;em&gt;filing&lt;/em&gt; date is when Companies House registered the form. Companies have 14 days to report officer changes, so the register itself can trail reality. In the filing-history API these are &lt;code&gt;action_date&lt;/code&gt; and &lt;code&gt;date&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Some notices are dated in the future.&lt;/strong&gt; A GAZ1(A) can show up in filing history dated for its scheduled Gazette publication. Only count filings dated on or before the day you are measuring, or you will get negative lag.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Volume matters too. Replaying the Companies House officers stream, we counted &lt;strong&gt;100,000 officer events in 24.1 hours&lt;/strong&gt; (7 to 8 September 2026). Most are updates to existing officer records rather than new appointments or resignations, but any copy of the register has to keep up with all of them.&lt;/p&gt;

&lt;h2&gt;
  
  
  How to measure lag yourself
&lt;/h2&gt;

&lt;p&gt;You need a free API key from the &lt;a href="https://developer.company-information.service.gov.uk/" rel="noopener noreferrer"&gt;Companies House developer hub&lt;/a&gt;. It is sent as the username in HTTP Basic auth, with an empty password.&lt;/p&gt;

&lt;p&gt;The method:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Look up some companies on the source you want to test. Record what it shows and the date you looked.&lt;/li&gt;
&lt;li&gt;Pull each company's filing history from Companies House.&lt;/li&gt;
&lt;li&gt;For each relevant filing registered on or before the day you looked: lag ≥ day you looked − filing date.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;This gives a lower bound. You know the copy was still behind when you looked, not when it caught up. Re-check daily if you want the upper bound too.&lt;/p&gt;

&lt;p&gt;Python, standard library only:&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;base64&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;json&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;os&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;urllib&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;request&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;datetime&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;date&lt;/span&gt;

&lt;span class="n"&gt;API&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;https://api.company-information.service.gov.uk&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
&lt;span class="n"&gt;AUTH&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Basic &lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;base64&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;b64encode&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="n"&gt;os&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;environ&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;CH_API_KEY&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;:&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;encode&lt;/span&gt;&lt;span class="p"&gt;()).&lt;/span&gt;&lt;span class="nf"&gt;decode&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;

&lt;span class="c1"&gt;# Filing types that change what a KYB check would see
&lt;/span&gt;&lt;span class="n"&gt;WATCH&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;AP01&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;director appointed&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;AP03&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;secretary appointed&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;TM01&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;director resigned&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;TM02&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;secretary resigned&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;DS01&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;strike-off application&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;GAZ1&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;strike-off notice&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;GAZ1(A)&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;strike-off notice&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;NEWINC&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;incorporated&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="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;ch&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;path&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="n"&gt;req&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;urllib&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;request&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;Request&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;API&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;path&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;headers&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;Authorization&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;AUTH&lt;/span&gt;&lt;span class="p"&gt;})&lt;/span&gt;
    &lt;span class="k"&gt;with&lt;/span&gt; &lt;span class="n"&gt;urllib&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;request&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;urlopen&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;req&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;timeout&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;30&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;r&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;json&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;load&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="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;changes&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;number&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;since&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;until&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="sh"&gt;"""&lt;/span&gt;&lt;span class="s"&gt;Watched filings registered between `since` and `until` (inclusive).&lt;/span&gt;&lt;span class="sh"&gt;"""&lt;/span&gt;
    &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;f&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="nf"&gt;ch&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;/company/&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;number&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt;/filing-history?items_per_page=25&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;items&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]:&lt;/span&gt;
        &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;f&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;type&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;WATCH&lt;/span&gt; &lt;span class="ow"&gt;and&lt;/span&gt; &lt;span class="n"&gt;since&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;=&lt;/span&gt; &lt;span class="n"&gt;f&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;date&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;=&lt;/span&gt; &lt;span class="n"&gt;until&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
            &lt;span class="k"&gt;yield&lt;/span&gt; &lt;span class="n"&gt;f&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;type&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="n"&gt;f&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;action_date&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="ow"&gt;or&lt;/span&gt; &lt;span class="n"&gt;f&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;date&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="n"&gt;f&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;date&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;

&lt;span class="c1"&gt;# What the third-party source showed, and the day you looked
&lt;/span&gt;&lt;span class="n"&gt;OBSERVED&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;SC190660&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="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;2026-09-10&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;status: Active&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;15150296&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="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;2026-09-10&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;1 officer listed&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;12782688&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="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;2026-09-10&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;resigned director shown as current&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;17450921&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="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;2026-09-10&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;company not found&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="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;number&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;seen_on&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;shown&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;OBSERVED&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;items&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt;
    &lt;span class="n"&gt;p&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;ch&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;/company/&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;number&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;status&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;p&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;company_status_detail&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="ow"&gt;or&lt;/span&gt; &lt;span class="n"&gt;p&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;company_status&lt;/span&gt;&lt;span class="sh"&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="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;number&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt;  register now: &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;status&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;ftype&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;effective&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;filed&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="nf"&gt;changes&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;number&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;since&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;2026-09-01&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;until&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;seen_on&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="n"&gt;lag&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;date&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;fromisoformat&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;seen_on&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="n"&gt;date&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;fromisoformat&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;filed&lt;/span&gt;&lt;span class="p"&gt;)).&lt;/span&gt;&lt;span class="n"&gt;days&lt;/span&gt;
        &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;  &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;ftype&lt;/span&gt;&lt;span class="si"&gt;:&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="mi"&gt;7&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt; &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;WATCH&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;ftype&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="si"&gt;:&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="mi"&gt;22&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt; effective &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;effective&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt;  filed &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;filed&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
              &lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;  | third party on &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;seen_on&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt;: &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;shown&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt;  -&amp;gt; lag &amp;gt;= &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;lag&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt;d&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;Output:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;SC190660  register now: active-proposal-to-strike-off
  DS01    strike-off application effective 2026-09-08  filed 2026-09-08  | third party on 2026-09-10: status: Active  -&amp;gt; lag &amp;gt;= 2d
15150296  register now: active
  AP03    secretary appointed    effective 2026-09-09  filed 2026-09-09  | third party on 2026-09-10: 1 officer listed  -&amp;gt; lag &amp;gt;= 1d
12782688  register now: active
  TM01    director resigned      effective 2026-09-07  filed 2026-09-09  | third party on 2026-09-10: resigned director shown as current  -&amp;gt; lag &amp;gt;= 1d
17450921  register now: active
  NEWINC  incorporated           effective 2026-09-10  filed 2026-09-10  | third party on 2026-09-10: company not found  -&amp;gt; lag &amp;gt;= 0d
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Exact timestamps with the streaming API
&lt;/h3&gt;

&lt;p&gt;Filing history gives you dates. For timestamps, the &lt;a href="https://developer-specs.company-information.service.gov.uk/streaming-api/guides/overview" rel="noopener noreferrer"&gt;Companies House streaming API&lt;/a&gt; pushes each change as it is published, with a &lt;code&gt;published_at&lt;/code&gt; time and a &lt;code&gt;timepoint&lt;/code&gt; cursor. It uses a separate stream key. You can replay from an earlier timepoint, which is how we measured the daily volume above:&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;base64&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;json&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;os&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;urllib&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;request&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;datetime&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;datetime&lt;/span&gt;

&lt;span class="n"&gt;STREAM&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;https://stream.companieshouse.gov.uk/officers&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
&lt;span class="n"&gt;AUTH&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Basic &lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;base64&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;b64encode&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="n"&gt;os&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;environ&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;CH_STREAM_KEY&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;:&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;encode&lt;/span&gt;&lt;span class="p"&gt;()).&lt;/span&gt;&lt;span class="nf"&gt;decode&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;

&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;event_at&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;timepoint&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="sh"&gt;"""&lt;/span&gt;&lt;span class="s"&gt;Replay the stream from a timepoint and return the first event.&lt;/span&gt;&lt;span class="sh"&gt;"""&lt;/span&gt;
    &lt;span class="n"&gt;req&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;urllib&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;request&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;Request&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;STREAM&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt;?timepoint=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;timepoint&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;headers&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;Authorization&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;AUTH&lt;/span&gt;&lt;span class="p"&gt;})&lt;/span&gt;
    &lt;span class="k"&gt;with&lt;/span&gt; &lt;span class="n"&gt;urllib&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;request&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;urlopen&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;req&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;timeout&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;60&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;r&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;line&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;r&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
            &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;line&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;strip&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt;                      &lt;span class="c1"&gt;# blank lines are heartbeats
&lt;/span&gt;                &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;json&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;loads&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;line&lt;/span&gt;&lt;span class="p"&gt;)[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;event&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;

&lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;b&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;event_at&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;61_100_000&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="nf"&gt;event_at&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;61_200_000&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;t&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;lambda&lt;/span&gt; &lt;span class="n"&gt;e&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;datetime&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;fromisoformat&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;e&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;published_at&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;
&lt;span class="n"&gt;hours&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;t&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;b&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="nf"&gt;t&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="p"&gt;)).&lt;/span&gt;&lt;span class="nf"&gt;total_seconds&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="mi"&gt;3600&lt;/span&gt;
&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;published_at&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt; -&amp;gt; &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;b&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;published_at&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&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="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;b&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;timepoint&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;timepoint&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="si"&gt;:&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt; officer events in &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;hours&lt;/span&gt;&lt;span class="si"&gt;:&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="n"&gt;f&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt; hours&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;Output:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;2026-09-07T17:35:03 -&amp;gt; 2026-09-08T17:44:02
100,000 officer events in 24.1 hours
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  What we found
&lt;/h2&gt;

&lt;p&gt;On the morning of 10 September 2026 we looked up four companies with recent changes on OpenCorporates, a widely used company-data aggregator, and compared them with Companies House.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Company number&lt;/th&gt;
&lt;th&gt;Change on the register&lt;/th&gt;
&lt;th&gt;Effective&lt;/th&gt;
&lt;th&gt;Filed&lt;/th&gt;
&lt;th&gt;Third party on 10 Sep&lt;/th&gt;
&lt;th&gt;Lag (at least)&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="https://find-and-update.company-information.service.gov.uk/company/SC190660" rel="noopener noreferrer"&gt;SC190660&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;Voluntary strike-off application (DS01). Register status: &lt;em&gt;active, proposal to strike off&lt;/em&gt;
&lt;/td&gt;
&lt;td&gt;8 Sep&lt;/td&gt;
&lt;td&gt;8 Sep&lt;/td&gt;
&lt;td&gt;Active, no strike-off flag&lt;/td&gt;
&lt;td&gt;2 days&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="https://find-and-update.company-information.service.gov.uk/company/15150296" rel="noopener noreferrer"&gt;15150296&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;Secretary appointed (AP03): Teresa D*** S******&lt;/td&gt;
&lt;td&gt;9 Sep&lt;/td&gt;
&lt;td&gt;9 Sep&lt;/td&gt;
&lt;td&gt;1 officer; secretary not listed&lt;/td&gt;
&lt;td&gt;1 day&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="https://find-and-update.company-information.service.gov.uk/company/12782688" rel="noopener noreferrer"&gt;12782688&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;Director resigned (TM01): Esther R*** F*****&lt;/td&gt;
&lt;td&gt;7 Sep&lt;/td&gt;
&lt;td&gt;9 Sep&lt;/td&gt;
&lt;td&gt;Still listed as a current director&lt;/td&gt;
&lt;td&gt;1 day (3 from the resignation)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="https://find-and-update.company-information.service.gov.uk/company/17450921" rel="noopener noreferrer"&gt;17450921&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;Incorporated (NEWINC)&lt;/td&gt;
&lt;td&gt;10 Sep&lt;/td&gt;
&lt;td&gt;10 Sep&lt;/td&gt;
&lt;td&gt;Company not found&lt;/td&gt;
&lt;td&gt;Same day&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;What stands out:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;All four lags are short.&lt;/strong&gt; One to two days from filing is what you would expect from a pipeline that refreshes about daily. That is the normal trade-off of any copy, not a scandal.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;"Updated today" is not "includes today's filings".&lt;/strong&gt; The page for 15150296 said it last updated from source on 9 September, the same day the AP03 was filed. The likeliest explanation is timing: the sync ran before that filing was published.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;12782688 shows why the two dates matter.&lt;/strong&gt; The resignation took effect on 7 September but only reached the register on 9 September. Against reality, the third-party record was three days behind, and two of those days happened before the aggregator could have known.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;17450921 was incorporated that morning.&lt;/strong&gt; Almost any copy misses a same-day incorporation. It is only useful as a test of how quickly a source picks up new companies.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Limits
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;A tiny, non-random sample.&lt;/strong&gt; Four companies, all chosen because they had just changed, which is the worst case for any copy. This says nothing about the average freshness of any source.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;One country, one day.&lt;/strong&gt; OpenCorporates covers far more countries than the UK, and far more than we do. Freshness elsewhere may be better or worse.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Lag is not the same as wrong data.&lt;/strong&gt; Each third-party record was presumably accurate when it was copied. The risk is treating a copy as if it were live.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Lower bounds only.&lt;/strong&gt; We looked once and did not measure when each record caught up.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Ways to get live data
&lt;/h2&gt;

&lt;p&gt;If the lag matters for your use case, ask the source at the moment you need the answer:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;The Companies House REST API.&lt;/strong&gt; Free, and the code above is most of what you need. The standard rate limit is 600 requests per five minutes.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;The Companies House streaming API.&lt;/strong&gt; Push-based: subscribe to officers, company profiles, filing history and more, and update your own records as changes are published. The right choice if you keep a local copy and need it current.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;A live multi-registry API.&lt;/strong&gt; If you need the same live lookups across several countries' registries through one interface, that is what we build at &lt;a href="https://openregistry.sophymarine.com" rel="noopener noreferrer"&gt;OpenRegistry&lt;/a&gt;. It queries the official registries at request time instead of serving a copy.&lt;/li&gt;
&lt;/ol&gt;

</description>
      <category>python</category>
      <category>api</category>
      <category>tutorial</category>
      <category>opendata</category>
    </item>
    <item>
      <title>We Found 4 Common Errors on Companies on OpenCorporates in Minutes</title>
      <dc:creator>OpenRegistry</dc:creator>
      <pubDate>Thu, 10 Sep 2026 08:22:11 +0000</pubDate>
      <link>https://dev.to/openregistry/we-found-10-major-errors-on-opencorporates-in-minutes-1m81</link>
      <guid>https://dev.to/openregistry/we-found-10-major-errors-on-opencorporates-in-minutes-1m81</guid>
      <description>&lt;p&gt;We checked them against the official Companies House register. OpenCorporates got all four wrong.&lt;/p&gt;

&lt;p&gt;Claude estimates roughly &lt;strong&gt;100,000 changes a day&lt;/strong&gt; and &lt;strong&gt;~700,000 a week&lt;/strong&gt;, and that is &lt;em&gt;officer records alone&lt;/em&gt;. Accounts, addresses, PSC filings and charges come on top. On UK companies alone, that leaves a huge population of potentially wrong records on OpenCorporates at any given moment.&lt;/p&gt;

&lt;p&gt;Every claim below is attached with evidence. Company numbers are included so you can check them yourself.&lt;/p&gt;

&lt;h2&gt;
  
  
  Four examples
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Company&lt;/th&gt;
&lt;th&gt;Companies House (official, checked 10 Sep 2026)&lt;/th&gt;
&lt;th&gt;OpenRegistry&lt;/th&gt;
&lt;th&gt;OpenCorporates&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;strong&gt;BRUCE &amp;amp; COMPANY LIMITED&lt;/strong&gt; &lt;code&gt;SC190660&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;Active, &lt;strong&gt;proposal to strike off&lt;/strong&gt;
&lt;/td&gt;
&lt;td&gt;✅ Active, proposal to strike off&lt;/td&gt;
&lt;td&gt;Active &lt;br&gt; ❌ &lt;strong&gt;Error:&lt;/strong&gt; strike-off warning missing&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;strong&gt;G.R.I.T HP UK LTD&lt;/strong&gt; &lt;code&gt;15150296&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;2 officers, incl. &lt;strong&gt;Teresa Dawn Swinton, Secretary&lt;/strong&gt; (appointed 9 Sep 2026)&lt;/td&gt;
&lt;td&gt;✅ 2 officers, including Swinton&lt;/td&gt;
&lt;td&gt;1 officer &lt;br&gt; ❌ &lt;strong&gt;Error:&lt;/strong&gt; a serving officer is missing&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;strong&gt;BRIDGEHAVEN SPECIALTY UK LTD&lt;/strong&gt; &lt;code&gt;12782688&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;Esther Ruth Felton, &lt;strong&gt;RESIGNED 7 Sep 2026&lt;/strong&gt;
&lt;/td&gt;
&lt;td&gt;✅ Felton under Resigned officers&lt;/td&gt;
&lt;td&gt;Esther Ruth Felton, director, 1 May 2023– (i.e. current) &lt;br&gt; ❌ &lt;strong&gt;Error:&lt;/strong&gt; a resigned director shown as active&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;strong&gt;LEXORA LAW CHAMBERS LTD&lt;/strong&gt; &lt;code&gt;17450921&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;Active, incorporated &lt;strong&gt;10 Sep 2026&lt;/strong&gt;
&lt;/td&gt;
&lt;td&gt;✅ Active, officer Ilyas Mohammed&lt;/td&gt;
&lt;td&gt;"Found 0 companies" &lt;br&gt; ❌ &lt;strong&gt;Error:&lt;/strong&gt; company missing entirely&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  The evidence
&lt;/h2&gt;

&lt;p&gt;Each company below shows the same record twice: what OpenCorporates reports, next to what the official Companies House register says at the same moment.&lt;/p&gt;

&lt;h3&gt;
  
  
  1. BRUCE &amp;amp; COMPANY LIMITED &lt;code&gt;SC190660&lt;/code&gt;
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fj3gnqfbnvadq7aqmpyh1.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fj3gnqfbnvadq7aqmpyh1.png" alt="**OpenCorporates** — status " width="799" height="514"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;**OpenCorporates&lt;/em&gt;* — status "Active". No mention of strike-off. The page claims "Last Update From Source: 9 September 2026", "Next Update: Daily".*&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fyeqf5kimq7mpjp226tpu.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fyeqf5kimq7mpjp226tpu.png" alt="**Companies House** — " width="800" height="451"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;**Companies House&lt;/em&gt;* — "Active — Active proposal to strike off".*&lt;/p&gt;

&lt;p&gt;A company on its way to being dissolved. One of the strongest risk signals the register carries, and it is absent from OpenCorporates.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. G.R.I.T HP UK LTD &lt;code&gt;15150296&lt;/code&gt;
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fao6dntpu9bixywnvnb5g.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fao6dntpu9bixywnvnb5g.png" alt="**OpenCorporates** — one officer only: Kelly Jayne Pudner." width="800" height="451"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;**OpenCorporates&lt;/em&gt;* — one officer only: Kelly Jayne Pudner.*&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F3phsl4m0b71ektb0kkgi.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F3phsl4m0b71ektb0kkgi.png" alt="**Companies House** — " width="800" height="693"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;**Companies House&lt;/em&gt;* — "2 officers / 0 resignations". Teresa Dawn Swinton, Secretary, appointed 9 September 2026, ACTIVE.*&lt;/p&gt;

&lt;p&gt;The secretary is missing. The same OpenCorporates page also contradicts itself: it claims &lt;strong&gt;"Last Update From Source: 9 September 2026"&lt;/strong&gt;, the very day the secretary was appointed, while also stating &lt;strong&gt;"Last Change Recorded: 3 June 2026."&lt;/strong&gt; It says it checked the source, and it says nothing has changed in three months.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. BRIDGEHAVEN SPECIALTY UK LTD &lt;code&gt;12782688&lt;/code&gt;
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Feyn2iwucsleklib5htbs.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Feyn2iwucsleklib5htbs.png" alt="**OpenCorporates** — " width="800" height="562"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;**OpenCorporates&lt;/em&gt;* — "ESTHER RUTH FELTON, director, 1 May 2023–". The open-ended dash means currently serving.*&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fod47gaevps6c9d7108lm.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fod47gaevps6c9d7108lm.png" alt="**Companies House** — Role: Director. Status: RESIGNED. Resigned on: 7 September 2026." width="800" height="413"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;**Companies House&lt;/em&gt;* — Role: Director. Status: RESIGNED. Resigned on: 7 September 2026.*&lt;/p&gt;

&lt;p&gt;A resigned director shown as active. Look at the OpenCorporates screenshot again and a second defect appears. The beneficial owners include both &lt;strong&gt;"David Emil Paulson"&lt;/strong&gt; and &lt;strong&gt;"David Emil Paulsson"&lt;/strong&gt;. &lt;strong&gt;"Erik William Matson"&lt;/strong&gt; is listed &lt;strong&gt;twice&lt;/strong&gt;. The director list carries &lt;strong&gt;"ARTUR NIEMCZEWSKI"&lt;/strong&gt; and &lt;strong&gt;"ARTUR PAWEL NIEMCZEWSKI"&lt;/strong&gt;, the same man, counted twice.&lt;/p&gt;

&lt;p&gt;Duplicated beneficial owners are not cosmetic. They inflate the UBO count and corrupt the screening step AML rules exist to enforce.&lt;/p&gt;

&lt;h3&gt;
  
  
  4. LEXORA LAW CHAMBERS LTD &lt;code&gt;17450921&lt;/code&gt;
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F9b9qktejnujk8fet2osm.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F9b9qktejnujk8fet2osm.png" alt="**OpenCorporates** — " width="800" height="286"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;**OpenCorporates&lt;/em&gt;* — "Found 0 companies". "Your search did not match any companies."*&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F8uczmouk4kugf1dtk49m.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F8uczmouk4kugf1dtk49m.png" alt="**Companies House** — LEXORA LAW CHAMBERS LTD, 17450921, Active, incorporated 10 September" width="799" height="576"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;**Companies House&lt;/em&gt;* — LEXORA LAW CHAMBERS LTD, 17450921, Active, incorporated 10 September 2026.*&lt;/p&gt;

&lt;p&gt;This one is not stale, it is absent. The company was incorporated on the morning of 10 September 2026 and appears on the official register immediately. OpenCorporates returns nothing, because a cached index cannot contain a company it has not ingested yet. Around 2,000 companies are incorporated in the UK on a normal working day, and every one of them is invisible to a scraper until its next pass.&lt;/p&gt;

&lt;h3&gt;
  
  
  5. OpenRegistry, queried live, gets all four right
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fke7m59364360cu40v7or.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fke7m59364360cu40v7or.png" alt="The same three companies, pulled live through OpenRegistry inside Claude. Source: Companie" width="800" height="1055"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;The same three companies, pulled live through OpenRegistry inside Claude. Source: Companies House via OpenRegistry, 10 September 2026, 04:58 and 08:44 (BST).&lt;/em&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;✅ BRUCE &amp;amp; COMPANY — "Active, proposal to strike off"&lt;/li&gt;
&lt;li&gt;✅ G.R.I.T HP UK — 2 officers, including Teresa Dawn Swinton&lt;/li&gt;
&lt;li&gt;✅ BRIDGEHAVEN — Esther Ruth Felton correctly under "Resigned officers"&lt;/li&gt;
&lt;li&gt;✅ LEXORA LAW CHAMBERS — present, Active, officer Ilyas Mohammed&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Four for four, with no cache to go stale.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why this keeps happening
&lt;/h2&gt;

&lt;p&gt;OpenCorporates scrapes and caches. A cache is a snapshot of a moving target. When the target moves 100,000 times a day, the snapshot is wrong somewhere, constantly. A faster cron job does not fix that. Not caching does.&lt;/p&gt;

&lt;h2&gt;
  
  
  The more reliable solution: OpenRegistry
&lt;/h2&gt;

&lt;p&gt;OpenRegistry queries the government registry at the moment you ask. There is no cache layer to go stale, and no scrape to silently drop a record.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Live&lt;/strong&gt; — every call hits the official registry in real time&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Unmodified&lt;/strong&gt; — the registry's own field names and values, with the source traceable back to the government record&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Cross-border&lt;/strong&gt; — national registries well beyond the UK, through one interface&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;MCP-native&lt;/strong&gt; — plugs directly into Claude and other AI agents, which is Evidence 7 above&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Cheaper API&lt;/strong&gt; — OpenRegistry API is much cheaper than OpenCorporates.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If you are doing KYB, AML screening, supplier onboarding, or investigative work, "probably right" is not a standard you can defend.&lt;/p&gt;

&lt;p&gt;All Companies House data on this page was verified live on 10 September 2026 via the official Companies House API. Company numbers are included throughout so every claim can be independently checked.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;About this page.&lt;/strong&gt; OpenRegistry is published by Sophymarine, so this comparison is written by a party with a commercial interest in one of the tools on it. Figures and product claims for the other vendors come from each vendor's own public material, linked inline where applicable. Reviewed 2026-09-10.&lt;/p&gt;

&lt;p&gt;Source-of-truth for this page is the &lt;a href="https://github.com/sophymarine/openregistry#readme" rel="noopener noreferrer"&gt;public docs repo README&lt;/a&gt;. Connect any MCP client to &lt;code&gt;https://openregistry.sophymarine.com/mcp&lt;/code&gt;.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;All Companies House data verified live on 10 September 2026 via the official Companies House API. Full version with side-by-side evidence: &lt;a href="https://openregistry.sophymarine.com/docs/opencorporates-errors" rel="noopener noreferrer"&gt;openregistry.sophymarine.com/docs/opencorporates-errors&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;a href="https://openregistry.sophymarine.com" rel="noopener noreferrer"&gt;openregistry.sophymarine.com&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;

</description>
      <category>opendata</category>
      <category>api</category>
      <category>data</category>
      <category>compliance</category>
    </item>
    <item>
      <title>Live company-registry data for AI agents, from one endpoint</title>
      <dc:creator>OpenRegistry</dc:creator>
      <pubDate>Wed, 09 Sep 2026 03:56:27 +0000</pubDate>
      <link>https://dev.to/openregistry/live-company-registry-data-for-ai-agents-from-one-endpoint-1fj9</link>
      <guid>https://dev.to/openregistry/live-company-registry-data-for-ai-agents-from-one-endpoint-1fj9</guid>
      <description>&lt;p&gt;Company data straight from the official source, for AI assistants and developers.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://openregistry.sophymarine.com" rel="noopener noreferrer"&gt;OpenRegistry&lt;/a&gt; gives you live, source-linked access to national company registries — search a company, then pull its officers, shareholders, filings, and raw filing documents, exactly as the government registry holds them.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Live, direct-from-registry (no stale cache)&lt;/li&gt;
&lt;li&gt;MCP-native, so it plugs straight into AI agents&lt;/li&gt;
&lt;li&gt;Free for anonymous use, no API key to start&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Try it: &lt;a href="https://openregistry.sophymarine.com" rel="noopener noreferrer"&gt;https://openregistry.sophymarine.com&lt;/a&gt;&lt;/p&gt;

</description>
      <category>opendata</category>
      <category>api</category>
      <category>mcp</category>
      <category>ai</category>
    </item>
    <item>
      <title>OpenRegistry — New Version Available</title>
      <dc:creator>OpenRegistry</dc:creator>
      <pubDate>Mon, 07 Sep 2026 07:11:35 +0000</pubDate>
      <link>https://dev.to/openregistry/openregistry-new-version-available-57p0</link>
      <guid>https://dev.to/openregistry/openregistry-new-version-available-57p0</guid>
      <description>&lt;p&gt;A new version of &lt;a href="https://openregistry.sophymarine.com" rel="noopener noreferrer"&gt;OpenRegistry&lt;/a&gt; is now available, with strengthened infrastructure.&lt;/p&gt;

&lt;p&gt;Live, source-linked access to official company registries for AI assistants and developers — &lt;a href="https://openregistry.sophymarine.com" rel="noopener noreferrer"&gt;https://openregistry.sophymarine.com&lt;/a&gt;&lt;/p&gt;

</description>
      <category>opendata</category>
      <category>api</category>
      <category>mcp</category>
      <category>ai</category>
    </item>
    <item>
      <title>India's MCA feed still carries the Y2K date bug</title>
      <dc:creator>OpenRegistry</dc:creator>
      <pubDate>Fri, 17 Jul 2026 15:01:13 +0000</pubDate>
      <link>https://dev.to/openregistry/indias-mca-feed-still-carries-the-y2k-date-bug-2h03</link>
      <guid>https://dev.to/openregistry/indias-mca-feed-still-carries-the-y2k-date-bug-2h03</guid>
      <description>&lt;p&gt;Two-digit incorporation years still turn up in parts of the MCA bulk feeds. Last month I hit a CIN record where an upstream parser treated &lt;code&gt;01-01-00&lt;/code&gt; as 1900 during a sanctions-linked subsidiary trace. Small bug. Big consequences. One bad date can push a company earlier than the existence of its own parent when you are rebuilding ownership timelines across four jurisdictions.&lt;/p&gt;

&lt;p&gt;India’s Ministry of Corporate Affairs exposes company data through MCA services and downstream data.gov.in datasets, though the structure swings wildly between sources. Some records arrive properly typed. Others still carry formatting decisions inherited from filing systems built long before anybody expected API consumers to parse them automatically. You can pull useful registry intelligence out of the data, though it helps to treat filings as statutory records rather than reference data cleaned for analysts.&lt;/p&gt;

&lt;p&gt;OpenRegistry does not currently serve the &lt;code&gt;IN&lt;/code&gt; jurisdiction. The live matrix marks India as inactive, so there is no MCP passthrough for MCA queries right now. Registry behaviour shifts often around filing access, session handling, or CAPTCHA enforcement. Better to mark coverage offline than pretend an old integration still works.&lt;/p&gt;

&lt;p&gt;The structure still matters because Indian entities show up constantly in cross-border reporting chains. Offshore structures involving Mauritius, Cayman, Singapore, or Dubai often terminate in an Indian operating company. During one ownership reconstruction tied to procurement records, I ended up matching DIN numbers against director names from leaked spreadsheets because the register itself handled transliteration inconsistently across filings.&lt;/p&gt;

&lt;p&gt;The identifiers are fairly readable once you know the layout. The Corporate Identity Number, or CIN, encodes listing status, industry classification, state registration, incorporation year, plus registrar office. Director records use DIN identifiers. LLP entities carry LLPIN values instead.&lt;/p&gt;

&lt;p&gt;When MCA responses are available programmatically, the payloads usually expose fields like:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;cin&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_incorporation&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;registered_office_address&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;authorised_capital&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;paid_up_capital&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;director_din&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;director_name&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;filing_date&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Normalisation causes most of the pain. Addresses arrive as free-text blocks with inconsistent state abbreviations. Historical filings contain OCR artefacts. Director names drift between annual returns through spacing changes or shifting initials. Exact string matching falls apart quickly if you are tracing politically exposed persons or procurement beneficiaries.&lt;/p&gt;

&lt;p&gt;Public access and paid retrieval are split awkwardly as well. Basic company profiles are accessible through MCA-facing services. Full filings follow another route entirely. Annual returns, balance sheets, charge documents, incorporation PDFs: many sit behind fee workflows or session-bound requests that break automated collection.&lt;/p&gt;

&lt;p&gt;India also handles beneficial ownership differently from some European registers that briefly exposed broader public UBO access before the CJEU C-601/20 ruling shifted the position across the EU. Significant beneficial ownership obligations exist under Indian company law, though public machine-readable access remains narrow.&lt;/p&gt;

&lt;p&gt;The filings still matter because they create timelines that can be checked later. Director appointments, registered office changes, strike-off notices, charge creation dates: each becomes an anchor point during reporting work. Newsrooms working from leaked datasets usually care less about whether a register feels modern and more about whether another team can reproduce the same trail six months later.&lt;/p&gt;

&lt;p&gt;If India coverage returns inside OpenRegistry, the MCP flow would probably begin with a company 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="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"tool"&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;"IN"&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;"Adani Enterprises"&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;After that, a profile pull against the CIN returned from 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="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"tool"&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;"IN"&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;"L51100GJ1988PLC010856"&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 reporting work, the next step is usually filing enumeration rather than stopping at the profile layer:&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;"tool"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&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;"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;"IN"&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;"L51100GJ1988PLC010856"&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;Chronology matters here. Charge satisfaction records can expose lender relationships that never appear in company websites or investor material. Director resignations often line up with enforcement actions or media scrutiny. Some entities look dormant until you inspect annual returns directly and notice the same address reused repeatedly across related companies.&lt;/p&gt;

&lt;p&gt;Language handling creates another awkward corner case. MCA records are mostly English-language, though supporting documents can include transliterated names from Hindi or regional languages. Matching against court filings, customs data, or leaked procurement spreadsheets gets fuzzy fast. I have seen the same surname rendered three different ways across registry extracts tied back to a single DIN.&lt;/p&gt;

&lt;p&gt;Compared with the legacy paid databases, direct registry access gives you provenance. You can cite the statutory filing itself rather than relying on a reshaped ownership graph. Aggregators often flatten Indian entities into simplified structures while discarding registrar metadata that later matters during fact-checking or libel review.&lt;/p&gt;

&lt;p&gt;India also sits in an uncomfortable middle ground for compliance engineering. The register is broad enough to support KYB work, though not clean enough to trust without review. Edge cases keep surfacing: struck-off restorations, duplicated director names, recycled addresses, historical filing corrections that overwrite earlier assumptions.&lt;/p&gt;

&lt;p&gt;OpenRegistry currently serves 30 active jurisdictions including GB, KY, RU, HK, and IT. India remains inactive in the live matrix today. When &lt;code&gt;IN&lt;/code&gt; returns, the MCP endpoint will expose upstream MCA fields directly instead of reinterpreting them. Current jurisdiction availability is listed at openregistry.sophymarine.com/mcp&lt;/p&gt;

</description>
      <category>programming</category>
      <category>mcp</category>
      <category>kyb</category>
      <category>legaltech</category>
    </item>
    <item>
      <title>Indonesia UBO checks after the AML clampdown</title>
      <dc:creator>OpenRegistry</dc:creator>
      <pubDate>Thu, 16 Jul 2026 15:01:23 +0000</pubDate>
      <link>https://dev.to/openregistry/indonesia-ubo-checks-after-the-aml-clampdown-4pd0</link>
      <guid>https://dev.to/openregistry/indonesia-ubo-checks-after-the-aml-clampdown-4pd0</guid>
      <description>&lt;p&gt;Two Indonesian shareholders with the same name appeared in one acquisition structure. The legacy paid database collapsed them into a single beneficial owner because both addresses had been cut down to district level. AHU filings showed different NIK-linked records and different appointment dates. The control analysis for a Singapore-linked vehicle changed after that.&lt;/p&gt;

&lt;p&gt;Indonesia’s Ministry of Law and Human Rights operates the AHU system for company administration, including PT Perorangan records and parts of the beneficial ownership disclosure process. During diligence, the interesting detail is rarely the headline company status. Filing cadence matters more. Officer rotations matter too, especially when shareholder declarations stop matching the offshore structure wrapped around them.&lt;/p&gt;

&lt;p&gt;Older filings are where things usually get awkward. Indonesian entities often appear under several transliterations, particularly where nominee arrangements exist or historic spelling changes carried forward into later paperwork. One director can surface under slightly different names across separate filings. Aggregators tend to flatten those distinctions. Sometimes that is exactly the detail you needed before signing.&lt;/p&gt;

&lt;p&gt;The raw fields worth checking first are usually:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;company_name&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;registration_number&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;entity_type&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_establishment&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;share_capital&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;jurisdiction_data.pengurus&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;jurisdiction_data.pemegang_saham&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;jurisdiction_data.pemilik_manfaat&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;code&gt;pengurus&lt;/code&gt; usually contains directors and commissioners. &lt;code&gt;pemegang_saham&lt;/code&gt; stores shareholder declarations where available. &lt;code&gt;pemilik_manfaat&lt;/code&gt; maps to beneficial ownership disclosures under Indonesia’s AML regime.&lt;/p&gt;

&lt;p&gt;Those structures matter because Indonesian corporate control is often layered through nominee holdings or Singapore family office vehicles. A cleaned entity summary can bury filing-order inconsistencies that point to a recent restructuring.&lt;/p&gt;

&lt;p&gt;One Jakarta manufacturing target looked stable in the subscription databases last year. The AHU filing sequence showed three commissioner changes inside four months, followed by a capital amendment shortly before debt refinancing. That raised immediate questions around lender consent and side agreements. Nothing had been concealed. The aggregator copy was stale.&lt;/p&gt;

&lt;p&gt;PT Perorangan entities add another wrinkle. Some records are sparse compared with larger PT structures, and historical depth varies depending on formation date or filing path. Older entities can have uneven metadata coverage. It happens.&lt;/p&gt;

&lt;p&gt;Public data also has limits.&lt;/p&gt;

&lt;p&gt;Indonesia does not expose every ownership layer required for a full UBO reconstruction, especially when offshore entities sit above the local operating company. Some AML-sensitive material stays gated or absent from public retrieval flows. OpenRegistry does not bypass those restrictions. It also does not infer missing ownership chains from partial filings.&lt;/p&gt;

&lt;p&gt;Document handling can slow diligence down. Certain filings appear only as references or metadata pointers rather than machine-readable documents. If you are tracing a director replacement during exclusivity, local counsel may still need to pull notarised paperwork directly.&lt;/p&gt;

&lt;p&gt;OpenRegistry does not currently serve Indonesia in the public MCP matrix. &lt;code&gt;ID&lt;/code&gt; returns &lt;code&gt;active: false&lt;/code&gt; from &lt;code&gt;list_jurisdictions&lt;/code&gt;. Pipelines should check jurisdiction availability at runtime instead of assuming static coverage.&lt;/p&gt;

&lt;p&gt;A typical capability check looks like this:&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;"tool"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"list_jurisdictions"&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;"ID"&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;If Indonesia becomes active again, the MCP flow follows the same pattern used for Companies House or KVK lookups through OpenRegistry.&lt;/p&gt;

&lt;p&gt;Searching for an entity:&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;"tool"&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;"ID"&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;"PT Alam Sutera Realty Tbk"&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;Pulling the company 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="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"tool"&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;"ID"&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;"example-registration-number"&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;Officer retrieval during diligence would usually look like this:&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;"tool"&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;"ID"&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;"example-registration-number"&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;Shareholder retrieval 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="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"tool"&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_shareholders"&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;"ID"&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;"example-registration-number"&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;Where beneficial ownership data is legally exposed through the registry flow, &lt;code&gt;get_persons_with_significant_control&lt;/code&gt; returns the upstream fields directly. There is no confidence-scored ownership graph layered on top.&lt;/p&gt;

&lt;p&gt;That distinction matters in M&amp;amp;A work. An AI layer should not decide that two similarly named directors are the same person because their birth years roughly line up. You need the raw payloads, filing timestamps, and source-specific identifiers. Otherwise small mismatches disappear into a merged profile.&lt;/p&gt;

&lt;p&gt;Indonesia is also one of the places where chronology matters more than polished summaries. Capital amendments, commissioner rotations, and shareholder declarations can move quickly around financing events. A six-month lag from an aggregator crawl is enough to miss a control shift.&lt;/p&gt;

&lt;p&gt;Cross-border structures add another complication. Indonesian operating companies are often paired with Singapore holding entities, Hong Kong intermediaries, or Cayman financing vehicles. OpenRegistry currently serves HK and KY in the live matrix, which makes side-by-side registry verification useful when tracing outbound ownership chains. Naming inconsistencies still need manual review.&lt;/p&gt;

&lt;p&gt;For compliance engineering, the useful pattern is direct registry retrieval with minimal interpretation. Pull the upstream fields. Preserve filing timestamps. Compare appointments across jurisdictions, then decide where human review is required.&lt;/p&gt;

&lt;p&gt;OpenRegistry exposes live company registry access over MCP without intermediary parsing layers. Jurisdiction availability changes over time, so production systems should always query the runtime matrix first: &lt;a href="https://openregistry.sophymarine.com/mcp" rel="noopener noreferrer"&gt;https://openregistry.sophymarine.com/mcp&lt;/a&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>mcp</category>
      <category>kyb</category>
      <category>compliance</category>
    </item>
    <item>
      <title>Malaysia SSM e-Info: live KYB checks without aggregator lag</title>
      <dc:creator>OpenRegistry</dc:creator>
      <pubDate>Wed, 15 Jul 2026 15:01:17 +0000</pubDate>
      <link>https://dev.to/openregistry/malaysia-ssm-e-info-live-kyb-checks-without-aggregator-lag-5e62</link>
      <guid>https://dev.to/openregistry/malaysia-ssm-e-info-live-kyb-checks-without-aggregator-lag-5e62</guid>
      <description>&lt;h1&gt;
  
  
  SSM company records change faster than most KYB pipelines
&lt;/h1&gt;

&lt;p&gt;Malaysia’s SSM e-Info register updates quickly enough that stale commercial datasets stand out during onboarding reviews. We hit this with a merchant whose registered address had already changed in SSM while a paid database still carried the previous location weeks later.&lt;/p&gt;

&lt;p&gt;That gap causes trouble in ASEAN onboarding work. Malaysian entities often appear inside ownership chains linked to Singapore, Hong Kong, or Cayman structures. When audit reviews the file later, “the vendor had not refreshed yet” does not carry much weight if the register-of-record already showed different information.&lt;/p&gt;

&lt;p&gt;OpenRegistry connects directly to SSM e-Info through MCP and returns the upstream fields live. We do not reshape the register response into an internal schema before returning it. Your workflow or assistant consumes the payload as SSM supplied it.&lt;/p&gt;

&lt;h2&gt;
  
  
  What SSM e-Info actually returns
&lt;/h2&gt;

&lt;p&gt;The useful part of Malaysian register data is rarely the company name by itself. Status changes matter. Officer appointments matter. Filing history usually matters more than branding details during KYB review.&lt;/p&gt;

&lt;p&gt;A standard &lt;code&gt;get_company_profile&lt;/code&gt; call returns 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;incorporation_date&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;registered_address&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;entity_type&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;jurisdiction_data&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;code&gt;jurisdiction_data&lt;/code&gt; preserves SSM wording and values exactly as supplied upstream. Audit teams tend to care about this because evidence packs can cite the original register language instead of a vendor interpretation layered over the top.&lt;/p&gt;

&lt;p&gt;Officer records become useful once ownership checks or sanctions review starts. &lt;code&gt;get_officers&lt;/code&gt; returns director names, appointment dates, resignation dates where available, plus officer roles supplied by SSM.&lt;/p&gt;

&lt;p&gt;Filing data is where Malaysian KYB work stops being cosmetic. &lt;code&gt;list_filings&lt;/code&gt; exposes filing names, filing dates, document references, and availability metadata. For higher-risk counterparties, recent filing activity can matter more than the entity’s mere existence. A dormant shell with no current filings usually triggers another look.&lt;/p&gt;

&lt;p&gt;Entity names create their own mess. Malaysian companies frequently include punctuation, abbreviations, or legal suffix variations that break simple fuzzy matching logic. Direct register lookup cuts down false positives because you are querying the current source rather than consuming pre-normalised exports.&lt;/p&gt;

&lt;h2&gt;
  
  
  What you will not get from SSM
&lt;/h2&gt;

&lt;p&gt;SSM is a company register. It is not a sanctions source or beneficial ownership service.&lt;/p&gt;

&lt;p&gt;OpenRegistry does not return sanctions screening, PEP data, or credit scoring because those datasets do not exist in the upstream register. You still need a separate sanctions process against OFAC, UK, EU, or local lists.&lt;/p&gt;

&lt;p&gt;Beneficial ownership visibility also varies by jurisdiction. Malaysia does not expose unrestricted UBO access in the same way some compliance teams became accustomed to under earlier European AML workflows. Access rules differ by country. Legal regimes differ too.&lt;/p&gt;

&lt;p&gt;That distinction matters more now because broad public UBO access has narrowed across several jurisdictions following decisions such as CJEU C-601/20. Compliance systems need to separate register checks from ownership analysis and sanctions review rather than treating them as one combined lookup.&lt;/p&gt;

&lt;p&gt;Document availability can also be uneven. Some filings expose metadata without exposing downloadable source documents through the public interface. Workflows should expect partial retrieval. Plenty do.&lt;/p&gt;

&lt;h2&gt;
  
  
  Querying Malaysia through OpenRegistry MCP
&lt;/h2&gt;

&lt;p&gt;The Malaysia endpoint is active in the current OpenRegistry jurisdiction matrix.&lt;/p&gt;

&lt;p&gt;Most onboarding flows start with a direct company 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="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"tool"&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;"MY"&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;"Grab Holdings"&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;That returns candidate entities from SSM with the original register identifiers preserved.&lt;/p&gt;

&lt;p&gt;Once you have the company number, pull the profile directly:&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;"tool"&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;"MY"&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;"980177-W"&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;Enhanced due diligence usually continues with officer and filing retrieval:&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;"tool"&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;"MY"&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;"980177-W"&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;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;"tool"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&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;"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;"MY"&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;"980177-W"&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;OpenRegistry does not maintain historical snapshots of Malaysian register data. Every request hits the live upstream source. For onboarding controls, we generally prefer that tradeoff because decisions reference the current register state rather than a cached export from several weeks earlier.&lt;/p&gt;

&lt;p&gt;The operational effect is straightforward. If SSM updates an officer appointment today, the next query sees the revised record immediately. No downstream refresh cycle exists in the middle.&lt;/p&gt;

&lt;h2&gt;
  
  
  Audit evidence and regulator expectations
&lt;/h2&gt;

&lt;p&gt;During KYB reviews, internal audit teams increasingly ask the same thing: what was the source-of-record when the onboarding decision was made?&lt;/p&gt;

&lt;p&gt;Commercial database exports often struggle here because they cannot prove the exact upstream register state at decision time. We moved several onboarding checks back to direct register retrieval after running into that issue repeatedly.&lt;/p&gt;

&lt;p&gt;Malaysia is a good example because cross-border merchant structures often span several registers at once. One review may involve an SSM operating entity, a Hong Kong holding company, plus a Cayman parent vehicle.&lt;/p&gt;

&lt;p&gt;OpenRegistry currently covers MY alongside jurisdictions including HK, KY, GB, NL, and NZ through the same MCP interface. Teams can keep jurisdiction-specific review logic while standardising transport and authentication across registers.&lt;/p&gt;

&lt;p&gt;That removes a common engineering problem inside compliance systems. Registry integrations often turn into brittle scrapers with inconsistent authentication flows and uneven refresh cycles.&lt;/p&gt;

&lt;p&gt;For higher-risk onboarding queues, we still pair register retrieval with sanctions resolution and manual document review. Register data alone is not sufficient for AML controls. Direct SSM access does improve traceability because investigators can point to the register response itself rather than a transformed intermediary record.&lt;/p&gt;

&lt;p&gt;OpenRegistry’s Malaysia endpoint is available at &lt;a href="https://openregistry.sophymarine.com/mcp" rel="noopener noreferrer"&gt;https://openregistry.sophymarine.com/mcp&lt;/a&gt;&lt;/p&gt;

</description>
      <category>programming</category>
      <category>mcp</category>
      <category>kyb</category>
      <category>compliance</category>
    </item>
    <item>
      <title>Hong Kong Companies Registry: live filings without cache lag</title>
      <dc:creator>OpenRegistry</dc:creator>
      <pubDate>Tue, 14 Jul 2026 15:01:13 +0000</pubDate>
      <link>https://dev.to/openregistry/hong-kong-companies-registry-live-filings-without-cache-lag-2a26</link>
      <guid>https://dev.to/openregistry/hong-kong-companies-registry-live-filings-without-cache-lag-2a26</guid>
      <description>&lt;p&gt;Hong Kong company numbers survive renames. During IPO diligence, that identifier is often more dependable than the trading-name history copied across bank files and legacy paid databases.&lt;/p&gt;

&lt;p&gt;The Hong Kong Companies Registry (公司註冊處) exposes enough structured data to trace entities across borders without spending afternoons walking PDFs by hand. We kept hitting this in Cayman-HK-China structures where the Hong Kong company became the only stable anchor across financing rounds, director reshuffles, and offshore reorganisations.&lt;/p&gt;

&lt;p&gt;OpenRegistry connects to the live register through MCP. Registry-specific fields remain inside &lt;code&gt;jurisdiction_data&lt;/code&gt;, which means the response still carries upstream values instead of flattening everything into one normalised schema.&lt;/p&gt;

&lt;h2&gt;
  
  
  What the Hong Kong register returns
&lt;/h2&gt;

&lt;p&gt;A standard Hong Kong company profile usually contains the company number, current legal name, previous names, incorporation date, entity status, registered office, directors, company secretary details, plus filing metadata.&lt;/p&gt;

&lt;p&gt;The bilingual name fields end up mattering more than expected. Some entities appear under slightly different English transliterations across loan agreements or exchange filings. The Chinese name tends to stay stable. Matching on company number sidesteps most of the confusion.&lt;/p&gt;

&lt;p&gt;Filing history matters more.&lt;/p&gt;

&lt;p&gt;Director appointments, cessations, share allotments, and office-address changes often land quickly in the register. We have seen debt issuance reviews stall because a director rotation appeared less than two weeks before signing.&lt;/p&gt;

&lt;p&gt;The MCP calls are simple:&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;"tool"&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;"HK"&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;"Pacific Century"&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;That returns the registry number used for the profile lookup:&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;"tool"&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;"HK"&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;"1234567"&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;Most finance teams then jump straight into 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="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"tool"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&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;"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;"HK"&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;"1234567"&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;Freshness is the part that matters here. OpenRegistry does not run nightly sync jobs or serve delayed mirrors. Each request goes upstream live.&lt;/p&gt;

&lt;h2&gt;
  
  
  PSC access after the 2018 changes
&lt;/h2&gt;

&lt;p&gt;Hong Kong introduced the Significant Controllers Register regime in 2018 through amendments to the Companies Ordinance. At a distance it resembles UK PSC reporting, though the access model is tighter.&lt;/p&gt;

&lt;p&gt;You should not expect full public retrieval of beneficial ownership records through OpenRegistry because the underlying register does not broadly expose them. The restriction comes from the source itself.&lt;/p&gt;

&lt;p&gt;That leaves holes in AML and onboarding flows. A Hong Kong filing can confirm directors, company secretaries, incorporation status, and certain control relationships. It usually cannot complete the entire UBO chain when Cayman or BVI entities sit above the operating company.&lt;/p&gt;

&lt;p&gt;The same pattern now shows up across several jurisdictions that tightened public-register access after privacy rulings and AML-related restrictions.&lt;/p&gt;

&lt;h2&gt;
  
  
  Filing quirks that appear during diligence
&lt;/h2&gt;

&lt;p&gt;The bilingual naming issue catches teams constantly. A Traditional Chinese company name may map to several English transliterations depending on the filing year or whichever intermediary prepared the documents. Bank records are rarely consistent.&lt;/p&gt;

&lt;p&gt;Offshore layering creates another headache. Many Hong Kong entities sit between a Cayman holding structure and mainland operating companies. The register can verify the Hong Kong legal entity cleanly. It does not rebuild the broader ownership chain for you.&lt;/p&gt;

&lt;p&gt;Timing matters too.&lt;/p&gt;

&lt;p&gt;Metadata for a filing can appear before the underlying document becomes accessible. Some records stay metadata-only. Others require additional access conditions before retrieval works.&lt;/p&gt;

&lt;p&gt;When a document is available, you can fetch it directly from the filing identifier:&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;"tool"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"fetch_document"&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;"HK"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"document_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;"abcd1234"&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;Coverage varies by filing type. Certain records expose only filing references with timestamps attached.&lt;/p&gt;

&lt;h2&gt;
  
  
  Using multiple registries in one workflow
&lt;/h2&gt;

&lt;p&gt;Cross-border diligence rarely ends in Hong Kong. A typical review might begin with a Cayman exempted company, move through Hong Kong subsidiaries, then finish at a UK financing vehicle tied to the same group.&lt;/p&gt;

&lt;p&gt;OpenRegistry currently covers 27 jurisdictions. The useful part is not normalisation by itself. It is having one MCP interface that moves between registers without maintaining separate scraper logic for every source system.&lt;/p&gt;

&lt;p&gt;For lender onboarding or IPO preparation, reproducibility matters more than convenience. Teams need the actual register entry that supported a director check or entity verification step.&lt;/p&gt;

&lt;p&gt;Keeping upstream fields intact helps there. If the Hong Kong register returns a bilingual address variant or filing code exactly as submitted, the audit trail remains visible instead of disappearing behind vendor-side enrichment.&lt;/p&gt;

&lt;p&gt;There is a trade-off. OpenRegistry does not infer ownership structures or generate corporate family trees automatically. You still need to interpret the registry data yourself.&lt;/p&gt;

&lt;p&gt;You can connect an MCP client directly to the Hong Kong register through OpenRegistry at openregistry.sophymarine.com/mcp&lt;/p&gt;

</description>
      <category>programming</category>
      <category>mcp</category>
      <category>kyb</category>
      <category>compliance</category>
    </item>
    <item>
      <title>Mexico’s PSM registry after CTA: what filings still matter</title>
      <dc:creator>OpenRegistry</dc:creator>
      <pubDate>Mon, 13 Jul 2026 15:01:39 +0000</pubDate>
      <link>https://dev.to/openregistry/mexicos-psm-registry-after-cta-what-filings-still-matter-28h5</link>
      <guid>https://dev.to/openregistry/mexicos-psm-registry-after-cta-what-filings-still-matter-28h5</guid>
      <description>&lt;p&gt;Mexico’s Public Registry of Commerce still runs through state-level implementation. Look up the same company twice and historical coverage can shift depending on which Registro Público de Comercio office actually digitised its books.&lt;/p&gt;

&lt;p&gt;That causes friction in cross-border diligence work. Mexican entities turn up constantly in North American ownership structures, though plenty of compliance teams still rely on stale aggregator exports instead of checking Secretaría de Economía source records.&lt;/p&gt;

&lt;p&gt;The distinction that matters for legal and AML analysis sits between what the PSM exposes under commercial registration law and what lives elsewhere under tax, banking, or beneficial-ownership regimes. Mexico does not maintain a public UBO register comparable to the EU access model that existed before C-601/20. If you are testing ownership under OFAC’s 50% rule or UK sanctions guidance, the Registro Público de Comercio rarely settles the question by itself.&lt;/p&gt;

&lt;p&gt;OpenRegistry exposes the Mexican register through MCP, which means queries run against the registry flow directly. No browser automation needed. The MX jurisdiction is active on the server.&lt;/p&gt;

&lt;p&gt;A typical &lt;code&gt;search_companies&lt;/code&gt; request looks like this:&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;"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;"MX"&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;"GRUPO BIMBO"&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 existence checks, merger history, or authority review, &lt;code&gt;get_company_profile&lt;/code&gt; tends to matter more:&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;"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;"MX"&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;"N-2023045678"&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;Response structure changes depending on the upstream office, though several fields appear regularly under &lt;code&gt;jurisdiction_data&lt;/code&gt;. You will usually see &lt;code&gt;razon_social&lt;/code&gt;, &lt;code&gt;folio_mercantil&lt;/code&gt;, &lt;code&gt;estado&lt;/code&gt;, &lt;code&gt;fecha_constitucion&lt;/code&gt;, &lt;code&gt;capital_social&lt;/code&gt;, &lt;code&gt;objeto_social&lt;/code&gt;. &lt;code&gt;administradores&lt;/code&gt; appears often too.&lt;/p&gt;

&lt;p&gt;That last field gets misread all the time. Appointment as administrador único or board member establishes registered authority. It does not establish beneficial ownership under FATF-style control analysis. In deposition work and transactional disputes, that distinction carries weight.&lt;/p&gt;

&lt;p&gt;Mexican filings also come with quirks around notarial intervention. Constitutive acts and amendments are commonly tied to protocolo numbers and notary references rather than the tidier filing identifiers seen in UK or Nordic registers. When tracing authority through mergers or capital increases, preserving the original notarial metadata matters.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;list_filings&lt;/code&gt; helps reconstruct the sequence:&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;"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;"MX"&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;"N-2023045678"&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;Depending on the office, filing descriptions may expose constitutive deeds, merger registrations, bylaw amendments, liquidation entries. Some are sparse. Others contain surprisingly detailed references pulled from older index systems.&lt;/p&gt;

&lt;p&gt;A few filings expose both inscription dates and protocol execution dates. Those dates are not interchangeable. Under Mexican commercial practice, the execution date before the notary and the later registration date can change priority analysis.&lt;/p&gt;

&lt;p&gt;The register also does not solve beneficial-ownership diligence on its own. Mexico’s AML framework under the Ley Federal para la Prevención e Identificación de Operaciones con Recursos de Procedencia Ilícita imposes separate reporting duties for vulnerable activities, though those records are not publicly exposed through PSM queries.&lt;/p&gt;

&lt;p&gt;That limitation shows up fast when foreign counsel try mapping Mexican entities into Corporate Transparency Act workflows. FinCEN BOI reporting under 31 CFR 1010.380 is a US federal obligation. It does not create reciprocal public access to Mexican ownership records. Teams still combine registry material with shareholder registers, notarised corporate books, sometimes local counsel certifications.&lt;/p&gt;

&lt;p&gt;OpenRegistry does not infer ownership or rebuild hidden control chains. The MX integration returns upstream registry fields exposed by the source office. Nothing more.&lt;/p&gt;

&lt;p&gt;For officer review, &lt;code&gt;get_officers&lt;/code&gt; can help establish who held registered authority at a particular point in time:&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;"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;"MX"&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;"N-2023045678"&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;Results vary sharply by state office and filing depth. Some entities expose detailed officer names with appointment dates attached. Others expose little beyond current management references pulled from the latest inscription.&lt;/p&gt;

&lt;p&gt;Historical coverage stays uneven. Older filings sometimes survive only as scanned ledger pages or partial index entries. Some registries digitised aggressively during the 2010s. Others still expose fragmented archives with obvious gaps. If a matter depends on pre-digital amendments, expect missing pieces.&lt;/p&gt;

&lt;p&gt;Direct registry access helps more than polished aggregator summaries in those cases. For sanctions analysis or acquisition diligence, counsel often need the exact wording attached to a filing. A translated summary can miss whether a capital increase was authorised, merely proposed, or recorded subject to conditions.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;fetch_document&lt;/code&gt; retrieves source material where the registry office exposes 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="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;"MX"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"document_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;"DOC-884421"&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;Document availability is inconsistent. Some offices expose PDFs directly. Others return only metadata or filing references. A few still point back to manual retrieval workflows.&lt;/p&gt;

&lt;p&gt;The evidentiary distinction matters here. The Mexican commercial register establishes notice and registration status for corporate acts. It is not a complete AML transparency system. After C-601/20, many lawyers became more careful about conflating commercial registration with beneficial-ownership disclosure. Mexican registry work demands the same discipline.&lt;/p&gt;

&lt;p&gt;For KYB tooling, the useful part of the MCP model is that an assistant can query the register live during a workflow instead of relying on cached exports from the legacy paid databases. The source remains the registry office of record.&lt;/p&gt;

&lt;p&gt;OpenRegistry’s MX endpoint is available through the remote MCP server at &lt;a href="https://openregistry.sophymarine.com/mcp" rel="noopener noreferrer"&gt;https://openregistry.sophymarine.com/mcp&lt;/a&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>mcp</category>
      <category>compliance</category>
      <category>legaltech</category>
    </item>
    <item>
      <title>Taiwan GCIS records: fields you only notice mid-investigation</title>
      <dc:creator>OpenRegistry</dc:creator>
      <pubDate>Sun, 12 Jul 2026 15:01:02 +0000</pubDate>
      <link>https://dev.to/openregistry/taiwan-gcis-records-fields-you-only-notice-mid-investigation-l6p</link>
      <guid>https://dev.to/openregistry/taiwan-gcis-records-fields-you-only-notice-mid-investigation-l6p</guid>
      <description>&lt;p&gt;Taiwan’s GCIS register will often show a company’s status history in Chinese long before English-language databases settle on one transliteration. That turns into a real problem when you are tracing a supplier linked to export controls, chip procurement, or an intermediary that has renamed itself three times in five years.&lt;/p&gt;

&lt;p&gt;GCIS has never been pleasant to work with from outside Taiwan. The records are public. Getting them cleanly is another matter. Browser flows break unexpectedly, character encoding goes sideways, and Romanisation shifts between datasets. Anyone who has matched a director from an OCCRP spreadsheet against a Taiwan filing has probably seen the same individual written three different ways: Wade-Giles once, Hanyu Pinyin elsewhere, then only the Chinese legal name in local coverage.&lt;/p&gt;

&lt;p&gt;OpenRegistry exposes live GCIS data through MCP without rewriting the upstream payloads. Small detail. Important one. The jurisdiction block stays intact instead of being flattened into a generic company card.&lt;/p&gt;

&lt;p&gt;For Taiwan entities, &lt;code&gt;get_company_profile&lt;/code&gt; will usually return fields like:&lt;/p&gt;

&lt;ul&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;capital_amount&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;responsible_person&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;registered_address&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;approved_establishment_date&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;registration_authority&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;change_approved_date&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;jurisdiction_data&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;code&gt;jurisdiction_data&lt;/code&gt; is usually where the interesting work starts. GCIS often carries the original Chinese-language values beside translated variants. If you are trying to determine whether “Formosa Technologies Ltd” from an offshore leak maps back to 台灣某某股份有限公司 in the statutory filing, those source-language values matter more than whatever English alias ended up circulating later.&lt;/p&gt;

&lt;p&gt;Taiwan records also separate establishment approvals from later amendment approvals. The legacy paid databases tend to compress all of this into one “incorporation date” field. You lose chronology. During procurement investigations or sanctions reporting, that missing timing can matter quite a bit.&lt;/p&gt;

&lt;p&gt;I ran into this while tracing a hardware exporter that appeared in customs data under two English names that looked unrelated at first glance. GCIS preserved the amendment timeline and registration authority metadata clearly enough to line the entity history up against shipping manifests. The registry trail held together. The aliases did not.&lt;/p&gt;

&lt;p&gt;The filings side helps too, though there are limits. &lt;code&gt;list_filings&lt;/code&gt; can surface registry events tied to an entity, but this is not a full litigation database or a beneficial ownership system. Taiwan does not publicly expose every ownership layer investigators may want to inspect.&lt;/p&gt;

&lt;p&gt;After CJEU C-601/20, many reporters got used to beneficial ownership access disappearing across parts of Europe. Taiwan sits under a different legal framework, though practical access limits still exist depending on entity type and filing surface. OpenRegistry does not bypass AML-gated systems or private shareholder registers.&lt;/p&gt;

&lt;p&gt;Historical document retrieval still has rough edges. Some GCIS material only exists as scanned originals with uneven OCR quality. If your workflow depends on machine-reading PDFs at scale, you will still need downstream parsing and cleanup passes. No way around that yet.&lt;/p&gt;

&lt;p&gt;A typical MCP search flow looks like this:&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;"tool"&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;"TW"&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;"台積電"&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;Searching the native-language company name works far better than starting with English transliterations. Pull the Chinese legal name from source material first. Then branch outward into aliases, directors, and related entities.&lt;/p&gt;

&lt;p&gt;Once you have the registry number, fetch the profile directly:&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;"tool"&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;"TW"&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;"22099131"&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 reporting work, the flow is usually fairly direct:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Query the Chinese entity name from source documents.&lt;/li&gt;
&lt;li&gt;Pull the GCIS profile.&lt;/li&gt;
&lt;li&gt;Compare amendment dates against customs or procurement records.&lt;/li&gt;
&lt;li&gt;Cross-reference officers against Hong Kong or Cayman entities.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Taiwan becomes far more useful when paired with nearby registers. OpenRegistry currently serves TW alongside HK, KY, KR, JP, MY, NZ, AU, RU, plus several European jurisdictions. That makes it practical to follow a supply-chain entity from Taipei into a Hong Kong holding company, then onward into a Cayman registration without swapping tools halfway through an investigation.&lt;/p&gt;

&lt;p&gt;That continuity matters for reproducibility. After the Pandora Papers period, one recurring problem was that reporters could describe an ownership trail but could not reproduce the exact registry pull months later. Aggregator datasets changed quietly. Cached snapshots drifted over time. Shared-folder screenshots vanished.&lt;/p&gt;

&lt;p&gt;With GCIS queried live, another reporter can rerun the same MCP calls and inspect the upstream registry fields directly. During libel review, provenance is often more useful than an enrichment layer that rewrites or normalises source material.&lt;/p&gt;

&lt;p&gt;There are still operational annoyances. Taiwan company names sometimes contain punctuation or spacing variants that break naive matching logic. Certain filings appear in Chinese before translated metadata catches up. Historical officer changes are not always exposed in the structure investigators expect.&lt;/p&gt;

&lt;p&gt;Even with those limits, the MCP workflow is cleaner than the old mix of browser automation and manual copy-paste from registry pages. The register stays the source of record. The client decides how to interpret the data.&lt;/p&gt;

&lt;p&gt;If you are building investigative workflows around East Asian corporate records, live GCIS access is available at openregistry.sophymarine.com/mcp&lt;/p&gt;

</description>
      <category>programming</category>
      <category>mcp</category>
      <category>kyb</category>
      <category>api</category>
    </item>
    <item>
      <title>OpenDART filings in Korea: fields worth checking twice</title>
      <dc:creator>OpenRegistry</dc:creator>
      <pubDate>Sat, 11 Jul 2026 15:01:06 +0000</pubDate>
      <link>https://dev.to/openregistry/opendart-filings-in-korea-fields-worth-checking-twice-5cb5</link>
      <guid>https://dev.to/openregistry/opendart-filings-in-korea-fields-worth-checking-twice-5cb5</guid>
      <description>&lt;p&gt;South Korea’s OpenDART feed timestamps filings to the minute, and those timestamps can change a live diligence call. On a Seoul industrials target last quarter, one of the legacy paid databases still showed the previous statutory auditor hours after the replacement filing appeared in the Financial Supervisory Service feed.&lt;/p&gt;

&lt;p&gt;That lag shows up in Korea more often than many cross-border teams expect. The register leans heavily toward disclosures and behaves closer to a securities reporting system than a conventional European companies register. When you are tracking officer changes, treasury share activity, affiliate transactions, or a capital raise close to signing, the raw filings tend to move first.&lt;/p&gt;

&lt;p&gt;OpenRegistry exposes OpenDART through MCP at the registry layer. The response stays close to the upstream shape. You get source fields inside &lt;code&gt;jurisdiction_data&lt;/code&gt;, not a derived ownership graph or scoring layer built later.&lt;/p&gt;

&lt;h2&gt;
  
  
  What the Korean registry actually returns
&lt;/h2&gt;

&lt;p&gt;The first split that matters is company profile data versus disclosure history. OpenDART is strongest on filings tied to listed entities and reporting issuers.&lt;/p&gt;

&lt;p&gt;A standard &lt;code&gt;get_company_profile&lt;/code&gt; response for a Korean company can include:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;corp_code&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;corp_name&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;stock_code&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;ceo_nm&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;adres&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;hm_url&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;est_dt&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;corp_cls&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;code&gt;corp_cls&lt;/code&gt; matters more than some foreign diligence teams realise. KOSPI, KOSDAQ, KONEX, plus related classifications affect filing cadence and disclosure expectations. During a carve-out review earlier this year, a subsidiary looked inactive in one vendor export because its stock number changed after a market transfer. OpenDART still linked the filing history correctly through the corporate code.&lt;/p&gt;

&lt;p&gt;The filing layer is where the register becomes genuinely useful for transaction screening. &lt;code&gt;list_filings&lt;/code&gt; can surface periodic reports, shareholder disclosures, convertible bond issuances, treasury share acquisitions, mergers, spin-offs, or related-party transactions.&lt;/p&gt;

&lt;p&gt;Upstream payloads usually include receipt timestamps, filing identifiers, amendment indicators, filer names, and report titles. Amendment flags deserve manual review. Korean issuers regularly correct disclosures after publication. Sometimes the correction materially changes debt figures or share counts.&lt;/p&gt;

&lt;p&gt;Officer data behaves differently from many European registers. &lt;code&gt;get_officers&lt;/code&gt; may expose board and executive information tied to disclosed filings rather than a continuously maintained commercial register snapshot. Dates matter during cross-border director matching. A director can vanish for one filing cycle, then reappear after a governance restructure.&lt;/p&gt;

&lt;h2&gt;
  
  
  The gaps that catch diligence teams
&lt;/h2&gt;

&lt;p&gt;OpenDART is not a beneficial ownership register in the European sense.&lt;/p&gt;

&lt;p&gt;You will not get AML-gated UBO data comparable to some historical transparency registers. Korea’s disclosure regime centres on listed-company reporting obligations, securities compliance, and material ownership disclosures.&lt;/p&gt;

&lt;p&gt;Private-company coverage is uneven too. If the target is a small unlisted manufacturing subsidiary sitting outside reporting thresholds, the disclosure surface may be thin. Korean court register extracts and local counsel still matter.&lt;/p&gt;

&lt;p&gt;Document retrieval gets messy fast. Some filings expose structured metadata with attached HTML sections. Others depend heavily on embedded documents that do not parse cleanly. Tables inside Korean-language disclosures remain awkward to extract even when the filing itself is public.&lt;/p&gt;

&lt;p&gt;That distinction matters during acquisition financing reviews. A recent debt package I checked referenced guarantees inside an attachment that several aggregator exports skipped because their parser failed on the embedded section layout.&lt;/p&gt;

&lt;p&gt;OpenRegistry does not reinterpret those attachments. It returns the registry material as supplied upstream.&lt;/p&gt;

&lt;h2&gt;
  
  
  Querying OpenDART through MCP
&lt;/h2&gt;

&lt;p&gt;The workflow is usually search first, then pivot into filings.&lt;/p&gt;

&lt;p&gt;A basic company lookup:&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;"tool"&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;"KR"&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;"Samsung Electronics"&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 identifier, pull the profile directly:&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;"tool"&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;"KR"&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;"005930"&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 live diligence work, filings are often more useful than the static 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="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"tool"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&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;"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;"KR"&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;"005930"&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;If a filing references a material transaction, governance event, or amendment, retrieve the underlying document:&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;"tool"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"fetch_document"&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;"KR"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"document_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;"RCP20260318001234"&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;One practical point for automation teams: keep the original Korean text somewhere in the pipeline. Translating too early tends to flatten legal distinctions inside securities disclosures and board resolutions. I have seen machine translation collapse standing auditor and outside director roles into the same English label.&lt;/p&gt;

&lt;h2&gt;
  
  
  Filing cadence during cross-border deals
&lt;/h2&gt;

&lt;p&gt;Korean targets often sit inside broader Asia-Pacific supply chains with holding entities elsewhere. During diligence on a battery-sector supplier, the Japanese parent looked operationally quiet in outside datasets. OpenDART filings on the Korean subsidiary showed recent capital activity plus a related-party transaction that had not yet propagated through vendor feeds.&lt;/p&gt;

&lt;p&gt;That timing gap affects valuation work. It also affects sanctions reviews when ownership percentages or affiliate guarantees move shortly before close.&lt;/p&gt;

&lt;p&gt;For M&amp;amp;A teams, the practical pattern is not replacing existing datasets outright. We still keep subscription products for modelling layers and broad screening. Registry-direct access is where you verify filing chronology, disclosure corrections, or officer changes against the upstream source.&lt;/p&gt;

&lt;p&gt;OpenRegistry currently serves 27 jurisdictions including KR, GB, IT, JP, NL, and RU through a single MCP endpoint. Runtime coverage differs by registry. The live jurisdiction matrix and MCP documentation are at &lt;a href="https://openregistry.sophymarine.com/mcp" rel="noopener noreferrer"&gt;https://openregistry.sophymarine.com/mcp&lt;/a&gt;&lt;/p&gt;

</description>
      <category>programming</category>
      <category>mcp</category>
      <category>kyb</category>
      <category>legaltech</category>
    </item>
    <item>
      <title>ARES company data: fields KYB teams actually use</title>
      <dc:creator>OpenRegistry</dc:creator>
      <pubDate>Fri, 10 Jul 2026 15:01:13 +0000</pubDate>
      <link>https://dev.to/openregistry/ares-company-data-fields-kyb-teams-actually-use-4mdn</link>
      <guid>https://dev.to/openregistry/ares-company-data-fields-kyb-teams-actually-use-4mdn</guid>
      <description>&lt;h1&gt;
  
  
  ARES exposes more cross-register detail than most teams realise
&lt;/h1&gt;

&lt;p&gt;A Czech company lookup can return Commercial Register data, Trade Register data and VAT references in the same response. Teams often notice the overlap only after two upstream records drift out of sync for a few hours following a filing.&lt;/p&gt;

&lt;p&gt;ARES is run by the Czech Ministry of Finance. It fronts several public registers instead of acting as one canonical database in the style of Companies House in Great Britain. That changes onboarding logic.&lt;/p&gt;

&lt;p&gt;We use ARES as the registry-of-record source during Czech incorporation reviews, then compare discrepancies against filing timestamps and source references. OpenRegistry keeps the upstream &lt;code&gt;jurisdiction_data&lt;/code&gt; payload intact rather than flattening everything into a simplified schema. Audit teams care about that distinction later.&lt;/p&gt;

&lt;h2&gt;
  
  
  The fields that usually matter during onboarding
&lt;/h2&gt;

&lt;p&gt;A standard &lt;code&gt;get_company_profile&lt;/code&gt; call for a Czech entity can return:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;ico&lt;/code&gt; as the Czech company identifier&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;obchodniJmeno&lt;/code&gt; for the registered business name&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;pravniForma&lt;/code&gt; describing the legal form&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;sidlo&lt;/code&gt; for the registered address&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;datumVzniku&lt;/code&gt; showing incorporation date&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;stavSubjektu&lt;/code&gt; for current operating status&lt;/li&gt;
&lt;li&gt;references to source registers inside the ARES payload&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The upstream response also exposes register-specific fragments through &lt;code&gt;jurisdiction_data&lt;/code&gt;. We lean on those fields when a merchant describes one activity during onboarding while the Trade Register records something narrower or older.&lt;/p&gt;

&lt;p&gt;Name matching causes regular friction. Czech legal names often contain punctuation or legal suffixes that vanish from onboarding forms copied in by hand. ARES search results usually preserve the exact register representation. Fewer false mismatches end up in manual review queues.&lt;/p&gt;

&lt;p&gt;Raw registry preservation matters more than convenience formatting. Internal audit teams eventually ask where a status originated, especially when onboarding happened close to an insolvency filing or licence suspension. Screenshots are rarely enough.&lt;/p&gt;

&lt;h2&gt;
  
  
  What ARES does not give you
&lt;/h2&gt;

&lt;p&gt;ARES has clear limits.&lt;/p&gt;

&lt;p&gt;It is not a beneficial ownership register. Czech UBO access changed after AMLD 5 litigation across Europe and the CJEU C-601/20 decision. Public access is narrower now than in earlier European register models.&lt;/p&gt;

&lt;p&gt;OpenRegistry also does not add sanctions screening, PEP checks or credit scoring to Czech entities. Those checks belong elsewhere.&lt;/p&gt;

&lt;p&gt;Historical snapshots are another common misunderstanding. OpenRegistry queries the live register each time. We do not keep a private archive of earlier Czech registry states.&lt;/p&gt;

&lt;p&gt;Some filing documents and court records still sit inside separate Czech judicial systems rather than appearing directly through ARES. Workflows that depend on deeds or historical constitutional documents may still need direct court-register retrieval. We ran into this with older insolvency-linked filings.&lt;/p&gt;

&lt;h2&gt;
  
  
  Querying Czech entities through MCP
&lt;/h2&gt;

&lt;p&gt;ARES is available through the OpenRegistry MCP server for live lookups from AI clients and internal tooling.&lt;/p&gt;

&lt;p&gt;A basic company search by IČO or partial name:&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;"tool"&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;"CZ"&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;"27864651"&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 onboarding flows, we usually follow that with a direct profile fetch:&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;"tool"&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;"CZ"&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;"27864651"&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 operational pattern that tends to hold up best is storing both the normalised fields and the raw &lt;code&gt;jurisdiction_data&lt;/code&gt; object. During a regulator review, that gives evidence tied directly to the Czech registry response rather than an internal interpretation layer.&lt;/p&gt;

&lt;p&gt;The same MCP interface also works across the other registers currently exposed by OpenRegistry, including Companies House in Great Britain, the Finnish Trade Register and the Dutch Handelsregister.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Czech registry quirks worth planning for
&lt;/h2&gt;

&lt;p&gt;ARES is fairly stable. Edge cases still matter.&lt;/p&gt;

&lt;p&gt;Status propagation between Czech systems is not always simultaneous. A company can appear active in one source while another still shows a pending update. We treat those mismatches as manual-review triggers instead of automatic failures. Saves pointless escalations.&lt;/p&gt;

&lt;p&gt;Address formatting creates another category of false positives. Czech addresses often include district references, municipal subdivisions and orientation numbers that merchants abbreviate aggressively. Exact string matching fails a lot.&lt;/p&gt;

&lt;p&gt;Legal form handling deserves attention too. Czech entities such as &lt;code&gt;s.r.o.&lt;/code&gt; and &lt;code&gt;a.s.&lt;/code&gt; carry different governance expectations during KYB reviews. Keeping the original &lt;code&gt;pravniForma&lt;/code&gt; value from ARES avoids downstream mapping errors that are surprisingly tedious to unwind later.&lt;/p&gt;

&lt;p&gt;ARES is also not a sanctions system. Ownership chains still need separate resolution before running OFAC 50% analysis or UK sanctions checks.&lt;/p&gt;

&lt;h2&gt;
  
  
  Direct registry access and audit trails
&lt;/h2&gt;

&lt;p&gt;Teams using aggregator datasets eventually hit the same problem: stale records with weak provenance. A regulator asks where a company status came from, then someone discovers the provider updated its Czech mirror days after the filing itself.&lt;/p&gt;

&lt;p&gt;Direct registry retrieval removes that ambiguity. The onboarding decision stays tied to the registry response available at review time. That matters during investigations.&lt;/p&gt;

&lt;p&gt;It also cuts reconciliation work caused by third-party normalisation layers.&lt;/p&gt;

&lt;p&gt;OpenRegistry exposes ARES through a free MCP endpoint with raw upstream fields preserved. Current jurisdiction coverage and connection details are listed at &lt;a href="https://openregistry.sophymarine.com/mcp" rel="noopener noreferrer"&gt;https://openregistry.sophymarine.com/mcp&lt;/a&gt;&lt;/p&gt;

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