<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Petter_Strale</title>
    <description>The latest articles on DEV Community by Petter_Strale (@petter-strale).</description>
    <link>https://dev.to/petter-strale</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%2F3799638%2F643038f6-1764-422c-8da0-7cd6cb5016c6.png</url>
      <title>DEV Community: Petter_Strale</title>
      <link>https://dev.to/petter-strale</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/petter-strale"/>
    <language>en</language>
    <item>
      <title>Add Counterparty Verification to Your AI Agent in 5 Minutes</title>
      <dc:creator>Petter_Strale</dc:creator>
      <pubDate>Sat, 04 Apr 2026 15:29:06 +0000</pubDate>
      <link>https://dev.to/petter-strale/add-counterparty-verification-to-your-ai-agent-in-5-minutes-2k08</link>
      <guid>https://dev.to/petter-strale/add-counterparty-verification-to-your-ai-agent-in-5-minutes-2k08</guid>
      <description>&lt;p&gt;Your AI agent can browse the web, write code, and manage calendars. Can it answer "is this company real?" before it processes a payment or sends sensitive data?&lt;/p&gt;

&lt;p&gt;Counterparty verification is standard practice in financial services. Confirming that the entity you're dealing with is registered, active, and not sanctioned. Every bank does it. Every payment processor does it. AI agents skip it entirely, because the data is scattered across government registries, sanctions lists, and commercial databases that weren't built for programmatic access.&lt;/p&gt;

&lt;p&gt;Here's how to fix that in about 5 minutes.&lt;/p&gt;

&lt;h2&gt;
  
  
  The problem in practice
&lt;/h2&gt;

&lt;p&gt;Say your agent is processing an invoice from a UK supplier. Before authorizing payment, you want to know four things: Is the company actually registered at Companies House? Is it active or dissolved? Who are the directors and persons with significant control? Are any of them on sanctions lists?&lt;/p&gt;

&lt;p&gt;Without a verification layer, your agent either skips these checks (risky) or you build custom integrations to Companies House, OFAC, EU sanctions lists, and UN consolidated lists. That's weeks of work and ongoing maintenance for each jurisdiction you add.&lt;/p&gt;

&lt;h2&gt;
  
  
  MCP: zero code
&lt;/h2&gt;

&lt;p&gt;If your agent supports MCP (Claude Desktop, Cursor, Windsurf, or any MCP-compatible client), connect Strale's MCP server:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"mcpServers"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"strale"&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;"streamableHttp"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"url"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"https://api.strale.io/mcp"&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;Your agent now has 271 tools available. Ask it to verify a company and it finds and calls the right capability:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"Verify that Acme Trading Ltd is a real, active UK company and check the directors against sanctions lists."&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;The agent calls &lt;code&gt;kyb-essentials-uk&lt;/code&gt;, gets back registration status, officers, beneficial ownership, and sanctions screening results. Structured JSON with provenance metadata and a quality score.&lt;/p&gt;

&lt;h2&gt;
  
  
  LangChain / CrewAI: three lines
&lt;/h2&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;langchain_strale&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;StraleToolkit&lt;/span&gt;

&lt;span class="n"&gt;toolkit&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;StraleToolkit&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;api_key&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;sk_live_...&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;tools&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;toolkit&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get_tools&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That gives your agent access to the full capability set. The toolkit handles discovery, input formatting, and response parsing.&lt;/p&gt;

&lt;p&gt;For CrewAI:&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;crewai_strale&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;StraleToolkit&lt;/span&gt;

&lt;span class="n"&gt;toolkit&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;StraleToolkit&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;api_key&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;sk_live_...&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;tools&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;toolkit&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get_tools&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;

&lt;span class="n"&gt;agent&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;Agent&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;role&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Compliance Analyst&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;tools&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;tools&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;goal&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Verify counterparties before transactions&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;Also available for Semantic Kernel, OpenAI Agents SDK, Google ADK, and Pydantic AI.&lt;/p&gt;

&lt;h2&gt;
  
  
  Direct API call
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl &lt;span class="nt"&gt;-X&lt;/span&gt; POST https://api.strale.io/v1/execute/kyb-essentials-uk &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-H&lt;/span&gt; &lt;span class="s2"&gt;"Authorization: Bearer sk_live_..."&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-H&lt;/span&gt; &lt;span class="s2"&gt;"Content-Type: application/json"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-d&lt;/span&gt; &lt;span class="s1"&gt;'{"company_name": "Acme Trading Ltd"}'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Response:&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;"result"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"company_name"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"ACME TRADING LTD"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"company_number"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"12345678"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"status"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"active"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"incorporated"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"2019-03-15"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"registered_address"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"10 Downing Street, London"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"officers"&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="err"&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;"persons_with_significant_control"&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="err"&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;"sanctions_check"&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;"is_sanctioned"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"lists_checked"&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;"OFAC SDN"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"EU Consolidated"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"UN Security Council"&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;"meta"&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;"quality_score"&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;"grade"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"A"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"score"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;92&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;"provenance"&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;"source"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"companies-house.gov.uk"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"fetched_at"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"2026-04-04T10:23:15Z"&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;"transaction_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;"txn_abc123"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"verify_url"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"https://api.strale.io/v1/verify/txn_abc123"&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 &lt;code&gt;meta&lt;/code&gt; block gives your agent and your compliance team everything needed for an audit trail: where the data came from, when, how reliable it is, and a public URL to verify the result independently.&lt;/p&gt;

&lt;h2&gt;
  
  
  What's available beyond the UK
&lt;/h2&gt;

&lt;p&gt;271 capabilities across 27 countries. KYB bundles for UK, Norway, Sweden, and Australia that combine company data, sanctions, and beneficial ownership in one call. IBAN validation across 80+ countries. EU VAT validation via VIES. Sanctions screening against OFAC, EU, and UN lists. Domain reputation and WHOIS lookups for verifying a counterparty's web presence. Beneficial ownership via UK Companies House PSC register, with Nordic registries next.&lt;/p&gt;

&lt;p&gt;Honest limitation: beneficial ownership is UK-only right now. If your counterparty is registered in Singapore or Delaware, you'll get company data and sanctions screening but not the ownership chain. I'm working on expanding that.&lt;/p&gt;

&lt;p&gt;All priced per call, €0.02 to €2.50. No monthly minimums. Charged only on success.&lt;/p&gt;

&lt;h2&gt;
  
  
  How the scoring works
&lt;/h2&gt;

&lt;p&gt;Every capability is tested by 1,500+ automated test suites. The results are published as a dual-profile quality score. One profile measures the capability itself (correctness, schema compliance, error handling). The other measures the reliability of its upstream data source. A sanctions check scoring 95 is more useful to your agent than one scoring 60, and the score tells you which is which before you pay for the call.&lt;/p&gt;

&lt;p&gt;Methodology: &lt;a href="https://strale.dev/trust" rel="noopener noreferrer"&gt;strale.dev/trust&lt;/a&gt;&lt;/p&gt;




&lt;p&gt;We're based in Sweden and bootstrapped. If you're building agents that need to verify counterparties, suppliers, or partners, we'd like to hear what data you need that isn't available yet.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://strale.dev" rel="noopener noreferrer"&gt;strale.dev&lt;/a&gt;. Free capabilities available, €2 trial credit, no card required.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>agents</category>
      <category>fintech</category>
      <category>python</category>
    </item>
    <item>
      <title>Your DeFi Due Diligence Takes 20 API Calls. It Should Take One.</title>
      <dc:creator>Petter_Strale</dc:creator>
      <pubDate>Sat, 04 Apr 2026 14:30:59 +0000</pubDate>
      <link>https://dev.to/petter-strale/your-defi-due-diligence-takes-20-api-calls-it-should-take-one-19og</link>
      <guid>https://dev.to/petter-strale/your-defi-due-diligence-takes-20-api-calls-it-should-take-one-19og</guid>
      <description>&lt;p&gt;Last week I watched someone investigate a DeFi project using my API platform. They made 23 calls over two days across three different tools. The pattern was always the same:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;DNS lookup on the project domain. Does it even exist?&lt;/li&gt;
&lt;li&gt;Check domain variants (.com, .io, .finance, .xyz). Squatting or legitimate?&lt;/li&gt;
&lt;li&gt;Validate team email addresses. Do the domains resolve?&lt;/li&gt;
&lt;li&gt;Scrape the website. Does the content match the whitepaper claims?&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;They were checking whether a project called OceanSwap was real. Four domain variants, all non-existent. Strong signal. But they had to make four separate calls to learn that.&lt;/p&gt;

&lt;p&gt;This is how most DeFi due diligence works today: manual, slow, and fragmented. You piece together free tools, cross-reference results in your head, and hope you didn't miss something.&lt;/p&gt;

&lt;h2&gt;
  
  
  What the manual approach misses
&lt;/h2&gt;

&lt;p&gt;The DNS + email + website scrape pattern catches the obvious fakes. It won't catch sanctions exposure. Is the team or any associated wallet on OFAC, EU, or UN sanctions lists? You're not checking this manually because the data sources are behind paywalls and the APIs are painful to integrate.&lt;/p&gt;

&lt;p&gt;It also won't tell you whether there's an actual registered entity behind the project. A UK company check takes one call if you know the company number, but most DeFi projects don't advertise their Companies House registration. And even if you find the company, you still don't know who actually controls it. Beneficial ownership registries exist in most EU countries. Querying them programmatically is a different kind of painful.&lt;/p&gt;

&lt;p&gt;Then there's adverse media. Has the project or its founders appeared in negative news coverage? That requires searching multiple news sources and filtering for relevance. Not something you do with a DNS lookup.&lt;/p&gt;

&lt;h2&gt;
  
  
  The single-call alternative
&lt;/h2&gt;

&lt;p&gt;The same investigation as a structured verification:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl &lt;span class="nt"&gt;-X&lt;/span&gt; POST https://api.strale.io/v1/execute/kyb-essentials-uk &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-H&lt;/span&gt; &lt;span class="s2"&gt;"Authorization: Bearer sk_live_..."&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-H&lt;/span&gt; &lt;span class="s2"&gt;"Content-Type: application/json"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-d&lt;/span&gt; &lt;span class="s1"&gt;'{"company_name": "OceanSwap Ltd"}'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;One call. You get back company registration status (active, dissolved, or not found), registered address, officer names, beneficial ownership chain, sanctions screening against OFAC/EU/UN lists, adverse media mentions, and a quality score telling you how reliable each data point is.&lt;/p&gt;

&lt;p&gt;Cost: €1.50 to €2.50 depending on jurisdiction. Time: under 3 seconds.&lt;/p&gt;

&lt;p&gt;For OceanSwap, the response would come back with "company not found" across all registries. Same conclusion the manual researcher reached, but in one call instead of 23.&lt;/p&gt;

&lt;p&gt;A limitation worth mentioning: beneficial ownership data is currently UK-only (Companies House PSC register). Nordic registries are next, but if you're investigating a Cayman Islands shell company, you'll hit the same wall everyone else does.&lt;/p&gt;

&lt;h2&gt;
  
  
  When the manual approach still makes sense
&lt;/h2&gt;

&lt;p&gt;Free tools are fine for a quick sniff test. If you just want to know "does this domain exist?" then &lt;code&gt;dns-lookup&lt;/code&gt; is free and instant. If you want to read a project's website without opening a browser, &lt;code&gt;url-to-markdown&lt;/code&gt; handles that.&lt;/p&gt;

&lt;p&gt;The structured verification becomes worth it when you're evaluating multiple projects and need consistency, when you need sanctions or beneficial ownership data that free tools can't provide, when you're building an agent that does this automatically, or when you need an audit trail of what you checked and when.&lt;/p&gt;

&lt;h2&gt;
  
  
  For agent builders
&lt;/h2&gt;

&lt;p&gt;If you're building a DeFi research agent, the MCP integration is a few lines of config:&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;"mcpServers"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"strale"&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;"streamableHttp"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"url"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"https://api.strale.io/mcp"&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;Your agent gets access to 271 capabilities. The free ones (DNS, email validation, IBAN, URL scraping) work without signup. Compliance capabilities (sanctions, KYB, beneficial ownership) need an API key and cost €0.02 to €2.50 per call.&lt;/p&gt;

&lt;p&gt;Every response includes provenance metadata (where the data came from, when it was fetched) and a quality score so your agent can assess confidence before acting on the result.&lt;/p&gt;




