<?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: Aman Bhawsar</title>
    <description>The latest articles on DEV Community by Aman Bhawsar (@aman_bhawsar_8ec322eb7815).</description>
    <link>https://dev.to/aman_bhawsar_8ec322eb7815</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F4011280%2Ffd0054b8-5e3a-4391-9e68-9f7b656797be.jpg</url>
      <title>DEV Community: Aman Bhawsar</title>
      <link>https://dev.to/aman_bhawsar_8ec322eb7815</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/aman_bhawsar_8ec322eb7815"/>
    <language>en</language>
    <item>
      <title>Most site owners find out their security is broken the hard way — after a breach, not before. 🔒</title>
      <dc:creator>Aman Bhawsar</dc:creator>
      <pubDate>Wed, 23 Sep 2026 10:13:01 +0000</pubDate>
      <link>https://dev.to/aman_bhawsar_8ec322eb7815/most-site-owners-find-out-their-security-is-broken-the-hard-way-after-a-breach-not-before-5a3l</link>
      <guid>https://dev.to/aman_bhawsar_8ec322eb7815/most-site-owners-find-out-their-security-is-broken-the-hard-way-after-a-breach-not-before-5a3l</guid>
      <description>&lt;p&gt;Built GuardHawk — a one-click website security audit tool. Point it at any domain you own or manage, get a full report back in seconds: no login, no agent installed, nothing invasive — just reads what's already publicly checkable (the same way a browser or a certificate authority would).&lt;/p&gt;

