<?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: Michalis Solomou</title>
    <description>The latest articles on DEV Community by Michalis Solomou (@michalis_solomou_ef4e3025).</description>
    <link>https://dev.to/michalis_solomou_ef4e3025</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%2F4027664%2F81da894d-9457-4603-b4b4-2f14bbe5719e.png</url>
      <title>DEV Community: Michalis Solomou</title>
      <link>https://dev.to/michalis_solomou_ef4e3025</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/michalis_solomou_ef4e3025"/>
    <language>en</language>
    <item>
      <title>Five SEC Form D Filings This Week, Worth $984M Combined</title>
      <dc:creator>Michalis Solomou</dc:creator>
      <pubDate>Fri, 07 Aug 2026 13:21:39 +0000</pubDate>
      <link>https://dev.to/michalis_solomou_ef4e3025/five-sec-form-d-filings-this-week-worth-984m-combined-3g13</link>
      <guid>https://dev.to/michalis_solomou_ef4e3025/five-sec-form-d-filings-this-week-worth-984m-combined-3g13</guid>
      <description>&lt;p&gt;Five companies filed SEC Form D paperwork this week — public record, days to weeks before any funding announcement hits the press.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Company&lt;/th&gt;
&lt;th&gt;Industry&lt;/th&gt;
&lt;th&gt;Raised&lt;/th&gt;
&lt;th&gt;Score&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Integrated Biosciences&lt;/td&gt;
&lt;td&gt;Biotech&lt;/td&gt;
&lt;td&gt;$68.4M&lt;/td&gt;
&lt;td&gt;98&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Jasper Therapeutics&lt;/td&gt;
&lt;td&gt;Biotech&lt;/td&gt;
&lt;td&gt;$132.0M&lt;/td&gt;
&lt;td&gt;98&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Oxide Computer Co&lt;/td&gt;
&lt;td&gt;Hardware/Infra&lt;/td&gt;
&lt;td&gt;$445.0M&lt;/td&gt;
&lt;td&gt;97&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Mariana Minerals&lt;/td&gt;
&lt;td&gt;Energy&lt;/td&gt;
&lt;td&gt;$310.5M&lt;/td&gt;
&lt;td&gt;93&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Proactive AI Lab&lt;/td&gt;
&lt;td&gt;AI&lt;/td&gt;
&lt;td&gt;$28.3M&lt;/td&gt;
&lt;td&gt;93&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;Total: ~$984M in newly-raised capital, all public before the press release.&lt;/strong&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Why this matters if you sell B2B
&lt;/h2&gt;

&lt;p&gt;A company that just raised has two things it didn't have last month: cash and a mandate to spend it. New hires, new tools, new vendors — the buying window is widest in the weeks right after a raise, before the funding news is even public.&lt;/p&gt;

&lt;p&gt;Form D filings go public on SEC EDGAR the moment they're filed — legally, for free, no scraping required. Almost nobody checks them manually, because the raw filings are unstructured and unscored.&lt;/p&gt;

&lt;p&gt;We built &lt;a href="https://fundingsignals.net/?utm_source=devto&amp;amp;utm_medium=social&amp;amp;utm_campaign=round8" rel="noopener noreferrer"&gt;Funding Signals&lt;/a&gt; to do that automatically: poll EDGAR daily, filter out amendments and investment funds, and score what's left 0-100 on "likely to buy soon" — company, industry, funding amount, resolved domain.&lt;/p&gt;

&lt;p&gt;Free API key, no card required, 1,500 calls/month on the free tier.&lt;/p&gt;

</description>
      <category>sales</category>
      <category>api</category>
      <category>saas</category>
      <category>startup</category>
    </item>
    <item>
      <title>Five SEC Form D filings this week, worth $1.8B combined — here's what's public and free</title>
      <dc:creator>Michalis Solomou</dc:creator>
      <pubDate>Thu, 06 Aug 2026 15:40:38 +0000</pubDate>
      <link>https://dev.to/michalis_solomou_ef4e3025/five-sec-form-d-filings-this-week-worth-18b-combined-heres-whats-public-and-free-19a4</link>
      <guid>https://dev.to/michalis_solomou_ef4e3025/five-sec-form-d-filings-this-week-worth-18b-combined-heres-whats-public-and-free-19a4</guid>
      <description>&lt;p&gt;This week five companies quietly filed SEC Form D notices — the public record every company has to file within 15 days of closing a private funding round. None of these have hit TechCrunch yet.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Groq&lt;/strong&gt; — $672.2M&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;DriveNets&lt;/strong&gt; — $410.25M&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Antares Nuclear&lt;/strong&gt; — $320M&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Sila Nanotechnologies&lt;/strong&gt; — $309.6M&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;General Fusion&lt;/strong&gt; — $107.7M&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That's $1.8B combined, sitting in EDGAR right now, free for anyone to read.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why this matters if you sell B2B
&lt;/h2&gt;

&lt;p&gt;A funding round is one of the strongest buying-intent signals that exists — new budget, new headcount, new tools to evaluate. Sales and marketing teams already know this, which is why "funding alerts" are a whole category of paid tools. What most people don't realize is that the underlying data (SEC Form D) is public and free, and it's available &lt;em&gt;before&lt;/em&gt; the press release, not after.&lt;/p&gt;

&lt;p&gt;By the time a raise is on TechCrunch, every vendor in the space has already sent a cold email. The Form D filing itself is the earlier signal.&lt;/p&gt;

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

&lt;p&gt;&lt;a href="https://fundingsignals.net/?utm_source=devto&amp;amp;utm_medium=article&amp;amp;utm_campaign=round7" rel="noopener noreferrer"&gt;Funding Signals&lt;/a&gt; pulls new Form D filings from EDGAR, scores them (dedupes funds/amendments, filters noise), and enriches the real ones with company domain + contacts. Free tier, no card required.&lt;/p&gt;

