<?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%2F8d690afe-2852-483a-9151-095f60cd2427.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>Texas Building Permit Leads: 10,910 Permits from Austin, San Antonio, Collin County and More</title>
      <dc:creator>Loomwise</dc:creator>
      <pubDate>Wed, 21 Oct 2026 14:06:26 +0000</pubDate>
      <link>https://dev.to/loomwise/texas-building-permit-leads-10910-permits-from-austin-san-antonio-collin-county-and-more-3mlk</link>
      <guid>https://dev.to/loomwise/texas-building-permit-leads-10910-permits-from-austin-san-antonio-collin-county-and-more-3mlk</guid>
      <description>&lt;p&gt;Texas cities publish their building permits as open data, but each uses a different portal and schema. Austin is on Socrata and San Antonio on CKAN; Tyler and Hutto use ArcGIS, and Collin County's permits come from its appraisal district. I pulled 30 days from all six and normalized them into one table.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Window:&lt;/strong&gt; permits issued Sep 20 to Oct 19, 2026. &lt;strong&gt;Total: 10,910 permits.&lt;/strong&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  By source
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Source&lt;/th&gt;
&lt;th&gt;Permits (30 days)&lt;/th&gt;
&lt;th&gt;With contractor name&lt;/th&gt;
&lt;th&gt;Median job value*&lt;/th&gt;
&lt;th&gt;Top work categories&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Austin&lt;/td&gt;
&lt;td&gt;4,412&lt;/td&gt;
&lt;td&gt;42%&lt;/td&gt;
&lt;td&gt;$1,000&lt;/td&gt;
&lt;td&gt;Electrical (1430), Plumbing (1073), Mechanical / HVAC (743)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;San Antonio&lt;/td&gt;
&lt;td&gt;4,860&lt;/td&gt;
&lt;td&gt;27%&lt;/td&gt;
&lt;td&gt;$300,000&lt;/td&gt;
&lt;td&gt;Addition / alteration (991), Sign (225), Scaffold / shed / fence (80)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Collin County (appraisal district)&lt;/td&gt;
&lt;td&gt;674&lt;/td&gt;
&lt;td&gt;5%&lt;/td&gt;
&lt;td&gt;$19,188&lt;/td&gt;
&lt;td&gt;New construction (330), Roofing (73), Structural / foundation / earthwork (46)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Tyler&lt;/td&gt;
&lt;td&gt;486&lt;/td&gt;
&lt;td&gt;40%&lt;/td&gt;
&lt;td&gt;$12,000&lt;/td&gt;
&lt;td&gt;Electrical (141), Plumbing (106), Mechanical / HVAC (51)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;College Station&lt;/td&gt;
&lt;td&gt;417&lt;/td&gt;
&lt;td&gt;0%&lt;/td&gt;
&lt;td&gt;$12,262&lt;/td&gt;
&lt;td&gt;Mechanical / HVAC (88), Plumbing (77), Electrical (68)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Hutto&lt;/td&gt;
&lt;td&gt;61&lt;/td&gt;
&lt;td&gt;0%&lt;/td&gt;
&lt;td&gt;n/a&lt;/td&gt;
&lt;td&gt;New construction (18), Plumbing (8), Mechanical / HVAC (6)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;* Median of the permits that report a value. Austin often puts the project-level value on every sub-permit, or $0–$1 on trade permits, so treat its values as rough. San Antonio reports a value on only about 1% of permits.&lt;/p&gt;

&lt;h2&gt;
  
  
  What kind of work
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Work category (normalized)&lt;/th&gt;
&lt;th&gt;Permits&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Other&lt;/td&gt;
&lt;td&gt;3919&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Electrical&lt;/td&gt;
&lt;td&gt;1643&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Addition / alteration&lt;/td&gt;
&lt;td&gt;1604&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Plumbing&lt;/td&gt;
&lt;td&gt;1303&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Mechanical / HVAC&lt;/td&gt;
&lt;td&gt;927&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;New construction&lt;/td&gt;
&lt;td&gt;842&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Sign&lt;/td&gt;
&lt;td&gt;244&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Demolition&lt;/td&gt;
&lt;td&gt;153&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Roofing&lt;/td&gt;
&lt;td&gt;104&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Scaffold / shed / fence&lt;/td&gt;
&lt;td&gt;85&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Structural / foundation / earthwork&lt;/td&gt;
&lt;td&gt;61&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Solar&lt;/td&gt;
&lt;td&gt;19&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;"Other" is mostly San Antonio's trade and minor-repair permits, where the permit type alone doesn't say what the work is.&lt;/p&gt;

&lt;h2&gt;
  
  
  Who is pulling the permits
&lt;/h2&gt;

&lt;p&gt;The most active contractor businesses across the six sources, by business name as published:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Contractor&lt;/th&gt;
&lt;th&gt;Permits in 30 days&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;DOUBLE H LANDSCAPE, LIMITED&lt;/td&gt;
&lt;td&gt;98&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;IES Residential, Inc.&lt;/td&gt;
&lt;td&gt;67&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;In Charge Electrical Services, LLC&lt;/td&gt;
&lt;td&gt;61&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Victory Plumbing Company&lt;/td&gt;
&lt;td&gt;60&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Texas Multifamily Solution, LLC&lt;/td&gt;
&lt;td&gt;41&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Protex Plumbing &amp;amp; Mechanical, LP&lt;/td&gt;
&lt;td&gt;40&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;AEI Electric LLC&lt;/td&gt;
&lt;td&gt;40&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Charge Pro LLC&lt;/td&gt;
&lt;td&gt;38&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;MJS ENTERPRISES,INC.&lt;/td&gt;
&lt;td&gt;36&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Clark Wilson Builders INC.&lt;/td&gt;
&lt;td&gt;35&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;This is the B2B angle on permit data. Suppliers, rental yards and staffing firms want to know who is busy right now.&lt;/p&gt;

&lt;h2&gt;
  
  
  The biggest projects
&lt;/h2&gt;

&lt;p&gt;Austin had several nine-figure permits in the window. These include a public project at 500 E 3rd St ($418.6M listed), a SMART Housing development at 8801 McCann Dr ($245M, Swinerton Builders) and a sports facility at 7401 Loyola Ln ($140M). Large projects appear on many sub-permits, so deduplicate by address before you add values up.&lt;/p&gt;

&lt;h2&gt;
  
  
  Turning this into leads
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Filter by work category&lt;/strong&gt; (roofing, HVAC, new construction) and a minimum value.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Group by contractor name&lt;/strong&gt; to find active GCs and subs, or by address to find live job sites.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Re-run weekly.&lt;/strong&gt; Permits are a time-sensitive signal.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Collin County's data comes from the appraisal district and covers cities like Plano, McKinney, Frisco and Allen. It is heavy on new residential construction: 330 of 674 permits.&lt;/p&gt;

&lt;h2&gt;
  
  
  Get the same table
&lt;/h2&gt;

&lt;p&gt;All six Texas sources are in the &lt;a href="https://apify.com/loomwise/city-building-permits" rel="noopener noreferrer"&gt;Building Permits Scraper&lt;/a&gt;, which covers 47 US cities and counties in one schema. Set &lt;code&gt;"states": ["TX"]&lt;/code&gt; to get just these. Each source is also free to query on its own portal, and the README links every dataset.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Related: &lt;a href="https://dev.to/loomwise/turning-contractor-registrations-and-building-permits-into-a-sales-pipeline-5ehj"&gt;Turning contractor registrations and building permits into a sales pipeline&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>opendata</category>
      <category>construction</category>
      <category>datascience</category>
      <category>api</category>
    </item>
    <item>
      <title>Jira Cloud has no default comment visibility. Here are 4 workarounds (and a free app)</title>
      <dc:creator>Loomwise</dc:creator>
      <pubDate>Tue, 20 Oct 2026 15:29:01 +0000</pubDate>
      <link>https://dev.to/loomwise/jira-cloud-has-no-default-comment-visibility-here-are-4-workarounds-and-a-free-app-4dl8</link>
      <guid>https://dev.to/loomwise/jira-cloud-has-no-default-comment-visibility-here-are-4-workarounds-and-a-free-app-4dl8</guid>
      <description>&lt;p&gt;Every new Jira Cloud comment is "Viewable by All Users" unless someone remembers the lock icon. Atlassian's request for a default (JRACLOUD-9091) sits at 990 votes and is still "Gathering Interest". If your projects include clients or contractors, one forgotten click leaks an internal note.&lt;/p&gt;