&lt;p&gt;What it checks, all in one run:&lt;br&gt;
✅ SSL/TLS certificate (valid, expiry, issuer)&lt;br&gt;
✅ DNS records + DNSSEC&lt;br&gt;
✅ Email security — SPF, DKIM, DMARC (is your domain spoofable by phishers?)&lt;br&gt;
✅ Security headers (HSTS, CSP, Permissions-Policy…)&lt;br&gt;
✅ Subdomain-takeover risk (a dangling DNS record pointing to a service you don't control anymore — a real, common way domains get hijacked)&lt;br&gt;
✅ Public cloud-storage exposure (accidentally public S3 buckets)&lt;br&gt;
✅ Tech stack, WHOIS, blacklist status&lt;br&gt;
✅ A 0-100 health score + a plain-English fix list&lt;/p&gt;

&lt;p&gt;Real example — ran it just now:&lt;/p&gt;

&lt;p&gt;I ran GuardHawk against github.com:&lt;/p&gt;

&lt;p&gt;🔗 github.com — 94/100 (Grade A)&lt;/p&gt;

&lt;p&gt;✅ SSL/TLS checked&lt;br&gt;
✅ SPF, DKIM &amp;amp; DMARC checked&lt;br&gt;
✅ Security headers checked&lt;br&gt;
✅ No subdomain takeover risk detected&lt;br&gt;
✅ No public cloud buckets detected&lt;br&gt;
✅ Blacklist status checked&lt;br&gt;
⚡ Response time: 72 ms&lt;/p&gt;

&lt;p&gt;It still identified 2 issues worth reviewing:&lt;br&gt;
⚠️ Permissions-Policy header missing&lt;br&gt;
⚠️ DNSSEC not enabled&lt;/p&gt;

&lt;p&gt;That's exactly what GuardHawk is built for — giving you a quick view of what is configured correctly and what still needs attention. Even a site the size of GitHub has fixable gaps — nobody's perfect, you just need to actually see the list.&lt;/p&gt;

&lt;p&gt;Where this fits:&lt;br&gt;
🔧 Agencies &amp;amp; MSPs auditing client sites before onboarding&lt;br&gt;
🤖 Drop it into an n8n workflow for scheduled security monitoring across a whole portfolio of domains&lt;br&gt;
🔗 Runs on Apify — one domain or bulk-audit hundreds, no API key needed&lt;/p&gt;

&lt;p&gt;🔗 apify.com/inexhaustible_glass/domain-health-audit&lt;/p&gt;

&lt;p&gt;What's the last security gap you found on a "trusted" site? 👇&lt;/p&gt;

</description>
      <category>apify</category>
      <category>n8nbrightdatachallenge</category>
      <category>cybersecurity</category>
      <category>ai</category>
    </item>
    <item>
      <title>GovCon Intelligence — an agent that can't answer without real structured data</title>
      <dc:creator>Aman Bhawsar</dc:creator>
      <pubDate>Sun, 20 Sep 2026 11:20:47 +0000</pubDate>
      <link>https://dev.to/aman_bhawsar_8ec322eb7815/govcon-intelligence-an-agent-that-cant-answer-without-real-structured-data-22hf</link>
      <guid>https://dev.to/aman_bhawsar_8ec322eb7815/govcon-intelligence-an-agent-that-cant-answer-without-real-structured-data-22hf</guid>
      <description>&lt;p&gt;&lt;em&gt;This is a submission for the &lt;a href="https://dev.to/challenges/sanity-2026-09-16"&gt;Sanity Challenge, Path One: Ship an Agent That Queries Real Content&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  What I Built
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;GovCon Intelligence&lt;/strong&gt; — an agent that answers real questions about US&lt;br&gt;
federal contractors (who works with which agency, how much they've been&lt;br&gt;
paid, whether they're growing or shrinking) by querying a live, structured&lt;br&gt;
Sanity dataset through Sanity Context MCP. Not a summary of documents — a&lt;br&gt;
real relational query over &lt;code&gt;contractor&lt;/code&gt; documents that &lt;strong&gt;reference&lt;/strong&gt;&lt;br&gt;
&lt;code&gt;agency&lt;/code&gt; documents.&lt;/p&gt;

&lt;p&gt;The brief was blunt: &lt;em&gt;"if a keyword search would have gotten you the same&lt;br&gt;
answer, aim higher."&lt;/em&gt; So the question I asked myself building this was: what&lt;br&gt;
can I ask that a flat-text search genuinely cannot answer?&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"Which contractors work with the Department of Defense and are not&lt;br&gt;
decreasing in growth?"&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;That's a join, not a lookup. It needs to filter contractors by a boolean on&lt;br&gt;
their own field (&lt;code&gt;growthTrend != "decreasing"&lt;/code&gt;) &lt;strong&gt;and&lt;/strong&gt; by whether any of&lt;br&gt;
their referenced &lt;code&gt;agency&lt;/code&gt; documents has a specific name. No amount of&lt;br&gt;
full-text search over a JSON blob gets you that. Real result, from real&lt;br&gt;
data, first try:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Contractor&lt;/th&gt;
&lt;th&gt;DoD amount&lt;/th&gt;
&lt;th&gt;Growth&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Booz Allen Hamilton&lt;/td&gt;
&lt;td&gt;$42.9B&lt;/td&gt;
&lt;td&gt;stable&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Accenture Federal Services&lt;/td&gt;
&lt;td&gt;$7.54B&lt;/td&gt;
&lt;td&gt;stable&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Deloitte Consulting&lt;/td&gt;
&lt;td&gt;$7.16B&lt;/td&gt;
&lt;td&gt;stable&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The data is real, not a fixture: I pulled it live from my own&lt;br&gt;
&lt;a href="https://apify.com/inexhaustible_glass/federal-contractor-intelligence" rel="noopener noreferrer"&gt;Federal Contractor Intelligence&lt;/a&gt;&lt;br&gt;
Apify actor, which queries USAspending.gov directly, and pushed the output&lt;br&gt;
into Sanity as &lt;code&gt;contractor&lt;/code&gt;/&lt;code&gt;agency&lt;/code&gt; documents with genuine references&lt;br&gt;
(not flattened strings). Lockheed Martin's $622B lifetime value in the demo&lt;br&gt;
is a real US government spending record.&lt;/p&gt;
&lt;h2&gt;
  
  
  Demo
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Live, no login, no setup:&lt;/strong&gt; &lt;a href="https://govcon-intelligence-seven.vercel.app" rel="noopener noreferrer"&gt;https://govcon-intelligence-seven.vercel.app&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Try asking:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;"Who has the highest lifetime contract value?"&lt;/li&gt;
&lt;li&gt;"Show me contractors with a declining growth trend"&lt;/li&gt;
&lt;li&gt;"Which contractors work with NASA?"&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Every answer is a live &lt;code&gt;groq_query&lt;/code&gt; call against the real dataset — nothing&lt;br&gt;
is canned. The demo runs on a free-tier LLM key (NVIDIA, &lt;code&gt;openai/gpt-oss-20b&lt;/code&gt;,&lt;br&gt;
no card required) so anyone judging this can run it without paying for&lt;br&gt;
anything, and it's rate-limited to 15 questions/hour/IP to keep that key&lt;br&gt;
usable for everyone.&lt;/p&gt;
&lt;h2&gt;
  
  
  Code
&lt;/h2&gt;

&lt;p&gt;Repo is private (I keep all my repos private as a personal practice), so&lt;br&gt;
here's the core of it directly — the whole agent loop is deliberately small:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="c1"&gt;# agent.py — the loop: ask the LLM, let it call groq_query on the live
# MCP endpoint, feed the real result back, repeat until it has an answer.
&lt;/span&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;ask&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;question&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="n"&gt;messages&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;role&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;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;content&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;SYSTEM_PROMPT&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;role&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;user&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;content&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;question&lt;/span&gt;&lt;span class="p"&gt;}]&lt;/span&gt;
    &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="nf"&gt;range&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;6&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="n"&gt;msg&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;llm_call_openai_format&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;messages&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;allow_tools&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
        &lt;span class="n"&gt;messages&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;append&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;msg&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="n"&gt;tool_calls&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;msg&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;tool_calls&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="ow"&gt;not&lt;/span&gt; &lt;span class="n"&gt;tool_calls&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
            &lt;span class="n"&gt;cleaned&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;_clean&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;msg&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;content&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
            &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;cleaned&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
                &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;cleaned&lt;/span&gt;
            &lt;span class="k"&gt;break&lt;/span&gt;
        &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;tc&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;tool_calls&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
            &lt;span class="n"&gt;args&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;json&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;loads&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;tc&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;function&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;arguments&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;
            &lt;span class="n"&gt;mcp_result&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;mcp_call&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;tools/call&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;name&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;groq_query&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;arguments&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;args&lt;/span&gt;&lt;span class="p"&gt;})&lt;/span&gt;
            &lt;span class="n"&gt;tool_text&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;mcp_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;result&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;content&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;][&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;][&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;text&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
            &lt;span class="n"&gt;messages&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;append&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;role&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;tool&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;tool_call_id&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;tc&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;id&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
                              &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;content&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;tool_text&lt;/span&gt;&lt;span class="p"&gt;})&lt;/span&gt;
    &lt;span class="c1"&gt;# Forced final answer, tools off — "no match" is a valid, honest answer