&lt;p&gt;Happy to answer questions about how the EDGAR full-text search / filing pipeline works if anyone's curious — it's a fun, messy dataset.&lt;/p&gt;

</description>
      <category>sales</category>
      <category>api</category>
      <category>startup</category>
    </item>
    <item>
      <title>Four SEC Form D filings this week, worth $753M combined — here's why that matters for B2B sales</title>
      <dc:creator>Michalis Solomou</dc:creator>
      <pubDate>Tue, 04 Aug 2026 13:38:36 +0000</pubDate>
      <link>https://dev.to/michalis_solomou_ef4e3025/four-sec-form-d-filings-this-week-worth-753m-combined-heres-why-that-matters-for-b2b-sales-3ggb</link>
      <guid>https://dev.to/michalis_solomou_ef4e3025/four-sec-form-d-filings-this-week-worth-753m-combined-heres-why-that-matters-for-b2b-sales-3ggb</guid>
      <description>&lt;p&gt;This week alone, four companies filed SEC Form D notices totaling $753M: Emerald AI ($90.2M), Core Automation ($432.1M), ThreatLocker ($189.2M), and Valoros ($31.4M).&lt;/p&gt;

&lt;p&gt;Most sales and marketing teams never see these. Form D filings are public, factual, and filed days-to-weeks before a funding round hits TechCrunch or a company's own press release — which means the budget signal is available before your competitors are even looking for it.&lt;/p&gt;

&lt;p&gt;Why this matters for outbound:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;A funded company has fresh budget and a mandate to spend it (headcount, tools, vendors).&lt;/li&gt;
&lt;li&gt;Form D data is free and public — no scraping paywalled news sites.&lt;/li&gt;
&lt;li&gt;Timing beats targeting: reaching out in the first two weeks after a raise gets a materially different response than six months later.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;We built Funding Signals to turn raw EDGAR filings into a scored, enriched lead feed — company, industry, amount, and contact-ready enrichment, updated as filings land: &lt;a href="https://fundingsignals.net/?utm_source=devto&amp;amp;utm_medium=article" rel="noopener noreferrer"&gt;https://fundingsignals.net/?utm_source=devto&amp;amp;utm_medium=article&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Free tier available if you want to see this week's list for your own niche.&lt;/p&gt;

</description>
      <category>sales</category>
      <category>startup</category>
      <category>b2b</category>
    </item>
    <item>
      <title>This week in Form D filings: $427M+ across 3 raises, pulled with a Python one-liner</title>
      <dc:creator>Michalis Solomou</dc:creator>
      <pubDate>Mon, 03 Aug 2026 19:43:29 +0000</pubDate>
      <link>https://dev.to/michalis_solomou_ef4e3025/this-week-in-form-d-filings-427m-across-3-raises-pulled-with-a-python-one-liner-546j</link>
      <guid>https://dev.to/michalis_solomou_ef4e3025/this-week-in-form-d-filings-427m-across-3-raises-pulled-with-a-python-one-liner-546j</guid>
      <description>&lt;p&gt;Three SEC Form D filings crossed my scored feed this week: Sila Nanotechnologies ($309.6M), Core Automation ($432.1M), and Invoq Health ($58.8M). All public record days to weeks before any of it hits tech press.&lt;/p&gt;

&lt;p&gt;Here's the whole pull, no auth required for the sample endpoint:&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;httpx&lt;/span&gt;

&lt;span class="n"&gt;r&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;httpx&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;https://fundingsignals.net/v1/sample&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;company&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;r&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;json&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt;
    &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;company&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;company_name&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt; — $&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;company&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;amount_usd&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="si"&gt;:&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt; (&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;company&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;industry&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt;)&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That's it. No scraping, no API key for the sample. The full feed (paginated, scored 0-100, enriched with domain + contacts) needs a free key.&lt;/p&gt;

&lt;p&gt;Why this matters for anyone doing outbound: a funding round is one of the most reliable "budget just got approved" signals that exists, and it's public information — SEC EDGAR publishes Form D within 15 days of the first sale of securities. Most tools infer buying intent from indirect signals (hiring, tech stack changes). This one is just... the filing.&lt;/p&gt;

&lt;p&gt;fundingsignals.net/?utm_source=devto&amp;amp;utm_medium=post&lt;/p&gt;

</description>
      <category>python</category>
      <category>api</category>
      <category>sales</category>
      <category>webdev</category>
    </item>
    <item>
      <title>How to Track SEC Form D Filings in Real Time</title>
      <dc:creator>Michalis Solomou</dc:creator>
      <pubDate>Sun, 02 Aug 2026 09:05:16 +0000</pubDate>
      <link>https://dev.to/michalis_solomou_ef4e3025/how-to-track-sec-form-d-filings-in-real-time-36la</link>
      <guid>https://dev.to/michalis_solomou_ef4e3025/how-to-track-sec-form-d-filings-in-real-time-36la</guid>
      <description>&lt;p&gt;If you sell to startups — SaaS tools, recruiting, PR, dev shops, anything B2B — the moment a company raises funding is one of the best buying-intent signals you'll ever get. Fresh budget, new headcount plans, a founder actively looking for vendors. The problem is that funding &lt;em&gt;announcements&lt;/em&gt; (TechCrunch, press releases) lag the actual event by days or weeks.&lt;/p&gt;

&lt;p&gt;The underlying event is public &lt;strong&gt;before&lt;/strong&gt; the press writes about it: a &lt;strong&gt;Form D filing&lt;/strong&gt; with the SEC. Here's how to pull it yourself.&lt;/p&gt;

&lt;h2&gt;
  
  
  What is a Form D?
&lt;/h2&gt;

