If you sell to startups, invest in them or recruit for them, timing matters. A company that has just closed a round has fresh budget, new hiring plans and a board asking how the money will be spent. The hard part is knowing who raised, and knowing it soon.
Press releases cover a small share of rounds. Paid funding databases cover more, but they cost a lot and often lag behind. There is a free, official source most teams overlook: SEC Form D.
This tutorial shows how to turn Form D filings into a daily list of newly funded US companies, filtered by state, industry and size, using the Form D Scraper on the Apify Store.
What Form D is
When a US company sells securities privately under Regulation D (the exemption most startup rounds use), it files a short notice with the Securities and Exchange Commission called Form D. The filing is due within 15 days after the first sale of securities. Amendments are filed as Form D/A, for example when an offering runs longer than a year or its details change.
Each filing is public on EDGAR, the SEC's filing system, and includes:
- the company name and business address
- industry group (for example Biotechnology or Other Technology)
- the total offering amount, the amount already sold and the amount remaining
- the date of first sale
- the type of security (equity, debt, options, SAFEs described in a free text field)
- the exemption claimed, such as Rule 506(b)
- the number of investors so far
The catch is format. EDGAR shows one filing at a time, and the useful fields sit inside XML. The Actor reads EDGAR full-text search and the daily index, opens each filing and returns one tidy row per filing with the same columns every time.
The tool is independent and is not affiliated with or endorsed by the SEC.
Step 1: Run it once in the Apify Console
Open the Actor's Store page (link at the end), click to try it, and you will see the input form. The fields that matter for a startup prospect list:
- Days back: how many calendar days of filings to fetch. Default 3.
- Form types: D and D/A by default. You can add 8-K and 8-K/A if you also want trigger events from listed companies.
- US states: two-letter codes for the business address, such as CA, NY, TX. Empty means all.
- Industry groups: words to match, such as Technology or Health Care.
- Exclude pooled investment funds: switch this on. A large share of Form D filings come from hedge funds, venture funds and other fund vehicles. Excluding them leaves operating companies.
- Minimum offering amount: for example 1000000 to skip very small raises.
- Max records: a cap on saved filings. Each saved filing is one billable event.
-
SEC User-Agent: put your company name and a contact email here, for example
Acme Growth Ltd sales-ops@acme.com. The SEC fair access policy asks every automated client to identify itself.
Click Start. A default run of 50 records takes roughly 15 seconds. You can download the results as CSV, Excel or JSON from the Output tab, which has ready-made views for Fundraises, Trigger events and Company contacts.
Step 2: Schedule it daily with onlyNew
A one-off list goes stale fast. The useful version is a list that arrives every morning with only the companies you have not seen yet.
- Switch on Only new since last run (
onlyNew). The Actor then remembers the accession number (the SEC's unique filing ID) of every filing it delivers, in a named key-value store in your Apify account. Later runs skip those filings, and you are only charged for new ones. - Keep Days back at 3. The overlap with earlier runs is deliberate: late filings and weekend gaps are still caught, and nothing is delivered twice.
- Set Max records high enough for a full day of new filings, for example 1000. It counts new records only.
- Save the input as a task, then go to Schedules, create a schedule with cron
0 7 * * 1-5and timezoneAmerica/New_York, and add the task.
One detail worth knowing: the memory is tied to your filters (form types, states, industries, minimum amount, fund exclusion, 8-K items). If you change a filter you get a fresh memory. If you want to name it yourself, set State store name.
Step 3: Pull the data with Python
If you would rather work from code, the official apify-client package can start the run and read the results. Install it with pip install apify-client and copy your API token from the Integrations section of the Console.
import csv
import os
from apify_client import ApifyClient
client = ApifyClient(os.environ["APIFY_TOKEN"])
run_input = {
"daysBack": 3,
"formTypes": ["D"],
"states": ["CA", "NY", "TX", "MA"],
"industryGroups": ["Technology", "Health Care"],
"excludePooledInvestmentFunds": True,
"minOfferingAmount": 1_000_000,
"maxItems": 1000,
"onlyNew": True,
"userAgent": "Acme Growth Ltd sales-ops@acme.com",
}
# Starts the run and waits for it to finish. Caps spend at $5 for this run.
run = client.actor("agents001/form-d-funding-feed").call(
run_input=run_input,
max_total_charge_usd=5,
)
if run is None:
raise SystemExit("Run failed to start or finish")
fields = [
"companyName", "state", "industryGroup", "totalOfferingAmount",
"totalAmountSold", "dateOfFirstSale", "filingDate", "filingUrl",
]
with open("new_raises.csv", "w", newline="") as f:
writer = csv.DictWriter(f, fieldnames=fields, extrasaction="ignore")
writer.writeheader()
for item in client.dataset(run.default_dataset_id).iterate_items():
writer.writerow(item)
sold = item.get("totalAmountSold") or 0
print(f"{item['companyName']} ({item['state']}): ${sold:,.0f} sold so far")
call() returns None if the run fails, so the check matters. iterate_items() pages through the dataset for you.
What the output looks like
Here is one Form D record from a sample run, trimmed to the most useful fields. The full record also has the business address and company phone as filed.
{
"recordType": "fundraise",
"formType": "D",
"isAmendment": false,
"companyName": "Alercell Inc",
"filingDate": "2026-10-19",
"state": "MT",
"industryGroup": "Biotechnology",
"industrySector": "Health Care",
"revenueRange": "No Revenues",
"totalOfferingAmount": 1500000,
"totalAmountSold": 35000,
"totalRemaining": 1465000,
"dateOfFirstSale": "2026-10-12",
"securitiesOffered": ["Equity"],
"federalExemptionLabels": ["Rule 506(b)"],
"totalInvestors": 3,
"filingUrl": "https://www.sec.gov/Archives/edgar/data/2160842/000216084226000001/0002160842-26-000001-index.htm"
}
A few fields worth understanding:
-
totalOfferingAmountis what the company plans to raise in this offering. It isnullwithofferingAmountIndefinite: truewhen the issuer filed the amount as Indefinite, which is common for funds. -
totalAmountSoldagainsttotalRemainingtells you whether the round is mostly closed or still open. -
isAmendmentandformType: "D/A"mark amendments. An amendment can show a round that has grown. - Executive and director names are off by default. There is a switch to include them, which you should only use if you have a lawful basis to process that personal data.
What it costs
The Actor uses pay-per-event pricing: $6 per 1,000 filings saved, which is $0.006 per filing. Filings your filters drop are not charged.
Two example budgets, based on that price:
- A filtered feed (a few states, technology and health care, funds excluded, $1M minimum) that returns 40 new filings a day costs $0.24 a day, or about $5 over 21 working days.
- An unfiltered feed of every new Form D, which the README puts at a few hundred records on a typical day, would be around $1.80 a day at 300 records.
You can set a maximum total charge on each run, and the Actor stops cleanly when it reaches it. Check the Store page for current pricing before you budget.
What to do with the data
-
CRM: push new rows into HubSpot or another CRM through Zapier, Make or a webhook. Use
accessionNumberas the unique key so you never create duplicates. - Google Sheets: connect the task's dataset to a sheet with the Apify Google Sheets integration and give your team a shared morning list.
-
Slack alerts: post each new filing above a size threshold to a channel, with the
filingUrlso anyone can check the source. - Market tracking: run a longer date range (Start date and End date go back to 2009) and count raises by industry, state and size over time.
Limitations
- Form D is a notice filed after money starts coming in, up to 15 days after the first sale, so you will rarely be first to hear about a round that was announced publicly.
- Some companies file late, and some raise without filing Form D at all. Treat the feed as a strong source with gaps.
- Form D does not list investors or valuations.
- The address and phone are what the company filed. They can be out of date or belong to an office the team rarely uses.
- There are no filings on weekends or US federal holidays.
- US issuers only. Contact details are company level, with no personal emails.
Top comments (0)