<?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>Forem: Peter</title>
    <description>The latest articles on Forem by Peter (@ucptools).</description>
    <link>https://forem.com/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>Forem: Peter</title>
      <link>https://forem.com/ucptools</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://forem.com/feed/ucptools"/>
    <language>en</language>
    <item>
      <title>ACP Pivoted from Checkout to Discovery. UCP Wins by Default - Here's the Protocol Convergence.</title>
      <dc:creator>Peter</dc:creator>
      <pubDate>Wed, 06 May 2026 10:21:17 +0000</pubDate>
      <link>https://forem.com/ucptools/acp-pivoted-from-checkout-to-discovery-ucp-wins-by-default-heres-the-protocol-convergence-374e</link>
      <guid>https://forem.com/ucptools/acp-pivoted-from-checkout-to-discovery-ucp-wins-by-default-heres-the-protocol-convergence-374e</guid>
      <description>&lt;h1&gt;
  
  
  ACP Pivoted from Checkout to Discovery. UCP Wins by Default - Here's the Protocol Convergence.
&lt;/h1&gt;

&lt;p&gt;OpenAI just made the biggest strategic retreat in agentic commerce, and most developers missed what it means for their stack.&lt;/p&gt;

&lt;p&gt;In March 2026, OpenAI quietly pivoted ACP (Agentic Commerce Protocol) away from its original premise: completing purchases inside ChatGPT. The "Instant Checkout" button that was supposed to revolutionize shopping? Gone. Replaced by a merchant app model where purchases complete on the retailer's own storefront.&lt;/p&gt;

&lt;p&gt;This isn't a bug. It's an admission that full-stack commerce is harder than discovery. And it hands the complete commerce stack to UCP by default.&lt;/p&gt;

&lt;h2&gt;
  
  
  What actually happened
&lt;/h2&gt;

&lt;p&gt;OpenAI's ACP launched with an ambitious vision: users would discover products, compare options, and complete purchases entirely within ChatGPT. Stripe provided the payment rails. The promise was a seamless, one-tap checkout experience inside an AI conversation.&lt;/p&gt;

&lt;p&gt;It didn't work.&lt;/p&gt;

&lt;p&gt;CNBC reported on March 20 that "OpenAI's first try at agentic shopping stumbled." Users browsed products in ChatGPT but abandoned purchases before completing them. The in-chat checkout experience lacked sales tax infrastructure, return policy visibility, and the trust signals that mature e-commerce storefronts provide.&lt;/p&gt;

&lt;p&gt;The pivot, detailed by Digital Commerce 360 on March 24, shifts ACP to a merchant app model:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Dedicated retailer apps inside ChatGPT (Instacart, Etsy, Shopify, Walmart)&lt;/li&gt;
&lt;li&gt;Product discovery and comparison happens in-chat&lt;/li&gt;
&lt;li&gt;Purchase completion happens on the merchant's own storefront (in-app browser on mobile, separate tab on desktop)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;As Roger Dunn wrote in his analysis: "ACP's role shifts from universal long-tail merchant connector to plumbing for deep, bespoke retailer partnerships."&lt;/p&gt;

&lt;h2&gt;
  
  
  The protocol math just changed
&lt;/h2&gt;

&lt;p&gt;Here's what this means for the two competing protocols:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Before the pivot (January - February 2026):&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;UCP: Discovery + browsing + cart + checkout (full commerce)&lt;/li&gt;
&lt;li&gt;ACP: Discovery + Instant Checkout inside ChatGPT (full commerce)&lt;/li&gt;
&lt;li&gt;They competed for the same stack&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;After the pivot (March 2026 onward):&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;UCP: Discovery + browsing + cart + checkout (full commerce) &lt;/li&gt;
&lt;li&gt;ACP: Discovery + handoff to merchant storefront (discovery only)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The protocols aren't competing anymore. They're converging into different layers of the same stack. UCP owns commerce. ACP owns discovery within ChatGPT's walled garden.&lt;/p&gt;

&lt;p&gt;As Ken Huang put it on his Substack: "Google's UCP Just Won Agentic Commerce."&lt;/p&gt;

&lt;h2&gt;
  
  
  What this means for developers building today
&lt;/h2&gt;

&lt;p&gt;If you're an e-commerce developer deciding where to invest protocol implementation time, the math is now straightforward:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Implement UCP now.&lt;/strong&gt; It's the only protocol that gives AI agents the full commerce capability: product catalog browsing, cart management, identity linking, and payment processing. It's co-created by Google and Shopify with 25+ partners. It's what Google AI Mode, Gemini, and an expanding ecosystem of agents use to discover and transact with stores.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;ACP is becoming a discovery layer.&lt;/strong&gt; If you want your products surfaced inside ChatGPT conversations, ACP integration matters - but as a discovery mechanism that hands off to your storefront, not as a transaction protocol.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The real implementation gap isn't protocol choice.&lt;/strong&gt; It's quality. Most deployed UCP profiles fail at basic validation levels:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Missing &lt;code&gt;signing_keys&lt;/code&gt; means agents can't verify your manifest&lt;/li&gt;
&lt;li&gt;Namespace/origin mismatches break discovery before it starts&lt;/li&gt;
&lt;li&gt;Incomplete Cart capability definitions create failed add-to-cart experiences&lt;/li&gt;
&lt;li&gt;Identity Linking (the stable spec) is the least-implemented capability despite being the most valuable for cross-domain user recognition&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;At UCPtools, we scan thousands of profiles. The average score sits well below what AI agents consider reliable. Being "detected" is not the same as being "buyable."&lt;/p&gt;

&lt;h2&gt;
  
  
  What to build
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Implement UCP on your primary store domain first.&lt;/strong&gt; The &lt;code&gt;.well-known/ucp&lt;/code&gt; manifest is table stakes. Make sure it validates at all four levels: structural JSON validity, business rules consistency, network reachability, and SDK-level agent simulation.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Don't skip Identity Linking.&lt;/strong&gt; It's the stable spec that enables cross-domain user recognition. When a user browses your store on one device and returns via an AI agent on another, Identity Linking is what connects those sessions.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Add ACP as a discovery channel, not a transaction channel.&lt;/strong&gt; The merchant app model means your ChatGPT presence should focus on product discovery and comparison, with a clean handoff to your UCP-enabled storefront where the actual purchase happens.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Monitor continuously.&lt;/strong&gt; Protocols evolve. Specs change. Your profile that validated perfectly in April might fail in June when a capability gets promoted from draft to stable. Continuous validation catches regressions before they cost you AI agent traffic.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  The bottom line
&lt;/h2&gt;

&lt;p&gt;The protocol war is over before it really started. ACP pivoted to discovery. UCP owns the commerce stack by default.&lt;/p&gt;

&lt;p&gt;The question for e-commerce developers isn't which protocol to bet on - it's whether your UCP implementation is good enough for AI agents to actually complete a purchase.&lt;/p&gt;

&lt;p&gt;Most aren't.&lt;/p&gt;

&lt;p&gt;Validate your UCP profile at &lt;a href="https://ucptools.dev?utm_source=devto&amp;amp;utm_medium=article&amp;amp;utm_campaign=202605" rel="noopener noreferrer"&gt;https://ucptools.dev?utm_source=devto&amp;amp;utm_medium=article&amp;amp;utm_campaign=202605&lt;/a&gt; - the free tier runs all four validation levels and simulates a real AI agent interaction against your store. If an AI agent can't buy from you, your customers can't either.&lt;/p&gt;

</description>
      <category>agenticcommerce</category>
      <category>ucp</category>
      <category>acp</category>
      <category>ecommerce</category>
    </item>
    <item>
      <title>What Your UCP Trial Unlocks: From Grade C to Grade A in 15 Minutes</title>
      <dc:creator>Peter</dc:creator>
      <pubDate>Fri, 01 May 2026 10:26:52 +0000</pubDate>
      <link>https://forem.com/ucptools/what-your-ucp-trial-unlocks-from-grade-c-to-grade-a-in-15-minutes-38i3</link>
      <guid>https://forem.com/ucptools/what-your-ucp-trial-unlocks-from-grade-c-to-grade-a-in-15-minutes-38i3</guid>
      <description>&lt;h1&gt;
  
  
  What Your UCP Trial Unlocks: From Grade C to Grade A in 15 Minutes
&lt;/h1&gt;

&lt;p&gt;Most stores with a UCP profile are stuck at Grade C. Their manifest loads. Agents can see them. But they cannot buy a single thing. Here is what changes when you fix the three fields every Grade C store is missing - and how a 7-day trial makes it a 15-minute job.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Grade C trap: visible, but not transactable
&lt;/h2&gt;

&lt;p&gt;A Grade C UCP profile means structural validity. Your &lt;code&gt;/.well-known/ucp&lt;/code&gt; returns valid JSON. An AI shopping agent can discover your store. That feels like progress.&lt;/p&gt;

&lt;p&gt;But Grade C also means the agent hits a wall the moment it tries to do anything commercial. No payment handlers configured. No signing keys for verification. No return policy for the agent to communicate to the buyer. The agent walks away, and your store never knows it happened.&lt;/p&gt;

&lt;p&gt;We see this pattern constantly. In the last 7 days, 59 UCP profiles were validated on UCPtools. Eleven of those stores ran the AI Agent Simulator - a real end-to-end agent interaction test. None of them completed a purchase. Zero.&lt;/p&gt;

&lt;p&gt;Grade C means "detected." That is not the same as "can transact."&lt;/p&gt;




&lt;h2&gt;
  
  
  The three fields keeping you at Grade C
&lt;/h2&gt;

&lt;p&gt;After scanning dozens of e-commerce domains, three failures appear on nearly every Grade C profile:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;1. &lt;code&gt;signing_keys&lt;/code&gt; - the trust layer agents require&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Without a public key in your manifest, AI agents cannot cryptographically verify that your UCP responses are authentic. This is not optional. Agents check this before they take any commercial action. A missing &lt;code&gt;signing_keys&lt;/code&gt; field is an instant trust failure.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;2. &lt;code&gt;payment_handlers&lt;/code&gt; - the "how do I pay?" gap&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Agents need to know which payment methods your store accepts before they can initiate a checkout. No &lt;code&gt;payment_handlers&lt;/code&gt; array means the agent has no path to complete a purchase. The store is technically "discoverable" but functionally invisible for any transaction.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;3. Return policy schema - the confidence gap&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;AI agents are designed to communicate return terms to buyers before purchase. If your manifest does not include return policy information, the agent cannot answer basic buyer questions like "what happens if I need to return this?" That missing confidence costs conversions - both for the agent and for you.&lt;/p&gt;