&lt;p&gt;I built Strale as a solo founder in Sweden. 271 capabilities, 27 countries, 1,500+ automated test suites. If you're doing DeFi due diligence manually or building agents that need to verify counterparties, I'd like to hear what's missing from your workflow.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://strale.dev" rel="noopener noreferrer"&gt;strale.dev&lt;/a&gt;. Free capabilities available, €2 trial credit on signup, no card required.&lt;/p&gt;

</description>
      <category>web3</category>
      <category>defi</category>
      <category>security</category>
      <category>api</category>
    </item>
    <item>
      <title>One API Call to Know If Your Dependency Is Safe</title>
      <dc:creator>Petter_Strale</dc:creator>
      <pubDate>Thu, 02 Apr 2026 10:36:54 +0000</pubDate>
      <link>https://dev.to/petter-strale/one-api-call-to-know-if-your-dependency-is-safe-b6</link>
      <guid>https://dev.to/petter-strale/one-api-call-to-know-if-your-dependency-is-safe-b6</guid>
      <description>&lt;p&gt;A coding agent just suggested adding a package to your project. You've never heard of it. How do you decide whether to trust it?&lt;/p&gt;

&lt;p&gt;Most developers either accept the suggestion blindly or spend fifteen minutes checking GitHub stars, last commit date, the npm advisory database, and whatever license file happens to exist. Agents can't do either — they need a structured signal, fast.&lt;/p&gt;

&lt;h2&gt;
  
  
  The data exists. It's just scattered.
&lt;/h2&gt;

&lt;p&gt;The information you need to evaluate a dependency already exists across public APIs. OSV.dev maintains a comprehensive vulnerability database covering CVEs and GitHub Security Advisories across npm, PyPI, Go, Rust, and more. Google's deps.dev aggregates dependency graphs, license metadata, and OpenSSF Scorecard results — the 18-check security health assessment that most developers have never heard of despite it covering over a million projects. The npm and PyPI registries themselves tell you when a package was last published, whether it's deprecated, and how many maintainers it has.&lt;/p&gt;

&lt;p&gt;The problem isn't data availability. It's that these are five or six separate HTTP calls with different request formats, different response schemas, and different failure modes. An agent checking one dependency has to call OSV.dev with a POST body specifying ecosystem and version, then hit deps.dev's REST API to get the linked GitHub project, then make another call to deps.dev for the OpenSSF Scorecard, then query the registry for freshness signals. Then it has to synthesize all of that into a decision. Multiply that by forty dependencies in a lockfile and you've built an integration project, not a quick check.&lt;/p&gt;

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

&lt;p&gt;&lt;code&gt;package-security-audit&lt;/code&gt; aggregates all of the above into a single API call. You pass a package name and optionally a version and ecosystem. It calls OSV.dev, deps.dev, and the relevant registry in parallel, normalizes everything, and returns a 0–100 risk score with the evidence behind it.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl &lt;span class="nt"&gt;-X&lt;/span&gt; POST https://api.strale.io/v1/do &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-H&lt;/span&gt; &lt;span class="s2"&gt;"Authorization: Bearer &lt;/span&gt;&lt;span class="nv"&gt;$STRALE_API_KEY&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-H&lt;/span&gt; &lt;span class="s2"&gt;"Content-Type: application/json"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-d&lt;/span&gt; &lt;span class="s1"&gt;'{
    "capability_slug": "package-security-audit",
    "inputs": { "name": "express", "version": "4.18.2" }
  }'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Here's what comes back (trimmed to the output fields):&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;"output"&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;"express"&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;"4.18.2"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"ecosystem"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"npm"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"risk_score"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;94&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"risk_level"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"low"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"vulnerabilities"&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;"total"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"critical"&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="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"high"&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="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"medium"&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="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"low"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"details"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
          &lt;/span&gt;&lt;span class="nl"&gt;"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;"GHSA-qw6h-vgh9-j6wx"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
          &lt;/span&gt;&lt;span class="nl"&gt;"severity"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"low"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
          &lt;/span&gt;&lt;span class="nl"&gt;"summary"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"express vulnerable to XSS via response.redirect()"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
          &lt;/span&gt;&lt;span class="nl"&gt;"fixed_in"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"4.20.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;span class="nl"&gt;"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;"GHSA-rv95-896h-c2vc"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
          &lt;/span&gt;&lt;span class="nl"&gt;"severity"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"moderate"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
          &lt;/span&gt;&lt;span class="nl"&gt;"summary"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Express.js Open Redirect in malformed URLs"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
          &lt;/span&gt;&lt;span class="nl"&gt;"fixed_in"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"4.19.2"&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;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;"license"&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;"spdx"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"MIT"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"is_osi_approved"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"is_copyleft"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"freshness"&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;"latest_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;"5.2.1"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"is_latest"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"is_deprecated"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"days_since_last_release"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;121&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;"maintainers"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"dependency_count"&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="nl"&gt;"provenance"&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;"source"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"osv.dev + deps.dev + registry"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"fetched_at"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"2026-04-02T10:30:33.440Z"&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;Express 4.18.2 scores 94/100 — low risk. Two low-severity vulnerabilities, both with known fix versions. MIT license, five maintainers, not deprecated. The only flag: it's not the latest version (5.2.1 is out). An agent can read that response and make a decision in milliseconds. The whole call took 486ms.&lt;/p&gt;

&lt;p&gt;The second capability, &lt;code&gt;license-compatibility-check&lt;/code&gt;, handles a different question: given a set of licenses across your dependency tree, are they all compatible with your use case?&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl &lt;span class="nt"&gt;-X&lt;/span&gt; POST https://api.strale.io/v1/do &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-H&lt;/span&gt; &lt;span class="s2"&gt;"Authorization: Bearer &lt;/span&gt;&lt;span class="nv"&gt;$STRALE_API_KEY&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-H&lt;/span&gt; &lt;span class="s2"&gt;"Content-Type: application/json"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-d&lt;/span&gt; &lt;span class="s1"&gt;'{
    "capability_slug": "license-compatibility-check",
    "inputs": {
      "licenses": ["MIT", "Apache-2.0", "GPL-3.0-only"],
      "use_case": "commercial"
    }
  }'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"output"&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;"compatible"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"use_case"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"commercial"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"license_count"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"licenses_analyzed"&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;"input"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"MIT"&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;"permissive"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"compatible_with_use_case"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;true&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;"input"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Apache-2.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;"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;"permissive"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"compatible_with_use_case"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;true&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;"input"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"GPL-3.0-only"&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;"strong_copyleft"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"compatible_with_use_case"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"conflicts"&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;"licenses"&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;"GPL-3.0-only"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"reason"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"GPL-3.0-only is strong copyleft — requires distributing your source code under the same license. Incompatible with proprietary commercial distribution."&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"severity"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"error"&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;"summary"&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 compatibility conflict(s) found for commercial use. Strong copyleft licenses detected."&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;It covers 30+ SPDX licenses and knows the specific compatibility rules that trip people up — GPL-2.0 and GPL-3.0 are mutually incompatible unless "or-later" is used, Apache-2.0 conflicts with GPL-2.0-only, and AGPL in any dependency makes your entire SaaS project AGPL-bound. Purely algorithmic, 8ms response time.&lt;/p&gt;

&lt;p&gt;The &lt;code&gt;dependency-risk-check&lt;/code&gt; solution chains both: security audit plus license compatibility in a single call for €0.25.&lt;/p&gt;

&lt;h2&gt;
  
  
  How it works under the hood
&lt;/h2&gt;

&lt;p&gt;The security audit makes four parallel requests. OSV.dev gets queried with the specific package version and ecosystem to find known vulnerabilities. deps.dev provides the license, dependency count, and a link to the source repository. If that repository is on GitHub, a second deps.dev call fetches the OpenSSF Scorecard — an automated assessment of 18 security practices including branch protection, code review, dependency update tooling, and fuzzing coverage. The registry API supplies freshness and deprecation data.&lt;/p&gt;

&lt;p&gt;Penalties are applied to a starting score of 100: critical CVEs cost 25 points each, deprecated packages lose 20, packages not updated in over two years lose 20, and missing licenses lose 15. The floor is zero. If any upstream source is temporarily unavailable, the remaining sources still produce a partial score rather than failing the entire call.&lt;/p&gt;

&lt;p&gt;Every response includes provenance metadata — which sources were queried and when — so the agent or human reviewing the decision can trace where the data came from.&lt;/p&gt;

&lt;h2&gt;
  
  
  For agent builders
&lt;/h2&gt;

&lt;p&gt;The practical use case is making &lt;code&gt;npm install&lt;/code&gt; or &lt;code&gt;pip install&lt;/code&gt; a decision an agent can make autonomously. With Strale's MCP server, a coding agent can check any package before adding it — no configuration, no API keys to manage beyond the Strale key.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npx strale-mcp
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Any MCP-compatible client (Claude Code, Cursor, Windsurf, or anything else speaking the protocol) can call &lt;code&gt;package-security-audit&lt;/code&gt; directly. The agent gets back structured JSON it can reason over: a numeric risk score, specific vulnerabilities with fix versions, and a clear compatible/incompatible verdict on licensing. That's enough to make an autonomous yes/no decision, or to surface a warning to the developer when the score is marginal.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;package-security-audit&lt;/code&gt; costs €0.15 per call. &lt;code&gt;license-compatibility-check&lt;/code&gt; costs €0.05. That's cheap enough to check every dependency in a typical lockfile for under €10.&lt;/p&gt;

&lt;p&gt;Both capabilities are live now. The &lt;a href="https://strale.dev/docs" rel="noopener noreferrer"&gt;API docs&lt;/a&gt; have the full input/output schemas, or you can browse the &lt;a href="https://strale.dev/capabilities" rel="noopener noreferrer"&gt;capability catalog&lt;/a&gt; to see them alongside the 270+ other capabilities available. The source is at &lt;a href="https://github.com/strale-io" rel="noopener noreferrer"&gt;github.com/strale-io&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>security</category>
      <category>opensource</category>
      <category>ai</category>
      <category>devtools</category>
    </item>
    <item>
      <title>I Scanned 10 Developer Tools for AI Agent-Readiness. Only One Passed.</title>
      <dc:creator>Petter_Strale</dc:creator>
      <pubDate>Wed, 01 Apr 2026 19:52:37 +0000</pubDate>
      <link>https://dev.to/petter-strale/i-scanned-10-developer-tools-for-ai-agent-readiness-only-one-passed-1olg</link>
      <guid>https://dev.to/petter-strale/i-scanned-10-developer-tools-for-ai-agent-readiness-only-one-passed-1olg</guid>
      <description>&lt;p&gt;Everyone's building AI agents. Nobody's building for them.&lt;/p&gt;

&lt;p&gt;I've been working on agent integrations and kept running into the same problem: when we say "AI agents can use APIs," how many developer tools are actually set up for an agent to discover and interact with autonomously?&lt;/p&gt;

&lt;p&gt;So I ran an agent-readiness audit on 10 well-known developer tools. The scanner checks 32 signals across 6 categories:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Discoverability&lt;/strong&gt; — can agents find you?&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Comprehension&lt;/strong&gt; — can agents understand your API?&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Usability&lt;/strong&gt; — can agents interact with you?&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Stability&lt;/strong&gt; — can agents depend on you?&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Agent Experience&lt;/strong&gt; — what happens when an agent shows up?&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Transactability&lt;/strong&gt; — can agents do business with you?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Each category gets a tier: Ready, Partial, or Not Ready. To "pass," a tool needs at least half its categories at Ready.&lt;/p&gt;

&lt;p&gt;One tool passed. Nine didn't.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Results
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Resend — 4/6 Ready ✅
&lt;/h3&gt;

&lt;p&gt;The clear winner, and it wasn't close. Resend has an MCP endpoint at &lt;code&gt;/.well-known/mcp.json&lt;/code&gt;, a public OpenAPI spec with 39 fully documented endpoints, Schema.org structured data on the homepage, and returns proper JSON errors with consistent structure.&lt;/p&gt;

&lt;p&gt;This is what agent-readiness actually looks like: an agent can discover the API through protocol-based discovery (MCP), understand the full API surface through machine-readable specs (OpenAPI), and verify what the product does through structured data. No human intervention required at any step.&lt;/p&gt;

&lt;h3&gt;
  
  
  Stripe — 1/6 Ready (Stability)
&lt;/h3&gt;

&lt;p&gt;The most surprising result on the list. Stripe literally invented the Agentic Commerce Protocol. They have a proper &lt;code&gt;llms.txt&lt;/code&gt; file. They are, arguably, the most developer-friendly API on the internet.&lt;/p&gt;

