# SEC Form D Startup Funding & Private Placement Filings (EDGAR) (`groundplanes/sec-form-d-filings`) Actor

Newly filed SEC Form D private placements from EDGAR: company, industry, amount raised and offered, investors count, issuer address and phone, executives and directors (city/state only). Skips pooled funds; filter by state, industry and size. Fresh funding-round data.

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

## Pricing

from $2.10 / 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.
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?

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 Startup Funding & Private Placement Filings (EDGAR)

Extract newly filed **SEC Form D** private placement and startup funding notices directly from the U.S. Securities and Exchange Commission's EDGAR system. Every record is parsed from the official structured `primary_doc.xml` filing and includes:

- **Issuer details:** legal entity name, CIK, entity type, jurisdiction & year of incorporation, business street address, and phone number
- **Funding round metrics:** total offering amount, total amount already sold, remaining amount, minimum outside investment, number of investors, date of first sale, and Regulation D / Investment Company Act exemptions claimed (`06b`, `06c`, `3C.1`, `3C.7`, etc.)
- **Pooled fund filtering:** automatically flags and optionally excludes hedge funds, venture capital funds, and private equity funds (`excludePooledInvestmentFunds: true` by default) so B2B sales teams get real operating companies and newly funded startups
- **Executive & director roster:** full names, roles (`Executive Officer`, `Director`, `Promoter`), and city/state from `relatedPersonsList` (street addresses of related persons are intentionally omitted as they are often private residences)

Found a problem or need a field? Open an issue on the Issues tab; we respond quickly.

### Who it's for

- **B2B sales, SaaS, cloud, recruiting & agency BD teams** using newly filed Form D capital raises as high-intent buying triggers before rounds are announced in tech press
- **Venture capital, growth equity & private credit analysts** tracking private placements across technology, biotechnology, healthcare, energy, and real estate
- **Corporate service providers (accounting, legal, fractional CFO, commercial banking, insurance)** reaching newly capitalized companies

### Input

All filters are optional. The default input returns up to 200 newly filed Form D operating-company offerings from the past 7 days. `secUserAgent` is optional: SEC asks automated tools to identify themselves, and if you leave it empty the Actor sends its own contact string.

```json
{
  "dateFrom": "2026-10-16",
  "dateTo": "2026-10-23",
  "industryGroups": ["Other Technology", "Computers", "Biotechnology"],
  "excludePooledInvestmentFunds": true,
  "minOfferingAmountUsd": 500000,
  "states": ["CA", "NY", "TX"],
  "includeAmendments": false,
  "secUserAgent": "Acme Corp ops@acme.com",
  "maxItems": 200
}
```

| Field | Type | Default | Description |
|---|---|---|---|
| `dateFrom` | string (`YYYY-MM-DD`) | `today - 7 days` | Start of filing date window. |
| `dateTo` | string (`YYYY-MM-DD`) | `today` | End of filing date window. |
| `industryGroups` | array of strings | `[]` (all) | Case-insensitive match on Form D `industryGroupType` (e.g. `["Other Technology", "Computers", "Health Care"]`). |
| `excludePooledInvestmentFunds` | boolean | `true` | Exclude pooled investment funds (industry is Pooled Investment Fund, `investmentFundInfo` is present, or the securities offered are pooled fund interests). |
| `minOfferingAmountUsd` | integer | `0` | Minimum USD amount offered or sold. |
| `states` | array of strings | `[]` (all) | 2-letter issuer business state codes (e.g. `["CA", "NY"]`). |
| `includeAmendments` | boolean | `false` | Include `D/A` amendment filings in addition to new `D` filings. |
| `secUserAgent` | string | `""` (Actor default) | Optional SEC Fair Access `User-Agent` (`Organization Name email@domain.com`). Leave empty to use the Actor's own contact. |
| `maxItems` | integer | `200` | Maximum number of rows to output. |

### Output

| Field | Type | Description |
|---|---|---|
| `accessionNumber` | string | SEC 18-digit accession number with hyphens |
| `cik` | string | 10-digit SEC Central Index Key |
| `filingDate` | string | Filing date (`YYYY-MM-DD`) |
| `formType` | string | `D` or `D/A` |
| `entityName` | string | Primary issuer legal name (a filing whose XML is missing it is skipped, never emitted) |
| `entityType` | string | null | Entity type (`Corporation`, `Limited Liability Company`, `Limited Partnership`, etc.) |
| `jurisdictionOfIncorporation` | string | null | State or country of incorporation |
| `yearOfIncorporation` | string | null | Year of incorporation |
| `industryGroup` | string | null | Form D industry classification |
| `isPooledInvestmentFund` | boolean | `true` when the industry is Pooled Investment Fund, `investmentFundInfo` is present, or `isPooledInvestmentFundType` is true |
| `totalOfferingAmountUsd` | number | null | Total offering amount in USD (`null` when `"Indefinite"`) |
| `totalAmountSoldUsd` | number | null | Total amount already sold in USD |
| `totalRemainingUsd` | number | null | Total remaining to be sold in USD (`null` when `"Indefinite"`) |
| `minimumInvestmentUsd` | number | null | Minimum outside investor commitment in USD |
| `investorsCount` | integer | null | Total number of investors who have already invested |
| `dateOfFirstSale` | string | null | Date of first sale (`YYYY-MM-DD`) |
| `exemptions` | array of strings | Federal exemptions/exclusions claimed (`06b`, `06c`, `3C.1`, `3C.7`, etc.) |
| `issuerAddress` | object | `{ street1, street2, city, state, zip }` of the issuer |
| `issuerPhone` | string | null | Issuer telephone number |
| `relatedPersons` | array of objects | `[{ name, relationships, city, state }]` (street addresses omitted) |
| `filingIndexUrl` | string | EDGAR filing folder URL |
| `xmlUrl` | string | Direct URL to `primary_doc.xml` |

