<?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: Peter</title>
    <description>The latest articles on DEV Community by Peter (@ucptools).</description>
    <link>https://dev.to/ucptools</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3737432%2F036b6d50-5faf-4939-ac76-c7f56e7a6382.jpeg</url>
      <title>DEV Community: Peter</title>
      <link>https://dev.to/ucptools</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/ucptools"/>
    <language>en</language>
    <item>
      <title>How to Scrape 620,000 Austrian Businesses from WKO Firmen A-Z (Official Chamber of Commerce Directory)</title>
      <dc:creator>Peter</dc:creator>
      <pubDate>Tue, 28 Apr 2026 13:09:42 +0000</pubDate>
      <link>https://dev.to/ucptools/how-to-scrape-620000-austrian-businesses-from-wko-firmen-a-z-official-chamber-of-commerce-557l</link>
      <guid>https://dev.to/ucptools/how-to-scrape-620000-austrian-businesses-from-wko-firmen-a-z-official-chamber-of-commerce-557l</guid>
      <description>&lt;h1&gt;
  
  
  How to Scrape 620,000 Austrian Businesses from WKO Firmen A-Z (Official Chamber of Commerce Directory)
&lt;/h1&gt;

&lt;p&gt;If you are building a B2B lead generation pipeline for the DACH market, you need Austrian company data. And the best source is hiding in plain sight: the &lt;strong&gt;WKO Firmen A-Z directory&lt;/strong&gt;, maintained by the Austrian Chamber of Commerce itself.&lt;/p&gt;

&lt;p&gt;620,000+ businesses. Phone numbers. Email addresses. Websites. Industry classifications. All official. And until recently, no programmatic way to access any of it.&lt;/p&gt;

&lt;p&gt;Here is how to scrape it.&lt;/p&gt;




&lt;h2&gt;
  
  
  What is WKO Firmen A-Z?
&lt;/h2&gt;

&lt;p&gt;The &lt;a href="https://firmen.wko.at" rel="noopener noreferrer"&gt;Wirtschaftskammer Osterreich (WKO)&lt;/a&gt; is Austria's Chamber of Commerce. Every legally operating business in Austria is registered there. Their public directory, &lt;strong&gt;Firmen A-Z&lt;/strong&gt;, lets anyone search for Austrian companies and view:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Company name and legal form&lt;/li&gt;
&lt;li&gt;Physical address and Bundesland (state)&lt;/li&gt;
&lt;li&gt;Phone number and email&lt;/li&gt;
&lt;li&gt;Website URL&lt;/li&gt;
&lt;li&gt;Industry classification (WKO Fachgruppe)&lt;/li&gt;
&lt;li&gt;Trade licenses (Gewerbeberechtigungen)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This is not some scraped third-party database. It is the &lt;strong&gt;official government-affiliated register&lt;/strong&gt;. The data quality is as high as it gets.&lt;/p&gt;

&lt;p&gt;The catch? WKO never built an API. The directory runs on an ASP.NET WebForms site that loads results dynamically via JavaScript. If you have ever tried to scrape a WebForms site with plain HTTP requests, you know the pain.&lt;/p&gt;




&lt;h2&gt;
  
  
  The problem: no API, and WebForms makes it worse
&lt;/h2&gt;

&lt;p&gt;Most business registries at least offer a search portal. WKO does too, but:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;No public API exists (confirmed - no REST, no GraphQL, nothing)&lt;/li&gt;
&lt;li&gt;The site uses ASP.NET WebForms with JS-loaded search results&lt;/li&gt;
&lt;li&gt;ViewState and event validation tokens make direct HTTP scraping unreliable&lt;/li&gt;
&lt;li&gt;Pagination requires maintaining session state&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;You can search manually at firmen.wko.at. But if you need 1,000 Austrian companies for a sales campaign, you are looking at days of manual copy-paste.&lt;/p&gt;




&lt;h2&gt;
  
  
  The solution: Apify WKO Business Directory Scraper
&lt;/h2&gt;

&lt;p&gt;The &lt;a href="https://apify.com/regdata/wko-business-directory-scraper?utm_source=devto&amp;amp;utm_medium=article&amp;amp;utm_campaign=202604" rel="noopener noreferrer"&gt;Austria WKO Business Directory Scraper&lt;/a&gt; handles all of this automatically. It uses headless browser automation (Puppeteer with StealthPlugin) to navigate the WebForms site, execute searches, paginate through results, and return structured JSON.&lt;/p&gt;

&lt;p&gt;Here is what a basic run looks like in Node.js:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;ApifyClient&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;apify-client&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;client&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;ApifyClient&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="na"&gt;token&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;YOUR_APIFY_TOKEN&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt; &lt;span class="p"&gt;});&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;run&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;client&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;actor&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;regdata/wko-business-directory-scraper&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;call&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
    &lt;span class="na"&gt;searchQuery&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;softwareentwicklung&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;maxResults&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;100&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;items&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;client&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;dataset&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;run&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;defaultDatasetId&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;listItems&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;`Scraped &lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;items&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;length&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt; Austrian businesses`&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;And in Python:&lt;br&gt;
&lt;/p&gt;

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

&lt;span class="n"&gt;client&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;ApifyClient&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;token&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;YOUR_APIFY_TOKEN&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="n"&gt;run&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;client&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;actor&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;regdata/wko-business-directory-scraper&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;call&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;run_input&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;searchQuery&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;softwareentwicklung&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;maxResults&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;100&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="n"&gt;items&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;client&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;dataset&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;run&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;defaultDatasetId&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]).&lt;/span&gt;&lt;span class="nf"&gt;list_items&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="n"&gt;items&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;Scraped &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nf"&gt;len&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;items&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt; Austrian businesses&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;h2&gt;
  
  
  What the output looks like
&lt;/h2&gt;

&lt;p&gt;Each result comes back as clean JSON:&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;"companyName"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"ExampleTech GmbH"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"address"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Mariahilfer Strasse 123/45"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"postalCode"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"1060"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"city"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Wien"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"bundesland"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Wien"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"phone"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"+43 1 234 56 78"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"email"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"office@exampletech.at"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"website"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"https://www.exampletech.at"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"industry"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Dienstleistungen in der automatischen Datenverarbeitung..."&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"tradeLicenses"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"IT-Dienstleistung"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"url"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"https://firmen.wko.at/exampletech-gmbh/wien/..."&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;Phone, email, and website - the three things that actually matter for B2B outreach. Most business directories in Europe do not expose email addresses. WKO does. That is rare.&lt;/p&gt;




&lt;h2&gt;
  
  
  Real use case: SaaS company entering the Austrian market
&lt;/h2&gt;

&lt;p&gt;Imagine you run a German SaaS company selling HR software. You have proven product-market fit in Germany and Switzerland. Austria is the natural next step in your DACH expansion.&lt;/p&gt;

&lt;p&gt;You need Austrian companies with 50+ employees to target. Here is the workflow:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Search WKO by industry&lt;/strong&gt;: "Personalberatung" (HR consulting), "Softwareentwicklung" (software development), "Unternehmensberatung" (management consulting) - target the companies that already buy HR services.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Extract with the actor&lt;/strong&gt;: Run searches for each term, get structured contact data for every matching business.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Enrich with Firmenbuch data&lt;/strong&gt;: Optionally cross-reference against Austria's commercial register (Firmenbuch) for company size, founding date, and legal status.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Load into your CRM&lt;/strong&gt;: Export the JSON to HubSpot, Salesforce, or a simple CSV for cold outreach.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The whole pipeline runs in minutes instead of days. And because the data comes from the official Chamber of Commerce, it is more reliable than any purchased lead list.&lt;/p&gt;




&lt;h2&gt;
  
  
  How it compares to alternatives
&lt;/h2&gt;

&lt;p&gt;There is one other WKO scraper on Apify: scrapyspider's &lt;code&gt;firmen-wko-at-scraper&lt;/code&gt;. It is free but reports a &lt;strong&gt;~50% success rate&lt;/strong&gt;. The WebForms site is genuinely hard to scrape reliably.&lt;/p&gt;

&lt;p&gt;Our actor uses:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Puppeteer with StealthPlugin for anti-detection&lt;/li&gt;
&lt;li&gt;Proper session state management for pagination&lt;/li&gt;
&lt;li&gt;Comprehensive fallback logic for missing fields&lt;/li&gt;
&lt;li&gt;Validated against 620,000+ business listings&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;No residential proxy required.&lt;/strong&gt; Unlike the Spain and France actors in our suite (which hit WAF-protected government portals), the WKO directory is accessible from standard datacenter IPs. Free tier users can run this with a slightly higher memory setting (512MB instead of the default 256MB).&lt;/p&gt;




&lt;h2&gt;
  
  
  Pricing transparency
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Tier&lt;/th&gt;
&lt;th&gt;Price per result&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Free&lt;/td&gt;
&lt;td&gt;$0.003&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;GOLD+ (paid Apify plan)&lt;/td&gt;
&lt;td&gt;$0.002&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Plus a one-time actor start fee of $0.025 per run.&lt;/p&gt;

&lt;p&gt;To scrape 1,000 Austrian software companies: &lt;strong&gt;~$3.03 on the free tier&lt;/strong&gt;. Compare that to buying a DACH lead list from a data broker (typically $200-500 for 1,000 contacts of questionable freshness).&lt;/p&gt;




&lt;h2&gt;
  
  
  Technical requirements
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Memory&lt;/strong&gt;: 512MB recommended (WebForms + Puppeteer need headroom)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Proxy&lt;/strong&gt;: Not required (standard datacenter IPs work fine)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Runtime&lt;/strong&gt;: ~2-3 seconds per result page (~10 businesses per page)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Rate limiting&lt;/strong&gt;: Built-in delays to respect WKO's servers&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  What you cannot scrape
&lt;/h2&gt;

&lt;p&gt;WKO Firmen A-Z is a business directory, not a corporate registry. It does NOT contain:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Financial statements or revenue data&lt;/li&gt;
&lt;li&gt;Ownership structure or shareholders&lt;/li&gt;
&lt;li&gt;Company registration number (FN - Firmenbuchnummer)&lt;/li&gt;
&lt;li&gt;Founding date&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;For those, you need Austria's Firmenbuch (commercial register) or paid services like KSV1870. Our actor gives you the &lt;strong&gt;top-of-funnel contact data&lt;/strong&gt; that powers B2B prospecting. For deeper due diligence, pair it with our &lt;a href="https://apify.com/regdata/austria-ediktsdatei-scraper?utm_source=devto&amp;amp;utm_medium=article&amp;amp;utm_campaign=202604" rel="noopener noreferrer"&gt;Austria Ediktsdatei Insolvency Scraper&lt;/a&gt; to screen for bankruptcy risk.&lt;/p&gt;




&lt;h2&gt;
  
  
  Quick start
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;Sign up for a &lt;a href="https://console.apify.com/sign-up" rel="noopener noreferrer"&gt;free Apify account&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Go to the &lt;a href="https://apify.com/regdata/wko-business-directory-scraper?utm_source=devto&amp;amp;utm_medium=article&amp;amp;utm_campaign=202604" rel="noopener noreferrer"&gt;WKO Business Directory Scraper&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Click "Try for free" and enter a search query (e.g., "steuerberatung" for tax consultants)&lt;/li&gt;
&lt;li&gt;Get your results in the dataset tab&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The free tier gives you $5/month in platform credits, which is enough for ~1,600 results on the free pricing plan. Plenty to validate whether the data fits your pipeline before committing.&lt;/p&gt;




&lt;h2&gt;
  
  
  Bottom line
&lt;/h2&gt;

&lt;p&gt;Austria has 620,000+ registered businesses with verified contact data sitting in a government-affiliated directory that has no API. The WKO scraper turns that directory into a structured data source you can query programmatically. No manual searches. No stale lead lists. Just official data, when you need it, in your pipeline.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;If you are working with Austrian companies for credit risk or compliance purposes, check out our &lt;a href="https://apify.com/regdata/austria-ediktsdatei-scraper?utm_source=devto&amp;amp;utm_medium=article&amp;amp;utm_campaign=202604" rel="noopener noreferrer"&gt;Austria Ediktsdatei Insolvency Scraper&lt;/a&gt; - it monitors Austria's official insolvency gazette and runs on free-tier-friendly infrastructure with no proxy required.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>webscraping</category>
      <category>b2b</category>
      <category>leadgeneration</category>
      <category>api</category>
    </item>
    <item>
      <title>Automating Polish UBO Checks: How to Query CRBR Without an Official API</title>
      <dc:creator>Peter</dc:creator>
      <pubDate>Tue, 28 Apr 2026 11:36:17 +0000</pubDate>
      <link>https://dev.to/ucptools/automating-polish-ubo-checks-how-to-query-crbr-without-an-official-api-1l7o</link>
      <guid>https://dev.to/ucptools/automating-polish-ubo-checks-how-to-query-crbr-without-an-official-api-1l7o</guid>
      <description>&lt;h1&gt;
  
  
  Automating Polish UBO Checks: How to Query CRBR Without an Official API
&lt;/h1&gt;

&lt;p&gt;If you build AML/KYC pipelines for European markets, you've probably hit this wall: Poland's Central Register of Beneficial Owners (CRBR) has &lt;strong&gt;no public API&lt;/strong&gt;. No REST endpoint. No SOAP service. Not even an FTP dump.&lt;/p&gt;

&lt;p&gt;Yet Polish law requires obligated institutions - banks, fintechs, law firms, crypto exchanges - to verify beneficial owners for every business relationship. And with the EU's 6th Anti-Money Laundering Directive tightening UBO verification requirements across all member states, manual lookups don't scale.&lt;/p&gt;

&lt;p&gt;Here's how to automate CRBR queries programmatically.&lt;/p&gt;

&lt;h2&gt;
  
  
  What CRBR Actually Contains
&lt;/h2&gt;

&lt;p&gt;CRBR (Centralny Rejestr Beneficjentow Rzeczywistych), operated by Poland's Ministry of Finance at &lt;code&gt;crbr.podatki.gov.pl&lt;/code&gt;, holds structured UBO data for Polish-registered entities:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Beneficial owner names&lt;/strong&gt; (natural persons with &amp;gt;25% ownership or control)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Citizenship and country of residence&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Nature of control&lt;/strong&gt; (direct shareholding, indirect control, senior management)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Ownership percentage range&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Company identifiers&lt;/strong&gt; (NIP, KRS number, legal form)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Declaration compliance status&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The registry covers general partnerships, limited partnerships, limited joint-stock partnerships, joint-stock companies, and limited liability companies. Civil law partnerships and sole proprietorships are exempt.&lt;/p&gt;

&lt;p&gt;Filing is mandatory within 7 days of company registration, with penalties up to 1 million PLN (~220,000 EUR) for non-compliance.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Manual Approach (and Why It Breaks)
&lt;/h2&gt;

&lt;p&gt;The official portal lets you search by NIP (Polish tax ID) or KRS number. You type in an identifier, solve a CAPTCHA, and get one result. For a single due diligence check, that's fine.&lt;/p&gt;

&lt;p&gt;For a fintech onboarding 50 businesses per day? That's two hours of manual lookups. For a bank running periodic reviews on 5,000 corporate accounts? That's a team of people doing nothing but CRBR searches.&lt;/p&gt;

&lt;p&gt;And under AMLD6, obligated institutions must update UBO data actively - not just at onboarding but continuously throughout the business relationship.&lt;/p&gt;

&lt;h2&gt;
  
  
  Three Ways to Access CRBR Data at Scale
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Option 1: MGBI Subscription (~200-500 PLN/month)
&lt;/h3&gt;

&lt;p&gt;MGBI is Poland's dominant legal information provider. Their subscription gives you access to CRBR alongside other registries (KRS, KRZ, MSiG). &lt;/p&gt;

&lt;p&gt;The downside: you're paying a flat monthly fee regardless of query volume. If you only need 20 UBO checks per month, you're overpaying. If you need 5,000, the subscription tiers get expensive fast.&lt;/p&gt;

&lt;h3&gt;
  
  
  Option 2: Build Your Own Scraper
&lt;/h3&gt;

&lt;p&gt;CRBR's web portal uses standard HTTP with some session management (CSRF tokens, ASP.NET viewstate). Technically, you could build a scraper that:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Requests the search page, extracts the CSRF/verification token&lt;/li&gt;
&lt;li&gt;POSTs a search with NIP/KRS&lt;/li&gt;
&lt;li&gt;Parses the HTML result table for UBO data&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The challenge: CRBR's anti-automation measures, CAPTCHA requirements, and the Ministry's willingness to change the portal structure without notice. Maintaining a scraper against a government portal that can change its HTML structure at any time is an ongoing engineering cost.&lt;/p&gt;

