Disclosure: I'm Ben, and I built the Apify Actor mentioned later in this post. I charge per result for it. Everything in the tutorial part works with free tools too.
"Recently funded companies" lists are a staple of B2B sales, recruiting and investing. A lot of them trace back to one public source: SEC Form D.
When a US company raises money in a private placement under Regulation D, it has to file a Form D with the SEC within 15 days of the first sale. That makes it one of the earliest public signals of a raise, often before any press release. And the filing itself is structured XML with the company's address, business phone, industry, amount offered, amount sold so far and the names of its executives and directors.
Here's how to get it yourself.
Rule zero: SEC's fair-access policy
EDGAR is free and needs no key, but the SEC asks every automated client to:
- send a User-Agent that identifies you with a contact email (unidentified traffic can be blocked), and
- stay under 10 requests per second.
Do both from the very first request. It's polite, and it's the difference between working code and a 403.
Step 1: Find recent Form D filings and parse them
EDGAR full-text search (the same backend as the search box on sec.gov) can filter by form type and date. Each hit points to the filing's primary_doc.xml, which is the Form D itself. This script ran as-is on 25 Oct 2026:
import time, requests, xml.etree.ElementTree as ET
H = {"User-Agent": "Ben Barazandeh ben.barazandeh@gmail.com"} # SEC fair access: identify yourself
# 1) Find recent Form D filings via EDGAR full-text search
hits = requests.get("https://efts.sec.gov/LATEST/search-index",
params={"forms": "D", "dateRange": "custom", "startdt": "2026-10-19", "enddt": "2026-10-23"},
headers=H, timeout=30).json()["hits"]["hits"]
for h in hits[:3]:
acc, doc = h["_id"].split(":")
cik = h["_source"]["ciks"][0].lstrip("0")
url = f"https://www.sec.gov/Archives/edgar/data/{cik}/{acc.replace('-', '')}/{doc}"
x = ET.fromstring(requests.get(url, headers=H, timeout=30).content)
print(x.findtext(".//primaryIssuer/entityName"),
x.findtext(".//primaryIssuer/issuerPhoneNumber"),
x.findtext(".//industryGroup/industryGroupType"),
x.findtext(".//offeringSalesAmounts/totalOfferingAmount"),
x.findtext(".//offeringSalesAmounts/totalAmountSold"))
time.sleep(0.2) # stay far below SEC's 10 requests/second
(Use your own name and email in the User-Agent.) Output:
Opus Databento CS LLC 9176692797 Other Technology 4000000 4000000
Five Winds Income Fund LLC 7758136887 Other 40000000 0
Advanced Glass Holdings, Inc. 847-906-5300 Other 2000000 2000000
The search reported 1,269 Form D hits for that Monday-to-Friday window.
Step 2: The pitfalls
That output already shows several of them:
- Not every filer is a startup. Many Form Ds come from investment funds and single-property real-estate LLCs. The usual first cut is to drop industry group "Pooled Investment Fund". It isn't perfect: "Five Winds Income Fund LLC" above reports its industry as "Other", so it would slip through that filter. Expect to eyeball names too.
-
Amounts aren't always numbers.
totalOfferingAmountcan be the wordIndefinite. Amount sold can be 0 on a fresh filing, so "offering" isn't "raised". -
Amendments.
D/Afilings repeat earlier raises. Decide whether you want them. -
Messy phones.
9176692797vs847-906-5300. Normalise before you load a CRM. - Filtering means parsing everything. Full-text search can't filter by industry or amount, so to get "tech companies that raised $250K+" you have to download and parse every Form D in the window. That's roughly 300–500 per business day.
- Related persons are a list. Executives, directors and promoters each have roles and sometimes a clarification. Flattening them sensibly takes some care.
Step 3: Or use the packaged version
I packaged this as an Apify Actor, SEC EDGAR Scraper – Form D Funding Leads. It sends a descriptive User-Agent with a contact email, stays within SEC's rate limits and retries with backoff on throttling. Pooled investment funds are excluded by default.
{ "mode": "formD", "filedWithinDays": 7,
"industryGroups": ["Technology", "Biotechnology", "Health Care"],
"minAmountSold": 250000, "maxItems": 200 }
Every lead is the whole Form D, flattened: entity type, state and year of incorporation, address, phone, industry group, revenue range, exemptions (506(b)/506(c)/504), date of first sale, securities offered, minimum investment, offering/sold/remaining amounts, investor counts, sales commissions and finders' fees, related persons with roles, and links to EDGAR.
A real run on 18 Oct 2026 (filed in the last 7 days, max 25, funds excluded) saved 20 leads in 24 seconds. A few rows:
| Company | Industry | Offering | Sold so far | City |
|---|---|---|---|---|
| Knowable Labs, Inc. | Other Technology | $310K | $310K | Saratoga, CA |
| Lamina Surgical, Inc. | Other Health Care | $5M | $490K | Oakland, CA |
| StrikeArc Labs Inc. | Other | $500K | $500K | Birmingham, MI |
| Eden X LLC | Other Real Estate | $25M | $0 | Lexington, KY |
There's also a second mode, filings search: EDGAR full-text search across any form type (8-K, 10-K, S-1, Form 4, 13D…), with 8-K item codes translated to plain English. For example, 8-K "material cybersecurity incident" disclosures in the last 30 days:
{ "mode": "filings", "forms": ["8-K"], "query": "\"material cybersecurity incident\"", "filedWithinDays": 30 }
For a daily feed, schedule it with filedWithinDays: 1 (or 2) and send rows to Sheets, a CRM or Slack.
Limits, honestly
- Form D isn't every raise. Companies that raise under other exemptions, or that file late or not at all, won't appear.
- The fund filter is a first cut. Pooled funds are excluded by industry group, but funds and real-estate LLCs that report another industry (like "Other") still get through. My sample above includes a $25M real-estate LLC.
- No emails. Form D has a business phone and named people, not email addresses.
- Industry groups are coarse. "Other Technology" covers a lot. Pair it with a keyword or a quick look at the website.
- Industry or amount filters are slower. Every Form D in the window has to be parsed, so expect roughly a minute per day of filings.
- US filers only, and not affiliated with the SEC.
What it costs
- $0.005 per Form D lead ($5 per 1,000), fully parsed
- $0.002 per filing in filings-search mode ($2 per 1,000)
No start fee. Filtered-out filings are free, and runs stop at your "maximum cost per run". The 20-lead test above was 10 cents in lead charges. Cheaper Form D Actors exist on the Store; I chose to parse the whole form and add the full-text mode. The DIY script above costs nothing.
Play fair
The people named in a Form D are real people. Cold outreach is covered by CAN-SPAM, TCPA and, for EU/UK contacts, GDPR. Keep it relevant, and honour opt-outs.
What would you add to a Form D lead: a website lookup, a funding-round guess, or something else? Tell me in the comments.
Top comments (0)