#### Sample output row

Fictitious example (company, person, address and 555 phone number are made up):

```json
{
  "accessionNumber": "0009999999-26-000001",
  "cik": "0009999999",
  "filingDate": "2026-10-23",
  "formType": "D",
  "entityName": "Example Analytics Holdings LLC",
  "entityType": "Limited Liability Company",
  "jurisdictionOfIncorporation": "DELAWARE",
  "yearOfIncorporation": "2026",
  "industryGroup": "Other Technology",
  "isPooledInvestmentFund": false,
  "totalOfferingAmountUsd": 4000000.0,
  "totalAmountSoldUsd": 4000000.0,
  "totalRemainingUsd": 0.0,
  "minimumInvestmentUsd": 50000.0,
  "investorsCount": 10,
  "dateOfFirstSale": "2026-10-08",
  "exemptions": ["06b"],
  "issuerAddress": {
    "street1": "100 EXAMPLE AVENUE",
    "street2": "SUITE 100",
    "city": "ATLANTA",
    "state": "GA",
    "zip": "30301"
  },
  "issuerPhone": "4045550147",
  "relatedPersons": [
    {
      "name": "Jordan Q. Sample",
      "relationships": ["Executive Officer", "Director"],
      "city": "Atlanta",
      "state": "GA"
    }
  ],
  "filingIndexUrl": "https://www.sec.gov/Archives/edgar/data/9999999/000999999926000001/",
  "xmlUrl": "https://www.sec.gov/Archives/edgar/data/9999999/000999999926000001/primary_doc.xml"
}
```

### How pricing works

Pay per result. You only pay for rows returned.

### Data source and terms

Data is retrieved from the official **U.S. Securities and Exchange Commission (SEC) EDGAR** system:

- **Primary discovery:** EDGAR Full-Text Search API (`https://efts.sec.gov/LATEST/search-index`) read one day at a time, newest day first
- **Fallback discovery:** EDGAR Daily Form Index files (`https://www.sec.gov/Archives/edgar/daily-index/YYYY/QTR{1-4}/form.YYYYMMDD.idx`)

**About the search endpoint:** `efts.sec.gov` powers EDGAR full-text search on SEC.gov but is not a formally documented, versioned API, so SEC could change it without notice. If it fails or changes shape, the Actor automatically switches to the official, documented EDGAR daily form index files for the same date range (weekdays only; weekends have no index file). Results are the same filings, but the fallback is slower and can't pre-filter by state, so a run may take longer. Every filing's data is always read from the official `primary_doc.xml` in the EDGAR archive.

- **Filing XML:** `https://www.sec.gov/Archives/edgar/data/<cik>/<accession>/primary_doc.xml`

Filings are published in real time on SEC business days (6:00 AM – 10:00 PM ET). All requests strictly comply with SEC Fair Access rate limits (throttled to ≤ 5 requests/second with required `User-Agent` identification).

### Limits and FAQ

- **Is this polite to SEC.gov?** Yes. The Actor never sends more than 5 requests per second (SEC allows 10), always identifies itself with a User-Agent, and backs off (honoring `Retry-After`) if SEC signals it is busy. If SEC keeps refusing requests, the run stops with a clear message instead of retrying forever.

- **Do I need to set `secUserAgent`?** No. SEC.gov blocks automated requests that don't identify themselves, so the Actor always sends a descriptive `User-Agent`. Set your own (`Company Name contact@domain.com`) if you prefer SEC to see your contact details.

- **Why are `totalOfferingAmountUsd` or `totalRemainingUsd` sometimes `null`?** Issuers (especially evergreen offerings) may mark those XML fields as `"Indefinite"`, which maps to `null`.

- **Why are street addresses omitted from `relatedPersons`?** Executive and director addresses on Form D frequently contain residential home addresses; only `city` and `state` are emitted for related persons, while the company's full business street address is included in `issuerAddress`.

- **What does a healthy canary run look like?** Run the labelled canary input `{"dateFrom": "2026-10-23", "dateTo": "2026-10-23", "maxItems": 5}` (any recent SEC business day works). A healthy run ends `Complete: 5 rows, newest filings first (reached maxItems=5)`.