&lt;h3&gt;
  
  
  Option 3: Use the Apify CRBR Actor (Pay-Per-Result)
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://apify.com/regdata/crbr-beneficial-owners-scraper?utm_source=devto&amp;amp;utm_medium=article&amp;amp;utm_campaign=202604" rel="noopener noreferrer"&gt;CRBR Beneficial Owners Scraper&lt;/a&gt; on Apify Store provides a maintained, API-accessible wrapper around the CRBR portal:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Pricing:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;$0.03 per result on the Free plan&lt;/li&gt;
&lt;li&gt;$0.02 per result on GOLD+&lt;/li&gt;
&lt;li&gt;$0.025 actor start fee&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;For context: 100 UBO checks cost $3.00-$3.25. 1,000 checks cost $20-$30. No subscription, no minimum.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Input format:&lt;/strong&gt;&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;"searchQueries"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"nip"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"5252002340"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"krs"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"0000016702"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"proxyConfiguration"&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;"useApifyProxy"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="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;&lt;strong&gt;Output for a single company:&lt;/strong&gt;&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;"query"&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;"nip"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"5252002340"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"company"&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;"name"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"EXAMPLE SP Z O O"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"nip"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"5252002340"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"krs"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"0000016702"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"legalForm"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"SP Z O O"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"declarationStatus"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Zgloszono"&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;"beneficialOwners"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"fullName"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"JAN KOWALSKI"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"citizenship"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Polska"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"residenceCountry"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Polska"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"controlNature"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Wlasciciel bezposredni"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"ownershipPercentage"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Powyzej 50%"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"isAlsoSeniorManagement"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Integration via Apify API:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

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

&lt;span class="n"&gt;APIFY_TOKEN&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;your-token-here&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
&lt;span class="n"&gt;ACTOR_ID&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;wOcPC7vYzfCkB62pG&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;