&lt;p&gt;These are not exotic edge cases. They are the baseline requirements that separate "the agent found your store" from "the agent bought from your store."&lt;/p&gt;




&lt;h2&gt;
  
  
  What the free tools tell you vs. what the trial shows you
&lt;/h2&gt;

&lt;p&gt;Free UCP checkers give you a binary answer: detected or not detected. They run structural validation. They might catch a missing JSON field. But they stop there.&lt;/p&gt;

&lt;p&gt;A UCPtools Starter trial ($9/mo, 7 days free, no credit card) gives you four layers the free tools skip:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Level 1 - Structural validation:&lt;/strong&gt; Yes, free tools do this. Valid JSON, required fields present. This is where every Grade C store already passes.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Level 2 - Rules validation:&lt;/strong&gt; Business logic checks. Do your namespace and origin match? Are your capability declarations internally consistent? This is where most Grade C stores start failing - but free checkers do not run these tests.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Level 3 - Network validation:&lt;/strong&gt; Live endpoint testing. Are your UCP endpoints actually reachable over HTTPS? Do they return the correct response codes? A manifest can be structurally valid and still serve 404s to agents.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Level 4 - SDK validation (AI Agent Simulator):&lt;/strong&gt; This is the one that matters. The simulator behaves like a real AI shopping agent - it discovers your store, reads your manifest, and attempts to complete a purchase. It shows you exactly where the agent fails and why. Eleven stores ran this in the last 7 days. All eleven hit failures that structural validation alone would never catch.&lt;/p&gt;




&lt;h2&gt;
  
  
  From Grade C to Grade A: the 15-minute path
&lt;/h2&gt;

&lt;p&gt;Here is what the upgrade looks like in practice:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Step 1: Run the full scan (2 minutes)&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Start your trial and point UCPtools at your domain. The 4-level scan completes in under 90 seconds. You get a report that looks nothing like a "detected/not detected" badge - it is a prioritized list of failures ranked by severity, with exact fix recommendations.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Step 2: Generate your signing keys (3 minutes)&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;UCPtools generates a key pair for you through the hosted profile generator. Copy the public key into your manifest. The tool validates the placement so you know it is right before you deploy.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Step 3: Configure payment handlers (5 minutes)&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Map your existing payment stack (Stripe, Shopify Payments, PayPal) to the UCP payment handler format. The trial shows you the exact JSON structure your manifest needs based on what your store already supports.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Step 4: Add return policy schema (3 minutes)&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Structured return policy data that agents can parse and communicate. The trial's hosted profile builder includes a template you fill in once and deploy.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Step 5: Re-scan and simulate (2 minutes)&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Run validation again. Run the AI Agent Simulator. Watch the agent discover your store, verify your keys, read your payment handlers, and complete a purchase simulation. Grade A means the agent can do everything a human shopper can do - find you, browse, and buy.&lt;/p&gt;




&lt;h2&gt;
  
  
  Why the trial matters (and why it is free)
&lt;/h2&gt;

&lt;p&gt;Nobody pays $9 to see a validation report. They pay $9 because the report tells them something the free tools never will: whether AI agents can actually buy from their store, and exactly how to fix it if they cannot.&lt;/p&gt;

&lt;p&gt;The 7-day trial exists because this is not something you evaluate from a marketing page. You need to see your own domain's results. You need to run the simulator against your own store. The trial gives you full access to do exactly that, with no credit card required.&lt;/p&gt;

&lt;p&gt;If your store passes structural validation but you have never run the simulator, you do not know if your UCP profile works. You just know it loads.&lt;/p&gt;




&lt;h2&gt;
  
  
  Scan your store free
&lt;/h2&gt;

&lt;blockquote&gt;
&lt;p&gt;Start your 7-day free trial at &lt;a href="https://ucptools.dev/?utm_source=devto&amp;amp;utm_medium=article&amp;amp;utm_campaign=202605" rel="noopener noreferrer"&gt;ucptools.dev&lt;/a&gt; - no credit card required. Run a full 4-level validation against your domain and see exactly where your store stands with AI shopping agents.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;p&gt;&lt;em&gt;Written by the team at UCPtools - the only toolkit that validates, monitors, and optimizes your UCP business profile for AI agent discoverability. Questions? Find us on &lt;a href="https://twitter.com/ucptoolsdev" rel="noopener noreferrer"&gt;X @ucptoolsdev&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>ucp</category>
      <category>ecommerce</category>
      <category>webdev</category>
      <category>ai</category>
    </item>
    <item>
      <title>UCP Validation for Agencies: How to Audit AI Readiness Across Every Client Domain</title>
      <dc:creator>Peter</dc:creator>
      <pubDate>Wed, 29 Apr 2026 11:02:37 +0000</pubDate>
      <link>https://forem.com/ucptools/ucp-validation-for-agencies-how-to-audit-ai-readiness-across-every-client-domain-1da0</link>
      <guid>https://forem.com/ucptools/ucp-validation-for-agencies-how-to-audit-ai-readiness-across-every-client-domain-1da0</guid>
      <description>&lt;p&gt;If you're a GEO consultant or agency managing ecommerce clients, you've probably been asked some version of this question:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"Can AI agents find my store? How do I know?"&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;The honest answer, until recently, was: you don't. There was no standardized way to measure AI agent discoverability. That changed with UCP (Universal Commerce Protocol) - the open standard from Google and Shopify that gives AI shopping agents a machine-readable entry point to any store.&lt;/p&gt;

&lt;p&gt;Now there &lt;em&gt;is&lt;/em&gt; something measurable. And if you're the one measuring it for your clients, that's a service worth charging for.&lt;/p&gt;




&lt;h2&gt;
  
  
  Why Agencies Should Care About UCP Audits
&lt;/h2&gt;

&lt;p&gt;Google AI Mode, Microsoft Copilot, ChatGPT, and Perplexity are all building agentic commerce capabilities. &lt;a href="https://blogs.bing.com/webmaster/2026/04/21/ucp-feeds-general-availability" rel="noopener noreferrer"&gt;Microsoft announced GA of UCP feeds in Merchant Center&lt;/a&gt; on April 21, 2026. Over 12,000 merchants have published UCP profiles as of Q1 2026.&lt;/p&gt;

&lt;p&gt;Your clients are going to ask about this. Some already have. The agencies that can answer with data - not hand-waving - will win those conversations.&lt;/p&gt;

&lt;p&gt;Here's what makes UCP audits a natural fit for agencies:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;It's per-domain.&lt;/strong&gt; Each client's hosting stack, CDN, and certificate chain breaks differently. A profile that works on Shopify fails on WooCommerce for entirely different reasons.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;It's recurring.&lt;/strong&gt; UCP validation isn't a one-time setup. Deploys break endpoints. CDN caches serve stale schemas. Certificate renewals don't propagate. The profile that passed last month can silently fail this month.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;It's reportable.&lt;/strong&gt; UCP validation produces a numerical AI readiness score (0-100) with specific, fixable issues. That's the kind of deliverable clients understand.&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  The Agency Audit Framework
&lt;/h2&gt;

&lt;p&gt;Here's a repeatable process for running UCP audits across a client portfolio. It works whether you manage 3 domains or 300.&lt;/p&gt;

&lt;h3&gt;
  
  
  1. Baseline Scan: Does the Profile Exist?
&lt;/h3&gt;

&lt;p&gt;Before anything else, check whether each client domain serves a UCP manifest at &lt;code&gt;/.well-known/ucp&lt;/code&gt;.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;https://client-store.com/.well-known/ucp
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Three outcomes:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;404 / No manifest&lt;/strong&gt; - The store is invisible to AI agents. Full stop. This is your biggest finding and your clearest upsell.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Manifest exists but invalid JSON&lt;/strong&gt; - Broken deployment or misconfigured server. Quick fix, high impact.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Valid manifest&lt;/strong&gt; - Move to deeper validation.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;In our experience, roughly 70% of ecommerce stores don't serve a UCP manifest at all. For the ones that do, about 60% have issues at deeper validation levels.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. Four-Level Validation
&lt;/h3&gt;

&lt;p&gt;UCP validation isn't binary (pass/fail). There are four distinct levels, and each catches different categories of issues:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Level&lt;/th&gt;
&lt;th&gt;What It Checks&lt;/th&gt;
&lt;th&gt;Common Failures&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;1. Structural&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;JSON syntax, required fields, version format&lt;/td&gt;
&lt;td&gt;Missing &lt;code&gt;ucp&lt;/code&gt; root, wrong version format&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;2. Compliance&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Protocol rules: namespaces, HTTPS, signing keys&lt;/td&gt;
&lt;td&gt;Namespace mismatches, missing signing keys (42% of L2 failures), HTTP endpoints&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;3. Network&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Do declared URLs actually resolve?&lt;/td&gt;
&lt;td&gt;CDN 404s, stale schemas, malformed JWK keys&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;4. Agent Simulation&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Full checkout lifecycle test&lt;/td&gt;
&lt;td&gt;Backend returns 500 on cart creation, state machine failures&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Most validators - including the free ones your clients might have tried - only check Level 1. That gives false confidence. A Level 1 pass with Level 3 failures means the profile looks correct but agents can't actually use it.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;For agencies, Level 3 is the most valuable finding.&lt;/strong&gt; These are infrastructure-drift issues that only surface after deploys, CDN changes, or certificate renewals. They're invisible to the developer who wrote the profile but obvious to an auditor running regular checks.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. Score and Categorize
&lt;/h3&gt;

&lt;p&gt;After running validation, each domain gets an AI readiness score (0-100) and a letter grade:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Grade&lt;/th&gt;
&lt;th&gt;Score&lt;/th&gt;
&lt;th&gt;What It Means&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;A&lt;/td&gt;
&lt;td&gt;90-100&lt;/td&gt;
&lt;td&gt;AI agents can discover, browse, and transact&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;B&lt;/td&gt;
&lt;td&gt;70-89&lt;/td&gt;
&lt;td&gt;Discoverable with minor issues&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;C&lt;/td&gt;
&lt;td&gt;50-69&lt;/td&gt;
&lt;td&gt;Detected but can't complete transactions&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;D&lt;/td&gt;
&lt;td&gt;20-49&lt;/td&gt;
&lt;td&gt;Major issues blocking agent interaction&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;F&lt;/td&gt;
&lt;td&gt;0-19&lt;/td&gt;
&lt;td&gt;Effectively invisible&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The Grade C trap is the most common: the profile exists and passes basic checks, but missing signing keys or broken endpoints prevent any actual transaction. Your client thinks they're "UCP ready" because they have a manifest file. They're not.&lt;/p&gt;

