<?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: Loomwise</title>
    <description>The latest articles on DEV Community by Loomwise (@loomwise).</description>
    <link>https://dev.to/loomwise</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%2F4194203%2Fc02a395f-eea0-4478-be75-c19c8230271f.png</url>
      <title>DEV Community: Loomwise</title>
      <link>https://dev.to/loomwise</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/loomwise"/>
    <language>en</language>
    <item>
      <title>Dallas Building Permit Leads: 1,500 Permits a Week from Dallas Open Data (Solar, Roofing, Plumbing, New Homes)</title>
      <dc:creator>Loomwise</dc:creator>
      <pubDate>Fri, 13 Nov 2026 14:54:37 +0000</pubDate>
      <link>https://dev.to/loomwise/dallas-building-permit-leads-1500-permits-a-week-from-dallas-open-data-solar-roofing-plumbing-2ld1</link>
      <guid>https://dev.to/loomwise/dallas-building-permit-leads-1500-permits-a-week-from-dallas-open-data-solar-roofing-plumbing-2ld1</guid>
      <description>&lt;p&gt;The City of Dallas publishes every issued building permit on &lt;strong&gt;dallasopendata.com&lt;/strong&gt; (Socrata dataset &lt;code&gt;e7gq-4sah&lt;/code&gt;). Between &lt;strong&gt;Oct 21 and Oct 28, 2026&lt;/strong&gt; it issued &lt;strong&gt;1,499 permits&lt;/strong&gt;:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Permit type&lt;/th&gt;
&lt;th&gt;Count&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Residential plumbing&lt;/td&gt;
&lt;td&gt;314&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Commercial electrical&lt;/td&gt;
&lt;td&gt;145&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Residential electrical&lt;/td&gt;
&lt;td&gt;141&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Residential mechanical (HVAC)&lt;/td&gt;
&lt;td&gt;121&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Commercial alteration/addition&lt;/td&gt;
&lt;td&gt;107&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Commercial plumbing&lt;/td&gt;
&lt;td&gt;99&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Residential new construction&lt;/td&gt;
&lt;td&gt;82&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Residential alteration/addition&lt;/td&gt;
&lt;td&gt;81&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Commercial mechanical&lt;/td&gt;
&lt;td&gt;70&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Residential accessory structure&lt;/td&gt;
&lt;td&gt;52&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Each permit includes the work description (for example "Installation of roof mounted PV solar panels / 22 modules / 9.020 kW"), street address, ZIP code, square footage and issue date.&lt;/p&gt;

&lt;h2&gt;
  
  
  One gotcha: text dates
&lt;/h2&gt;

&lt;p&gt;Dallas stores &lt;code&gt;issued_date&lt;/code&gt; as &lt;strong&gt;text in MM/DD/YY format&lt;/strong&gt;, so a normal SoQL date range (&lt;code&gt;issued_date &amp;gt; '2026-10-21'&lt;/code&gt;) silently returns the wrong rows. Query the exact date strings instead:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="n"&gt;datetime&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;dt&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;requests&lt;/span&gt;
&lt;span class="n"&gt;days&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;dt&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;date&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;2026&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;28&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;dt&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;timedelta&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;d&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;strftime&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"%m/%d/%y"&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;d&lt;/span&gt; &lt;span class="k"&gt;in&lt;/span&gt; &lt;span class="nb"&gt;range&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;8&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="n"&gt;where&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"issued_date in("&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="s2"&gt;","&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;join&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;f&lt;/span&gt;&lt;span class="s2"&gt;"'{d}'"&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;d&lt;/span&gt; &lt;span class="k"&gt;in&lt;/span&gt; &lt;span class="n"&gt;days&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="s2"&gt;")"&lt;/span&gt;
&lt;span class="n"&gt;rows&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;requests&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"https://www.dallasopendata.com/resource/e7gq-4sah.json"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                    &lt;span class="n"&gt;params&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="s2"&gt;"$where"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;where&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"$limit"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;5000&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;json&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;len&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;rows&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;rows&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="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"permit_type"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;rows&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="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"work_description"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;80&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;For longer windows, split the request into chunks of about 31 dates.&lt;/p&gt;

&lt;h2&gt;
  
  
  Finding solar, roofing and HVAC jobs
&lt;/h2&gt;

&lt;p&gt;Filter on the work description:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="n"&gt;re&lt;/span&gt;
&lt;span class="n"&gt;solar&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;r&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;r&lt;/span&gt; &lt;span class="k"&gt;in&lt;/span&gt; &lt;span class="n"&gt;rows&lt;/span&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;re&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;search&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;r&lt;/span&gt;&lt;span class="s2"&gt;"\b(PV|solar)\b"&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;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"work_description"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s2"&gt;""&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;re&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="no"&gt;I&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="n"&gt;roof&lt;/span&gt;  &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;r&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;r&lt;/span&gt; &lt;span class="k"&gt;in&lt;/span&gt; &lt;span class="n"&gt;rows&lt;/span&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;re&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;search&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;r&lt;/span&gt;&lt;span class="s2"&gt;"re-?roof|shingle"&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;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"work_description"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s2"&gt;""&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;re&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="no"&gt;I&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Note:&lt;/strong&gt; Dallas leaves the contractor and valuation fields blank on most recent permits. Use this feed for the address, work type and timing (for example, homeowners who just pulled a re-roof or new-construction permit), not to look up a contractor.&lt;/p&gt;

&lt;h2&gt;
  
  
  No-code: 48 cities in one tool
&lt;/h2&gt;

&lt;p&gt;Dallas is now one of &lt;strong&gt;48 cities and counties&lt;/strong&gt; in the &lt;strong&gt;&lt;a href="https://apify.com/loomwise/city-building-permits" rel="noopener noreferrer"&gt;Building Permits Scraper&lt;/a&gt;&lt;/strong&gt; on Apify. Choose &lt;code&gt;"cities": ["dallas_tx"]&lt;/code&gt; and set &lt;code&gt;withinDays&lt;/code&gt;, or combine it with Austin, San Antonio and Fort Worth for a Texas-wide permit feed. It costs $2 per 1,000 permits, and the free plan covers a few thousand a month.&lt;/p&gt;

&lt;p&gt;Sample data and field list: &lt;a href="https://loomwise.app/data/building-permit-leads/" rel="noopener noreferrer"&gt;loomwise.app/data/building-permit-leads&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Data: City of Dallas Open Data, public. Owner and applicant names are not included.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>python</category>
      <category>opendata</category>
      <category>leadgen</category>
      <category>construction</category>
    </item>
    <item>
      <title>Ask Your AI Agent for New Construction Companies: Connecticut NAICS Leads via the Apify MCP Server</title>
      <dc:creator>Loomwise</dc:creator>
      <pubDate>Thu, 12 Nov 2026 14:57:27 +0000</pubDate>
      <link>https://dev.to/loomwise/ask-your-ai-agent-for-new-construction-companies-connecticut-naics-leads-via-the-apify-mcp-server-2d97</link>
      <guid>https://dev.to/loomwise/ask-your-ai-agent-for-new-construction-companies-connecticut-naics-leads-via-the-apify-mcp-server-2d97</guid>
      <description>&lt;p&gt;Connecticut is one of the few states whose business registry includes a &lt;strong&gt;NAICS industry code&lt;/strong&gt; for new companies. From Oct 1 to Oct 23, 2026, the Secretary of the State's open data on data.ct.gov recorded &lt;strong&gt;3,862 new business registrations&lt;/strong&gt;, and &lt;strong&gt;346 of them were in construction (NAICS 23)&lt;/strong&gt;. The top codes were residential remodelers (236118, 125 new companies), other specialty trades (238990, 29), finish carpentry (238350, 25), commercial building construction (236220, 24), electricians (238210, 23) and painters (238320, 19). Bridgeport, Waterbury, Stamford, Danbury and New Haven led by city.&lt;/p&gt;

&lt;p&gt;Because the industry code is right there, this is a great dataset to hand to an AI agent. Instead of writing SoQL, you ask in plain English: &lt;em&gt;"new electrical contractors in Fairfield County this month."&lt;/em&gt; Here's how to set that up with Apify's hosted MCP server.&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 1: Connect the tool
&lt;/h2&gt;

&lt;p&gt;Add this to your MCP client's config (any client that supports remote MCP servers over Streamable HTTP):&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="nl"&gt;"mcpServers"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nl"&gt;"apify"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="nl"&gt;"type"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"http"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="nl"&gt;"url"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"https://mcp.apify.com/?tools=fetch-actor-details,loomwise/connecticut-new-business-registrations"&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;On first connect, the client opens a browser window to sign in to Apify (OAuth), so no token sits in the file. The &lt;code&gt;tools&lt;/code&gt; parameter loads just this one Actor plus &lt;code&gt;fetch-actor-details&lt;/code&gt;, which lets the agent read the input schema and pricing before it runs anything.&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 2: Ask
&lt;/h2&gt;

&lt;blockquote&gt;
&lt;p&gt;Using the Connecticut new business registrations tool, find companies registered in the last 30 days with NAICS code 238210 (electrical contractors) in Stamford, Norwalk, Bridgeport or Danbury. Active filings only, max 100 results. Give me a table of name, registration date, NAICS description and city.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;A well-behaved agent maps that onto the tool's inputs:&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="nl"&gt;"registeredWithinDays"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;30&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="nl"&gt;"naicsCodes"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"238210"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="nl"&gt;"cities"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"Stamford"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"Norwalk"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"Bridgeport"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"Danbury"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="nl"&gt;"activeOnly"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="nl"&gt;"maxResults"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;100&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Check the input it chose before you approve the run. If it guessed a field name, &lt;code&gt;fetch-actor-details&lt;/code&gt; will correct it on the next try.&lt;/p&gt;

&lt;h2&gt;
  
  
  Prompts that work well
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;em&gt;"How many new construction companies (NAICS 23) registered in Connecticut last week, by 6-digit code?"&lt;/em&gt; The agent pulls the rows and counts them for you.&lt;/li&gt;
&lt;li&gt;&lt;em&gt;"New restaurants (NAICS 722) in New Haven this month, as a CSV."&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;&lt;em&gt;"Compare new remodeling companies (236118) in Hartford vs New Haven over the last 60 days."&lt;/em&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Why NAICS beats name keywords
&lt;/h2&gt;

&lt;p&gt;Name searches miss companies like "JMK Holdings LLC" that are really electricians. A self-reported NAICS code isn't perfect either, since some filers pick a broad code, but it catches far more of the right businesses than &lt;code&gt;name like '%ELECTRIC%'&lt;/code&gt; does.&lt;/p&gt;