&lt;p&gt;But: no OpenAPI spec at standard discoverable paths, no MCP endpoint, no &lt;code&gt;/.well-known/agent.json&lt;/code&gt;. Agent Experience scored Red. An agent hitting Stripe's &lt;code&gt;/api&lt;/code&gt; endpoint gets an HTML page, not a machine-readable spec.&lt;/p&gt;

&lt;p&gt;The company building the future of agent payments isn't agent-ready itself.&lt;/p&gt;

&lt;h3&gt;
  
  
  Vercel — 1/6 Ready (Stability)
&lt;/h3&gt;

&lt;p&gt;Good fundamentals — changelog, status page, proper security headers. But the OpenAPI spec is behind a login wall, and there's no MCP endpoint. An agent would find the documentation but couldn't machine-read the API surface without authenticating first.&lt;/p&gt;

&lt;h3&gt;
  
  
  Postmark — 1/6 Ready (Discoverability)
&lt;/h3&gt;

&lt;p&gt;Has structured data and &lt;code&gt;llms.txt&lt;/code&gt;, which is already more than most. But the scanner got rate-limited (429) on half its checks — the pricing page, signup page, and several API paths all returned "Too Many Requests."&lt;/p&gt;

&lt;p&gt;This is actually an interesting finding in itself: aggressive rate limiting without rate-limit headers means agents get blocked with no way to self-throttle. If your rate limiter doesn't include &lt;code&gt;Retry-After&lt;/code&gt; or &lt;code&gt;X-RateLimit-*&lt;/code&gt; headers, you're not just blocking abuse — you're blocking legitimate agent discovery.&lt;/p&gt;

&lt;h3&gt;
  
  
  Clerk — 0/6 Ready
&lt;/h3&gt;

&lt;p&gt;Has an impressive 2,395-line &lt;code&gt;llms.txt&lt;/code&gt; — more content than most tools' entire documentation. But no OpenAPI spec at discoverable paths, no MCP, and the Terms of Service appear to prohibit automated access.&lt;/p&gt;

&lt;p&gt;All that content investment is invisible to protocol-based agent discovery.&lt;/p&gt;

&lt;h3&gt;
  
  
  Neon — 0/6 Ready
&lt;/h3&gt;

&lt;p&gt;The &lt;code&gt;llms-full.txt&lt;/code&gt; is 32,588 lines — by far the largest in the set. But Comprehension scored Red because there's no OpenAPI spec at discoverable paths, and no structured data on the homepage.&lt;/p&gt;

&lt;p&gt;This is the clearest example of a pattern I kept seeing: heavy investment in LLM-readable content while missing the machine-readable infrastructure that agents actually use for discovery.&lt;/p&gt;

&lt;h3&gt;
  
  
  Supabase — 0/6 Ready
&lt;/h3&gt;

&lt;p&gt;This one genuinely surprised me. Supabase has an MCP server — I use it daily. But &lt;code&gt;/.well-known/mcp.json&lt;/code&gt; returns 404. No structured data, no OpenAPI spec at standard paths, &lt;code&gt;llms.txt&lt;/code&gt; exists but was flagged as basic. Discoverability scored Red.&lt;/p&gt;

&lt;p&gt;The tools are there, but the front door isn't wired up for autonomous discovery. An agent using MCP protocol-based discovery would never find Supabase's MCP server.&lt;/p&gt;

&lt;h3&gt;
  
  
  Plaid — 0/6 Ready
&lt;/h3&gt;

&lt;p&gt;Documentation is good, sandbox is available, but no MCP, no OpenAPI at standard paths. Pricing is behind a table with no structured data. An agent comparing fintech APIs programmatically wouldn't be able to include Plaid in its evaluation.&lt;/p&gt;

&lt;h3&gt;
  
  
  Twilio — 0/6 Ready
&lt;/h3&gt;

&lt;p&gt;Both Discoverability and Agent Experience scored Red. The &lt;code&gt;llms.txt&lt;/code&gt; exists but was too large to parse (body truncated). No MCP, no OpenAPI at discoverable paths. For a company that's been API-first for 15+ years, the agent layer is essentially absent.&lt;/p&gt;

&lt;h3&gt;
  
  
  SendGrid — 0/6 Ready
&lt;/h3&gt;

&lt;p&gt;Inherits Twilio's infrastructure (it's a Twilio product now), so same limitations. The &lt;code&gt;openapi.json&lt;/code&gt; path returns an HTML page instead of JSON — which is a particularly frustrating failure mode for an agent expecting structured data.&lt;/p&gt;




&lt;h2&gt;
  
  
  What the Data Actually Shows
&lt;/h2&gt;

&lt;p&gt;The gap isn't API quality. Every tool on this list has APIs that developers love. The gap is in the discovery and machine-readability layer — the difference between "a developer can read our docs" and "an agent can programmatically find, evaluate, and start using our API."&lt;/p&gt;

&lt;p&gt;Three specific findings stood out:&lt;/p&gt;

&lt;h3&gt;
  
  
  Almost nobody has &lt;code&gt;/.well-known/mcp.json&lt;/code&gt;
&lt;/h3&gt;

&lt;p&gt;Only Resend. This is the standard path for MCP protocol-based discovery — how an agent using MCP finds your server endpoint. Without it, your MCP server might exist, but agents following the protocol can't discover it.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;code&gt;llms.txt&lt;/code&gt; adoption is strong — but insufficient
&lt;/h3&gt;

&lt;p&gt;8 out of 10 tools had an &lt;code&gt;llms.txt&lt;/code&gt; file. That's encouraging adoption. But &lt;code&gt;llms.txt&lt;/code&gt; solves a different problem than agent discovery. It helps LLMs understand what your product does. It doesn't help an agent using MCP or A2A protocol-based discovery find your API.&lt;/p&gt;

&lt;p&gt;An agent browsing &lt;code&gt;/.well-known/mcp.json&lt;/code&gt; endpoints won't read your &lt;code&gt;llms.txt&lt;/code&gt;. Different protocols, different discovery mechanisms.&lt;/p&gt;

&lt;h3&gt;
  
  
  Size of &lt;code&gt;llms.txt&lt;/code&gt; doesn't correlate with readiness
&lt;/h3&gt;

&lt;p&gt;This was the most counterintuitive finding. Neon's 32,588-line file didn't help because the structured infrastructure around it was missing. Resend's much smaller file worked because it had OpenAPI, MCP, and structured data backing it up.&lt;/p&gt;

&lt;p&gt;The lesson: &lt;code&gt;llms.txt&lt;/code&gt; is valuable when it sits on top of solid machine-readable infrastructure. It's not valuable as a replacement for that infrastructure.&lt;/p&gt;




&lt;h2&gt;
  
  
  What This Means for Builders
&lt;/h2&gt;

&lt;p&gt;If you're building agents that need to autonomously discover and evaluate APIs, you're going to hit walls everywhere. The infrastructure layer that MCP, A2A, and x402 assume — machine-readable discovery, structured pricing, programmatic auth documentation — barely exists yet.&lt;/p&gt;

&lt;p&gt;Build your agents to handle graceful degradation, because most APIs are still built for human developers browsing documentation pages, not autonomous agents making programmatic decisions.&lt;/p&gt;

&lt;p&gt;And if you're building an API: the bar for agent-readiness is lower than you think. Resend passed with straightforward infrastructure — a public OpenAPI spec, an MCP endpoint at the standard path, and structured data on the homepage. No exotic technology. Just the basics, done correctly.&lt;/p&gt;




&lt;p&gt;The scanner is free at &lt;a href="https://scan.strale.io" rel="noopener noreferrer"&gt;scan.strale.io&lt;/a&gt; if you want to check your own stack. Happy to share the full JSON scan reports for any of these tools — just ask in the comments.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>webdev</category>
      <category>api</category>
      <category>mcp</category>
    </item>
    <item>
      <title>Your DeFi Agent Can Read the Blockchain. It Can't Read a Sanctions List.</title>
      <dc:creator>Petter_Strale</dc:creator>
      <pubDate>Mon, 30 Mar 2026 10:16:52 +0000</pubDate>
      <link>https://dev.to/petter-strale/your-defi-agent-can-read-the-blockchain-it-cant-read-a-sanctions-list-2fe6</link>
      <guid>https://dev.to/petter-strale/your-defi-agent-can-read-the-blockchain-it-cant-read-a-sanctions-list-2fe6</guid>
      <description>&lt;p&gt;Your DeFi agent reads on-chain data all day. Balances, transactions, contract code, TVL, gas prices — everything the blockchain makes public. It can tell you that wallet &lt;code&gt;0xd8dA...96045&lt;/code&gt; holds 3,400 ETH, made 1,247 transactions, and first transacted in 2015.&lt;/p&gt;

&lt;p&gt;What it can't tell you: whether the entity behind that wallet is sanctioned. Whether they're a politically exposed person. Whether there's fraud coverage in the press. Whether the exchange they're using is actually licensed under EU MiCA.&lt;/p&gt;

&lt;p&gt;None of that lives on the blockchain. And as of 2025, regulators expect you to check.&lt;/p&gt;

&lt;h2&gt;
  
  
  The gap is real
&lt;/h2&gt;

&lt;p&gt;Here's what on-chain data gives you:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Wallet balances and token holdings&lt;/li&gt;
&lt;li&gt;Transaction history&lt;/li&gt;
&lt;li&gt;Smart contract source code&lt;/li&gt;
&lt;li&gt;TVL, liquidity pools, gas prices&lt;/li&gt;
&lt;li&gt;Token prices, DEX volumes&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;And here's what you need for compliance that the blockchain doesn't have:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Sanctions screening&lt;/strong&gt; — is this entity on OFAC, EU, or UN lists?&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Entity identity&lt;/strong&gt; — who is the person or company behind this wallet?&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;VASP licensing&lt;/strong&gt; — is this exchange authorized under MiCA?&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;PEP screening&lt;/strong&gt; — is the counterparty politically exposed?&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Adverse media&lt;/strong&gt; — any fraud reports, lawsuits, or investigations?&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Domain trust&lt;/strong&gt; — is the project website legitimate or a phishing clone?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If your agent is making financial decisions — swapping tokens, depositing into protocols, evaluating counterparties — it's operating blind on half the risk picture.&lt;/p&gt;

&lt;h2&gt;
  
  
  Bridging the gap: wallet to compliance in one call
&lt;/h2&gt;

&lt;p&gt;We built 17 capabilities specifically for this problem. They're all available via x402 (pay per call with USDC on Base) or via standard API key.&lt;/p&gt;

&lt;p&gt;Here's the pipeline that chains on-chain identity with off-chain compliance:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Step 1: Who is behind this wallet?&lt;/span&gt;
curl &lt;span class="nt"&gt;-X&lt;/span&gt; POST https://api.strale.io/v1/do &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-H&lt;/span&gt; &lt;span class="s2"&gt;"Content-Type: application/json"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-d&lt;/span&gt; &lt;span class="s1"&gt;'{
    "capability_slug": "ens-reverse-lookup",
    "inputs": {"address": "0xd8dA6BF26964aF9D7eEd9e03E53415D37aA96045"}
  }'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Response:&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;"address"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"0xd8dA6BF26964aF9D7eEd9e03E53415D37aA96045"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"has_ens"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"ens_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;"vitalik.eth"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"verified"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;true&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;Now you have a name. Chain it:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Step 2: Is this entity sanctioned?&lt;/span&gt;
curl &lt;span class="nt"&gt;-X&lt;/span&gt; POST https://api.strale.io/v1/do &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-H&lt;/span&gt; &lt;span class="s2"&gt;"Content-Type: application/json"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-d&lt;/span&gt; &lt;span class="s1"&gt;'{
    "capability_slug": "sanctions-check",
    "inputs": {"name": "Vitalik Buterin"}
  }'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Step 3: Is this wallet flagged for fraud?&lt;/span&gt;
curl &lt;span class="nt"&gt;-X&lt;/span&gt; POST https://api.strale.io/v1/do &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-H&lt;/span&gt; &lt;span class="s2"&gt;"Content-Type: application/json"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-d&lt;/span&gt; &lt;span class="s1"&gt;'{
    "capability_slug": "wallet-risk-score",
    "inputs": {"address": "0xd8dA6BF26964aF9D7eEd9e03E53415D37aA96045"}
  }'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Response:&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;"address"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"0xd8dA6BF26964aF9D7eEd9e03E53415D37aA96045"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"risk_level"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"low"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"is_malicious"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"risk_labels"&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;Or skip the individual calls and run the whole pipeline as a single solution:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Full counterparty due diligence — one call&lt;/span&gt;