&lt;/span&gt;    &lt;span class="n"&gt;messages&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;append&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;role&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;user&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;content&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;Based only on the query results above, give your final answer now.&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;})&lt;/span&gt;
    &lt;span class="n"&gt;final&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;llm_call_openai_format&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;messages&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;allow_tools&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="bp"&gt;False&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nf"&gt;_clean&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;final&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;content&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt; &lt;span class="ow"&gt;or&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;No matching contractors found.&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="c1"&gt;# mcp_call — talks to the real Sanity Context MCP endpoint over HTTP
&lt;/span&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;mcp_call&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;method&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;params&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="n"&gt;body&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;json&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;dumps&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;jsonrpc&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;2.0&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;id&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;method&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;method&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;params&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;params&lt;/span&gt;&lt;span class="p"&gt;}).&lt;/span&gt;&lt;span class="nf"&gt;encode&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="n"&gt;req&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;urllib&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;request&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;Request&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
        &lt;span class="n"&gt;SANITY_MCP_URL&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;data&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;body&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;method&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;POST&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="n"&gt;headers&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Authorization&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Bearer &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;SANITY_ORG_TOKEN&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                 &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Content-Type&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;application/json&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;Accept&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;application/json, text/event-stream&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;})&lt;/span&gt;
    &lt;span class="k"&gt;with&lt;/span&gt; &lt;span class="n"&gt;urllib&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;request&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;urlopen&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;req&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;timeout&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;30&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;r&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;json&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;loads&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;r&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;read&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Flask serves a small dark-themed chat UI in front of it (live stats bar,&lt;br&gt;
markdown tables, source citation on every answer) — deployed on Vercel.&lt;/p&gt;
&lt;h2&gt;
  
  
  How I Used Sanity
&lt;/h2&gt;