&lt;p&gt;What actually works today:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Click the lock every time.&lt;/strong&gt; Free, error-prone.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Automation rule that re-restricts after posting.&lt;/strong&gt; The rule actor must be a real user in the target role (Atlassian treats the Automation user not joining roles as expected behaviour, JSWCLOUD-22454). Notifications go out before the fix.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;REST API&lt;/strong&gt; &lt;code&gt;POST /rest/api/3/issue/{key}/comment&lt;/code&gt; with a &lt;code&gt;visibility&lt;/code&gt; object. Atlassian's own KB workaround for team-managed projects (JRACLOUD-83171).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Use JSM&lt;/strong&gt; if you can: it has real internal vs. reply-to-customer comments.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;I build small Forge apps under the name Loomwise, and wrote a free one for this: &lt;strong&gt;Loomwise Private Comments&lt;/strong&gt; restricts new comments to a role or group you choose per project, and runs entirely on Atlassian (Forge, no data leaves your site). Full guide and install: &lt;a href="https://loomwise.app/jira-private-comments/" rel="noopener noreferrer"&gt;https://loomwise.app/jira-private-comments/&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Questions or edge cases: &lt;a href="mailto:hello@loomwise.app"&gt;hello@loomwise.app&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>jira</category>
      <category>atlassian</category>
      <category>productivity</category>
      <category>devops</category>
    </item>
    <item>
      <title>New Washington Contractor Licenses in October 2026: 422 Businesses, by City and Trade</title>
      <dc:creator>Loomwise</dc:creator>
      <pubDate>Tue, 20 Oct 2026 15:03:17 +0000</pubDate>
      <link>https://dev.to/loomwise/new-washington-contractor-licenses-in-october-2026-422-businesses-by-city-and-trade-3d48</link>
      <guid>https://dev.to/loomwise/new-washington-contractor-licenses-in-october-2026-422-businesses-by-city-and-trade-3d48</guid>
      <description>&lt;p&gt;Washington State publishes every contractor license it issues as open data. I pulled the licenses that took effect this month and broke them down. The goal: show who is getting licensed, where, and how you can use the list if you sell to contractors.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Data window:&lt;/strong&gt; licenses with an effective date from Oct 1 to Oct 19, 2026. &lt;strong&gt;Source:&lt;/strong&gt; WA Department of Labor &amp;amp; Industries, &lt;a href="https://data.wa.gov/d/m8qx-ubtq" rel="noopener noreferrer"&gt;Contractor License Data - General&lt;/a&gt; on data.wa.gov. &lt;strong&gt;Filter:&lt;/strong&gt; businesses only. Sole proprietors and records that look like personal names are removed.&lt;/p&gt;

&lt;h2&gt;
  
  
  The headline numbers
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;422 business contractor licenses&lt;/strong&gt; took effect in the first 19 days of October, and every one lists a business phone number. About 100 more records in the same window were dropped because they are individuals or have no legal-entity marker in the name.&lt;/p&gt;

&lt;p&gt;Caveat: the "effective date" marks the start of the current license term, so the list mixes brand-new businesses with renewals. A UBI (state business ID) you haven't seen before is the best signal that a business is new.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;License type&lt;/th&gt;
&lt;th&gt;Licenses&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Construction Contractor&lt;/td&gt;
&lt;td&gt;394&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Electrical Contractor&lt;/td&gt;
&lt;td&gt;23&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Plumbing Contractor&lt;/td&gt;
&lt;td&gt;5&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Business type&lt;/th&gt;
&lt;th&gt;Licenses&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;LLC&lt;/td&gt;
&lt;td&gt;395&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Corporation&lt;/td&gt;
&lt;td&gt;26&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Partnership&lt;/td&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  Specialties
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Primary specialty&lt;/th&gt;
&lt;th&gt;Licenses&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;General&lt;/td&gt;
&lt;td&gt;322&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Residential&lt;/td&gt;
&lt;td&gt;11&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Painting/Wallcovering&lt;/td&gt;
&lt;td&gt;10&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Landscaping&lt;/td&gt;
&lt;td&gt;8&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Floor Covering And Counter Tops&lt;/td&gt;
&lt;td&gt;5&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Concrete&lt;/td&gt;
&lt;td&gt;4&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Roofing&lt;/td&gt;
&lt;td&gt;4&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Heating/Vent/Air-Conditioning And Refrig (Hvac/R)&lt;/td&gt;
&lt;td&gt;4&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Tile, Ceramic, Mosaic, Natural And Mfg Stone&lt;/td&gt;
&lt;td&gt;4&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Pressure Washing&lt;/td&gt;
&lt;td&gt;4&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Most construction contractors register as "General". To find trade-specific leads such as roofers, HVAC or concrete, also check the second specialty and the business name.&lt;/p&gt;