### Troubleshooting

- **The run failed with "no matching records":** no Form D filings matched your filters in that window. Weekends and US holidays have few or no filings; widen the date range, clear `states`/`industryGroups`, or set `excludePooledInvestmentFunds` to false.
- **The run stopped with a "Blocked by SEC" message:** SEC rate-limited the requests. The Actor already throttles to 5 requests/second and backs off; wait 10+ minutes and retry, or set `secUserAgent` to your own `Company Name email@domain.com`.
- **The run ended PARTIAL:** some filings could not be delivered (for example the EDGAR search 9,000-hit-per-day cap, the run's charge limit, or individual filing XML that was missing or unreadable). The status message states exactly what was skipped and why; rows already delivered are complete and correct.
- **The run failed with a "source format appears to have drifted" message:** more than 20% of the filings fetched in the run were unreadable or missing core sections, which points to an EDGAR format change rather than a few bad filings. The run fails instead of delivering mostly-empty data; rows pushed before the failure are named in the status message.
- **Amounts show as `null`:** the issuer filed those amounts as "Indefinite", which maps to `null` by design.

### Changelog

- **v0.3** — Deeper drift hardening: an empty or syntactically broken filing XML is now skipped and counted like any other unreadable filing (it previously could crash the run); a filing missing the core `offeringSalesAmounts` or `industryGroup` sections inside `offeringData` is skipped instead of being emitted with hollow amount/industry fields; if more than 20% of fetched filings are skipped, the run fails as a source error rather than succeeding on mostly-empty data.

- **v0.2** — Drift hardening: a filing whose XML is missing `entityName` or `offeringData` is now skipped and counted (run ends PARTIAL naming the skip count) instead of being emitted with silent null fields; PARTIAL status messages end with the standard Issues-tab call to action.

- **v0.1.3** — Pooled-fund exclusion also catches filings whose securities are pooled investment fund interests (`isPooledInvestmentFundType`), even when the industry is "Other". Documented the daily-index fallback.

- **v0.1.2** — Hard cap of 5 SEC requests per second per run (half SEC's 10/s fair-access limit). On HTTP 429/403 the Actor honors Retry-After, backs off exponentially and pauses all requests; after 6 blocks in a row it stops with a clear message. Every request sends the User-Agent.

- **v0.1.1** — `secUserAgent` is now optional. Fixed a batching bug that could skip some filings near the end of a run.

- **v0.1** — Initial release with EFTS 3-day chunked discovery, daily-index fallback, token-bucket fair-access rate limiting (≤ 5 req/s), and structured XML parsing.

# Actor input Schema

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

Start of filing date range in YYYY-MM-DD format. Leave empty for today minus 7 days.

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

End of filing date range in YYYY-MM-DD format. Leave empty for today.

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

Optional list of Form D industry group names to keep (e.g. \["Other Technology", "Computers", "Biotechnology", "Health Care"]). Case-insensitive substring/exact match. Leave empty for all.

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

When true, excludes hedge funds, venture capital funds, private equity funds, and other pooled investment vehicles so results focus on operating companies and startups.

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

Minimum total offering amount or amount sold in USD.

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

Optional 2-letter US state codes for the issuer's principal place of business (e.g. \["CA", "NY", "TX"]). Leave empty for all states.

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

When false (default), keeps only new Form D filings and excludes Form D/A amendments.

## `secUserAgent` (type: `string`):

SEC Fair Access rules ask every request to identify the requester with a company name and contact email, e.g. 'Acme Corp ops@acme.com'. Leave empty to use this Actor's own contact string.

## `maxItems` (type: `integer`):

Maximum number of Form D filings to return.

## Actor input object example

```json
{
  "industryGroups": [],
  "excludePooledInvestmentFunds": true,
  "minOfferingAmountUsd": 0,
  "states": [],
  "includeAmendments": false,
  "maxItems": 200
}
```

# Actor output Schema

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

No description

# 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": [],
    "excludePooledInvestmentFunds": true,
    "minOfferingAmountUsd": 0,
    "states": [],
    "includeAmendments": false,
    "secUserAgent": "",
    "maxItems": 200
};

// Run the Actor and wait for it to finish
const run = await client.actor("groundplanes/sec-form-d-filings").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": [],
    "excludePooledInvestmentFunds": True,
    "minOfferingAmountUsd": 0,
    "states": [],
    "includeAmendments": False,
    "secUserAgent": "",
    "maxItems": 200,
}

# Run the Actor and wait for it to finish
run = client.actor("groundplanes/sec-form-d-filings").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": [],
  "excludePooledInvestmentFunds": true,
  "minOfferingAmountUsd": 0,
  "states": [],
  "includeAmendments": false,
  "secUserAgent": "",
  "maxItems": 200
}' |
apify call groundplanes/sec-form-d-filings --silent --output-dataset

```

## MCP server setup

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

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/EygjVe3fQQeSJ4Kvr/builds/9mB5EUdMecSZrN5dP/openapi.json