&lt;h3&gt;
  
  
  4. Build the Client Report
&lt;/h3&gt;

&lt;p&gt;A useful client report contains:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Score and grade&lt;/strong&gt; for each domain&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Issue breakdown&lt;/strong&gt; by validation level (structural, compliance, network, simulation)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Specific fixes&lt;/strong&gt; with estimated effort (most Level 2 fixes take minutes)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Comparison to previous audit&lt;/strong&gt; if this is a recurring engagement&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Competitive context&lt;/strong&gt; - how do they compare to others in their vertical?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The key metric clients care about: &lt;strong&gt;"Can AI agents buy from my store?"&lt;/strong&gt; Frame everything around that question. A score of 62 means "AI agents can find you but can't complete a purchase." That's concrete enough to drive action.&lt;/p&gt;




&lt;h2&gt;
  
  
  What to Check Per Platform
&lt;/h2&gt;

&lt;p&gt;UCP issues cluster differently by ecommerce platform. Knowing the common patterns saves audit time:&lt;/p&gt;

&lt;h3&gt;
  
  
  Shopify
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;UCP profile served via app proxy (path configuration matters)&lt;/li&gt;
&lt;li&gt;Payment handler configuration usually correct (Shopify handles this)&lt;/li&gt;
&lt;li&gt;Watch for: signing key rotation gaps, custom app conflicts&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  WooCommerce
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Profile typically served via WordPress plugin or &lt;code&gt;.htaccess&lt;/code&gt; rewrite&lt;/li&gt;
&lt;li&gt;Watch for: HTTP endpoints (mixed content from plugin misconfiguration), schema URL 404s after plugin updates&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  BigCommerce
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Common issue: &lt;code&gt;dev.ucp.shopping&lt;/code&gt; service missing required &lt;code&gt;spec&lt;/code&gt; field (&lt;code&gt;UCP_INVALID_SERVICE&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;Watch for: trailing slashes on API endpoints&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Magento / Adobe Commerce
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Custom module required for &lt;code&gt;/.well-known/ucp&lt;/code&gt; routing&lt;/li&gt;
&lt;li&gt;Watch for: namespace mismatches when using third-party extensions, GraphQL endpoint schema drift&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Custom / Headless
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Most flexibility, most failure modes&lt;/li&gt;
&lt;li&gt;Watch for: CORS blocking agent preflight requests, endpoint URLs changing between environments&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Automating Portfolio Audits
&lt;/h2&gt;

&lt;p&gt;Running manual checks across 10+ domains doesn't scale. Two automation approaches:&lt;/p&gt;

&lt;h3&gt;
  
  
  CI/CD Integration (Per Client)
&lt;/h3&gt;

&lt;p&gt;If you have access to client repos, the &lt;a href="https://github.com/marketplace/actions/ucp-profile-validator" rel="noopener noreferrer"&gt;ucp-validate GitHub Action&lt;/a&gt; fails the build when the AI readiness score drops below a threshold:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;uses&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Nolpak14/ucp-validate-action@v1&lt;/span&gt;
  &lt;span class="na"&gt;with&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;domain&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;client-store.com'&lt;/span&gt;
    &lt;span class="na"&gt;min-score&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="m"&gt;70&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This catches regressions at deploy time - before they affect agent traffic.&lt;/p&gt;

&lt;h3&gt;
  
  
  Scheduled Monitoring (Portfolio-Wide)
&lt;/h3&gt;

&lt;p&gt;For ongoing monitoring without repo access, run validation against each client domain on a schedule. The &lt;a href="https://ucptools.dev?utm_source=devto&amp;amp;utm_medium=article&amp;amp;utm_campaign=agency-audit" rel="noopener noreferrer"&gt;UCPtools validator&lt;/a&gt; supports domain-level validation via URL - no code access needed.&lt;/p&gt;

&lt;p&gt;Track scores over time. A domain that drops from 85 to 62 between audits means something broke in production, and you're the one catching it before the client's AI-driven traffic disappears.&lt;/p&gt;




&lt;h2&gt;
  
  
  Positioning This as a Service
&lt;/h2&gt;

&lt;p&gt;UCP auditing fits naturally into existing GEO/SEO service packages:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;One-time audit&lt;/strong&gt; - Baseline scan across all client domains with a findings report. Natural entry point.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Monthly monitoring&lt;/strong&gt; - Recurring validation with score tracking and regression alerts. Retainer model.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Implementation support&lt;/strong&gt; - Fix the issues the audit found. Scope varies by platform (Shopify is usually hours, custom builds are days).&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The pitch to clients: "Your SEO drives traffic to your store. UCP drives AI agent traffic. We monitor both."&lt;/p&gt;

&lt;p&gt;What makes this defensible: UCP validation requires understanding the spec, the four validation levels, and platform-specific patterns. A generic SEO tool can't do this. You can.&lt;/p&gt;




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

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Run a free validation&lt;/strong&gt; against one of your client domains at &lt;a href="https://ucptools.dev?utm_source=devto&amp;amp;utm_medium=article&amp;amp;utm_campaign=agency-audit" rel="noopener noreferrer"&gt;ucptools.dev&lt;/a&gt;. See the score, the issues, and which level caught them.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Repeat for your portfolio.&lt;/strong&gt; Note which clients have no manifest at all vs. which have broken ones.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Build the report.&lt;/strong&gt; Score, grade, issues, fixes. Send it to the client.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Set up monitoring.&lt;/strong&gt; Catch regressions before they cost AI traffic.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The agencies that can quantify AI discoverability will own this conversation. The ones that can't will be explaining why they didn't notice their client's store disappeared from ChatGPT.&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>webdev</category>
      <category>ai</category>
    </item>
    <item>
      <title>I Built Skills That Let AI Agents Query 14 European Government Registries</title>
      <dc:creator>Peter</dc:creator>
      <pubDate>Tue, 28 Apr 2026 17:50:50 +0000</pubDate>
      <link>https://forem.com/ucptools/i-built-skills-that-let-ai-agents-query-14-european-government-registries-155</link>
      <guid>https://forem.com/ucptools/i-built-skills-that-let-ai-agents-query-14-european-government-registries-155</guid>
      <description>&lt;h2&gt;
  
  
  TL;DR
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;I built &lt;strong&gt;14 Apify actors&lt;/strong&gt; that scrape official government registries across Poland, Spain, Austria, and France&lt;/li&gt;
&lt;li&gt;To make them accessible from AI coding agents, I packaged them as &lt;strong&gt;6 open-source skills&lt;/strong&gt; in the &lt;a href="https://github.com/Nolpak14/getregdata" rel="noopener noreferrer"&gt;getregdata&lt;/a&gt; repo&lt;/li&gt;
&lt;li&gt;One install command gives you access across &lt;strong&gt;45+ AI agents&lt;/strong&gt; - Claude Code, GitHub Copilot, Cline, Codex, Amp, and more&lt;/li&gt;
&lt;li&gt;The skills provide registry-specific analysis frameworks and let you query live data through the Apify API&lt;/li&gt;
&lt;li&gt;Install: &lt;code&gt;skills add Nolpak14/getregdata -g -y&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Why Government Registry Data Is Hard
&lt;/h2&gt;

&lt;p&gt;If you have ever tried to programmatically access European government registries, you know the pain. Each country has its own set of portals, each with its own quirks:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Poland's KRS&lt;/strong&gt; (National Court Register) deliberately anonymizes board member names in its API - returning &lt;code&gt;L******&lt;/code&gt; instead of full names - while the same data is available unredacted in PDF extracts from the same portal&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Poland's CRBR&lt;/strong&gt; (Beneficial Owners Register) has no API at all - just a CAPTCHA-protected web form that accepts one company at a time&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Poland's EKW&lt;/strong&gt; (Land Registry) blocks all datacenter IPs - you need residential Polish proxies to access property ownership data&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Spain's BORME&lt;/strong&gt; (Corporate Gazette) publishes 500+ corporate acts daily as unstructured gazette text with no machine-readable format&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Austria's Ediktsdatei&lt;/strong&gt; (Insolvency Publications) requires an IWG license for the official API - but the public web portal has no such restriction&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;France's Societe.com&lt;/strong&gt; aggregates data from INSEE, INPI, and BODACC behind aggressive anti-bot measures&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Each registry is a separate engineering challenge. Different authentication, different anti-scraping measures, different data formats, different legal frameworks.&lt;/p&gt;

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

&lt;p&gt;Over the past months I built Apify actors for all of these. Each actor handles the specific technical challenges of its registry and returns clean, structured JSON.&lt;/p&gt;

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

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Registry&lt;/th&gt;
&lt;th&gt;What You Get&lt;/th&gt;
&lt;th&gt;Records&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;strong&gt;KNF&lt;/strong&gt; - Financial Supervision Authority&lt;/td&gt;
&lt;td&gt;Payment institutions, e-money issuers, lending companies&lt;/td&gt;
&lt;td&gt;75,000+&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;strong&gt;MSiG&lt;/strong&gt; - Court Gazette (Monitor Sadowy)&lt;/td&gt;
&lt;td&gt;Bankruptcy declarations, restructuring, liquidation notices&lt;/td&gt;
&lt;td&gt;2001-present&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;strong&gt;KRS&lt;/strong&gt; - National Court Register&lt;/td&gt;
&lt;td&gt;Full non-anonymized board member names from PDF extracts&lt;/td&gt;
&lt;td&gt;800,000+ companies&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;strong&gt;KRZ&lt;/strong&gt; - National Debtor Registry&lt;/td&gt;
&lt;td&gt;Bankruptcy, restructuring, enforcement proceedings&lt;/td&gt;
&lt;td&gt;9 search modes&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;strong&gt;eKRS&lt;/strong&gt; - Financial Statements&lt;/td&gt;
&lt;td&gt;Balance sheets, P&amp;amp;L, assets, equity, revenue, net profit&lt;/td&gt;
&lt;td&gt;Official filings&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;strong&gt;EKW&lt;/strong&gt; - Land Registry&lt;/td&gt;
&lt;td&gt;Property ownership, mortgages, easements, restrictions&lt;/td&gt;
&lt;td&gt;25 million entries&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;strong&gt;UOKiK&lt;/strong&gt; - Consumer Protection&lt;/td&gt;
&lt;td&gt;Court-ruled prohibited contract clauses&lt;/td&gt;
&lt;td&gt;7,500+ clauses&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;strong&gt;CRBR&lt;/strong&gt; - Beneficial Owners&lt;/td&gt;
&lt;td&gt;Ultimate beneficial owners (UBO) for AML compliance&lt;/td&gt;
&lt;td&gt;All KRS entities&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;strong&gt;BDO&lt;/strong&gt; - Waste Registry&lt;/td&gt;
&lt;td&gt;Waste management entity registrations and permits&lt;/td&gt;
&lt;td&gt;674,000+ entities&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

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

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Registry&lt;/th&gt;
&lt;th&gt;What You Get&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;strong&gt;BORME&lt;/strong&gt; - Corporate Gazette&lt;/td&gt;
&lt;td&gt;Daily incorporations, officer appointments, capital changes, dissolutions&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;strong&gt;Registro Mercantil&lt;/strong&gt; - Company Directory&lt;/td&gt;
&lt;td&gt;NIF, officers, CNAE codes, legal form, IRUS, EUID&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

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

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Registry&lt;/th&gt;
&lt;th&gt;What You Get&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;strong&gt;Ediktsdatei&lt;/strong&gt; - Insolvency Publications&lt;/td&gt;
&lt;td&gt;Bankruptcy, restructuring, debt regulation proceedings - no IWG license needed&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;strong&gt;WKO&lt;/strong&gt; - Chamber of Commerce Directory&lt;/td&gt;
&lt;td&gt;620,000+ businesses with phone, email, website, trade licenses&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

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

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Registry&lt;/th&gt;
&lt;th&gt;What You Get&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;strong&gt;Societe.com&lt;/strong&gt; - Company Data&lt;/td&gt;
&lt;td&gt;SIREN, directors with roles, financials, shareholders, subsidiaries, brands&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;All actors are pay-per-result with no subscriptions. Pricing ranges from $0.003 to $0.01 per result depending on the registry. A &lt;a href="https://console.apify.com/sign-up?ref=getregdata" rel="noopener noreferrer"&gt;free Apify account&lt;/a&gt; includes $5 credits - enough for 100-1,600 lookups.&lt;/p&gt;

&lt;h2&gt;
  
  
  From Actors to AI Agent Skills
&lt;/h2&gt;

&lt;p&gt;The actors work great when you know exactly which registry to query. But for many users, the real question is: "I need to check this Polish company - where do I even start?"&lt;/p&gt;

&lt;p&gt;That is where skills come in. Skills are modular packages that give AI coding agents specialized knowledge. When you install a skill, your agent learns how to handle domain-specific tasks - in this case, querying European government registries.&lt;/p&gt;

&lt;p&gt;I packaged the 14 actors into &lt;strong&gt;6 skills&lt;/strong&gt; organized by workflow:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Skill&lt;/th&gt;
&lt;th&gt;What It Does&lt;/th&gt;
&lt;th&gt;Registries Used&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;regdata&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Router - identifies which registry you need&lt;/td&gt;
&lt;td&gt;All 14&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;regdata-kyc-aml&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Beneficial ownership, financial licenses, board members&lt;/td&gt;
&lt;td&gt;CRBR, KNF, KRS, Societe.com, WKO, Spain Dir&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;regdata-credit-risk&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Insolvency proceedings, court gazette, financial statements&lt;/td&gt;
&lt;td&gt;KRZ, MSiG, eKRS, Ediktsdatei, BORME&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;regdata-property&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Polish land registry - ownership, mortgages, encumbrances&lt;/td&gt;
&lt;td&gt;EKW, KRS, CRBR&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;regdata-compliance&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Prohibited contract clauses, waste management registrations&lt;/td&gt;
&lt;td&gt;UOKiK, BDO&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;regdata-lead-gen&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Company directors, business contacts, new incorporations&lt;/td&gt;
&lt;td&gt;KRS, WKO, Spain Dir, Societe.com, BORME&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Each skill includes:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Analysis frameworks&lt;/strong&gt; specific to the registries it covers (e.g., how to interpret Polish land registry sections, what Austrian insolvency proceeding types mean)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Data extraction instructions&lt;/strong&gt; for both MCP mode (direct tool calls) and API mode (curl/SDK)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Output interpretation guides&lt;/strong&gt; so you know what the returned data actually means&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Installation
&lt;/h2&gt;

&lt;p&gt;One command installs all 6 skills globally across every supported agent:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;skills add Nolpak14/getregdata &lt;span class="nt"&gt;-g&lt;/span&gt; &lt;span class="nt"&gt;-y&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This works with 45+ AI agents including Claude Code, GitHub Copilot, Cline, Codex, Amp, Antigravity, and more. The skills are installed to &lt;code&gt;~/.agents/skills/&lt;/code&gt; and symlinked to agent-specific locations.&lt;/p&gt;

&lt;h2&gt;
  
  
  How It Works in Practice
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Example 1: Check beneficial owners of a Polish company
&lt;/h3&gt;

&lt;p&gt;You open Claude Code (or any supported agent) and type:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Check who owns the Polish company with NIP 5213103635 in CRBR
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The &lt;code&gt;regdata-kyc-aml&lt;/code&gt; skill activates. It knows that CRBR is Poland's beneficial owners registry and that NIP is the correct identifier. It guides the extraction:&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_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/crbr-beneficial-owners-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;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;5213103635&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;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="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;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="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;owner&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="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="s"&gt;  UBO: &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;owner&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;firstName&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;owner&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;lastName&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;  Ownership: &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;owner&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;sharePercentage&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;N/A&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;If you have the Apify MCP server configured, the agent can run the actor directly through tool calls without writing any code.&lt;/p&gt;

&lt;h3&gt;
  
  
  Example 2: Monitor Spanish corporate gazette for new incorporations
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Search BORME for new company incorporations in Barcelona from last week
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The &lt;code&gt;regdata-credit-risk&lt;/code&gt; skill activates (BORME corporate acts). It builds the right query:&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="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;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;2026-04-21&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;2026-04-28&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;provinces&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;Barcelona&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;h3&gt;
  
  
  Example 3: Extract Polish land registry data
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Pull EKW data for property WR1K/00094598/3
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The &lt;code&gt;regdata-property&lt;/code&gt; skill activates. It knows the KW number format, that EKW requires residential Polish proxies, and how to interpret the four sections (Dzial I-IV):&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="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/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;kwNumbers&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;WR1K/00094598/3&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;viewType&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;aktualna&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;sections&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;all&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;p&gt;The skill then explains what each section means - Dzial II for ownership, Dzial III for restrictions and easements, Dzial IV for mortgages - so you can actually interpret the raw data.&lt;/p&gt;

&lt;h3&gt;
  
  
  Example 4: Get non-anonymized KRS board members
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Extract board members for Polish KRS number 0000019193
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The &lt;code&gt;regdata-lead-gen&lt;/code&gt; skill knows that the official KRS API anonymizes names, and that the actor works around this by extracting full names from PDF court extracts:&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="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/krs-fullnames-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;krsNumbers&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;0000019193&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;extractType&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;aktualny&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;p&gt;You get full first and last names of board members, supervisory board, and shareholders - not the &lt;code&gt;L******&lt;/code&gt; that the API returns.&lt;/p&gt;

&lt;h2&gt;
  
  
  What Makes This Different from a Generic Scraping Skill
&lt;/h2&gt;

&lt;p&gt;The value of domain-specific skills is that they carry &lt;strong&gt;registry knowledge&lt;/strong&gt; that a generic web scraping tool does not have:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;The skill knows that EKW requires residential Polish proxies (datacenter IPs are blocked)&lt;/li&gt;
&lt;li&gt;It knows that KRS anonymizes names in the API but not in PDFs&lt;/li&gt;
&lt;li&gt;It knows that BORME Section A publishes corporate acts while Section B publishes financial data&lt;/li&gt;
&lt;li&gt;It knows that Austria's Ediktsdatei has Konkursverfahren (bankruptcy) and Sanierungsverfahren (restructuring) and what the difference means&lt;/li&gt;
&lt;li&gt;It knows that a Polish KW number follows the format CODE/NUMBER/DIGIT (e.g., WR1K/00094598/3)&lt;/li&gt;
&lt;li&gt;It knows that CRBR defines beneficial ownership as &amp;gt;25% shares or voting rights&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This registry-specific knowledge means your AI agent can handle queries correctly without you needing to read documentation for each portal.&lt;/p&gt;

&lt;h2&gt;
  
  
  Authentication Setup
&lt;/h2&gt;

&lt;p&gt;The skills provide analysis frameworks for free, but extracting live data requires an Apify API token:&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="nb"&gt;export &lt;/span&gt;&lt;span class="nv"&gt;APIFY_TOKEN&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;apify_api_xxxxx
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Get your token by creating a &lt;a href="https://console.apify.com/sign-up?ref=getregdata" rel="noopener noreferrer"&gt;free Apify account&lt;/a&gt; - includes $5 credits, enough for hundreds of registry lookups.&lt;/p&gt;

&lt;h2&gt;
  
  
  Pricing Quick Reference
&lt;/h2&gt;

&lt;p&gt;All actors use pay-per-result pricing. No subscriptions, no minimum commitments.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Registry&lt;/th&gt;
&lt;th&gt;Cost per Result&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;KNF, UOKiK, WKO, BORME&lt;/td&gt;
&lt;td&gt;$0.003&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;MSiG, BDO&lt;/td&gt;
&lt;td&gt;$0.004&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Ediktsdatei, Spain Dir, Societe.com&lt;/td&gt;
&lt;td&gt;$0.005&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;KRZ&lt;/td&gt;
&lt;td&gt;$0.006&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;KRS Board, eKRS, CRBR&lt;/td&gt;
&lt;td&gt;$0.008&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;EKW&lt;/td&gt;
&lt;td&gt;$0.01&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Typical cost for a full company check (CRBR + KNF + KRS Board): ~$0.019.&lt;/p&gt;

&lt;h2&gt;
  
  
  Technical Details
&lt;/h2&gt;

&lt;p&gt;The skills repo follows the standard skills ecosystem structure:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight markdown"&gt;&lt;code&gt;getregdata/
  skills/
    regdata/SKILL.md              # Router
    regdata-kyc-aml/SKILL.md      # + references/
    regdata-credit-risk/SKILL.md  # + references/
    regdata-property/SKILL.md     # + references/
    regdata-compliance/SKILL.md   # + references/
    regdata-lead-gen/SKILL.md     # + references/
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Each SKILL.md uses YAML frontmatter for trigger matching:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="nn"&gt;---&lt;/span&gt;
&lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;regdata-kyc-aml&lt;/span&gt;
&lt;span class="na"&gt;description&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Extract&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;beneficial&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;ownership&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;data&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;from&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;Poland's&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;CRBR&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;registry,&lt;/span&gt;
  &lt;span class="s"&gt;financial&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;license&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;status&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;from&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;KNF,&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;non-anonymized&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;board&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;members&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;from&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;KRS..."&lt;/span&gt;
&lt;span class="na"&gt;metadata&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;version&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;1.0.0&lt;/span&gt;
  &lt;span class="na"&gt;author&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;regdata&lt;/span&gt;
  &lt;span class="na"&gt;triggers&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;CRBR&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;beneficial&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;owner&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;lookup"&lt;/span&gt;
    &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;check&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;KNF&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;registry"&lt;/span&gt;
    &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;KRS&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;board&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;members&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;extract"&lt;/span&gt;
    &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Polish&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;beneficial&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;owners"&lt;/span&gt;
&lt;span class="nn"&gt;---&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Triggers are registry-specific, not generic domain terms. The skill activates when you mention a specific European registry, not when you ask about "KYC" or "compliance" in general.&lt;/p&gt;

&lt;p&gt;The &lt;code&gt;references/&lt;/code&gt; subdirectories contain detailed interpretation guides (land registry section breakdowns, insolvency proceeding types across jurisdictions, UOKiK clause categories) that the agent loads on demand.&lt;/p&gt;

&lt;h2&gt;
  
  
  Source Code and Contributing
&lt;/h2&gt;

&lt;p&gt;The skills are MIT licensed and open source:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;GitHub:&lt;/strong&gt; &lt;a href="https://github.com/Nolpak14/getregdata" rel="noopener noreferrer"&gt;github.com/Nolpak14/getregdata&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The underlying Apify actors are available on the Apify Store under the &lt;a href="https://apify.com/regdata" rel="noopener noreferrer"&gt;regdata&lt;/a&gt; publisher profile.&lt;/p&gt;

&lt;p&gt;If you work with government registries in other EU countries and want to contribute skills for those, PRs are welcome.&lt;/p&gt;

&lt;h2&gt;
  
  
  What Is Next
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;More registries: Germany (Handelsregister, Insolvenzbekanntmachungen), Italy (Registro Imprese), Netherlands (KVK)&lt;/li&gt;
&lt;li&gt;Deeper cross-registry workflows: automated multi-country due diligence pipelines&lt;/li&gt;
&lt;li&gt;Scheduled monitoring: get notified when a company's registry data changes&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;&lt;strong&gt;Install:&lt;/strong&gt; &lt;code&gt;skills add Nolpak14/getregdata -g -y&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Actors:&lt;/strong&gt; &lt;a href="https://apify.com/regdata" rel="noopener noreferrer"&gt;apify.com/regdata&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;GitHub:&lt;/strong&gt; &lt;a href="https://github.com/Nolpak14/getregdata" rel="noopener noreferrer"&gt;github.com/Nolpak14/getregdata&lt;/a&gt;&lt;/p&gt;




&lt;p&gt;&lt;em&gt;This article is part of the &lt;a href="https://dev.to/ucptools"&gt;European Registry Data&lt;/a&gt; series covering programmatic access to government registries across the EU.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>webscraping</category>
      <category>opensource</category>
      <category>productivity</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://forem.com/ucptools/your-ucp-profile-is-detected-but-ai-agents-still-cant-buy-from-you-j6p</link>
      <guid>https://forem.com/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>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://forem.com/ucptools/microsoft-dropped-acp-for-ucp-in-104-days-identity-linking-is-why-2ce9</link>
      <guid>https://forem.com/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://forem.com/ucptools/93-of-ucp-profiles-are-broken-here-are-the-3-failures-that-matter-most-1n37</link>
      <guid>https://forem.com/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>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://forem.com/ucptools/ucp-and-acp-need-a-third-layer-trust-rails-341i</link>
      <guid>https://forem.com/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>UCP vs ACP Payment Architecture: Why Both Protocols Matter for AI Commerce</title>
      <dc:creator>Peter</dc:creator>
      <pubDate>Wed, 15 Apr 2026 09:00:42 +0000</pubDate>
      <link>https://forem.com/ucptools/ucp-vs-acp-payment-architecture-why-both-protocols-matter-for-ai-commerce-10d4</link>
      <guid>https://forem.com/ucptools/ucp-vs-acp-payment-architecture-why-both-protocols-matter-for-ai-commerce-10d4</guid>
      <description>&lt;h2&gt;
  
  
  UCP vs ACP Payment Architecture: Why Both Protocols Matter for AI Commerce
&lt;/h2&gt;

&lt;p&gt;In the realm of AI-driven commerce, two protocols have emerged as frontrunners in enabling seamless transactions between consumers and merchants: the Universal Commerce Protocol (UCP) and the Agentic Commerce Protocol (ACP). Both protocols aim to bridge the gap between AI agents and commerce platforms, yet their approaches diverge in several key ways. This article will delve into these differences, highlighting when and why you might choose one over the other.&lt;/p&gt;

&lt;h3&gt;
  
  
  Understanding UCP and ACP
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Universal Commerce Protocol (UCP):&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Developed with a focus on interconnectivity and standardized interactions.&lt;/li&gt;
&lt;li&gt;Establishes a "trust triangle" involving consumers, merchants, and AI agents.&lt;/li&gt;
&lt;li&gt;Leverages a decentralized manifest system for merchant discovery, ensuring flexible integration.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Agentic Commerce Protocol (ACP):&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Prioritizes rapid deployment and ease of use.&lt;/li&gt;
&lt;li&gt;Utilizes a delegated payment model, allowing agents to act as intermediaries.&lt;/li&gt;
&lt;li&gt;Supports both centralized and decentralized discovery mechanisms.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Payment Credential Flow Differences
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;UCP&lt;/strong&gt;: Centers around direct credential exchanges with robust verification steps, ensuring high security.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;ACP&lt;/strong&gt;: Employs a streamlined delegated approach, where agents facilitate transactions without directly handling sensitive credentials.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Trust Triangle vs Delegated Payment
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;UCP Trust Triangle&lt;/strong&gt;: Creates a robust ecosystem where merchants and consumers can interact through verified AI agents. This approach emphasizes security and reliability.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;ACP Delegated Payment&lt;/strong&gt;: Facilitates quicker transactions by reducing the steps needed for verification, making it ideal for environments where speed is more critical than comprehensive checks.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  When to Use Which Protocol?
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;UCP&lt;/strong&gt;: Best suited for environments where security and interoperability are paramount. It's the protocol of choice for platforms needing a robust verification system.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;ACP&lt;/strong&gt;: Optimal for scenarios requiring rapid transaction speeds and minimal friction in onboarding new merchants or consumers.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Agorio: Dual-Protocol Support
&lt;/h3&gt;

&lt;p&gt;Agorio stands out by offering dual-protocol support, seamlessly integrating both UCP and ACP to provide flexible options for developers. Whether building for security-focused platforms or speed-intensive environments, Agorio's SDK ensures compatibility and enhances the AI-commerce interface.&lt;/p&gt;

&lt;h3&gt;
  
  
  Conclusion
&lt;/h3&gt;

&lt;p&gt;In the evolving landscape of AI commerce, the choice between UCP and ACP largely depends on specific business needs. While UCP offers rigorous security and interoperability, ACP provides speed and ease of use. By understanding and leveraging the strengths of both protocols, developers can create more effective and versatile AI-driven commerce solutions.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>typescript</category>
      <category>ecommerce</category>
      <category>opensource</category>
    </item>
    <item>
      <title>UOKiK Scraper: Polish Banned Contract Clauses</title>
      <dc:creator>Peter</dc:creator>
      <pubDate>Tue, 14 Apr 2026 13:53:55 +0000</pubDate>
      <link>https://forem.com/ucptools/uokik-scraper-polish-banned-contract-clauses-3m21</link>
      <guid>https://forem.com/ucptools/uokik-scraper-polish-banned-contract-clauses-3m21</guid>
      <description>&lt;h2&gt;
  
  
  TL;DR
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;UOKiK&lt;/strong&gt; (Urzad Ochrony Konkurencji i Konsumentow) maintains a registry of &lt;strong&gt;7,500+ contract clauses&lt;/strong&gt; that Polish courts have ruled abusive&lt;/li&gt;
&lt;li&gt;If your business uses standard contracts in Poland, you should check this registry - using a banned clause can lead to fines and lawsuits&lt;/li&gt;
&lt;li&gt;No API exists for the registry&lt;/li&gt;
&lt;li&gt;I built an &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;Apify actor&lt;/a&gt; that searches the registry and returns structured JSON for $0.008 per clause&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Why the UOKiK Abusive Clauses Registry Matters
&lt;/h2&gt;

&lt;p&gt;Poland's consumer protection framework is built on a simple but powerful rule: contract clauses that the Court of Competition and Consumer Protection (SOKiK) has declared abusive are void - automatically, regardless of whether the consumer signed the agreement. The legal basis is the Act on Competition and Consumer Protection (ustawa o ochronie konkurencji i konsumentow), which gives UOKiK enforcement authority over contract fairness across all industries.&lt;/p&gt;

&lt;p&gt;SOKiK rulings are published in the Register of Prohibited Contractual Clauses (Rejestr Klauzul Niedozwolonych). Once a clause appears in this registry, any business using substantially identical language in their standard terms risks enforcement action from UOKiK, class-action lawsuits from consumer advocacy organizations, and individual court challenges from customers.&lt;/p&gt;

&lt;p&gt;The registry now contains over 7,500 clauses accumulated across nearly two decades of court decisions. Industries with the highest clause counts include banking, insurance, telecommunications, e-commerce, and real estate - essentially any sector that relies on standard-form contracts.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why UOKiK Registry Has No API
&lt;/h2&gt;

&lt;p&gt;The UOKiK registry at &lt;code&gt;rejestr.uokik.gov.pl&lt;/code&gt; is a legacy government portal. It offers a basic keyword search form with paginated results, but there are no REST endpoints, no bulk export, and no structured data format. Each clause page must be loaded individually to get the full ruling text, defendant name, industry classification, and SOKiK case number.&lt;/p&gt;

&lt;p&gt;For law firms reviewing contract language, e-commerce companies updating terms of service, or compliance teams running periodic audits - manual search is impractical when you need to check dozens of clauses or monitor the registry for new rulings in your industry.&lt;/p&gt;

&lt;h2&gt;
  
  
  UOKiK Clause Data: What You Get
&lt;/h2&gt;

&lt;p&gt;The scraper returns structured JSON for each clause with the following fields:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;number&lt;/strong&gt; - registry entry number&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;text&lt;/strong&gt; - the full text of the banned clause&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;defendant&lt;/strong&gt; - the company that was ruled against&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;industry&lt;/strong&gt; - business sector classification&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;caseNumber&lt;/strong&gt; - SOKiK court case reference&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;entryDate&lt;/strong&gt; - when the clause was added to the registry&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;You can search by defendant name, by industry, or by keyword within the clause text. The actor handles pagination automatically and returns all matching results up to your configured limit.&lt;/p&gt;

&lt;h2&gt;
  
  
  How to Use the UOKiK Abusive Clauses Scraper
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Python
&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;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;# Search by defendant company name
&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/uokik-clauses-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;defendant&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;mBank&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="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="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;clause&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;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;Clause #&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;clause&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;number&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;clause&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;text&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="mi"&gt;100&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="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;  Defendant: &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;clause&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;defendant&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;  Industry: &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;clause&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;industry&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;h3&gt;
  
  
  JavaScript (Node.js)
&lt;/h3&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_API_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/uokik-clauses-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;defendant&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;mBank&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;50&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="k"&gt;for &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;clause&lt;/span&gt; &lt;span class="k"&gt;of&lt;/span&gt; &lt;span class="nx"&gt;items&lt;/span&gt;&lt;span class="p"&gt;)&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;`#&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;clause&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;number&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;: &lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;clause&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;text&lt;/span&gt;&lt;span class="p"&gt;?.&lt;/span&gt;&lt;span class="nf"&gt;substring&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;0&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="s2"&gt;...`&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;`  Industry: &lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;clause&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;industry&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&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;h2&gt;
  
  
  Real-World Use Case: E-Commerce Terms of Service Audit
&lt;/h2&gt;

&lt;p&gt;A mid-sized Polish e-commerce company is launching a new return policy. Their legal team needs to verify that none of the proposed clauses match entries in the UOKiK registry - particularly clauses about limiting liability for delivery delays, restricting refund windows, and imposing penalty fees for returns.&lt;/p&gt;

&lt;p&gt;Using the scraper, they search for clauses in the "handel elektroniczny" (e-commerce) industry classification. The actor returns 200+ banned clauses from the sector. The legal team cross-references their draft policy against the results, identifies two clauses that are substantially similar to banned entries, and rewrites them before launch. Without automated access, this review would have taken a full day of manual searching. With the scraper, it takes under 10 minutes.&lt;/p&gt;

&lt;h2&gt;
  
  
  Who Needs the UOKiK Scraper
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Law firms&lt;/strong&gt; - check proposed contract language against banned clauses before signing&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;E-commerce companies&lt;/strong&gt; - ensure terms of service and return policies don't contain abusive clauses&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Insurance companies&lt;/strong&gt; - review policy terms against historical rulings&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Banks and fintech&lt;/strong&gt; - validate loan agreements and fee schedules&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Compliance teams&lt;/strong&gt; - periodic audit of standard contracts against the full registry&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Consumer rights organizations&lt;/strong&gt; - research and advocacy using structured data&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Pricing
&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;Cost&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Manual search on UOKiK website&lt;/td&gt;
&lt;td&gt;Free (slow, no export)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;This actor&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;~$3 per 1,000 clauses&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Free $5 Apify credits on signup = ~1,500 clause lookups at no cost.&lt;/p&gt;

&lt;h2&gt;
  
  
  FAQ
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Can I search the UOKiK registry by industry sector?
&lt;/h3&gt;

&lt;p&gt;Yes. The actor supports filtering by industry classification. This is useful for compliance teams that want to audit all banned clauses relevant to their specific sector - for example, retrieving all clauses from banking, insurance, or e-commerce.&lt;/p&gt;

&lt;h3&gt;
  
  
  Are UOKiK banned clauses legally binding for all companies?
&lt;/h3&gt;

&lt;p&gt;Yes. Once SOKiK rules a clause abusive and it enters the registry, using substantially identical language in any standard-form contract is prohibited across the entire market - not just for the defendant company. UOKiK can impose fines of up to 10% of annual revenue for violations.&lt;/p&gt;

&lt;h3&gt;
  
  
  How often is the UOKiK registry updated?
&lt;/h3&gt;

&lt;p&gt;The registry is updated as new SOKiK rulings are issued. New clauses are added regularly, which is why periodic monitoring is important for compliance teams. The scraper lets you automate this by running scheduled searches for new entries.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Try it:&lt;/strong&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;apify.com/regdata/uokik-clauses-scraper&lt;/a&gt;&lt;/p&gt;




&lt;p&gt;&lt;em&gt;This is part of the &lt;a href="https://dev.to/ucptools/series/polish-business-data-apis"&gt;Polish Business Data APIs&lt;/a&gt; series covering programmatic access to Polish government registries.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>webscraping</category>
      <category>javascript</category>
      <category>tutorial</category>
      <category>api</category>
    </item>
    <item>
      <title>MSiG Scraper: Monitor Sądowy od 2001 Roku</title>
      <dc:creator>Peter</dc:creator>
      <pubDate>Tue, 14 Apr 2026 13:45:18 +0000</pubDate>
      <link>https://forem.com/ucptools/msig-scraper-monitor-sadowy-od-2001-roku-1o4d</link>
      <guid>https://forem.com/ucptools/msig-scraper-monitor-sadowy-od-2001-roku-1o4d</guid>
      <description>&lt;h2&gt;
  
  
  TL;DR
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;MSiG (Monitor Sądowy i Gospodarczy)&lt;/strong&gt; to oficjalny dziennik sądowy publikowany codziennie od 2001 roku&lt;/li&gt;
&lt;li&gt;Zawiera &lt;strong&gt;każde zgłoszenie upadłości, likwidacji, restrukturyzacji i zmianę w KRS&lt;/strong&gt; z ponad 20 lat&lt;/li&gt;
&lt;li&gt;Portal rządowy nie ma oficjalnego API - ale &lt;strong&gt;nieudokumentowany endpoint REST&lt;/strong&gt; istnieje za frontendem jQuery DataTables&lt;/li&gt;
&lt;li&gt;Zbudowałem &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;aktora na Apify&lt;/a&gt;, który odpytuje API bezpośrednio i zwraca JSON za $0.01 za wynik&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Czym jest MSiG i dlaczego ma znaczenie dla wywiadu biznesowego
&lt;/h2&gt;

&lt;p&gt;MSiG - Monitor Sądowy i Gospodarczy - to polski odpowiednik dziennika sądowego. Publikowany przez Ministerstwo Sprawiedliwości od 2001 roku, jest autorytatywnym źródłem prawnym zdarzeń korporacyjnych w Polsce. Każde otwarcie postępowania upadłościowego, zatwierdzenie planu restrukturyzacji, zarządzenie likwidacji, zmiana w KRS (Krajowy Rejestr Sądowy) - jest publikowane w MSiG.&lt;/p&gt;

&lt;p&gt;To czyni MSiG jednym z najcenniejszych zbiorów danych dla każdego zajmującego się polskim wywiadem biznesowym. Archiwum obejmuje ponad dwie dekady codziennych publikacji i setki tysięcy ogłoszeń. Każda upadłość w Polsce od 2001 roku jest tutaj. Każda zmiana w zarządzie, podwyższenie kapitału, fuzja - opublikowana.&lt;/p&gt;

&lt;p&gt;Dla każdego w ryzyku kredytowym, windykacji, usługach prawnych lub wywiadzie konkurencyjnym, monitorowanie MSiG jest niezbędne. Ale portal na &lt;code&gt;wyszukiwarka-msig.ms.gov.pl&lt;/code&gt; jest zaprojektowany do ręcznego wyszukiwania:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Jedna firma na raz&lt;/li&gt;
&lt;li&gt;Wyniki w paginowanym HTML&lt;/li&gt;
&lt;li&gt;Brak eksportu&lt;/li&gt;
&lt;li&gt;Brak dokumentacji API&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Jeśli musisz monitorować setki lub tysiące firm albo analizować historyczne trendy niewypłacalności, podejście ręczne się nie skaluje.&lt;/p&gt;

&lt;h2&gt;
  
  
  MSiG monitor sądowy scraper: jak działa ukryte API
&lt;/h2&gt;

&lt;p&gt;Portal MSiG używa jQuery DataTables z REST API pod spodem, które akceptuje parametry wyszukiwania JSON i zwraca ustrukturyzowane dane.&lt;/p&gt;

&lt;p&gt;Dwa ciekawe szczegoly techniczne:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;1. Dynamiczne rozwiazywanie URL API&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Bazowy URL API nie jest zahardcodowany - jest pobierany w runtime z dedykowanego endpointu (&lt;code&gt;home/getapiurl&lt;/code&gt;). Oznacza to, że rząd może przenieść API bez zmian we frontendzie. Scraper obsługuje to, najpierw rozwiązując aktualny URL API przed wykonaniem jakichkolwiek zapytań.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;2. Literowka w produkcyjnym API&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Endpoint do pełnego tekstu to &lt;code&gt;/Monitor/Detalis&lt;/code&gt; - tak, "Detalis" zamiast "Details". Ta literówka działa w rządowym API od lat. Scraper używa błędnego URL, ponieważ to właśnie on działa.&lt;/p&gt;

&lt;p&gt;Endpoint wyszukiwania &lt;code&gt;/Monitor/Search&lt;/code&gt; akceptuje zakresy dat, nazwy podmiotów, numery KRS/NIP, sygnatury spraw i wyszukiwanie pełnotekstowe w treści ogłoszeń. Wyniki są zwracane jako JSON z metadanymi (daty publikacji, numery monitora, klasyfikacja rozdziałów) i opcjonalnie pełnym tekstem każdego ogłoszenia.&lt;/p&gt;

&lt;p&gt;Pobieranie pełnego tekstu to oddzielne wywołanie API na każde ogłoszenie. Dla dużych zbiorów wyników oznacza to wiele requestów. Aktor grupuje je efektywnie i obsługuje limitowanie ze strony serwerów rządowych.&lt;/p&gt;

&lt;h2&gt;
  
  
  Jak używać MSiG monitor sądowy scrapera
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Python
&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;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&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/msig-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;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;2026-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;2026-03-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;searchType&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;A&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;          &lt;span class="c1"&gt;# A = ogłoszenia, B = wpisy KRS
&lt;/span&gt;        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;entityName&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;Getin&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;fetchDetails&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;# dołącz pełny tekst ogłoszenia
&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="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;entry&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;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;entry&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;entityName&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;entry&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;chapterName&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;  Sygnatura: &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;entry&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;signatureOfCase&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;  Data publikacji: &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;entry&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;dateOfPublication&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;h3&gt;
  
  
  JavaScript (Node.js)
&lt;/h3&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_API_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/msig-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;dateFrom&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;2026-01-01&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;dateTo&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;2026-03-31&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;searchType&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;A&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;entityName&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Getin&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;fetchDetails&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&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;items&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;forEach&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;e&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&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;`&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;e&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;entityName&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt; | &lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;e&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;chapterName&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;`&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;`  Sygnatura: &lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;e&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;signatureOfCase&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&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;h2&gt;
  
  
  Dane z MSiG scrapera: co dostajesz
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Pole&lt;/th&gt;
&lt;th&gt;Przykład&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;entityName&lt;/td&gt;
&lt;td&gt;GETIN NOBLE BANK S.A. W UPADŁOŚCI&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;krs&lt;/td&gt;
&lt;td&gt;0000019193&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;nip&lt;/td&gt;
&lt;td&gt;1080000568&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;signatureOfCase&lt;/td&gt;
&lt;td&gt;XVIII GUp 25/23&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;chapterName&lt;/td&gt;
&lt;td&gt;Postępowania upadłościowe&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;monitorNumber&lt;/td&gt;
&lt;td&gt;MSiG 48/2026&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;dateOfPublication&lt;/td&gt;
&lt;td&gt;2026-03-11&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;numberOfNotice&lt;/td&gt;
&lt;td&gt;12345&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;textInPosition&lt;/td&gt;
&lt;td&gt;Nagłówek ogłoszenia&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;textInBody&lt;/td&gt;
&lt;td&gt;Pełny tekst ogłoszenia sądowego&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  MSiG monitor sądowy: tryby wyszukiwania
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;searchType&lt;/th&gt;
&lt;th&gt;Co obejmuje&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;A (Ogłoszenia)&lt;/td&gt;
&lt;td&gt;Upadłości, restrukturyzacje, likwidacje&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;B (Wpisy KRS)&lt;/td&gt;
&lt;td&gt;Nowe rejestracje, zmiany w zarządzie, podwyższenia kapitału, połączenia&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Można łączyć filtry: zakres dat + nazwa podmiotu + NIP + sygnatura sprawy + wyszukiwanie pełnotekstowe.&lt;/p&gt;