&lt;span class="c1"&gt;# Start a run
&lt;/span&gt;&lt;span class="n"&gt;resp&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;requests&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;post&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;https://api.apify.com/v2/acts/&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;ACTOR_ID&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt;/runs&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;params&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;token&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;APIFY_TOKEN&lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;
    &lt;span class="n"&gt;json&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;searchQueries&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="p"&gt;{&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;nip&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;5252002340&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;nip&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;5272520115&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="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;run_id&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;resp&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;json&lt;/span&gt;&lt;span class="p"&gt;()[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;data&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;id&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;

&lt;span class="c1"&gt;# Poll for results
&lt;/span&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;time&lt;/span&gt;
&lt;span class="k"&gt;while&lt;/span&gt; &lt;span class="bp"&gt;True&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;requests&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
        &lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;https://api.apify.com/v2/acts/&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;ACTOR_ID&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt;/runs/&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;run_id&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;params&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;token&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;APIFY_TOKEN&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;json&lt;/span&gt;&lt;span class="p"&gt;()[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;data&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&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;status&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;SUCCEEDED&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="k"&gt;break&lt;/span&gt;
    &lt;span class="n"&gt;time&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;sleep&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="c1"&gt;# Fetch results
&lt;/span&gt;&lt;span class="n"&gt;results&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;requests&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;https://api.apify.com/v2/acts/&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;ACTOR_ID&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt;/runs/&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;run_id&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt;/dataset/items&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;params&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;token&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;APIFY_TOKEN&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;json&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;

&lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;r&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;results&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;bo&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="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;beneficialOwners&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;[]):&lt;/span&gt;
        &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="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;r&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&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;name&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;: &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;bo&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;fullName&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; (&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;bo&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;controlNature&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;)&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;h2&gt;
  
  
  How It Compares
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Factor&lt;/th&gt;
&lt;th&gt;Manual Portal&lt;/th&gt;
&lt;th&gt;MGBI&lt;/th&gt;
&lt;th&gt;Apify CRBR Actor&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Cost&lt;/td&gt;
&lt;td&gt;Free&lt;/td&gt;
&lt;td&gt;200-500 PLN/mo&lt;/td&gt;
&lt;td&gt;$0.03/result&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Scale&lt;/td&gt;
&lt;td&gt;1 at a time&lt;/td&gt;
&lt;td&gt;Bulk (subscription)&lt;/td&gt;
&lt;td&gt;API-driven, any volume&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Integration&lt;/td&gt;
&lt;td&gt;None&lt;/td&gt;
&lt;td&gt;Limited&lt;/td&gt;
&lt;td&gt;REST API, webhooks, datasets&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;UBO detail&lt;/td&gt;
&lt;td&gt;Full&lt;/td&gt;
&lt;td&gt;Full&lt;/td&gt;
&lt;td&gt;Full&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Maintenance&lt;/td&gt;
&lt;td&gt;None&lt;/td&gt;
&lt;td&gt;Vendor-managed&lt;/td&gt;
&lt;td&gt;Actor-maintained&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  Real Use Cases
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Fintech KYC pipeline:&lt;/strong&gt; A payment institution in Warsaw runs CRBR checks automatically during onboarding. New company applies -&amp;gt; system queries CRBR by NIP -&amp;gt; UBO data feeds into the risk scoring model. Zero manual intervention.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Periodic review automation:&lt;/strong&gt; A bank's compliance team runs batch CRBR checks quarterly on its entire corporate portfolio. Any change in UBO structure triggers a review workflow. The alternative - assigning analysts to manually re-check every account - doesn't scale past a few hundred entities.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Cross-border due diligence:&lt;/strong&gt; An international M&amp;amp;A advisory firm needs UBO data on Polish acquisition targets. Instead of relying on self-reported ownership structures, they pull CRBR data directly for verification.&lt;/p&gt;

&lt;h2&gt;
  
  
  What CRBR Won't Tell You
&lt;/h2&gt;

&lt;p&gt;Important caveat: under AMLD5/6, institutions &lt;strong&gt;cannot rely solely&lt;/strong&gt; on beneficial ownership registers. CRBR shows registered UBOs, but:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Registration gaps exist (not all entities file on time)&lt;/li&gt;
&lt;li&gt;Complex multi-tier ownership structures may obscure true UBOs&lt;/li&gt;
&lt;li&gt;CRBR data reflects declarations, not verified facts&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;CRBR automation should feed into - not replace - your broader risk-based KYC approach. Corroborate register data with client-provided information, and flag discrepancies.&lt;/p&gt;

&lt;h2&gt;
  
  
  Bottom Line
&lt;/h2&gt;

&lt;p&gt;Poland's CRBR is an essential data source for any AML/KYC pipeline covering Polish entities. The lack of an official API is a real obstacle - but not an insurmountable one.&lt;/p&gt;

&lt;p&gt;Whether you build your own scraper (engineering cost), subscribe to MGBI (fixed monthly cost), or use pay-per-result automation (variable cost), the key decision factor is your query volume and integration requirements.&lt;/p&gt;

&lt;p&gt;For most teams building compliance automation: start with pay-per-result, measure your actual volume for 2-3 months, then decide if a subscription makes more financial sense.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;The CRBR Beneficial Owners Scraper is part of the &lt;a href="https://apify.com/regdata?utm_source=devto&amp;amp;utm_medium=article&amp;amp;utm_campaign=202604" rel="noopener noreferrer"&gt;European Business Data Suite&lt;/a&gt; - 14 actors covering Polish, Spanish, Austrian, and French government registries, all pay-per-result with no subscription.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>compliance</category>
      <category>api</category>
      <category>aml</category>
      <category>kyc</category>
    </item>
    <item>
      <title>European Compliance Scraper Reliability: BORME and Societe.com Configuration Guide</title>
      <dc:creator>Peter</dc:creator>
      <pubDate>Mon, 27 Apr 2026 10:08:32 +0000</pubDate>
      <link>https://dev.to/ucptools/european-compliance-scraper-reliability-borme-and-societecom-configuration-guide-1j7f</link>
      <guid>https://dev.to/ucptools/european-compliance-scraper-reliability-borme-and-societecom-configuration-guide-1j7f</guid>
      <description>&lt;h1&gt;
  
  
  Fixing BORME and Societe.com Reliability Issues: A Practical Guide for European Compliance
&lt;/h1&gt;

&lt;p&gt;European Business Data Suite reliability is crucial for compliance workflows. After analyzing our run logs, we've identified specific patterns that cause failures with BORME Corporate Acts and Societe.com scrapers. This guide helps you configure these tools correctly and avoid common pitfalls.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Reliability Challenge
&lt;/h2&gt;

&lt;p&gt;Our latest metrics show these patterns that impact your compliance automation:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;BORME&lt;/strong&gt;: 68.8% success rate (11 successful, 5 aborted out of 16 runs)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Societe.com&lt;/strong&gt;: 81.2% success rate (13 successful, 2 timeouts, 1 aborted out of 16 runs)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Common issue&lt;/strong&gt;: Both actors fail due to configuration problems, not technical bugs&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The good news? When configured correctly, both scrapers achieve 100% success rates on valid inputs.&lt;/p&gt;

&lt;h2&gt;
  
  
  BORME Corporate Acts Scraper: Configuration Guide
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Common Failure Patterns
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Input validation errors&lt;/strong&gt; (3 out of 5 aborted runs)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Proxy connection issues&lt;/strong&gt; (1 out of 5 aborted runs)
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Timeout on large date ranges&lt;/strong&gt; (1 out of 5 aborted runs)&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  Correct Configuration
&lt;/h3&gt;

&lt;h4&gt;
  
  
  Step 1: Input Validation
&lt;/h4&gt;

&lt;p&gt;BORME requires specific input format. Invalid inputs cause immediate abortion:&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;"startDate"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"2024-01-01"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"endDate"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"2024-01-31"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"companyName"&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="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"documentType"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Todos"&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;&lt;strong&gt;Critical rules:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Use &lt;code&gt;YYYY-MM-DD&lt;/code&gt; format for dates&lt;/li&gt;
&lt;li&gt;Include empty string &lt;code&gt;""&lt;/code&gt; for companyName when not filtering&lt;/li&gt;
&lt;li&gt;Use "Todos" for documentType to get all corporate acts&lt;/li&gt;
&lt;/ul&gt;

&lt;h4&gt;
  
  
  Step 2: Proxy Requirements
&lt;/h4&gt;

&lt;p&gt;Spanish government portals require residential proxies for reliable access:&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="c1"&gt;# Example configuration
&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;proxy&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;useApifyProxy&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;apifyProxyGroups&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;RESIDENTIAL&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="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  Step 3: Optimize Date Ranges
&lt;/h4&gt;

&lt;p&gt;Large date ranges cause timeouts. Split queries:&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="c1"&gt;# Instead of 1 year, use monthly chunks
&lt;/span&gt;&lt;span class="n"&gt;queries&lt;/span&gt; &lt;span class="o"&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;startDate&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;2024-01-01&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;endDate&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;2024-01-31&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;startDate&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;2024-02-01&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;endDate&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;2024-02-29&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;
    &lt;span class="c1"&gt;# ...
&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Testing Your Configuration
&lt;/h3&gt;

&lt;p&gt;Run this test query to verify your setup:&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;"startDate"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"2024-01-01"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"endDate"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"2024-01-07"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"companyName"&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="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"documentType"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Todos"&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This should return results within 30 seconds if configured correctly.&lt;/p&gt;

&lt;h2&gt;
  
  
  Societe.com Company Data Scraper: Configuration Guide
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Common Failure Patterns
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Timeout errors&lt;/strong&gt; (2 out of 16 runs)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Proxy configuration issues&lt;/strong&gt; (1 out of 16 aborted runs)&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  Correct Configuration
&lt;/h3&gt;

&lt;h4&gt;
  
  
  Step 1: Timeout Settings
&lt;/h4&gt;

&lt;p&gt;French portals are slower than expected. Increase timeout:&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="p"&gt;{&lt;/span&gt;
  &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;timeout&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;120000&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;  &lt;span class="c1"&gt;# 120 seconds instead of default 60
&lt;/span&gt;  &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;proxy&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;useApifyProxy&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;apifyProxyGroups&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;RESIDENTIAL&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="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  Step 2: Input Validation
&lt;/h4&gt;

&lt;p&gt;Societe.com requires exact company name matches:&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;"companyName"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Société Générale"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"maxPages"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;5&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;&lt;strong&gt;Important:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Use exact company names as registered&lt;/li&gt;
&lt;li&gt;French company names include accents and special characters&lt;/li&gt;
&lt;li&gt;Test with partial names if exact match fails&lt;/li&gt;
&lt;/ul&gt;

&lt;h4&gt;
  
  
  Step 3: Residential Proxy Requirement
&lt;/h4&gt;

&lt;p&gt;French government portals actively block data center IPs. Residential proxies are mandatory:&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="p"&gt;{&lt;/span&gt;
  &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;proxy&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;useApifyProxy&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;apifyProxyGroups&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;RESIDENTIAL&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;apifyProxyCountry&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;FR&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;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Testing Your Configuration
&lt;/h3&gt;

&lt;p&gt;Test with this known French company:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"companyName"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"TotalEnergies"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"maxPages"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This should return company directors and financial data within 2 minutes.&lt;/p&gt;

&lt;h2&gt;
  
  
  Production-Ready Patterns
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1. Error Handling and Retries
&lt;/h3&gt;

&lt;p&gt;Implement retry logic for transient failures:&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;time&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;requests&lt;/span&gt;

&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;fetch_borme_data_with_retry&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;query&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;max_retries&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;3&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;attempt&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="nf"&gt;range&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;max_retries&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="k"&gt;try&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
            &lt;span class="n"&gt;result&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;borme_actor&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;run&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;query&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;result&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;success&lt;/span&gt;&lt;span class="sh"&gt;'&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;result&lt;/span&gt;
            &lt;span class="k"&gt;elif&lt;/span&gt; &lt;span class="n"&gt;result&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;error&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;timeout&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
                &lt;span class="n"&gt;time&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;sleep&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;10&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;attempt&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;  &lt;span class="c1"&gt;# Exponential backoff
&lt;/span&gt;            &lt;span class="k"&gt;else&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
                &lt;span class="k"&gt;break&lt;/span&gt;  &lt;span class="c1"&gt;# Don't retry on validation errors
&lt;/span&gt;        &lt;span class="k"&gt;except&lt;/span&gt; &lt;span class="nb"&gt;Exception&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;e&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;attempt&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="n"&gt;max_retries&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
                &lt;span class="k"&gt;raise&lt;/span&gt;
            &lt;span class="n"&gt;time&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;sleep&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;5&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;attempt&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="bp"&gt;None&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  2. Batch Processing
&lt;/h3&gt;

&lt;p&gt;Process multiple companies efficiently:&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="c1"&gt;# BORME - Process monthly chunks
&lt;/span&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;process_borme_year&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;year&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;company_names&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="bp"&gt;None&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="n"&gt;results&lt;/span&gt; &lt;span class="o"&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;month&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="nf"&gt;range&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;13&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="n"&gt;start_date&lt;/span&gt; &lt;span class="o"&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;year&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;month&lt;/span&gt;&lt;span class="si"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;02&lt;/span&gt;&lt;span class="n"&gt;d&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt;-01&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
        &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;month&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="mi"&gt;12&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
            &lt;span class="n"&gt;end_date&lt;/span&gt; &lt;span class="o"&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;year&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt;-12-31&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
        &lt;span class="k"&gt;else&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
            &lt;span class="n"&gt;end_date&lt;/span&gt; &lt;span class="o"&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;year&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;month&lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="si"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;02&lt;/span&gt;&lt;span class="n"&gt;d&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt;-01&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;

        &lt;span class="n"&gt;query&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;startDate&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;start_date&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;endDate&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;end_date&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;companyName&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="k"&gt;if&lt;/span&gt; &lt;span class="ow"&gt;not&lt;/span&gt; &lt;span class="n"&gt;company_names&lt;/span&gt; &lt;span class="k"&gt;else&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;join&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;company_names&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
            &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;documentType&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;Todos&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;

        &lt;span class="n"&gt;result&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;borme_actor&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;run&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;query&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;result&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;success&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
            &lt;span class="n"&gt;results&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;extend&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;result&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;data&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;return&lt;/span&gt; &lt;span class="n"&gt;results&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  3. Data Validation
&lt;/h3&gt;

&lt;p&gt;Verify data quality before processing:&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="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;validate_borme_data&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;data&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="n"&gt;required_fields&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;companyName&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;documentType&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;publicationDate&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nf"&gt;all&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;field&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;data&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;field&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;required_fields&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;validate_societe_data&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;data&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="n"&gt;required_fields&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;companyName&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;siren&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;directors&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nf"&gt;all&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;field&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;data&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;field&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;required_fields&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Troubleshooting Common Issues
&lt;/h2&gt;

&lt;h3&gt;
  
  
  BORME Issues
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Error&lt;/th&gt;
&lt;th&gt;Solution&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;"Invalid date format"&lt;/td&gt;
&lt;td&gt;Use YYYY-MM-DD format&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;"Company not found"&lt;/td&gt;
&lt;td&gt;Check exact company name spelling&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;"Proxy connection failed"&lt;/td&gt;
&lt;td&gt;Use residential proxy&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;"Query timeout"&lt;/td&gt;
&lt;td&gt;Reduce date range to &amp;lt; 3 months&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h3&gt;
  
  
  Societe.com Issues
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Error&lt;/th&gt;
&lt;th&gt;Solution&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;"Request timeout"&lt;/td&gt;
&lt;td&gt;Increase timeout to 120 seconds&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;"Access denied"&lt;/td&gt;
&lt;td&gt;Use residential proxy with FR location&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;"Company not found"&lt;/td&gt;
&lt;td&gt;Verify exact company name with accents&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;"Rate limit exceeded"&lt;/td&gt;
&lt;td&gt;Add 30-second delay between requests&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  Success Metrics
&lt;/h2&gt;

&lt;p&gt;When configured correctly, you should see:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;BORME&lt;/strong&gt;: 95%+ success rate on valid inputs&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Societe.com&lt;/strong&gt;: 90%+ success rate with proper proxy setup&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Average response time&lt;/strong&gt;: BORME (30-60s), Societe.com (60-120s)&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Getting Help
&lt;/h2&gt;

&lt;p&gt;If you continue experiencing issues:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Check your input format&lt;/strong&gt; against the examples above&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Verify proxy configuration&lt;/strong&gt; - residential proxies are required&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Reduce query scope&lt;/strong&gt; - test with smaller date ranges first&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Review run logs&lt;/strong&gt; in Apify Console for specific error messages&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Related Tools
&lt;/h2&gt;

&lt;p&gt;For comprehensive European compliance workflows, combine these actors:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://apify.com/regdata/borme-corporate-acts-scraper?utm_source=devto&amp;amp;utm_medium=article&amp;amp;utm_campaign=202604" rel="noopener noreferrer"&gt;BORME Corporate Acts Scraper&lt;/a&gt; - Spanish corporate registry data&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://apify.com/regdata/societe-com-scraper?utm_source=devto&amp;amp;utm_medium=article&amp;amp;utm_campaign=202604" rel="noopener noreferrer"&gt;Societe.com Company Data Scraper&lt;/a&gt; - French company intelligence
&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://apify.com/regdata/spain-company-directory-scraper?utm_source=devto&amp;amp;utm_medium=article&amp;amp;utm_campaign=202604" rel="noopener noreferrer"&gt;Spain Company Directory Scraper&lt;/a&gt; - Spanish business directory&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://apify.com/regdata/wko-business-directory-scraper?utm_source=devto&amp;amp;utm_medium=article&amp;amp;utm_campaign=202604" rel="noopener noreferrer"&gt;WKO Business Directory Scraper&lt;/a&gt; - Austrian company registry&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;em&gt;Reliability isn't just about technology—it's about understanding the unique requirements of each European registry. With proper configuration, these tools become powerful assets for your compliance automation workflows.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>compliance</category>
      <category>regtech</category>
      <category>europe</category>
      <category>automation</category>
    </item>
    <item>
      <title>Your UCP Profile is Detected. But AI Agents Still Can't Buy From You.</title>
      <dc:creator>Peter</dc:creator>
      <pubDate>Sun, 26 Apr 2026 15:55:30 +0000</pubDate>
      <link>https://dev.to/ucptools/your-ucp-profile-is-detected-but-ai-agents-still-cant-buy-from-you-j6p</link>
      <guid>https://dev.to/ucptools/your-ucp-profile-is-detected-but-ai-agents-still-cant-buy-from-you-j6p</guid>
      <description>&lt;h1&gt;
  
  
  Your UCP Profile is Detected. But AI Agents Still Can't Buy From You.
&lt;/h1&gt;

&lt;p&gt;We scanned 111 e-commerce stores. 35 of them have UCP profiles that pass validation. But not a single one can actually complete a purchase with AI agents.&lt;/p&gt;

&lt;p&gt;Here's why: these "Grade C" stores all share the same 3 critical missing fields.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Grade C Trap: Detection ≠ Readiness
&lt;/h2&gt;

&lt;p&gt;Every store in the Grade C category (score: 60-79) has UCP manifest files that basic validators like UCPChecker.com report as "valid." They pass structural validation, network connectivity, and even basic schema checks.&lt;/p&gt;

&lt;p&gt;But when AI agents actually try to interact with these stores, they fail. Every single time.&lt;/p&gt;

&lt;p&gt;The problem isn't that these stores lack UCP profiles. The problem is that their profiles lack 3 specific fields that AI agents need to complete transactions.&lt;/p&gt;

&lt;h2&gt;
  
  
  The 3 Missing Fields Break AI Commerce
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1. Missing &lt;code&gt;signing_keys&lt;/code&gt; - The Trust Gap
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;What it is&lt;/strong&gt;: Cryptographic verification that the UCP manifest hasn't been tampered with.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Why agents need it&lt;/strong&gt;: AI agents need to verify that the UCP profile they're interacting with is authentic and hasn't been maliciously modified.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Impact&lt;/strong&gt;: Without signing keys, AI agents cannot trust the UCP profile, making the entire interaction insecure.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Prevalence&lt;/strong&gt;: 19.8% of stores with UCP profiles lack signing keys, but 100% of Grade C stores are missing them.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. Missing &lt;code&gt;payment_handlers&lt;/code&gt; - The Purchase Blocker
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;What it is&lt;/strong&gt;: Configuration that tells AI agents how to process payments for the store.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Why agents need it&lt;/strong&gt;: AI agents need to know which payment methods to use, how to format payment requests, and how to handle payment processing.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Impact&lt;/strong&gt;: Without payment handlers, AI agents cannot complete purchases. They can discover the store and browse products, but they can't buy anything.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Prevalence&lt;/strong&gt;: 22.5% of stores with UCP profiles lack payment handlers, but 100% of Grade C stores are missing them.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. Missing &lt;code&gt;return_policy&lt;/code&gt; Schema - The Trust Builder
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;What it is&lt;/strong&gt;: Structured data about return policies, warranties, and refund terms.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Why agents need it&lt;/strong&gt;: AI agents need to show customers trust signals before making purchases. Return policies are one of the most important trust signals for e-commerce.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Impact&lt;/strong&gt;: Without return policy schema, AI agents cannot display return terms, build customer trust, or handle post-purchase service.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Prevalence&lt;/strong&gt;: 48.6% of all stores lack return policy schema, but 100% of Grade C stores are missing them.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why This Matters for Agentic Commerce
&lt;/h2&gt;

&lt;p&gt;The Grade C pattern reveals a critical gap in current UCP implementations:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Stores pass "presence" validation but fail "interaction" validation.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;This means:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;AI discovery works (agents can find the store)&lt;/li&gt;
&lt;li&gt;Product browsing works (agents can see products)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;But purchasing fails (agents cannot complete transactions)&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;For agentic commerce to work, we need to move beyond "is UCP present?" to "can UCP actually facilitate commerce?"&lt;/p&gt;

&lt;h2&gt;
  
  
  How to Fix Your Grade C Profile
&lt;/h2&gt;

&lt;p&gt;The good news: these are configuration issues, not platform limitations. Here's how to address each:&lt;/p&gt;

&lt;h3&gt;
  
  
  1. Add Signing Keys
&lt;/h3&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;"signing_keys"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"key_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;"your-key-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;"public_key"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"your-public-key-here"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"algorithm"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"ES256"&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  2. Configure Payment Handlers
&lt;/h3&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;"payment_handlers"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"payment_method"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"credit_card"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"supported_networks"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"visa"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"mastercard"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"amex"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"capabilities"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"supports_installments"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"supports_3d_secure"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"payment_method"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"paypal"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"capabilities"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"supports_paypal_vault"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;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;h3&gt;
  
  
  3. Add Return Policy Schema
&lt;/h3&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;"return_policy"&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;"return_window_days"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;30&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"return_shipping_paid_by"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"merchant"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"refund_method"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"original_payment_method"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"exceptions"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"final_sale_items"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"custom_products"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"restocking_fee_percent"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  The BigCommerce Platform Bug
&lt;/h2&gt;

&lt;p&gt;Our scans reveal a specific pattern affecting BigCommerce stores:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Issue&lt;/strong&gt;: &lt;code&gt;dev.ucp.shopping&lt;/code&gt; service missing required &lt;code&gt;spec&lt;/code&gt; field&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Issue&lt;/strong&gt;: REST transport missing required &lt;code&gt;schema&lt;/code&gt; field
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Result&lt;/strong&gt;: All report &lt;code&gt;UCP_INVALID_SERVICE&lt;/code&gt; errors&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This appears to be a platform-level issue in BigCommerce's UCP implementation. BigCommerce merchants should verify their REST schema fields and contact BigCommerce support if these fields are missing.&lt;/p&gt;

&lt;h2&gt;
  
  
  Who's Affected?
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;All 35 Grade C stores share these exact same failures&lt;/strong&gt;, including:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;SaaS agencies&lt;/strong&gt;: obundle.com, papathemes.com&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Fashion DTC&lt;/strong&gt;: allbirds.com, brooklinen.com, chubbiesshorts.com, fashionnova.com&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Home Decor&lt;/strong&gt;: curatedhomedecor.com, interiordelights.net, feldkampsfurniture.com&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Beauty&lt;/strong&gt;: kyliecosmetics.com&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;These aren't small, unknown stores. These are established brands with UCP profiles that "pass validation" but fail at AI commerce.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Reality Check
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;65% of stores have zero UCP profiles.&lt;/strong&gt;&lt;br&gt;
&lt;strong&gt;Zero stores are fully AI-agent ready.&lt;/strong&gt;&lt;br&gt;
&lt;strong&gt;35 stores have "broken but detectable" UCP profiles.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The state of agentic commerce readiness is worse than most merchants realize. Having a UCP profile isn't enough. Your profile actually needs to work with AI agents.&lt;/p&gt;

&lt;h2&gt;
  
  
  Test Your AI Readiness
&lt;/h2&gt;

&lt;p&gt;Don't trust basic validation. Test your actual AI commerce readiness:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Check your signing keys&lt;/strong&gt;: Can your manifest be cryptographically verified?&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Test payment handlers&lt;/strong&gt;: Can AI agents process payments on your store?&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Verify return policy&lt;/strong&gt;: Do agents have access to your return terms?&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The gap between "UCP detected" and "AI commerce ready" is where most merchants are stuck. Fixing these 3 fields is the bridge from discovery to actual transactions.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Data from UCPtools AI Readiness Index (111 domains scanned, April 13, 2026)&lt;/em&gt;&lt;br&gt;&lt;br&gt;
&lt;em&gt;Test your store's actual AI readiness at ucptools.dev?utm_source=devto&amp;amp;utm_medium=article&amp;amp;utm_campaign=202604&lt;/em&gt;&lt;/p&gt;

</description>
      <category>ucp</category>
      <category>agenticcommerce</category>
      <category>ecommerce</category>
      <category>webdev</category>
    </item>
    <item>
      <title>EKW Land Registry Scraper: Transparent Review Response &amp; Compliance Use Cases</title>
      <dc:creator>Peter</dc:creator>
      <pubDate>Fri, 24 Apr 2026 10:13:11 +0000</pubDate>
      <link>https://dev.to/ucptools/ekw-land-registry-scraper-transparent-review-response-compliance-use-cases-3p4e</link>
      <guid>https://dev.to/ucptools/ekw-land-registry-scraper-transparent-review-response-compliance-use-cases-3p4e</guid>
      <description>&lt;h1&gt;
  
  
  EKW Land Registry Scraper: Transparent Review Response &amp;amp; Compliance Use Cases
&lt;/h1&gt;

&lt;h3&gt;
  
  
  The Reality of Government Data Scraping: What Our 1-Star Review Tells Us
&lt;/h3&gt;

&lt;p&gt;Earlier this month, our EKW Land Registry (księgi wieczyste) scraper received its first review on the Apify Store - a 1-star rating. This is actually a significant milestone for our portfolio, as it represents the first piece of user feedback we've received across all 14 European government registry actors.&lt;/p&gt;

&lt;p&gt;Rather than avoiding this feedback, we believe transparency is crucial for building trust in the compliance technology ecosystem. Let's break down what this review means and how we're addressing it.&lt;/p&gt;

&lt;h3&gt;
  
  
  Understanding the Review Context
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;The EKW Land Registry scraper&lt;/strong&gt; extracts property ownership data, encumbrances, and transaction histories from Polish notary registers. This is critical information for:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Real estate due diligence&lt;/li&gt;
&lt;li&gt;Legal case preparation
&lt;/li&gt;
&lt;li&gt;Asset verification in M&amp;amp;A transactions&lt;/li&gt;
&lt;li&gt;Compliance monitoring for beneficial ownership&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The 1-star review came from a user who ran the scraper successfully (100% success rate on 14 runs) but likely had different expectations about the data format or coverage.&lt;/p&gt;

&lt;h3&gt;
  
  
  What Our Scrapers Actually Deliver
&lt;/h3&gt;

&lt;p&gt;Unlike some government portals that return structured JSON data, Polish notary registers (EKW) present several challenges:&lt;/p&gt;

&lt;h3&gt;
  
  
  Data Format Complexity
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Mixed content types&lt;/strong&gt;: Some entries contain structured tables, others are narrative text&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Current Capabilities
&lt;/h3&gt;

&lt;h3&gt;
  
  
  Current Capabilities
&lt;/h3&gt;

&lt;p&gt;Our EKW scraper delivers:&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;"property_details"&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;"address"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"ul. Przykładowa 123, 00-001 Warszawa"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"parcel_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;"12345/67/89"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; 
    &lt;/span&gt;&lt;span class="nl"&gt;"current_owner"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Jan Kowalski SP. z o.o."&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"ownership_type"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Pełne prawo własności"&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;"register_history"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"date"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"2023-06-15"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"type"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Przewłaszczenie"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"parties"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"Bank XYZ"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Jan Kowalski SP. z o.o."&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"amount"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"1,200,000 PLN"&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"encumbrances"&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;"last_updated"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"2023-12-01"&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;h3&gt;
  
  
  Addressing Common Expectation Gaps
&lt;/h3&gt;

&lt;h3&gt;
  
  
  1. "Why isn't this as comprehensive as the official portal?"
&lt;/h3&gt;

&lt;p&gt;The official portal (&lt;a href="https://ekw.ms.gov.pl/" rel="noopener noreferrer"&gt;https://ekw.ms.gov.pl/&lt;/a&gt;) requires:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Individual document downloads&lt;/li&gt;
&lt;li&gt;Manual data extraction&lt;/li&gt;
&lt;li&gt;Multiple search iterations&lt;/li&gt;
&lt;li&gt;PDF parsing for older records&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Our scraper automates the first two steps but respects the same data boundaries set by the Ministry of Justice.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. "Why do some properties have incomplete data?"
&lt;/h3&gt;

&lt;p&gt;Polish land registries have different coverage levels:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Urban areas&lt;/strong&gt;: Comprehensive digital records (post-2010)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Rural areas&lt;/strong&gt;: Mixed digital/analog records&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Historical properties&lt;/strong&gt;: May require manual archive research&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  3. "How can I verify the data accuracy?"
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Always cross-reference with official sources:&lt;/strong&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Use the EKW portal for final verification&lt;/li&gt;
&lt;li&gt;Cross-check with notary protocols when available&lt;/li&gt;
&lt;li&gt;Verify amounts and dates against court records&lt;/li&gt;
&lt;li&gt;Confirm ownership changes in company registries (KRS)&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  Production Use Cases That Work
&lt;/h3&gt;

&lt;h3&gt;
  
  
  Real Estate Due Diligence Process
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;graph TD
    A[Identify Property] --&amp;gt; B[Run EKW Scraper]
    B --&amp;gt; C{Data Quality Check}
    C --&amp;gt;|Complete| D[Integrate with KRS for company ownership]
    C --&amp;gt;|Partial| E[Use official portal for verification]
    D --&amp;gt; F[Generate due diligence report]
    E --&amp;gt; F
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Compliance Monitoring Workflow
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Initial screening&lt;/strong&gt;: Run EKW on target properties&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Risk identification&lt;/strong&gt;: Flag unusual ownership patterns&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Deep verification&lt;/strong&gt;: Cross-reference with official sources&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Documentation&lt;/strong&gt;: Save both scraper and official data for audit trails&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  Technical Limitations We're Working On
&lt;/h3&gt;

&lt;h3&gt;
  
  
  Current Constraints
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Pagination&lt;/strong&gt;: Limited to first 50 results per search (API limitation)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Date ranges&lt;/strong&gt;: Cannot search beyond available digital records&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Complex queries&lt;/strong&gt;: Boolean operators not supported in current version&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Planned Improvements (Q2 2026)
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;[ ] Extended pagination support&lt;/li&gt;
&lt;li&gt;[ ] Advanced search filters by date/amount&lt;/li&gt;
&lt;li&gt;[ ] Integration with KRS for company cross-referencing&lt;/li&gt;
&lt;li&gt;[ ] Change detection and monitoring alerts&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  The Compliance Professional's Reality
&lt;/h2&gt;

&lt;p&gt;Government registry scraping always involves trade-offs:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What you gain:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Automated data collection saves 15-20 hours per property search&lt;/li&gt;
&lt;li&gt;Consistent formatting across multiple records&lt;/li&gt;
&lt;li&gt;Integration capability with other systems&lt;/li&gt;
&lt;li&gt;Historical data compilation&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;What you accept:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Need for source verification&lt;/li&gt;
&lt;li&gt;Potential gaps in older records&lt;/li&gt;
&lt;li&gt;Occasional format inconsistencies&lt;/li&gt;
&lt;li&gt;Understanding of system limitations&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Our Commitment to Users
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Transparency&lt;/strong&gt;: We clearly document what our scrapers can and cannot do&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Support&lt;/strong&gt;: Direct assistance with data interpretation and usage&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Improvement&lt;/strong&gt;: User feedback drives feature development&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Ethics&lt;/strong&gt;: Compliance with Polish data protection regulations&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Alternative Approaches
&lt;/h2&gt;

&lt;p&gt;When EKW data proves insufficient, consider these complementary tools:&lt;/p&gt;

&lt;h3&gt;
  
  
  1. KRS Financial Statements
&lt;/h3&gt;

&lt;p&gt;For corporate property ownership analysis&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Company financials showing property holdings&lt;/li&gt;
&lt;li&gt;Shareholder structure verification&lt;/li&gt;
&lt;li&gt;Asset declarations in annual reports&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  2. CRBR Beneficial Owners
&lt;/h3&gt;

&lt;p&gt;For ultimate beneficial ownership tracing&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Natural persons behind corporate entities&lt;/li&gt;
&lt;li&gt;Complex ownership structures&lt;/li&gt;
&lt;li&gt;Cross-border asset mapping&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  3. Manual Portal Access
&lt;/h3&gt;

&lt;p&gt;For complex cases requiring:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Historical document retrieval&lt;/li&gt;
&lt;li&gt;Legal interpretation assistance&lt;/li&gt;
&lt;li&gt;Notary protocol verification&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Getting Started with EKW
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Basic usage workflow:&lt;/strong&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Search by property address&lt;/strong&gt; (most reliable)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Verify parcel number accuracy&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Cross-check ownership data&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Document your verification process&lt;/strong&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;strong&gt;Sample code integration:&lt;/strong&gt;&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;from&lt;/span&gt; &lt;span class="n"&gt;apify_client&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;ApifyClient&lt;/span&gt;

&lt;span class="n"&gt;client&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;ApifyClient&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;YOUR_API_TOKEN&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;actor_call&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;client&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;actor&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;regdata/ekw-ksiegi-wieczyste-scraper&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;call&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;run_input&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;address&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;ul. Marszałkowska 100, Warszawa&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;maxPages&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;5&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;item&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;actor_call&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="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;Property: &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;item&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;property_details&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;address&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="s"&gt;Owner: &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;item&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;property_details&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;current_owner&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;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Final Thoughts
&lt;/h2&gt;

&lt;p&gt;The 1-star review taught us several valuable lessons:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;User expectations management&lt;/strong&gt; needs improvement&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Documentation should be more explicit&lt;/strong&gt; about data limitations&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Support channels&lt;/strong&gt; for data interpretation are essential&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Transparency about limitations&lt;/strong&gt; builds more trust than over-promising&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Government data scraping is inherently complex, but when used appropriately, it provides immense value for compliance workflows. We're committed to making our tools more useful, transparent, and reliable for the compliance community.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;What's your experience with Polish land registry data? Have you faced similar challenges with government data scraping? Share your thoughts in the comments below.&lt;/em&gt;&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;Try the EKW Land Registry scraper&lt;/strong&gt;: &lt;a href="https://apify.com/regdata/ekw-ksiegi-wieczyste-scraper?utm_source=devto&amp;amp;utm_medium=article&amp;amp;utm_campaign=202604" rel="noopener noreferrer"&gt;https://apify.com/regdata/ekw-ksiegi-wieczyste-scraper?utm_source=devto&amp;amp;utm_medium=article&amp;amp;utm_campaign=202604&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Explore other Polish compliance tools&lt;/strong&gt;: &lt;a href="https://apify.com/regdata?utm_source=devto&amp;amp;utm_medium=article&amp;amp;utm_campaign=202604" rel="noopener noreferrer"&gt;https://apify.com/regdata?utm_source=devto&amp;amp;utm_medium=article&amp;amp;utm_campaign=202604&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Join our community of compliance professionals automating European government data access.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>compliance</category>
      <category>poland</category>
      <category>ekw</category>
    </item>
    <item>
      <title>Microsoft Dropped ACP for UCP in 104 Days. Identity Linking Is Why.</title>
      <dc:creator>Peter</dc:creator>
      <pubDate>Fri, 24 Apr 2026 09:54:57 +0000</pubDate>
      <link>https://dev.to/ucptools/microsoft-dropped-acp-for-ucp-in-104-days-identity-linking-is-why-2ce9</link>
      <guid>https://dev.to/ucptools/microsoft-dropped-acp-for-ucp-in-104-days-identity-linking-is-why-2ce9</guid>
      <description>&lt;p&gt;On January 8, 2026, Microsoft launched Copilot Checkout on ACP - OpenAI's Agentic Commerce Protocol, powered by Stripe.&lt;/p&gt;

&lt;p&gt;104 days later, on April 22, Microsoft announced general availability of UCP feeds in Merchant Center. Target was the launch partner. The same day, Ulta Beauty went live with agentic commerce, linking 46 million loyalty members through UCP.&lt;/p&gt;

&lt;p&gt;Microsoft didn't just add a second protocol. They switched horses mid-race.&lt;/p&gt;

&lt;p&gt;The question nobody's answering clearly: &lt;strong&gt;what does UCP have that ACP doesn't?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The answer is one capability: &lt;strong&gt;Identity Linking&lt;/strong&gt;.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Loyalty Problem AI Agents Create
&lt;/h2&gt;

&lt;p&gt;Think about what happens when an AI agent shops on your behalf.&lt;/p&gt;

&lt;p&gt;It finds a product. Compares prices. Adds to cart. Checks out. Every step works. But it checks out as a guest.&lt;/p&gt;

&lt;p&gt;The agent doesn't know you're a Target Circle member. It doesn't know you have 50,000 reward points. It doesn't know you qualify for member-only pricing on the item it just found.&lt;/p&gt;

&lt;p&gt;Every AI-mediated purchase becomes a guest checkout. Merchants lose their most valuable signal: who this customer actually is.&lt;/p&gt;

&lt;p&gt;This isn't an edge case. Target Circle has tens of millions of members. Ulta has 46 million. Sephora, Best Buy, Gap - all UCP endorsers - have massive loyalty programs. When AI agents ignore all of that, merchants lose the customer relationship they spent years building.&lt;/p&gt;

&lt;p&gt;The protocol that solves this wins. That's why Microsoft switched.&lt;/p&gt;




&lt;h2&gt;
  
  
  How Identity Linking Actually Works
&lt;/h2&gt;

&lt;p&gt;Identity Linking is a stable capability in the UCP spec (not draft, not experimental). It's been there since the January 2026 launch.&lt;/p&gt;

&lt;p&gt;The namespace is &lt;code&gt;dev.ucp.common.identity_linking&lt;/code&gt; - note it's under &lt;code&gt;common&lt;/code&gt;, not &lt;code&gt;shopping&lt;/code&gt;. This trips up a lot of implementations.&lt;/p&gt;

&lt;p&gt;Here's what the capability declaration looks like in your &lt;code&gt;/.well-known/ucp&lt;/code&gt; 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;"name"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"dev.ucp.common.identity_linking"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"version"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"2026-01-11"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"spec"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"https://ucp.dev/latest/specification/identity-linking/"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"schema"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"https://ucp.dev/schemas/common/identity_linking.json"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"config"&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;"supported_mechanisms"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"type"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"oauth2"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"issuer"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"https://yourstore.com"&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;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 flow uses standard OAuth 2.0 Authorization Code (RFC 6749). Nothing exotic:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Agent reads your UCP profile and sees you support Identity Linking&lt;/li&gt;
&lt;li&gt;Agent discovers your OAuth server via RFC 8414 at &lt;code&gt;/.well-known/oauth-authorization-server&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Agent requests authorization on the user's behalf&lt;/li&gt;
&lt;li&gt;User sees a one-time consent prompt (inside Copilot or Gemini)&lt;/li&gt;
&lt;li&gt;Agent gets an access token scoped to &lt;code&gt;ucp:scopes:checkout_session&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Every subsequent checkout carries member pricing, points, preferences&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The critical insight: &lt;strong&gt;one consent, persistent identity&lt;/strong&gt;. The user approves once. After that, the agent carries their loyalty membership into every future session with that merchant. No re-auth. No per-transaction prompts.&lt;/p&gt;

&lt;p&gt;Your OAuth server needs to publish a metadata endpoint per RFC 8414:&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;"issuer"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"https://yourstore.com"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"authorization_endpoint"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"https://yourstore.com/oauth/authorize"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"token_endpoint"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"https://yourstore.com/oauth/token"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"scopes_supported"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"ucp:scopes:checkout_session"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"response_types_supported"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"code"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"grant_types_supported"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"authorization_code"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"token_endpoint_auth_methods_supported"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"client_secret_basic"&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;Note: the OAuth endpoints are NOT declared in the UCP profile. They're discovered dynamically via RFC 8414. The profile only declares the &lt;code&gt;issuer&lt;/code&gt; URL.&lt;/p&gt;




&lt;h2&gt;
  
  
  Target Circle in Copilot: What the Flow Looks Like
&lt;/h2&gt;

&lt;p&gt;Here's what Microsoft built with Target as the launch partner:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;You ask Copilot to find running shoes under $80&lt;/li&gt;
&lt;li&gt;Copilot queries Target's UCP endpoint, finds matching products&lt;/li&gt;
&lt;li&gt;You pick a shoe. Copilot starts checkout&lt;/li&gt;
&lt;li&gt;Copilot sees Identity Linking in Target's profile. Prompts: "Connect your Target Circle account?"&lt;/li&gt;
&lt;li&gt;You approve. OAuth happens behind the scenes&lt;/li&gt;
&lt;li&gt;Checkout continues - but now with your Circle discount applied, your email pre-filled, your reward points available&lt;/li&gt;
&lt;li&gt;Next time you shop at Target through Copilot, step 4 is skipped. Your identity persists&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;This is why Microsoft specifically called out Identity Linking in their Merchant Center announcement. It's not a nice-to-have feature - it's the mechanism that makes loyalty programs survive the shift to AI-mediated commerce.&lt;/p&gt;




&lt;h2&gt;
  
  
  Why ACP Can't Do This
&lt;/h2&gt;

&lt;p&gt;ACP uses Stripe delegated tokens. A Stripe token represents a payment credential - a card, a wallet, a bank account.&lt;/p&gt;

&lt;p&gt;A Stripe token knows your card number. It does not know you're a rewards member. It does not know your loyalty tier. It does not carry member pricing.&lt;/p&gt;

&lt;p&gt;ACP has no OAuth identity layer. No account linking mechanism. No way for an agent to say "this shopper is customer #4821 with Gold status."&lt;/p&gt;

&lt;p&gt;This is a structural gap, not a missing feature. ACP was designed for payment delegation. UCP was designed for the full commerce lifecycle - including identity.&lt;/p&gt;

&lt;p&gt;When Microsoft needed loyalty programs to work in Copilot Shopping, ACP couldn't deliver. UCP could. 104 days was all it took to make the switch.&lt;/p&gt;




&lt;h2&gt;
  
  
  Implementation: Adding Identity Linking to Your Profile
&lt;/h2&gt;

&lt;p&gt;If you have a loyalty program and want it to work with AI agents, here's what you need:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;1. Add the capability to your UCP profile&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Add the &lt;code&gt;dev.ucp.common.identity_linking&lt;/code&gt; entry to your capabilities array (see the JSON example above). Common namespace - not shopping.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;2. Set up your OAuth server&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;You need a standard OAuth 2.0 Authorization Server with a metadata endpoint at &lt;code&gt;/.well-known/oauth-authorization-server&lt;/code&gt;. If you already support OAuth for mobile apps or partner integrations, you're most of the way there.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;3. Watch for these validation failures&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Our validator catches 4 Identity Linking-specific issues:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Error Code&lt;/th&gt;
&lt;th&gt;What Went Wrong&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;UCP_IDENTITY_MISSING_MECHANISMS&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;No &lt;code&gt;config.supported_mechanisms&lt;/code&gt; in your capability&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;UCP_IDENTITY_INVALID_MECHANISM&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Mechanism entry missing required &lt;code&gt;type&lt;/code&gt; field&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;UCP_IDENTITY_MISSING_ISSUER&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;OAuth2 mechanism without an &lt;code&gt;issuer&lt;/code&gt; URL&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;UCP_IDENTITY_ISSUER_NOT_HTTPS&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Issuer URL uses HTTP instead of HTTPS&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The most common failure: declaring the capability but forgetting the &lt;code&gt;config&lt;/code&gt; block entirely. A Level 1 validator (JSON structure only) won't catch this. You need Level 2 compliance validation.&lt;/p&gt;




&lt;h2&gt;
  
  
  What To Do Next
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Check if your profile declares Identity Linking&lt;/strong&gt; - if you have a loyalty program and it's missing, your members are invisible to AI agents&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Validate your Identity Linking config&lt;/strong&gt; at &lt;a href="https://ucptools.dev?utm_source=devto&amp;amp;utm_medium=article&amp;amp;utm_campaign=identity-linking" rel="noopener noreferrer"&gt;ucptools.dev&lt;/a&gt; - the validator checks all 4 error codes and tells you exactly what to fix&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Add UCP validation to CI/CD&lt;/strong&gt; - catch regressions before agents do (&lt;a href="https://github.com/marketplace/actions/ucp-profile-validator" rel="noopener noreferrer"&gt;GitHub Action&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Test the OAuth flow end-to-end&lt;/strong&gt; - a valid profile means nothing if the OAuth metadata endpoint returns a 404&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Microsoft made their bet. Target and Ulta are live. The Identity Linking spec is stable and validated by multiple agent platforms. If you have a loyalty program, this is the capability that makes it travel with your customers into AI commerce.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;UCPtools is an independent community tool - not affiliated with Google, Shopify, or the UCP consortium.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>ucp</category>
      <category>ecommerce</category>
      <category>oauth</category>
      <category>agenticcommerce</category>
    </item>
    <item>
      <title>93% of UCP profiles are broken. Here are the 3 failures that matter most.</title>
      <dc:creator>Peter</dc:creator>
      <pubDate>Sat, 18 Apr 2026 07:03:35 +0000</pubDate>
      <link>https://dev.to/ucptools/93-of-ucp-profiles-are-broken-here-are-the-3-failures-that-matter-most-1n37</link>
      <guid>https://dev.to/ucptools/93-of-ucp-profiles-are-broken-here-are-the-3-failures-that-matter-most-1n37</guid>
      <description>&lt;h1&gt;
  
  
  93% of UCP profiles are broken. Here are the 3 failures that matter most.
&lt;/h1&gt;

&lt;p&gt;Published April 18, 2026 | 5 min read&lt;/p&gt;

&lt;p&gt;We just scanned 111 e-commerce domains and found a staggering truth: &lt;strong&gt;93% of UCP profiles cannot complete AI agent purchases&lt;/strong&gt;. Not because they don't have UCP files, but because they fail at the 3 critical steps that actually matter for agentic commerce.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Data Behind the 93%
&lt;/h2&gt;

&lt;p&gt;Our AI Readiness Index scanned 111 reachable domains across fashion, home decor, beauty, SaaS, and marketplaces:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;72 domains (65%)&lt;/strong&gt;: Zero UCP presence at all&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;35 domains (31.5%)&lt;/strong&gt;: Have UCP files but are functionally broken&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;4 domains (3.6%)&lt;/strong&gt;: Have structural issues &lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;0 domains&lt;/strong&gt;: Are actually AI-agent ready&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Among the 35 stores that technically "pass" UCP validation (Grade C), &lt;strong&gt;100% share the same 3 fatal failures&lt;/strong&gt;. This is where the real problem lies.&lt;/p&gt;

&lt;h2&gt;
  
  
  The 3 Failures That Break AI Commerce
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1. Missing &lt;code&gt;signing_keys&lt;/code&gt; - 20% of all stores
&lt;/h3&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;"ucp_version"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"1.0"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"signing_keys"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[]&lt;/span&gt;&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="err"&gt;//&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;←&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;EMPTY&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;OR&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;MISSING&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;&lt;strong&gt;Why it matters&lt;/strong&gt;: Without cryptographic signing keys, AI agents cannot verify that your UCP manifest is authentic and hasn't been tampered with. This is a security requirement for any transaction.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Impact&lt;/strong&gt;: Agents will refuse to interact with your store, period.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. Missing &lt;code&gt;payment_handlers&lt;/code&gt; - 23% of stores with UCP
&lt;/h3&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;"services"&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;"checkout"&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;"type"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"rest"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"uri"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"https://yourstore.com/checkout"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"payment_handlers"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[]&lt;/span&gt;&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="err"&gt;//&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;←&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;EMPTY&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;OR&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;MISSING&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Why it matters&lt;/strong&gt;: Payment handlers tell AI agents which payment methods you accept (credit cards, PayPal, Apple Pay, etc.). Without them, agents have no idea how to complete a purchase.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Impact&lt;/strong&gt;: AI agents can discover your store but cannot buy from you.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. Missing &lt;code&gt;return_policy&lt;/code&gt; schema - 49% of all stores
&lt;/h3&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;"organization"&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;"name"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Your Store"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"return_policy"&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;"type"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"object"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"properties"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{}&lt;/span&gt;&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="err"&gt;//&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;←&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;MISSING&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;REQUIRED&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;FIELDS&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Why it matters&lt;/strong&gt;: Return policies are trust signals for AI agents. They need to know your return terms to recommend your store to users and handle post-purchase issues.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Impact&lt;/strong&gt;: AI agents cannot display your trustworthiness, reducing conversion likelihood.&lt;/p&gt;

&lt;h2&gt;
  
  
  The "Detected" ≠ "Ready" Trap
&lt;/h2&gt;

&lt;p&gt;Most UCP validation tools (including our own basic checks) only answer one question: &lt;em&gt;"Is there a .well-known/ucp file?"&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;They don't answer the questions that actually matter:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;✅ Can agents cryptographically verify your manifest?&lt;/li&gt;
&lt;li&gt;✅ Can agents process payments at your store?&lt;/li&gt;
&lt;li&gt;✅ Can agents display your trust signals?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Stores like Allbirds, Brooklinen, and Fashion Nova all pass basic UCP detection but fail at these critical levels. They're "detected" but not "transactable."&lt;/p&gt;

&lt;h2&gt;
  
  
  Real-World Example: BigCommerce Bug
&lt;/h2&gt;

&lt;p&gt;We found a platform-wide issue affecting BigCommerce merchants:&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;"services"&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;"dev.ucp.shopping"&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;"type"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"rest"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"uri"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"https://store.mybigcommerce.com/api/ucp"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"spec"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{}&lt;/span&gt;&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="err"&gt;//&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;←&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;MISSING&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;SPEC&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;FIELD&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Three BigCommerce domains shared identical &lt;code&gt;UCP_INVALID_SERVICE&lt;/code&gt; errors due to missing &lt;code&gt;spec&lt;/code&gt; fields. This isn't merchant error - it's a platform implementation issue.&lt;/p&gt;

&lt;h2&gt;
  
  
  What This Means for AI Commerce
&lt;/h2&gt;

&lt;p&gt;The 93% broken rate isn't just a statistic - it's a barrier to the $15T e-commerce market becoming AI-accessible.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;For brands&lt;/strong&gt;: You have a first-mover advantage right now. Fix these 3 fields and you'll be in the top 7% of AI-ready stores.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;For agencies&lt;/strong&gt;: Your clients' UCP profiles are likely broken even if they "pass" validation. You need to check these 3 critical areas.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;For platforms&lt;/strong&gt;: The current UCP implementation guidance is insufficient. Platforms need to enforce these 3 requirements at the validation level, not just the presence level.&lt;/p&gt;

&lt;h2&gt;
  
  
  Fix These in 15 Minutes
&lt;/h2&gt;

&lt;p&gt;These aren't complex architectural changes. They're simple field additions:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Add signing keys&lt;/strong&gt; from your SSL certificate&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;List accepted payment methods&lt;/strong&gt; in payment_handlers&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Define return terms&lt;/strong&gt; in the return_policy schema&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The tools exist to validate these properly - most just don't yet.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Market Opportunity
&lt;/h2&gt;

&lt;p&gt;Right now, the gap is enormous:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;0% of marketplaces have working UCP&lt;/li&gt;
&lt;li&gt;Only 31.5% of DTC brands even have UCP files&lt;/li&gt;
&lt;li&gt;Of those, effectively none are actually AI-transactable&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This creates a massive opportunity for the first platforms, agencies, and tools that solve these 3 fundamental problems.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Data from UCPtools AI Readiness Index - 111 domains scanned April 13, 2026. Scan methodology: Serper API discovery + targeted validation. All numbers from actual scan reports.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Test your store's UCP profile&lt;/strong&gt;: &lt;a href="https://ucptools.dev/directory?utm_source=devto&amp;amp;utm_medium=article&amp;amp;utm_campaign=202604" rel="noopener noreferrer"&gt;https://ucptools.dev/directory?utm_source=devto&amp;amp;utm_medium=article&amp;amp;utm_campaign=202604&lt;/a&gt; ?utm_source=dev.to&amp;amp;utm_medium=article&amp;amp;utm_campaign=202604&lt;/p&gt;

</description>
      <category>agenticcommerce</category>
      <category>ucp</category>
      <category>ecommerce</category>
      <category>webdev</category>
    </item>
    <item>
      <title>Austrian Insolvency Monitoring Without IWG License: Ediktsdatei on Apify</title>
      <dc:creator>Peter</dc:creator>
      <pubDate>Sat, 18 Apr 2026 06:52:38 +0000</pubDate>
      <link>https://dev.to/ucptools/austrian-insolvency-monitoring-without-iwg-license-ediktsdatei-on-apify-jab</link>
      <guid>https://dev.to/ucptools/austrian-insolvency-monitoring-without-iwg-license-ediktsdatei-on-apify-jab</guid>
      <description>&lt;h1&gt;
  
  
  Austrian Insolvency Monitoring Without IWG License: Ediktsdatei on Apify
&lt;/h1&gt;

&lt;p&gt;For compliance teams and credit risk analysts monitoring Austrian insolvency proceedings, the traditional path has been fraught with obstacles. The official Ediktsdatei system requires an expensive IWG government license, creating significant barriers for smaller firms, startups, and independent researchers who need access to critical insolvency data.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Problem: IWG License Barrier
&lt;/h2&gt;

&lt;p&gt;Austrian insolvency data is officially published through the Ediktsdatei system operated by the Austrian Courts. However, accessing this data programmatically traditionally required:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;IWG License Application&lt;/strong&gt;: Complex government approval process&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Costly Subscription&lt;/strong&gt;: Annual fees that can run into thousands of euros&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Technical Limitations&lt;/strong&gt;: Direct API access often restricted or unavailable&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Geographic Restrictions&lt;/strong&gt;: Some data may be location-limited&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This barrier has left many compliance professionals forced to either:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Pay for expensive third-party services&lt;/li&gt;
&lt;li&gt;Manually monitor court publications&lt;/li&gt;
&lt;li&gt;Go without critical insolvency monitoring entirely&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  The Solution: Ediktsdatei Scraper on Apify
&lt;/h2&gt;

&lt;p&gt;The Ediktsdatei scraper on Apify provides programmatic access to Austrian insolvency proceedings &lt;strong&gt;without requiring an IWG license&lt;/strong&gt;. This democratizes access to critical compliance data that was previously locked behind bureaucratic and financial barriers.&lt;/p&gt;

&lt;h3&gt;
  
  
  Key Features
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="c1"&gt;# Example: Get recent insolvency filings
&lt;/span&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;apify_client&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;ApifyClient&lt;/span&gt;

&lt;span class="n"&gt;client&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;ApifyClient&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;YOUR_API_TOKEN&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;run_input&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;keywords&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;Insolvenz&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;Konkurs&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;Sanierung&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;dateFrom&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;2024-01-01&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;maxResults&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;100&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="n"&gt;run&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;client&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;actor&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;regdata/austria-ediktsdatei-scraper&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;call&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;run_input&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;run_input&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;What you get:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Structured Data&lt;/strong&gt;: Court decisions, creditor information, asset details&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Real-time Monitoring&lt;/strong&gt;: Track new filings as they're published&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Historical Data&lt;/strong&gt;: Access to past proceedings for trend analysis&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Multi-Jurisdiction&lt;/strong&gt;: Coverage across Austrian regional courts&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Cost-Effective&lt;/strong&gt;: Pay-per-use pricing starting at $0.005 per result&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Use Cases for Compliance Teams
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1. Credit Risk Assessment
&lt;/h3&gt;

&lt;p&gt;Monitor Austrian companies showing signs of financial distress before it appears in credit reports. Early detection of insolvency proceedings allows for proactive risk mitigation.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. Supply Chain Risk Management
&lt;/h3&gt;

&lt;p&gt;Track your suppliers' financial health to prevent disruptions to your operations. Insolvency monitoring helps identify at-risk vendors before they fail.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. Due Diligence for M&amp;amp;A
&lt;/h3&gt;

&lt;p&gt;Conduct thorough background checks on Austrian target companies by reviewing their insolvency history and current proceedings.&lt;/p&gt;

&lt;h3&gt;
  
  
  4. Competitive Intelligence
&lt;/h3&gt;

&lt;p&gt;Monitor industry competitors for financial distress signals that may create market opportunities or risks.&lt;/p&gt;

&lt;h2&gt;
  
  
  Technical Implementation
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Basic Usage
&lt;/h3&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;pandas&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;pd&lt;/span&gt;

&lt;span class="c1"&gt;# Fetch recent insolvency data
&lt;/span&gt;&lt;span class="n"&gt;actor_client&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;ApifyClient&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;YOUR_API_TOKEN&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;results&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;actor_client&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;dataset&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;YOUR_DATASET_ID&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;list_items&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;

&lt;span class="c1"&gt;# Analyze trends by court
&lt;/span&gt;&lt;span class="n"&gt;df&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;pd&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;DataFrame&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;results&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;court_counts&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;df&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;court&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;].&lt;/span&gt;&lt;span class="nf"&gt;value_counts&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="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Insolvency filings by court:&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="n"&gt;court_counts&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Advanced Monitoring
&lt;/h3&gt;

&lt;p&gt;Set up automated monitoring for specific companies or industries:&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="c1"&gt;# Monitor specific companies
&lt;/span&gt;&lt;span class="n"&gt;monitoring_list&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;Unternehmensname GmbH&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;Industrie AG&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;Handels KG&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
&lt;span class="p"&gt;]&lt;/span&gt;

&lt;span class="c1"&gt;# Filter results for monitored companies
&lt;/span&gt;&lt;span class="n"&gt;filtered_results&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
    &lt;span class="n"&gt;item&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;item&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;results&lt;/span&gt; 
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="nf"&gt;any&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;company&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;item&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;debtor_name&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;company&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;monitoring_list&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;]&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Comparison with Alternatives
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Solution&lt;/th&gt;
&lt;th&gt;Cost&lt;/th&gt;
&lt;th&gt;License Required&lt;/th&gt;
&lt;th&gt;Real-time Data&lt;/th&gt;
&lt;th&gt;Historical Data&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Ediktsdatei Scraper&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;$0.005/result&lt;/td&gt;
&lt;td&gt;None&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;IWG Direct Access&lt;/td&gt;
&lt;td&gt;€2,000+/year&lt;/td&gt;
&lt;td&gt;Required ✅&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Commercial Vendors&lt;/td&gt;
&lt;td&gt;€500+/month&lt;/td&gt;
&lt;td&gt;Varies&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Manual Monitoring&lt;/td&gt;
&lt;td&gt;€0 (time cost)&lt;/td&gt;
&lt;td&gt;None&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;td&gt;Limited&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  Compliance Benefits
&lt;/h2&gt;

&lt;h3&gt;
  
  
  6AMLD Compliance
&lt;/h3&gt;

&lt;p&gt;The upcoming 6th Anti-Money Laundering Directive (effective July 2027) requires enhanced due diligence on beneficial owners and risk assessment. Austrian insolvency data provides critical signals for:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Enhanced Due Diligence&lt;/strong&gt;: Identifying high-risk entities&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Ongoing Monitoring&lt;/strong&gt;: Tracking changes in corporate structure&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Source of Wealth Verification&lt;/strong&gt;: Understanding financial history&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Regulatory Reporting
&lt;/h3&gt;

&lt;p&gt;Insolvency data feeds into various regulatory reporting requirements including:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Suspicious transaction reporting&lt;/li&gt;
&lt;li&gt;Enhanced customer due diligence&lt;/li&gt;
&lt;li&gt;Risk assessment documentation&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Getting Started
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Create Apify Account&lt;/strong&gt;: Free tier available&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Get API Token&lt;/strong&gt;: Generate from your Apify dashboard&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Deploy the Actor&lt;/strong&gt;: One-click deployment of Ediktsdatei scraper&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Configure Your Query&lt;/strong&gt;: Set keywords, date ranges, and filters&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Automate Monitoring&lt;/strong&gt;: Set up scheduled runs for ongoing monitoring&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  First Run Example
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="c1"&gt;# Configure your first scraping run
&lt;/span&gt;&lt;span class="n"&gt;run_input&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;keywords&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;Konkurs&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;Insolvenz&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;Sanierungsplan&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;dateFrom&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;2024-01-01&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;dateTo&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;2024-12-31&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;maxResults&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;50&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;includeDetails&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="bp"&gt;True&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="c1"&gt;# Execute the scrape
&lt;/span&gt;&lt;span class="n"&gt;run&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;client&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;actor&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;regdata/austria-ediktsdatei-scraper&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;call&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;run_input&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;run_input&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="c1"&gt;# Monitor progress
&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;Run status: &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;run&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&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="s"&gt;Items collected: &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;run&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;stats&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="si"&gt;}&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;h2&gt;
  
  
  Cost Analysis