&lt;p&gt;Schema is two document types, deliberately kept small so the reference&lt;br&gt;
relationship is the whole point:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// contractor: name, uei, totalLifetimeValue, growthTrend, leadScore,&lt;/span&gt;
&lt;span class="c1"&gt;// exclusionStatus, and topAgencies[] — an array of&lt;/span&gt;
&lt;span class="c1"&gt;// { agency: reference -&amp;gt; agency, amount: number }&lt;/span&gt;
&lt;span class="c1"&gt;//&lt;/span&gt;
&lt;span class="c1"&gt;// agency: name, isDoD&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;I pointed Sanity Context at my &lt;strong&gt;own Sanity dataset&lt;/strong&gt; (GROQ mode, not a&lt;br&gt;
crawled Knowledge Base — the content already lives in Sanity as real&lt;br&gt;
documents, so there was nothing to crawl) and created an MCP endpoint scoped&lt;br&gt;
to &lt;code&gt;_type in ["contractor", "agency"]&lt;/code&gt;. The agent calls two of the tools&lt;br&gt;
Context exposes: &lt;code&gt;initial_context&lt;/code&gt; (to learn the schema on first turn) and&lt;br&gt;
&lt;code&gt;groq_query&lt;/code&gt; (to actually answer). The system prompt is explicit that it may&lt;br&gt;
&lt;strong&gt;only&lt;/strong&gt; state numbers the tool returned — never estimate.&lt;/p&gt;