&lt;h2&gt;
  
  
  Przykład z praktyki: monitoring portfela ryzyka kredytowego
&lt;/h2&gt;

&lt;p&gt;Firma faktoringowa zarządza portfelem 2000 polskich klientów biznesowych. Co kwartał ich zespół ryzyka musi sprawdzić, czy któryś z klientów złożył wniosek o upadłość, wszedł w restrukturyzację lub miał istotne zmiany w KRS.&lt;/p&gt;

&lt;p&gt;Bez automatyzacji analityk otwiera portal MSiG, wpisuje nazwę każdej firmy, przegląda wyniki i dokumentuje ustalenia. Przy 3-5 minutach na firmę, screening całego portfela zajmuje 100-170 godzin - około miesiąca pracy jednej osoby.&lt;/p&gt;

&lt;p&gt;Z MSiG Monitor Sądowy scraperem ten sam zespół uruchamia zaplanowane zadanie, które odpytuje aktora numerem KRS lub NIP każdego klienta, z filtrem na ostatnie 90 dni. Wyniki trafiają bezpośrednio do systemu zarządzania ryzykiem. Każde nowe zgłoszenie upadłości lub ogłoszenie restrukturyzacji uruchamia automatyczny przegląd.&lt;/p&gt;

&lt;p&gt;To redukuje screening portfela z tygodni do minut. Co ważniejsze, umożliwia ciągły monitoring zamiast okresowych kontroli - wychwytując problemy w ciągu dni od publikacji, a nie kwartałów.&lt;/p&gt;