&lt;h2&gt;
  
  
  Where they are
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Business city&lt;/th&gt;
&lt;th&gt;Licenses&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Spokane&lt;/td&gt;
&lt;td&gt;29&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Vancouver&lt;/td&gt;
&lt;td&gt;28&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Seattle&lt;/td&gt;
&lt;td&gt;19&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Everett&lt;/td&gt;
&lt;td&gt;18&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Lynnwood&lt;/td&gt;
&lt;td&gt;16&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Tacoma&lt;/td&gt;
&lt;td&gt;15&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Bothell&lt;/td&gt;
&lt;td&gt;13&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Auburn&lt;/td&gt;
&lt;td&gt;11&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Renton&lt;/td&gt;
&lt;td&gt;8&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Olympia&lt;/td&gt;
&lt;td&gt;7&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Puyallup&lt;/td&gt;
&lt;td&gt;7&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Spokane Valley&lt;/td&gt;
&lt;td&gt;7&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Business address state&lt;/th&gt;
&lt;th&gt;Licenses&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;WA&lt;/td&gt;
&lt;td&gt;369&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;OR&lt;/td&gt;
&lt;td&gt;21&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;ID&lt;/td&gt;
&lt;td&gt;15&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;CO&lt;/td&gt;
&lt;td&gt;3&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;About 1 in 8 licensees has an out-of-state address, mostly in Oregon (the Portland–Vancouver metro) and Idaho (the Spokane–Coeur d'Alene area).&lt;/p&gt;

&lt;h2&gt;
  
  
  Who this list is useful for
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Insurance, bonding and surety agents.&lt;/strong&gt; A WA contractor license requires a bond and liability insurance, so every licensee has just bought both.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Payroll, bookkeeping and software vendors&lt;/strong&gt; looking for young small businesses.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Supply houses and equipment-rental reps&lt;/strong&gt; working a territory by ZIP prefix (980/981 for Seattle–Bellevue, 992 for Spokane).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;General contractors&lt;/strong&gt; recruiting licensed subs.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Pull it yourself
&lt;/h2&gt;

&lt;p&gt;The dataset is on Socrata, so it has a free SODA API:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl &lt;span class="s1"&gt;'https://data.wa.gov/resource/m8qx-ubtq.json?$where=licenseeffectivedate&amp;gt;="2026-10-01"&amp;amp;$limit=5000'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Then drop rows where the business type is an individual, and check each name for an entity marker (LLC, Inc, Corp...). Don't pull the principal-name column, which holds personal names.&lt;/p&gt;

&lt;p&gt;If you'd rather not maintain that, I packaged the query, the business-only filter and the cleanup as a pay-per-result tool: &lt;a href="https://apify.com/loomwise/wa-contractor-licenses" rel="noopener noreferrer"&gt;WA Contractor License Scraper&lt;/a&gt; ($3 per 1,000 results). Schedule it daily to get each day's new licensees.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Related: &lt;a href="https://dev.to/loomwise/turning-contractor-registrations-and-building-permits-into-a-sales-pipeline-5ehj"&gt;Turning contractor registrations and building permits into a sales pipeline&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Not affiliated with Washington L&amp;amp;I. Data is public and changes daily, so verify a license with L&amp;amp;I before relying on it.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>opendata</category>
      <category>datascience</category>
      <category>construction</category>
      <category>api</category>
    </item>
    <item>
      <title>New Federal Contracts This Week: Issue #1 (2026-10-14 to 2026-10-19)</title>
      <dc:creator>Loomwise</dc:creator>
      <pubDate>Tue, 20 Oct 2026 13:43:12 +0000</pubDate>
      <link>https://dev.to/loomwise/new-federal-contracts-this-week-issue-1-2026-10-14-to-2026-10-19-3ck7</link>
      <guid>https://dev.to/loomwise/new-federal-contracts-this-week-issue-1-2026-10-14-to-2026-10-19-3ck7</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,330 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;1,915&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Veterans Affairs, Department Of&lt;/td&gt;
&lt;td&gt;124&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Agriculture, Department Of&lt;/td&gt;
&lt;td&gt;57&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Interior, Department Of The&lt;/td&gt;
&lt;td&gt;53&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;National Aeronautics And Space Administration&lt;/td&gt;
&lt;td&gt;25&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Energy, Department Of&lt;/td&gt;
&lt;td&gt;24&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Homeland Security, Department Of&lt;/td&gt;
&lt;td&gt;21&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Transportation, Department Of&lt;/td&gt;
&lt;td&gt;20&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,254&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Small Business Set Aside - Total&lt;/td&gt;
&lt;td&gt;824&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;129&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;50&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;33&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;16&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Small Business Set Aside - Partial&lt;/td&gt;
&lt;td&gt;7&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,603&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;23 Construction&lt;/td&gt;
&lt;td&gt;187&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;54 Professional/technical services&lt;/td&gt;
&lt;td&gt;102&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;32 Manufacturing&lt;/td&gt;
&lt;td&gt;87&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;56 Admin, support &amp;amp; facilities&lt;/td&gt;
&lt;td&gt;74&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;53 Real estate &amp;amp; rental/leasing&lt;/td&gt;
&lt;td&gt;67&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;81 Repair &amp;amp; other services&lt;/td&gt;
&lt;td&gt;38&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;48 Transportation&lt;/td&gt;
&lt;td&gt;35&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;TX&lt;/td&gt;
&lt;td&gt;49&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;CA&lt;/td&gt;
&lt;td&gt;43&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;WA&lt;/td&gt;
&lt;td&gt;27&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;MD&lt;/td&gt;
&lt;td&gt;27&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;FL&lt;/td&gt;
&lt;td&gt;24&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;DC&lt;/td&gt;
&lt;td&gt;23&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;PA&lt;/td&gt;
&lt;td&gt;23&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;VA&lt;/td&gt;
&lt;td&gt;23&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-10-27)
&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/99af3111164f41a0a12899a82ea86e1c/view" rel="noopener noreferrer"&gt;53--NUT,MAIN GEAR SKID&lt;/a&gt; · Dept Of Defense · NAICS 332722 · location n/a · due 2026-10-27&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://sam.gov/workspace/contract/opp/d648b09a9ef346d49f81cb7c54e2e268/view" rel="noopener noreferrer"&gt;31--BEARING,ROLLER,ROD END&lt;/a&gt; · Dept Of Defense · NAICS 332991 · location n/a · due 2026-10-27&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://sam.gov/workspace/contract/opp/671fab2fdc9b4eb7b21daf839792974a/view" rel="noopener noreferrer"&gt;15--PANEL,STRUCTURAL,AIRCR&lt;/a&gt; · Dept Of Defense · NAICS 336413 · location n/a · due 2026-10-27&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://sam.gov/workspace/contract/opp/bed962620476462897eb586c98f397bf/view" rel="noopener noreferrer"&gt;6835-- BULK OXYGEN (Base+4 Option)&lt;/a&gt; · Veterans Affairs, Department Of · NAICS 325120 · Long Beach · due 2026-10-27&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://sam.gov/workspace/contract/opp/fa05c0fece3f420e86f2286fff1e9184/view" rel="noopener noreferrer"&gt;36-Month Electrical Distribution Testing&lt;/a&gt; · Veterans Affairs, Department Of · NAICS 221122 · GA · due 2026-10-27&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/b88053b122b8470893255ce0cacce411/view" rel="noopener noreferrer"&gt;25--TOWBAR,MOTOR VEHICLE&lt;/a&gt; · Dept Of Defense · NAICS 336390 · location n/a · due 2026-10-29&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://sam.gov/workspace/contract/opp/e97da0934c714cd3affc640e96fc54d8/view" rel="noopener noreferrer"&gt;30--CONNECTING LINK,RIGID&lt;/a&gt; · Dept Of Defense · NAICS 333613 · location n/a · due 2026-10-29&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://sam.gov/workspace/contract/opp/65ec423acb9c4473854b9af1a5f1a152/view" rel="noopener noreferrer"&gt;61--TRANSFORMER,POWER&lt;/a&gt; · Dept Of Defense · NAICS 334416 · location n/a · due 2026-10-29&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://sam.gov/workspace/contract/opp/64eb4db8953043759fd5e18287912154/view" rel="noopener noreferrer"&gt;59--CONNECTOR,PLUG,ELECTRI&lt;/a&gt; · Dept Of Defense · NAICS 334417 · location n/a · due 2026-10-29&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://sam.gov/workspace/contract/opp/fc9a78fa798d460fa656aca159cc6305/view" rel="noopener noreferrer"&gt;10--EC ADAPTER ASSEMBLY&lt;/a&gt; · Dept Of Defense · NAICS 332994 · location n/a · due 2026-10-29&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/6e48024062b14638ac7003f540b00806/view" rel="noopener noreferrer"&gt;40--CHAIN,STUD LINK&lt;/a&gt; · Dept Of Defense · NAICS 332618 · location n/a · due 2026-10-27&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://sam.gov/workspace/contract/opp/533c99d331c245fb8667404b4de179ad/view" rel="noopener noreferrer"&gt;53--PIN,SPRING&lt;/a&gt; · Dept Of Defense · NAICS 332510 · location n/a · due 2026-10-27&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://sam.gov/workspace/contract/opp/9540b76878f242ac9edb2851dce4c7a2/view" rel="noopener noreferrer"&gt;53--NUT,SELF-LOCKING,PLATE&lt;/a&gt; · Dept Of Defense · NAICS 332722 · location n/a · due 2026-10-27&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://sam.gov/workspace/contract/opp/db3a2afeed02432db6cb223714cebcfd/view" rel="noopener noreferrer"&gt;68--CALIBRATING GAS MIXTUR&lt;/a&gt; · Dept Of Defense · NAICS 325120 · location n/a · due 2026-10-27&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://sam.gov/workspace/contract/opp/184ffa0b07f54a68bf70ae4a2af4710b/view" rel="noopener noreferrer"&gt;29--NOZZLE,FUEL,COMBUSTION&lt;/a&gt; · Dept Of Defense · NAICS 336412 · location n/a · due 2026-10-27&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/0b301a41deb24c07a36149a09992719e/view" rel="noopener noreferrer"&gt;13--140D0426Q0641 IDIQ for Law Enforcement Equipment&lt;/a&gt; · Interior, Department Of The · NAICS 332994 · location n/a · due 2026-10-29&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://sam.gov/workspace/contract/opp/ce5c02e40b3b4cabaa1017b82ed53b24/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-10-30&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://sam.gov/workspace/contract/opp/d8013343b7744b108957d4b038748b75/view" rel="noopener noreferrer"&gt;Fort Leonard Wood BASOPS Solicitation&lt;/a&gt; · Dept Of Defense · NAICS 561210 · location n/a · due 2026-11-09&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://sam.gov/workspace/contract/opp/05044bcd730f4077a74ba996c13d1eb5/view" rel="noopener noreferrer"&gt;EOS Custodial Service&lt;/a&gt; · Dept Of Defense · NAICS 561720 · Joint Base MDL, NJ · due 2026-11-15&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://sam.gov/workspace/contract/opp/5316ad03376046f0aa4e9771c3b061bc/view" rel="noopener noreferrer"&gt;Recycling Services&lt;/a&gt; · Dept Of Defense · NAICS 562920 · location n/a · due 2026-11-16&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/53e4c88753fc408d949f29d55a8f2798/view" rel="noopener noreferrer"&gt;Airfield Blast Shield&lt;/a&gt; · Dept Of Defense · NAICS 238120 · Dyess AFB, TX · due 2026-10-27&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://sam.gov/workspace/contract/opp/5ac595fb8c944d729b05d33168a0390c/view" rel="noopener noreferrer"&gt;LAKE PONTCHARTRAIN &amp;amp; VICINITY (LPV), FORESHORE RISK REDUCTION REPAIRS, REACH-1, 2, 3, &amp;amp; 4 Jefferson Parish, Louisiana (ED 24-006)&lt;/a&gt; · Dept Of Defense · NAICS 237990 · LA · due 2026-10-27&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://sam.gov/workspace/contract/opp/a9bd9ff08fa14b49a827fb43c7d60041/view" rel="noopener noreferrer"&gt;Joe Pool Dam Slide Repairs&lt;/a&gt; · Dept Of Defense · NAICS 237990 · location n/a · due 2026-10-27&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://sam.gov/workspace/contract/opp/fe78646aa7fe43fbb96a05672b15ba5c/view" rel="noopener noreferrer"&gt;Lone Cone Chinking, GMUG NF, Norwood Road, Colorado&lt;/a&gt; · Agriculture, Department Of · NAICS 238390 · Norwood, CO · due 2026-10-27&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://sam.gov/workspace/contract/opp/69d45f151eca42d1ab80b8d7a532662d/view" rel="noopener noreferrer"&gt;WV-CANAAN VLY NWR-CHAIN LINK FENCE&lt;/a&gt; · Interior, Department Of The · NAICS 236220 · location n/a · due 2026-10-27&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/5b6aae4c101d46afa5df8b26f84130c4/view" rel="noopener noreferrer"&gt;DA10--Circle CVI Software or equivalent in support of VA Portland Healthcare System Portland, Oregon&lt;/a&gt; · Veterans Affairs, Department Of · NAICS 541519 · Portland · due 2026-11-03&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://sam.gov/workspace/contract/opp/9062cba08c704f95ad579bb986068703/view" rel="noopener noreferrer"&gt;W50NH9-27-R-A006 (formally W50NH9-26-R-A019) Scalable Geospatial Intelligence (GEOINT) Architecture Information Technology (IT) Contractor Manpower Equivalent (CME) Support (Scalable GEOINT)&lt;/a&gt; · Dept Of Defense · NAICS 541519 · location n/a · due 2026-11-13&lt;/li&gt;
&lt;/ul&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; $2 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;