&lt;/h2&gt;

&lt;p&gt;The pay-per-use model makes this solution highly cost-effective:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Small Scale&lt;/strong&gt;: 100 results/month = $0.50&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Medium Scale&lt;/strong&gt;: 1,000 results/month = $5.00&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Large Scale&lt;/strong&gt;: 10,000 results/month = $50.00&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Compare this to traditional IWG license fees of €2,000+ per year, and the value proposition becomes clear.&lt;/p&gt;

&lt;h2&gt;
  
  
  Limitations and Considerations
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Public Data Only&lt;/strong&gt;: Only covers officially published insolvency proceedings&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Update Frequency&lt;/strong&gt;: Dependent on court publication schedules&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Language&lt;/strong&gt;: Most documents are in German&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Data Completeness&lt;/strong&gt;: Some details may be redacted or incomplete&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Conclusion
&lt;/h2&gt;

&lt;p&gt;The Ediktsdatei scraper on Apify removes the IWG license barrier that has prevented many organizations from accessing critical Austrian insolvency data. For compliance teams, credit risk analysts, and due diligence professionals, this tool provides an affordable, scalable solution for monitoring Austrian corporate distress signals.&lt;/p&gt;

&lt;p&gt;As regulatory requirements continue to evolve and the importance of early risk detection grows, having programmatic access to insolvency data becomes increasingly valuable. This solution bridges the gap between the need for comprehensive compliance monitoring and the practical barriers that have traditionally existed.&lt;/p&gt;