&lt;p&gt;Form D is the filing a company makes with the SEC when it raises money in a private offering (the overwhelming majority of VC/angel rounds in the US). It's short, structured, and — unlike an 8-K or 10-K — filed within 15 days of the first sale of securities, often well before any public announcement. It includes:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Company name, address, and industry (&lt;code&gt;primarySICCode&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;Amount raised (&lt;code&gt;totalOfferingAmount&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;Date of first sale&lt;/li&gt;
&lt;li&gt;Related persons (executives, sometimes directors)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;All of it is public, free, and structured XML.&lt;/p&gt;

&lt;h2&gt;
  
  
  Where the data lives
&lt;/h2&gt;

&lt;p&gt;SEC EDGAR exposes two useful surfaces:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Full-text search API&lt;/strong&gt; — &lt;code&gt;https://efts.sec.gov/LATEST/search-index?q=...&amp;amp;forms=D&lt;/code&gt; lets you query recent Form D filings.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;The daily/quarterly index files&lt;/strong&gt; — &lt;code&gt;https://www.sec.gov/Archives/edgar/full-index/&lt;/code&gt; list every filing by date, which you can filter to &lt;code&gt;form.idx&lt;/code&gt; entries starting with &lt;code&gt;D&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Per-filing XML&lt;/strong&gt; — each Form D filing has a &lt;code&gt;primary_doc.xml&lt;/code&gt; with the structured data above, at a predictable URL once you have the accession number.&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  A minimal polling script
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;requests&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;time&lt;/span&gt;

&lt;span class="n"&gt;HEADERS&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;User-Agent&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;YourCompany research@yourcompany.com&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;  &lt;span class="c1"&gt;# SEC requires this
&lt;/span&gt;
&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;get_recent_form_d&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;days_back&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="n"&gt;url&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;https://www.sec.gov/cgi-bin/browse-edgar&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
    &lt;span class="n"&gt;params&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;action&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;getcompany&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;type&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;D&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;dateb&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="p"&gt;,&lt;/span&gt;
        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;owner&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;include&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;count&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;100&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;output&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;atom&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="n"&gt;resp&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;requests&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;url&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;params&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;params&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;headers&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;HEADERS&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;resp&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;raise_for_status&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;resp&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;text&lt;/span&gt;  &lt;span class="c1"&gt;# parse the Atom feed for entries
&lt;/span&gt;
&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;poll_loop&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt;
    &lt;span class="k"&gt;while&lt;/span&gt; &lt;span class="bp"&gt;True&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="n"&gt;feed&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;get_recent_form_d&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
        &lt;span class="c1"&gt;# parse feed, diff against last-seen accession numbers, fetch primary_doc.xml
&lt;/span&gt;        &lt;span class="c1"&gt;# for each new filing, extract company name / amount / industry
&lt;/span&gt;        &lt;span class="n"&gt;time&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;sleep&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;60&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="mi"&gt;15&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;  &lt;span class="c1"&gt;# SEC rate limit: stay well under 10 req/sec, this is generous
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The full-text search endpoint (&lt;code&gt;efts.sec.gov&lt;/code&gt;) is faster to filter by form type and date range if you want something closer to real time than the daily index files, which only update once EDGAR finishes processing the day's batch.&lt;/p&gt;

&lt;h2&gt;
  
  
  Things that bite people building this
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Rate limits.&lt;/strong&gt; SEC asks for a descriptive &lt;code&gt;User-Agent&lt;/code&gt; header and caps you around 10 requests/second — polling every filing individually will get you blocked fast. Batch via the index files where you can.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Amount parsing.&lt;/strong&gt; &lt;code&gt;totalOfferingAmount&lt;/code&gt; is sometimes &lt;code&gt;"Indefinite"&lt;/code&gt; — handle it, don't crash your parser on it.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Deduplication.&lt;/strong&gt; Companies amend Form D filings (Form D/A). Decide up front whether you want the latest amendment or the original filing as your "signal" — they can have meaningfully different amounts.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Industry codes.&lt;/strong&gt; SIC codes are coarse and sometimes wrong/generic (&lt;code&gt;"Other Technology"&lt;/code&gt; when the company is clearly biotech, for example) — don't rely on them alone if you need clean industry categorization.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;No contact info.&lt;/strong&gt; Form D gives you the company and sometimes executive names — it does &lt;em&gt;not&lt;/em&gt; give you emails or phone numbers. That's a separate enrichment step, and one worth doing carefully — see the compliance note below.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  A note on compliance
&lt;/h2&gt;

&lt;p&gt;Form D is public record, so scraping it is fine. Be careful with what you build &lt;em&gt;on top&lt;/em&gt; of it: don't scrape personal emails, don't skip an unsubscribe/opt-out mechanism if you're sending outreach off this signal, and keep enrichment to company-level data (domain, generic role emails) rather than harvesting personal information you don't have a lawful basis to hold.&lt;/p&gt;

&lt;h2&gt;
  
  
  If you'd rather not build the pipeline
&lt;/h2&gt;

&lt;p&gt;I built exactly this — a daily-updating feed of companies that just filed a Form D (plus funding-news signals), scored 0–100 as sales leads, with company domain and generic contact emails attached. Free tier, no card required: &lt;a href="https://fundingsignals.net/?utm_source=devto&amp;amp;utm_medium=article&amp;amp;utm_campaign=form_d_realtime" rel="noopener noreferrer"&gt;fundingsignals.net&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;But if you just need the raw filings for your own pipeline, everything above is enough to get you a working poller in an afternoon.&lt;/p&gt;

</description>
      <category>python</category>
      <category>api</category>
      <category>webdev</category>
      <category>tutorial</category>
    </item>
    <item>
      <title>I built a free API that turns SEC Form D filings into scored B2B leads</title>
      <dc:creator>Michalis Solomou</dc:creator>
      <pubDate>Sun, 26 Jul 2026 09:59:45 +0000</pubDate>
      <link>https://dev.to/michalis_solomou_ef4e3025/i-built-a-free-api-that-turns-sec-form-d-filings-into-scored-b2b-leads-43ph</link>
      <guid>https://dev.to/michalis_solomou_ef4e3025/i-built-a-free-api-that-turns-sec-form-d-filings-into-scored-b2b-leads-43ph</guid>
      <description>&lt;h2&gt;
  
  
  The problem