</description>
      <category>government</category>
      <category>opendata</category>
      <category>data</category>
      <category>smallbusiness</category>
    </item>
    <item>
      <title>Turning Contractor Registrations and Building Permits into a Sales Pipeline</title>
      <dc:creator>Loomwise</dc:creator>
      <pubDate>Tue, 20 Oct 2026 12:50:51 +0000</pubDate>
      <link>https://dev.to/loomwise/turning-contractor-registrations-and-building-permits-into-a-sales-pipeline-5ehj</link>
      <guid>https://dev.to/loomwise/turning-contractor-registrations-and-building-permits-into-a-sales-pipeline-5ehj</guid>
      <description>&lt;p&gt;&lt;em&gt;By Loomwise&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;If you sell to contractors (materials, equipment rental, insurance and bonding, payroll, software), the best lead is a business that has &lt;strong&gt;just started a new kind of work&lt;/strong&gt;. Two public datasets show exactly that, and both are free to query:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;New contractor registrations.&lt;/strong&gt; In New York State, contractors and subcontractors must register with the NYS Department of Labor's Bureau of Public Work and Prevailing Wage Enforcement &lt;strong&gt;before&lt;/strong&gt; bidding on public work or starting a private project covered by prevailing wage. A new certificate means a business is getting ready for that kind of work. The registry is published as open data at data.ny.gov (dataset &lt;code&gt;i4jv-zkey&lt;/code&gt;) and refreshed daily.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Newly issued building permits.&lt;/strong&gt; A permit means a project has been approved and work is about to start at a specific address. Many large cities publish permits on Socrata or CKAN open-data portals, and some include the contractor's business name.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;This tutorial turns both into one daily, de-duplicated lead list. You'll filter each source, join them on business name, schedule the run, and send the rows to your CRM or a sheet. You'll also see where the data has gaps.&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 0: Write down who you're looking for
&lt;/h2&gt;

&lt;p&gt;Settle three things before you touch any data:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Trade:&lt;/strong&gt; electrical, roofing, solar, HVAC, paving and so on.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Territory:&lt;/strong&gt; ZIP prefixes or cities.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Disqualifiers:&lt;/strong&gt; do you want to skip businesses with a debarment or outstanding wage assessments, or are those exactly the ones you sell compliance services to?&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Step 1: New registrations as a feed
&lt;/h2&gt;