&lt;p&gt;Ready to get started with Austrian insolvency monitoring? &lt;a href="https://apify.com/regdata/austria-ediktsdatei-scraper?utm_source=devto&amp;amp;utm_medium=article&amp;amp;utm_campaign=austria-ediktsdatei-scraper" rel="noopener noreferrer"&gt;Deploy the Ediktsdatei scraper on Apify&lt;/a&gt; and begin monitoring critical compliance signals today.&lt;/p&gt;

&lt;h2&gt;
  
  
  Additional Resources
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://apify.com/regdata/austria-ediktsdatei-scraper?utm_source=devto&amp;amp;utm_medium=article&amp;amp;utm_campaign=austria-ediktsdatei-scraper" rel="noopener noreferrer"&gt;Apify Ediktsdatei Scraper Documentation&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.justiz.gv.at/" rel="noopener noreferrer"&gt;Austrian Insolvency Court Procedures&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.accountancyeurope.com/insights/6th-aml-directive-key-changes" rel="noopener noreferrer"&gt;6AMLD Compliance Guidelines&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;What are your thoughts on insolvency monitoring tools? Have you faced challenges with accessing Austrian court data? Share your experiences in the comments below!&lt;/p&gt;

</description>
      <category>compliance</category>
      <category>austria</category>
      <category>insolvency</category>
      <category>apify</category>
    </item>
    <item>
      <title>6AMLD Compliance: Automate Beneficial Owner Checks by July 2027</title>
      <dc:creator>Peter</dc:creator>
      <pubDate>Fri, 17 Apr 2026 15:25:54 +0000</pubDate>
      <link>https://dev.to/ucptools/6amld-compliance-automate-beneficial-owner-checks-by-july-2027-4a4h</link>
      <guid>https://dev.to/ucptools/6amld-compliance-automate-beneficial-owner-checks-by-july-2027-4a4h</guid>
      <description>&lt;h1&gt;
  
  
  6AMLD Compliance: Automate Beneficial Owner Checks by July 2027