&lt;/h2&gt;

&lt;p&gt;If you do B2B outbound, a company that just raised funding is one of the warmest leads you can get -- fresh budget, actively evaluating vendors. The catch: press coverage of a raise typically lags the actual event by days or weeks, so by the time it's on TechCrunch or Crunchbase, other people have already reached out.&lt;/p&gt;

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

&lt;p&gt;Funding Signals is a small API that watches the SEC's daily EDGAR Form D index directly -- the raw regulatory filing, not the press release. Every new filing gets:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Scored 0-100 based on size, recency, and industry&lt;/li&gt;
&lt;li&gt;Enriched with the company's domain and a contact email&lt;/li&gt;
&lt;li&gt;Made available same-day (paid) or with a short delay (free tier)&lt;/li&gt;
&lt;/ul&gt;

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

&lt;p&gt;No card required for the free tier: fundingsignals.net&lt;/p&gt;

&lt;h2&gt;
  
  
  Feedback wanted
&lt;/h2&gt;

&lt;p&gt;Genuinely curious from other devs/founders here: is "reach them right after they raise" a signal you'd actually use for prospecting, or is it weaker than good firmographic/intent data? Would love to hear how you currently find fresh leads.&lt;/p&gt;

</description>
      <category>api</category>
      <category>saas</category>
      <category>showdev</category>
    </item>
    <item>
      <title>SEC Form D as a free, factual "buying intent" signal for B2B</title>
      <dc:creator>Michalis Solomou</dc:creator>
      <pubDate>Sat, 25 Jul 2026 13:16:56 +0000</pubDate>
      <link>https://dev.to/michalis_solomou_ef4e3025/sec-form-d-as-a-free-factual-buying-intent-signal-for-b2b-d3</link>
      <guid>https://dev.to/michalis_solomou_ef4e3025/sec-form-d-as-a-free-factual-buying-intent-signal-for-b2b-d3</guid>
      <description>&lt;p&gt;Most "intent data" in B2B sales is inferred: web visits, job-post scraping, hiring signals. Useful, but noisy — you're guessing at a company's internal state from the outside.&lt;/p&gt;

&lt;p&gt;SEC Form D filings are different. Any US company raising a private round (equity, debt, or fund interests) has to file one with the SEC — and it becomes public days to weeks before the funding gets a press release or a TechCrunch writeup. It's not an inference, it's a legal fact, and it's free to read on EDGAR.&lt;/p&gt;

&lt;p&gt;The catch: EDGAR's full-text search is built for compliance people, not for a sales team trying to build a Monday-morning target list. Raw filings mix in real operating companies with investment funds, SPVs, and amendments that aren't real "someone just got money" events.&lt;/p&gt;

&lt;p&gt;So I built a small pipeline that:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;pulls new Form D filings + funding-news RSS daily&lt;/li&gt;
&lt;li&gt;filters out funds/SPVs/amendments (the noise)&lt;/li&gt;
&lt;li&gt;scores what's left 0-100 on "how sales-ready is this raise"&lt;/li&gt;
&lt;li&gt;optionally enriches with company domain, industry, and generic contact emails&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;It ships as a plain REST API with a free tier (delayed signals, no card required) and a small dashboard to browse the freshest raises without writing any code: &lt;a href="https://fundingsignals.net" rel="noopener noreferrer"&gt;https://fundingsignals.net&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Also just added: a free embeddable JS widget (one script tag → live "recently funded" list for VC blogs/directories) and permanent monthly archive pages for anyone who wants the historical data without hitting the API.&lt;/p&gt;

&lt;p&gt;Curious if anyone else here is using public filings (Form D, 10-K/10-Q 8-Ks, etc.) as a signal source instead of the usual scraped/inferred stuff — what have you built with it?&lt;/p&gt;

</description>
      <category>api</category>
      <category>sales</category>
      <category>saas</category>
      <category>opensource</category>
    </item>
    <item>
      <title>Two ES module script tags, same src, only one runs: a debugging story</title>
      <dc:creator>Michalis Solomou</dc:creator>
      <pubDate>Sat, 25 Jul 2026 06:50:37 +0000</pubDate>
      <link>https://dev.to/michalis_solomou_ef4e3025/two-es-module-script-tags-same-src-only-one-runs-a-debugging-story-48mb</link>
      <guid>https://dev.to/michalis_solomou_ef4e3025/two-es-module-script-tags-same-src-only-one-runs-a-debugging-story-48mb</guid>
      <description>&lt;p&gt;I migrated a landing page to a new domain and left the old analytics beacon tag in place "temporarily," alongside the new one. Two &lt;code&gt;&amp;lt;script type="module" src="https://static.cloudflareinsights.com/beacon.min.js"&amp;gt;&lt;/code&gt; tags, identical src, different &lt;code&gt;data-cf-beacon&lt;/code&gt; token attribute.&lt;/p&gt;

&lt;p&gt;Traffic on the new domain's analytics property stayed at exactly zero for days. Not low — zero.&lt;/p&gt;

&lt;p&gt;Here's the part that isn't obvious: browsers deduplicate ES module fetches by URL, per document. A &lt;code&gt;type="module"&lt;/code&gt; script isn't like a classic &lt;code&gt;&amp;lt;script&amp;gt;&lt;/code&gt; tag that each instance executes independently — the module graph is built once per unique specifier and cached. Two tags, same src, means one fetch and one execution, using whichever tag's attributes got resolved first.&lt;/p&gt;