&lt;p&gt;The NY registry has a lot of fields. For prospecting, the useful ones are the certificate dates, location, and the compliance flags. The examples below use the input format of a ready-made Apify Actor for this registry (linked at the end). You could also query data.ny.gov's API directly.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Input:&lt;/strong&gt; new electrical contractors in Western New York (ZIP codes starting with &lt;code&gt;14&lt;/code&gt;) over the last 90 days, active certificates only, debarred businesses skipped:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"issuedWithinDays"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;90&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"keywords"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"electric"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"zipCodes"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"14"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"activeOnly"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"excludeDebarred"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"cleanRecordOnly"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"includeContactDetails"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"maxResults"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;500&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;What the filters do:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;issuedWithinDays&lt;/code&gt; is the certificate issue date window (&lt;code&gt;0&lt;/code&gt; = no limit). For a fixed range, use &lt;code&gt;issuedFrom&lt;/code&gt;/&lt;code&gt;issuedTo&lt;/code&gt; (&lt;code&gt;YYYY-MM-DD&lt;/code&gt;) instead.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;keywords&lt;/code&gt; matches words in the &lt;strong&gt;legal or DBA business name only&lt;/strong&gt;, not the trade a business registered for. "Electric" finds &lt;em&gt;Example Electric LLC&lt;/em&gt; but not &lt;em&gt;Example Holdings LLC&lt;/em&gt; doing electrical work. Use several synonyms.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;cities&lt;/code&gt; is an exact match (case-insensitive). &lt;code&gt;zipCodes&lt;/code&gt; matches prefixes (&lt;code&gt;112&lt;/code&gt; = Brooklyn, &lt;code&gt;14&lt;/code&gt; = Western NY).&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;businessTypes&lt;/code&gt; can be Corporation, LLC, LLP, Partnership, Association or Government.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;excludeDebarred&lt;/code&gt; (default &lt;code&gt;true&lt;/code&gt;) skips businesses that report a state or federal debarment. &lt;code&gt;cleanRecordOnly&lt;/code&gt; goes further and keeps only businesses with no outstanding wage assessments, debarments, labor/tax-law determinations or safety violations.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;mwbeOnly&lt;/code&gt; keeps only businesses that report being minority- or women-owned. This is useful for primes that need MWBE subs.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;One output row.&lt;/strong&gt; The field names are exact, but the values here are made up:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"certificateNumber"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"26-XXXXX-CR"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"businessName"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"EXAMPLE ELECTRIC LLC"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"businessType"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"LLC"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"status"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Active"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"issuedDate"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"2026-10-16"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"expirationDate"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"2028-12-29"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"businessAddress"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"123 EXAMPLE STREET"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"city"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Buffalo"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"state"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"NY"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"zipCode"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"14201"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"businessPhone"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"(555) 555-0100"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"mwbeOwned"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"hasWorkersCompInsurance"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"hasOutstandingWageAssessments"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"debarred"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"hasSafetyStandardViolation"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"apprenticeshipAssociated"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"latitude"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mf"&gt;42.89&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"longitude"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mf"&gt;-78.87&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"sourceUrl"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"https://data.ny.gov/d/i4jv-zkey"&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The full record also includes &lt;code&gt;dbaName&lt;/code&gt;, &lt;code&gt;hasLaborOrTaxLawViolation&lt;/code&gt;, &lt;code&gt;workersCompExempt&lt;/code&gt;, debarment details (&lt;code&gt;debarmentLaw&lt;/code&gt;, &lt;code&gt;debarmentStartDate&lt;/code&gt;, &lt;code&gt;debarmentEndDate&lt;/code&gt;) and apprenticeship fields. There are two ready-made dataset views: &lt;strong&gt;New contractors&lt;/strong&gt; and &lt;strong&gt;Compliance flags&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Ways the flags turn into pitches:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;hasWorkersCompInsurance: false&lt;/code&gt; or &lt;code&gt;workersCompExempt: true&lt;/code&gt;: a lead for insurance and bonding.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;apprenticeshipAssociated: false&lt;/code&gt;: a lead for apprenticeship programs and training providers.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;hasOutstandingWageAssessments: true&lt;/code&gt;: a lead for certified-payroll and compliance tools. For primes vetting subs, it's a reason to ask questions first.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Privacy behavior, and why some businesses are missing on purpose.&lt;/strong&gt; The feed is &lt;strong&gt;business-only&lt;/strong&gt;. Officer names are never requested from the source. Sole proprietorships are always excluded. A row is kept only if the name carries a legal-entity designator (LLC, Inc., Corp., Co., Company, Ltd., LP, LLP, PC, PLLC, DPC, Joint Venture/JV). DBA names are kept only when they carry one too. The address and phone are the &lt;strong&gt;registered business&lt;/strong&gt; address and phone, and &lt;code&gt;includeContactDetails: false&lt;/code&gt; removes them. Each run's &lt;code&gt;RUN_SUMMARY&lt;/code&gt; record shows how many non-entity rows were dropped. Keep in mind that the registry covers businesses registered for public-work and prevailing-wage projects. It is not a list of every contractor in New York, and it doesn't include NYC home-improvement licenses or local municipal licenses.&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 2: New permits as a feed
&lt;/h2&gt;

&lt;p&gt;City permit data differs a lot from city to city: field names, refresh schedules, and whether contractors are named at all. A unified schema saves you from writing nine parsers. Here's what the nine cities in the Actor below publish:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;City&lt;/th&gt;
&lt;th&gt;Refresh&lt;/th&gt;
&lt;th&gt;Contractor business name&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Chicago, IL&lt;/td&gt;
&lt;td&gt;daily&lt;/td&gt;
&lt;td&gt;yes&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;New York City, NY (DOB NOW)&lt;/td&gt;
&lt;td&gt;daily&lt;/td&gt;
&lt;td&gt;yes (permittee business)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Los Angeles, CA&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;weekly&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;not published&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;San Francisco, CA&lt;/td&gt;
&lt;td&gt;daily&lt;/td&gt;
&lt;td&gt;not published&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Seattle, WA&lt;/td&gt;
&lt;td&gt;daily&lt;/td&gt;
&lt;td&gt;sometimes&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Austin, TX&lt;/td&gt;
&lt;td&gt;daily&lt;/td&gt;
&lt;td&gt;yes&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Boston, MA&lt;/td&gt;
&lt;td&gt;daily&lt;/td&gt;
&lt;td&gt;rarely (applicant companies only)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Cincinnati, OH&lt;/td&gt;
&lt;td&gt;daily&lt;/td&gt;
&lt;td&gt;yes&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Baton Rouge, LA&lt;/td&gt;
&lt;td&gt;daily&lt;/td&gt;
&lt;td&gt;yes&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;Input:&lt;/strong&gt; roofing and solar permits from the last 2 days in cities that name contractors, only permits that list a contractor business:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"cities"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"chicago"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"nyc"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"austin"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"cincinnati"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"baton_rouge"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"issuedWithinDays"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"workCategories"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"Roofing"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Solar"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"onlyWithContractor"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"maxResults"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;500&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"maxResultsPerCity"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;150&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;workCategories&lt;/code&gt; is a normalized category (New construction, Addition / alteration, Demolition, Roofing, Solar, Electrical, Plumbing, Mechanical / HVAC, Fire protection, Sign, Scaffold / shed / fence, Structural / foundation / earthwork, Other). Categories are assigned by fixed keyword rules from each city's permit type and work class, with the description as a fallback. To filter on a city's own wording, use &lt;code&gt;permitTypes&lt;/code&gt; (e.g. &lt;code&gt;"Sidewalk Shed"&lt;/code&gt;, &lt;code&gt;"Commercial"&lt;/code&gt;).&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;keywords&lt;/code&gt; matches the description, type or work class, e.g. &lt;code&gt;restaurant&lt;/code&gt;, &lt;code&gt;ADU&lt;/code&gt;, &lt;code&gt;pool&lt;/code&gt;, &lt;code&gt;battery&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;minValuation&lt;/code&gt; keeps permits at or above a declared job value. &lt;strong&gt;Permits with no valuation are excluded when this is set&lt;/strong&gt;, and NYC trade permits often have none.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;maxResults&lt;/code&gt; is a total cap across cities, newest first. &lt;code&gt;maxResultsPerCity&lt;/code&gt; stops one busy city from filling the whole list.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;One output row.&lt;/strong&gt; The field names are exact, but the values here are made up:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"city"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Austin"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"state"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"TX"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"permitNumber"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"2026-XXXXXX RP"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"permitType"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Building Permit - Residential"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"workClass"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Repair"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"workCategory"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Roofing"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"description"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Reroof, tear off and replace shingles ..."&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"status"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Active"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"appliedDate"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"2026-10-10"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"issuedDate"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"2026-10-17"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"valuation"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;null&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"address"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"100 EXAMPLE DR"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"zipCode"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"78701"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"latitude"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mf"&gt;30.27&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"longitude"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mf"&gt;-97.74&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"housingUnitsChange"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;null&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"squareFeet"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;null&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"contractorBusinessName"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Example Roofing LLC"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"contractorRole"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"General Contractor"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"contractors"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"name"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Example Roofing LLC"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"role"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"General Contractor"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}],&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"permitUrl"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"https://..."&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"sourceUrl"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"https://data.austintexas.gov/d/3syk-w9eu"&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Cities publish different fields, and missing values are &lt;code&gt;null&lt;/code&gt;, not guesses. The &lt;strong&gt;Contractor leads&lt;/strong&gt; dataset view gives one line per contractor-permit pair. &lt;code&gt;RUN_SUMMARY&lt;/code&gt; gives per-city counts and lists any city that was temporarily unavailable. One city being down doesn't fail the run.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Privacy behavior.&lt;/strong&gt; Owner, applicant and individual-contractor name columns are never requested from the city APIs. Where a city mixes people and companies in one column (Chicago contacts, Boston applicants, Cincinnati company), a name is kept only if it has an entity designator. A string like &lt;code&gt;ACME ELECTRIC CO / JOHN DOE&lt;/code&gt; is split and only the company part is kept. Emails and phone numbers in descriptions are masked. The address is the &lt;strong&gt;project site&lt;/strong&gt;, never an owner's mailing address.&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 3: Join the two on business name (NYC example)
&lt;/h2&gt;