curl &lt;span class="nt"&gt;-X&lt;/span&gt; POST https://api.strale.io/v1/do &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-H&lt;/span&gt; &lt;span class="s2"&gt;"Content-Type: application/json"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-d&lt;/span&gt; &lt;span class="s1"&gt;'{
    "capability_slug": "web3-counterparty-dd",
    "inputs": {
      "wallet_address": "0xd8dA6BF26964aF9D7eEd9e03E53415D37aA96045",
      "entity_name": "Vitalik Buterin"
    }
  }'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That single call runs: wallet risk score → wallet age check → ENS reverse lookup → sanctions screening → PEP check → adverse media scan. Six capabilities, one response, $0.12.&lt;/p&gt;

&lt;h2&gt;
  
  
  The 17 capabilities
&lt;/h2&gt;

&lt;p&gt;All quality-scored. All continuously tested.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Wallet security:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;wallet-risk-score&lt;/code&gt; — fraud labels, phishing, money laundering flags (GoPlus, 30+ chains)&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;approval-security-check&lt;/code&gt; — risky unlimited token approvals&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;wallet-age-check&lt;/code&gt; — first transaction date, age in days&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;wallet-balance-lookup&lt;/code&gt; — native + ERC-20 balances&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;wallet-transactions-lookup&lt;/code&gt; — recent transaction history&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Token and contract safety:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;token-security-check&lt;/code&gt; — honeypot, sell tax, hidden ownership, mint functions (GoPlus)&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;contract-verify-check&lt;/code&gt; — source code verified on Etherscan?&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;phishing-site-check&lt;/code&gt; — known phishing URLs and cloned dApp frontends&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;DeFi intelligence:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;protocol-tvl-lookup&lt;/code&gt; — TVL, chains, audits, category (DeFi Llama)&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;protocol-fees-lookup&lt;/code&gt; — 24h/7d/30d fees and revenue&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;stablecoin-flow-check&lt;/code&gt; — stablecoin supply per chain&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;fear-greed-index&lt;/code&gt; — market sentiment 0-100&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;gas-price-check&lt;/code&gt; — safe/proposed/fast gas in Gwei&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Identity and compliance:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;ens-resolve&lt;/code&gt; — ENS name → wallet address&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;ens-reverse-lookup&lt;/code&gt; — wallet address → ENS name (verified)&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;vasp-verify&lt;/code&gt; — check ESMA's MiCA register of authorized CASPs&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;vasp-non-compliant-check&lt;/code&gt; — check ESMA's non-compliant entity list&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Pre-built solutions
&lt;/h2&gt;

&lt;p&gt;If you don't want to chain individual capabilities, there are 9 pre-built solutions that bundle them into single calls:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Solution&lt;/th&gt;
&lt;th&gt;What it does&lt;/th&gt;
&lt;th&gt;Price&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;web3-counterparty-dd&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Wallet risk + age + ENS + sanctions + PEP + adverse media&lt;/td&gt;
&lt;td&gt;$0.12&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;web3-pre-tx-gate&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Go/no-go middleware for DeFi agents&lt;/td&gt;
&lt;td&gt;$0.12&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;web3-vasp-check&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Is this exchange MiCA-licensed?&lt;/td&gt;
&lt;td&gt;$0.08&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;web3-pre-trade&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Price + security + TVL + sentiment + gas&lt;/td&gt;
&lt;td&gt;$0.08&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;web3-wallet-identity&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;ENS + risk + age + balance&lt;/td&gt;
&lt;td&gt;$0.08&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;web3-token-safety&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Honeypot + deployer risk + domain reputation&lt;/td&gt;
&lt;td&gt;$0.05&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;web3-dapp-trust&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Phishing detection + domain intelligence&lt;/td&gt;
&lt;td&gt;$0.05&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;web3-protocol-health&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;TVL + fees + stablecoins + domain trust&lt;/td&gt;
&lt;td&gt;$0.05&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;web3-wallet-snapshot&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Balance + transactions + age + ENS + price&lt;/td&gt;
&lt;td&gt;$0.05&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  Why this matters under MiCA
&lt;/h2&gt;

&lt;p&gt;The EU's Markets in Crypto-Assets regulation requires all crypto-asset service providers to be licensed by July 2026. That means compliance checks on counterparties aren't optional for any agent operating in the EU market.&lt;/p&gt;

&lt;p&gt;The &lt;code&gt;vasp-verify&lt;/code&gt; capability is interesting here — it checks ESMA's official register of authorized CASPs. Nobody else offers this data via API, let alone via x402 micropayments. An agent can verify in one call whether a crypto exchange or custody provider is actually authorized.&lt;/p&gt;

&lt;h2&gt;
  
  
  Using via x402
&lt;/h2&gt;

&lt;p&gt;All capabilities are available via x402. No signup, no API key — just USDC on Base:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# This returns HTTP 402 with payment requirements&lt;/span&gt;
curl https://api.strale.io/x402/wallet-risk-score?address&lt;span class="o"&gt;=&lt;/span&gt;0xd8dA6BF26964aF9D7eEd9e03E53415D37aA96045

&lt;span class="c"&gt;# Agent pays via X-Payment header, gets results&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;344 x402-enabled endpoints. Discovery at &lt;code&gt;api.strale.io/x402/catalog&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;For standard API access, sign up at strale.dev — new accounts get €2 in free credits.&lt;/p&gt;

&lt;h2&gt;
  
  
  What this isn't
&lt;/h2&gt;

&lt;p&gt;This isn't on-chain analytics. Chainalysis, Nansen, and Glassnode do that well, at enterprise prices ($100K+/yr). This is the off-chain data layer that on-chain agents depend on — the compliance, entity, and trust data that the blockchain can't provide.&lt;/p&gt;

&lt;p&gt;Every response comes with a provenance trail and a quality score (SQS), computed from automated testing across correctness, schema compliance, error handling, and edge cases. You're not calling an untested endpoint.&lt;/p&gt;

&lt;p&gt;273 capabilities total. 97 solutions. Built in Sweden.&lt;/p&gt;

</description>
      <category>web3</category>
      <category>defi</category>
      <category>agents</category>
      <category>compliance</category>
    </item>
    <item>
      <title>Why Your AI Agent Keeps Failing in Production (And It's Not Your Code)</title>
      <dc:creator>Petter_Strale</dc:creator>
      <pubDate>Sat, 28 Mar 2026 12:23:29 +0000</pubDate>
      <link>https://dev.to/petter-strale/why-your-ai-agent-keeps-failing-in-production-and-its-not-your-code-22hb</link>
      <guid>https://dev.to/petter-strale/why-your-ai-agent-keeps-failing-in-production-and-its-not-your-code-22hb</guid>
      <description>&lt;p&gt;You ship an AI agent to production. It works perfectly in development. Three days later, at 2am, it silently starts returning garbage data. Your users are affected before you even know there's a problem.&lt;/p&gt;

&lt;p&gt;This is not a model problem. It's a capability problem — and almost no one is talking about it.&lt;/p&gt;

&lt;h2&gt;
  
  
  The part of agent development nobody warns you about
&lt;/h2&gt;

&lt;p&gt;When you build an AI agent, you focus on the model — the prompts, the reasoning chain, the output format. This makes sense. The model is where the magic is.&lt;/p&gt;

&lt;p&gt;But in production, agents don't just reason. They act. They call tools, fetch data, validate information, and make decisions based on what those tools return. And those tools are connected to external services — APIs, registries, databases — that are entirely outside your control.&lt;/p&gt;

&lt;p&gt;Here's the failure taxonomy that will eventually hit every agent in production:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Silent upstream failures.&lt;/strong&gt; The company registry API your KYB agent depends on starts returning malformed responses. The model doesn't know this. It reasons confidently on bad data.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Schema drift.&lt;/strong&gt; An external API you depend on changes its response format. Your agent keeps calling it. The data comes back, just different. Depending on how you handle this, you either get silent errors or an agent that produces outputs based on a field that no longer exists.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Latency spikes.&lt;/strong&gt; The API your agent calls has a bad hour. Calls time out. Your agent either fails hard (if you handle it well) or hangs (if you don't).&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Conditional availability.&lt;/strong&gt; Some data sources work fine in Western Europe but time out consistently from US infrastructure. Your agent worked in testing. It breaks in production for a specific user segment.&lt;/p&gt;

&lt;h2&gt;
  
  
  The uncomfortable math
&lt;/h2&gt;

&lt;p&gt;If your agent pipeline calls 5 external capabilities, and each has 99% uptime, your composite reliability is 0.99^5 = 95.1%. That's one failure every 20 calls — before you've written a single bug.&lt;/p&gt;

&lt;p&gt;At 10 capabilities: 90.4%. One failure every 10 calls.&lt;/p&gt;

&lt;p&gt;This is just uptime. It doesn't account for schema drift, latency degradation, or partial failures (the API responds, but with stale or incorrect data).&lt;/p&gt;

&lt;p&gt;The multi-step agentic pipelines people are building today compound this problem significantly. Every hop adds a new failure surface.&lt;/p&gt;

&lt;h2&gt;
  
  
  What actually needs to happen
&lt;/h2&gt;

&lt;p&gt;The model quality problem in AI agents is mostly solved — or at least actively being worked on. The capability quality problem is not.&lt;/p&gt;

&lt;p&gt;What "solved" looks like:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Continuous testing against known-answer fixtures.&lt;/strong&gt; Not just "does the API respond" but "does it return the right answer." A sanctions check that returns 200 OK on a known-flagged entity has a bug. This requires ground truth data and a test suite that runs on a schedule, not just at deploy time.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Separate quality profiles for code and data.&lt;/strong&gt; A capability can have excellent code — good error handling, correct schema, fast execution — but depend on a data source that's stale, incomplete, or geographically inconsistent. These are different failure modes and need different remediation strategies.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Upstream awareness.&lt;/strong&gt; When a capability fails, the failure classification matters. "Our code threw an exception" is different from "the upstream service returned 503" is different from "the upstream service returned 200 with an error buried in the response body." An agent that knows the difference can make better recovery decisions.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Execution guidance.&lt;/strong&gt; Rather than a binary "works / doesn't work" quality signal, what agents actually need is: "here's the confidence level, here's the current reliability profile, here's whether you should proceed or fall back."&lt;/p&gt;

&lt;h2&gt;
  
  
  The MCP angle
&lt;/h2&gt;

&lt;p&gt;MCP has made capability discovery dramatically easier. Registries like Smithery and mcp.so are indexing thousands of servers. This is genuinely useful.&lt;/p&gt;

&lt;p&gt;But discovery and quality are different problems. A registry tells you a server exists and has a description. It doesn't tell you whether it's reliable enough for a production pipeline, what its upstream dependencies are, or how it behaves under the error conditions that matter.&lt;/p&gt;

&lt;p&gt;This gap will close — it has to. As agents move from demos to production, the question "can I trust this capability enough to act on its output" becomes the blocking question. Quality signals will become a first-class part of capability metadata, not an afterthought.&lt;/p&gt;

&lt;h2&gt;
  
  
  What you can do now
&lt;/h2&gt;

&lt;p&gt;If you're shipping agents to production today:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Test your critical capabilities against ground truth.&lt;/strong&gt; Pick the 5 capabilities your agent depends on most. Find a known-good input/output pair for each. Run that test on a schedule — daily at minimum, hourly if the capability is critical.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Build in upstream failure detection.&lt;/strong&gt; When a capability returns an unexpected response, classify the failure before retrying. Blind retries on an upstream outage make things worse.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Track capability-specific latency separately from model latency.&lt;/strong&gt; When something is slow, knowing whether it's the model or the tool call is the difference between a model config change and an API support ticket.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Use capability quality scores where they exist.&lt;/strong&gt; Some capability platforms now publish quality metadata — test coverage, reliability profiles, historical uptime. Use this signal when choosing which capabilities to route through.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Plan for graceful degradation.&lt;/strong&gt; For every critical capability in your pipeline: what does the agent do if this call fails? "Return an error" is a valid answer. "Silently continue with missing data" is not.&lt;/p&gt;

&lt;h2&gt;
  
  
  The longer arc
&lt;/h2&gt;

&lt;p&gt;The agent economy is real and it's moving fast. But the infrastructure assumptions behind it — that capabilities are reliable, that data is accurate, that tools behave consistently — are not yet guaranteed.&lt;/p&gt;

&lt;p&gt;The teams that figure out capability quality now will have a significant advantage as pipelines get longer and more autonomous. The failure modes don't get simpler as agents become more capable. They get more consequential.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Strale is a capability marketplace for AI agents — 250+ independently tested capabilities across 27 countries, with Quality and Reliability profiles on every capability. Built to give agents a trust layer, not just a tool layer. &lt;a href="https://strale.dev" rel="noopener noreferrer"&gt;strale.dev&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>agents</category>
      <category>mcp</category>
      <category>devops</category>
    </item>
    <item>
      <title>Give Your LangChain or CrewAI Agent 250+ Data Capabilities in 3 Lines of Code</title>
      <dc:creator>Petter_Strale</dc:creator>
      <pubDate>Thu, 26 Mar 2026 15:06:48 +0000</pubDate>
      <link>https://dev.to/petter-strale/give-your-langchain-or-crewai-agent-250-data-capabilities-in-3-lines-of-code-552n</link>
      <guid>https://dev.to/petter-strale/give-your-langchain-or-crewai-agent-250-data-capabilities-in-3-lines-of-code-552n</guid>
      <description>&lt;p&gt;Building an AI agent is the easy part. Getting it reliable data is the hard part.&lt;/p&gt;

&lt;p&gt;Your agent can reason brilliantly, but at some point it needs to validate an IBAN, look up a VAT number, check a company's beneficial ownership, or pull a business registry entry. Every one of those data sources has its own API, its own auth, its own error handling, its own schema. Before you know it you've spent a week plumbing data integrations instead of building the thing you actually set out to build.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;langchain-strale&lt;/code&gt; and &lt;code&gt;crewai-strale&lt;/code&gt; solve this. They give your agent instant access to 250+ tested data capabilities — company registries, compliance checks, financial data, web extraction, and more — with a single import.&lt;/p&gt;

&lt;h2&gt;
  
  
  Install
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# For LangChain agents&lt;/span&gt;
pip &lt;span class="nb"&gt;install &lt;/span&gt;langchain-strale

&lt;span class="c"&gt;# For CrewAI agents&lt;/span&gt;
pip &lt;span class="nb"&gt;install &lt;/span&gt;crewai-strale
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  The simplest case: call a capability directly
&lt;/h2&gt;

&lt;p&gt;No agent needed. Get the tools, find the one you want, call it.&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;langchain_strale&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;StraleToolkit&lt;/span&gt;

&lt;span class="n"&gt;toolkit&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;StraleToolkit&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;api_key&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;sk_live_...&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;tools&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;toolkit&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get_tools&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;

&lt;span class="c1"&gt;# Find the IBAN validator
&lt;/span&gt;&lt;span class="n"&gt;iban_tool&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;next&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;t&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;t&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;tools&lt;/span&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;t&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;name&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;iban-validate&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="n"&gt;result&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;iban_tool&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;_run&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;iban&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;GB82WEST12345698765432&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;result&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="c1"&gt;# {"valid": true, "country_code": "GB", "bank_code": "WEST", ...}
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The same pattern works for any of the 250+ capabilities — VAT validation, sanctions screening, company lookups, web scraping, and more. &lt;code&gt;iban-validate&lt;/code&gt; is free tier, so you can run this without spending any credits.&lt;/p&gt;

&lt;h2&gt;
  
  
  With a LangChain agent
&lt;/h2&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;langchain_openai&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;ChatOpenAI&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;langchain.agents&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;AgentExecutor&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;create_tool_calling_agent&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;langchain_core.prompts&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;ChatPromptTemplate&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;langchain_strale&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;StraleToolkit&lt;/span&gt;

&lt;span class="n"&gt;llm&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;ChatOpenAI&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;model&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;gpt-4o&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;prompt&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;ChatPromptTemplate&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;from_messages&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;system&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;You are a compliance analyst with access to EU business data tools.&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;human&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;{input}&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;placeholder&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;{agent_scratchpad}&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="n"&gt;toolkit&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;StraleToolkit&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;api_key&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;sk_live_...&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;tools&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;toolkit&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get_tools&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;  &lt;span class="c1"&gt;# All 250+ capabilities as LangChain BaseTool instances
&lt;/span&gt;
&lt;span class="n"&gt;agent&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;create_tool_calling_agent&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;llm&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;tools&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;prompt&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;executor&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;AgentExecutor&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;agent&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;agent&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;tools&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;tools&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="n"&gt;result&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;executor&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;invoke&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;input&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;Validate VAT number SE556703748501 and tell me what you find about the company&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
&lt;span class="p"&gt;})&lt;/span&gt;
&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;result&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;output&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  With a CrewAI agent
&lt;/h2&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;crewai&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;Agent&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;Task&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;Crew&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;crewai_strale&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;StraleToolkit&lt;/span&gt;