&lt;p&gt;So the second tag's token was never read. All the traffic was still being recorded — just under the OLD analytics property, silently.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// how I actually found it — not by staring at the dashboard,&lt;/span&gt;
&lt;span class="c1"&gt;// but by checking what fired&lt;/span&gt;
&lt;span class="nx"&gt;performance&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;getEntriesByType&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;resource&lt;/span&gt;&lt;span class="dl"&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;filter&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;r&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;r&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;name&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;includes&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;cloudflareinsights&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;span class="c1"&gt;// only ONE beacon.min.js entry, despite two script tags&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The fix was deleting the stale tag. The lesson was: a metric reading exactly zero for longer than plausible is a signal to check the instrumentation, not just the dashboard.&lt;/p&gt;

&lt;p&gt;I ran into this building fundingsignals.net (a small API for SEC funding-filing data) — happy to go deeper on the module-dedup behavior if useful to anyone else debugging analytics gaps.&lt;/p&gt;

</description>
      <category>debugging</category>
      <category>webdev</category>
    </item>
    <item>
      <title>This week in Form D filings: 3 raises, pulled with 4 lines of Python</title>
      <dc:creator>Michalis Solomou</dc:creator>
      <pubDate>Thu, 23 Jul 2026 19:44:08 +0000</pubDate>
      <link>https://dev.to/michalis_solomou_ef4e3025/this-week-in-form-d-filings-3-raises-pulled-with-4-lines-of-python-55b9</link>
      <guid>https://dev.to/michalis_solomou_ef4e3025/this-week-in-form-d-filings-3-raises-pulled-with-4-lines-of-python-55b9</guid>
      <description>&lt;p&gt;A quick one — this week's fresh Form D filings, pulled straight from the public sample endpoint (no API key needed):&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;requests&lt;/span&gt;
&lt;span class="n"&gt;r&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;requests&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;https://fundingsignals.net/v1/sample?limit=3&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;c&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;r&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;json&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt;
    &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;c&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;company_name&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="n"&gt;c&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;amount_usd&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="n"&gt;c&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;score&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;Output today:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Venice AI — $65,030,636 — score 99&lt;/li&gt;
&lt;li&gt;GT Medical Technologies — $50,056,676 — score 97&lt;/li&gt;
&lt;li&gt;Qolab — $44,147,466 — score 92&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;No scraping, no auth wall for the sample. The full feed (with domain + contact enrichment) needs a free key: fundingsignals.net/docs&lt;/p&gt;

&lt;p&gt;Curious what other devs are building on top of Form D data — link your projects below.&lt;/p&gt;

</description>
      <category>python</category>
      <category>api</category>
    </item>
    <item>
      <title>I Built a Free Tool to Search Any Company's SEC Form D Funding History</title>
      <dc:creator>Michalis Solomou</dc:creator>
      <pubDate>Sat, 18 Jul 2026 11:55:43 +0000</pubDate>
      <link>https://dev.to/michalis_solomou_ef4e3025/i-built-a-free-tool-to-search-any-companys-sec-form-d-funding-history-32k1</link>
      <guid>https://dev.to/michalis_solomou_ef4e3025/i-built-a-free-tool-to-search-any-companys-sec-form-d-funding-history-32k1</guid>
      <description>&lt;p&gt;A few weeks ago I wrote about &lt;a href="https://dev.to/michalis_solomou_ef4e3025/form-d-filings-the-funding-data-techcrunch-misses-42bl"&gt;Form D filings as a funding-data source&lt;/a&gt;. The most common question I got back was some version of "cool, but does it cover [my specific company]?"&lt;/p&gt;

&lt;p&gt;So I shipped a small search tool that answers that directly.&lt;/p&gt;

&lt;h2&gt;
  
  
  What it does
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://funding-signals-api.onrender.com/lookup?utm_source=devto&amp;amp;utm_medium=article&amp;amp;utm_campaign=lookup_post" rel="noopener noreferrer"&gt;funding-signals-api.onrender.com/lookup&lt;/a&gt; — type a company name, get every matching Form D filing in the free-tier window: raise size, industry, and a 0-100 lead score. No signup, no API key, just a search box.&lt;/p&gt;

&lt;h2&gt;
  
  
  How it's built
&lt;/h2&gt;

&lt;p&gt;It reuses the same public teaser query the &lt;code&gt;/this-week&lt;/code&gt; and &lt;code&gt;/industry/{slug}&lt;/code&gt; pages already use — a case-insensitive &lt;code&gt;LIKE&lt;/code&gt; match on &lt;code&gt;company_name&lt;/code&gt;, filtered through the same free-tier freshness delay so the public page never leaks real-time data:&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="nd"&gt;@app.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;/lookup&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;include_in_schema&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="bp"&gt;False&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;lookup&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;q&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="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;Query&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="bp"&gt;None&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="n"&gt;conn&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nc"&gt;Depends&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;get_conn&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;HTMLResponse&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="n"&gt;term&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;q&lt;/span&gt; &lt;span class="ow"&gt;or&lt;/span&gt; &lt;span class="sh"&gt;""&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;strip&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="n"&gt;rows&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;_public_teaser_rows&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
        &lt;span class="n"&gt;conn&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 lower(company_name) LIKE ?&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="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;%&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;term&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;lower&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt;%&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,),&lt;/span&gt; &lt;span class="n"&gt;limit&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;25&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;term&lt;/span&gt; &lt;span class="k"&gt;else&lt;/span&gt; &lt;span class="p"&gt;[]&lt;/span&gt;
    &lt;span class="bp"&gt;...&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;code&gt;_public_teaser_rows&lt;/code&gt; pulls a top-500-by-score candidate pool first, then filters by parsed filing date in Python — the underlying &lt;code&gt;filed_at&lt;/code&gt; column mixes &lt;code&gt;YYYYMMDD&lt;/code&gt; (EDGAR) and RFC-822 (RSS-sourced) date formats, so a raw SQL string comparison on dates would silently sort wrong. Same pattern as everywhere else this API does date filtering.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why bother with a search box instead of just the API