&lt;p&gt;NYC permits name the permittee business, and the NY registry lists businesses registered for public work. If you match the two, you get &lt;em&gt;businesses with active private projects that are also set up for public work&lt;/em&gt;, which is a strong signal for suppliers. Names are never typed the same way twice, so normalize them before matching:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;re&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;json&lt;/span&gt;

&lt;span class="n"&gt;DESIGNATORS&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sa"&gt;r&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;\b(LLC|L L C|INC|INCORPORATED|CORP|CORPORATION|CO|COMPANY|LTD|LP|LLP|PC|PLLC|DPC|JV|JOINT VENTURE)\b&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;

&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;norm&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="nb"&gt;str&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="bp"&gt;None&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="nb"&gt;str&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;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="sh"&gt;""&lt;/span&gt;
    &lt;span class="n"&gt;s&lt;/span&gt; &lt;span class="o"&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="nf"&gt;replace&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;&amp;amp;&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt; AND &lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;s&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="sa"&gt;r&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;[^\w\s]&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt; &lt;/span&gt;&lt;span class="sh"&gt;"&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="c1"&gt;# drop punctuation
&lt;/span&gt;    &lt;span class="n"&gt;s&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;DESIGNATORS&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt; &lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;s&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;      &lt;span class="c1"&gt;# drop LLC, INC, ...
&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="sa"&gt;r&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;\s+&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt; &lt;/span&gt;&lt;span class="sh"&gt;"&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="nf"&gt;strip&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;

&lt;span class="n"&gt;registry&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;json&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;load&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;open&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;ny_registry.json&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;  &lt;span class="c1"&gt;# exported dataset (JSON)
&lt;/span&gt;&lt;span class="n"&gt;permits&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;json&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;load&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;open&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;nyc_permits.json&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;

&lt;span class="n"&gt;by_name&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nf"&gt;norm&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="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;businessName&lt;/span&gt;&lt;span class="sh"&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="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;registry&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;r&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;registry&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;                              &lt;span class="c1"&gt;# also match on DBA names
&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="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;dbaName&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="n"&gt;by_name&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;setdefault&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;norm&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="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;dbaName&lt;/span&gt;&lt;span class="sh"&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;matches&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[]&lt;/span&gt;
&lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;p&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;permits&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="n"&gt;reg&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;by_name&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="nf"&gt;norm&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;p&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;contractorBusinessName&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)))&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;reg&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="n"&gt;matches&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;append&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
            &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;business&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;reg&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;businessName&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
            &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;certificateNumber&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;reg&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;certificateNumber&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
            &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;registeredOn&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;reg&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;issuedDate&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
            &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;permitNumber&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;p&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;permitNumber&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
            &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;workCategory&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;p&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;workCategory&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
            &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;projectAddress&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;p&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;address&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
            &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;permitIssued&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;p&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;issuedDate&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
            &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;permitUrl&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;p&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;permitUrl&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
        &lt;span class="p"&gt;})&lt;/span&gt;

&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;len&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;matches&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;matched leads&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Exact matching after normalization misses some real matches and almost never makes a wrong one. If you need more recall, add a fuzzy matcher, and review its matches by hand before they go to sales. For the registry side of a join, use a wider window (&lt;code&gt;issuedWithinDays: 0&lt;/code&gt; or a year of &lt;code&gt;issuedFrom&lt;/code&gt;), because a business may have registered long before its next permit.&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 4: Run it daily without duplicates
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;Save each input as an &lt;strong&gt;Actor task&lt;/strong&gt; in Apify Console, for example &lt;code&gt;ny-new-electrical-wny&lt;/code&gt; and &lt;code&gt;permits-roofing-solar&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Under &lt;strong&gt;Schedules → Create new&lt;/strong&gt;, set a cron such as &lt;code&gt;0 7 * * *&lt;/code&gt;, pick your timezone, add both tasks, and &lt;strong&gt;enable&lt;/strong&gt; the schedule. New schedules start disabled.&lt;/li&gt;
&lt;li&gt;Use a 2-day window (&lt;code&gt;issuedWithinDays: 2&lt;/code&gt;) so nothing falls between runs, then de-duplicate in your destination:

&lt;ul&gt;
&lt;li&gt;registry key: &lt;code&gt;certificateNumber&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;permit key: &lt;code&gt;city&lt;/code&gt; + &lt;code&gt;permitNumber&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Los Angeles refreshes weekly.&lt;/strong&gt; If you include &lt;code&gt;los_angeles&lt;/code&gt;, put it in a separate task with &lt;code&gt;issuedWithinDays: 14&lt;/code&gt; or more, run it weekly, and de-duplicate the same way. Otherwise LA will look empty most days.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;To send rows to your tools, use each task's &lt;strong&gt;Integrations&lt;/strong&gt; tab: Gmail (results attached as CSV/Excel), Google Drive file upload, Slack, webhooks, or Make/Zapier with a Google Sheets or CRM step. &lt;em&gt;Daily SAM.gov Alerts in Your NAICS Codes (No API Key)&lt;/em&gt;, the first post in this series, walks through each of these step by step.&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 5: Do outreach like a professional
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Lead with the signal.&lt;/strong&gt; "Saw you just registered for public work in Erie County. Here's how we help prevailing-wage contractors with X" beats a generic pitch.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;The data is business-only, so keep outreach business-only.&lt;/strong&gt; Follow the email and calling rules that apply to you (for US businesses, at least CAN-SPAM for email and the TCPA and do-not-call rules for phone). Check with counsel if you're unsure.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Respect the sources' terms.&lt;/strong&gt; The NY data is published under the OPEN-NY Terms of Use. If you republish Chicago data, Chicago's Data Terms of Use require a specific notice.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Don't treat a flag as a verdict.&lt;/strong&gt; &lt;code&gt;hasOutstandingWageAssessments&lt;/code&gt; and &lt;code&gt;debarred&lt;/code&gt; are what the registry reports. Check the official record before you act on it.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  The data gaps, all in one place
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;The NY registry covers &lt;strong&gt;public-work/prevailing-wage registrants only&lt;/strong&gt;. Sole proprietors, and registrations whose name lacks an entity designator, are left out on purpose.&lt;/li&gt;
&lt;li&gt;Registry &lt;code&gt;keywords&lt;/code&gt; match &lt;strong&gt;names only&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;LA permits refresh weekly&lt;/strong&gt;. &lt;strong&gt;SF and LA don't publish contractor names&lt;/strong&gt;. Seattle sometimes does, Boston rarely does.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;NYC trade permits often lack a valuation&lt;/strong&gt;, and &lt;code&gt;minValuation&lt;/code&gt; drops permits without one.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;workCategory&lt;/code&gt; is rule-based. Spot-check the categories you rely on, and use &lt;code&gt;permitTypes&lt;/code&gt; when a city's own wording is more precise.&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;&lt;em&gt;Disclosure: we built the two Actors used here, the &lt;a href="https://apify.com/loomwise/new-york-contractor-registry" rel="noopener noreferrer"&gt;New York Contractor Registry Feed&lt;/a&gt; ($3 per 1,000 results) and the &lt;a href="https://apify.com/loomwise/city-building-permits" rel="noopener noreferrer"&gt;US Building Permits Feed&lt;/a&gt; ($2 per 1,000 results), plus Apify's small Actor-start fee. Both read the official open-data APIs listed above, which you can also query yourself.&lt;/em&gt;&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Update (Oct 2026): a data-backed follow-up for one state, &lt;a href="https://dev.to/loomwise/new-washington-contractor-licenses-in-october-2026-422-businesses-by-city-and-trade-3d48"&gt;New Washington contractor licenses in October 2026&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>opendata</category>
      <category>sales</category>
      <category>python</category>
      <category>tutorial</category>
    </item>
    <item>
      <title>Daily SAM.gov Alerts in Your NAICS Codes (No API Key)</title>
      <dc:creator>Loomwise</dc:creator>
      <pubDate>Mon, 19 Oct 2026 13:20:16 +0000</pubDate>
      <link>https://dev.to/loomwise/daily-samgov-alerts-in-your-naics-codes-no-api-key-1p08</link>
      <guid>https://dev.to/loomwise/daily-samgov-alerts-in-your-naics-codes-no-api-key-1p08</guid>
      <description>&lt;p&gt;&lt;em&gt;By Loomwise&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;If you sell to the federal government, the routine is the same every day: open SAM.gov, re-run your searches, and scan for anything new in your NAICS codes before the response window closes. This post covers three ways to automate that. Pick the one that matches how much you want to do with the data.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Approach&lt;/th&gt;