&lt;h2&gt;
  
  
  Kto potrzebuje danych z MSiG Monitora Sądowego
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Monitoring upadłości&lt;/strong&gt; - alerty gdy firmy z Twojego portfela składają wniosek o upadłość&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Windykacja&lt;/strong&gt; - śledzenie postępowań dotyczących dłużników&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Ryzyko kredytowe&lt;/strong&gt; - screening nowych klientów pod kątem historii niewypłacalności&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Badania prawne&lt;/strong&gt; - wyszukiwanie ogłoszeń sądowych po sygnaturze sprawy&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Analiza rynku&lt;/strong&gt; - trendy niewypłacalności według sektora lub regionu z 20+ lat danych&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Monitoring zmian KRS&lt;/strong&gt; - wykrywanie zmian w zarządach, podwyższeń kapitału, fuzji&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  FAQ
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Czy mogę szukać po numerze KRS lub NIP zamiast po nazwie firmy?
&lt;/h3&gt;

&lt;p&gt;Tak. Aktor akceptuje &lt;code&gt;entityName&lt;/code&gt;, &lt;code&gt;krs&lt;/code&gt;, &lt;code&gt;nip&lt;/code&gt; i &lt;code&gt;signatureOfCase&lt;/code&gt; jako parametry wyszukiwania. Można użyć dowolnej kombinacji. Wyszukiwanie po KRS i NIP jest dokładne (exact match) i jest najbardziej niezawodnym sposobem na znalezienie ogłoszeń dla konkretnej firmy, ponieważ nazwy firm mogą się różnić między zgłoszeniami (skróty, sufiksy formy prawnej itp.).&lt;/p&gt;