&lt;/h2&gt;

&lt;p&gt;Most people evaluating a data API don't want to read docs first — they want to type one company name they actually care about and see if it's there. A search box answers "is this any good" in five seconds; a Swagger page doesn't.&lt;/p&gt;

&lt;p&gt;Free tier, no card: &lt;a href="https://funding-signals-api.onrender.com/docs" rel="noopener noreferrer"&gt;docs&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>python</category>
      <category>api</category>
      <category>opensource</category>
      <category>showdev</category>
    </item>
    <item>
      <title>Form D Filings: The Funding Data TechCrunch Misses</title>
      <dc:creator>Michalis Solomou</dc:creator>
      <pubDate>Fri, 17 Jul 2026 20:45:23 +0000</pubDate>
      <link>https://dev.to/michalis_solomou_ef4e3025/form-d-filings-the-funding-data-techcrunch-misses-42bl</link>
      <guid>https://dev.to/michalis_solomou_ef4e3025/form-d-filings-the-funding-data-techcrunch-misses-42bl</guid>
      <description>&lt;p&gt;Ask most developers where funding data comes from and they'll say "Crunchbase" or "TechCrunch." Neither is actually the source — they're both downstream of a much less glamorous document: the SEC Form D.&lt;/p&gt;

&lt;p&gt;This is a technical walkthrough of what a Form D filing actually contains, why most of them never become a press release, and how to pull the raw structured data yourself in Python.&lt;/p&gt;

&lt;h2&gt;
  
  
  What Form D actually is
&lt;/h2&gt;

&lt;p&gt;Form D is a notice private companies file with the SEC within 15 days of the first sale of securities in an exempt offering — most commonly a Regulation D private placement. It exists so the SEC has a record of who's raising private capital without going through a full public registration.&lt;/p&gt;

&lt;p&gt;It's a legal filing, not a marketing document. Companies file it because they have to, not because they want press. That's exactly why it's a better data source than funding news: it doesn't depend on anyone deciding the round is newsworthy.&lt;/p&gt;

&lt;h2&gt;
  
  
  Where to actually find it
&lt;/h2&gt;

&lt;p&gt;SEC EDGAR publishes every filing at &lt;code&gt;sec.gov/cgi-bin/browse-edgar&lt;/code&gt; and a daily full-text index. A raw Form D filing is XML, and looks roughly like this (trimmed):&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight xml"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;edgarSubmission&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;primaryIssuer&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;entityName&amp;gt;&lt;/span&gt;Acme Robotics, Inc.&lt;span class="nt"&gt;&amp;lt;/entityName&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;jurisdictionOfInc&amp;gt;&lt;/span&gt;DE&lt;span class="nt"&gt;&amp;lt;/jurisdictionOfInc&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;/primaryIssuer&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;offeringData&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;industryGroup&amp;gt;&lt;/span&gt;
      &lt;span class="nt"&gt;&amp;lt;industryGroupType&amp;gt;&lt;/span&gt;Technology&lt;span class="nt"&gt;&amp;lt;/industryGroupType&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;/industryGroup&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;offeringSalesAmounts&amp;gt;&lt;/span&gt;
      &lt;span class="nt"&gt;&amp;lt;totalAmountSold&amp;gt;&lt;/span&gt;12000000&lt;span class="nt"&gt;&amp;lt;/totalAmountSold&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;/offeringSalesAmounts&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;typeOfFiling&amp;gt;&lt;/span&gt;
      &lt;span class="nt"&gt;&amp;lt;newOrAmendment&amp;gt;&lt;/span&gt;New Notice&lt;span class="nt"&gt;&amp;lt;/newOrAmendment&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;/typeOfFiling&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;/offeringData&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/edgarSubmission&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The fields that matter for lead-scoring purposes:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;entityName&lt;/code&gt;&lt;/strong&gt; — the legal company name (not always the brand name — "Acme Robotics, Inc." vs. the product name "AcmeBot")&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;industryGroupType&lt;/code&gt;&lt;/strong&gt; — SEC's own classification, a controlled vocabulary (~30 categories)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;totalAmountSold&lt;/code&gt;&lt;/strong&gt; — how much was actually raised in this offering&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;newOrAmendment&lt;/code&gt;&lt;/strong&gt; — "New Notice" vs. "D/A" (amendment) — this distinction matters more than it looks, see below&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  The two things that make raw Form D data noisy
&lt;/h2&gt;

&lt;p&gt;If you pull the raw daily index and expect a clean list of "companies that just raised," you'll hit two problems immediately.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;1. Amendments look like new filings.&lt;/strong&gt; A company files an initial Form D, then amends it weeks or months later as the offering progresses (more investors close, the total changes). Each amendment is its own filing in the index. Naively counting filings roughly triples your apparent "new raises" — most of what you're counting is the same round being updated, not a new one.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;2. A large fraction of filings aren't operating companies at all.&lt;/strong&gt; VC funds, hedge funds, and special-purpose vehicles (SPVs) file Form D too — they're also raising private capital, just from their own LPs, not customers with a product budget. SEC's own &lt;code&gt;industryGroupType&lt;/code&gt; catches some of these (there's a literal "Pooled Investment Fund" category), but plenty get filed under "Investing" or even "Other" instead. A more reliable tell, if you want to build this filter yourself: fund/SPV legal names very often combine an investment-vehicle noun (&lt;em&gt;Fund&lt;/em&gt;, &lt;em&gt;Partners&lt;/em&gt;, &lt;em&gt;Capital&lt;/em&gt;, &lt;em&gt;Ventures&lt;/em&gt;) with a roman-numeral vintage (&lt;em&gt;II&lt;/em&gt;, &lt;em&gt;III&lt;/em&gt;) — a pattern real operating companies essentially never have. "Acme Ventures III, LP" is a fund. "Acme Robotics, Inc." is not.&lt;/p&gt;