&lt;span class="n"&gt;toolkit&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;StraleToolkit&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;api_key&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;sk_live_...&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;tools&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;toolkit&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get_tools&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;

&lt;span class="n"&gt;analyst&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;Agent&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;role&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;EU Business Compliance Analyst&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;goal&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Validate and research European companies using official data sources&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;backstory&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Expert in EU business registries, VAT systems, and compliance data&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;tools&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;tools&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="n"&gt;task&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;Task&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;description&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Check if VAT number SE556703748501 is valid and find out what you can about the company&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;agent&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;analyst&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;expected_output&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Validation status and available company information&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="n"&gt;crew&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;Crew&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;agents&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;analyst&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="n"&gt;tasks&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;task&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;
&lt;span class="n"&gt;result&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;crew&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;kickoff&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;result&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  What's in the toolkit
&lt;/h2&gt;

&lt;p&gt;Every Strale capability becomes a tool with a name, a description (including price), and a typed input schema generated from the capability's own JSON Schema. The agent knows what each tool costs before it calls it.&lt;/p&gt;

&lt;p&gt;Some categories worth knowing about:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;EU/Nordic business data&lt;/strong&gt; — Swedish, Norwegian, Danish, Finnish company registries; VAT validation via VIES; IBAN validation; beneficial ownership lookups&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;KYC &amp;amp; compliance&lt;/strong&gt; — PEP screening, adverse media checks, sanctions screening across 27 countries&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Web extraction&lt;/strong&gt; — screenshots, structured scraping, metadata extraction, URL-to-markdown&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Financial data&lt;/strong&gt; — crypto prices, stock quotes, currency conversion, economic indicators&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Data utilities&lt;/strong&gt; — JSON repair, CSV cleaning, address parsing, phone normalization&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Two meta-tools come included in every toolkit:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;strale_search&lt;/code&gt; — describe what you need in plain English, get back matching capabilities&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;strale_balance&lt;/code&gt; — check your wallet balance from within the agent&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Filter by category
&lt;/h2&gt;

&lt;p&gt;If you don't want to expose all 250+ tools to your agent (reasonable — it can make tool selection noisier), filter by category:&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;tools&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;toolkit&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get_tools&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;categories&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;compliance&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;finance&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Quality scoring
&lt;/h2&gt;

&lt;p&gt;Every capability on Strale has a Strale Quality Score — a dual-profile score covering quality (correctness, schema compliance, error handling, edge cases) and reliability (availability, success rate, latency, upstream health). You're not calling an untested endpoint. You're calling something that's been continuously tested and scored.&lt;/p&gt;

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

&lt;p&gt;Five capabilities are completely free — no API key, no credits, no signup:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl &lt;span class="nt"&gt;-X&lt;/span&gt; POST https://api.strale.io/v1/do &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-H&lt;/span&gt; &lt;span class="s2"&gt;"Content-Type: application/json"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-d&lt;/span&gt; &lt;span class="s1"&gt;'{"capability_slug": "iban-validate", "inputs": {"iban": "GB82WEST12345698765432"}}'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;For all 250+ capabilities, sign up at &lt;a href="https://strale.dev" rel="noopener noreferrer"&gt;strale.dev&lt;/a&gt; — new accounts get €2 in free trial credits, no card required.&lt;/p&gt;

&lt;h2&gt;
  
  
  Links
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://pypi.org/project/langchain-strale/" rel="noopener noreferrer"&gt;langchain-strale on PyPI&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://pypi.org/project/crewai-strale/" rel="noopener noreferrer"&gt;crewai-strale on PyPI&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/petterlindstrom79/strale-examples" rel="noopener noreferrer"&gt;Full examples on GitHub&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://api.strale.io/v1/capabilities" rel="noopener noreferrer"&gt;Capability catalog&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://strale.dev/docs" rel="noopener noreferrer"&gt;Strale docs&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>langchain</category>
      <category>crewai</category>
      <category>agents</category>
      <category>python</category>
    </item>
    <item>
      <title>We Scored 2/6 on Our Own Agent-Readiness Scanner. Here's How We Fixed It.</title>
      <dc:creator>Petter_Strale</dc:creator>
      <pubDate>Wed, 25 Mar 2026 15:59:33 +0000</pubDate>
      <link>https://dev.to/petter-strale/we-scored-26-on-our-own-agent-readiness-scanner-heres-how-we-fixed-it-1pk2</link>
      <guid>https://dev.to/petter-strale/we-scored-26-on-our-own-agent-readiness-scanner-heres-how-we-fixed-it-1pk2</guid>
      <description>&lt;p&gt;We build Strale, an API that gives AI agents access to business data capabilities — company lookups, compliance checks, financial data, that kind of thing. Agents call &lt;code&gt;strale.do()&lt;/code&gt; at runtime and get structured, quality-scored results back.&lt;/p&gt;

&lt;p&gt;A few weeks ago we asked ourselves a question we probably should have asked sooner: if an agent tried to discover and use our own API, what would it actually experience?&lt;/p&gt;

&lt;p&gt;We didn't know. So we built a tool to find out.&lt;/p&gt;

&lt;h2&gt;
  
  
  The tool we built for ourselves
&lt;/h2&gt;

&lt;p&gt;We started with a simple internal checker — a script that hit our API the way an agent would and reported what it found. Could it find our llms.txt? Could it parse our OpenAPI spec? Did our MCP endpoint actually respond? Were our error messages machine-readable or just HTML 404 pages?&lt;/p&gt;

&lt;p&gt;The script grew. We added checks for structured data, robots.txt crawler policies, authentication documentation, rate limit headers, content negotiation, schema drift between our spec and our live responses, machine-readable pricing, and a dozen more signals. By the time we stopped adding checks, we had 32 of them across 6 categories.&lt;/p&gt;

&lt;p&gt;Then we ran it against our own API.&lt;/p&gt;

&lt;h2&gt;
  
  
  The first scan: 2/6
&lt;/h2&gt;

&lt;p&gt;We scored 2 out of 6 categories as "agent-ready." Two. On our own product — a platform specifically built for AI agents.&lt;/p&gt;