&lt;h3&gt;
  
  
  Co robi parametr &lt;code&gt;fetchDetails&lt;/code&gt;?
&lt;/h3&gt;

&lt;p&gt;Gdy &lt;code&gt;fetchDetails&lt;/code&gt; jest ustawiony na &lt;code&gt;true&lt;/code&gt;, aktor wykonuje dodatkowe wywołanie API dla każdego wyniku, aby pobrać pełny tekst ogłoszenia sądowego (&lt;code&gt;textInBody&lt;/code&gt;). Bez niego dostajesz tylko metadane (nazwa podmiotu, daty, rozdział, sygnatura). Włącz go, gdy potrzebujesz faktycznej treści ogłoszeń - na przykład aby wydobyć listy wierzycieli lub warunki restrukturyzacji. Wyłącz dla szybszych wyników, gdy interesuje Cię tylko to, czy ogłoszenie istnieje.&lt;/p&gt;

&lt;h3&gt;
  
  
  Jak daleko wstecz sięga archiwum MSiG?
&lt;/h3&gt;

&lt;p&gt;Cyfrowe archiwum na &lt;code&gt;wyszukiwarka-msig.ms.gov.pl&lt;/code&gt; sięga do 2001 roku. Scraper może odpytywać dowolny zakres dat w tym okresie. Daje to dostęp do ponad 20 lat zgłoszeń upadłości, zmian KRS i innych zdarzeń korporacyjnych - cenny zbiór danych do analizy historycznych trendów lub due diligence długo istniejących firm.&lt;/p&gt;