&lt;th&gt;Cost&lt;/th&gt;
&lt;th&gt;What you get&lt;/th&gt;
&lt;th&gt;Best when&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;A. SAM.gov saved search + Notify&lt;/td&gt;
&lt;td&gt;Free&lt;/td&gt;
&lt;td&gt;An email with a link to your search results&lt;/td&gt;
&lt;td&gt;You track one or two searches and just want a nudge&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;B. SAM.gov Get Opportunities API&lt;/td&gt;
&lt;td&gt;Free (API key needed)&lt;/td&gt;
&lt;td&gt;JSON per request&lt;/td&gt;
&lt;td&gt;You're a developer and stay within your daily request limit&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;C. Scheduled feed from SAM.gov's public daily extract&lt;/td&gt;
&lt;td&gt;Pay per result&lt;/td&gt;
&lt;td&gt;Rows in email, a Drive file/Sheet or Slack&lt;/td&gt;
&lt;td&gt;You want the actual notices, filtered, in your own tools&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  Before you start: list your NAICS codes
&lt;/h2&gt;

&lt;p&gt;Write down the 6-digit NAICS codes you bid under. Your SAM.gov entity registration is a good starting point, and the official lookup is at census.gov/naics. Think about prefixes too: &lt;code&gt;5415&lt;/code&gt; covers every &lt;code&gt;5415xx&lt;/code&gt; code (computer systems design and related services). If agencies tend to misclassify your kind of work, add a few keywords such as "janitorial" or "HVAC".&lt;/p&gt;

&lt;h2&gt;
  
  
  Option A: SAM.gov saved search with Notify (free)
&lt;/h2&gt;

&lt;p&gt;This is built into SAM.gov, and a lot of people miss it.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Sign in to SAM.gov. You need a free account to save searches.&lt;/li&gt;
&lt;li&gt;Search the &lt;strong&gt;Contract Opportunities&lt;/strong&gt; domain. Set NAICS, set-aside, place of performance and notice type in the left-hand filters.&lt;/li&gt;
&lt;li&gt;Click &lt;strong&gt;Actions → Save&lt;/strong&gt; and name the search.&lt;/li&gt;
&lt;li&gt;Open &lt;strong&gt;Saved Searches&lt;/strong&gt;, click &lt;strong&gt;Actions&lt;/strong&gt; next to the search, and choose &lt;strong&gt;Notify&lt;/strong&gt;. Saving a search on its own sends no email.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The limit: the email points you to your search results and doesn't list which notices matched. You still click through and read every time.&lt;/p&gt;

&lt;h2&gt;
  
  
  Option B: the official API
&lt;/h2&gt;

&lt;p&gt;GSA's Get Opportunities Public API (&lt;code&gt;https://api.sam.gov/opportunities/v2/search&lt;/code&gt;) takes &lt;code&gt;ncode&lt;/code&gt; (one NAICS code), &lt;code&gt;ptype&lt;/code&gt;, &lt;code&gt;typeOfSetAside&lt;/code&gt;, &lt;code&gt;state&lt;/code&gt;, and a required &lt;code&gt;postedFrom&lt;/code&gt;/&lt;code&gt;postedTo&lt;/code&gt; range in &lt;code&gt;MM/dd/yyyy&lt;/code&gt; format. It needs an API key from your SAM.gov account. GSA's user guide sets the default limit for a non-federal individual who isn't associated with an entity at 10 requests per 24 hours. Associated users and system accounts get more. Because each request takes one NAICS code, tracking a dozen codes can use up a small quota quickly. Docs: open.gsa.gov/api/get-opportunities-public-api.&lt;/p&gt;

&lt;h2&gt;
  
  
  Option C: a scheduled feed from the public daily extract (no API key)
&lt;/h2&gt;

&lt;p&gt;SAM.gov also publishes a public daily data extract of all active opportunities in its Data Services section. Anyone can download it without an API key. The file is large, so the useful part is filtering it down to your codes, scheduling the filter, and sending the results somewhere you'll see them. The steps below use a ready-made Apify Actor that does this (linked at the end). The same pattern works for any scheduled Apify run.&lt;/p&gt;

&lt;h3&gt;
  
  
  Step 1: Build your input
&lt;/h3&gt;

&lt;p&gt;This input returns open solicitations from the last two days in two facilities-services NAICS codes, small-business set-asides only, performed in Virginia, Maryland or DC:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"naicsCodes"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"561720"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"561730"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"setAsideTypes"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"SBA"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"SDVOSBC"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"WOSB"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"placeOfPerformanceStates"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"VA"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"MD"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"DC"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"noticeTypes"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"Solicitation"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Combined Synopsis/Solicitation"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&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="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"postedWithinDays"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"excludeExpired"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"dedupeBySolicitation"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"maxResults"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;300&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"includeSam"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"includeGrants"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;What each field does:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;naicsCodes&lt;/code&gt; takes exact codes or prefixes (&lt;code&gt;5415&lt;/code&gt; matches every &lt;code&gt;5415xx&lt;/code&gt; code).&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;keywords&lt;/code&gt; (not used above) matches any keyword in the title, solicitation number or full description, ignoring case. Use it with NAICS codes or instead of them.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;setAsideTypes&lt;/code&gt; uses SAM.gov's codes. For example &lt;code&gt;SBA&lt;/code&gt; (total small business), &lt;code&gt;8A&lt;/code&gt;, &lt;code&gt;HZC&lt;/code&gt; (HUBZone), &lt;code&gt;SDVOSBC&lt;/code&gt;, &lt;code&gt;WOSB&lt;/code&gt;, &lt;code&gt;EDWOSB&lt;/code&gt;, or &lt;code&gt;NONE&lt;/code&gt; for unrestricted notices.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;placeOfPerformanceStates&lt;/code&gt; takes two-letter codes. When this filter is set, notices without a listed place of performance are &lt;strong&gt;excluded&lt;/strong&gt;. Leave it empty if you also want those.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;noticeTypes&lt;/code&gt; is worth widening. Sources Sought and Presolicitation notices give you a heads-up before the solicitation drops.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;postedWithinDays&lt;/code&gt; counts days including today, in UTC. &lt;code&gt;0&lt;/code&gt; means no limit. You can use &lt;code&gt;postedFrom&lt;/code&gt;/&lt;code&gt;postedTo&lt;/code&gt; instead for a fixed range.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;excludeExpired&lt;/code&gt; (default &lt;code&gt;true&lt;/code&gt;) drops notices whose response deadline has passed. Notices with no deadline are kept.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;dedupeBySolicitation&lt;/code&gt; keeps only the newest notice per solicitation number. SAM.gov posts amendments and follow-ups as separate records.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;maxResults&lt;/code&gt; caps the total rows. You pay per result, so this also caps cost.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Step 2: Run it once and check a row
&lt;/h3&gt;