&lt;h2&gt;
  
  
  Pulling it with Python
&lt;/h2&gt;

&lt;p&gt;The full daily index is public and free — no API key needed to fetch it:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;requests&lt;/span&gt;

&lt;span class="c1"&gt;# SEC requires a descriptive User-Agent identifying your app/contact —
# generic or missing UAs get blocked.
&lt;/span&gt;&lt;span class="n"&gt;headers&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;User-Agent&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;YourApp research@yourdomain.com&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="n"&gt;resp&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;requests&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;https://www.sec.gov/cgi-bin/browse-edgar&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;params&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;action&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;getcompany&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;type&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;D&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;dateb&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="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;owner&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;include&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;count&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;40&lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;
    &lt;span class="n"&gt;headers&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;headers&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;In practice you'll want the daily full-text index rather than scraping the browse UI — it's more reliable for a scheduled job. Either way, once you have a batch of filings you still need to: parse the XML, drop amendments, filter funds/SPVs by industry + name pattern, and turn &lt;code&gt;totalAmountSold&lt;/code&gt; + filing recency into something you can actually rank leads by.&lt;/p&gt;

&lt;h2&gt;
  
  
  Skipping the parsing
&lt;/h2&gt;

&lt;p&gt;That pipeline (fetch → parse → dedupe → fund-filter → score) is exactly what &lt;a href="https://funding-signals-api.onrender.com/?utm_source=devto&amp;amp;utm_medium=article&amp;amp;utm_campaign=tutorial3" rel="noopener noreferrer"&gt;Funding Signals&lt;/a&gt; does — it runs daily and exposes the result as a scored REST endpoint:&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;requests&lt;/span&gt;

&lt;span class="n"&gt;resp&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;requests&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;https://funding-signals-api.onrender.com/v1/sample?limit=5&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;company&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;resp&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;json&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt;
    &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;company&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;score&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="si"&gt;:&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt;  &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;company&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;company_name&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="si"&gt;:&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="mi"&gt;28&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt; &lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
          &lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;$&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;company&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;amount_usd&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="si"&gt;:&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt;  (&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;company&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;industry&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt;)&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;No XML parsing, no amendment/fund filtering to write yourself — same underlying SEC data, already cleaned up. Free tier, no card required: &lt;a href="https://funding-signals-api.onrender.com/docs" rel="noopener noreferrer"&gt;docs&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why this matters more than "another funding API"
&lt;/h2&gt;

&lt;p&gt;The reason Form D is worth building on directly, instead of just consuming a funding-news aggregator: &lt;strong&gt;most Form D filings never get press coverage at all.&lt;/strong&gt; Smaller rounds, non-VC-backed companies, and anything outside the SF/NY startup press cycle mostly go unreported. If your data only comes from funding news, you're seeing a minority of actual raises — and competing with everyone else reading the same newsletter for the ones you do see.&lt;/p&gt;

&lt;p&gt;Reading the primary filing means seeing the raise the day (or days) it becomes public record, whether or not anyone ever writes about it.&lt;/p&gt;

</description>
      <category>python</category>
      <category>api</category>
      <category>opensource</category>
      <category>business</category>
    </item>
    <item>
      <title>Build a Slack Bot That Pings You the Moment a Prospect Raises Funding</title>
      <dc:creator>Michalis Solomou</dc:creator>
      <pubDate>Fri, 17 Jul 2026 20:41:15 +0000</pubDate>
      <link>https://dev.to/michalis_solomou_ef4e3025/build-a-slack-bot-that-pings-you-the-moment-a-prospect-raises-funding-2aif</link>
      <guid>https://dev.to/michalis_solomou_ef4e3025/build-a-slack-bot-that-pings-you-the-moment-a-prospect-raises-funding-2aif</guid>
      <description>&lt;p&gt;The first thing most SDRs do with a funding alert is... nothing, because it&lt;br&gt;
lands in an email digest three weeks after the fact and 40 other companies&lt;br&gt;
in that digest already got pitched by five other vendors.&lt;/p&gt;

&lt;p&gt;This is a ~40 line Python script that checks for new funding signals every&lt;br&gt;
morning and posts the ones that match your ICP straight into a Slack&lt;br&gt;
channel — so the "just raised money" alert actually arrives while it's&lt;br&gt;
still useful.&lt;/p&gt;
&lt;h2&gt;
  
  
  What you need
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;A free &lt;a href="https://funding-signals-api.onrender.com/?utm_source=devto&amp;amp;utm_medium=article&amp;amp;utm_campaign=tutorial2#pricing" rel="noopener noreferrer"&gt;Funding Signals&lt;/a&gt;
API key (self-serve, no card).&lt;/li&gt;
&lt;li&gt;A Slack &lt;strong&gt;Incoming Webhook&lt;/strong&gt; URL for the channel you want alerts in
(Slack → your workspace → Apps → search "Incoming Webhooks" → Add to
Slack → pick a channel → copy the webhook URL).&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;requests&lt;/code&gt; installed (&lt;code&gt;pip install requests&lt;/code&gt;).&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;
  
  
  The script
&lt;/h2&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;requests&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;os&lt;/span&gt;

&lt;span class="n"&gt;FS_API_KEY&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;os&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;environ&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;FUNDING_SIGNALS_KEY&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="n"&gt;SLACK_WEBHOOK&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;os&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;environ&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;SLACK_WEBHOOK_URL&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;

&lt;span class="c1"&gt;# tune this to your ICP
&lt;/span&gt;&lt;span class="n"&gt;PARAMS&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;min_score&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;80&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;min_raise&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;3_000_000&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;industry&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;technology&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;has_contact&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;true&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;limit&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;fetch_signals&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt;
    &lt;span class="n"&gt;resp&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;requests&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;https://funding-signals-api.onrender.com/v1/signals&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="n"&gt;headers&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;X-API-Key&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;FS_API_KEY&lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;
        &lt;span class="n"&gt;params&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;PARAMS&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;resp&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;raise_for_status&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;resp&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;json&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;