&lt;h2&gt;
  
  
  Ceny
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Metoda&lt;/th&gt;
&lt;th&gt;Koszt&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Ręczne wyszukiwanie na portalu MSiG&lt;/td&gt;
&lt;td&gt;Darmowe (po jednym, bez eksportu)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;MGBI API MSiG&lt;/td&gt;
&lt;td&gt;900-2200 zł/mies. subskrypcja&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Ten aktor&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;~20 zł za 1000 wyników&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Darmowe $5 kredytów Apify = ~900 wyników MSiG za darmo.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Wypróbuj:&lt;/strong&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;apify.com/regdata/msig-scraper&lt;/a&gt;&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Ten artykuł jest częścią serii &lt;a href="https://dev.to/ucptools/series/polish-business-data-apis"&gt;Polish Business Data APIs&lt;/a&gt; o programistycznym dostępie do polskich rejestrów publicznych.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>webscraping</category>
      <category>javascript</category>
      <category>tutorial</category>
      <category>api</category>
    </item>
    <item>
      <title>eKRS Scraper: Sprawozdania Finansowe z KRS</title>
      <dc:creator>Peter</dc:creator>
      <pubDate>Tue, 14 Apr 2026 13:41:46 +0000</pubDate>
      <link>https://forem.com/ucptools/ekrs-scraper-sprawozdania-finansowe-z-krs-5bc4</link>
      <guid>https://forem.com/ucptools/ekrs-scraper-sprawozdania-finansowe-z-krs-5bc4</guid>
      <description>&lt;h2&gt;
  
  
  TL;DR
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Polskie spółki muszą składać roczne sprawozdania finansowe w &lt;strong&gt;KRS&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Są publicznie dostępne na &lt;code&gt;ekrs.ms.gov.pl&lt;/code&gt; - ale tylko przez ręczny interfejs webowy&lt;/li&gt;
&lt;li&gt;Portal używa &lt;strong&gt;szyfrowania AES z kluczem rotowanym co godzinę&lt;/strong&gt; (opartym na strefie czasowej Warszawa)&lt;/li&gt;
&lt;li&gt;Zbudowałem &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;eKRS sprawozdania finansowe scraper na Apify&lt;/a&gt;, który wyciąga ustrukturyzowane dane finansowe (aktywa, pasywa, przychody, zysk netto) za $0.03 za firmę&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Czym jest eKRS i dlaczego dostęp do sprawozdań finansowych ma znaczenie
&lt;/h2&gt;

&lt;p&gt;eKRS (Elektroniczny Krajowy Rejestr Sądowy) to elektroniczny portal Krajowego Rejestru Sądowego prowadzony przez Ministerstwo Sprawiedliwości. Od 2018 roku wszystkie polskie spółki z numerem KRS mają obowiązek składania rocznych sprawozdań finansowych elektronicznie przez ten portal. Obejmują one bilans, rachunek zysków i strat oraz informacje dodatkowe.&lt;/p&gt;

&lt;p&gt;To tworzy jedną z największych publicznie dostępnych baz danych finansowych firm w Europie Środkowej. Setki tysięcy spółek składają sprawozdania co roku, a wszystkie są dostępne do publicznego wglądu bezpłatnie. Dane obejmują zarówno małe spółki z o.o. z minimalnym przychodem, jak i największe spółki giełdowe w Polsce.&lt;/p&gt;

&lt;p&gt;Problem leży w dostępie. Portal &lt;code&gt;ekrs.ms.gov.pl&lt;/code&gt; został zaprojektowany do ręcznego przeglądania po jednym dokumencie. Brak eksportu danych, brak masowego pobierania, brak publicznego API. Jeśli budujesz modele ryzyka kredytowego, analizujesz konkurencję w branży lub sprawdzasz setki celów inwestycyjnych - potrzebujesz tych danych w formacie maszynowym, a nie w rządowej aplikacji serwującej XML i XHTML po jednym dokumencie.&lt;/p&gt;