&lt;h2&gt;
  
  
  Prefer code? Here's the raw query
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="n"&gt;requests&lt;/span&gt;
&lt;span class="n"&gt;rows&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;requests&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"https://data.ct.gov/resource/n7gp-d28j.json"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;params&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="s2"&gt;"$select"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"name,business_type,date_registration,naics_code,billingcity"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="s2"&gt;"$where"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"date_registration &amp;gt;= '2026-10-01T00:00:00' AND contains(naics_code, '(23')"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="s2"&gt;"$limit"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;5000&lt;/span&gt;&lt;span class="p"&gt;}&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;120&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;json&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;len&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;rows&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;code&gt;naics_code&lt;/code&gt; is text like &lt;code&gt;Residential Remodelers (236118)&lt;/code&gt;, which is why the filter looks for &lt;code&gt;(23&lt;/code&gt;. The raw data also includes business email and owner-demographic fields. Leave those out of any marketing list.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;The MCP setup uses my tool, &lt;a href="https://apify.com/loomwise/connecticut-new-business-registrations" rel="noopener noreferrer"&gt;Connecticut New Business Leads&lt;/a&gt; (paid per result, business-only rows, no emails or personal names). Disclosure: it's mine. The raw query does the same job for free.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>mcp</category>
      <category>opendata</category>
      <category>leadgen</category>
    </item>
    <item>
      <title>Colorado New LLC Leads in Python: 11,500 New Companies in 3 Weeks, Pulled with the Apify Client</title>
      <dc:creator>Loomwise</dc:creator>
      <pubDate>Wed, 11 Nov 2026 14:49:23 +0000</pubDate>
      <link>https://dev.to/loomwise/colorado-new-llc-leads-in-python-11500-new-companies-in-3-weeks-pulled-with-the-apify-client-nfm</link>
      <guid>https://dev.to/loomwise/colorado-new-llc-leads-in-python-11500-new-companies-in-3-weeks-pulled-with-the-apify-client-nfm</guid>
      <description>&lt;p&gt;Colorado forms a lot of companies. From Oct 1 to Oct 23, 2026, the Secretary of State's open register on data.colorado.gov added &lt;strong&gt;11,533 new business entities&lt;/strong&gt;: 9,069 domestic LLCs, 1,206 domestic corporations, 509 out-of-state LLCs registering to do business in Colorado, and 271 nonprofits. Denver alone accounted for about 3,100 of them, followed by Colorado Springs (1,037), Aurora (623) and Fort Collins (266).&lt;/p&gt;

&lt;p&gt;An earlier post in this series showed the raw SoQL query. This one is for people who want a &lt;strong&gt;clean, repeatable job in a few lines of Python&lt;/strong&gt;: business-only rows, home addresses withheld, good-standing filter applied, written straight to CSV for a CRM import.&lt;/p&gt;

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



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;pip install apify-client
&lt;span class="kd"&gt;export&lt;/span&gt; &lt;span class="nv"&gt;APIFY_TOKEN&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;...   &lt;span class="c"&gt;# from your Apify account settings; keep it out of your code&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  The script
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="n"&gt;csv&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;os&lt;/span&gt;
&lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="n"&gt;apify_client&lt;/span&gt; &lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="nc"&gt;ApifyClient&lt;/span&gt;

&lt;span class="n"&gt;client&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;ApifyClient&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;os&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;environ&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"APIFY_TOKEN"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;colorado_new_companies&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;days&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;7&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;cities&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="kc"&gt;None&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;keywords&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="kc"&gt;None&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;limit&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;2000&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="n"&gt;run&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;client&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;actor&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"loomwise/colorado-new-business-filings"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;call&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;run_input&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="s2"&gt;"formedWithinDays"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;days&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="s2"&gt;"entityTypes"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"DLLC"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"DPC"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;     &lt;span class="c1"&gt;# domestic LLCs and corporations&lt;/span&gt;
        &lt;span class="s2"&gt;"cities"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;cities&lt;/span&gt; &lt;span class="ow"&gt;or&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="s2"&gt;"keywords"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;keywords&lt;/span&gt; &lt;span class="ow"&gt;or&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="s2"&gt;"goodStandingOnly"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;True&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="s2"&gt;"maxResults"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;limit&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="kt"&gt;list&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;client&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;dataset&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;run&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"defaultDatasetId"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;iterate_items&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="n"&gt;rows&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;colorado_new_companies&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;days&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;7&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;cities&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"Denver"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"Aurora"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"Lakewood"&lt;/span&gt;&lt;span class="p"&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;rows&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="k"&gt;with&lt;/span&gt; &lt;span class="nb"&gt;open&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"colorado_new_llcs.csv"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"w"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;newline&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;""&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;f&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="n"&gt;w&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;csv&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;DictWriter&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;f&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;fieldnames&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nb"&gt;sorted&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="n"&gt;k&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;r&lt;/span&gt; &lt;span class="k"&gt;in&lt;/span&gt; &lt;span class="n"&gt;rows&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;k&lt;/span&gt; &lt;span class="k"&gt;in&lt;/span&gt; &lt;span class="n"&gt;r&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="n"&gt;w&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;writeheader&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="n"&gt;w&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;writerows&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;rows&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;len&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;rows&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"rows written"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;code&gt;.call()&lt;/code&gt; starts the run and waits for it to finish. &lt;code&gt;iterate_items()&lt;/code&gt; pages through the dataset for you, so there's no offset bookkeeping.&lt;/p&gt;

&lt;h2&gt;
  
  
  Three useful variations
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;One industry.&lt;/strong&gt; Colorado doesn't publish NAICS codes, but names are a decent proxy:&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;roofers&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;colorado_new_companies&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;days&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="n"&gt;keywords&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"roofing"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"exteriors"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Out-of-state expansions.&lt;/strong&gt; Companies already operating elsewhere and now entering Colorado are often bigger buyers. Switch &lt;code&gt;entityTypes&lt;/code&gt; to &lt;code&gt;["FLLC", "FPC"]&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Diff against last week.&lt;/strong&gt; Keep the previous CSV and only email the new entity IDs:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="n"&gt;pandas&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;pd&lt;/span&gt;
&lt;span class="n"&gt;new&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;pd&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;read_csv&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"colorado_new_llcs.csv"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;old&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;pd&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;read_csv&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"last_week.csv"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;fresh&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;new&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="o"&gt;~&lt;/span&gt;&lt;span class="n"&gt;new&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"entityId"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;isin&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;old&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"entityId"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;(Check the exact column names in your first CSV. They come from the tool's output schema.)&lt;/p&gt;

&lt;h2&gt;
  
  
  Scheduling
&lt;/h2&gt;

&lt;p&gt;Run the script from cron, or create a Schedule in the Apify Console that runs the Actor every Monday, and just read the latest dataset from Python. Either way, pull 7 days at a time so each week's list stays small and fresh.&lt;/p&gt;

&lt;h2&gt;
  
  
  Doing it for free instead
&lt;/h2&gt;

&lt;p&gt;If you don't need the cleanup, query &lt;code&gt;https://data.colorado.gov/resource/4ykn-tg5h.json&lt;/code&gt; directly with &lt;code&gt;entityformdate &amp;gt;= '&amp;lt;date&amp;gt;T00:00:00'&lt;/code&gt;. Just remember the raw data includes individual registered agents and their addresses. Drop those columns before you store anything.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;The script above calls my tool, &lt;a href="https://apify.com/loomwise/colorado-new-business-filings" rel="noopener noreferrer"&gt;Colorado New Business Filings&lt;/a&gt; (paid per result). Disclosure: it's mine. The raw API in the last section is free.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>python</category>
      <category>apify</category>
      <category>opendata</category>
      <category>leadgen</category>
    </item>
    <item>
      <title>New Home Improvement Contractors in Connecticut: Pull This Month's HIC Registrations from DCP Open Data (Python)</title>
      <dc:creator>Loomwise</dc:creator>
      <pubDate>Tue, 10 Nov 2026 14:55:51 +0000</pubDate>
      <link>https://dev.to/loomwise/new-home-improvement-contractors-in-connecticut-pull-this-months-hic-registrations-from-dcp-open-dlc</link>
      <guid>https://dev.to/loomwise/new-home-improvement-contractors-in-connecticut-pull-this-months-hic-registrations-from-dcp-open-dlc</guid>
      <description>&lt;p&gt;Connecticut requires anyone doing residential remodeling, roofing, siding, windows or similar work to register as a &lt;strong&gt;Home Improvement Contractor (HIC)&lt;/strong&gt; with the Department of Consumer Protection. DCP publishes every credential on data.ct.gov with its &lt;strong&gt;issue date&lt;/strong&gt;, status and business city, refreshed daily. For suppliers, insurers and software vendors, that's a free list of brand-new remodeling businesses.&lt;/p&gt;

&lt;p&gt;When I ran this on Oct 24, 2026, the last 30 days held &lt;strong&gt;239 new HIC registrations held by businesses&lt;/strong&gt; (223 LLCs, 13 corporations, 3 LLPs). Top cities: Bridgeport 14, Danbury 13, Stamford 12, Hartford 9, Waterbury 9, Norwalk 8.&lt;/p&gt;

&lt;h2&gt;
  
  
  The script
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="n"&gt;requests&lt;/span&gt;
&lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="n"&gt;collections&lt;/span&gt; &lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="nc"&gt;Counter&lt;/span&gt;
&lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="n"&gt;datetime&lt;/span&gt; &lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="n"&gt;date&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;timedelta&lt;/span&gt;

&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;ct_new_licenses&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;credential_type&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;days&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="p"&gt;:&lt;/span&gt;
    &lt;span class="n"&gt;since&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;date&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;today&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="nf"&gt;timedelta&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;days&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;days&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;isoformat&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;requests&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"https://data.ct.gov/resource/ngch-56tr.json"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;params&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="s2"&gt;"$select"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"name,type,credential,credentialnumber,status,issuedate,expirationdate,city,zip"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="s2"&gt;"$where"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;f&lt;/span&gt;&lt;span class="s2"&gt;"issuedate &amp;gt;= '{since}T00:00:00' AND credentialtype = '{credential_type}' AND type != 'INDIVIDUAL'"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="s2"&gt;"$order"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"issuedate DESC"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"$limit"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;50000&lt;/span&gt;&lt;span class="p"&gt;}&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;120&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;json&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="n"&gt;hic&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;ct_new_licenses&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"HIC"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;len&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;hic&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"new home improvement contractor credentials"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;Counter&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;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"type"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;r&lt;/span&gt; &lt;span class="k"&gt;in&lt;/span&gt; &lt;span class="n"&gt;hic&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;most_common&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;Counter&lt;/span&gt;&lt;span class="p"&gt;(&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;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"city"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="ow"&gt;or&lt;/span&gt; &lt;span class="s2"&gt;""&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;title&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;r&lt;/span&gt; &lt;span class="k"&gt;in&lt;/span&gt; &lt;span class="n"&gt;hic&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;most_common&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="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Other credential types in the same dataset
&lt;/h2&gt;

&lt;p&gt;The dataset covers far more than contractors. Swap the code to target a different market. In the same 30 days:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;code&gt;credentialtype&lt;/code&gt;&lt;/th&gt;
&lt;th&gt;Credential&lt;/th&gt;
&lt;th&gt;New in 30 days&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;HIC&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Home improvement contractor&lt;/td&gt;
&lt;td&gt;283 (239 businesses)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;LBD&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Liquor brand label&lt;/td&gt;
&lt;td&gt;973&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Explore the rest with a quick group-by:&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;requests&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"https://data.ct.gov/resource/ngch-56tr.json"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;params&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="s2"&gt;"$select"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"credentialtype, credential, count(*) AS n"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="s2"&gt;"$where"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"issuedate &amp;gt;= '2026-09-24T00:00:00'"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="s2"&gt;"$group"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"credentialtype, credential"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"$order"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"n DESC"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"$limit"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;50&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;json&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Note that the dataset also holds healthcare and other personal licenses (nurses, for example). Leave those out of any marketing list. They belong to individuals, not businesses.&lt;/p&gt;

&lt;h2&gt;
  
  
  Things that will trip you up
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Filter out individuals.&lt;/strong&gt; &lt;code&gt;type&lt;/code&gt; says whether the holder is an LLC, a corporation or an &lt;code&gt;INDIVIDUAL&lt;/code&gt;. The script keeps businesses only.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Status matters.&lt;/strong&gt; New credentials are usually &lt;code&gt;ACTIVE&lt;/code&gt;, but check &lt;code&gt;status&lt;/code&gt; before you export. A pending or lapsed registration isn't a working contractor yet.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Verify before you call.&lt;/strong&gt; The official lookup at &lt;code&gt;https://www.elicense.ct.gov/Lookup/LicenseLookup.aspx&lt;/code&gt; confirms any credential number.&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  What to do with it
&lt;/h2&gt;

&lt;p&gt;New HIC holders need general liability insurance, a supplier account, estimating software, a website and often a truck wrap, all in their first 90 days. A monthly pull, de-duplicated on &lt;code&gt;credentialnumber&lt;/code&gt;, gives you that list before your competitors find them.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Optional: if you'd rather not maintain the script, I publish this as a hosted, scheduled tool: &lt;a href="https://apify.com/loomwise/connecticut-business-licenses" rel="noopener noreferrer"&gt;Connecticut License Lookup&lt;/a&gt;, with ready-made categories such as &lt;code&gt;home_improvement&lt;/code&gt;, &lt;code&gt;trades&lt;/code&gt; and &lt;code&gt;food&lt;/code&gt; (paid per result). Disclosure: it's my tool. The code above does the same job for free.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>python</category>
      <category>opendata</category>
      <category>construction</category>
      <category>leadgen</category>
    </item>
    <item>
      <title>Automate a Weekly New York New-LLC Lead List with n8n (16,900 NY Filings in 23 Days)</title>
      <dc:creator>Loomwise</dc:creator>
      <pubDate>Mon, 09 Nov 2026 14:57:25 +0000</pubDate>
      <link>https://dev.to/loomwise/automate-a-weekly-new-york-new-llc-lead-list-with-n8n-16900-ny-filings-in-23-days-2f8j</link>
      <guid>https://dev.to/loomwise/automate-a-weekly-new-york-new-llc-lead-list-with-n8n-16900-ny-filings-in-23-days-2f8j</guid>
      <description>&lt;p&gt;New York's Department of State publishes every active corporation and LLC on data.ny.gov, updated daily, with the &lt;strong&gt;initial filing date, entity type and county&lt;/strong&gt;. That's a steady stream of brand-new companies that need banking, bookkeeping, insurance, signage and software.&lt;/p&gt;

&lt;p&gt;How steady? From Oct 1 to Oct 23, 2026, &lt;strong&gt;16,957 new entities&lt;/strong&gt; were filed: 11,291 domestic LLCs, 3,560 domestic business corporations, 915 foreign LLCs and 323 professional service LLCs. By county: Albany 2,305 (many registered-agent addresses), Kings/Brooklyn 2,299, New York/Manhattan 2,082, Queens 1,743, Nassau 1,574, Suffolk 1,462, Westchester 798, Bronx 645.&lt;/p&gt;

&lt;p&gt;This post builds a no-code workflow in n8n that drops last week's new Brooklyn and Queens LLCs into a Google Sheet every Monday morning.&lt;/p&gt;

&lt;h2&gt;
  
  
  Option A: straight from the open-data API (free)
&lt;/h2&gt;

&lt;p&gt;The dataset is a Socrata API, so a single &lt;strong&gt;HTTP Request&lt;/strong&gt; node can query it:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Method: &lt;code&gt;GET&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;URL: &lt;code&gt;https://data.ny.gov/resource/n9v6-gdp6.json&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Query parameters:

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;$select&lt;/code&gt; = &lt;code&gt;dos_id,current_entity_name,initial_dos_filing_date,county,entity_type&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;$where&lt;/code&gt; = &lt;code&gt;initial_dos_filing_date &amp;gt;= '{{ $now.minus({days: 7}).toFormat('yyyy-MM-dd') }}T00:00:00' AND county in ('Kings','Queens') AND entity_type = 'DOMESTIC LIMITED LIABILITY COMPANY'&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;$limit&lt;/code&gt; = &lt;code&gt;50000&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Test the same query from a terminal before you wire it up:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl -G &lt;span class="s2"&gt;"https://data.ny.gov/resource/n9v6-gdp6.json"&lt;/span&gt; \
  --data-urlencode &lt;span class="s2"&gt;"\$select=count(*)"&lt;/span&gt; \
  --data-urlencode &lt;span class="s2"&gt;"\$where=initial_dos_filing_date &amp;gt;= '2026-10-01T00:00:00' AND county in ('Kings','Queens')"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The catch: the raw rows include process addresses that often belong to a person or a registered-agent service, so you'll want to clean those before outreach.&lt;/p&gt;

&lt;h2&gt;
  
  
  Option B: through a hosted tool (cleaned rows)
&lt;/h2&gt;

&lt;p&gt;If you'd rather get cleaned business-only rows (no personal names, home-style addresses withheld), call an Apify Actor from the same HTTP Request node:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Method: &lt;code&gt;POST&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;URL: &lt;code&gt;https://api.apify.com/v2/acts/loomwise~new-york-new-business-filings/run-sync-get-dataset-items&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Header: &lt;code&gt;Authorization: Bearer &amp;lt;your Apify API token&amp;gt;&lt;/code&gt; (store it as an n8n credential, not in the node)&lt;/li&gt;
&lt;li&gt;Body (JSON):
&lt;/li&gt;
&lt;/ul&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="nl"&gt;"filedWithinDays"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;7&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="nl"&gt;"entityTypes"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"LLC"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="nl"&gt;"counties"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"Kings"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"Queens"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="nl"&gt;"maxResults"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;1000&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;code&gt;run-sync-get-dataset-items&lt;/code&gt; waits for the run to finish and returns the rows as a JSON array, so n8n splits them into items automatically.&lt;/p&gt;

&lt;h2&gt;
  
  
  The workflow
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Schedule Trigger&lt;/strong&gt;: every Monday at 7:00.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;HTTP Request&lt;/strong&gt;: Option A or B above.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Remove Duplicates&lt;/strong&gt; (optional): on &lt;code&gt;dos_id&lt;/code&gt;, if you append to the same sheet each week.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Google Sheets&lt;/strong&gt;: append rows, mapping name, filing date, entity type and county to columns.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;That's four nodes. Swap the counties for &lt;code&gt;Nassau&lt;/code&gt; and &lt;code&gt;Suffolk&lt;/code&gt;, or add a name keyword (&lt;code&gt;upper(current_entity_name) like '%CONSTRUCTION%'&lt;/code&gt;) to target one industry.&lt;/p&gt;

&lt;h2&gt;
  
  
  Tips
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Skip Albany for local outreach.&lt;/strong&gt; Its count is inflated by registered-agent and filing-service addresses in the state capital, not by local businesses.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Verify a filing&lt;/strong&gt; with the DOS public inquiry at &lt;code&gt;https://apps.dos.ny.gov/publicInquiry/&lt;/code&gt; using the &lt;code&gt;dos_id&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Run sync calls have a time limit.&lt;/strong&gt; For big pulls (a whole month statewide), start the run asynchronously and fetch the dataset when it finishes.&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;&lt;em&gt;Option B uses my tool, &lt;a href="https://apify.com/loomwise/new-york-new-business-filings" rel="noopener noreferrer"&gt;New York New Business Filings&lt;/a&gt; (paid per result). Disclosure: it's mine. Option A does the job for free.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>n8n</category>
      <category>automation</category>
      <category>nocode</category>
      <category>leadgen</category>
    </item>
    <item>
      <title>New Federal Contracts This Week: Issue #4 (2026-11-03 to 2026-11-08)</title>
      <dc:creator>Loomwise</dc:creator>
      <pubDate>Mon, 09 Nov 2026 14:11:39 +0000</pubDate>
      <link>https://dev.to/loomwise/new-federal-contracts-this-week-issue-4-2026-11-03-to-2026-11-08-4ca8</link>
      <guid>https://dev.to/loomwise/new-federal-contracts-this-week-issue-4-2026-11-03-to-2026-11-08-4ca8</guid>
      <description>&lt;p&gt;&lt;em&gt;A free weekly roundup of new SAM.gov solicitations, built from SAM.gov's official public data with the &lt;a href="https://apify.com/loomwise/federal-opportunities" rel="noopener noreferrer"&gt;Federal Contract Opportunities feed&lt;/a&gt;. Not affiliated with GSA or SAM.gov. Always confirm details on the notice itself.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;This week:&lt;/strong&gt; 3,602 new solicitations and combined synopsis/solicitations posted.&lt;/p&gt;

&lt;h2&gt;
  
  
  Who is buying
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Agency&lt;/th&gt;
&lt;th&gt;Notices&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Dept Of Defense&lt;/td&gt;
&lt;td&gt;2,886&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Veterans Affairs, Department Of&lt;/td&gt;
&lt;td&gt;175&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Homeland Security, Department Of&lt;/td&gt;
&lt;td&gt;91&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Agriculture, Department Of&lt;/td&gt;
&lt;td&gt;87&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Justice, Department Of&lt;/td&gt;
&lt;td&gt;80&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Interior, Department Of The&lt;/td&gt;
&lt;td&gt;64&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Energy, Department Of&lt;/td&gt;
&lt;td&gt;49&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Health And Human Services, Department Of&lt;/td&gt;
&lt;td&gt;36&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  Set-asides
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Set-aside&lt;/th&gt;
&lt;th&gt;Notices&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;No set-aside&lt;/td&gt;
&lt;td&gt;1,754&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Small Business Set Aside - Total&lt;/td&gt;
&lt;td&gt;1,457&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Service-Disabled Veteran-Owned Small Business (SDVOSB) Set-Aside (FAR 19.14)&lt;/td&gt;
&lt;td&gt;202&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Historically Underutilized Business (HUBZone) Set-Aside (FAR 19.13)&lt;/td&gt;
&lt;td&gt;93&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;SBA Certified Women-Owned Small Business (WOSB) Program Set-Aside (FAR 19.15)&lt;/td&gt;
&lt;td&gt;53&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;8(a) Set-Aside (FAR 19.8)&lt;/td&gt;
&lt;td&gt;20&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Small Business Set Aside - Partial&lt;/td&gt;
&lt;td&gt;6&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  By industry (NAICS sector)
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;NAICS sector&lt;/th&gt;
&lt;th&gt;Notices&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;33 Manufacturing&lt;/td&gt;
&lt;td&gt;2,590&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;23 Construction&lt;/td&gt;
&lt;td&gt;252&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;56 Admin, support &amp;amp; facilities&lt;/td&gt;
&lt;td&gt;127&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;54 Professional/technical services&lt;/td&gt;
&lt;td&gt;109&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;32 Manufacturing&lt;/td&gt;
&lt;td&gt;103&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;31 Manufacturing&lt;/td&gt;
&lt;td&gt;93&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;81 Repair &amp;amp; other services&lt;/td&gt;
&lt;td&gt;75&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;48 Transportation&lt;/td&gt;
&lt;td&gt;47&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  Top places of performance
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;State&lt;/th&gt;
&lt;th&gt;Notices&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;VA&lt;/td&gt;
&lt;td&gt;58&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;MD&lt;/td&gt;
&lt;td&gt;55&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;CA&lt;/td&gt;
&lt;td&gt;50&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;TX&lt;/td&gt;
&lt;td&gt;36&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;IL&lt;/td&gt;
&lt;td&gt;34&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;FL&lt;/td&gt;
&lt;td&gt;30&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;GA&lt;/td&gt;
&lt;td&gt;26&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;OK&lt;/td&gt;
&lt;td&gt;25&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  Picks: still open, closing soonest (due on or after 2026-11-10)
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Service-disabled veteran-owned (SDVOSB) set-asides
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://sam.gov/workspace/contract/opp/577f2b3cff72458a8fb84b7e07048df0/view" rel="noopener noreferrer"&gt;J045--FY27 Boilers Maintenance &amp;amp; Testing&lt;/a&gt; · Veterans Affairs, Department Of · NAICS 238220 · San Juan, PR · due 2026-11-10&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://sam.gov/workspace/contract/opp/619b508977ab4cf58eee8515900ff0d7/view" rel="noopener noreferrer"&gt;H941--Chemical Hoods &amp;amp; HEPA PM&lt;/a&gt; · Veterans Affairs, Department Of · NAICS 541620 · Indianapolis, IN · due 2026-11-10&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://sam.gov/workspace/contract/opp/e72699b568ca4a1897478836a08c3cc7/view" rel="noopener noreferrer"&gt;36C25227Q0048 - COOLERS AND FREEZER&lt;/a&gt; · Veterans Affairs, Department Of · NAICS 333415 · North Chicago, IL · due 2026-11-10&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://sam.gov/workspace/contract/opp/6538b1b9955848f5a1c5836e0cbd7052/view" rel="noopener noreferrer"&gt;J041--NTX – Preventive and Corrective Maintenance for Ice Machines&lt;/a&gt; · Veterans Affairs, Department Of · NAICS 811310 · location n/a · due 2026-11-10&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://sam.gov/workspace/contract/opp/fbee7167150e44cfb53fbb70458f95b3/view" rel="noopener noreferrer"&gt;Z2NZ-- 658-23-108 Correct Stormwater Drainage&lt;/a&gt; · Veterans Affairs, Department Of · NAICS 237110 · Salem, VA · due 2026-11-10&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Women-owned (WOSB/EDWOSB) set-asides
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://sam.gov/workspace/contract/opp/54a9a72762ed4aaf949cae7f6c3f2e7d/view" rel="noopener noreferrer"&gt;Sheave&lt;/a&gt; · Homeland Security, Department Of · NAICS 336413 · location n/a · due 2026-11-10&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://sam.gov/workspace/contract/opp/ca8880314e0947b69ee27fe3cbb66fa3/view" rel="noopener noreferrer"&gt;31--BUSHING,SLEEVE&lt;/a&gt; · Dept Of Defense · NAICS 332991 · location n/a · due 2026-11-12&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://sam.gov/workspace/contract/opp/4bac012668764899bb0d4d1da3d6f02d/view" rel="noopener noreferrer"&gt;56 CS FOC to Flightline and Wx Equipment, Luke AFB&lt;/a&gt; · Dept Of Defense · NAICS 335921 · Luke Air Force Base, AZ · due 2026-11-12&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://sam.gov/workspace/contract/opp/c6dfa9d2f47443c887afb6a6b061f1b1/view" rel="noopener noreferrer"&gt;59--GROUNDING ASSEMBLY,SHA&lt;/a&gt; · Dept Of Defense · NAICS 335999 · location n/a · due 2026-11-13&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://sam.gov/workspace/contract/opp/6e7926bad9c94e799e2b39505ccf2418/view" rel="noopener noreferrer"&gt;16--BAND,BRAKE&lt;/a&gt; · Dept Of Defense · NAICS 336413 · location n/a · due 2026-11-13&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  HUBZone set-asides
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://sam.gov/workspace/contract/opp/1d2002a544ec49fabd94f77f4deea71a/view" rel="noopener noreferrer"&gt;66--TRANSDUCER,MOTIONAL PI&lt;/a&gt; · Dept Of Defense · NAICS 334419 · location n/a · due 2026-11-12&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://sam.gov/workspace/contract/opp/991c87bccfb14965aba47ebaefdc89ac/view" rel="noopener noreferrer"&gt;59--CABLE ASSEMBLY,SPECIAL&lt;/a&gt; · Dept Of Defense · NAICS 335931 · location n/a · due 2026-11-12&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://sam.gov/workspace/contract/opp/c144cd2325cb4b748fd227c333a76af9/view" rel="noopener noreferrer"&gt;14--SUPPORT,GUIDED MISSILE&lt;/a&gt; · Dept Of Defense · NAICS 336419 · location n/a · due 2026-11-12&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://sam.gov/workspace/contract/opp/0550946d724b4a19b8c09b991c0ff931/view" rel="noopener noreferrer"&gt;15--PIVOT-SHAFT ASSEMBLY&lt;/a&gt; · Dept Of Defense · NAICS 336413 · location n/a · due 2026-11-12&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://sam.gov/workspace/contract/opp/1b98fa63c3c44721850d93b4d2ea5bf4/view" rel="noopener noreferrer"&gt;53--BOL T,SHEAR&lt;/a&gt; · Dept Of Defense · NAICS 332722 · location n/a · due 2026-11-12&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  8(a) set-asides
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://sam.gov/workspace/contract/opp/d25bfda2f8bc40dfa55ad9af90cbe196/view" rel="noopener noreferrer"&gt;R--Geographic Information System (GIS) support, prepa&lt;/a&gt; · Interior, Department Of The · NAICS 561110 · location n/a · due 2026-11-10&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://sam.gov/workspace/contract/opp/f2d7d77f6df84e68ae8b4404c4e62b7b/view" rel="noopener noreferrer"&gt;SABER V Hill AFB&lt;/a&gt; · Dept Of Defense · NAICS 236220 · location n/a · due 2026-11-10&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://sam.gov/workspace/contract/opp/82697b4854ba47f2aeb19c91d2526912/view" rel="noopener noreferrer"&gt;R--Technical Services Support&lt;/a&gt; · Energy, Department Of · NAICS 541690 · location n/a · due 2026-11-11&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://sam.gov/workspace/contract/opp/ea96dae71cbd415c97cc5b191b00ef7d/view" rel="noopener noreferrer"&gt;Cybersecurity Engineering and DoD Risk Management Framework (RMF) Support Services&lt;/a&gt; · Dept Of Defense · NAICS 541519 · Aberdeen Proving Ground, MD · due 2026-11-12&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://sam.gov/workspace/contract/opp/2e187dc27aea46228404541efefa6622/view" rel="noopener noreferrer"&gt;EXHAUST FASTENER KIT&lt;/a&gt; · Homeland Security, Department Of · NAICS 333618 · Curtis Bay, MD · due 2026-11-13&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Construction (NAICS 23)
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://sam.gov/workspace/contract/opp/ada1bb600cea47db8ae9dd2e7a8adea2/view" rel="noopener noreferrer"&gt;J061--ELECTRICAL TESTING (SOLICITATION)&lt;/a&gt; · Veterans Affairs, Department Of · NAICS 238210 · Hampton, VA · due 2026-11-10&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://sam.gov/workspace/contract/opp/577f2b3cff72458a8fb84b7e07048df0/view" rel="noopener noreferrer"&gt;J045--FY27 Boilers Maintenance &amp;amp; Testing&lt;/a&gt; · Veterans Affairs, Department Of · NAICS 238220 · San Juan, PR · due 2026-11-10&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://sam.gov/workspace/contract/opp/9edb9b1757094c2eb2ff4e01e13dfb3a/view" rel="noopener noreferrer"&gt;106 CE ELECTRICAL LOOP REPAIR&lt;/a&gt; · Dept Of Defense · NAICS 238210 · location n/a · due 2026-11-10&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://sam.gov/workspace/contract/opp/f3c26c04b4194ceebdf19e1fa044a154/view" rel="noopener noreferrer"&gt;Maintenance Dredging of the Isle au Haut Thoroughfare near Isle au Haut, Maine&lt;/a&gt; · Dept Of Defense · NAICS 237990 · location n/a · due 2026-11-10&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://sam.gov/workspace/contract/opp/afeabbedc1434331a02a88f571fd5353/view" rel="noopener noreferrer"&gt;Acadia National Park&lt;/a&gt; · Transportation, Department Of · NAICS 237310 · ME · due 2026-11-10&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  IT and computer services (NAICS 5415)
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://sam.gov/workspace/contract/opp/8a72648f2d8f450e98996c8229c2e31e/view" rel="noopener noreferrer"&gt;MacKinney Batch to CICS solicitation.&lt;/a&gt; · Social Security Administration · NAICS 541519 · location n/a · due 2026-11-10&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://sam.gov/workspace/contract/opp/d3adac6944584f0fb476d69d993568a2/view" rel="noopener noreferrer"&gt;JFrog Artifactory Subscription Maintenance&lt;/a&gt; · Federal Deposit Insurance Corporation · NAICS 541519 · Arlington, VA · due 2026-11-10&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://sam.gov/workspace/contract/opp/a00db012b9bd49f69efdda33d728d6ae/view" rel="noopener noreferrer"&gt;Security Equipment for the United States Naval Academy&lt;/a&gt; · Dept Of Defense · NAICS 541519 · MD · due 2026-11-12&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://sam.gov/workspace/contract/opp/ea96dae71cbd415c97cc5b191b00ef7d/view" rel="noopener noreferrer"&gt;Cybersecurity Engineering and DoD Risk Management Framework (RMF) Support Services&lt;/a&gt; · Dept Of Defense · NAICS 541519 · Aberdeen Proving Ground, MD · due 2026-11-12&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://sam.gov/workspace/contract/opp/ec03308fb0ff457e9ac4c0418ed3b963/view" rel="noopener noreferrer"&gt;Enterprise Next (ENX) Draft RFP&lt;/a&gt; · National Aeronautics And Space Administration · NAICS 541512 · Greenbelt, MD · due 2026-11-13&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Editor's note
&lt;/h2&gt;

&lt;p&gt;New solicitations jumped to 3,602 this week, up from 2,609 in &lt;a href="https://dev.to/loomwise/new-federal-contracts-this-week-issue-3-2026-10-27-to-2026-11-01-315k"&gt;Issue #3&lt;/a&gt;. The Department of Defense posted 2,886 of them (about 80%), and manufacturing NAICS codes (31 to 33) again made up most of the volume. Total small business set-asides rose to 1,457 from 949, SDVOSB set-asides climbed to 202 from 131, HUBZone set-asides to 93 from 70, and WOSB set-asides to 53 from 38. Virginia led the places of performance with 58 notices.&lt;/p&gt;

&lt;h2&gt;
  
  
  Get your own version
&lt;/h2&gt;

&lt;p&gt;Want this filtered to your NAICS codes, set-asides and states, every morning? Run the &lt;a href="https://apify.com/loomwise/federal-opportunities" rel="noopener noreferrer"&gt;Federal Contract Opportunities feed&lt;/a&gt; on a daily schedule. No SAM.gov API key needed; $0.90 per 1,000 results.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Data: SAM.gov Contract Opportunities public extract (U.S. government work). Counts cover the notice types Solicitation and Combined Synopsis/Solicitation.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Previous issue: &lt;a href="https://dev.to/loomwise/new-federal-contracts-this-week-issue-3-2026-10-27-to-2026-11-01-315k"&gt;Issue #3 (2026-10-27 to 2026-11-01)&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>govcon</category>
      <category>opendata</category>
      <category>government</category>
      <category>smallbusiness</category>
    </item>
    <item>
      <title>Search Grants.gov from Python with No API Key: Find Open Federal Grants for Your Nonprofit</title>
      <dc:creator>Loomwise</dc:creator>
      <pubDate>Fri, 06 Nov 2026 15:44:04 +0000</pubDate>
      <link>https://dev.to/loomwise/search-grantsgov-from-python-with-no-api-key-find-open-federal-grants-for-your-nonprofit-48og</link>
      <guid>https://dev.to/loomwise/search-grantsgov-from-python-with-no-api-key-find-open-federal-grants-for-your-nonprofit-48og</guid>
      <description>&lt;p&gt;Grants.gov lists every federal grant, 867 open on the day I checked, but its website search is clunky if you check regularly. Grants.gov also has a &lt;strong&gt;public search API that needs no key and no account&lt;/strong&gt;, and almost nobody uses it. This post shows how to call it from Python to build a standing list of open and upcoming grants that match your mission.&lt;/p&gt;

&lt;p&gt;Run on Oct 22, 2026, a search for "workforce" grants open to 501(c)(3) nonprofits returned &lt;strong&gt;96 open or forecasted opportunities&lt;/strong&gt;. The soonest deadlines included NIH genomics research projects (closing Oct 30) and Department of Transportation Small Business Transportation Technical Assistance Centers (closing Oct 31).&lt;/p&gt;

&lt;h2&gt;
  
  
  The API
&lt;/h2&gt;

&lt;p&gt;&lt;code&gt;POST https://api.grants.gov/v1/api/search2&lt;/code&gt; with a JSON body. Useful fields:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Field&lt;/th&gt;
&lt;th&gt;What it does&lt;/th&gt;
&lt;th&gt;Example&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;keyword&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;full-text search&lt;/td&gt;
&lt;td&gt;&lt;code&gt;"workforce"&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;oppStatuses&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;pipe-separated statuses&lt;/td&gt;
&lt;td&gt;`"forecasted\&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;{% raw %}&lt;code&gt;eligibilities&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;pipe-separated applicant-type codes&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;"12"&lt;/code&gt; = 501(c)(3) nonprofits, &lt;code&gt;"25"&lt;/code&gt; = others, &lt;code&gt;"00"&lt;/code&gt; = state governments&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;agencies&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;agency code&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;"HHS"&lt;/code&gt;, &lt;code&gt;"DOL"&lt;/code&gt;, &lt;code&gt;"USDA"&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;code&gt;rows&lt;/code&gt;, &lt;code&gt;startRecordNum&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;paging&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;100&lt;/code&gt;, &lt;code&gt;0&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  The script
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="n"&gt;requests&lt;/span&gt;
&lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="n"&gt;datetime&lt;/span&gt; &lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="n"&gt;datetime&lt;/span&gt;
&lt;span class="no"&gt;SEARCH&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"https://api.grants.gov/v1/api/search2"&lt;/span&gt;   &lt;span class="c1"&gt;# public, no API key or login&lt;/span&gt;

&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;search_grants&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;keyword&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;""&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;eligibilities&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;""&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;agencies&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;""&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;rows&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;100&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="s2"&gt;"""Return all currently posted (open) and forecasted grants that match."""&lt;/span&gt;
    &lt;span class="n"&gt;out&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;start&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;
    &lt;span class="k"&gt;while&lt;/span&gt; &lt;span class="kc"&gt;True&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="p"&gt;{&lt;/span&gt;&lt;span class="s2"&gt;"keyword"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;keyword&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"oppStatuses"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"forecasted|posted"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"eligibilities"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;eligibilities&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                &lt;span class="s2"&gt;"agencies"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;agencies&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"rows"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;rows&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"startRecordNum"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;start&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;requests&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;post&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="no"&gt;SEARCH&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;json&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;body&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;timeout&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;60&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;json&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"data"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
        &lt;span class="n"&gt;out&lt;/span&gt; &lt;span class="o"&gt;+=&lt;/span&gt; &lt;span class="n"&gt;data&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"oppHits"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
        &lt;span class="n"&gt;start&lt;/span&gt; &lt;span class="o"&gt;+=&lt;/span&gt; &lt;span class="n"&gt;rows&lt;/span&gt;
        &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;start&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;=&lt;/span&gt; &lt;span class="n"&gt;data&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"hitCount"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
            &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;out&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;data&lt;/span&gt;

&lt;span class="n"&gt;hits&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="nf"&gt;search_grants&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;keyword&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"workforce"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;eligibilities&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"12"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;  &lt;span class="c1"&gt;# 12 = nonprofits with 501(c)(3) status&lt;/span&gt;
&lt;span class="k"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;len&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;hits&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"open or forecasted 'workforce' grants for 501(c)(3) nonprofits"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;close&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;h&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;  &lt;span class="c1"&gt;# closeDate is MM/DD/YYYY text, or empty for forecasts&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;datetime&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;strptime&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;h&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"closeDate"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"%m/%d/%Y"&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;h&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="s2"&gt;"closeDate"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;else&lt;/span&gt; &lt;span class="n"&gt;datetime&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nb"&gt;max&lt;/span&gt;
&lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;h&lt;/span&gt; &lt;span class="k"&gt;in&lt;/span&gt; &lt;span class="nb"&gt;sorted&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;hits&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;key&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;close&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="k"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;" -"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;h&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"closeDate"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="ow"&gt;or&lt;/span&gt; &lt;span class="s2"&gt;"(no close date)"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;h&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"agencyCode"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;h&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"number"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;h&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"title"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;60&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
          &lt;span class="n"&gt;f&lt;/span&gt;&lt;span class="s2"&gt;"https://www.grants.gov/search-results-detail/{h['id']}"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Three things that will trip you up
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Dates are &lt;code&gt;MM/DD/YYYY&lt;/code&gt; text.&lt;/strong&gt; Sorting them as strings puts January 2027 before October 2026. Parse them, as the script does.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Forecasts have no close date.&lt;/strong&gt; Forecasted grants (expected but not yet open) usually have an empty &lt;code&gt;closeDate&lt;/code&gt;. Don't drop them: forecasts give you months of lead time to line up partners.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Keywords are broad.&lt;/strong&gt; "Workforce" also matches research grants that mention the workforce in passing. Narrow with &lt;code&gt;agencies&lt;/code&gt; (DOL for job training, for example) or add a second keyword filter on &lt;code&gt;title&lt;/code&gt; in Python.&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Make it a weekly digest
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Run it weekly, store the &lt;code&gt;id&lt;/code&gt; values you've seen, and email yourself only the new ones.&lt;/li&gt;
&lt;li&gt;Run several searches (one per program area) and merge them on &lt;code&gt;id&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;The detail page &lt;code&gt;https://www.grants.gov/search-results-detail/{id}&lt;/code&gt; has the full notice and application package.&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;&lt;em&gt;Optional: I run this as a hosted, scheduled search that combines Grants.gov with SAM.gov contract notices: &lt;a href="https://apify.com/loomwise/federal-opportunities/examples/federal-grants-open" rel="noopener noreferrer"&gt;Open Federal Grants (ready-made search)&lt;/a&gt; (paid per result). Disclosure: it's my tool. The script above does the same job for free.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>python</category>
      <category>nonprofit</category>
      <category>opendata</category>
      <category>tutorial</category>
    </item>
    <item>
      <title>Find the Busiest Contractors in Any City from Building Permit Data (A B2B Lead List in Python)</title>
      <dc:creator>Loomwise</dc:creator>
      <pubDate>Thu, 05 Nov 2026 15:05:17 +0000</pubDate>
      <link>https://dev.to/loomwise/find-the-busiest-contractors-in-any-city-from-building-permit-data-a-b2b-lead-list-in-python-24ag</link>
      <guid>https://dev.to/loomwise/find-the-busiest-contractors-in-any-city-from-building-permit-data-a-b2b-lead-list-in-python-24ag</guid>
      <description>&lt;p&gt;If you sell to contractors (materials, equipment rental, insurance, software, financing, staffing), your best prospects are the ones pulling the most permits right now. Permit counts are public. Many cities publish every permit with the contractor's business name and the declared project value, so you can rank every contractor in a market by real activity instead of guessing from Google reviews.&lt;/p&gt;

&lt;p&gt;This post builds a &lt;strong&gt;"busiest contractors" ranking from 90 days of permits&lt;/strong&gt; in three markets, with one Python script, and shows how to clean the names so the same company groups together.&lt;/p&gt;

&lt;p&gt;Run on Oct 22, 2026 (last 90 days):&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Miami-Dade County, FL:&lt;/strong&gt; 17,170 permits from 4,012 contractor businesses. The busiest were American Residential Services of Florida (172 permits), Lennar Homes (148 permits, $31.6M declared) and Arnold J Electric (110 permits, $12.4M).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Orlando, FL:&lt;/strong&gt; 5,937 permits from 1,467 businesses. Pulte Home Company led with 230 permits and $30.8M, followed by Josko LLC (136) and Wayne Automatic Fire Sprinklers (100).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Everett, WA:&lt;/strong&gt; 1,979 permits from 575 businesses. CM Heating led with 88, then VECA Electric &amp;amp; Tech (50) and Sequoyah Electric (42).&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  The data sources
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Market&lt;/th&gt;
&lt;th&gt;Platform&lt;/th&gt;
&lt;th&gt;Dataset&lt;/th&gt;
&lt;th&gt;Contractor column&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Miami-Dade County&lt;/td&gt;
&lt;td&gt;ArcGIS REST&lt;/td&gt;
&lt;td&gt;&lt;a href="https://services.arcgis.com/8Pc9XBTAsYuxx9Ny/arcgis/rest/services/miamidade_permit_data/FeatureServer/0" rel="noopener noreferrer"&gt;miamidade_permit_data&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;ContractorName&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Orlando&lt;/td&gt;
&lt;td&gt;Socrata&lt;/td&gt;
&lt;td&gt;&lt;a href="https://data.cityoforlando.net/d/ryhf-m453" rel="noopener noreferrer"&gt;ryhf-m453&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;contractor_name&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Everett&lt;/td&gt;
&lt;td&gt;Socrata&lt;/td&gt;
&lt;td&gt;&lt;a href="https://data.everettwa.gov/d/3w3u-656c" rel="noopener noreferrer"&gt;3w3u-656c&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;contractorname&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  The script
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="n"&gt;re&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;requests&lt;/span&gt;
&lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="n"&gt;collections&lt;/span&gt; &lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="n"&gt;defaultdict&lt;/span&gt;
&lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="n"&gt;datetime&lt;/span&gt; &lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="n"&gt;date&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;timedelta&lt;/span&gt;
&lt;span class="n"&gt;since&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;date&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;today&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="nf"&gt;timedelta&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;days&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;90&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="no"&gt;ENTITY&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;re&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nb"&gt;compile&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;r&lt;/span&gt;&lt;span class="s2"&gt;"\b(LLC|L\.L\.C|INC|CORP|CORPORATION|CO|COMPANY|LTD|LLP|LP|PLLC|ENTERPRISES|SERVICES|CONSTRUCTION|ROOFING|ELECTRIC|PLUMBING|HEATING)\b"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;re&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="no"&gt;I&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;clean&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="s2"&gt;"""Normalize a contractor name so the same company groups together."""&lt;/span&gt;
    &lt;span class="n"&gt;n&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;re&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;sub&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;r&lt;/span&gt;&lt;span class="s2"&gt;"\((CONST|ELECT?|PLMB|MECH)\)"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;""&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;upper&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;      &lt;span class="c1"&gt;# Everett appends the license type&lt;/span&gt;
    &lt;span class="n"&gt;n&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;re&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;sub&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;r&lt;/span&gt;&lt;span class="s2"&gt;"[.,\\]"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;""&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;n&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;re&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;sub&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;r&lt;/span&gt;&lt;span class="s2"&gt;"\s+"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;" "&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;n&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;strip&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;socrata&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;domain&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;ds&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;dfield&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;cfield&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;vfield&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="n"&gt;rows&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;requests&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;f&lt;/span&gt;&lt;span class="s2"&gt;"https://{domain}/resource/{ds}.json"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;params&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="s2"&gt;"$select"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;f&lt;/span&gt;&lt;span class="s2"&gt;"{cfield} AS c, {vfield} AS v"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"$where"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;f&lt;/span&gt;&lt;span class="s2"&gt;"{dfield} &amp;gt;= '{since}' AND {cfield} IS NOT NULL"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="s2"&gt;"$limit"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;50000&lt;/span&gt;&lt;span class="p"&gt;}&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;120&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;json&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;[&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="s2"&gt;"c"&lt;/span&gt;&lt;span class="p"&gt;]&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;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"v"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;r&lt;/span&gt; &lt;span class="k"&gt;in&lt;/span&gt; &lt;span class="n"&gt;rows&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;

&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;miami_dade&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="n"&gt;url&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"https://services.arcgis.com/8Pc9XBTAsYuxx9Ny/arcgis/rest/services/miamidade_permit_data/FeatureServer/0/query"&lt;/span&gt;
    &lt;span class="n"&gt;out&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;offset&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;
    &lt;span class="k"&gt;while&lt;/span&gt; &lt;span class="kc"&gt;True&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="n"&gt;js&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;requests&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;url&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;params&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="s2"&gt;"where"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;f&lt;/span&gt;&lt;span class="s2"&gt;"PermitIssuedDate &amp;gt;= DATE '{since}' AND ContractorName IS NOT NULL"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
              &lt;span class="s2"&gt;"outFields"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"ContractorName,EstimatedValue"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"resultOffset"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;offset&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"resultRecordCount"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;2000&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"f"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"json"&lt;/span&gt;&lt;span class="p"&gt;}&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;120&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;json&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="n"&gt;feats&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;js&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="s2"&gt;"features"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="n"&gt;out&lt;/span&gt; &lt;span class="o"&gt;+=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;f&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"attributes"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"ContractorName"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;f&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"attributes"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"EstimatedValue"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;f&lt;/span&gt; &lt;span class="k"&gt;in&lt;/span&gt; &lt;span class="n"&gt;feats&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;js&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="s2"&gt;"exceededTransferLimit"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;out&lt;/span&gt;
        &lt;span class="n"&gt;offset&lt;/span&gt; &lt;span class="o"&gt;+=&lt;/span&gt; &lt;span class="nb"&gt;len&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;feats&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;leaderboard&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;pairs&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;top&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="n"&gt;agg&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;defaultdict&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;lambda&lt;/span&gt;&lt;span class="p"&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="mf"&gt;0.0&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;val&lt;/span&gt; &lt;span class="k"&gt;in&lt;/span&gt; &lt;span class="n"&gt;pairs&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="n"&gt;n&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;name&lt;/span&gt; &lt;span class="ow"&gt;or&lt;/span&gt; &lt;span class="s2"&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="no"&gt;ENTITY&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;search&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;n&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="ow"&gt;or&lt;/span&gt; &lt;span class="n"&gt;n&lt;/span&gt; &lt;span class="k"&gt;in&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"OWNER"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"OWNER BUILDER"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
            &lt;span class="k"&gt;continue&lt;/span&gt;  &lt;span class="c1"&gt;# keep businesses only; skip owner-builders and personal names&lt;/span&gt;
        &lt;span class="n"&gt;agg&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;n&lt;/span&gt;&lt;span class="p"&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="o"&gt;+=&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;
        &lt;span class="k"&gt;try&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;agg&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;n&lt;/span&gt;&lt;span class="p"&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="o"&gt;+=&lt;/span&gt; &lt;span class="kt"&gt;float&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;val&lt;/span&gt; &lt;span class="ow"&gt;or&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="k"&gt;except&lt;/span&gt; &lt;span class="nc"&gt;ValueError&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="k"&gt;pass&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nb"&gt;sorted&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;agg&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;items&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;key&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="k"&gt;lambda&lt;/span&gt; &lt;span class="n"&gt;kv&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;kv&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="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="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;reverse&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="kc"&gt;True&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="n"&gt;top&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nb"&gt;len&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;agg&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;label&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;pairs&lt;/span&gt; &lt;span class="k"&gt;in&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
    &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"Everett, WA"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nf"&gt;socrata&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"data.everettwa.gov"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"3w3u-656c"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"issueddate"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"contractorname"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"jobvalue"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"Orlando, FL"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nf"&gt;socrata&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"data.cityoforlando.net"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"ryhf-m453"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"issue_permit_date"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"contractor_name"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"estimated_cost"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"Miami-Dade County, FL"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nf"&gt;miami_dade&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="n"&gt;top&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;n&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;leaderboard&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;pairs&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;f&lt;/span&gt;&lt;span class="s2"&gt;"{label}: {len(pairs)} permits, {n} contractor businesses. Busiest:"&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;name&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;cnt&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;val&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;in&lt;/span&gt; &lt;span class="n"&gt;top&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="k"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;f&lt;/span&gt;&lt;span class="s2"&gt;"   {cnt:4d} permits  ${val:&amp;gt;13,.0f}  {name}"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Three things that will trip you up
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;One company, many spellings.&lt;/strong&gt; Everett appends the license type, as in "VECA (ELECT) ELECTRIC &amp;amp; TECH LLC", and Miami-Dade escapes commas with a backslash. &lt;code&gt;clean()&lt;/code&gt; strips these so permits group under one name. Look at the top 50 names in each new city and add rules as needed.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Skip owner-builders and people.&lt;/strong&gt; Permits pulled by homeowners say "OWNER", and some list a person's name. The script keeps only names with a business marker (LLC, Inc, Construction, Roofing...). That keeps the list B2B and avoids personal data.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Count and dollars tell different stories.&lt;/strong&gt; Service companies (HVAC, electrical, fire sprinklers) pull many small permits, and home builders pull fewer, bigger ones. Rank by count to find service businesses and by declared value for builders, depending on who you sell to.&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Turning it into a sales list
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Export to CSV and add the trade (from the name or permit type) and a rank.&lt;/li&gt;
&lt;li&gt;Re-run monthly and watch movers: a contractor whose permit count doubled is hiring and buying.&lt;/li&gt;
&lt;li&gt;Add more markets: any Socrata or ArcGIS permit feed with a contractor column works. Just add a line to the list at the bottom.&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;&lt;em&gt;Optional: I run a hosted permits tool covering 47 cities and counties in 20 states plus DC, with contractor names, values and addresses in one format: &lt;a href="https://apify.com/loomwise/city-building-permits" rel="noopener noreferrer"&gt;US City Building Permits&lt;/a&gt; (paid per result). Disclosure: it's my tool. The script above does the same job for free for the markets you add.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>python</category>
      <category>opendata</category>
      <category>sales</category>
      <category>leadgen</category>
    </item>
    <item>
      <title>Newly Licensed Roofing, HVAC, Painting and Landscaping Contractors in Washington State (Python + L&amp;I Open Data)</title>
      <dc:creator>Loomwise</dc:creator>
      <pubDate>Wed, 04 Nov 2026 15:13:26 +0000</pubDate>
      <link>https://dev.to/loomwise/newly-licensed-roofing-hvac-painting-and-landscaping-contractors-in-washington-state-python--1noi</link>
      <guid>https://dev.to/loomwise/newly-licensed-roofing-hvac-painting-and-landscaping-contractors-in-washington-state-python--1noi</guid>
      <description>&lt;p&gt;Washington's Department of Labor &amp;amp; Industries (L&amp;amp;I) licenses every construction contractor in the state, and publishes the full license file as open data on data.wa.gov, with each contractor's specialty, business type, city and license dates. Filter it by specialty and you get a list of &lt;strong&gt;brand-new trade businesses&lt;/strong&gt;: exactly who equipment suppliers, insurance agents, bonding companies, fleet and uniform vendors, and trade-software companies want to reach.&lt;/p&gt;

&lt;p&gt;This post shows how to pull new Washington contractor businesses by trade with one Python script, using only the official API.&lt;/p&gt;

&lt;p&gt;Run on Oct 22, 2026, for licenses that took effect in the last 90 days (businesses only):&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Landscaping and tree service:&lt;/strong&gt; 72, led by Seattle (8) and Tacoma (5)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Painting:&lt;/strong&gt; 66, led by Tacoma and Vancouver (4 each)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;HVAC/R:&lt;/strong&gt; 48, spread out with Washougal and Spokane Valley on top (3 each)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Roofing, gutters and siding:&lt;/strong&gt; 34, led by Spokane (4), and Portland-based firms licensing into Washington (3)&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  The data source
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://data.wa.gov/d/m8qx-ubtq" rel="noopener noreferrer"&gt;L&amp;amp;I Contractor License Data - General&lt;/a&gt; on data.wa.gov (Socrata). It has about 160,000 licenses, with business name, license number, specialty code, business type, address, phone, effective and expiration dates, and status.&lt;/p&gt;

&lt;h2&gt;
  
  
  The script
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="n"&gt;requests&lt;/span&gt;
&lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="n"&gt;collections&lt;/span&gt; &lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="nc"&gt;Counter&lt;/span&gt;
&lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="n"&gt;datetime&lt;/span&gt; &lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="n"&gt;date&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;timedelta&lt;/span&gt;
&lt;span class="n"&gt;since&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;date&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;today&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="nf"&gt;timedelta&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;days&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;90&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;isoformat&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="no"&gt;TRADES&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;  &lt;span class="c1"&gt;# WA L&amp;amp;I specialty descriptions, grouped by trade&lt;/span&gt;
    &lt;span class="s2"&gt;"roofing"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"ROOFING"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"GUTTERS/DOWNSPOUTS"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"Siding"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="s2"&gt;"hvac"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"Heating/Vent/Air-Conditioning and Refrig (HVAC/R) "&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"HVAC/RFRG"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="s2"&gt;"painting"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"PAINTING/WALLCOVERING"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="s2"&gt;"landscaping"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"LANDSCAPING"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"Tree Removal Service"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="no"&gt;BUSINESS_TYPES&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"Corporation"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"Limited Liability Company"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"Partnership"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"Limited Liability Partnership"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="no"&gt;SELECT&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"businessname,contractorlicensenumber,specialtycode1desc,businesstypecodedesc,"&lt;/span&gt;
          &lt;span class="s2"&gt;"city,zip,licenseeffectivedate,licenseexpirationdate,contractorlicensestatus"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;  &lt;span class="c1"&gt;# no principal names&lt;/span&gt;

&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;new_contractors&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;specialties&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="n"&gt;where&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;f&lt;/span&gt;&lt;span class="s2"&gt;"licenseeffectivedate &amp;gt;= '{since}' AND contractorlicensestatus = 'ACTIVE' "&lt;/span&gt;
             &lt;span class="n"&gt;f&lt;/span&gt;&lt;span class="s2"&gt;"AND specialtycode1desc in ({','.join(repr(s) for s in specialties)}) "&lt;/span&gt;
             &lt;span class="n"&gt;f&lt;/span&gt;&lt;span class="s2"&gt;"AND businesstypecodedesc in ({','.join(repr(b) for b in BUSINESS_TYPES)})"&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;requests&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"https://data.wa.gov/resource/m8qx-ubtq.json"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;params&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="s2"&gt;"$select"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="no"&gt;SELECT&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"$where"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;where&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"$order"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"licenseeffectivedate DESC"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"$limit"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;5000&lt;/span&gt;&lt;span class="p"&gt;}&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;120&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;json&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;trade&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;specs&lt;/span&gt; &lt;span class="k"&gt;in&lt;/span&gt; &lt;span class="no"&gt;TRADES&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;items&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="n"&gt;rows&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;new_contractors&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;specs&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;f&lt;/span&gt;&lt;span class="s2"&gt;"{trade}: {len(rows)} WA businesses licensed since {since}"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"   top cities:"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nc"&gt;Counter&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;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"city"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;""&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;title&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;r&lt;/span&gt; &lt;span class="k"&gt;in&lt;/span&gt; &lt;span class="n"&gt;rows&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;most_common&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Three things that will trip you up
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Specialty labels are inconsistent.&lt;/strong&gt; HVAC appears both as &lt;code&gt;Heating/Vent/Air-Conditioning and Refrig (HVAC/R)&lt;/code&gt; (with a trailing space) and as &lt;code&gt;HVAC/RFRG&lt;/code&gt;. Get the real values first with &lt;code&gt;$select=specialtycode1desc,count(*)&amp;amp;$group=specialtycode1desc&lt;/code&gt;, then copy them exactly.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Plumbers and electricians are a different license type.&lt;/strong&gt; They're filed under &lt;code&gt;contractorlicensetypecodedesc&lt;/code&gt; = &lt;code&gt;PLUMBING CONTRACTOR&lt;/code&gt; or &lt;code&gt;ELECTRICAL CONTRACTOR&lt;/code&gt;, not under a specialty. Filter on that column for those trades.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Leave out individuals and principals.&lt;/strong&gt; About 20% of licenses are held by individuals (sole proprietors), and the file has a principal-name column. The script keeps only corporations, LLCs and partnerships, and never selects the principal column. You're marketing to businesses, so that's all you need.&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Ideas
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Shorten the window to 7 days and run it weekly for a fresh new-business feed.&lt;/li&gt;
&lt;li&gt;Watch &lt;code&gt;licenseexpirationdate&lt;/code&gt; to reach contractors before their bond and insurance renewals.&lt;/li&gt;
&lt;li&gt;Cross-check any business on L&amp;amp;I's own verify page (&lt;code&gt;https://secure.lni.wa.gov/verify/Detail.aspx?LIC=&amp;lt;license number&amp;gt;&lt;/code&gt;).&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;&lt;em&gt;Optional: I run this as hosted, scheduled searches: &lt;a href="https://apify.com/loomwise/wa-contractor-licenses/examples/new-wa-roofing-contractors" rel="noopener noreferrer"&gt;New WA Roofing Contractors&lt;/a&gt; and &lt;a href="https://apify.com/loomwise/wa-contractor-licenses/examples/new-wa-hvac-contractors" rel="noopener noreferrer"&gt;New WA HVAC Contractors&lt;/a&gt; (ready-made searches, paid per result). Disclosure: they're my tools. The script above does the same job for free.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>python</category>
      <category>opendata</category>
      <category>washington</category>
      <category>leadgen</category>
    </item>
    <item>
      <title>ADU Permit Leads: Find Every New Backyard Home Being Built, from City Open Data (Python)</title>
      <dc:creator>Loomwise</dc:creator>
      <pubDate>Tue, 03 Nov 2026 15:11:43 +0000</pubDate>
      <link>https://dev.to/loomwise/adu-permit-leads-find-every-new-backyard-home-being-built-from-city-open-data-python-15dk</link>
      <guid>https://dev.to/loomwise/adu-permit-leads-find-every-new-backyard-home-being-built-from-city-open-data-python-15dk</guid>
      <description>&lt;p&gt;Accessory dwelling units (ADUs, also called granny flats, backyard cottages or DADUs) are one of the biggest residential construction trends in the US. Each one is a $100k to $300k project that needs a permit, and those permits are public. If you sell windows, cabinets, solar, HVAC, flooring, insurance, construction loans or property management, a new ADU permit is a strong lead.&lt;/p&gt;

&lt;p&gt;This post shows how to find &lt;strong&gt;every ADU permit issued in the last 90 days&lt;/strong&gt; across several counties and cities with one Python script against official open-data APIs.&lt;/p&gt;

&lt;p&gt;Run on Oct 22, 2026, the script found &lt;strong&gt;156 ADU permits in 90 days&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;San Diego County, CA:&lt;/strong&gt; 87 permits, average declared value $223,539&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Pierce County, WA:&lt;/strong&gt; 35 permits (Pierce doesn't fill in a value for most of them)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Mesa, AZ:&lt;/strong&gt; 21 permits, average $194,926&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Corona, CA:&lt;/strong&gt; 12 permits, average $208,027&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Marin County, CA:&lt;/strong&gt; 1 permit, $100,000&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  The data sources
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Area&lt;/th&gt;
&lt;th&gt;Dataset&lt;/th&gt;
&lt;th&gt;Text searched&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;San Diego County, CA&lt;/td&gt;
&lt;td&gt;&lt;a href="https://data.sandiegocounty.gov/d/red2-qccu" rel="noopener noreferrer"&gt;data.sandiegocounty.gov red2-qccu&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;work description and scope code&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Corona, CA&lt;/td&gt;
&lt;td&gt;&lt;a href="https://corstat.coronaca.gov/d/2agx-camz" rel="noopener noreferrer"&gt;corstat.coronaca.gov 2agx-camz&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;description and permit subtype&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Marin County, CA&lt;/td&gt;
&lt;td&gt;&lt;a href="https://data.marincounty.gov/d/mkbn-caye" rel="noopener noreferrer"&gt;data.marincounty.gov mkbn-caye&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;description and construction type&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Pierce County, WA&lt;/td&gt;
&lt;td&gt;&lt;a href="https://open.piercecountywa.gov/d/nhnt-v7ka" rel="noopener noreferrer"&gt;open.piercecountywa.gov nhnt-v7ka&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;work description and work type&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Mesa, AZ&lt;/td&gt;
&lt;td&gt;&lt;a href="https://citydata.mesaaz.gov/d/dzpk-hxfb" rel="noopener noreferrer"&gt;citydata.mesaaz.gov dzpk-hxfb&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;description and type of work&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;All five are Socrata portals, so one function handles them all. Each source just needs its own date, text and value column names.&lt;/p&gt;

&lt;h2&gt;
  
  
  The script
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="n"&gt;requests&lt;/span&gt;
&lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="n"&gt;datetime&lt;/span&gt; &lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="n"&gt;date&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;timedelta&lt;/span&gt;
&lt;span class="n"&gt;since&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;date&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;today&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="nf"&gt;timedelta&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;days&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;90&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;isoformat&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="no"&gt;TERMS&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"ADU"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"ACCESSORY DWELLING"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"GRANNY"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"JADU"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"BACKYARD COTTAGE"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"DADU"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="no"&gt;SOURCES&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;  &lt;span class="c1"&gt;# label, domain, dataset, date field, description fields, value field&lt;/span&gt;
    &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"San Diego County, CA"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"data.sandiegocounty.gov"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"red2-qccu"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"issued_date"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"use"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"primary_scope_code"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"valuation"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"Corona, CA"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"corstat.coronaca.gov"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"2agx-camz"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"issued"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"description"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"permitsubtype"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"jobvalue"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"Marin County, CA"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"data.marincounty.gov"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"mkbn-caye"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"issued_date"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"description"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"construction"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"construction_value"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"Pierce County, WA"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"open.piercecountywa.gov"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"nhnt-v7ka"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"issueddate"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"workdescription"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"worktype"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"projectvalue"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"Mesa, AZ"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"citydata.mesaaz.gov"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"dzpk-hxfb"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"issued_date"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"description_of_work"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"type_of_work"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"total_valuation"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;adus&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;label&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;domain&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;ds&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;dfield&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;fields&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;vfield&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="n"&gt;like&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;" OR "&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;join&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;f&lt;/span&gt;&lt;span class="s2"&gt;"upper({f}) like '%{t}%'"&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;f&lt;/span&gt; &lt;span class="k"&gt;in&lt;/span&gt; &lt;span class="n"&gt;fields&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;t&lt;/span&gt; &lt;span class="k"&gt;in&lt;/span&gt; &lt;span class="no"&gt;TERMS&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;rows&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;requests&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;f&lt;/span&gt;&lt;span class="s2"&gt;"https://{domain}/resource/{ds}.json"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;params&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="s2"&gt;"$where"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;f&lt;/span&gt;&lt;span class="s2"&gt;"{dfield} &amp;gt;= '{since}' AND ({like})"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"$limit"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;5000&lt;/span&gt;&lt;span class="p"&gt;}&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;120&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;json&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="c1"&gt;# "ADU" also matches words like "GRADUATE"/"ADULT": keep rows where it is a whole word&lt;/span&gt;
    &lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="n"&gt;re&lt;/span&gt;
    &lt;span class="n"&gt;rx&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;re&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nb"&gt;compile&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;r&lt;/span&gt;&lt;span class="s2"&gt;"\b(J?ADU|DADU|ACCESSORY DWELLING|GRANNY|BACKYARD COTTAGE)\b"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;re&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="no"&gt;I&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;r&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;r&lt;/span&gt; &lt;span class="k"&gt;in&lt;/span&gt; &lt;span class="n"&gt;rows&lt;/span&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="nb"&gt;any&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;rx&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;search&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;str&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;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;f&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;""&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;f&lt;/span&gt; &lt;span class="k"&gt;in&lt;/span&gt; &lt;span class="n"&gt;fields&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="n"&gt;total&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;
&lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;s&lt;/span&gt; &lt;span class="k"&gt;in&lt;/span&gt; &lt;span class="no"&gt;SOURCES&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="n"&gt;rows&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;adus&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;s&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;vals&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="kt"&gt;float&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="n"&gt;s&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;r&lt;/span&gt; &lt;span class="k"&gt;in&lt;/span&gt; &lt;span class="n"&gt;rows&lt;/span&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;r&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;s&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="ow"&gt;not&lt;/span&gt; &lt;span class="k"&gt;in&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kc"&gt;None&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;""&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
    &lt;span class="n"&gt;avg&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;sum&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;vals&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="nb"&gt;len&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;vals&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;vals&lt;/span&gt; &lt;span class="k"&gt;else&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;
    &lt;span class="n"&gt;total&lt;/span&gt; &lt;span class="o"&gt;+=&lt;/span&gt; &lt;span class="nb"&gt;len&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;rows&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;f&lt;/span&gt;&lt;span class="s2"&gt;"{s[0]}: {len(rows)} ADU permits in 90 days, average declared value ${avg:,.0f}"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"total:"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;total&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Three things that will trip you up
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;"ADU" hides inside other words.&lt;/strong&gt; A plain &lt;code&gt;like '%ADU%'&lt;/code&gt; also matches GRADUATE, ADULT and ADULTS. The script lets the server do a broad match, then keeps only whole-word hits in Python with a regex.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Every place names it differently.&lt;/strong&gt; California permits say ADU or JADU (junior ADU), Washington uses DADU (detached ADU) and "backyard cottage", and older records say "granny unit". Add local terms to &lt;code&gt;TERMS&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Valuation is often blank or zero.&lt;/strong&gt; Pierce County leaves the value empty on most ADU permits, so the average comes out as $0. Treat value as a bonus field and don't filter on it.&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Turning it into a lead list
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Sort by issue date: the weeks right after issue are when owners pick finishes, windows and HVAC.&lt;/li&gt;
&lt;li&gt;Group by ZIP code to plan mailers or canvassing routes.&lt;/li&gt;
&lt;li&gt;If you're a lender or insurer, ADU permits with a high declared value are the best fit.&lt;/li&gt;
&lt;li&gt;Keep it to the property address and permit. You don't need the owner's name to market to a property.&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;&lt;em&gt;Optional: I run this as a hosted, scheduled search across 47 cities and counties in 20 states: &lt;a href="https://apify.com/loomwise/city-building-permits/examples/adu-permits" rel="noopener noreferrer"&gt;ADU Permits: Accessory Dwelling Unit Leads (ready-made search)&lt;/a&gt; (paid per result). Disclosure: it's my tool. The script above does the same job for free.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>python</category>
      <category>opendata</category>
      <category>realestate</category>
      <category>leadgen</category>
    </item>
    <item>
      <title>Find Federal Contracts Before the RFP: Track SAM.gov Sources Sought Notices in Python</title>
      <dc:creator>Loomwise</dc:creator>
      <pubDate>Mon, 02 Nov 2026 15:09:09 +0000</pubDate>
      <link>https://dev.to/loomwise/find-federal-contracts-before-the-rfp-track-samgov-sources-sought-notices-in-python-4jnj</link>
      <guid>https://dev.to/loomwise/find-federal-contracts-before-the-rfp-track-samgov-sources-sought-notices-in-python-4jnj</guid>
      <description>&lt;p&gt;By the time a federal solicitation (RFP or RFQ) hits SAM.gov, the requirement is mostly written, and often written around whoever talked to the agency first. The firms that win consistently show up earlier, at the &lt;strong&gt;Sources Sought&lt;/strong&gt; and &lt;strong&gt;Special Notice&lt;/strong&gt; stage, when the agency is still doing market research and asking "who out there can do this?"&lt;/p&gt;

&lt;p&gt;Answering a Sources Sought notice costs a few pages. It puts you on the contracting officer's radar, and if enough small businesses respond, it can push the agency to set the contract aside for small businesses.&lt;/p&gt;

&lt;p&gt;This post shows how to pull &lt;strong&gt;every Sources Sought and Special Notice from the last 14 days in your NAICS codes&lt;/strong&gt;, with open response deadlines, from SAM.gov's free daily data file. No API key needed.&lt;/p&gt;

&lt;p&gt;Run on Oct 22, 2026:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;1,397 early-stage notices&lt;/strong&gt; in 14 days: 900 Sources Sought and 497 Special Notices.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;169&lt;/strong&gt; were in the sample NAICS codes (IT services, consulting, building construction, building trades and facilities support) with a response date still open.&lt;/li&gt;
&lt;li&gt;The next deadlines included a FEMA deployment-management software requirement, Defense Department grounds maintenance in Pennsylvania, and range improvements for the Justice Department.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  The data source
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://s3.amazonaws.com/falextracts/Contract%20Opportunities/datagov/ContractOpportunitiesFullCSV.csv" rel="noopener noreferrer"&gt;SAM.gov Contract Opportunities full extract&lt;/a&gt;: a free daily CSV, about 200 MB, sorted newest first. The script streams it and stops once it passes the date window, so it never downloads the whole file.&lt;/p&gt;

&lt;h2&gt;
  
  
  The script
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="n"&gt;csv&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;io&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;sys&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;requests&lt;/span&gt;
&lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="n"&gt;collections&lt;/span&gt; &lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="nc"&gt;Counter&lt;/span&gt;
&lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="n"&gt;datetime&lt;/span&gt; &lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="n"&gt;date&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;timedelta&lt;/span&gt;
&lt;span class="n"&gt;csv&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;field_size_limit&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;sys&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;maxsize&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="no"&gt;URL&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"https://s3.amazonaws.com/falextracts/Contract%20Opportunities/datagov/ContractOpportunitiesFullCSV.csv"&lt;/span&gt;
&lt;span class="no"&gt;DAYS&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;14&lt;/span&gt;
&lt;span class="n"&gt;since&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;date&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;today&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="nf"&gt;timedelta&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;days&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="no"&gt;DAYS&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;isoformat&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;recent_opportunities&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="s2"&gt;"""Stream SAM.gov's public daily extract (about 200 MB, newest first) and stop once rows get older than the window."""&lt;/span&gt;
    &lt;span class="k"&gt;with&lt;/span&gt; &lt;span class="n"&gt;requests&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="no"&gt;URL&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;stream&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="kc"&gt;True&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;300&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="n"&gt;r&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;raise_for_status&lt;/span&gt;&lt;span class="p"&gt;(&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="n"&gt;raw&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;decode_content&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kc"&gt;True&lt;/span&gt;
        &lt;span class="n"&gt;reader&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;csv&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;DictReader&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;io&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;TextIOWrapper&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="n"&gt;raw&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;encoding&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"cp1252"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;errors&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"replace"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;newline&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;""&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="n"&gt;older&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;
        &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;row&lt;/span&gt; &lt;span class="k"&gt;in&lt;/span&gt; &lt;span class="n"&gt;reader&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;row&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"PostedDate"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;=&lt;/span&gt; &lt;span class="n"&gt;since&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
                &lt;span class="n"&gt;older&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;
                &lt;span class="k"&gt;yield&lt;/span&gt; &lt;span class="n"&gt;row&lt;/span&gt;
            &lt;span class="k"&gt;else&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
                &lt;span class="n"&gt;older&lt;/span&gt; &lt;span class="o"&gt;+=&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;
                &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;older&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="mi"&gt;300&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;  &lt;span class="c1"&gt;# small safety margin; the file is sorted newest first&lt;/span&gt;
                    &lt;span class="k"&gt;return&lt;/span&gt;

&lt;span class="no"&gt;NAICS_PREFIXES&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"5415"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"5416"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"2362"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"2382"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"5617"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;  &lt;span class="c1"&gt;# IT, consulting, building construction, building trades, facilities&lt;/span&gt;
&lt;span class="no"&gt;KEEP&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"NoticeId"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"Title"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"Type"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"PostedDate"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"ResponseDeadLine"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"Department/Ind.Agency"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"Office"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="s2"&gt;"SetASide"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"NaicsCode"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"PopState"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"Link"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;   &lt;span class="c1"&gt;# contact name/email/phone columns are deliberately skipped&lt;/span&gt;
&lt;span class="n"&gt;early&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="n"&gt;k&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;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;k&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;""&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;k&lt;/span&gt; &lt;span class="k"&gt;in&lt;/span&gt; &lt;span class="no"&gt;KEEP&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;r&lt;/span&gt; &lt;span class="k"&gt;in&lt;/span&gt; &lt;span class="nf"&gt;recent_opportunities&lt;/span&gt;&lt;span class="p"&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;r&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"Type"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="k"&gt;in&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"Sources Sought"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"Special Notice"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="k"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;Counter&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="s2"&gt;"Type"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;r&lt;/span&gt; &lt;span class="k"&gt;in&lt;/span&gt; &lt;span class="n"&gt;early&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;today&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;date&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;today&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;isoformat&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="c1"&gt;# keep my NAICS codes, and drop notices whose response date already passed (some reposts carry old dates)&lt;/span&gt;
&lt;span class="n"&gt;mine&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;r&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;r&lt;/span&gt; &lt;span class="k"&gt;in&lt;/span&gt; &lt;span class="n"&gt;early&lt;/span&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;r&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"NaicsCode"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;startswith&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="no"&gt;NAICS_PREFIXES&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="ow"&gt;and&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="ow"&gt;not&lt;/span&gt; &lt;span class="n"&gt;r&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"ResponseDeadLine"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="ow"&gt;or&lt;/span&gt; &lt;span class="n"&gt;r&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"ResponseDeadLine"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;=&lt;/span&gt; &lt;span class="n"&gt;today&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="k"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;len&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;mine&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"early-stage notices in my NAICS codes; next deadlines:"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;r&lt;/span&gt; &lt;span class="k"&gt;in&lt;/span&gt; &lt;span class="nb"&gt;sorted&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;r&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;r&lt;/span&gt; &lt;span class="k"&gt;in&lt;/span&gt; &lt;span class="n"&gt;mine&lt;/span&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;r&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"ResponseDeadLine"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;key&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="k"&gt;lambda&lt;/span&gt; &lt;span class="n"&gt;r&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="s2"&gt;"ResponseDeadLine"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="k"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;" -"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;r&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"ResponseDeadLine"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;]&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="s2"&gt;"NaicsCode"&lt;/span&gt;&lt;span class="p"&gt;]&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="s2"&gt;"Title"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;60&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"|"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;r&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"Department/Ind.Agency"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;30&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;with&lt;/span&gt; &lt;span class="nb"&gt;open&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"sources_sought.csv"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"w"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;newline&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;""&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;f&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="n"&gt;w&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;csv&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;DictWriter&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;f&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;fieldnames&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="no"&gt;KEEP&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="n"&gt;w&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;writeheader&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="n"&gt;w&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;writerows&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;mine&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;It prints the soonest deadlines and saves the full list to &lt;code&gt;sources_sought.csv&lt;/code&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Three things that will trip you up
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Reposted notices carry old deadlines.&lt;/strong&gt; Some recently posted notices still have a response date from a past year. Filter &lt;code&gt;ResponseDeadLine &amp;gt;= today&lt;/code&gt;, as the script does, or you'll waste time on closed notices.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Special Notices are mixed.&lt;/strong&gt; They include industry days, draft RFPs and intent-to-sole-source notices. Intent-to-sole-source is worth reading: if you can do the work, you can often challenge it within the response window.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;NAICS prefixes beat exact codes.&lt;/strong&gt; &lt;code&gt;startswith("5415")&lt;/code&gt; catches all of 541511, 541512, 541513 and 541519. Agencies don't always pick the code you'd expect.&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  A simple weekly workflow
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;Run it Monday morning and open &lt;code&gt;sources_sought.csv&lt;/code&gt; in a spreadsheet.&lt;/li&gt;
&lt;li&gt;Mark the notices that fit, then answer them with a 2 to 5 page capability statement that responds to the questions asked.&lt;/li&gt;
&lt;li&gt;Save the &lt;code&gt;NoticeId&lt;/code&gt; values you answered. When the solicitation drops, it usually links back to the same notice history.&lt;/li&gt;
&lt;/ol&gt;




&lt;p&gt;&lt;em&gt;Optional: I run this as a hosted, scheduled search with NAICS and state filters: &lt;a href="https://apify.com/loomwise/federal-opportunities/examples/federal-sources-sought" rel="noopener noreferrer"&gt;Federal Sources Sought Notices (ready-made search)&lt;/a&gt; (paid per result). Disclosure: it's my tool. The script above does the same job for free.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>python</category>
      <category>govcon</category>
      <category>opendata</category>
      <category>tutorial</category>
    </item>
    <item>
      <title>New Federal Contracts This Week: Issue #3 (2026-10-27 to 2026-11-01)</title>
      <dc:creator>Loomwise</dc:creator>
      <pubDate>Mon, 02 Nov 2026 14:12:18 +0000</pubDate>
      <link>https://dev.to/loomwise/new-federal-contracts-this-week-issue-3-2026-10-27-to-2026-11-01-315k</link>
      <guid>https://dev.to/loomwise/new-federal-contracts-this-week-issue-3-2026-10-27-to-2026-11-01-315k</guid>
      <description>&lt;p&gt;&lt;em&gt;A free weekly roundup of new SAM.gov solicitations, built from SAM.gov's official public data with the &lt;a href="https://apify.com/loomwise/federal-opportunities" rel="noopener noreferrer"&gt;Federal Contract Opportunities feed&lt;/a&gt;. Not affiliated with GSA or SAM.gov. Always confirm details on the notice itself.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;This week:&lt;/strong&gt; 2,609 new solicitations and combined synopsis/solicitations posted.&lt;/p&gt;

&lt;h2&gt;
  
  
  Who is buying
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Agency&lt;/th&gt;
&lt;th&gt;Notices&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Dept Of Defense&lt;/td&gt;
&lt;td&gt;2,004&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Veterans Affairs, Department Of&lt;/td&gt;
&lt;td&gt;166&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Interior, Department Of The&lt;/td&gt;
&lt;td&gt;79&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Agriculture, Department Of&lt;/td&gt;
&lt;td&gt;72&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Homeland Security, Department Of&lt;/td&gt;
&lt;td&gt;66&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Energy, Department Of&lt;/td&gt;
&lt;td&gt;34&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Transportation, Department Of&lt;/td&gt;
&lt;td&gt;34&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Justice, Department Of&lt;/td&gt;
&lt;td&gt;32&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  Set-asides
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Set-aside&lt;/th&gt;
&lt;th&gt;Notices&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;No set-aside&lt;/td&gt;
&lt;td&gt;1,374&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Small Business Set Aside - Total&lt;/td&gt;
&lt;td&gt;949&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Service-Disabled Veteran-Owned Small Business (SDVOSB) Set-Aside (FAR 19.14)&lt;/td&gt;
&lt;td&gt;131&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Historically Underutilized Business (HUBZone) Set-Aside (FAR 19.13)&lt;/td&gt;
&lt;td&gt;70&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;SBA Certified Women-Owned Small Business (WOSB) Program Set-Aside (FAR 19.15)&lt;/td&gt;
&lt;td&gt;38&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;8(a) Set-Aside (FAR 19.8)&lt;/td&gt;
&lt;td&gt;18&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Indian Small Business Economic Enterprise&lt;/td&gt;
&lt;td&gt;10&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  By industry (NAICS sector)
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;NAICS sector&lt;/th&gt;
&lt;th&gt;Notices&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;33 Manufacturing&lt;/td&gt;
&lt;td&gt;1,708&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;23 Construction&lt;/td&gt;
&lt;td&gt;249&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;56 Admin, support &amp;amp; facilities&lt;/td&gt;
&lt;td&gt;121&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;54 Professional/technical services&lt;/td&gt;
&lt;td&gt;114&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;32 Manufacturing&lt;/td&gt;
&lt;td&gt;105&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;31 Manufacturing&lt;/td&gt;
&lt;td&gt;53&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;81 Repair &amp;amp; other services&lt;/td&gt;
&lt;td&gt;43&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;48 Transportation&lt;/td&gt;
&lt;td&gt;42&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  Top places of performance
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;State&lt;/th&gt;
&lt;th&gt;Notices&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;MD&lt;/td&gt;
&lt;td&gt;51&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;CA&lt;/td&gt;
&lt;td&gt;45&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;TX&lt;/td&gt;
&lt;td&gt;38&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;DC&lt;/td&gt;
&lt;td&gt;36&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;FL&lt;/td&gt;
&lt;td&gt;35&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;WA&lt;/td&gt;
&lt;td&gt;26&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;VA&lt;/td&gt;
&lt;td&gt;25&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;IL&lt;/td&gt;
&lt;td&gt;21&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  Picks: still open, closing soonest (due on or after 2026-11-03)
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Service-disabled veteran-owned (SDVOSB) set-asides
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://sam.gov/workspace/contract/opp/e364231ee8e24fac98cde375947cf560/view" rel="noopener noreferrer"&gt;W038--Rental &amp;amp; Support Services for Wheeled Loaders w/3yard bucket&lt;/a&gt; · Veterans Affairs, Department Of · NAICS 532490 · Augusta · due 2026-11-03&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://sam.gov/workspace/contract/opp/4739aa5d236648e5a67ce10842ad9826/view" rel="noopener noreferrer"&gt;61--CABLE ASSEMBLY,SPECIAL&lt;/a&gt; · Dept Of Defense · NAICS 334419 · location n/a · due 2026-11-04&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://sam.gov/workspace/contract/opp/6b855ef36a4546b39b1c760acc72fd55/view" rel="noopener noreferrer"&gt;73--UTILITY CART&lt;/a&gt; · Dept Of Defense · NAICS 333241 · location n/a · due 2026-11-05&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://sam.gov/workspace/contract/opp/c228294b0de046abb0613273066dfdc8/view" rel="noopener noreferrer"&gt;53--PIN,STRAIGHT,HEADLESS&lt;/a&gt; · Dept Of Defense · NAICS 332510 · location n/a · due 2026-11-05&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://sam.gov/workspace/contract/opp/d6dd96562d2d4e9f843bd16f01771ff7/view" rel="noopener noreferrer"&gt;Replacement-in-Kind Repair of Existing Perimeter Security Fence (Ameristar Impasse Trident) Brand Name or Equal&lt;/a&gt; · Veterans Affairs, Department Of · NAICS 238990 · Brockton, MA · due 2026-11-05&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Women-owned (WOSB/EDWOSB) set-asides
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://sam.gov/workspace/contract/opp/c3ce7217294942dd9c5aebf5c4209948/view" rel="noopener noreferrer"&gt;59--RELAY&lt;/a&gt; · Interior, Department Of The · NAICS 335314 · location n/a · due 2026-11-03&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://sam.gov/workspace/contract/opp/464f92081d024ad9b98e27737cdee7eb/view" rel="noopener noreferrer"&gt;68--SEALER,CHEMICAL&lt;/a&gt; · Dept Of Defense · NAICS 325110 · location n/a · due 2026-11-04&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://sam.gov/workspace/contract/opp/66779d373368482cbdfbca7ed7183cf2/view" rel="noopener noreferrer"&gt;SeaPort: CNSP PA/VI Support Services&lt;/a&gt; · Dept Of Defense · NAICS 541330 · San Diego, CA · due 2026-11-05&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://sam.gov/workspace/contract/opp/42acf43217ab4b2dbb351fc207b83815/view" rel="noopener noreferrer"&gt;59--TAPE,INSULATION,ELECTR&lt;/a&gt; · Dept Of Defense · NAICS 335999 · location n/a · due 2026-11-06&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://sam.gov/workspace/contract/opp/359a5a70f9d949738319b8472cd8b52f/view" rel="noopener noreferrer"&gt;58--BEACON SET,RADIO&lt;/a&gt; · Dept Of Defense · NAICS 334220 · location n/a · due 2026-11-06&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  HUBZone set-asides
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://sam.gov/workspace/contract/opp/f0017a575b334a75accad43fa3d527c9/view" rel="noopener noreferrer"&gt;53--BOLT,SHEAR&lt;/a&gt; · Dept Of Defense · NAICS 332722 · location n/a · due 2026-11-04&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://sam.gov/workspace/contract/opp/ed325c3d0e07492aaf47ac6100c3670f/view" rel="noopener noreferrer"&gt;53--MOUNT,RESILIENT,WEAPON&lt;/a&gt; · Dept Of Defense · NAICS 332994 · location n/a · due 2026-11-04&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://sam.gov/workspace/contract/opp/72e440ab950d4883ba228fba50550fc6/view" rel="noopener noreferrer"&gt;16--DUAL BREAKAWAY,AUX&lt;/a&gt; · Dept Of Defense · NAICS 336413 · location n/a · due 2026-11-05&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://sam.gov/workspace/contract/opp/aac155915af349f88b0ed320e914fe5d/view" rel="noopener noreferrer"&gt;15--BRACKET ASSEMBLY,LOWER&lt;/a&gt; · Dept Of Defense · NAICS 336413 · location n/a · due 2026-11-05&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://sam.gov/workspace/contract/opp/ac60a80bb0d9459aa7d45d570ef4559d/view" rel="noopener noreferrer"&gt;61--POWER SUBSTATION,EL&lt;/a&gt; · Dept Of Defense · NAICS 335311 · location n/a · due 2026-11-06&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  8(a) set-asides
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://sam.gov/workspace/contract/opp/db342f8c05754c8e8450dac4f0e010f3/view" rel="noopener noreferrer"&gt;711th HPW Mission Support Services MAC IDIQ&lt;/a&gt; · Dept Of Defense · NAICS 541990 · Wright Patterson AFB, OH · due 2026-11-03&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://sam.gov/workspace/contract/opp/2b7d671a19d14cdc92821515f6ae0f1c/view" rel="noopener noreferrer"&gt;Fort Bliss Custodial Service Contract&lt;/a&gt; · Dept Of Defense · NAICS 561720 · Fort Bliss, TX · due 2026-11-04&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://sam.gov/workspace/contract/opp/604ac45d47764ea7be7e4298ba1ab1f4/view" rel="noopener noreferrer"&gt;WJHTC Armed Security Guard Services&lt;/a&gt; · Transportation, Department Of · NAICS 561612 · Atlantic City, NJ · due 2026-11-04&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://sam.gov/workspace/contract/opp/293b2fc2b4a7469392f0ee4777490e70/view" rel="noopener noreferrer"&gt;Superior NF Water Heater replacement&lt;/a&gt; · Agriculture, Department Of · NAICS 238220 · Ely, MN · due 2026-11-04&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://sam.gov/workspace/contract/opp/717d78b137fb473aa5c8311b14e6236f/view" rel="noopener noreferrer"&gt;N6247826R2431 FACILITIES AND LIGHTING MAINTENANCE SERVICES at Joint Base Pearl Harbor Hickam, Oahu, Hawaii&lt;/a&gt; · Dept Of Defense · NAICS 561210 · location n/a · due 2026-11-04&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Construction (NAICS 23)
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://sam.gov/workspace/contract/opp/a1985010a3b24a0e9dea55a7756c98a4/view" rel="noopener noreferrer"&gt;Y--Construct North Unit Visitor Center at BADL&lt;/a&gt; · Interior, Department Of The · NAICS 236220 · location n/a · due 2026-11-03&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://sam.gov/workspace/contract/opp/f7897da70a194ce4a422f679b585bd5e/view" rel="noopener noreferrer"&gt;Z2DA--FY27 NRM - 36C26126Q1261 | Re-slurry and Re-stripe Bldg. 88 and 98 Parking Lots&lt;/a&gt; · Veterans Affairs, Department Of · NAICS 236220 · location n/a · due 2026-11-03&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://sam.gov/workspace/contract/opp/b10e3b9bc1604b5bad7a8bd8fd19c156/view" rel="noopener noreferrer"&gt;Consular ABA Bathroom construction&lt;/a&gt; · State, Department Of · NAICS 236220 · Brussels, BE-BRU · due 2026-11-03&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://sam.gov/workspace/contract/opp/1c9b8058c79f4ad3ba6b853ec9b6b843/view" rel="noopener noreferrer"&gt;Gulf Intracoastal Waterway High Island to Causeway with Channel to Port Bolivar Maintenance Dredging&lt;/a&gt; · Dept Of Defense · NAICS 237990 · location n/a · due 2026-11-03&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://sam.gov/workspace/contract/opp/627bc004858f4f58a44af35a6b332d13/view" rel="noopener noreferrer"&gt;ND NP THRO 204(1) Buck Hill Road&lt;/a&gt; · Transportation, Department Of · NAICS 237310 · Medora, ND · due 2026-11-03&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  IT and computer services (NAICS 5415)
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://sam.gov/workspace/contract/opp/99374b795a4e4248bfc853d4b25b0cf9/view" rel="noopener noreferrer"&gt;SIPR LAN DROPS&lt;/a&gt; · Dept Of Defense · NAICS 541519 · FL · due 2026-11-04&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://sam.gov/workspace/contract/opp/1d9d0b14464045729d402dc4fb349389/view" rel="noopener noreferrer"&gt;Quantum Scalar Tape Library Support - BRAND NAME OR EQUAL (7/1/2026 - 6/31/2027) ELMT STANDALONE&lt;/a&gt; · National Aeronautics And Space Administration · NAICS 541519 · location n/a · due 2026-11-04&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://sam.gov/workspace/contract/opp/80ca6e7f11fa481cafc50f5d3b3cfa8e/view" rel="noopener noreferrer"&gt;Request for Information (RFI) for On-Premise Serve&lt;/a&gt; · Social Security Administration · NAICS 541519 · location n/a · due 2026-11-05&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://sam.gov/workspace/contract/opp/6e7453a232f948edb0e4f63edbdd37f8/view" rel="noopener noreferrer"&gt;JFrog Artifactory Subscription Maintenance&lt;/a&gt; · Federal Deposit Insurance Corporation · NAICS 541519 · Arlington, VA · due 2026-11-05&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://sam.gov/workspace/contract/opp/ecf63283c97e4d4f8047f3497c6801bc/view" rel="noopener noreferrer"&gt;HID ID/Access Cards&lt;/a&gt; · National Aeronautics And Space Administration · NAICS 541519 · Hampton, VA · due 2026-11-06&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Editor's note
&lt;/h2&gt;

&lt;p&gt;New solicitations dipped to 2,609 this week, down from 2,813 in &lt;a href="https://dev.to/loomwise/new-federal-contracts-this-week-issue-2-2026-10-20-to-2026-10-25-4nbn"&gt;Issue #2&lt;/a&gt;. The Department of Defense posted 2,004 of them (about 77%), and manufacturing NAICS codes (31 to 33) again made up most of the volume. Total small business set-asides came in at 949 (998 last week), SDVOSB set-asides held at 131, HUBZone set-asides rose to 70 from 54, and WOSB set-asides nearly doubled to 38 from 21. Maryland led the places of performance with 51 notices.&lt;/p&gt;

&lt;h2&gt;
  
  
  Get your own version
&lt;/h2&gt;

&lt;p&gt;Want this filtered to your NAICS codes, set-asides and states, every morning? Run the &lt;a href="https://apify.com/loomwise/federal-opportunities" rel="noopener noreferrer"&gt;Federal Contract Opportunities feed&lt;/a&gt; on a daily schedule. No SAM.gov API key needed; $0.90 per 1,000 results.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Data: SAM.gov Contract Opportunities public extract (U.S. government work). Counts cover the notice types Solicitation and Combined Synopsis/Solicitation.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Previous issue: &lt;a href="https://dev.to/loomwise/new-federal-contracts-this-week-issue-2-2026-10-20-to-2026-10-25-4nbn"&gt;Issue #2 (2026-10-20 to 2026-10-25)&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>govcon</category>
      <category>opendata</category>
      <category>government</category>
      <category>smallbusiness</category>
    </item>
  </channel>
</rss>
