# SEC Form D Scraper: Private Placements and Startup Funding (`nightwave-owner/sec-form-d`) Actor

Returns new SEC Form D filings (private placements and exempt offerings under Regulation D) with issuer, industry, offering amount, amount sold, minimum investment, first sale date and exemptions, one row per filing. Issuer data only, no personal names. Supports onlyNew for daily monitoring.

- **URL**: https://apify.com/nightwave-owner/sec-form-d.md
- **Developed by:** [Viktor Wiberg](https://apify.com/nightwave-owner) (community)
- **Categories:** Lead generation, Business
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

$5.00 / 1,000 filings

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.

Learn more: https://docs.apify.com/actors/running/actors-in-store.md#pay-per-event

## What's an Apify Actor?

An Actor is a serverless cloud program that runs on the Apify platform. It has two run modes.
In Batch mode, an Actor accepts a well-defined JSON input, performs an action which can take anything from a few seconds to a few hours,
and optionally produces a well-defined JSON output, datasets with results, or files in key-value store.
In Standby mode, an Actor provides a web server which can be used as a website, API, or an MCP server.

Apify vocabulary and the platform model are defined once, in the agent quickstart at https://apify.com/agents.md.

## How to integrate an Actor?

If asked about integration, you help developers integrate Actors into their projects.
You adapt to their stack and deliver integrations that are safe, well-documented, and production-ready.

Do not guess an integration path. Every one of them is in the agent quickstart at https://apify.com/agents.md: the Apify MCP server, Agent Skills with the Apify CLI, the JavaScript and Python clients, the REST API, and the account-free path for an agent with no human to sign in. It also carries the rule on stating cost before the first paid run.

For examples already wired to this Actor's own input schema, see the [API](#api) section below.

Each client library has reference documentation the quickstart does not restate: [JavaScript/TypeScript](https://docs.apify.com/api/client/js/docs.md) (`npm install apify-client`) and [Python](https://docs.apify.com/api/client/python/docs.md) (`pip install apify-client`).

# README

## SEC Form D Scraper: Private Placements and Startup Funding

New Form D filings from SEC EDGAR, one row per filing. A Form D is the notice a company or fund files with the U.S. Securities and Exchange Commission within 15 days after it first sells securities in a private placement under Regulation D. It shows who is raising money, in which industry and state, how much the offering is, how much has been sold so far, the minimum investment and which exemption it relies on.

Use it to find startups and funds that have just raised capital, to follow private placements in one industry or state, or to feed a CRM with fresh funding events every morning. The actor returns issuer data only: the names and addresses of directors, officers, promoters and sales agents that Form D also lists are never read or stored.

### What is covered

Every Form D and Form D/A (amendment) filed on EDGAR. The actor reads the official EDGAR daily form index for each business day in the date range, picks the Form D lines and parses the structured `primary_doc.xml` of each filing. On a normal business day that is 250 to 400 filings, and most are pooled investment funds (venture capital, private equity, hedge and real estate funds), followed by technology, real estate and health care companies.

- Date range up to 92 days per run. The default is the last 7 days.
- Filters: industry group, issuer state and minimum offering amount. Filters are applied after each filing is parsed, so a narrow filter over a long range reads more filings and takes longer, but you are only charged for the rows you get.
- Newest day first. Within a day, filings come in the order of the EDGAR index (form type, then issuer name).

### Example from a real run

This is the input and the first two rows of a run on the Apify platform on 3 October 2026 (run `1Vr5OlTQbKsnT4ZAt`, 20 rows in total). Nothing is edited except that only the first rows are shown.

Input:

```json
{
  "dateFrom": "2026-09-28",
  "dateTo": "2026-10-02",
  "industryGroups": ["Biotechnology", "Other Technology"],
  "minAmount": 1000000,
  "maxResults": 20
}
```

Output (excerpt):

```json
[
  {
    "issuerName": "Altay Therapeutics, Inc.",
    "cik": "2157551",
    "filedAt": "2026-10-02",
    "formType": "D",
    "isAmendment": false,
    "previousAccessionNumber": null,
    "industryGroup": "Biotechnology",
    "investmentFundType": null,
    "entityType": "Corporation",
    "jurisdictionOfIncorporation": "DELAWARE",
    "yearOfIncorporation": null,
    "city": "SAN CARLOS",
    "state": "CA",
    "stateOrCountryDescription": "CALIFORNIA",
    "revenueRange": "Decline to Disclose",
    "totalOfferingAmount": 45067885,
    "offeringAmountIndefinite": false,
    "totalAmountSold": 15738155,
    "totalRemaining": 29329730,
    "minimumInvestment": 0,
    "dateOfFirstSale": "2026-09-17",
    "firstSaleYetToOccur": false,
    "moreThanOneYear": true,
    "exemptions": [
      "06b"
    ],
    "exemptionDescriptions": [
      "Rule 506(b)"
    ],
    "securityTypes": [
      "Equity"
    ],
    "isBusinessCombination": false,
    "hasNonAccreditedInvestors": false,
    "totalNumberAlreadyInvested": 19,
    "accessionNumber": "0002157551-26-000001",
    "url": "https://www.sec.gov/Archives/edgar/data/2157551/000215755126000001/0002157551-26-000001-index.htm",
    "xmlUrl": "https://www.sec.gov/Archives/edgar/data/2157551/000215755126000001/primary_doc.xml",
    "source": "SEC EDGAR Form D, U.S. Securities and Exchange Commission",
    "license": "Public information, U.S. federal government (sec.gov/privacy: may be copied or further distributed)"
  },
  {
    "issuerName": "CAD Therapeutics, Inc.",
    "cik": "2157566",
    "filedAt": "2026-10-02",
    "formType": "D",
    "isAmendment": false,
    "previousAccessionNumber": null,
    "industryGroup": "Biotechnology",
    "investmentFundType": null,
    "entityType": "Corporation",
    "jurisdictionOfIncorporation": "DELAWARE",
    "yearOfIncorporation": null,
    "city": "NEW YORK",
    "state": "NY",
    "stateOrCountryDescription": "NEW YORK",
    "revenueRange": "No Revenues",
    "totalOfferingAmount": 10000000,
    "offeringAmountIndefinite": false,
    "totalAmountSold": 4000000,
    "totalRemaining": 6000000,
    "minimumInvestment": 0,
    "dateOfFirstSale": "2026-09-17",
    "firstSaleYetToOccur": false,
    "moreThanOneYear": false,
    "exemptions": [
      "06b"
    ],
    "exemptionDescriptions": [
      "Rule 506(b)"
    ],
    "securityTypes": [
      "Equity",
      "Other"
    ],
    "isBusinessCombination": false,
    "hasNonAccreditedInvestors": false,
    "totalNumberAlreadyInvested": 2,
    "accessionNumber": "0002157566-26-000001",
    "url": "https://www.sec.gov/Archives/edgar/data/2157566/000215756626000001/0002157566-26-000001-index.htm",
    "xmlUrl": "https://www.sec.gov/Archives/edgar/data/2157566/000215756626000001/primary_doc.xml",
    "source": "SEC EDGAR Form D, U.S. Securities and Exchange Commission",
    "license": "Public information, U.S. federal government (sec.gov/privacy: may be copied or further distributed)"
  }
]
```

The other 18 rows of the run were technology and biotech offerings from 1 million to 220 million USD filed on 1 and 2 October 2026, two of them amendments (D/A).

### Input

| Field | Type | Default | Description |
|---|---|---|---|
| `dateFrom` | string | 6 days before `dateTo` | First filing date, `YYYY-MM-DD`. |
| `dateTo` | string | today (New York time) | Last filing date (inclusive). At most 92 days after `dateFrom`. |
| `industryGroups` | array | all | Form D industry groups, for example `["Other Technology", "Biotechnology"]`. Funds are `Pooled Investment Fund`. |
| `states` | array | all | Two-letter codes of the issuer's principal place of business, for example `["CA", "NY"]`. SEC codes for other countries also work, for example `A6` (Ontario, Canada) or `X0` (United Kingdom). |
| `minAmount` | integer | `0` | Only offerings of at least this many USD. For an "Indefinite" offering amount the amount sold is compared instead. |
| `includeAmendments` | boolean | `true` | Also return Form D/A. Set to `false` for new offerings only. |
| `maxResults` | integer | `50` | Maximum number of filings per run. 1 to 10 000. |
| `onlyNew` | boolean | `false` | Return only filings that earlier runs with the same input did not deliver. See "Monitoring and scheduling". |

A run with empty input returns the 50 newest Form D filings of the last 7 days in well under a minute (8 seconds of run time in a test on 3 October 2026).

The industry groups are the ones on the form itself: Agriculture; Commercial Banking, Insurance, Investing, Investment Banking, Pooled Investment Fund, Other Banking and Financial Services; Business Services; Coal Mining, Electric Utilities, Energy Conservation, Environmental Services, Oil and Gas, Other Energy; Biotechnology, Health Insurance, Hospitals and Physicians, Pharmaceuticals, Other Health Care; Manufacturing; Commercial, Construction, REITS and Finance, Residential, Other Real Estate; Retailing; Restaurants; Computers, Telecommunications, Other Technology; Airlines and Airports, Lodging and Conventions, Tourism and Travel Services, Other Travel; Other.

### Output

| Field | Description |
|---|---|
| `issuerName` | Name of the issuer (company or fund) |
| `cik` | Central Index Key of the issuer, without leading zeros |
| `filedAt` | Date the filing was made, `YYYY-MM-DD` |
| `formType` | `D` for a new notice, `D/A` for an amendment |
| `isAmendment`, `previousAccessionNumber` | Whether the filing amends an earlier one, and which |
| `industryGroup` | Industry group from item 4, for example `Other Technology` |
| `investmentFundType` | For funds: `Venture Capital Fund`, `Private Equity Fund`, `Hedge Fund` or `Other Investment Fund` |
| `entityType` | Corporation, Limited Liability Company, Limited Partnership and so on |
| `jurisdictionOfIncorporation`, `yearOfIncorporation` | Where and when the issuer was formed (the year only when within five years) |
| `city`, `state`, `stateOrCountryDescription` | Principal place of business. Street address and phone number are left out |
| `revenueRange` | Revenue range from item 5, often `Decline to Disclose`. Funds give the net asset value range |
| `totalOfferingAmount` | Total offering amount in USD. `null` when the filer wrote "Indefinite" |
| `offeringAmountIndefinite` | `true` when the offering amount is "Indefinite" |
| `totalAmountSold`, `totalRemaining` | Amount sold so far and amount remaining, in USD |
| `minimumInvestment` | Minimum investment accepted from an outside investor, in USD |
| `dateOfFirstSale`, `firstSaleYetToOccur` | Date of the first sale, or `true` when it has not happened yet |
| `moreThanOneYear` | Whether the offering is expected to last more than one year |
| `exemptions`, `exemptionDescriptions` | Item 6 codes and their meaning, for example `06b` (Rule 506(b)), `06c` (Rule 506(c)), `3C.1` (Investment Company Act Section 3(c)(1)) |
| `securityTypes` | Types of securities offered, for example `Equity`, `Debt`, `Pooled investment fund interests` |
| `isBusinessCombination` | Whether the offering is part of a merger or acquisition |
| `hasNonAccreditedInvestors`, `totalNumberAlreadyInvested` | Investor information from item 14 |
| `accessionNumber` | Unique id of the filing |
| `url` | Filing index on sec.gov |
| `xmlUrl` | The structured Form D (`primary_doc.xml`) on sec.gov |
| `source`, `license` | Attribution for the data |

### Monitoring and scheduling

Set `onlyNew` to `true` to use the actor as a daily funding feed. The actor then remembers which filings it has delivered for the same input, in a named key-value store in your Apify account (`nightwave-state-sec-form-d`, one record per input). Each run returns and charges only filings that earlier runs did not deliver. Filings that were read but did not match your filters are remembered too, so later runs do not download them again. The first run returns everything in the selection. A run without news finishes successfully with 0 rows.

`onlyNew` and `maxResults` are not part of the remembered input, so you can change them without starting over. Changing any other field starts a fresh state. To start over with the same input, delete the record in the key-value store.

EDGAR publishes the daily index after the business day has ended in New York, so a run in the European morning gets the previous business day. Example: a run at 07:00 Swedish time Tuesday to Saturday that returns new technology and biotech raises of at least 1 million USD. In Apify Console, open **Schedules**, create a schedule with the cron expression `0 7 * * 2-6` and add this actor with the input below.

```json
{
  "industryGroups": ["Other Technology", "Biotechnology", "Pharmaceuticals"],
  "minAmount": 1000000,
  "includeAmendments": false,
  "onlyNew": true,
  "maxResults": 500
}
```

The same schedule through the Apify API:

```sh
curl -X POST "https://api.apify.com/v2/schedules?token=<YOUR_TOKEN>" \
  -H "Content-Type: application/json" \
  -d '{"name": "daily-sec-form-d", "cronExpression": "0 7 * * 2-6", "timezone": "Europe/Stockholm", "isEnabled": true, "isExclusive": true,
       "actions": [{"type": "RUN_ACTOR", "actorId": "nightwave-owner~sec-form-d",
                    "runInput": {"contentType": "application/json; charset=utf-8", "body": "<the input above as a JSON string>"}}]}'
```

Connect a webhook or an integration (Slack, e-mail, Google Sheets, HubSpot) to the actor in Apify Console if you want the new rows sent somewhere when the run finishes.

### Good to know

- **Issuer data only, no people.** Form D lists related persons (executive officers, directors, promoters) with names and addresses, sales compensation recipients and the name of the signer. The actor does not read those parts of the filing, and it also leaves out the issuer's street address and phone number. If you need the contact person, open `url` on sec.gov.
- **Today is not available until the evening.** The daily index for a date is published after the business day ends in New York. Weekends and U.S. federal holidays have no index; those days are skipped.
- **Amounts are what the filer reported.** The SEC does not verify Form D. Amounts can change in later amendments, and "Indefinite" is common for funds that raise continuously.
- **SEC's rules for automated access are followed.** At most 8 requests per second through a queue (the SEC allows 10), the User-Agent `Nightwave AB kontakt@nightwave.se` and gzip compression. One request reads a whole day's index, then one request per filing.
- Requests are retried three times on network errors, rate limits (429) and server errors. A response in an unexpected format stops the run with a clear message instead of storing broken rows.
- The data describes what issuers have filed. It is not investment advice, and a Form D is not an offer to sell securities.

### Use cases

- Sales prospecting: companies that have just raised money buy software, services and office space. Filter by industry, state and amount and get the new ones every morning.
- Deal flow and market maps: follow which funds and startups raise in a sector, and how large the rounds are.
- Fund research: venture capital, private equity and hedge fund launches with exemption (3(c)(1) or 3(c)(7)) and amounts.
- Regional economic data: private capital raised per state and industry over a quarter.
- Enrichment: add funding date, size and industry to a list of company CIKs from other SEC data.

### FAQ

**How fresh is the data?**
The previous business day, every morning (European time). EDGAR publishes the daily index in the evening New York time.

**What does 1 000 rows cost?**
5 USD (0.005 USD per filing, event `filing`), plus Apify platform usage, which is a fraction of a cent per run.

**Why are there no founder or investor names?**
Because they are personal data. The actor is built for company level data that can be used without handling information about private individuals.

**Can I use the data commercially?**
Yes. The SEC states that information on sec.gov is public information that may be copied or further distributed without the SEC's permission. See "Data source and license".

### Data source and license

The data comes from SEC EDGAR: the daily form index `https://www.sec.gov/Archives/edgar/daily-index/<year>/QTR<n>/form.<yyyymmdd>.idx` and the Form D XML `https://www.sec.gov/Archives/edgar/data/<cik>/<accession>/primary_doc.xml`. No API key is needed.

The SEC's terms, read on 3 October 2026:

- [sec.gov/privacy](https://www.sec.gov/privacy), "Website Dissemination": "Information presented on sec.gov is considered public information and may be copied or further distributed by users of the web site without the SEC's permission. Please consider appropriate citation to the SEC as the source."
- [Accessing EDGAR Data](https://www.sec.gov/os/accessing-edgar-data): "Current max request rate: 10 requests/second" and "Please declare your user agent in request headers".

Every row carries `source` and `license` so you can credit SEC EDGAR when you publish the data. This actor is not affiliated with or endorsed by the U.S. Securities and Exchange Commission.

### Pricing

Pay per result: 0.005 USD per row returned (event `filing`), which is 5 USD per 1 000 filings. Apify bills platform usage on top as usual. It is small: a test run that returned 200 rows used 0.003 USD of platform usage. Filings that are read but filtered out are not charged. `maxResults` caps how many rows a run returns, so you always know the highest possible cost.

### Contact

Built and maintained by Nightwave AB. Questions, bugs and feature requests: kontakt@nightwave.se

### På svenska

Actorn hämtar nya Form D-anmälningar från SEC EDGAR, en rad per anmälan. Form D lämnas in till den amerikanska finansinspektionen (SEC) senast 15 dagar efter att ett bolag eller en fond har sålt värdepapper i en privat emission enligt Regulation D. Raden visar emittent, bransch, delstat, emissionsbelopp, sålt belopp, lägsta investering, datum för första försäljning och vilket undantag emissionen bygger på.

- Källa: EDGAR:s dagliga formulärindex och den strukturerade `primary_doc.xml` för varje anmälan. Upp till 92 dagar per körning, standard är de senaste 7 dagarna.
- Filter: bransch (`industryGroups`), delstat (`states`) och lägsta belopp (`minAmount`). Bara rader du får debiteras.
- Bara emittentdata. Namn och adresser på styrelseledamöter, befattningshavare, säljombud och undertecknare läses aldrig, och inte heller emittentens gatuadress och telefonnummer.
- Dagens index publiceras först efter arbetsdagens slut i New York, så en körning på svensk morgon ger föregående arbetsdag.
- Actorn följer SEC:s regler för automatisk åtkomst: högst 8 anrop per sekund (SEC tillåter 10), User-Agent med företagsnamn och e-post och gzip-komprimering.
- Villkor: SEC skriver att information på sec.gov är offentlig och får kopieras och spridas vidare utan SEC:s tillstånd, med SEC angiven som källa (sec.gov/privacy, läst 3 oktober 2026).
- Med `onlyNew: true` levereras bara anmälningar som tidigare körningar med samma input inte har levererat, vilket passar för daglig bevakning (se "Monitoring and scheduling").
- Datan beskriver vad emittenterna har anmält. Den är ingen investeringsrådgivning.
- Pris: 0,005 USD per anmälan (5 USD per 1 000) plus Apifys plattformsanvändning.
- Kontakt: kontakt@nightwave.se

# Actor input Schema

## `dateFrom` (type: `string`):

First filing date, YYYY-MM-DD, for example "2026-09-01". Defaults to 6 days before the end date, so the default run covers the last 7 days. The range can be at most 92 days.

## `dateTo` (type: `string`):

Last filing date (inclusive), YYYY-MM-DD, for example "2026-10-02". Defaults to today in New York time. EDGAR publishes each day's index after the business day ends, so the newest filings appear the next morning.

## `industryGroups` (type: `array`):

Only filings in these Form D industry groups, for example \["Other Technology", "Biotechnology"]. Empty means all industries. Investment funds are "Pooled Investment Fund".

## `states` (type: `array`):

Two-letter codes of the issuer's principal place of business, for example \["CA", "NY"]. Empty means all. SEC codes for other countries also work (A6 is Ontario, Canada; X0 is the United Kingdom).

## `minAmount` (type: `integer`):

Only offerings of at least this many US dollars, for example 1000000. When the offering amount is "Indefinite" (common for funds) the amount sold so far is compared instead. 0 means no limit.

## `includeAmendments` (type: `boolean`):

Also return amended filings (Form D/A), for example true. Turn off to get only new offerings. Defaults to true.

## `maxResults` (type: `integer`):

Maximum number of filings to return, newest day first, for example 50. Each filing is one billable result. Defaults to 50.

## `onlyNew` (type: `boolean`):

For scheduled runs. When true, filings that an earlier run with the same input already delivered are skipped and not charged, so a daily run returns only filings published since the last run. The first run returns everything in the range. Defaults to false.

## Actor input object example

```json
{
  "dateFrom": "2026-09-01",
  "dateTo": "2026-10-02",
  "industryGroups": [
    "Other Technology",
    "Biotechnology"
  ],
  "states": [
    "CA",
    "NY"
  ],
  "minAmount": 1000000,
  "includeAmendments": true,
  "maxResults": 50,
  "onlyNew": true
}
```

# Actor output Schema

## `results` (type: `string`):

All rows produced by the run, as JSON. Open in Apify Console or download via the dataset API.

# API

You can run this Actor programmatically using our API. Below are code examples in JavaScript, Python, and CLI, as well as the OpenAPI specification and MCP server setup.

## JavaScript example

```javascript
import { ApifyClient } from 'apify-client';

// Initialize the ApifyClient with your Apify API token
// Replace the '<YOUR_API_TOKEN>' with your token
const client = new ApifyClient({
    token: '<YOUR_API_TOKEN>',
});

// Prepare Actor input
const input = {
    "industryGroups": [],
    "states": [],
    "minAmount": 0,
    "includeAmendments": true,
    "maxResults": 50,
    "onlyNew": false
};

// Run the Actor and wait for it to finish
const run = await client.actor("nightwave-owner/sec-form-d").call(input);

// Fetch and print Actor results from the run's dataset (if any)
console.log('Results from dataset');
console.log(`💾 Check your data here: https://console.apify.com/storage/datasets/${run.defaultDatasetId}`);
const { items } = await client.dataset(run.defaultDatasetId).listItems();
items.forEach((item) => {
    console.dir(item);
});

// 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/js/docs

```

## Python example

```python
from apify_client import ApifyClient

# Initialize the ApifyClient with your Apify API token
# Replace '<YOUR_API_TOKEN>' with your token.
client = ApifyClient("<YOUR_API_TOKEN>")

# Prepare the Actor input
run_input = {
    "industryGroups": [],
    "states": [],
    "minAmount": 0,
    "includeAmendments": True,
    "maxResults": 50,
    "onlyNew": False,
}

# Run the Actor and wait for it to finish
run = client.actor("nightwave-owner/sec-form-d").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print(f"💾 Check your data here: https://console.apify.com/storage/datasets/{run.default_dataset_id}")
for item in client.dataset(run.default_dataset_id).iterate_items():
    print(item)

# 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/python/docs/quick-start

```

## CLI example

```bash
echo '{
  "industryGroups": [],
  "states": [],
  "minAmount": 0,
  "includeAmendments": true,
  "maxResults": 50,
  "onlyNew": false
}' |
apify call nightwave-owner/sec-form-d --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,nightwave-owner/sec-form-d"
        }
    }
}
```

The hosted server signs you in with OAuth on first connect, so no API token belongs in this config. Clients without OAuth support can send an `Authorization: Bearer <APIFY_API_TOKEN>` header instead, using a token from API & Integrations in Apify Console (https://console.apify.com/settings/integrations).

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/actors/HeFp4YPMm2e48QntX/builds/c7FxqPfo54vK3VSoM/openapi.json
