# SEC Form D Scraper - Startup Funding & Private Placements (`neverempty/sec-form-d-scraper`) Actor

Every Form D private placement filed with the SEC EDGAR, one row per filing: issuer, industry, amounts offered and sold, investors, Rule 506(b)/(c), first sale date and officers. Filter by date, state, industry and size. Indefinite amounts stay null, never 0. No API key.

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

## Pricing

from $8.76 / 1,000 form d filing returneds

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.
Since this Actor supports Apify Store discounts, the price gets lower the higher subscription plan you have.

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

## What's an Apify Actor?

Actors are web data automations that power AI and operations. They run on the Apify platform to scrape websites, process data, connect APIs, and automate workflows.
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.
Actors are written with capital "A".

## 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.
The best way to integrate Actors is as follows.

- **AI agents and MCP clients** — the [Apify MCP server](https://docs.apify.com/integrations/mcp.md) at `https://mcp.apify.com` (remote, streamable HTTP, OAuth on first use).
- **Agentic workflows and local Actor development** — [Agent Skills](https://apify.com/.well-known/agent-skills/index.json) with the [Apify CLI](https://docs.apify.com/cli/docs.md): `npm install -g apify-cli`, then `apify login`.
- **JavaScript/TypeScript projects** — the official [JS/TS client](https://docs.apify.com/api/client/js/docs.md): `npm install apify-client`.
- **Python projects** — the official [Python client](https://docs.apify.com/api/client/python/docs.md): `pip install apify-client`.
- **Any other language** — the [REST API](https://docs.apify.com/api/v2.md).

For usage examples, see the [API](#api) section below.

For more details, see Apify documentation as [Markdown index](https://docs.apify.com/llms.txt) and [Markdown full-text](https://docs.apify.com/llms-full.txt).

# README

## SEC Form D Scraper - Startup Funding & Private Placements

Every **Form D** private placement notice filed with the US Securities and Exchange Commission (SEC) on **EDGAR**, one row per filing. A company or fund that raises money under **Regulation D** (Rule 506(b), Rule 506(c), Rule 504) or the Section 4(a)(5) exemption has to file a Form D within 15 days of its first sale. That makes Form D the earliest public record of startup funding rounds, venture capital, private equity, hedge fund, real estate and SPV raises in the United States.

Search by filing date, issuer state or country, industry, exemption, issuer name, CIK number and offering size. No API key, no login and no proxy are needed. The data is the SEC's own public-domain EDGAR data.

### What you get for each filing

| Group | Columns |
|---|---|
| Filing | `accessionNumber`, `form` (D or D/A), `isAmendment`, `previousAccessionNumber`, `fileNumber`, `filedDate`, `formViewUrl` (readable form), `documentUrl` (XML), `filingIndexUrl` |
| Issuer | `issuerName`, `cik`, `entityType`, `jurisdictionOfIncorporation`, `yearOfIncorporation`, `incorporatedWithinFiveYears`, `issuerPreviousNames`, `issuerStreet1`, `issuerStreet2`, `issuerCity`, `issuerStateOrCountry`, `issuerStateOrCountryName`, `issuerZip`, `issuerAddressWithheld`, `issuerAddressWithheldReason`, `otherIssuers`, `edgarBusinessStates` |
| Offering | `industryGroup`, `investmentFundType`, `is40ActFund`, `revenueRange`, `aggregateNetAssetValueRange`, `exemptionCodes`, `exemptions` (for example "Rule 506(c)"), `securitiesTypes`, `firstSaleDate`, `firstSaleYetToOccur`, `offeringMoreThanOneYear`, `isBusinessCombination` |
| Money | `totalOfferingAmountUsd`, `totalOfferingAmountIndefinite`, `totalAmountSoldUsd`, `totalRemainingUsd`, `totalRemainingIndefinite`, `percentSold`, `minimumInvestmentUsd`, `salesCommissionsUsd`, `findersFeesUsd`, `grossProceedsToRelatedPersonsUsd`, `amountsClarification` |
| Investors | `totalInvestorCount`, `hasNonAccreditedInvestors`, `nonAccreditedInvestorCount` |
| People | `relatedPersons` (name, relationships such as Executive Officer, Director or Promoter, city and state), `relatedPersonCount`, `salesCompensationRecipients` (broker or finder name, CRD number, states of solicitation), `signerName`, `signerTitle`, `signatureDate` |

### Input

| Field | What it does |
|---|---|
| `daysBack` | Days of filings to search, ending with `filedTo`. Default 7. Ignored when `filedFrom` is set. |
| `filedFrom` | First filing date, such as 2026-01-01. Dates that do not exist, such as 2026-09-31, are rejected before anything is sent. |
| `filedTo` | Last filing date. Empty means today. |
| `amendments` | `include` (default), `exclude` for new filings only, or `only` for Form D/A only. |
| `states` | Issuer states or countries: two-letter US states (CA), state names (California) or EDGAR country codes (E9 Cayman Islands, X0 United Kingdom, A6 Ontario). Unknown codes are rejected. |
| `industries` | Form D industry groups such as Biotechnology, Other Technology, Pooled Investment Fund, Commercial, Residential, Oil and Gas. |
| `excludePooledInvestmentFunds` | Leave out hedge, private equity, venture and SPV fund vehicles and keep operating companies. |
| `exemptions` | 506(b), 506(c), 504, 4(a)(5), 3(c)(1) to 3(c)(14). |
| `issuerName` | Keep issuers whose name contains this text, case-insensitive. |
| `ciks` | Only these EDGAR CIK numbers, up to 100. Leading zeros are added for you. |
| `minOfferingAmountUsd` | Keep offerings of at least this size. |
| `minAmountSoldUsd` | Keep filings that report at least this much already sold. |
| `maxResults` | Maximum filings returned, newest first. Default 100, up to 5,000. |

Example input for California technology and biotech companies raising money in the last 30 days, without fund vehicles:

```json
{
    "daysBack": 30,
    "states": ["CA"],
    "industries": ["Other Technology", "Biotechnology", "Computers"],
    "excludePooledInvestmentFunds": true,
    "amendments": "exclude",
    "maxResults": 200
}
```

### Measured on the live data (1 to 10 September 2026)

Every number below was counted on all 1,854 Form D filings EDGAR held for 1 to 10 September 2026 when they were fetched on **11 September 2026 at 00:55 UTC**. EDGAR keeps adding filings for recent days for a while, so a later count of the same dates can be higher. Each filing's form was read and parsed, with none failing.

- **1,090 new filings and 764 amendments (Form D/A).** An amendment is its own filing with its own accession number, so it comes back as its own row with `isAmendment: true` and a `previousAccessionNumber`. No accession number is returned or charged twice in a run.
- **868 of 1,854 (46.8%) state their total offering amount as "Indefinite"**, meaning no maximum was set. Here that is `totalOfferingAmountUsd: null` with `totalOfferingAmountIndefinite: true`. It is never 0, and no percentage sold is invented for it.
- **1,242 of 1,854 (67.0%) are pooled investment funds.** Switch on `excludePooledInvestmentFunds` to see operating companies.
- **278 have not made their first sale yet.** `firstSaleDate` is null and `firstSaleYetToOccur` is true; the date is not replaced with today.
- **Rule 506(b) is claimed by 1,625 filings and Rule 506(c), which allows public advertising, by 220.**
- **EDGAR's search returns at most 10,000 results for one query.** From 1 January to 10 September 2026 there were 44,314 Form D filings (counted 10 September 2026), so this actor splits long date ranges into windows that each stay under the limit. A long search is never quietly cut off at 10,000.
- **EDGAR's search can answer from a stale cache.** A first page served from an older copy of the index left out the 7 newest filings of a search. Every request here carries a changing cache-busting value, and if the total differs from one page to the next, the first page is read again. If the totals still disagree, an uncharged `incomplete` row says so.

### What goes wrong in other Form D tools

- **"Indefinite" read as $0**, which makes most funds look like they raised nothing. Here an indefinite amount stays null with a flag.
- **Deep paging stops at 10,000 results without saying so.** Here the date range is split so every filing can be reached, and when a single day ever holds more than 10,000, an uncharged row says so.
- **Amendments double-counted or mixed up with new raises.** Here they are separate rows you can include, exclude or ask for alone, and each points to the filing it amends.
- **The state filter misses foreign issuers.** EDGAR's search has no business state on record for 105 of the 1,854 filings (nearly all foreign issuers, such as the Cayman Islands, Luxembourg and the UK), and its state disagrees with the address in the form itself for 55 more. This actor decides the state from the issuer address in the Form D and keeps the filings with no EDGAR state as candidates. It uses EDGAR's state only to skip filings that are clearly elsewhere, and that pre-check does miss a few filings whose EDGAR state is a different one. Measured on the same 1,854 filings, it found:

  | Search | Filings whose form says that place | Found |
  |---|---|---|
  | `states: ["CA"]` | 174 | 169 |
  | `states: ["CA"]`, funds and amendments left out | 63 | 61 |
  | `states: ["NY"]` | 234 | 227 |
  | `states: ["TX"]` | 263 | 253 |
  | `states: ["E9"]` (Cayman Islands) | 75 | 71 |
- **Filters that EDGAR's search ignores.** An exemption filter sent to EDGAR's search can come back unfiltered from its cache: the same query returned 204 filings once and 1,441 the next time. This actor never sends that filter. It checks every filing's exemptions itself, and they matched the form's own list in 520 of 520 filings checked.
- **Home addresses.** Form D lists a street address for every officer, director and promoter, and for small companies that is often a home. This actor returns their name, role, city and state, but never their street or ZIP code. Small companies also often give an officer's address as the company's own: in 443 of the 612 filings that are not investment funds, the issuer's street was the same as a related person's. When it is, `issuerStreet1`, `issuerStreet2` and `issuerZip` are null, `issuerAddressWithheld` is true and `issuerAddressWithheldReason` says why, while `issuerCity` and `issuerStateOrCountry` are kept. The issuer's phone number is never returned. The full filing is always one click away at `formViewUrl`.

### Example row

```json
{
    "accessionNumber": "0002154453-26-000001",
    "form": "D",
    "isAmendment": false,
    "filedDate": "2026-09-10",
    "cik": "0002154453",
    "issuerName": "EB-5 Homes NCE LP",
    "entityType": "Limited Partnership",
    "jurisdictionOfIncorporation": "DELAWARE",
    "yearOfIncorporation": 2025,
    "issuerCity": "IRVINE",
    "issuerStateOrCountry": "CA",
    "industryGroup": "Other Real Estate",
    "exemptions": ["Rule 506(c)"],
    "firstSaleDate": "2026-06-08",
    "securitiesTypes": ["Equity", "Pooled investment fund interests"],
    "minimumInvestmentUsd": 800000,
    "totalOfferingAmountUsd": 5600000,
    "totalOfferingAmountIndefinite": false,
    "totalAmountSoldUsd": 800000,
    "totalRemainingUsd": 4800000,
    "percentSold": 14.3,
    "totalInvestorCount": 1,
    "relatedPersons": [
        { "name": "Paramjeet Dahiya", "relationships": ["Director"], "city": "Irvine", "stateOrCountry": "CA" },
        { "name": "Mukesh Rani", "relationships": ["Director"], "city": "Irvine", "stateOrCountry": "CA" }
    ],
    "formViewUrl": "https://www.sec.gov/Archives/edgar/data/2154453/000215445326000001/xslFormDX01/primary_doc.xml"
}
```

### Rows that explain instead of pretending

When there is nothing to return, the run says why in a row with a `status` and a `note`. These rows are never charged:

| `status` | Meaning |
|---|---|
| `no-filings` | EDGAR answered and nothing matched. The note gives the date range and how many filings each filter left out. |
| `bad-input` | A date, state, industry, exemption or CIK was not valid. Nothing was sent to EDGAR. |
| `failed` | EDGAR did not answer after several attempts. This is not reported as "no filings". |
| `incomplete` | The result is missing something: EDGAR stopped answering part way, its page totals disagreed even after a re-read, a single day held more than 10,000 filings, some form documents could not be read, or the run reached its document limit. A run that stopped early never also claims "no filings". |
| `filing-unreadable` | One filing's form document could not be read. Its accession number and links are included. |
| `left-out` | Filings with an Indefinite amount were left out by `minOfferingAmountUsd`. The note gives the count and the filing dates of the documents it was counted in. |

### Speed and limits

- Each filing is one request for its form document, and requests are paced to stay inside the SEC's published limit of ten per second. In a measured run, the default 100 filings took 14.5 seconds and a 14-day California search returned 30 operating companies in 19 seconds.
- Filters on the form itself (state, industry, amounts) are applied after reading each document, so a very narrow search over a long range reads many documents. One run reads at most 1,500 documents, or 30 per requested row when that is more, up to 8,000. If it reaches that limit, it says so in an `incomplete` row.
- Electronic Form D filings begin in late 2008.

### Support

Found a filing that looks wrong, or need another field from Form D? Open an issue on the **Issues** tab of this actor and include the accession number.

# Actor input Schema

## `daysBack` (type: `integer`):

How many days of filings to search, ending with filedTo (today when filedTo is empty). Ignored when filedFrom is set. EDGAR receives roughly 190 to 340 Form D filings per business day (1,854 from 1 to 10 September 2026, counted on 11 September 2026 at 00:55 UTC).

## `filedFrom` (type: `string`):

A date such as 2026-01-01. When set, daysBack is ignored. Dates that do not exist (2026-09-31) are rejected before anything is sent. Electronic Form D filings begin in late 2008.

## `filedTo` (type: `string`):

A date such as 2026-06-30. Empty means today.

## `amendments` (type: `string`):

Form D/A amends an earlier Form D and is returned as its own row with isAmendment true and previousAccessionNumber pointing at the filing it amends. 764 of the 1,854 filings from 1 to 10 September 2026 were amendments (counted 11 September 2026, 00:55 UTC). Include them, leave them out, or return only them.

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

Keep filings whose issuer address in the Form D is in one of these places: two-letter US states (CA, NY, TX) or state names, or EDGAR country codes for foreign issuers (E9 Cayman Islands, X0 United Kingdom, A6 Ontario). Unknown codes are rejected instead of returning an empty result. Leave empty for everywhere.

## `industries` (type: `array`):

Keep filings in these Form D industry groups, exactly as the form names them: Biotechnology, Pharmaceuticals, Other Health Care, Computers, Telecommunications, Other Technology, Pooled Investment Fund, Commercial, Residential, Other Real Estate, Oil and Gas, Manufacturing, Retailing, Restaurants and so on. Case does not matter. Leave empty for every industry.

## `excludePooledInvestmentFunds` (type: `boolean`):

Pooled investment funds (hedge, private equity, venture and SPV vehicles) were 1,242 of the 1,854 filings from 1 to 10 September 2026 (counted 11 September 2026, 00:55 UTC). Switch this on to see operating companies raising money.

## `exemptions` (type: `array`):

Keep filings that claim at least one of these exemptions: 506(b), 506(c), 504, 4(a)(5), 3(c)(1) to 3(c)(14). Rule 506(c) means the issuer may advertise the offering publicly.

## `issuerName` (type: `string`):

Keep filings whose issuer name contains this text, case-insensitive (Ventures, Health, Labs).

## `ciks` (type: `array`):

Only filings by these EDGAR CIK numbers (up to 100). Leading zeros are added for you - EDGAR's search returns nothing for an unpadded CIK.

## `minOfferingAmountUsd` (type: `integer`):

Keep offerings of at least this many dollars. Filings whose offering amount is Indefinite (no maximum: 868 of 1,854 filings from 1 to 10 September 2026, mostly funds) cannot be compared and are left out - the run says how many in an uncharged row.

## `minAmountSoldUsd` (type: `integer`):

Keep filings that report at least this many dollars already sold. Every filing states a number here, so nothing is left out for being indefinite.

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

Upper limit of filings returned, newest first. You are charged only for the filings you receive; rows that explain an empty or rejected search are free.

## Actor input object example

```json
{
  "daysBack": 7,
  "amendments": "include",
  "states": [
    "CA"
  ],
  "industries": [
    "Other Technology",
    "Biotechnology"
  ],
  "excludePooledInvestmentFunds": false,
  "exemptions": [
    "506(c)"
  ],
  "maxResults": 100
}
```

# Actor output Schema

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

One row per SEC Form D or Form D/A filing, plus uncharged rows that explain a rejected input, a search with no match, a document that could not be read or a result that stopped early.

# 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 = {
    "states": [
        "CA"
    ],
    "industries": [
        "Other Technology",
        "Biotechnology"
    ],
    "exemptions": [
        "506(c)"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("neverempty/sec-form-d-scraper").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 = {
    "states": ["CA"],
    "industries": [
        "Other Technology",
        "Biotechnology",
    ],
    "exemptions": ["506(c)"],
}

# Run the Actor and wait for it to finish
run = client.actor("neverempty/sec-form-d-scraper").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 '{
  "states": [
    "CA"
  ],
  "industries": [
    "Other Technology",
    "Biotechnology"
  ],
  "exemptions": [
    "506(c)"
  ]
}' |
apify call neverempty/sec-form-d-scraper --silent --output-dataset

```

## MCP server setup

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

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/LOnKLDEcxGt7k1xqC/builds/wVQjrrOjXPCnu1ntj/openapi.json