&lt;h2&gt;
  
  
  Jak działa szyfrowanie AES z rotacją klucza w eKRS
&lt;/h2&gt;

&lt;p&gt;Portal eKRS to aplikacja Angular hostowana na infrastrukturze OpenShift Ministerstwa Sprawiedliwości. Szyfruje numery KRS przed wysłaniem zapytań API - ale z nietypowym mechanizmem.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Klucz szyfrowania zmienia się co godzinę.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Klucz pochodzi z bieżącej daty i godziny w strefie czasowej Warszawa, sformatowanej jako &lt;code&gt;yyyy-MM-dd-HH&lt;/code&gt; i dopełnionej do 16 znaków bajtami null. Więc o 14:00 8 kwietnia 2026 w Warszawie klucz to:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;2026-04-08-14\x00\x00\x00
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;O 15:00 klucz rotuje na:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;2026-04-08-15\x00\x00\x00
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Zapytania z kluczem wygenerowanym z błędną godziną nie przechodzą. Scraper obsługuje konwersję strefy czasowej używając &lt;code&gt;Intl.DateTimeFormat&lt;/code&gt; z &lt;code&gt;Europe/Warsaw&lt;/code&gt; - to krytyczne dla poprawnego generowania klucza, szczególnie podczas zmian czasu (Polska przechodzi między CET a CEST) i w kontenerach Docker ustawionych na UTC.&lt;/p&gt;

&lt;p&gt;Portal implementuje również podpisywanie zapytań i zarządzanie sesją, które muszą być zreplikowane. Każde sprawozdanie finansowe jest przechowywane jako XML (Polskie Standardy Rachunkowości - PSR), XHTML/iXBRL (Międzynarodowe Standardy Sprawozdawczości Finansowej - MSSF) lub okazjonalnie jako skan PDF. Scraper obsługuje wszystkie trzy formaty i normalizuje je do ujednoliconej struktury JSON.&lt;/p&gt;

&lt;h2&gt;
  
  
  eKRS sprawozdania finansowe: co dostajesz
&lt;/h2&gt;

&lt;p&gt;Aktor parsuje XML (Polskie Standardy Rachunkowości) i XHTML/iXBRL (MSSF) do ujednoliconego formatu JSON:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Pole&lt;/th&gt;
&lt;th&gt;Opis&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;krs&lt;/td&gt;
&lt;td&gt;Numer KRS&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;companyName&lt;/td&gt;
&lt;td&gt;Pełna nazwa spółki&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;year&lt;/td&gt;
&lt;td&gt;Rok sprawozdawczy&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;fileFormat&lt;/td&gt;
&lt;td&gt;xml, xhtml lub pdf&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;financials.totalAssets&lt;/td&gt;
&lt;td&gt;Aktywa razem&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;financials.fixedAssets&lt;/td&gt;
&lt;td&gt;Aktywa trwałe&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;financials.currentAssets&lt;/td&gt;
&lt;td&gt;Aktywa obrotowe&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;financials.cashAndEquivalents&lt;/td&gt;
&lt;td&gt;Środki pieniężne&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;financials.equity&lt;/td&gt;
&lt;td&gt;Kapitał własny&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;financials.longTermLiabilities&lt;/td&gt;
&lt;td&gt;Zobowiązania długoterminowe&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;financials.shortTermLiabilities&lt;/td&gt;
&lt;td&gt;Zobowiązania krótkoterminowe&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;financials.revenue&lt;/td&gt;
&lt;td&gt;Przychody&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;financials.operatingProfit&lt;/td&gt;
&lt;td&gt;Zysk operacyjny&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;financials.netProfit&lt;/td&gt;
&lt;td&gt;Zysk netto&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Aktor zwraca również surowe źródło XML/XHTML do własnego parsowania - przydatne jeśli potrzebujesz pól wykraczających poza standardowy zestaw, takich jak harmonogramy amortyzacji, rezerwy podatkowe czy raportowanie segmentowe.&lt;/p&gt;

&lt;h2&gt;
  
  
  Jak używać eKRS sprawozdania finansowe scraper
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Python
&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;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;# Wyszukiwanie po NIP lub KRS
&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;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;5261040828&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;  &lt;span class="c1"&gt;# lub krs: "0000019193"
&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="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;stmt&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;items&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="n"&gt;fin&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;stmt&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;financials&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;stmt&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="s"&gt; - &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;stmt&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;year&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;  Przychody: &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;fin&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;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;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;  Zysk netto: &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;fin&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;netProfit&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;  Aktywa razem: &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;fin&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;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;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  JavaScript (Node.js)
&lt;/h3&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_API_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/poland-krs-financial-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;nip&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;5261040828&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="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="k"&gt;for &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;stmt&lt;/span&gt; &lt;span class="k"&gt;of&lt;/span&gt; &lt;span class="nx"&gt;items&lt;/span&gt;&lt;span class="p"&gt;)&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;`&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;stmt&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;companyName&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt; - &lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;stmt&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;year&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;`&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;`  Przychody: &lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;stmt&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;financials&lt;/span&gt;&lt;span class="p"&gt;?.&lt;/span&gt;&lt;span class="nx"&gt;revenue&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;`&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;`  Zysk netto: &lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;stmt&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;financials&lt;/span&gt;&lt;span class="p"&gt;?.&lt;/span&gt;&lt;span class="nx"&gt;netProfit&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&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;h2&gt;
  
  
  Praktyczny przypadek: screening kondycji finansowej dostawców
&lt;/h2&gt;

&lt;p&gt;Wyobraź sobie, że zarządzasz zakupami w firmie produkcyjnej z 200 polskimi dostawcami. CFO chce kwartalnego raportu o stabilności finansowej dostawców - czy któryś z nich jest zagrożony niewypłacalnością?&lt;/p&gt;

&lt;p&gt;Bez tego scrapera ktoś z Twojego zespołu musiałby odwiedzić &lt;code&gt;ekrs.ms.gov.pl&lt;/code&gt; 200 razy, ręcznie wyszukać każdą firmę, pobrać plik XHTML lub XML, a potem jakoś wyciągnąć odpowiednie dane finansowe do arkusza. To zajmuje dni ręcznej pracy i jest podatne na błędy.&lt;/p&gt;

&lt;p&gt;Z eKRS scraperem przekazujesz 200 numerów NIP w jednej partii. W ciągu kilku minut dostajesz ustrukturyzowany JSON z aktywami, kapitałem własnym, przychodami i zyskiem netto dla każdego dostawcy. Uruchom prosty filtr: oznacz każdego dostawcę, gdzie kapitał własny jest ujemny, gdzie wskaźnik długu do aktywów przekracza 80% lub gdzie przychody spadły o ponad 30% rok do roku. Masz system wczesnego ostrzegania o ryzyku dostawców - zbudowany w jedno popołudnie za około 25 zł.&lt;/p&gt;

&lt;h2&gt;
  
  
  Kto potrzebuje danych ze sprawozdań finansowych eKRS
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Ryzyko kredytowe&lt;/strong&gt; - sprawdź wypłacalność firmy przed podpisaniem umowy lub udzieleniem kredytu&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Analiza konkurencji&lt;/strong&gt; - monitoruj przychody i rentowność konkurentów w ujęciu wieloletnim&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Screening inwestycyjny&lt;/strong&gt; - hurtowa analiza kondycji finansowej celów przejęć w danym sektorze&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Due diligence dostawców&lt;/strong&gt; - zweryfikuj stabilność finansową kluczowych dostawców przed podpisaniem długoletnich kontraktów&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Monitoring portfela&lt;/strong&gt; - śledź roczne wyniki firm w portfelu inwestycyjnym&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Porównanie cen eKRS Scraper
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Metoda&lt;/th&gt;
&lt;th&gt;Koszt&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Ręczne pobieranie z ekrs.ms.gov.pl&lt;/td&gt;
&lt;td&gt;Darmowe (po jednym, bez ustrukturyzowanych danych)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;MGBI API sprawozdania&lt;/td&gt;
&lt;td&gt;900-2200 zł/mies. subskrypcja&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Ten aktor&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;~13 zł za 100 firm&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Darmowe $5 kredytów Apify = ~190 sprawozdań finansowych za darmo.&lt;/p&gt;

&lt;h2&gt;
  
  
  FAQ
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Jakie standardy sprawozdawczości obsługuje scraper?
&lt;/h3&gt;

&lt;p&gt;eKRS sprawozdania finansowe scraper obsługuje zarówno Polskie Standardy Rachunkowości (PSR) składane jako XML, jak i Międzynarodowe Standardy Sprawozdawczości Finansowej (MSSF) składane jako XHTML/iXBRL. Obsługuje też skany PDF, choć ekstrakcja ustrukturyzowanych danych z PDF jest ograniczona. Aktor normalizuje wszystkie formaty do jednego schematu JSON - dostajesz te same nazwy pól niezależnie od formatu źródła.&lt;/p&gt;

&lt;h3&gt;
  
  
  Za ile lat wstecz są dostępne sprawozdania?
&lt;/h3&gt;

&lt;p&gt;Portal eKRS zawiera sprawozdania finansowe składane od czasu wprowadzenia obowiązku elektronicznego w 2018 roku. Większość spółek ma dostępne dane za 5-7 lat. Niektóre większe spółki, które składały dobrowolnie przed nakazem, mogą mieć starsze rekordy. Scraper zwraca wszystkie dostępne lata dla danej spółki.&lt;/p&gt;

&lt;h3&gt;
  
  
  Czy mogę szukać po NIP zamiast numeru KRS?
&lt;/h3&gt;

&lt;p&gt;Tak. W odróżnieniu od KRS scraper do danych zarządu, eKRS sprawozdania finansowe scraper akceptuje zarówno NIP (numer identyfikacji podatkowej) jak i numer KRS jako input. To wygodne, bo NIP jest często łatwiej znaleźć - widnieje na fakturach, stronach internetowych i w większości katalogów biznesowych.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Wypróbuj:&lt;/strong&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;apify.com/regdata/poland-krs-financial-scraper&lt;/a&gt;&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Ten artykuł jest częścią serii &lt;a href="https://dev.to/ucptools/series/polish-business-data-apis"&gt;Polish Business Data APIs&lt;/a&gt; o programistycznym dostępie do polskich rejestrów publicznych.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>webscraping</category>
      <category>javascript</category>
      <category>tutorial</category>
      <category>api</category>
    </item>
  </channel>
</rss>