&lt;p&gt;The llms.txt file was there, and our structured data was fine. But our OpenAPI spec had drifted from our actual responses (11 fields didn't match). Our MCP server was discoverable but the functional verification test couldn't complete a handshake. We had no machine-readable pricing. Our error responses at some paths returned HTML instead of JSON. Authentication was documented in our human-readable docs but not in the OpenAPI spec where agents would look for it.&lt;/p&gt;

&lt;p&gt;We were building an agent platform that agents couldn't properly use.&lt;/p&gt;

&lt;h2&gt;
  
  
  Fixing it
&lt;/h2&gt;

&lt;p&gt;We worked through the failing checks one by one. Some were quick — adding &lt;code&gt;securitySchemes&lt;/code&gt; to our OpenAPI spec took ten minutes. Publishing JSON-LD pricing data was another fifteen. Fixing the MCP handshake was a real debugging session.&lt;/p&gt;

&lt;p&gt;The hardest part was schema drift. Our spec said one thing; our API returned another. Eleven extra fields that we'd added over time without updating the spec. No human user would notice, but an agent comparing the spec to the response would get confused.&lt;/p&gt;

&lt;p&gt;After three rounds of scanning and fixing, we got to 6/6. Every check passing. It took about two days of focused work, spread across a week.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why we made it free
&lt;/h2&gt;

&lt;p&gt;We figured other teams probably had the same blind spot. You build a great API, you write docs for humans, you set up a marketing site — and you never check what an agent actually sees when it shows up.&lt;/p&gt;

&lt;p&gt;So we put a web interface on the scanner and made it free. No signup, no paywall. You type in a URL, it runs the 32 checks, and you get a report showing exactly what passed and what didn't — with the specific HTTP requests that were made and what the responses contained.&lt;/p&gt;

&lt;p&gt;We called it Beacon. It lives at &lt;a href="https://scan.strale.io" rel="noopener noreferrer"&gt;scan.strale.io&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  What the 6 categories measure
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Discoverability&lt;/strong&gt; — Can agents find you? Checks llms.txt, robots.txt AI crawler policies, structured data, sitemap coverage, MCP/A2A endpoints.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Comprehension&lt;/strong&gt; — Can agents understand what you do? OpenAPI spec presence and accuracy, documentation accessibility, schema drift between spec and live responses, machine-readable pricing.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Usability&lt;/strong&gt; — Can agents interact with you? Authentication documentation in machine-readable formats, signup friction, sandbox availability, error response quality.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Stability&lt;/strong&gt; — Can agents depend on you? API versioning, changelogs, rate limit headers, terms of service compatibility, security headers.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Agent Experience&lt;/strong&gt; — What happens when an agent arrives? First-contact response quality, documentation navigability from the root, response format consistency.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Transactability&lt;/strong&gt; — Can agents do business with you? Machine-readable pricing, self-serve provisioning, agent-compatible checkout protocols, usage/billing transparency.&lt;/p&gt;

&lt;h2&gt;
  
  
  The thing that surprised us
&lt;/h2&gt;

&lt;p&gt;The gap between "works for humans" and "works for agents" was bigger than we expected. Our API documentation was thorough — for a person reading it in a browser. But an agent doesn't read your docs page. It looks for an OpenAPI spec. It checks &lt;code&gt;securitySchemes&lt;/code&gt;. It tries to parse your root response for navigation links. It looks for &lt;code&gt;/.well-known/mcp.json&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Most of the fixes were small. The problem wasn't that our API was bad — it was that the machine-readable layer on top was incomplete or inconsistent.&lt;/p&gt;

&lt;h2&gt;
  
  
  Three output formats
&lt;/h2&gt;

&lt;p&gt;Every scan produces a web report, a downloadable PDF, and a structured JSON report. The JSON one is designed for a specific workflow: paste it into Claude or ChatGPT and say "fix everything." The JSON includes the exact check that failed, what was tested, what was found, and a fix with a verification command.&lt;/p&gt;

&lt;h2&gt;
  
  
  MCP server
&lt;/h2&gt;

&lt;p&gt;Beacon also ships as an MCP server, which felt appropriate for an agent-readiness tool. Install it in Claude Code:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;claude mcp add strale-beacon &lt;span class="nt"&gt;--&lt;/span&gt; npx strale-beacon-mcp
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Three tools: &lt;code&gt;scan&lt;/code&gt;, &lt;code&gt;get_report&lt;/code&gt;, &lt;code&gt;list_checks&lt;/code&gt;. You can scan domains from inside your development workflow without opening a browser.&lt;/p&gt;

&lt;h2&gt;
  
  
  Try it on your own product
&lt;/h2&gt;

&lt;p&gt;We're curious what other teams find. Our guess, based on the handful of products we've scanned so far, is that most APIs score 1-2 out of 6 — even APIs that are well-built and well-documented for human consumption.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://scan.strale.io" rel="noopener noreferrer"&gt;scan.strale.io&lt;/a&gt; — takes about 10 seconds.&lt;/p&gt;

&lt;p&gt;We're actively improving Beacon and would love feedback — missing checks, confusing results, things that would make the report more useful. Drop a comment here or email &lt;a href="mailto:hello@strale.io"&gt;hello@strale.io&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>webdev</category>
      <category>api</category>
      <category>opensource</category>
    </item>
    <item>
      <title>Your x402 Agent Just Paid a Sanctioned Wallet. Now What?</title>
      <dc:creator>Petter_Strale</dc:creator>
      <pubDate>Tue, 24 Mar 2026 11:23:58 +0000</pubDate>
      <link>https://dev.to/petter-strale/your-x402-agent-just-paid-a-sanctioned-wallet-now-what-4d03</link>
      <guid>https://dev.to/petter-strale/your-x402-agent-just-paid-a-sanctioned-wallet-now-what-4d03</guid>
      <description>&lt;p&gt;The x402 ecosystem is growing fast. Agents are paying for web scraping, GPU inference, data feeds — all settled in USDC on Base with a single HTTP round-trip. No accounts, no API keys. It's elegant.&lt;/p&gt;

&lt;p&gt;But here's the uncomfortable question nobody in the ecosystem is asking yet:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Who is your agent paying?&lt;/strong&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  The Problem
&lt;/h2&gt;

&lt;p&gt;When your agent hits an x402 endpoint and sends a signed USDC transfer, it trusts the &lt;code&gt;payTo&lt;/code&gt; address in the &lt;code&gt;paymentRequirements&lt;/code&gt; response. The protocol verifies the &lt;em&gt;payment mechanics&lt;/em&gt; — signature valid, amount correct, settlement confirmed. What it doesn't verify is whether that wallet belongs to:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;A sanctioned entity on the OFAC SDN list&lt;/li&gt;
&lt;li&gt;A business operating without proper licensing&lt;/li&gt;
&lt;li&gt;A fraudulent service that will take the USDC and return garbage data&lt;/li&gt;
&lt;li&gt;A company that dissolved six months ago&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;As x402 scales from developer experiments to real agent workflows, compliance isn't optional — it's the thing that determines whether your enterprise clients can actually use agents that pay for services autonomously.&lt;/p&gt;

&lt;h2&gt;
  
  
  What Agents Need Before They Pay
&lt;/h2&gt;

&lt;p&gt;Think about what a responsible agent workflow looks like for a compliance-conscious organization:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Agent discovers x402 service → COMPLIANCE CHECK → Pay → Get data
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That middle step — the compliance check — needs to answer three questions in under a second:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Is this business legitimate?&lt;/strong&gt; (Company registration, VAT status, active/dissolved)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Is this entity sanctioned?&lt;/strong&gt; (OFAC, EU, UN sanctions lists)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Is this domain trustworthy?&lt;/strong&gt; (SSL valid, domain age, reputation signals)&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;These are exactly the checks that regulated industries already run for traditional vendor onboarding. The difference is that with x402, your agent might encounter 50 new service providers in a single workflow — and it needs to make these decisions programmatically, not through a procurement team.&lt;/p&gt;

&lt;h2&gt;
  
  
  How We Built This
&lt;/h2&gt;

&lt;p&gt;At &lt;a href="https://strale.dev" rel="noopener noreferrer"&gt;Strale&lt;/a&gt;, we've been building trust and compliance infrastructure for AI agents. We have 250+ capabilities covering company data across 27 countries, sanctions screening, VAT validation, domain intelligence, and more — all accessible via API, MCP server, and x402 endpoints.&lt;/p&gt;

&lt;p&gt;Here's what a pre-payment compliance check looks like using our x402 endpoint:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Before paying an unfamiliar x402 service, check the domain&lt;/span&gt;
curl https://api.strale.io/x402/ssl-check &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-H&lt;/span&gt; &lt;span class="s2"&gt;"Content-Type: application/json"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-H&lt;/span&gt; &lt;span class="s2"&gt;"X-PAYMENT: &amp;lt;signed-usdc-payload&amp;gt;"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-d&lt;/span&gt; &lt;span class="s1"&gt;'{"domain": "suspicious-api.xyz"}'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Or run a sanctions screen on the entity behind the wallet:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl https://api.strale.io/x402/sanctions-check &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-H&lt;/span&gt; &lt;span class="s2"&gt;"Content-Type: application/json"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-H&lt;/span&gt; &lt;span class="s2"&gt;"X-PAYMENT: &amp;lt;signed-usdc-payload&amp;gt;"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-d&lt;/span&gt; &lt;span class="s1"&gt;'{"name": "Acme Data Corp", "country": "RU"}'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Both endpoints are x402-native: your agent pays $0.01–$0.02 in USDC on Base per check. No API key, no account, no subscription — the same model the rest of the x402 ecosystem uses.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Bigger Picture
&lt;/h2&gt;

&lt;p&gt;The x402 ecosystem has web scrapers, GPU providers, data feeds, and analytics APIs. What it's missing is the compliance layer that sits &lt;em&gt;between&lt;/em&gt; discovery and payment.&lt;/p&gt;

&lt;p&gt;This is especially relevant for:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Fintech agents&lt;/strong&gt; processing cross-border payments (need sanctions + VAT checks)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;KYB workflows&lt;/strong&gt; where an agent verifies a business counterparty before transacting&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Agent-to-agent trust&lt;/strong&gt; — before Agent A pays Agent B for a service, it should verify Agent B's operator is a real, non-sanctioned entity&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;EU-regulated businesses&lt;/strong&gt; that need audit trails for every autonomous transaction their agents make&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  What's Live
&lt;/h2&gt;

&lt;p&gt;We currently have four x402-gated endpoints on Base mainnet:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Endpoint&lt;/th&gt;
&lt;th&gt;What it does&lt;/th&gt;
&lt;th&gt;Price&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;iban-validate&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Validate IBAN structure + extract bank codes&lt;/td&gt;
&lt;td&gt;$0.01&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;vat-format-validate&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Verify EU VAT number format&lt;/td&gt;
&lt;td&gt;$0.01&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;ssl-check&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Check SSL certificate, expiry, chain validity&lt;/td&gt;
&lt;td&gt;$0.01&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;sanctions-check&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Screen against OFAC, EU, UN sanctions lists&lt;/td&gt;
&lt;td&gt;$0.02&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;These are the first four of our 250+ capabilities exposed via x402. The full catalog — company data for 27 countries, domain reputation, financial validation, regulatory lookups — is available via our &lt;a href="https://www.npmjs.com/package/strale-mcp" rel="noopener noreferrer"&gt;MCP server&lt;/a&gt; and &lt;a href="https://strale.dev/docs" rel="noopener noreferrer"&gt;direct API&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Try It
&lt;/h2&gt;

&lt;p&gt;Hit any endpoint with a GET request to see the payment requirements:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl https://api.strale.io/x402/iban-validate
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;You'll get a standard x402 &lt;code&gt;402 Payment Required&lt;/code&gt; response with &lt;code&gt;paymentRequirements&lt;/code&gt; — scheme, network, amount, payTo address. Standard x402 flow from there.&lt;/p&gt;

&lt;p&gt;Full docs: &lt;a href="https://strale.dev" rel="noopener noreferrer"&gt;strale.dev&lt;/a&gt;&lt;br&gt;
MCP server: &lt;code&gt;npm install strale-mcp&lt;/code&gt;&lt;br&gt;
API: &lt;a href="https://api.strale.io" rel="noopener noreferrer"&gt;api.strale.io&lt;/a&gt;&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Strale provides trust and quality infrastructure for AI agents. 250+ capabilities, 27 countries, independently tested with the Strale Quality Score (SQS). Learn more at &lt;a href="https://strale.dev" rel="noopener noreferrer"&gt;strale.dev&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>x402</category>
      <category>ai</category>
      <category>crypto</category>
      <category>webdev</category>
    </item>
    <item>
      <title>We Built an x402 Gateway — Here's What We Learned</title>
      <dc:creator>Petter_Strale</dc:creator>
      <pubDate>Sat, 21 Mar 2026 14:56:59 +0000</pubDate>
      <link>https://dev.to/petter-strale/we-built-an-x402-gateway-heres-what-we-learned-2kg0</link>
      <guid>https://dev.to/petter-strale/we-built-an-x402-gateway-heres-what-we-learned-2kg0</guid>
      <description>&lt;p&gt;This week, x402 had its biggest week yet. World launched AgentKit to give AI agents human-backed identity via x402. AWS published a full reference architecture for agentic payments on x402. Jensen Huang's GTC remarks sent AI agent tokens surging. And an academic paper (A402) proposed improvements to x402's atomicity model.&lt;/p&gt;

&lt;p&gt;Everyone is talking about x402. Very few people have actually built on it.&lt;/p&gt;

&lt;p&gt;We have. Here's what we learned.&lt;/p&gt;

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

&lt;p&gt;&lt;a href="https://strale.dev" rel="noopener noreferrer"&gt;Strale&lt;/a&gt; is a trust layer for AI agents — 256 independently tested capabilities accessible via MCP and REST API. We exposed five of those capabilities behind x402 routes so that agents with wallets can pay per request using USDC on Base, with no API key, no account, no subscription.&lt;/p&gt;

&lt;p&gt;The five capabilities behind x402 today:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;iban-validate&lt;/code&gt; — validate IBAN structure and extract bank details&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;vat-format-validate&lt;/code&gt; — check EU VAT number formatting&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;paid-api-preflight&lt;/code&gt; — verify a paid endpoint before your agent spends money&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;ssl-check&lt;/code&gt; — certificate chain validation&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;sanctions-check&lt;/code&gt; — screen names against consolidated sanctions lists&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  The handshake in practice
&lt;/h2&gt;

&lt;p&gt;The x402 flow looks elegant in spec diagrams. In practice, it's three HTTP round trips:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Request 1: The agent tries to access a resource.&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight http"&gt;&lt;code&gt;&lt;span class="err"&gt;GET /x402/iban-validate?iban=DE89370400440532013000
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Response: 402 with payment instructions.&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight http"&gt;&lt;code&gt;&lt;span class="k"&gt;HTTP&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="m"&gt;1.1&lt;/span&gt; &lt;span class="m"&gt;402&lt;/span&gt; &lt;span class="ne"&gt;Payment Required&lt;/span&gt;
&lt;span class="na"&gt;X-Payment-Required&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s"&gt;true&lt;/span&gt;
&lt;span class="na"&gt;X-Payment-Amount&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s"&gt;0.001&lt;/span&gt;
&lt;span class="na"&gt;X-Payment-Currency&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s"&gt;USDC&lt;/span&gt;
&lt;span class="na"&gt;X-Payment-Network&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s"&gt;base&lt;/span&gt;
&lt;span class="na"&gt;X-Payment-Recipient&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s"&gt;0x...&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The agent reads these headers, evaluates the cost, and decides whether to pay. This is where trust matters — more on that below.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Request 2: The agent pays on-chain and resubmits with proof.&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight http"&gt;&lt;code&gt;&lt;span class="err"&gt;GET /x402/iban-validate?iban=DE89370400440532013000
X-Payment: &amp;lt;signed payment proof&amp;gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Response: 200 with the actual data.&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"valid"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"country"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"DE"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"bank_code"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"37040044"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"bank_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;"Commerzbank"&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That's it. No API key exchange. No account creation. No subscription management. The agent discovered a service, paid for it, and got a result — all within standard HTTP.&lt;/p&gt;

&lt;h2&gt;
  
  
  What surprised us
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1. The trust gap is real
&lt;/h3&gt;

&lt;p&gt;The biggest unsolved problem in x402 isn't payments — it's trust. An agent discovers an endpoint that returns 402. How does it know the service is legitimate? That the endpoint will actually return useful data after payment? That the price is fair?&lt;/p&gt;

&lt;p&gt;Right now, there's no standard answer. This is exactly why we built &lt;code&gt;paid-api-preflight&lt;/code&gt; — a €0.02 check that validates an endpoint before your agent commits funds. It checks reachability, SSL, response time, and whether the payment handshake headers are properly formed. Returns a simple &lt;code&gt;proceed&lt;/code&gt; / &lt;code&gt;caution&lt;/code&gt; / &lt;code&gt;avoid&lt;/code&gt; recommendation.&lt;/p&gt;

&lt;p&gt;World's AgentKit announcement this week addresses the identity side of trust: proving there's a real human behind the agent. But there's an equally important question on the provider side: proving the service is worth paying for. Quality scoring, uptime history, independent test results — that's what we're building at Strale.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. Payment verification is the hard part
&lt;/h3&gt;

&lt;p&gt;Our current implementation uses a stub for payment verification — any &lt;code&gt;X-Payment&lt;/code&gt; header returns results. Getting real verification working means funding a Base wallet, integrating the &lt;code&gt;@x402/hono&lt;/code&gt; middleware, and handling on-chain settlement. The protocol spec is clean, but the operational overhead of running an on-chain payment verifier is nontrivial for a small team.&lt;/p&gt;

&lt;p&gt;We're being transparent about this because we think the ecosystem benefits from honest status reports, not just launch announcements.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. Header parsing needs to be defensive
&lt;/h3&gt;

&lt;p&gt;Different x402 implementations format the &lt;code&gt;PAYMENT-REQUIRED&lt;/code&gt; headers slightly differently. Some use the &lt;code&gt;X-Payment-*&lt;/code&gt; prefix pattern. Others embed a JSON blob in a single &lt;code&gt;WWW-Authenticate&lt;/code&gt; header. Our gateway handles both, but if you're building a client, don't assume consistency across providers yet — the spec is still solidifying.&lt;/p&gt;

&lt;h3&gt;
  
  
  4. MCP and x402 are complementary, not competing
&lt;/h3&gt;

&lt;p&gt;MCP (Model Context Protocol) gives agents a way to discover and call tools. x402 gives agents a way to pay for tools. We run both: our MCP server at &lt;code&gt;api.strale.io/mcp&lt;/code&gt; lets agents browse 256 capabilities, and our x402 routes let agents pay for a subset of them without any credentials.&lt;/p&gt;

&lt;p&gt;The developer experience we're aiming for: an agent discovers a capability via MCP, checks its quality score, runs a pre-flight check, and if everything looks good, pays via x402 and gets the result. Discovery → trust → payment → execution, all automated.&lt;/p&gt;

&lt;h2&gt;
  
  
  What's still missing in the ecosystem
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Standardized quality signals.&lt;/strong&gt; Before an agent pays, it should be able to check an endpoint's reliability score, recent uptime, and test results. We publish this data through our Trust API, but there's no ecosystem-wide standard for it yet.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Provider discovery.&lt;/strong&gt; x402scan.com is emerging as a directory, but agents need machine-readable discovery — not a website to browse. MCP catalogs are one piece. A402's proposed service channels could be another.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Dispute resolution.&lt;/strong&gt; What happens when an agent pays and the service returns garbage? x402 v2 doesn't address this. A402's paper proposes atomic service channels with TEE-assisted verification, which is interesting but adds significant complexity.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Cross-protocol interop.&lt;/strong&gt; L402 (Lightning), x402 (Base/Solana), and MPP (Stripe/Tempo) all use HTTP 402 but with different header formats and payment flows. Our &lt;code&gt;paid-api-preflight&lt;/code&gt; capability normalizes across all three, but the ecosystem would benefit from a shared discovery format.&lt;/p&gt;

&lt;h2&gt;
  
  
  Getting started
&lt;/h2&gt;

&lt;p&gt;If you want to try Strale's x402 endpoints:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# This will return 402 with payment headers&lt;/span&gt;
curl &lt;span class="nt"&gt;-i&lt;/span&gt; https://api.strale.io/x402/iban-validate?iban&lt;span class="o"&gt;=&lt;/span&gt;DE89370400440532013000
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;For MCP access (no wallet needed, uses API key billing):&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;"mcpServers"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"strale"&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;"streamableHttp"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"url"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"https://api.strale.io/mcp"&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;Search and browse are free. Execution requires an API key from &lt;a href="https://strale.dev" rel="noopener noreferrer"&gt;strale.dev&lt;/a&gt; — new accounts get €2.00 in trial credits.&lt;/p&gt;

&lt;h2&gt;
  
  
  What's next
&lt;/h2&gt;

&lt;p&gt;We're watching the x402 ecosystem closely. Our open PRs on &lt;a href="https://github.com/AgentwithX402/awesome-x402" rel="noopener noreferrer"&gt;awesome-x402&lt;/a&gt; and &lt;a href="https://x402.org" rel="noopener noreferrer"&gt;x402.org&lt;/a&gt; are awaiting review. Once real Base wallet settlement is live, we'll have one of the first independently quality-scored x402 service providers.&lt;/p&gt;

&lt;p&gt;The agentic economy needs more than payment rails. It needs trust infrastructure. Payments solve how agents pay. Trust solves whether they should.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;&lt;a href="https://strale.dev" rel="noopener noreferrer"&gt;Strale&lt;/a&gt; provides 256 independently tested data capabilities across 27 countries, each with a published quality score. Accessible via MCP and REST API.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>webdev</category>
      <category>api</category>
      <category>blockchain</category>
    </item>
    <item>
      <title>How to Verify Paid APIs Before Your AI Agent Spends Money</title>
      <dc:creator>Petter_Strale</dc:creator>
      <pubDate>Thu, 19 Mar 2026 20:26:36 +0000</pubDate>
      <link>https://dev.to/petter-strale/how-to-verify-paid-apis-before-your-ai-agent-spends-money-13ho</link>
      <guid>https://dev.to/petter-strale/how-to-verify-paid-apis-before-your-ai-agent-spends-money-13ho</guid>
      <description>&lt;p&gt;AI agents are starting to pay for API calls autonomously. Protocols like L402 (Lightning Network), x402 (Coinbase/Base), and MPP (Stripe/Tempo) let APIs charge per request using HTTP 402 — the "Payment Required" status code that's been reserved since the 1990s.&lt;/p&gt;

&lt;p&gt;But here's the problem: how does your agent know the endpoint is actually worth paying for?&lt;/p&gt;

&lt;p&gt;An endpoint might be listed in a directory. It might have been healthy yesterday. But right now, at the moment your agent is about to commit funds — is it live? Is the SSL valid? Is the payment handshake properly configured? Or is your agent about to send money into a broken endpoint?&lt;/p&gt;

&lt;h3&gt;
  
  
  The pre-flight check pattern
&lt;/h3&gt;

&lt;p&gt;Before any paid API call, run a pre-flight check. Think of it like a pilot checking instruments before takeoff — you don't skip it just because the plane flew fine yesterday.&lt;/p&gt;

&lt;p&gt;We built &lt;code&gt;paid-api-preflight&lt;/code&gt; as a &lt;a href="https://strale.dev" rel="noopener noreferrer"&gt;Strale&lt;/a&gt; capability that does exactly this. Pass it any URL, and it returns:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Whether the endpoint is reachable&lt;/li&gt;
&lt;li&gt;Response time&lt;/li&gt;
&lt;li&gt;SSL validity&lt;/li&gt;
&lt;li&gt;Which payment protocol it uses (L402, x402, MPP, or unknown)&lt;/li&gt;
&lt;li&gt;Whether the payment handshake is properly formed&lt;/li&gt;
&lt;li&gt;For x402: whether the facilitator is reachable&lt;/li&gt;
&lt;li&gt;A simple recommendation: &lt;strong&gt;proceed&lt;/strong&gt;, &lt;strong&gt;caution&lt;/strong&gt;, or &lt;strong&gt;avoid&lt;/strong&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Using it via MCP
&lt;/h3&gt;

&lt;p&gt;If your agent is connected to Strale's MCP server, the tool is already available:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"tool"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"paid-api-preflight"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"arguments"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"url"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"https://some-paid-api.com/data"&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;Response:&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;"output"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"url"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"https://some-paid-api.com/data"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"is_reachable"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;true&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_time_ms"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;180&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"status_code"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;402&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"ssl_valid"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;true&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_protocol"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"x402"&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_handshake_valid"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"facilitator_reachable"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"recommendation"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"proceed"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"issues"&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;Your agent reads &lt;code&gt;"proceed"&lt;/code&gt; and goes ahead with the payment. If it had returned &lt;code&gt;"avoid"&lt;/code&gt;, the agent skips that endpoint and saves the money.&lt;/p&gt;

&lt;h3&gt;
  
  
  Using it via the REST API
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl &lt;span class="nt"&gt;-X&lt;/span&gt; POST https://api.strale.io/v1/do &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-H&lt;/span&gt; &lt;span class="s2"&gt;"Authorization: Bearer sk_live_your_key"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-H&lt;/span&gt; &lt;span class="s2"&gt;"Content-Type: application/json"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-d&lt;/span&gt; &lt;span class="s1"&gt;'{
    "capability_slug": "paid-api-preflight",
    "inputs": { "url": "https://some-paid-api.com/data" },
    "max_price_cents": 10
  }'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Costs €0.02 per check. New accounts get €2.00 in trial credits — that's 100 pre-flight checks for free.&lt;/p&gt;