&lt;p&gt;Three things broke on the way that are worth being honest about:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Sanity Context requires a deployed &lt;em&gt;Studio app&lt;/em&gt;, not just a deployed
schema&lt;/strong&gt; — I hit a hard &lt;code&gt;-32004&lt;/code&gt; error until I ran &lt;code&gt;sanity deploy&lt;/code&gt;
against a Studio actually built on &lt;code&gt;sanity@6&lt;/code&gt; (my first template was
v3, which doesn't qualify).&lt;/li&gt;
&lt;li&gt;The model I originally wired had been retired from NVIDIA's catalog
since I last used it — found the current one by checking the live
&lt;code&gt;/v1/models&lt;/code&gt; list instead of guessing.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;gpt-oss&lt;/code&gt;'s harmony format occasionally leaked an internal
&lt;code&gt;commentary to=functions...&lt;/code&gt; fragment into the answer instead of using
the structured &lt;code&gt;tool_calls&lt;/code&gt; field, and separately could burn all its
tool-call turns chasing a genuinely-empty result. Fixed both at the
agent layer rather than papering over them in the UI — see the &lt;code&gt;_clean()&lt;/code&gt;
strip and the forced tools-off final turn in the code above.&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Sanity Project Details
&lt;/h2&gt;

&lt;p&gt;Project ID: &lt;strong&gt;&lt;code&gt;6t5rf0s6&lt;/code&gt;&lt;/strong&gt;, dataset &lt;strong&gt;&lt;code&gt;production&lt;/code&gt;&lt;/strong&gt;.&lt;br&gt;
MCP endpoint name: &lt;strong&gt;&lt;code&gt;govcon-intelligence-agent&lt;/code&gt;&lt;/strong&gt; (GROQ mode).&lt;/p&gt;

&lt;h2&gt;
  
  
  Agent Session
&lt;/h2&gt;

&lt;p&gt;&lt;em&gt;(Optional — will add a curated Claude Code session transcript via the DEV agent-session uploader before publishing, and remember to hit "Make Public.")&lt;/em&gt;&lt;/p&gt;

</description>
      <category>devchallenge</category>
      <category>sanitychallenge</category>
      <category>sanity</category>
      <category>ai</category>
    </item>
    <item>
      <title>Passion Profiler — an AI that scores and speaks what a YouTuber truly loves</title>
      <dc:creator>Aman Bhawsar</dc:creator>
      <pubDate>Fri, 10 Jul 2026 10:09:44 +0000</pubDate>
      <link>https://dev.to/aman_bhawsar_8ec322eb7815/passion-profiler-an-ai-that-scores-and-speaks-what-a-youtuber-truly-loves-4afo</link>
      <guid>https://dev.to/aman_bhawsar_8ec322eb7815/passion-profiler-an-ai-that-scores-and-speaks-what-a-youtuber-truly-loves-4afo</guid>
      <description>&lt;p&gt;&lt;em&gt;This is a submission for &lt;a href="https://dev.to/challenges/weekend-2026-07-09"&gt;Weekend Challenge: Passion Edition&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  What I Built
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Passion Profiler&lt;/strong&gt; turns any YouTube creator's channel into an AI &lt;strong&gt;"passion portrait"&lt;/strong&gt; — a scored, quoted, and &lt;em&gt;spoken&lt;/em&gt; tribute to what they truly care about.&lt;/p&gt;

&lt;p&gt;The theme is &lt;em&gt;passion&lt;/em&gt;, and nothing shows a person's passion better than hours of their own words spoken straight to camera. So I built a tool that reads those words and reflects the passion back.&lt;/p&gt;

&lt;p&gt;Point it at a channel and it:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Pulls the transcripts&lt;/strong&gt; of their recent videos.&lt;/li&gt;
&lt;li&gt;Sends them to &lt;strong&gt;Google Gemini&lt;/strong&gt;, which uncovers what the creator is &lt;em&gt;deeply passionate&lt;/em&gt; about — their obsessions, a &lt;strong&gt;Passion Score (0–100)&lt;/strong&gt;, and their most fired-up quotes.&lt;/li&gt;
&lt;li&gt;Writes a heartfelt fan &lt;strong&gt;tribute&lt;/strong&gt; and &lt;strong&gt;speaks it aloud&lt;/strong&gt; with &lt;strong&gt;ElevenLabs&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Renders it into a shareable &lt;strong&gt;HTML "passion portrait."&lt;/strong&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Real example — Veritasium, from 6 videos:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Passion Score: 95/100&lt;/strong&gt; — &lt;em&gt;"A relentless detective of the physical world, driven by the wonder of discovery and the moral imperative of empirical truth."&lt;/em&gt;&lt;br&gt;
🔥 The scientific method as a moral compass · The elegance of algorithmic thinking · Unsolved mathematical mysteries&lt;br&gt;
💬 &lt;em&gt;"That is not science. That is not justice."&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  Demo
&lt;/h2&gt;

&lt;p&gt;&lt;em&gt;A "passion portrait" for Veritasium (Passion Score 95/100), with the tribute voiced by ElevenLabs:&lt;/em&gt;&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fraw.githubusercontent.com%2FAmanbhaw%2Fpassion-profiler%2Fmaster%2Fdemo%2Fveritasium_portrait.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fraw.githubusercontent.com%2FAmanbhaw%2Fpassion-profiler%2Fmaster%2Fdemo%2Fveritasium_portrait.png" alt="Passion Portrait for Veritasium — Passion Score 95/100" width="800" height="2380"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;
  
  
  Code
&lt;/h2&gt;


&lt;div class="ltag-github-readme-tag"&gt;
  &lt;div class="readme-overview"&gt;
    &lt;h2&gt;
      &lt;img src="https://assets.dev.to/assets/github-logo-5a155e1f9a670af7944dd5e12375bc76ed542ea80224905ecaf878b9157cdefc.svg" alt="GitHub logo"&gt;
      &lt;a href="https://github.com/Amanbhaw" rel="noopener noreferrer"&gt;
        Amanbhaw
      &lt;/a&gt; / &lt;a href="https://github.com/Amanbhaw/passion-profiler" rel="noopener noreferrer"&gt;
        passion-profiler
      &lt;/a&gt;
    &lt;/h2&gt;
    &lt;h3&gt;
      Turn any YouTube creator's channel into an AI 'passion portrait' — scored, quoted, and spoken. Gemini + ElevenLabs, free tiers. DEV Weekend Challenge.
    &lt;/h3&gt;
  &lt;/div&gt;
  &lt;div class="ltag-github-body"&gt;
    
&lt;div id="readme" class="md"&gt;&lt;div class="markdown-heading"&gt;
&lt;h1 class="heading-element"&gt;❤️‍🔥 Passion Profiler&lt;/h1&gt;
&lt;/div&gt;
&lt;p&gt;&lt;strong&gt;Turn any YouTube creator's channel into an AI "passion portrait" — a scored
quoted, and &lt;em&gt;spoken&lt;/em&gt; tribute to what they truly love.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Point it at a channel. It reads their actual words (transcripts), figures out
what fires them up, scores how passionately they speak, pulls their most
electric quotes, writes them a heartfelt tribute, &lt;strong&gt;reads that tribute aloud&lt;/strong&gt;
and drops the whole thing into a single shareable HTML page.&lt;/p&gt;
&lt;p&gt;Built for the &lt;strong&gt;DEV Weekend Challenge — Passion Edition&lt;/strong&gt;.
Runs entirely on &lt;strong&gt;free tiers&lt;/strong&gt;.&lt;/p&gt;

&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;Try it in 60 seconds (no API key)&lt;/h2&gt;

&lt;/div&gt;
&lt;div class="highlight highlight-source-shell notranslate position-relative overflow-auto js-code-highlight"&gt;
&lt;pre&gt;git clone https://github.com/Amanbhaw/passion-profiler.git
&lt;span class="pl-c1"&gt;cd&lt;/span&gt; passion-profiler &lt;span class="pl-k"&gt;&amp;amp;&amp;amp;&lt;/span&gt; pip install -r requirements.txt
python passion_profiler.py --self-test&lt;/pre&gt;

&lt;/div&gt;
&lt;p&gt;&lt;code&gt;--self-test&lt;/code&gt; really runs the engine: it fetches a live YouTube transcript
through WARP, synthesizes a voice clip, and renders an HTML portrait — proving
every stage works before you add any key. Then add one LLM key (below) and point…&lt;/p&gt;&lt;/div&gt;
  &lt;/div&gt;
  &lt;div class="gh-btn-container"&gt;&lt;a class="gh-btn" href="https://github.com/Amanbhaw/passion-profiler" rel="noopener noreferrer"&gt;View on GitHub&lt;/a&gt;&lt;/div&gt;
&lt;/div&gt;


&lt;h2&gt;
  
  
  How I Built It
&lt;/h2&gt;

&lt;p&gt;Python, one file, three stages — each with a free path.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;1. Getting transcripts is the hard part.&lt;/strong&gt; YouTube blocks datacenter IPs, so &lt;code&gt;yt-dlp&lt;/code&gt; from a server gets &lt;em&gt;"Sign in to confirm you're not a bot."&lt;/em&gt; I solved it with a bundled, self-contained &lt;strong&gt;Cloudflare WARP&lt;/strong&gt; userspace proxy (&lt;code&gt;warp.py&lt;/code&gt;): it registers an anonymous WARP credential and runs &lt;code&gt;wireproxy&lt;/code&gt; so traffic exits from Cloudflare's IP pool — &lt;strong&gt;no account, no root, and it works inside Docker with a plain &lt;code&gt;docker run&lt;/code&gt;&lt;/strong&gt;. If a video has &lt;strong&gt;no captions&lt;/strong&gt;, it downloads the audio and transcribes it locally with &lt;strong&gt;Whisper&lt;/strong&gt; — so every video is covered.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;2. The passion analysis&lt;/strong&gt; is a single &lt;strong&gt;Google Gemini&lt;/strong&gt; call returning strict JSON (headline, passion score, passions with evidence, fire quotes, tribute). The LLM layer is pluggable — Gemini, local Gemma, Groq, NVIDIA, OpenAI, Claude, Mistral all auto-detect, and a &lt;code&gt;--check&lt;/code&gt; command verifies your setup.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;3. Voice&lt;/strong&gt; is &lt;strong&gt;ElevenLabs&lt;/strong&gt; (&lt;code&gt;eleven_multilingual_v2&lt;/code&gt;), with a free Edge-TTS fallback so it never hard-fails.&lt;/p&gt;

&lt;p&gt;The whole thing runs on free tiers, auto-loads &lt;code&gt;.env&lt;/code&gt;, and ships a &lt;code&gt;--self-test&lt;/code&gt; that proves every stage with no API key.&lt;/p&gt;

&lt;h2&gt;
  
  
  Prize Categories
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Best use of Google AI&lt;/strong&gt; — Gemini does the entire passion analysis, reading transcripts and returning structured insight plus the tribute.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Best use of ElevenLabs&lt;/strong&gt; — the tribute isn't just text; ElevenLabs &lt;em&gt;voices&lt;/em&gt; it, turning a paragraph into something that feels like a heartfelt message.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Built with love for creators who pour themselves into their work.&lt;/p&gt;

</description>
      <category>devchallenge</category>
      <category>weekendchallenge</category>
    </item>
    <item>
      <title>Turn Public Business Loan Records (UCC Filings) Into B2B Leads with an API</title>
      <dc:creator>Aman Bhawsar</dc:creator>
      <pubDate>Thu, 09 Jul 2026 16:00:42 +0000</pubDate>
      <link>https://dev.to/aman_bhawsar_8ec322eb7815/turn-public-business-loan-records-ucc-filings-into-b2b-leads-with-an-api-9f1</link>
      <guid>https://dev.to/aman_bhawsar_8ec322eb7815/turn-public-business-loan-records-ucc-filings-into-b2b-leads-with-an-api-9f1</guid>
      <description>&lt;p&gt;Here's a lead source most people overlook: &lt;strong&gt;UCC filings&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Every time a business takes a secured loan — equipment financing, a line of credit, working capital — a &lt;strong&gt;UCC filing&lt;/strong&gt; becomes public record. It tells you the borrower, the lender, and what was financed. If you sell to businesses that borrow money, these are some of the warmest B2B leads out there.&lt;/p&gt;

&lt;p&gt;The catch: this data is scattered across state filing offices in messy formats.&lt;/p&gt;

&lt;h2&gt;
  
  
  The easy way
&lt;/h2&gt;

&lt;p&gt;I built a scraper that pulls multi-state UCC filings into clean JSON/CSV — no manual lookups.&lt;/p&gt;

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

&lt;ul&gt;
&lt;li&gt;Debtor (the business) — name &amp;amp; address&lt;/li&gt;
&lt;li&gt;Secured party (the lender)&lt;/li&gt;
&lt;li&gt;Filing date, collateral, and status&lt;/li&gt;
&lt;li&gt;Multi-state coverage in a single run&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Example output
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;
json
{
  "debtor_name": "Riverside Logistics Inc",
  "secured_party": "First Capital Bank",
  "collateral": "Equipment",
  "filing_date": "2026-06-30",
  "status": "Active"
}

Try it

👉 US UCC Filings Scraper:
https://apify.com/inexhaustible_glass/ucc-filings-scraper

See all my scrapers:
https://apify.com/inexhaustible_glass

Perfect for lenders, MCA brokers, equipment finance, and B2B sales teams targeting companies that are actively spending.

What public dataset should I turn into an API next? Let me know 👇
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

</description>
      <category>api</category>
      <category>webscraping</category>
      <category>fintech</category>
      <category>leadgeneration</category>
    </item>
    <item>
      <title>How to Get Fresh New-Business Leads Across 6 US States (with a simple API)</title>
      <dc:creator>Aman Bhawsar</dc:creator>
      <pubDate>Thu, 09 Jul 2026 05:57:02 +0000</pubDate>
      <link>https://dev.to/aman_bhawsar_8ec322eb7815/how-to-get-fresh-new-business-leads-across-6-us-states-with-a-simple-api-51na</link>
      <guid>https://dev.to/aman_bhawsar_8ec322eb7815/how-to-get-fresh-new-business-leads-across-6-us-states-with-a-simple-api-51na</guid>
      <description>&lt;p&gt;Every day, thousands of new companies register across the US — and new businesses buy &lt;em&gt;everything&lt;/em&gt;: banking, insurance, software, accounting. If you sell B2B, reaching them in their first week is a huge advantage.&lt;/p&gt;

&lt;p&gt;The problem: business registries are split across dozens of state websites, each with its own format. Scraping them yourself is painful.&lt;/p&gt;

&lt;h2&gt;
  
  
  The easy way
&lt;/h2&gt;

&lt;p&gt;I built a scraper that pulls newly registered businesses across 6 US states (14M+ records) into clean JSON/CSV — no setup, no browser automation on your side.&lt;/p&gt;

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

&lt;ul&gt;
&lt;li&gt;Company name, registered agent, address&lt;/li&gt;
&lt;li&gt;Registration date &amp;amp; status&lt;/li&gt;
&lt;li&gt;Cross-linked with SEC EDGAR + OFAC sanctions screening&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Example output
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;
json
{
  "company_name": "Sunrise Ventures LLC",
  "state": "TX",
  "status": "Active",
  "registered_agent": "John Smith",
  "registration_date": "2026-06-28"
}

Try it

👉 US Business Registry Scraper:
https://apify.com/inexhaustible_glass/us-business-registry

See all my scrapers here:
https://apify.com/inexhaustible_glass

Free to try. Great for B2B sales, fintech onboarding, and compliance teams who want first-mover advantage on fresh leads.

What data source would you want scraped next? Drop a comment 👇
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

</description>
      <category>ai</category>
      <category>leadgeneration</category>
      <category>datascience</category>
      <category>webscraping</category>
    </item>
  </channel>
</rss>