&lt;/h1&gt;

&lt;p&gt;The Sixth EU Anti-Money Laundering Directive (6AMLD) comes into full effect on &lt;strong&gt;July 10, 2027&lt;/strong&gt;, and compliance teams across Europe are scrambling to prepare. With stricter beneficial ownership verification requirements and increased penalties for non-compliance, manual registry searches are no longer sustainable.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Challenge: Cross-Border Beneficial Owner Verification
&lt;/h2&gt;

&lt;p&gt;Under 6AMLD, financial institutions and designated businesses must:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Verify beneficial ownership information for all corporate entities&lt;/li&gt;
&lt;li&gt;Monitor for changes in ownership structures&lt;/li&gt;
&lt;li&gt;Report suspicious activity within strict deadlines&lt;/li&gt;
&lt;li&gt;Maintain auditable trails of all verification processes&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The problem? Beneficial owner data is scattered across 27+ national registries with:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Different formats&lt;/strong&gt; (XML, JSON, PDF, web pages)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Varying access methods&lt;/strong&gt; (paid APIs, free portals, web scraping)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Update frequencies&lt;/strong&gt; (daily, weekly, quarterly)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Search capabilities&lt;/strong&gt; (limited to basic name/company searches)&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  The Solution: Automated Beneficial Owner Intelligence
&lt;/h2&gt;

&lt;p&gt;Our European Business Data Suite provides programmatic access to key beneficial owner registries across four countries:&lt;/p&gt;

&lt;h3&gt;
  
  
  Poland: CRBR Beneficial Owners Scraper
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;What it does:&lt;/strong&gt; Extracts real beneficial owner data from Poland's Central Register of Beneficial Owners&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Price:&lt;/strong&gt; $0.03 per result&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Use case:&lt;/strong&gt; Verify Polish company ownership structures, monitor for changes&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Why it matters:&lt;/strong&gt; Poland's CRBR is mandatory under 6AMLD with real-time updates&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Spain: Company Directory Scraper
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;What it does:&lt;/strong&gt; Accesses Spanish company registry data including beneficial owners&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Price:&lt;/strong&gt; $0.005 per result&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Use case:&lt;/strong&gt; Cross-reference Spanish entities with ownership information&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Why it matters:&lt;/strong&gt; Spain's strict transparency laws align with 6AMLD requirements&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Austria: WKO Business Directory
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;What it does:&lt;/strong&gt; Provides Austrian company data including ownership structures&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Price:&lt;/strong&gt; $0.003 per result
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Use case:&lt;/strong&gt; Verify Austrian beneficial ownership for due diligence&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Why it matters:&lt;/strong&gt; Austrian transparency requirements complement 6AMLD&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  France: Societe.com Company Data
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;What it does:&lt;/strong&gt; Extracts French company director and ownership information&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Price:&lt;/strong&gt; $0.005 per result&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Use case:&lt;/strong&gt; Monitor French corporate ownership changes&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Why it matters:&lt;/strong&gt; France's expanded beneficial ownership registries fall under 6AMLD&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Automated Compliance Workflows
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1. New Customer Onboarding
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Customer provides company ID → Cross-check all 4 country registries → 
Flag high-risk jurisdictions → Verify beneficial owners → 
Generate compliance report
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  2. Ongoing Monitoring
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Daily scans of registries → Detect ownership structure changes →
Trigger review workflows → Update compliance profiles →
Maintain audit trail
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  3. Risk Assessment
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Extract ownership networks → Identify politically exposed persons →
Cross-reference sanctions lists → Calculate risk scores →
Prioritize high-risk cases
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Why Automation Beats Manual Searches
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Method&lt;/th&gt;
&lt;th&gt;Speed&lt;/th&gt;
&lt;th&gt;Accuracy&lt;/th&gt;
&lt;th&gt;Cost&lt;/th&gt;
&lt;th&gt;Scalability&lt;/th&gt;
&lt;th&gt;Audit Trail&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Manual searches&lt;/td&gt;
&lt;td&gt;Hours per company&lt;/td&gt;
&lt;td&gt;60-80%&lt;/td&gt;
&lt;td&gt;$50-100/company&lt;/td&gt;
&lt;td&gt;Limited&lt;/td&gt;
&lt;td&gt;Poor&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Spreadsheets&lt;/td&gt;
&lt;td&gt;Days/weeks&lt;/td&gt;
&lt;td&gt;70-85%&lt;/td&gt;
&lt;td&gt;$20-50/company&lt;/td&gt;
&lt;td&gt;Limited&lt;/td&gt;
&lt;td&gt;Medium&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Our automation&lt;/td&gt;
&lt;td&gt;Minutes&lt;/td&gt;
&lt;td&gt;95%+&lt;/td&gt;
&lt;td&gt;$0.01-0.03/company&lt;/td&gt;
&lt;td&gt;Unlimited&lt;/td&gt;
&lt;td&gt;Excellent&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  Getting Started with 6AMLD Compliance
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Step 1: Assess Your Exposure
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Map your customer base by country&lt;/li&gt;
&lt;li&gt;Identify high-risk jurisdictions&lt;/li&gt;
&lt;li&gt;Calculate manual compliance costs&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Step 2: Test Automation
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Start with pilot customers&lt;/li&gt;
&lt;li&gt;Compare accuracy vs manual methods&lt;/li&gt;
&lt;li&gt;Build compliance templates&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Step 3: Scale Deployment
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Integrate with existing workflows&lt;/li&gt;
&lt;li&gt;Set up automated monitoring&lt;/li&gt;
&lt;li&gt;Establish alert thresholds&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Step 4: Maintain Compliance
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Regular audits of automated processes&lt;/li&gt;
&lt;li&gt;Updates for regulatory changes&lt;/li&gt;
&lt;li&gt;Continuous improvement&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  The Cost of Non-Compliance
&lt;/h2&gt;

&lt;p&gt;6AMLD penalties can reach up to &lt;strong&gt;5% of global annual turnover&lt;/strong&gt; or €10 million, whichever is higher. With 27+ countries implementing the directive, the compliance burden is unprecedented.&lt;/p&gt;

&lt;p&gt;Our suite reduces compliance costs by &lt;strong&gt;80-90%&lt;/strong&gt; while improving accuracy and auditability.&lt;/p&gt;

&lt;h2&gt;
  
  
  Start Your 6AMLD Journey Today
&lt;/h2&gt;

&lt;p&gt;The July 2027 deadline will be here before you know it. Early adopters are already building automated compliance systems, while laggards face impossible manual workloads.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Ready to automate your beneficial owner verification?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Explore our European Business Data Suite:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://apify.com/regdata/crbr-beneficial-owners-scraper?utm_source=devto&amp;amp;utm_medium=article&amp;amp;utm_campaign=crbr-beneficial-owners-scraper" rel="noopener noreferrer"&gt;CRBR Beneficial Owners Scraper (Poland)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://apify.com/regdata/spain-company-directory-scraper?utm_source=devto&amp;amp;utm_medium=article&amp;amp;utm_campaign=spain-company-directory-scraper" rel="noopener noreferrer"&gt;Spain Company Directory Scraper&lt;/a&gt; &lt;/li&gt;
&lt;li&gt;&lt;a href="https://apify.com/regdata/wko-business-directory-scraper?utm_source=devto&amp;amp;utm_medium=article&amp;amp;utm_campaign=wko-business-directory-scraper" rel="noopener noreferrer"&gt;WKO Business Directory Scraper (Austria)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://apify.com/regdata/societe-com-scraper?utm_source=devto&amp;amp;utm_medium=article&amp;amp;utm_campaign=societe-com-scraper" rel="noopener noreferrer"&gt;Societe.com Company Data Scraper (France)&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;em&gt;Automated compliance isn't just about meeting deadlines—it's about transforming compliance from a cost center to a competitive advantage.&lt;/em&gt;&lt;/p&gt;




&lt;p&gt;&lt;em&gt;This article is part of our European Business Data series. Stay tuned for more insights on cross-border compliance automation.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>compliance</category>
      <category>6amld</category>
      <category>automation</category>
      <category>kyc</category>
    </item>
    <item>
      <title>UCP and ACP Need a Third Layer: Trust Rails</title>
      <dc:creator>Peter</dc:creator>
      <pubDate>Thu, 16 Apr 2026 05:59:36 +0000</pubDate>
      <link>https://dev.to/ucptools/ucp-and-acp-need-a-third-layer-trust-rails-341i</link>
      <guid>https://dev.to/ucptools/ucp-and-acp-need-a-third-layer-trust-rails-341i</guid>
      <description>&lt;p&gt;If you only watched protocol updates in agentic commerce, this week might have looked like more of the same.&lt;/p&gt;

&lt;p&gt;But if you looked at where new announcements actually landed, the signal was different:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;UCP and ACP keep defining reach&lt;/strong&gt; (where an agent can discover and attempt checkout).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;A new trust layer is becoming explicit&lt;/strong&gt; (who carries risk when an autonomous purchase goes wrong).&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That second point is the story.&lt;/p&gt;

&lt;p&gt;In the last 7 days, the market did not just talk about agent checkout mechanics. It moved toward &lt;strong&gt;issuer-side controls, intent proof, and liability handling&lt;/strong&gt; as first-class infrastructure.&lt;/p&gt;

&lt;p&gt;For merchants, this changes the implementation question from:&lt;/p&gt;

&lt;p&gt;"Which protocol should we support first?"&lt;/p&gt;

&lt;p&gt;to:&lt;/p&gt;

&lt;p&gt;"How do we ship protocol coverage and trust controls together so autonomous checkout can scale without blowing up disputes?"&lt;/p&gt;

&lt;h2&gt;
  
  
  The 7-Day Signal (Apr 10-Apr 16)
&lt;/h2&gt;

&lt;p&gt;Here are the highest-signal changes and discussions from the current window:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Apr 14, 2026: American Express launched ACE developer tooling and registered-agent purchase protection&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Official newsroom announcement: American Express introduced Agentic Commerce Experiences (ACE) and protection mechanics for registered agent purchases.&lt;/li&gt;
&lt;li&gt;Practical meaning: payment-side participants are now publishing explicit models for intent validation, registration, and post-transaction accountability.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Apr 14, 2026: Commerce media coverage emphasized trust, control, and visibility for agent-initiated transactions&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Industry writeups broke out the operational pieces: agent registration, account enablement, purchase intent, tokenized credential pass-through, and optional cart context.&lt;/li&gt;
&lt;li&gt;Practical meaning: trust is no longer an abstract "future standards" topic. It is entering implementation checklists.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Apr 10-Apr 16, 2026: Operator conversation accelerated around protocol fragmentation and execution gaps&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Builders and commerce operators repeatedly framed the same reality: one protocol path rarely covers every agent ecosystem.&lt;/li&gt;
&lt;li&gt;Practical meaning: merchants need a multi-surface strategy (discovery + checkout + payment trust) instead of single-protocol optimism.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  UCP and ACP Are Reach Layers, Not Full Safety Models
&lt;/h2&gt;

&lt;p&gt;Let's separate what each layer does.&lt;/p&gt;

&lt;h3&gt;
  
  
  Layer 1: Reach and Interoperability
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;UCP (Google/Shopify ecosystem)&lt;/strong&gt; helps agents discover merchant capabilities and run structured commerce flows.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;ACP (OpenAI/Stripe ecosystem)&lt;/strong&gt; enables structured agent checkout interactions in the ChatGPT-linked path.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Both are essential. Neither is sufficient on its own for production-scale autonomous buying.&lt;/p&gt;

&lt;p&gt;Why?&lt;/p&gt;

&lt;p&gt;Because successful autonomous commerce needs answers to risk questions that protocol alone does not fully answer:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;What evidence proves user intent at authorization time?&lt;/li&gt;
&lt;li&gt;Who is accountable if the agent buys the wrong item?&lt;/li&gt;
&lt;li&gt;How does dispute resolution separate merchant error from agent error from user error?&lt;/li&gt;
&lt;li&gt;What data can be safely retained for adjudication without creating privacy debt?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;When volume is low, teams hand-wave these questions.&lt;br&gt;
When agent volume rises, they become blocking architecture.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why This Week Matters More Than Another Spec Diff
&lt;/h2&gt;

&lt;p&gt;The common pattern in early UCP/ACP discussions was:&lt;/p&gt;

&lt;p&gt;"Get discoverable and check-out capable first."&lt;/p&gt;

&lt;p&gt;That guidance was directionally right, but incomplete.&lt;/p&gt;

&lt;p&gt;This week showed the next constraint very clearly:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Agentic commerce throughput is constrained by the weaker layer:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Throughput ≈ min(protocol reach, trust-rail maturity)&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;If trust rails lag, throughput stalls. Not because agents cannot click "buy," but because finance, risk, and support teams will cap exposure.&lt;/p&gt;

&lt;p&gt;In plain terms:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;You can win technical demos with protocol support.&lt;/li&gt;
&lt;li&gt;You win real GMV only when risk teams sign off on intent and liability paths.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  The New Merchant Architecture (Practical Version)
&lt;/h2&gt;

&lt;p&gt;You do not need to boil the ocean this quarter. You do need to avoid shipping protocol support in isolation.&lt;/p&gt;

&lt;p&gt;Use this architecture split:&lt;/p&gt;

&lt;h3&gt;
  
  
  A) Discovery and Capability Layer
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Maintain a valid UCP profile (&lt;code&gt;/.well-known/ucp&lt;/code&gt;) where relevant.&lt;/li&gt;
&lt;li&gt;Keep capability declarations synchronized with real endpoint behavior.&lt;/li&gt;
&lt;li&gt;Validate profile and endpoint health continuously (not manually before launch days).&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  B) Transaction Execution Layer
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Implement clean, deterministic checkout state handling.&lt;/li&gt;
&lt;li&gt;Preserve idempotency across agent retries.&lt;/li&gt;
&lt;li&gt;Log machine-readable failure reasons so agents can recover.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  C) Trust and Liability Layer
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Record explicit intent artifacts for agent-initiated actions.&lt;/li&gt;
&lt;li&gt;Capture agent identity/registration context where available.&lt;/li&gt;
&lt;li&gt;Define dispute routing playbooks: agent error vs merchant error vs user error.&lt;/li&gt;
&lt;li&gt;Align payment credential handling with tokenized, scoped, revocable controls.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Most teams currently invest heavily in A and B, then improvise C.&lt;br&gt;
This week's market signal suggests that C is now where winners and false starts will diverge.&lt;/p&gt;

&lt;h2&gt;
  
  
  A 30-Day Implementation Plan You Can Actually Execute
&lt;/h2&gt;

&lt;p&gt;If your team is small, here is a realistic sequencing model.&lt;/p&gt;

&lt;h3&gt;
  
  
  Week 1: Baseline Reach Integrity
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;Validate UCP profile shape and endpoint availability.&lt;/li&gt;
&lt;li&gt;Confirm declared capabilities match production behavior.&lt;/li&gt;
&lt;li&gt;Patch obvious hygiene gaps (HTTPS, schema paths, key metadata).&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  Week 2: Checkout Determinism
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;Add idempotency guards on create/update/complete flows.&lt;/li&gt;
&lt;li&gt;Normalize error codes for agent-readable recovery.&lt;/li&gt;
&lt;li&gt;Add end-to-end replay tests for interrupted flows.&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  Week 3: Trust Artifacts
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;Define and store minimal intent evidence bundle.&lt;/li&gt;
&lt;li&gt;Capture agent/session identifiers in transaction metadata.&lt;/li&gt;
&lt;li&gt;Document what support can and cannot adjudicate with current logs.&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  Week 4: Liability Readiness Review
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;Run simulated dispute scenarios:

&lt;ul&gt;
&lt;li&gt;wrong color/variant selected by agent&lt;/li&gt;
&lt;li&gt;stale availability race&lt;/li&gt;
&lt;li&gt;canceled intent arriving after delayed authorization&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Confirm owner and fallback path for each failure mode.&lt;/li&gt;
&lt;li&gt;Update customer-facing policy language for autonomous purchases.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;This is not "perfect security architecture."&lt;br&gt;
It is enough to move from experimental to operational.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Cost of Ignoring the Trust Layer
&lt;/h2&gt;

&lt;p&gt;If you skip this shift and treat agentic commerce as protocol-only, you will usually see one of four outcomes:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;High discovery, low completion:&lt;/strong&gt; agents can find you but fail late in checkout.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Completion spikes, dispute spikes:&lt;/strong&gt; operations spend explodes and leadership throttles rollout.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Silent risk caps:&lt;/strong&gt; internal teams reduce allowed agent use-cases without product visibility.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Channel fragmentation debt:&lt;/strong&gt; each ecosystem gets separate one-off fixes, no shared risk model.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;In other words, engineering may report "integration complete" while finance reports "do not scale this yet."&lt;/p&gt;

&lt;h2&gt;
  
  
  Where UCPtools Fits (and Where It Doesn't)
&lt;/h2&gt;

&lt;p&gt;UCPtools helps with the &lt;strong&gt;readiness and validation side&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;profile and capability validation&lt;/li&gt;
&lt;li&gt;endpoint and schema checks&lt;/li&gt;
&lt;li&gt;implementation diagnostics you can run before shipping&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;It does &lt;strong&gt;not&lt;/strong&gt; replace your policy, underwriting, or issuer agreements.&lt;/p&gt;

&lt;p&gt;But it does reduce one expensive failure class: shipping broken protocol posture and discovering it only after agents already route traffic.&lt;/p&gt;

&lt;p&gt;If you want a quick baseline, run your domain through the validator:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://ucptools.dev/validator?utm_source=devto&amp;amp;utm_medium=article&amp;amp;utm_campaign=ai_commerce_for_developers&amp;amp;utm_content=risk_layer" rel="noopener noreferrer"&gt;https://ucptools.dev/validator?utm_source=devto&amp;amp;utm_medium=article&amp;amp;utm_campaign=ai_commerce_for_developers&amp;amp;utm_content=risk_layer&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Then use the score as your Week 1 input for the 30-day plan above.&lt;/p&gt;

&lt;h2&gt;
  
  
  What to Do This Week
&lt;/h2&gt;

&lt;p&gt;If you are deciding where to spend engineering time in April, here is the short answer:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Do not pick between UCP and ACP as an ideology war.&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Pick based on your near-term customer channel mix.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Do not treat protocol support as the finish line.&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Add intent and liability handling to the same roadmap.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Do not wait for perfect standards convergence.&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Build a clear internal trust model now, then adapt.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The teams that move fastest from pilot to durable volume will likely be the ones that connect these layers earliest:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Reach (UCP/ACP) + Execution (checkout reliability) + Trust (intent/liability rails).&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;That was not obvious to most teams a month ago.&lt;br&gt;
After this week, it should be.&lt;/p&gt;




&lt;p&gt;UCP is an open standard driven by Google and Shopify. ACP is an open standard driven by OpenAI and Stripe. UCPtools is an independent community tool and is not affiliated with Google, Shopify, OpenAI, or Stripe.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>ecommerce</category>
      <category>webdev</category>
      <category>shopify</category>
    </item>
    <item>
      <title>BORME Corporate Acts as Structured Data: Comparing Your Options in 2026</title>
      <dc:creator>Peter</dc:creator>
      <pubDate>Wed, 15 Apr 2026 10:07:13 +0000</pubDate>
      <link>https://dev.to/ucptools/borme-corporate-acts-as-structured-data-comparing-your-options-in-2026-235o</link>
      <guid>https://dev.to/ucptools/borme-corporate-acts-as-structured-data-comparing-your-options-in-2026-235o</guid>
      <description>&lt;p&gt;Every business day, Spain's Boletin Oficial del Registro Mercantil (BORME) publishes hundreds of corporate acts: company incorporations, officer appointments and dismissals, capital changes, dissolutions, mergers, and insolvency proceedings. For compliance teams monitoring Spanish counterparties or B2B sales teams prospecting new incorporations, this data is essential.&lt;/p&gt;

&lt;p&gt;The problem: BORME publishes as PDFs. The official BOE API gives you PDF URLs but not the parsed content inside them.&lt;/p&gt;

&lt;p&gt;This article compares three options for getting structured BORME data, with code examples.&lt;/p&gt;

&lt;h2&gt;
  
  
  Option 1: LibreBOR (formerly LibreBORME)
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;URL:&lt;/strong&gt; librebor.me&lt;br&gt;
&lt;strong&gt;Model:&lt;/strong&gt; Free web interface, limited API behind Cloudflare&lt;br&gt;
&lt;strong&gt;Status:&lt;/strong&gt; Active — last confirmed updates February/March 2026&lt;/p&gt;

&lt;p&gt;LibreBOR is the spiritual successor to the original LibreBORME open-source project. It provides a searchable web interface for BORME data at librebor.me, where you can look up any company and see its historical BORME acts. It's free and well-structured.&lt;/p&gt;

&lt;p&gt;However, it comes with practical limitations:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Rate limiting and Cloudflare protection&lt;/strong&gt; make bulk programmatic access unreliable&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;No official API documentation&lt;/strong&gt; — the original LibreBORME had a documented API, but LibreBOR's API access is restricted&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Dependency on a single maintainer&lt;/strong&gt; — the original LibreBORME went offline in April 2025; while LibreBOR has been stable, there's no service-level guarantee&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;No Apify integration&lt;/strong&gt; — you can't schedule runs, set up webhooks, or pipe results into your existing data pipeline on Apify&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;LibreBOR is excellent for ad-hoc lookups. If you need to check one company's BORME history, use it. If you need to process 500 acts daily in a production pipeline, the rate limiting becomes a blocker.&lt;/p&gt;
&lt;h2&gt;
  
  
  Option 2: BORME Scraper Pro (spain-data-solutions on Apify)
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;URL:&lt;/strong&gt; apify.com/spain-data-solutions/borme-scraper-pro&lt;br&gt;
&lt;strong&gt;Model:&lt;/strong&gt; $8/month platform fee + usage charges&lt;br&gt;
&lt;strong&gt;Status:&lt;/strong&gt; Active — 8 total users, 2 monthly active&lt;/p&gt;

&lt;p&gt;BORME Scraper Pro is a competing Apify actor that also parses BORME PDFs. It includes proxy rotation, province filtering, and claims 99.9% success rate. The developer renamed from startquicklabs and has been actively maintaining it.&lt;/p&gt;

&lt;p&gt;Pricing structure: a fixed $8/month platform fee plus per-usage charges. This makes economic sense if you're running daily BORME extractions at scale. For occasional use — say, pulling one week's BORME data for a due diligence project — the monthly commitment may not justify the cost.&lt;/p&gt;
&lt;h2&gt;
  
  
  Option 3: BORME Corporate Acts Parser (regdata on Apify)
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;URL:&lt;/strong&gt; apify.com/regdata/borme-corporate-acts-scraper&lt;br&gt;
&lt;strong&gt;Model:&lt;/strong&gt; Pay-per-use — $0.003 per result, no monthly fee&lt;br&gt;
&lt;strong&gt;Status:&lt;/strong&gt; Active — free tier friendly, HTTP-only (no Puppeteer)&lt;/p&gt;

&lt;p&gt;Our BORME actor takes a different approach: pure HTTP requests and PDF parsing with pdfjs-dist. No browser automation, no proxy required, no monthly fee. You pay $0.003 per corporate act extracted.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;How it works:&lt;/strong&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Fetches the BORME Section A index from boe.es for your specified date&lt;/li&gt;
&lt;li&gt;Downloads the PDF files listed in the index&lt;/li&gt;
&lt;li&gt;Parses each PDF to extract structured corporate acts&lt;/li&gt;
&lt;li&gt;Returns JSON with act type, company name, NIF, province, and full details&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;strong&gt;Input example:&lt;/strong&gt;&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;"date"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"2026-04-15"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"province"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Barcelona"&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;&lt;strong&gt;Output example:&lt;/strong&gt;&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;"date"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"2026-04-15"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"province"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Barcelona"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"bormeNumber"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"89"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"actType"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Nombramientos"&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"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"EJEMPLO SOLUCIONES SL"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"nif"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"B12345678"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"details"&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;"appointee"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Garcia Lopez, Maria"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"role"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Administrador único"&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;&lt;strong&gt;Running it via API:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl &lt;span class="nt"&gt;-X&lt;/span&gt; POST &lt;span class="s2"&gt;"https://api.apify.com/v2/acts/regdata~borme-corporate-acts-scraper/runs?token=YOUR_TOKEN"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-H&lt;/span&gt; &lt;span class="s2"&gt;"Content-Type: application/json"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-d&lt;/span&gt; &lt;span class="s1"&gt;'{"date": "2026-04-15"}'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Running it with the Python client:&lt;/strong&gt;&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;from&lt;/span&gt; &lt;span class="n"&gt;apify_client&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;ApifyClient&lt;/span&gt;

&lt;span class="n"&gt;client&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;ApifyClient&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;YOUR_TOKEN&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="n"&gt;run&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;client&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;actor&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;regdata/borme-corporate-acts-scraper&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;call&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;run_input&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;date&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;2026-04-15&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;province&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;Madrid&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;item&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;client&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;dataset&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;run&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;defaultDatasetId&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]).&lt;/span&gt;&lt;span class="nf"&gt;iterate_items&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;item&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;actType&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;: &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;item&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&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; (&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;item&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;nif&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;)&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;&lt;strong&gt;Cost comparison for common use cases:&lt;/strong&gt;&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Use Case&lt;/th&gt;
&lt;th&gt;Acts/Run&lt;/th&gt;
&lt;th&gt;BORME Scraper Pro&lt;/th&gt;
&lt;th&gt;Our BORME Parser&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Daily monitoring (1 province, 1 month)&lt;/td&gt;
&lt;td&gt;~1,500&lt;/td&gt;
&lt;td&gt;$8 + usage&lt;/td&gt;
&lt;td&gt;~$4.50&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;One-off due diligence (1 day, all provinces)&lt;/td&gt;
&lt;td&gt;~500&lt;/td&gt;
&lt;td&gt;$8 + usage&lt;/td&gt;
&lt;td&gt;~$1.50&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Quarterly batch (3 months, 2 provinces)&lt;/td&gt;
&lt;td&gt;~9,000&lt;/td&gt;
&lt;td&gt;$8 + usage&lt;/td&gt;
&lt;td&gt;~$27.00&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;For the one-off and low-frequency use cases that most compliance teams and law firms run, pay-per-use is significantly cheaper. The break-even with BORME Scraper Pro's $8 monthly fee is around 2,600 acts per month — below that, pay-per-use wins.&lt;/p&gt;

&lt;h2&gt;
  
  
  What BORME Data Looks Like
&lt;/h2&gt;

&lt;p&gt;BORME Section A publishes the following act types daily:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Constituciones&lt;/strong&gt; — new company incorporations (the goldmine for B2B prospecting)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Nombramientos&lt;/strong&gt; — officer appointments (directors, administrators, secretaries)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Ceses/Dimisiones&lt;/strong&gt; — officer dismissals and resignations&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Modificaciones&lt;/strong&gt; — company statute changes&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Aumentos de capital / Reducciones de capital&lt;/strong&gt; — capital increases and reductions&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Disoluciones&lt;/strong&gt; — company dissolutions&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Fusiones / Escisiones&lt;/strong&gt; — mergers and spin-offs&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Declaraciones de unicidad&lt;/strong&gt; — single-member company declarations&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Revocaciones de poderes&lt;/strong&gt; — revocations of powers of attorney&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Situaciones concursales&lt;/strong&gt; — insolvency proceedings&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Each act type is extracted with its specific fields. For example, a "Constitución" includes company name, NIF, registered address, initial capital, and appointed officers. A "Cese" includes the departing officer's name and role.&lt;/p&gt;

&lt;h2&gt;
  
  
  Practical Workflow: Monitoring New Spanish Incorporations
&lt;/h2&gt;

&lt;p&gt;A common use case: your B2B sales team wants daily alerts when new companies are incorporated in your target provinces.&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;from&lt;/span&gt; &lt;span class="n"&gt;apify_client&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;ApifyClient&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;json&lt;/span&gt;

&lt;span class="n"&gt;client&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;ApifyClient&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;YOUR_TOKEN&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="c1"&gt;# Run BORME parser for today
&lt;/span&gt;&lt;span class="n"&gt;run&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;client&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;actor&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;regdata/borme-corporate-acts-scraper&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;call&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;run_input&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;date&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;2026-04-15&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="c1"&gt;# Filter for new incorporations only
&lt;/span&gt;&lt;span class="n"&gt;new_companies&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
    &lt;span class="n"&gt;item&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;item&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;client&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;dataset&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;run&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;defaultDatasetId&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]).&lt;/span&gt;&lt;span class="nf"&gt;iterate_items&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;item&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;actType&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;Constituciones&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;company&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;new_companies&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="s"&gt;NEW: &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;company&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&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; (NIF: &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;company&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;nif&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;)&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="c1"&gt;# Push to your CRM, Slack, or email pipeline
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Set this up as a scheduled run on Apify (daily at 10:00 CET, after BORME publishes), add a webhook to push results to your Slack or CRM, and you have a fully automated new-business monitoring system.&lt;/p&gt;

&lt;h2&gt;
  
  
  Summary
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;/th&gt;
&lt;th&gt;LibreBOR&lt;/th&gt;
&lt;th&gt;BORME Scraper Pro&lt;/th&gt;
&lt;th&gt;Our BORME Parser&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Cost&lt;/td&gt;
&lt;td&gt;Free&lt;/td&gt;
&lt;td&gt;$8/month + usage&lt;/td&gt;
&lt;td&gt;$0.003/act, no monthly fee&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Bulk access&lt;/td&gt;
&lt;td&gt;Rate limited&lt;/td&gt;
&lt;td&gt;Yes (proxy rotation)&lt;/td&gt;
&lt;td&gt;Yes (HTTP-only)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Apify integration&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Free tier&lt;/td&gt;
&lt;td&gt;N/A&lt;/td&gt;
&lt;td&gt;No ($8 minimum)&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Proxy required&lt;/td&gt;
&lt;td&gt;N/A&lt;/td&gt;
&lt;td&gt;Yes (included)&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Maintenance risk&lt;/td&gt;
&lt;td&gt;Single maintainer&lt;/td&gt;
&lt;td&gt;Developer-supported&lt;/td&gt;
&lt;td&gt;Developer-supported&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Best for&lt;/td&gt;
&lt;td&gt;Ad-hoc lookups&lt;/td&gt;
&lt;td&gt;Daily high-volume pipelines&lt;/td&gt;
&lt;td&gt;Occasional/batch processing&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Choose based on your volume and frequency. LibreBOR for quick manual lookups. BORME Scraper Pro if you're running thousands of acts daily and can justify the monthly commitment. Our parser for everything in between — project-based due diligence, periodic compliance checks, and batch processing without a recurring fee.&lt;/p&gt;

</description>
      <category>spain</category>
      <category>compliance</category>
      <category>webscraping</category>
      <category>api</category>
    </item>
    <item>
      <title>European Business Data Suite: 14 Actors, 4 Countries, One Platform</title>
      <dc:creator>Peter</dc:creator>
      <pubDate>Wed, 15 Apr 2026 10:07:10 +0000</pubDate>
      <link>https://dev.to/ucptools/european-business-data-suite-14-actors-4-countries-one-platform-1kp0</link>
      <guid>https://dev.to/ucptools/european-business-data-suite-14-actors-4-countries-one-platform-1kp0</guid>
      <description>&lt;p&gt;Government registries across Europe share one thing in common: they have no public API. Whether you need Polish company financials from KRS, Spanish corporate acts from BORME, Austrian insolvency data from Ediktsdatei, or French director networks from Societe.com — you're stuck with manual portal searches. One query at a time.&lt;/p&gt;

&lt;p&gt;This article maps out 14 Apify actors that give you programmatic access to government and semi-official business data sources across 4 European countries. Every actor returns structured JSON. Every actor is pay-per-use with no subscription.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Problem: Government Portals Without APIs
&lt;/h2&gt;