&lt;h3&gt;
  
  
  What it checks per protocol
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;L402 (Lightning):&lt;/strong&gt; Validates the &lt;code&gt;WWW-Authenticate: L402&lt;/code&gt; header, checks for a valid macaroon and BOLT11 invoice.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;x402 (Base/Solana):&lt;/strong&gt; Decodes the &lt;code&gt;PAYMENT-REQUIRED&lt;/code&gt; header, checks for an &lt;code&gt;accepts[]&lt;/code&gt; array, a &lt;code&gt;payTo&lt;/code&gt; address, and tests whether the facilitator URL is reachable.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;MPP (Stripe/Tempo):&lt;/strong&gt; Parses the &lt;code&gt;WWW-Authenticate: Payment&lt;/code&gt; header for required fields — &lt;code&gt;id&lt;/code&gt;, &lt;code&gt;realm&lt;/code&gt;, &lt;code&gt;method&lt;/code&gt;, and payment intent.&lt;/p&gt;

&lt;p&gt;If the endpoint doesn't return 402 at all, the tool reports &lt;code&gt;protocol: "unknown"&lt;/code&gt; — it might not be a paid API, or it might need specific request parameters to trigger the paywall.&lt;/p&gt;

&lt;h3&gt;
  
  
  The agent workflow