&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;post_to_slack&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;signal&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="n"&gt;text&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;
        &lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;*&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;signal&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;company_name&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt;* just raised &lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
        &lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;$&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;signal&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;amount_usd&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="si"&gt;:&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt; (&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;signal&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;industry&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt;) — score &lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
        &lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;signal&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;score&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt;/100&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
        &lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;&amp;lt;https://funding-signals-api.onrender.com/v1/signals/&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;signal&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;id&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt;/lead&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
        &lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;?utm_source=slackbot|View enriched lead&amp;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;requests&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;post&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;SLACK_WEBHOOK&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;json&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;text&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;text&lt;/span&gt;&lt;span class="p"&gt;})&lt;/span&gt;

&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;main&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;signal&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="nf"&gt;fetch_signals&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt;
        &lt;span class="nf"&gt;post_to_slack&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;signal&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;__name__&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;__main__&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="nf"&gt;main&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;Set the two environment variables and run it once to sanity-check the&lt;br&gt;
output, then point it at a scheduler.&lt;/p&gt;
&lt;h2&gt;
  
  
  Making it run daily
&lt;/h2&gt;

&lt;p&gt;Simplest option: a GitHub Actions workflow in the same repo as the script&lt;br&gt;
(no server to babysit).&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="c1"&gt;# .github/workflows/funding-alerts.yml&lt;/span&gt;
&lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;funding-alerts&lt;/span&gt;
&lt;span class="na"&gt;on&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;schedule&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;cron&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;0&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;13&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;*&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;*&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;1-5"&lt;/span&gt;  &lt;span class="c1"&gt;# 9am ET, weekdays&lt;/span&gt;
  &lt;span class="na"&gt;workflow_dispatch&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;{}&lt;/span&gt;

&lt;span class="na"&gt;jobs&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;alert&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;runs-on&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;ubuntu-latest&lt;/span&gt;
    &lt;span class="na"&gt;steps&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;uses: actions/checkout@v4      - uses: actions/setup-python@v5        with&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
          &lt;span class="na"&gt;python-version&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;3.12"&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;run&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;pip install requests&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;run&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;python alert.py&lt;/span&gt;
        &lt;span class="na"&gt;env&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
          &lt;span class="na"&gt;FUNDING_SIGNALS_KEY&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;${{ secrets.FUNDING_SIGNALS_KEY }}&lt;/span&gt;
          &lt;span class="na"&gt;SLACK_WEBHOOK_URL&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;${{ secrets.SLACK_WEBHOOK_URL }}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Add the two secrets in the repo's Settings → Secrets → Actions, and that's&lt;br&gt;
the whole pipeline: SEC filing → scored signal → Slack message, with no&lt;br&gt;
server and no cron box to maintain.&lt;/p&gt;
&lt;h2&gt;
  
  
  Avoiding duplicate alerts
&lt;/h2&gt;

&lt;p&gt;The API doesn't track what you've already seen, so on a fresh run every&lt;br&gt;
signal in the current window will post again. Cheapest fix: keep a small&lt;br&gt;
JSON file of seen IDs, commit it back after each run.&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;json&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;pathlib&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;Path&lt;/span&gt;

&lt;span class="n"&gt;SEEN_FILE&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;Path&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;seen_ids.json&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;load_seen&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;SEEN_FILE&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;exists&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nf"&gt;set&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;json&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;loads&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;SEEN_FILE&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;read_text&lt;/span&gt;&lt;span class="p"&gt;()))&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nf"&gt;set&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;

&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;save_seen&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ids&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="n"&gt;SEEN_FILE&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;write_text&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;json&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;dumps&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;sorted&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ids&lt;/span&gt;&lt;span class="p"&gt;)))&lt;/span&gt;

&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;main&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt;
    &lt;span class="n"&gt;seen&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;load_seen&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="n"&gt;signals&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;fetch_signals&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="n"&gt;new&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;s&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;s&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;signals&lt;/span&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;s&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;id&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="ow"&gt;not&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;seen&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;signal&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;new&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="nf"&gt;post_to_slack&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;signal&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="nf"&gt;save_seen&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;seen&lt;/span&gt; &lt;span class="o"&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="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;id&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;s&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;new&lt;/span&gt;&lt;span class="p"&gt;})&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;If you're running this in GitHub Actions, add a commit-and-push step at the&lt;br&gt;
end of the job so &lt;code&gt;seen_ids.json&lt;/code&gt; persists between runs.&lt;/p&gt;

&lt;h2&gt;
  
  
  Where to take it from here
&lt;/h2&gt;

&lt;p&gt;Same pattern works for a Discord webhook, a CRM sync (dump straight into&lt;br&gt;
HubSpot/Airtable instead of Slack), or per-rep channels filtered by&lt;br&gt;
industry. The API call is the same either way — only &lt;code&gt;post_to_slack&lt;/code&gt;&lt;br&gt;
changes.&lt;/p&gt;

&lt;p&gt;Docs: &lt;a href="https://funding-signals-api.onrender.com/docs" rel="noopener noreferrer"&gt;funding-signals-api.onrender.com/docs&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Prefer no code at all? Grab the &lt;a href="https://docs.google.com/spreadsheets/d/13RdbMohTX8DlR3-R6NmhZGhdkBxCDmT4KMTNIybwO14/copy" rel="noopener noreferrer"&gt;free lead tracker template&lt;/a&gt; instead.&lt;/p&gt;

</description>
      <category>python</category>
      <category>api</category>
      <category>slack</category>
      <category>sales</category>
    </item>
  </channel>
</rss>