&lt;p&gt;European business registries were built for citizens, not developers. Here's what that means in practice:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Poland's eKRS portal&lt;/strong&gt; requires navigating through forms, solving captchas, and downloading individual PDF/XML files for each company's financial statements&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Spain's BORME&lt;/strong&gt; publishes 500+ corporate acts daily as PDFs — the official API gives you PDF URLs but not the parsed content&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Austria's Ediktsdatei&lt;/strong&gt; insolvency register requires an IWG license from the Ministry of Justice for API access — a bureaucratic process most companies can't justify&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;France's Societe.com&lt;/strong&gt; aggregates INSEE, INPI, and BODACC data with director networks and financials, but has no API — you'd need to query 3 separate government APIs and join the data yourself&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Poland's CRBR&lt;/strong&gt; beneficial owner register has no bulk API — you verify one NIP at a time&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Poland's EKW&lt;/strong&gt; land registry uses an encrypted API endpoint and captcha, making it one of the hardest registries to automate in Europe&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;For a compliance officer running due diligence on 200 counterparties across multiple countries, this means days of manual work. For a developer building a KYC pipeline, it means writing fragile scrapers that break when portals change.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Suite: 14 Actors, 4 Countries
&lt;/h2&gt;

&lt;p&gt;All actors run on Apify's serverless platform. You get an API endpoint, scheduled runs, webhooks, and structured JSON output. No infrastructure to manage.&lt;/p&gt;

&lt;h3&gt;
  
  
  Poland (9 Actors)
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Actor&lt;/th&gt;
&lt;th&gt;Registry&lt;/th&gt;
&lt;th&gt;Price/Result&lt;/th&gt;
&lt;th&gt;Key Use Case&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="https://apify.com/regdata/poland-krs-financial-scraper?utm_source=devto&amp;amp;utm_medium=article&amp;amp;utm_campaign=poland-krs-financial-scraper" rel="noopener noreferrer"&gt;KRS Financial Statements&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;eKRS (ekrs.ms.gov.pl)&lt;/td&gt;
&lt;td&gt;$0.025&lt;/td&gt;
&lt;td&gt;Balance sheets, income statements from official filings&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="https://apify.com/regdata/ekw-ksiegi-wieczyste-scraper?utm_source=devto&amp;amp;utm_medium=article&amp;amp;utm_campaign=ekw-ksiegi-wieczyste-scraper" rel="noopener noreferrer"&gt;EKW Land Registry&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;EKW (ekw.ms.gov.pl)&lt;/td&gt;
&lt;td&gt;$0.04&lt;/td&gt;
&lt;td&gt;Property ownership, mortgages, easements across 352 courts&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="https://apify.com/regdata/crbr-beneficial-owners-scraper?utm_source=devto&amp;amp;utm_medium=article&amp;amp;utm_campaign=crbr-beneficial-owners-scraper" rel="noopener noreferrer"&gt;CRBR Beneficial Owners&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;CRBR (crbr.podatki.gov.pl)&lt;/td&gt;
&lt;td&gt;$0.03&lt;/td&gt;
&lt;td&gt;UBO verification — names, citizenship, ownership %&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="https://apify.com/regdata/krz-debtor-scraper?utm_source=devto&amp;amp;utm_medium=article&amp;amp;utm_campaign=krz-debtor-scraper" rel="noopener noreferrer"&gt;KRZ Debtor Registry&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;KRZ (krz.ms.gov.pl)&lt;/td&gt;
&lt;td&gt;$0.025&lt;/td&gt;
&lt;td&gt;Bankruptcy and debt screening — 9 search modes&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="https://apify.com/regdata/uokik-clauses-scraper?utm_source=devto&amp;amp;utm_medium=article&amp;amp;utm_campaign=uokik-clauses-scraper" rel="noopener noreferrer"&gt;UOKiK Abusive Clauses&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;UOKiK register&lt;/td&gt;
&lt;td&gt;$0.003&lt;/td&gt;
&lt;td&gt;Contract compliance against 7,500+ banned clauses&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="https://apify.com/regdata/msig-scraper?utm_source=devto&amp;amp;utm_medium=article&amp;amp;utm_campaign=msig-scraper" rel="noopener noreferrer"&gt;MSiG Court Gazette&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;MSiG (ems.ms.gov.pl)&lt;/td&gt;
&lt;td&gt;$0.005&lt;/td&gt;
&lt;td&gt;20+ years of bankruptcy, liquidation, merger announcements&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="https://apify.com/regdata/knf-registry-scraper?utm_source=devto&amp;amp;utm_medium=article&amp;amp;utm_campaign=knf-registry-scraper" rel="noopener noreferrer"&gt;KNF Financial Registry&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;KNF (3 registries)&lt;/td&gt;
&lt;td&gt;$0.006&lt;/td&gt;
&lt;td&gt;Licensed financial institution verification — 75,000+ entities&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="https://apify.com/regdata/bdo-waste-registry-scraper?utm_source=devto&amp;amp;utm_medium=article&amp;amp;utm_campaign=bdo-waste-registry-scraper" rel="noopener noreferrer"&gt;BDO Waste Registry&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;BDO (bdo.mos.gov.pl)&lt;/td&gt;
&lt;td&gt;$0.005&lt;/td&gt;
&lt;td&gt;Waste contractor verification for ESG/CSRD compliance&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="https://apify.com/regdata/krs-fullnames-scraper?utm_source=devto&amp;amp;utm_medium=article&amp;amp;utm_campaign=krs-fullnames-scraper" rel="noopener noreferrer"&gt;KRS Board Members&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;KRS PDF extracts&lt;/td&gt;
&lt;td&gt;$0.035&lt;/td&gt;
&lt;td&gt;Full board member names — the official API censors them&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;Technical note on KRS Board Members:&lt;/strong&gt; The official KRS1 API returns person names as "L******" (censored). This actor downloads the public PDF extract from the government portal, which contains full names. It's the only way to get non-anonymized Polish company director data programmatically.&lt;/p&gt;

&lt;h3&gt;
  
  
  Spain (2 Actors)
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Actor&lt;/th&gt;
&lt;th&gt;Source&lt;/th&gt;
&lt;th&gt;Price/Result&lt;/th&gt;
&lt;th&gt;Key Use Case&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="https://apify.com/regdata/borme-corporate-acts-scraper?utm_source=devto&amp;amp;utm_medium=article&amp;amp;utm_campaign=borme-corporate-acts-scraper" rel="noopener noreferrer"&gt;BORME Corporate Acts&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;BORME via boe.es&lt;/td&gt;
&lt;td&gt;$0.003&lt;/td&gt;
&lt;td&gt;Daily corporate acts — incorporations, appointments, capital changes&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="https://apify.com/regdata/spain-company-directory-scraper?utm_source=devto&amp;amp;utm_medium=article&amp;amp;utm_campaign=spain-company-directory-scraper" rel="noopener noreferrer"&gt;Spain Company Directory&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;OpenData Registradores&lt;/td&gt;
&lt;td&gt;$0.005&lt;/td&gt;
&lt;td&gt;Company profiles with NIF, officers, CNAE codes&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;BORME&lt;/strong&gt; parses the official PDFs published daily by Spain's Registro Mercantil. It extracts structured data from 500+ daily corporate acts: new company incorporations, officer appointments and dismissals, capital increases and reductions, dissolutions and mergers.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Spain Company Directory&lt;/strong&gt; scrapes the official Colegio de Registradores open data portal (opendata.registradores.org), which launched in 2024 but has no public API. It returns NIF, legal form, registered officers, CNAE industry codes, address, and status. Requires residential proxy.&lt;/p&gt;

&lt;h3&gt;
  
  
  Austria (2 Actors)
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Actor&lt;/th&gt;
&lt;th&gt;Source&lt;/th&gt;
&lt;th&gt;Price/Result&lt;/th&gt;
&lt;th&gt;Key Use Case&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="https://apify.com/regdata/austria-ediktsdatei-scraper?utm_source=devto&amp;amp;utm_medium=article&amp;amp;utm_campaign=austria-ediktsdatei-scraper" rel="noopener noreferrer"&gt;Ediktsdatei Insolvency&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;edikte.justiz.gv.at&lt;/td&gt;
&lt;td&gt;$0.005&lt;/td&gt;
&lt;td&gt;Bankruptcies, reorganizations, debt settlements&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="https://apify.com/regdata/wko-business-directory-scraper?utm_source=devto&amp;amp;utm_medium=article&amp;amp;utm_campaign=wko-business-directory-scraper" rel="noopener noreferrer"&gt;WKO Business Directory&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;firmen.wko.at&lt;/td&gt;
&lt;td&gt;$0.003&lt;/td&gt;
&lt;td&gt;620,000+ businesses with phone, email, website&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;Ediktsdatei&lt;/strong&gt; is the only Apify actor providing Austrian insolvency data without requiring the IWG government license. The official API at justizonline.gv.at requires "ID Austria" authentication and bureaucratic approval — this actor scrapes the public HTML pages instead.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;WKO Firmen A-Z&lt;/strong&gt; is the Austrian Chamber of Commerce's official business directory. No API exists. This actor extracts company name, address, phone, email, website, and industry classification from 620,000+ registered businesses. Useful for B2B lead generation, market entry research, and supplier discovery.&lt;/p&gt;

&lt;h3&gt;
  
  
  France (1 Actor)
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Actor&lt;/th&gt;
&lt;th&gt;Source&lt;/th&gt;
&lt;th&gt;Price/Result&lt;/th&gt;
&lt;th&gt;Key Use Case&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="https://apify.com/regdata/societe-com-scraper?utm_source=devto&amp;amp;utm_medium=article&amp;amp;utm_campaign=societe-com-scraper" rel="noopener noreferrer"&gt;Societe.com Company Data&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;Societe.com&lt;/td&gt;
&lt;td&gt;$0.005&lt;/td&gt;
&lt;td&gt;Directors, financials, shareholders in one profile&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;Societe.com&lt;/strong&gt; aggregates data from INSEE (SIREN/SIRET), INPI (RNE), and BODACC into combined company profiles. While individual government APIs exist (API Sirene, INPI RNE), none provide the combined director-financial-shareholder profile. This actor gives you directors with roles, simplified financials (revenue, net result), shareholders, subsidiaries, NAF code, and legal form — all in a single API call. Requires residential proxy.&lt;/p&gt;

&lt;h2&gt;
  
  
  Cross-Border Due Diligence Workflow
&lt;/h2&gt;

&lt;p&gt;Here's a concrete example: your compliance team needs to screen a counterparty that operates across Poland, Spain, and Austria.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Step 1: Poland KRS Financial Statements
  → Pull their latest balance sheet and income statement

Step 2: Poland CRBR Beneficial Owners  
  → Identify all beneficial owners with ownership percentages

Step 3: Poland KRZ Debtor Registry
  → Check for bankruptcy proceedings or outstanding debts

Step 4: Spain BORME Corporate Acts
  → Check for recent officer changes or capital restructuring at their Spanish subsidiary

Step 5: Austria Ediktsdatei Insolvency
  → Screen for insolvency proceedings at their Austrian branch

Step 6: Cross-reference
  → Join the data to build a complete risk profile
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Running this manually across 5 different portals with different interfaces, languages, and search capabilities would take hours per counterparty. With the actors above, you can automate the entire pipeline.&lt;/p&gt;

&lt;h2&gt;
  
  
  Quick Start Example
&lt;/h2&gt;

&lt;p&gt;Here's how to call any actor via the Apify API:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Example: Run BORME scraper for a specific date&lt;/span&gt;
curl &lt;span class="nt"&gt;-X&lt;/span&gt; POST &lt;span class="s2"&gt;"https://api.apify.com/v2/acts/regdata~borme-corporate-acts-scraper/runs?token=YOUR_API_TOKEN"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-H&lt;/span&gt; &lt;span class="s2"&gt;"Content-Type: application/json"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-d&lt;/span&gt; &lt;span class="s1"&gt;'{
    "date": "2026-04-15",
    "province": "Madrid"
  }'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Or use the Apify Python client:&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;from&lt;/span&gt; &lt;span class="n"&gt;apify_client&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;ApifyClient&lt;/span&gt;

&lt;span class="n"&gt;client&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;ApifyClient&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;YOUR_API_TOKEN&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="c1"&gt;# Run KRS Financial Statements scraper
&lt;/span&gt;&lt;span class="n"&gt;run&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;client&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;actor&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;regdata/poland-krs-financial-scraper&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;call&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;run_input&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;companyIds&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;0000012345&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;item&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;client&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;dataset&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;run&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;defaultDatasetId&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]).&lt;/span&gt;&lt;span class="nf"&gt;iterate_items&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="s"&gt;Company: &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;item&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;companyName&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="s"&gt;Total assets: &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;item&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;financialData&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;totalAssets&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="s"&gt;Revenue: &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;item&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;financialData&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;revenue&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;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Pricing: Pay-Per-Use vs Subscriptions
&lt;/h2&gt;

&lt;p&gt;Traditional European business data providers (MGBI, Bisnode/D&amp;amp;B, Axesor) operate on subscription models — typically hundreds or thousands of euros per month. That makes sense if you're running thousands of queries daily. But for most compliance teams, law firms, and due diligence analysts, usage is sporadic: batch checks before a deal, periodic counterparty reviews, one-off investigations.&lt;/p&gt;

&lt;p&gt;Pay-per-use pricing means you pay only for what you need:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;A single KRS financial statement costs $0.025&lt;/li&gt;
&lt;li&gt;A BORME day's corporate acts cost $0.003 per act&lt;/li&gt;
&lt;li&gt;A WKO business lookup costs $0.003&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Running 100 KRS financial checks costs $2.50. Running 1,000 BORME act extractions costs $3.00. No monthly commitment, no minimums.&lt;/p&gt;

&lt;p&gt;Apify's tiered pricing also reduces the per-result cost at higher volumes (GOLD and above), so production pipelines get cheaper as you scale.&lt;/p&gt;

&lt;h2&gt;
  
  
  Technical Notes
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Free-tier friendly actors&lt;/strong&gt; (no proxy needed, run on Apify free plan):&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;KRS Financial Statements&lt;/li&gt;
&lt;li&gt;CRBR Beneficial Owners&lt;/li&gt;
&lt;li&gt;KRZ Debtor Registry&lt;/li&gt;
&lt;li&gt;UOKiK Abusive Clauses&lt;/li&gt;
&lt;li&gt;MSiG Court Gazette&lt;/li&gt;
&lt;li&gt;KNF Financial Registry&lt;/li&gt;
&lt;li&gt;BORME Corporate Acts&lt;/li&gt;
&lt;li&gt;Ediktsdatei Insolvency&lt;/li&gt;
&lt;li&gt;WKO Business Directory (free tier needs higher memory setting)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Requires residential proxy&lt;/strong&gt; (paid Apify plan):&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;EKW Land Registry (encrypted API + captcha)&lt;/li&gt;
&lt;li&gt;Spain Company Directory (F5/Volterra WAF)&lt;/li&gt;
&lt;li&gt;Societe.com Company Data (anti-bot protection)&lt;/li&gt;
&lt;li&gt;BDO Waste Registry (React SPA with stealth detection)&lt;/li&gt;
&lt;li&gt;KRS Board Members (PDF download requires proxy rotation)&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Which Actors Should You Start With?
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;For compliance/KYC teams:&lt;/strong&gt; CRBR Beneficial Owners + KRZ Debtor Registry + KRS Financial Statements. These three cover the core Polish due diligence workflow: who owns it, are they in debt, and are they financially stable.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;For B2B sales teams:&lt;/strong&gt; WKO Business Directory (620K Austrian contacts) + BORME Corporate Acts (daily Spanish new incorporations) + KRS Board Members (Polish company directors with full names).&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;For credit risk analysts:&lt;/strong&gt; Ediktsdatei Insolvency (Austrian bankruptcies) + KRZ Debtor Registry (Polish debtors) + KRS Financial Statements (Polish financials).&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;For M&amp;amp;A and competitive intelligence:&lt;/strong&gt; Societe.com (French director networks) + BORME Corporate Acts (Spanish corporate changes) + KRS Financial Statements (Polish financials).&lt;/p&gt;

&lt;h2&gt;
  
  
  Bottom Line
&lt;/h2&gt;

&lt;p&gt;These 14 actors exist because European government registries systematically lack public APIs. If you need programmatic access to business data from Poland, Spain, Austria, or France, and you don't want to build and maintain fragile scrapers yourself, this suite covers the most commonly needed sources.&lt;/p&gt;

&lt;p&gt;Every actor links to its Apify page with full documentation, input schemas, and example outputs. Try any of them with the Apify free tier — most actors work without a paid plan.&lt;/p&gt;

</description>
      <category>compliance</category>
      <category>webscraping</category>
      <category>api</category>
      <category>europe</category>
    </item>
  </channel>
</rss>