&lt;/h3&gt;

&lt;p&gt;The pattern we recommend for any agent making paid API calls:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Discover an endpoint (from a directory, browsing, or a tool suggestion)&lt;/li&gt;
&lt;li&gt;Call &lt;code&gt;paid-api-preflight&lt;/code&gt; with the URL&lt;/li&gt;
&lt;li&gt;If &lt;code&gt;recommendation&lt;/code&gt; is &lt;code&gt;"proceed"&lt;/code&gt; → make the paid call&lt;/li&gt;
&lt;li&gt;If &lt;code&gt;"caution"&lt;/code&gt; → check the &lt;code&gt;issues&lt;/code&gt; array and decide&lt;/li&gt;
&lt;li&gt;If &lt;code&gt;"avoid"&lt;/code&gt; → skip it, find an alternative&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;This adds ~200ms and €0.02 to each new endpoint your agent encounters. After the first check, your agent can cache the result and skip the pre-flight for repeat calls.&lt;/p&gt;

&lt;h3&gt;
  
  
  Getting started
&lt;/h3&gt;

&lt;p&gt;Connect to Strale's MCP server — no installation needed:&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;"mcpServers"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"strale"&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;"streamableHttp"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"url"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"https://api.strale.io/mcp"&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 &lt;code&gt;strale_search&lt;/code&gt; tool works without an API key, so your agent can browse the full catalog of 225+ capabilities. For executing tools including &lt;code&gt;paid-api-preflight&lt;/code&gt;, sign up at &lt;a href="https://strale.dev" rel="noopener noreferrer"&gt;strale.dev&lt;/a&gt; for an API key and €2.00 in trial credits.&lt;/p&gt;

&lt;p&gt;Full trust methodology: &lt;a href="https://strale.dev/trust" rel="noopener noreferrer"&gt;strale.dev/trust&lt;/a&gt;&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Strale gives AI agents access to 225+ quality-scored capabilities via MCP, REST API, or SDK. Every capability is independently tested and scored. &lt;a href="https://strale.dev" rel="noopener noreferrer"&gt;Get started free&lt;/a&gt; — €2 credit, no card required.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>mcp</category>
      <category>api</category>
      <category>tutorial</category>
    </item>
    <item>
      <title>Your AI Agent Doesn't Care Which AI Act Passes</title>
      <dc:creator>Petter_Strale</dc:creator>
      <pubDate>Thu, 19 Mar 2026 13:52:53 +0000</pubDate>
      <link>https://dev.to/petter-strale/your-ai-agent-doesnt-care-which-ai-act-passes-501c</link>
      <guid>https://dev.to/petter-strale/your-ai-agent-doesnt-care-which-ai-act-passes-501c</guid>
      <description>&lt;p&gt;On March 18, a US senator released a discussion draft for federal AI legislation — the TRUMP AMERICA AI Act. It proposes mandatory duty-of-care obligations, bias audits for high-risk systems, and training data transparency requirements. Three days earlier, the EU Council agreed to delay its own AI Act's high-risk rules by over a year.&lt;/p&gt;

&lt;p&gt;Two continents. Two frameworks. Neither is finalized.&lt;/p&gt;

&lt;p&gt;If you're building AI agents right now, this might feel like a reason to wait. Don't know which rules will apply? Don't build governance yet.&lt;/p&gt;

&lt;p&gt;That instinct is wrong. Here's why.&lt;/p&gt;

&lt;h3&gt;
  
  
  What's actually happening
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;In the US&lt;/strong&gt;, there is no federal AI law. What exists is a discussion draft — a proposal from Senator Blackburn that hasn't been formally introduced, needs bipartisan support, and faces opposition from both tech companies (too much regulation) and consumer groups (too much preemption of state laws). It's ambitious: mandatory risk assessments, FTC enforcement authority, expanded liability for AI developers, required bias audits for systems affecting health, safety, employment, education, law enforcement, or critical infrastructure.&lt;/p&gt;

&lt;p&gt;But the bill provides almost no guidance on how to classify a system as "high-risk." That determination is left to organizations themselves, with significant liability if they get it wrong.&lt;/p&gt;

&lt;p&gt;What IS already operational: a December 2025 executive order establishing a DOJ task force to challenge state AI laws in court, and an FTC directive on state bias-mitigation requirements. The federal government is actively trying to preempt state-level AI regulation, even without a federal replacement in place.&lt;/p&gt;

&lt;p&gt;Meanwhile, 38 states enacted AI-related laws in 2025. Colorado's AI Act is live. Illinois amended its Human Rights Act to cover AI discrimination. California has transparency requirements for frontier models.&lt;/p&gt;

&lt;p&gt;The practical result: if you deploy agents in the US today, you face a patchwork of state laws, an executive branch actively challenging those laws, and a proposed federal framework that may or may not replace them.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;In the EU&lt;/strong&gt;, the AI Act is enacted law — but the rules that matter most aren't enforceable yet. The Commission missed its own deadline for high-risk classification guidance. Two standardization bodies missed their deadline for technical standards. The "Digital Omnibus" package pushes high-risk system deadlines from August 2026 to December 2027 (standalone systems) or August 2028 (product-embedded systems).&lt;/p&gt;

&lt;p&gt;But here's the catch: the Omnibus hasn't passed yet. If Parliament and Council don't agree before August 2026, the original deadlines technically apply — even though nobody has the guidance or standards to comply with them. The EU could enter a period where obligations are legally active but practically impossible to meet.&lt;/p&gt;

&lt;p&gt;Prohibited AI practices (social scoring, subliminal manipulation) have been enforced since February 2025. Transparency obligations for AI-generated content take effect August 2026 regardless of the Omnibus. GPAI model rules are already in force.&lt;/p&gt;

&lt;h3&gt;
  
  
  What's converging
&lt;/h3&gt;

&lt;p&gt;The regulatory text is diverging — the US and EU disagree on approach, scope, enforcement mechanisms, and timeline. But read past the policy language and look at what both frameworks actually require organizations to produce. The infrastructure requirements are remarkably similar:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Logging.&lt;/strong&gt; The EU AI Act (Article 12) requires automatic logging of AI system operations. The US bill requires risk assessments and documentation of algorithmic systems. Both want a record of what your system did and why.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Transparency.&lt;/strong&gt; The EU (Article 13, Article 50) requires disclosure of AI involvement and labeling of AI-generated content. The US bill requires training data use records and inference data use records. Both want visibility into how AI systems process data.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Data provenance.&lt;/strong&gt; The EU requires operators to document data sources, processing locations, and jurisdictional context. The US bill creates liability for using copyrighted or personal data without consent in AI training. Both want you to know — and prove — where your data came from.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Quality assurance.&lt;/strong&gt; The EU requires conformity assessments, accuracy standards, and human oversight protocols for high-risk systems. The US bill requires bias audits and participation in evaluation programs. Both want evidence that your system produces reliable outputs.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Audit trails.&lt;/strong&gt; Both frameworks assume that organizations can produce, on demand, documentation showing what their AI system did, what data it used, whether it was reliable, and whether appropriate oversight was in place.&lt;/p&gt;

&lt;p&gt;This convergence isn't coincidental. These are the basic requirements of accountable software. Logging, transparency, provenance, and quality assurance aren't regulatory inventions — they're engineering practices that regulated industries have used for decades. The AI frameworks are adapting them for a new context, but the underlying infrastructure is the same.&lt;/p&gt;

&lt;h3&gt;
  
  
  What this means if you're building agents
&lt;/h3&gt;

&lt;p&gt;AI agents have a specific version of this problem. An agent that calls external tools at runtime — looking up company data, validating tax numbers, screening sanctions lists, checking compliance — creates a chain of data dependencies that neither framework can ignore.&lt;/p&gt;

&lt;p&gt;Every external data call your agent makes is potentially auditable: What data source did it use? Was the source reliable at the time of the call? Was AI involved in processing the response? What jurisdiction was the data processed in? How long is the data retained?&lt;/p&gt;

&lt;p&gt;If your agent stack doesn't capture this information today, adding it later is expensive. You'd need to instrument every integration point, build a logging layer, create provenance metadata, design quality monitoring — and do it retroactively across an architecture that wasn't designed for it.&lt;/p&gt;

&lt;p&gt;The practical argument isn't "comply with regulation X by date Y." It's that the infrastructure for accountable agent operations — logging, provenance, quality signals, audit trails — is the same regardless of which regulatory text ends up applying. Building it now costs less than retrofitting it later, and it works no matter what happens in Washington or Brussels.&lt;/p&gt;

&lt;h3&gt;
  
  
  The quality signal gap
&lt;/h3&gt;

&lt;p&gt;There's one dimension where agent infrastructure is further behind than most teams realize: quality signals for external tools.&lt;/p&gt;

&lt;p&gt;When a developer hardcodes an API integration, they test it. They know when it breaks. An agent discovering and calling tools at runtime has no equivalent — it trusts whatever comes back. If the API returns stale data, the agent doesn't know. If the response schema changed, the agent's output degrades silently.&lt;/p&gt;

&lt;p&gt;Regulators in both jurisdictions are starting to notice this gap. The EU AI Act's accuracy and robustness requirements (Article 15) apply to the entire system, including external data dependencies. The US bill's duty-of-care obligation covers "algorithmic systems and data practices." Neither framework will accept "we called an API and it returned JSON" as evidence of quality assurance.&lt;/p&gt;

&lt;p&gt;Agent builders who treat external tool quality as someone else's problem are accumulating regulatory risk on both sides of the Atlantic — even before anyone agrees on which specific rules apply.&lt;/p&gt;

&lt;h3&gt;
  
  
  What to build now
&lt;/h3&gt;

&lt;p&gt;If you're deploying agents that interact with external data, here's what both regulatory trajectories suggest you should have in place regardless of jurisdiction:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Per-call audit records.&lt;/strong&gt; Every external data call should produce a structured log: what was called, what data source was used, what was returned, how long it took. Not for compliance theater — for debugging and accountability when something goes wrong.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Provenance metadata.&lt;/strong&gt; Each data source should have a documented chain: where the data comes from, how fresh it is, whether AI was involved in processing it, what jurisdiction it was processed in. This is the information that both the EU and US frameworks will eventually require, and it's useful for debugging long before any regulator asks for it.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Quality monitoring.&lt;/strong&gt; External tools should have measurable quality signals — success rates, schema stability, data freshness. Your agents should be able to check these signals before trusting a response, not after.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Transparency markers.&lt;/strong&gt; If AI was involved in generating or processing a response, that should be visible in the output. Both frameworks require this. It's also just good practice — downstream consumers of your agent's output deserve to know what was AI-generated.&lt;/p&gt;

&lt;p&gt;None of this requires you to pick a regulatory jurisdiction. It's infrastructure that works everywhere because it's based on engineering principles, not legal text.&lt;/p&gt;

&lt;h3&gt;
  
  
  How we think about this at Strale
&lt;/h3&gt;

&lt;p&gt;Strale is a capability marketplace for AI agents — 225+ data capabilities accessible via a single API call. But the part that's relevant to this discussion is what happens underneath: every call through the platform automatically generates a structured audit record with data provenance, quality scores, transparency markers, and regulatory cross-references.&lt;/p&gt;

&lt;p&gt;We didn't build that layer because of the EU AI Act or the US bill. We built it because agents calling external data sources without quality signals and audit trails is an engineering problem, and engineering problems get worse when you ignore them.&lt;/p&gt;

&lt;p&gt;The regulatory frameworks are catching up to what good agent infrastructure already requires. The developers who build governance into their stack now — whether through Strale or through their own instrumentation — won't need to scramble when the rules finally land.&lt;/p&gt;

&lt;p&gt;Full methodology: &lt;a href="https://strale.dev/trust" rel="noopener noreferrer"&gt;strale.dev/trust&lt;/a&gt;&lt;br&gt;
Try five capabilities free, no signup: &lt;a href="https://strale.dev" rel="noopener noreferrer"&gt;strale.dev&lt;/a&gt;&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Strale gives AI agents access to 225+ quality-scored capabilities via MCP, REST API, or SDK. Every capability is independently tested and scored. &lt;a href="https://strale.dev" rel="noopener noreferrer"&gt;Get started free&lt;/a&gt; — €2 credit, no card required.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>agents</category>
      <category>regulation</category>
      <category>compliance</category>
    </item>
  </channel>
</rss>