&lt;p&gt;The first run is the test. Each result looks like this (the &lt;code&gt;fundingInstrument&lt;/code&gt;, &lt;code&gt;assistanceListings&lt;/code&gt;, &lt;code&gt;awardCeiling&lt;/code&gt; and &lt;code&gt;awardFloor&lt;/code&gt; fields are &lt;code&gt;null&lt;/code&gt; for contracts and only filled in for grants):&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"id"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"6196197ae63848ce93a86870cb18e0cd"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"source"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"sam.gov"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"title"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Helena - Lewis and Clark National Forest Dry Pole Pit Rock Crushing Service"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"solicitationNumber"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"1240BE27Q0001"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"agency"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"AGRICULTURE, DEPARTMENT OF"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"subAgency"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"FOREST SERVICE"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"office"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"WALLOWA WHITMAN NATIONAL FOREST"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"noticeType"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Combined Synopsis/Solicitation"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"naicsCode"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"237310"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"classificationCode"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Z1LB"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"setAsideCode"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"SBA"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"setAside"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Small Business Set Aside - Total"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"postedDate"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"2026-10-17"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"responseDeadline"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"2026-10-22T13:00:00-06:00"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"archiveDate"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"2026-11-06"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"popCity"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Stanford"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"popState"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"MT"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"popZip"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;null&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"popCountry"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"USA"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"link"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"https://sam.gov/workspace/contract/opp/6196197ae63848ce93a86870cb18e0cd/view"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"descriptionSnippet"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Amendment 0001 - This amendment provides missing solicitation attachments, issues Government responses to offeror questions…"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"fundingInstrument"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;null&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"assistanceListings"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;null&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"awardCeiling"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;null&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"awardFloor"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;null&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Contact names, emails and phone numbers are left out. Open &lt;code&gt;link&lt;/code&gt; when you're ready to read the full notice and respond. Each run also writes a &lt;code&gt;RUN_SUMMARY&lt;/code&gt; record with the source file's timestamp, so you can check how fresh the data is.&lt;/p&gt;

&lt;h3&gt;
  
  
  Step 3: Save it as a task
&lt;/h3&gt;

&lt;p&gt;In Apify Console, click &lt;strong&gt;Save as a new task&lt;/strong&gt; on the Actor page, give it a name (for example &lt;code&gt;daily-facilities-va-md-dc&lt;/code&gt;), and paste the input above. Tasks are reusable saved configurations. Consultants can keep one task per client profile.&lt;/p&gt;

&lt;h3&gt;
  
  
  Step 4: Schedule it daily
&lt;/h3&gt;

&lt;p&gt;SAM.gov regenerates the extract once a day, overnight US time, so a notice posted today usually appears the next morning. Schedule for the morning:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Schedules → Create new&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Set the cron expression &lt;code&gt;0 8 * * *&lt;/code&gt; (08:00 every day) and choose your timezone, for example &lt;code&gt;America/New_York&lt;/code&gt;. Schedules handle daylight-saving changes.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Add → Actor task&lt;/strong&gt; and choose your task.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Enable&lt;/strong&gt; the schedule. New schedules start disabled.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Why &lt;code&gt;postedWithinDays: 2&lt;/code&gt; rather than &lt;code&gt;1&lt;/code&gt;? The window counts in UTC and the extract refreshes overnight, so a two-day window with de-duplication on &lt;code&gt;id&lt;/code&gt; in your destination (Step 6) won't miss notices posted near midnight. The trade-off is that you pay again for repeat rows.&lt;/p&gt;

&lt;h3&gt;
  
  
  Step 5: Send results where you'll see them
&lt;/h3&gt;

&lt;p&gt;Open the task's &lt;strong&gt;Integrations&lt;/strong&gt; tab:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Email:&lt;/strong&gt; add &lt;strong&gt;Send results email via Gmail&lt;/strong&gt;, connect a Google account, set the subject and body, and attach the dataset as CSV or Excel. By default it fires only on successful runs.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Google Drive / Sheets:&lt;/strong&gt; add &lt;strong&gt;Upload results to GDrive&lt;/strong&gt; and pick the file name and format. Each successful run uploads a file to the &lt;code&gt;Apify Uploads&lt;/code&gt; folder, and a CSV or XLSX file there opens in Google Sheets. To &lt;strong&gt;append rows to one running sheet&lt;/strong&gt; instead, use Make or Zapier: an Apify "Watch Actor Runs" trigger, then "Get Dataset Items", then the Google Sheets "Add Rows" step. Apify's Make docs walk through exactly this.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Slack:&lt;/strong&gt; add the &lt;strong&gt;Slack&lt;/strong&gt; integration, connect your workspace, pick a channel and the "run succeeded" event. The message field accepts a Handlebars template, so you can post a link to the run's dataset, e.g. &lt;code&gt;&amp;lt;https://console.apify.com/storage/datasets/{{resource.defaultDatasetId}}|Today's opportunities&amp;gt;&lt;/code&gt;. If a run fails, a second "run failed" message tells you to look.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Anything else:&lt;/strong&gt; webhooks and the REST API let you send rows to a CRM, a bid board or a newsletter tool.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Step 6: Keep only what's new and keep costs predictable
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;De-duplicate on &lt;code&gt;id&lt;/code&gt;&lt;/strong&gt; in your destination (a "remove duplicates" step in Sheets, or an upsert in a database). Overlapping windows will then never show the same notice twice.&lt;/li&gt;
&lt;li&gt;Leave &lt;code&gt;dedupeBySolicitation&lt;/code&gt; on if you only want the latest version of each solicitation. Turn it off if you want to see every amendment.&lt;/li&gt;
&lt;li&gt;Set &lt;code&gt;maxResults&lt;/code&gt; and the run's maximum-charge option so one broad filter can't produce a surprise bill.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Tips that matter more than the tooling
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Watch Sources Sought.&lt;/strong&gt; They show what an agency plans to buy, and responding can shape the set-aside decision.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Use NAICS prefixes plus a few keywords.&lt;/strong&gt; Contracting officers pick NAICS codes inconsistently, and a keyword match on the full description catches what the codes miss.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Read the deadline, not the posted date.&lt;/strong&gt; &lt;code&gt;responseDeadline&lt;/code&gt; carries its timezone offset, so sort by it.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Grants are separate.&lt;/strong&gt; If you also pursue grants, setting &lt;code&gt;includeGrants: true&lt;/code&gt; adds Grants.gov opportunities in the same schema. NAICS, set-aside, state and notice-type filters don't apply to grants, because Grants.gov doesn't publish those fields.&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;&lt;em&gt;Disclosure: we built the Actor used in Option C, the &lt;a href="https://apify.com/loomwise/federal-opportunities" rel="noopener noreferrer"&gt;SAM.gov Contract Opportunities Scraper &amp;amp; Feed&lt;/a&gt;. It costs $2 per 1,000 results, plus Apify's small Actor-start fee. Options A and B work fine on their own if you don't need it.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>govcon</category>
      <category>opendata</category>
      <category>automation</category>
      <category>tutorial</category>
    </item>
  </channel>
</rss>
