# SEC Form D Scraper: Offerings & Funding Leads (`automation_craft/sec-form-d-scraper`) Actor

Scrape SEC Form D and D/A filings by date, company or filing number, no login or API key: about 1,000 offerings in 4 minutes. Get issuer address and phone, industry, amount offered and sold, investor count, exemptions, executives, directors and brokers. JSON or CSV; pay per offering, not per miss.

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

## Pricing

from $1.92 / 1,000 offerings

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 Scraper: Offerings & Funding Leads

**SEC Form D scraper** for funding leads and private offering research: one Offering row per Form D or Form D/A filing, read from the SEC's public EDGAR system (EDGAR full-text search for the list of filings, the filing's own XML document for the data). A Form D is the notice of an offering that claims a federal exemption such as Rule 506(b), Rule 506(c) or Rule 504; a Form D/A amends it. Each row carries the issuer's address and phone, the industry group, the total offering amount and the amount sold, the number of investors, the exemptions claimed, the executive officers, directors and promoters, and the brokers paid to sell the offering. No login, no API key and no proxy setting.

Ask in one of three ways: every Form D of a date window (the last 7 days by default), the Form D history of the companies you list (by CIK or full legal name), or single filings by EDGAR link or accession number. Use it as a daily feed of new raises, as a Form D API for your own code (curl, Node and Python examples below), or as a CSV export for a spreadsheet or CRM.

#### Why this one

- **Pay only for filings you get.** One Offering event per filing delivered. A filing that does not pass your filters is not delivered and not charged. An unknown CIK, a company without Form D filings, a name that fits more than one filer, a filing that is not found or is not a Form D, and an empty search get free rows that say what happened.
- **Every person in the filing.** Related persons (executive officers, directors, promoters) with the business address they filed, the brokers and finders paid for the offering with their CRD numbers and states of solicitation, the signers, and every additional issuer of a multi issuer filing. People and brokers can also come as flat rows of their own, free.
- **Filters judged on the filing itself.** Form type, 35 industry groups, no pooled investment funds, fund type, entity type, issuer state or country, 24 exemption codes, minimum offering amount, minimum amount sold, minimum number of investors and sales to non accredited investors are checked on the filing's own data. A keyword anywhere in the filing (a person, a street, a city) and words of the issuer name narrow EDGAR's search.
- **The amendment chain.** Every amendment links to the filing it amends; on request you also get every filing of the same offering and what changed against the amended filing (amount sold, offering amount, investors, people added and removed).
- **A monitor for new filings, and watch lists.** Give a monitor name and schedule the run: each filing is delivered and charged once per monitor name. A list of companies is searched 100 at a time, so a watch list of hundreds of issuers costs a handful of requests when nothing is new.
- **Company names that resolve.** A company's full legal name is looked up among the filers of Form D filings, however you punctuate it, and a new filer is known from its first Form D on. In our test on 2026-10-05 the 977 distinct issuer names of 1,000 recent filings were sent exactly as filed: 973 resolved to their own filer and 4 came back as free `ambiguous` rows that list the right filer with its CIK (one name is carried by two filers; three, such as `Vistiq.AI, Inc.`, have too few plain words to search by). None resolved to another filer. A name is never guessed into a company.
- **Complete, and it says so.** In a test on 2026-10-01, EDGAR full-text search, which this Actor reads page by page, listed all 9,962 Form D and D/A filings of the SEC's own daily index files for the 60 days from 2026-07-31 to 2026-09-28. Every run ends with a summary whose `coverage` says whether the window was read to its end.
- **New filings within minutes.** In one evening's measurement on 2026-10-01, a filing accepted at 17:24:02 US Eastern was in EDGAR full-text search at 17:25:08, and the five filings before it within 2 to 7 minutes.
- **Fast and polite.** On the platform 1,000 offerings took 207 to 217 seconds in five test runs and a 10 offering run 3 to 7 seconds (2026-10-01 to 2026-10-05 UTC, 256 MB). The Actor sends at most 5 requests per second, half the SEC's published limit of 10, with a declared User-Agent.

### Quick start

1. Leave **Days back** at 7 for every Form D filed in the last seven days, or set **Filed from** and **Filed to** (YYYY-MM-DD) for another window. For one company, put its CIK or exact legal name into **Issuers**; for single filings, put EDGAR links or accession numbers into **Filings**.
2. Optional: narrow the search with **Filters** (form types, industry groups, issuer state, exemptions, minimum amounts, keyword, issuer name words).
3. Optional: under **Output**, turn on related persons or brokers as rows, the offering history, or the changes since the amended filing.
4. Set **Maximum offerings** (the prefill is 10; 100 is used when the field is left out).
5. Click **Start**. Rows appear in the Dataset tab; export JSON, CSV or Excel, or read them through the API.

### What you get

Every row has a `type`: `offering` (the paid row), `relatedPerson` and `salesCompensationRecipient` (optional, free), `status` (free, one per miss, problem or stop) and `summary` (free, the last row of every run).

#### Offering row

One row per filing, 76 top level fields (85 with the offering history and the changes switched on). The blocks:

- **Identity:** `accessionNumber`, `formType` (`D` or `D/A`), `isAmendment`, `filedAt`, `fileNumber`, `schemaVersion`, `filingUrl`, `xmlUrl`, `htmlUrl`, `issuerFilingsUrl`, `source` (`search`, `issuer` or `filing`), `searchRecordFound`, `edgarBusinessLocations`, `scrapedAt`.
- **Issuer:** `issuerName`, `issuerCik`, `issuerStreet1`, `issuerStreet2`, `issuerCity`, `issuerStateOrCountry`, `issuerStateOrCountryName`, `issuerZipCode`, `issuerPhone`, `jurisdictionOfIncorporation`, `entityType`, `entityTypeOther`, `yearOfIncorporation`, `yearOfIncorporationStatus`, `issuerPreviousNames`, `edgarPreviousNames`, `issuerCount` and `additionalIssuers` (each with the same address and incorporation fields).
- **Offering:** `industryGroup`, `isPooledInvestmentFund`, `investmentFundType`, `isInvestmentCompanyActFund`, `revenueRange`, `aggregateNetAssetValueRange`, `federalExemptions` with `federalExemptionLabels`, `dateOfFirstSale`, `firstSaleYetToOccur`, `offeringLastsMoreThanOneYear`, `securityTypes`, `otherSecurityTypeDescription`, `isBusinessCombination`, `businessCombinationClarification`, `minimumInvestmentAccepted`, `totalOfferingAmount`, `totalOfferingAmountIndefinite`, `totalAmountSold`, `totalRemaining`, `totalRemainingIndefinite`, `percentSold`, `offeringAmountsClarification`.
- **Investors and costs:** `hasNonAccreditedInvestors`, `numberNonAccreditedInvestors`, `totalNumberAlreadyInvested`, `salesCommissions`, `salesCommissionsIsEstimate`, `findersFees`, `findersFeesIsEstimate`, `salesCommissionsClarification`, `grossProceedsUsedForInsiders`, `grossProceedsUsedIsEstimate`, `useOfProceedsClarification`.
- **People:** `relatedPersonCount`, `relatedPersons` (`fullName`, `firstName`, `middleName`, `lastName`, `isEntity`, `relationships`, `relationshipClarification`, `street1`, `street2`, `city`, `stateOrCountry`, `stateOrCountryName`, `zipCode`), `relatedPersonsSummary` (one line of names and roles), `salesCompensationRecipientCount`, `salesCompensationRecipients`, `signatures`, `authorizedRepresentative`.
- **Amendment link:** `previousAccessionNumber` and `previousFilingUrl` (the filing an amendment names as the one it amends).

`percentSold` is computed from the two amounts when the offering amount is a number. An "Indefinite" offering amount (common for funds) comes as `totalOfferingAmount: null` with `totalOfferingAmountIndefinite: true`; the same holds for `totalRemaining`.

#### Fill rates

Measured on 862 real Form D and D/A filings run through this Actor's own parser and row builder (fetched 2026-10-01, `scripts/fill-rates.mjs`). **recent (542)** is every Form D and D/A filed on 2026-09-22 and 2026-09-25; **all (862)** adds 320 samples filed between 2008 and 2019. A field counts as filled when it is not null, not an empty text and not an empty list (a `false` or a `0` counts as filled). The rates are what filers put into the form, not a choice of the Actor.

| Field | What it holds | all (862) | recent (542) |
|---|---|---|---|
| `accessionNumber`, `formType`, `filedAt`, `fileNumber` | Filing identity and date | 100% | 100% |
| `issuerName`, `issuerCik` | The primary issuer | 100% | 100% |
| `issuerStreet1`, `issuerCity`, `issuerStateOrCountry`, `issuerZipCode` | Issuer address | 100% | 100% |
| `issuerStreet2` | Second address line | 56.4% | 60% |
| `issuerPhone` | Issuer phone as filed | 100% | 100% |
| `entityType` | Corporation, Limited Liability Company, Limited Partnership, General Partnership, Business Trust or Other | 100% | 100% |
| `yearOfIncorporation` | Year, when the filer gave one | 77.4% | 77.1% |
| `industryGroup` | One of the form's 35 groups | 100% | 100% |
| `investmentFundType` | Hedge Fund, Private Equity Fund, Venture Capital Fund or Other Investment Fund (funds only) | 57.1% | 68.1% |
| `revenueRange` | Revenue range of an operating company | 68.6% | 66.4% |
| `aggregateNetAssetValueRange` | Net asset value range of a fund | 31.4% | 33.6% |
| `federalExemptions`, `federalExemptionLabels` | Codes such as `06b` and their names | 100% | 100% |
| `dateOfFirstSale` | Date of the first sale (else `firstSaleYetToOccur`) | 80.4% | 78% |
| `minimumInvestmentAccepted` | Minimum investment in USD | 100% | 100% |
| `totalOfferingAmount`, `percentSold` | Offering size in USD (null when Indefinite) | 52.9% | 45.8% |
| `totalAmountSold` | Amount sold so far in USD | 100% | 100% |
| `totalNumberAlreadyInvested` | Number of investors so far | 100% | 100% |
| `numberNonAccreditedInvestors` | Number of non accredited investors | 7.7% | 5.2% |
| `salesCommissions`, `findersFees` | Sales commissions and finders fees in USD | 100% | 100% |
| `useOfProceedsClarification` | The filer's note on the use of proceeds | 32.9% | 37.3% |
| `relatedPersons` | At least one executive officer, director or promoter | 100% | 100% |
| `salesCompensationRecipients` | At least one broker or finder | 20% | 20.1% |
| `signatures` | Signer name, title and date | 100% | 100% |
| `previousAccessionNumber`, `previousFilingUrl` | The amended filing (amendments only) | 35.8% | 39.7% |
| `additionalIssuers` | More than one issuer in the filing | 0.6% | 0.6% |

Example Offering row (platform run of the prefill input on 2026-10-01; shortened: 33 of its 76 fields):

```json
{
  "type": "offering",
  "accessionNumber": "0002158005-26-000001",
  "formType": "D",
  "isAmendment": false,
  "filedAt": "2026-10-01",
  "fileNumber": "021-599617",
  "issuerName": "Numerant, Inc.",
  "issuerCik": "0002158005",
  "issuerStreet1": "1623 GORDON PETTY DRIVE",
  "issuerCity": "BRENTWOOD",
  "issuerStateOrCountry": "TN",
  "issuerZipCode": "37027",
  "issuerPhone": "(256) 652-7929",
  "jurisdictionOfIncorporation": "DELAWARE",
  "entityType": "Corporation",
  "yearOfIncorporation": 2026,
  "industryGroup": "Other Technology",
  "isPooledInvestmentFund": false,
  "revenueRange": "Decline to Disclose",
  "federalExemptions": ["06b"],
  "federalExemptionLabels": ["Rule 506(b)"],
  "dateOfFirstSale": "2026-09-10",
  "securityTypes": ["Option, Warrant or Other Right to Acquire Another Security"],
  "minimumInvestmentAccepted": 0,
  "totalOfferingAmount": null,
  "totalOfferingAmountIndefinite": true,
  "totalAmountSold": 425000,
  "totalNumberAlreadyInvested": 3,
  "relatedPersonCount": 2,
  "relatedPersonsSummary": "Samuel James Barr (Executive Officer, Director, Promoter); Seth Townsend (Executive Officer, Director, Promoter)",
  "salesCompensationRecipientCount": 0,
  "filingUrl": "https://www.sec.gov/Archives/edgar/data/2158005/000215800526000001/",
  "scrapedAt": "2026-10-01T23:15:11.308Z"
}
```

#### People and brokers as rows (free)

With `relatedPersonRows` on, every related person also comes as a `relatedPerson` row (25 fields: the person's name parts, `isEntity`, `relationships`, address, plus `accessionNumber`, `position`, `issuerName`, `issuerCik`, `formType`, `filedAt`, `industryGroup`, `totalOfferingAmount`, `totalAmountSold`, `filingUrl`). With `salesCompensationRows` on, every broker or finder comes as a `salesCompensationRecipient` row (22 fields: `name`, `crdNumber`, `associatedBrokerDealerName`, `associatedBrokerDealerCrdNumber`, address, `statesOfSolicitation`, `allStates`, `foreignSolicitation`, plus the offering's identity). They are tied to their Offering row by `accessionNumber`, written in the same dataset call, and never charged.

#### Offering history and changes (free)

`includeOfferingHistory` adds `offeringHistory` (every Form D and D/A of the same SEC file number, oldest first, with dates and links), `offeringFilingCount`, `offeringFirstFiledAt`, `isLatestFilingOfOffering`, `issuerFormDFilingCount`, `offeringHistoryTruncated` and `offeringHistoryNote`. `includeChanges` adds `changesSincePrevious` for an amendment: `totalAmountSold`, `totalOfferingAmount`, `totalNumberAlreadyInvested`, `minimumInvestmentAccepted` and `salesCommissions` as previous, current and change, `relatedPersonsAdded`, `relatedPersonsRemoved` and `changedFields`, plus `changesNote` when the amended filing cannot be compared (for example a paper filing). Both take extra requests to the SEC and never an extra charge.

#### Status rows (free)

Every input value that cannot be used, every issuer or filing you listed that does not end as an Offering row (with a monitor, an issuer without new filings gets none), every filing of a search that could not be read, every search that finds nothing and every stop gets a `type: "status"` row with `scope` (`input`, `issuer`, `filing`, `search` or `run`), `status` and a `message` in plain words. Issuer rows add `input`, `issuerCik`, `issuerName`, `counts` and, for a name, `candidates` (up to 10 filers with `name` and `cik`); filing rows add `accessionNumber`; search rows add the `window` and `counts`; run rows add `details`. None of them is charged.

| `status` | What it means |
|---|---|
| `invalid` | An input value that cannot be used. A setting (a date, a filter value, the row cap, an unknown field name) stops the run before any paid work; one bad item of `issuers` or `filings` gets its own row and the other items run. |
| `not_found` | The SEC has no filer under this CIK or no filing under this number; or no filer with this name was found, neither among the filers of Form D filings nor in the SEC's company name lookup. |
| `ambiguous` | A company name that was not used: two or more filers carry it, none carries exactly this name, or more filers match its words than the search lists. The closest filers are in `candidates` with their CIKs (the one that carries the name first). Nothing is guessed. |
| `not_form_d` | The filing exists and is another form. |
| `no_filings` | A known filer, or a valid search, without a Form D that matches. |
| `failed` | The SEC could not be read for this item; run it again. |
| `skipped` | Not processed, or not finished: the run stopped first (row cap, charge limit, free work allowance, the SEC unavailable, abort or timeout). |
| `limit_reached` | A cap stopped the run: `maxItems`, your maximum charge per run, or the free work allowance (see Limits). In a date search the message names the filing date the search had reached, so you can continue from there. A run row with this status and the key `freeRows` does not stop anything: it says how many status rows were counted instead of written. |
| `source_unavailable` | The SEC refused the run or did not answer; the run stopped asking. What was delivered before stays; the filings it was reading at that moment are not delivered and not charged. |
| `monitor_unavailable` | The monitor memory could not be used (for example another run holds it); nothing was read or charged. |

A real status row from the prefill run (shortened: `key` and `scrapedAt` left out):

```json
{"type": "status", "scope": "run", "status": "limit_reached", "message": "The row cap (maxItems 10) was reached; more filings of the window may match. Raise maxItems to get them. The search had reached filings dated 2026-10-01; continue with dateTo set to 2026-10-01 (that day may be delivered again in part).", "details": {"offeringsDelivered": 10, "oldestFilingDateReached": "2026-10-01"}}
```

The last row of every run is a free `type: "summary"` row with the counters (`searchRecords`, `filingsRead`, `filteredOut`, `offerings`, `issuersAmbiguous`, `issuersNotChecked`, `statusRowsNotWritten`, `freeWorkUnitsUsed`, `freeWorkAllowance` and the rest), `coverage` (`today`, `from`, `to`, `complete`, `notRead`, `oldestFilingDateReached`, `limitedToMonitorHorizon`, `searchShortcut`), `stoppedBy`, `requests`, `monitor` and `billing`. `coverage.complete` is true only when the run was not stopped and every filing, search and lookup it had to read was read.

### How much does it cost to scrape SEC Form D filings?

You pay per Offering row delivered plus a small start fee per run. Status rows, person and broker rows, the offering history, the changes and the run summary are free.

| Event | FREE | BRONZE | SILVER | GOLD |
|---|---|---|---|---|
| Offering (one Form D or Form D/A filing delivered as a row) | $2.40 / 1,000 | $2.40 / 1,000 | $2.16 / 1,000 | $1.92 / 1,000 |
| Actor start (once per run) | $0.002 | $0.002 | $0.002 | $0.002 |

Platinum and Diamond plans pay the Gold price. The Actor start event is a flat fee with no tier discount, charged once per run whatever the run delivers (it is charged per GB of memory, and this Actor runs at 256 MB).

The Store pricing card shows these same prices per 1,000 events: "$2.40 / 1,000" on the Offering row means one offering costs 0.24 cents.

Worked examples (start fee included):

| Run | FREE and BRONZE | SILVER | GOLD |
|---|---|---|---|
| A search that finds nothing: $0.002 | $0.002 | $0.002 | $0.002 |
| 10 offerings (the prefill): $0.002 + 10 x $0.0024 | $0.026 | $0.0236 | $0.0212 |
| 100 offerings: $0.002 + 100 x $0.0024 | $0.242 | $0.218 | $0.194 |
| 1,000 offerings: $0.002 + 1,000 x $0.0024 | $2.402 | $2.162 | $1.922 |

What is free (no event other than the start fee): a filing that does not pass your filters, an unknown CIK or name, an ambiguous name, a filer without Form D filings, a filing that is not found or is not a Form D, an empty search, an invalid input value, a filing the same monitor delivered before, every status row and the run summary. Work that ends without an Offering is limited per run (see Limits, "Free work is limited"). With a monitor name a filing is charged once per monitor name, so a scheduled run that finds nothing new costs only the start fee. Rows are charged only after they are in your dataset, and your maximum charge per run is respected: offerings that do not fit are not delivered, and a free row says where the run stopped. A platform restart never delivers or charges an offering twice (the platform itself charges the start fee once more when a run is resurrected).

### Input

| Field | Default | What it does |
|---|---|---|
| `daysBack` | 7 (prefill 7) | How many days back from today (US Eastern time) the date search starts: 7 returns the filings of the last seven days and today. Used only when no start date is set. Weekends and US federal holidays have no filings. |
| `dateFrom` | empty | First filing date, `YYYY-MM-DD`. Overrides `daysBack`. For issuers the window is optional: without it their whole Form D history is returned. |
| `dateTo` | empty | Last filing date, `YYYY-MM-DD`. Empty means up to now. |
| `formTypes` | `all` | `all` (Form D and Form D/A), `new` (Form D only, the first notice of an offering) or `amendments` (Form D/A only). |
| `keyword` | empty | An exact phrase that must appear in the filing text, for example a person, a street or a city. Not case sensitive. Searched by EDGAR full-text search over the whole filing, related persons and brokers included. |
| `issuerName` | empty | Words that must all appear in the issuer's name as EDGAR lists it, for example `Capital Partners`. |
| `issuers` | empty | One company per line: a CIK (`2158073` or `CIK0002158073`) or the full legal name as EDGAR lists it (`TCIF Maple Fresno, LLC`; capitals, commas and dots do not matter). A name is used only when exactly one filer of Form D filings carries it; otherwise a free row lists up to 10 candidate filers with their CIKs. Returns the issuers' Form D and D/A filings, newest first across the list. The filters apply. |
| `filings` | empty | One filing per line: an EDGAR link (`https://www.sec.gov/Archives/edgar/data/2158073/000215807326000001/`) or an accession number (`0002158073-26-000001`). Filings given here are delivered as asked: the filters and the monitor do not apply to them. |
| `industryGroups` | none | Keep only these industry groups (Form D item 4), any of the 35 groups of the form, from Agriculture to Other. |
| `excludeInvestmentFunds` | `false` | Leave out filings whose industry group is Pooled Investment Fund, to see operating companies only. |
| `issuerStates` | none | Keep only issuers whose address in the filing is in these states or countries, as the SEC's two character codes: US postal codes (`CA`, `NY`, `TX`, `DE`) and EDGAR codes for other places (`E9` Cayman Islands, `A6` Ontario, `X0` United Kingdom). A full name such as `California` also works when it stands for one code. |
| `exemptions` | none | Keep only filings that claim at least one of these exemptions (Form D item 6): `04`, `04.1`, `04.2`, `04.3` (Rule 504), `05` (Rule 505), `06` (Rule 506), `06b` (Rule 506(b)), `06c` (Rule 506(c), general solicitation allowed), `46`, `4a5`, `3C` and `3C.1` to `3C.14` (Investment Company Act Section 3(c)). |
| `minOfferingAmount` | none | Keep only filings whose total offering amount is at least this many US dollars. Indefinite amounts do not pass; use `minAmountSold` to include them. |
| `minAmountSold` | none | Keep only filings that report at least this many US dollars sold. |
| `entityTypes` | none | Keep only issuers of these kinds (Form D item 1): `Corporation`, `Limited Partnership`, `Limited Liability Company`, `General Partnership`, `Business Trust`, `Other`. |
| `fundTypes` | none | Keep only pooled investment funds of these types (Form D item 4): `Hedge Fund`, `Private Equity Fund`, `Venture Capital Fund`, `Other Investment Fund`. A filing that is not a pooled investment fund has no fund type and does not pass. Cannot be combined with `excludeInvestmentFunds`. |
| `minInvestors` | none | Keep only filings that report at least this many investors who have already invested. |
| `onlyWithNonAccreditedInvestors` | `false` | Keep only filings that say securities were or may be sold to investors who are not accredited (48 of the 1,000 filings of our bulk test run). |
| `includePersonNames` | `true` | Related persons with their address, brokers and signers in the row. Turn off for company level rows: the people are left out and only counted. |
| `relatedPersonRows` | `false` | Adds one free `relatedPerson` row per related person. |
| `salesCompensationRows` | `false` | Adds one free `salesCompensationRecipient` row per broker or finder. |
| `includeOfferingHistory` | `false` | Adds every filing of the same offering (same SEC file number). |
| `includeChanges` | `false` | For an amendment: adds what changed against the filing it amends. |
| `maxItems` | 100 (prefill 10) | The most Offering rows this run may deliver and charge, 1 to 1,000,000. |
| `monitorName` | empty | Deliver only new filings: see below. |

Leave `issuers` and `filings` out of the input for a date search. When either key is present, the run looks up only those items and never widens into a search of recent filings; an empty list is a free `invalid` row. An input field this Actor does not know stops the run with a free row (it could be a filter under another name), except `proxyConfiguration` and `proxy`, which are ignored. Values outside a list of choices (form types, industry groups, exemption codes) are refused by the platform's input check before the run starts. There is no proxy setting, API key or login field.

#### Monitor: deliver only new filings

Give a name in `monitorName`, for example `weekly-biotech`, and schedule the run. Each filing is delivered and charged once per monitor name; later runs skip what the monitor already delivered, and a filing that failed the same filters before is not read again. The monitor applies to the date search and to issuers, not to filings given by number. A monitor looks back at most 45 days, and never further back than its memory reaches (entries leave it 60 days after their filing date): an older window start is moved to that day (a date search's summary says so in `coverage.limitedToMonitorHorizon`). Use a new name when you change the filters. Two runs on one monitor name at the same time do not share it: the second gets a free `monitor_unavailable` row and is charged no offering (two runs that start at the same moment may both be refused). With a monitor, issuers without new filings get no row and are not checked against the SEC's filer list, so a scheduled watch list stays quiet and cheap; a CIK that does not exist is therefore not reported in a monitored run (run a new list once without a monitor name to see such rows). The memory is a named key-value store this Actor creates in your account (its name starts with `sec-form-d-monitor-v1-`).

### Limits

- **Filings from 2008-09-17 on.** That is the date of the first Form D filed on EDGAR as XML data; older Form D filings were paper.
- **Filing dates are US Eastern business days.** A filing accepted after 17:30 Eastern carries the next business day as its filing date. The time of day of the acceptance is not delivered.
- **Indefinite amounts.** 54.2 percent of the recent sample (294 of 542) state an Indefinite total offering amount; it comes as `null` with `totalOfferingAmountIndefinite: true`, and such filings do not pass `minOfferingAmount`.
- **Free work is limited.** Work that ends without an Offering row earns nothing, so a run does a limited amount of it: 150 units, plus 150 for every offering it delivers. A filing that is read and fails your filters is 1 unit, a filing number that is not found 1, the check of a CIK without filings 1, a request of a company name lookup 4 (a name nobody carries takes two requests; a name that resolves and then delivers an offering costs nothing), a free status row about one input 2. In practice a run that delivers nothing reads at most 150 filings that fail the filters, or looks up 15 names nobody carries, or 50 filing numbers or CIKs that give nothing, and each offering delivered buys the same again. When the allowance is used up the run starts no more unpaid work and ends with a free `limit_reached` row (`stoppedBy: allowance`; in a date search it names the filing date reached); status rows it could not afford are counted in the summary (`statusRowsNotWritten`, `issuersNotChecked`). Filters on the industry group, the issuer state, the entity and fund type, the amounts, the investors and the fund exclusion need each filing read. Without a keyword, industry filters, and state filters on windows from 2012 on, are first narrowed by EDGAR's own search (a 30 day biotechnology search read 10 filings instead of 895 in our test). A shorter window, a keyword, an issuer name or an exemption filter helps.
- **Bare accession numbers.** An accession number starts with the number of whoever submitted the filing, and the SEC stores a filing under the CIK of its issuer. A bare number therefore works when the issuer filed for itself; a link to the filing always works. A bare number that an agent submitted for the issuer gets a free `not_found` row that asks for the link.
- **Company names** are looked up among the filers of Form D filings in EDGAR full-text search (which knows a filer from its first Form D on), by the plain words of the name; the SEC's company name lookup is asked only when that list was read to its end and no Form D filer carries the name, to tell a company without Form D filings from an unknown one. A name is used only when exactly one filer carries it and the list of filers whose names hold its plain words (up to 300 filings) was read to its end. Two names are the same when their letters, digits and plain words agree: capitals, commas and the way a legal form is written make no difference (`Twin Fund LP` and `Twin Fund, L.P.` are one name), but an initialism with and without dots is two names (`US Widgets Inc` and `U.S. Widgets Inc`), so write initialisms as EDGAR does. A name whose plain words match more than that, or that has no plain word (`A & B, L.L.C.`), is not used: you get a free `ambiguous` row with the closest filers and their CIKs. Measured on 2026-10-05 with the 977 distinct issuer names of 1,000 recent filings, sent as filed: 973 resolved to their own filer, 4 came back `ambiguous` with the right filer listed, none resolved to another filer. A name is looked up in every run, and a lookup whose issuer then delivers nothing counts as free work (4 units): for a scheduled watch list give CIKs (every row carries `issuerCik`), because a list of names with nothing new stops at the allowance after about 37 names. The name must be the full legal name as EDGAR lists it today: `Blackstone Property Partners` without `L.P.` is another name and gets the candidates. A CIK always works.
- **Offering history** reads an issuer's newest 300 Form D filings; `offeringHistoryTruncated` says when there were more.
- **Per run:** up to 5,000 issuers, 20,000 filings and 60 values per filter list; at most 200 status rows of one kind, and status rows about single inputs only as far as the free work allowance reaches (the rest are counted in the summary). Issuers are searched 100 at a time and their filings arrive newest first across each hundred, not issuer by issuer; when a cap stops a run inside a hundred, all issuers of that hundred get a `skipped` row.
- **Pace:** at most 5 requests per second. Requests go out from the run's own address; if the SEC refuses it three times in a row, the rest of the run goes through one Apify datacenter proxy session at the same pace, at no extra charge to you, and the summary says so.

### What this Actor does NOT do

- No investor names: a Form D gives the number of investors, not who they are.
- No e-mail addresses: a Form D carries none.
- No other sources: no news, no TechCrunch or Y Combinator data, no Crunchbase, no state business registries or city licences. One source, the SEC's Form D filings.
- No phone or e-mail verification and no lead scores.
- No AI summaries, buying intent or sales openers.
- No Form ADV data and no adviser matching for funds.
- No other SEC forms: a filing number of another form gets a free `not_form_d` row.
- No delivery connectors of its own (Notion, Supabase, Slack, a CRM): use Apify's integrations and webhooks on the dataset.
- No filter on the type of security, no filter on city, zip code or distance, no list of names to exclude, no lookup by stock ticker, no filter on a fund's strategy and no choice of sort order (rows come newest first). The fields are in the row: filter them in your own tool.
- No acceptance time of day: the filing date is delivered.
- No paper filings from before 2008-09-17.
- The issuer state filter judges the primary issuer's address in the filing, not EDGAR's company record and not the additional issuers.

### About the data

The data is the SEC's public Form D data as the filer submitted it, read from EDGAR with a declared User-Agent at half the SEC's published request rate. Amounts are in US dollars as the filer typed them. The people named in a Form D are public record; whoever contacts them is responsible for the rules on unsolicited calls and e-mail (for example the TCPA and CAN-SPAM in the US). This Actor is an independent tool. It is not affiliated with or approved by the U.S. Securities and Exchange Commission (SEC).

### API examples

Every run is also a Form D API call over the Apify API: send the input, read the rows.

curl (synchronous run, returns the rows):

```bash
curl -X POST "https://api.apify.com/v2/acts/automation_craft~sec-form-d-scraper/run-sync-get-dataset-items?token=YOUR_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"daysBack":7,"excludeInvestmentFunds":true,"minAmountSold":1000000,"maxItems":50}'
```

Node.js with `apify-client`:

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

const client = new ApifyClient({ token: process.env.APIFY_TOKEN });
const run = await client.actor('automation_craft/sec-form-d-scraper').call({
    daysBack: 7,
    industryGroups: ['Biotechnology', 'Pharmaceuticals'],
    maxItems: 50,
});
const { items } = await client.dataset(run.defaultDatasetId).listItems();
for (const row of items) if (row.type === 'offering') console.log(row.issuerName, row.issuerStateOrCountry, row.totalAmountSold, row.filingUrl);
```

Python with `apify-client`:

```python
import os
from apify_client import ApifyClient

client = ApifyClient(os.environ["APIFY_TOKEN"])
run = client.actor("automation_craft/sec-form-d-scraper").call(
    run_input={"issuers": ["2158073"], "includeOfferingHistory": True}
)
for row in client.dataset(run["defaultDatasetId"]).iterate_items():
    if row["type"] == "offering":
        print(row["accessionNumber"], row["formType"], row["filedAt"], row.get("totalAmountSold"))
```

### FAQ

#### Does a Form D show who the investors are?

No. A Form D gives the number of investors (`totalNumberAlreadyInvested`), whether any are non accredited (`hasNonAccreditedInvestors`) and how many (`numberNonAccreditedInvestors`), but not their names. The people it names are the issuer's executive officers, directors and promoters (`relatedPersons`), the brokers and finders paid for the offering (`salesCompensationRecipients`) and the signers.

#### Can I download all Form D filings in bulk?

Yes, by date window: set `dateFrom` and `dateTo` and a `maxItems` as high as you need (up to 1,000,000). Data starts at 2008-09-17, a run of 1,000 offerings took about three and a half minutes on the platform (207 to 217 seconds in five test runs), and the summary's `coverage` tells you whether the whole window was read; when a cap stops the run, the free row names the filing date to continue from.

#### How do I find companies that just raised money from Form D filings?

Search the last days with `daysBack`, turn on `excludeInvestmentFunds` to drop hedge, private equity and venture funds, and set `minAmountSold` to the size you care about. Add `monitorName` and schedule the run daily: each new filing is delivered and charged once, with the issuer's address and phone, the amount sold and the executives in the row.

#### What do the exemption codes 06b, 06c and 3C mean?

They are the federal exemptions a filing claims (Form D item 6), delivered in `federalExemptions` with their names in `federalExemptionLabels`: `06b` is Rule 506(b), `06c` is Rule 506(c), under which general solicitation is allowed, and `3C.1` and `3C.7` are the usual private fund exclusions of Investment Company Act Section 3(c). Filter on them with `exemptions`.

#### Can I cold call or e-mail the people named in a Form D?

The names and addresses in a Form D are public record, and this Actor delivers them as filed. Whoever contacts them is responsible for the rules on unsolicited calls and e-mail, for example the TCPA and CAN-SPAM in the US. A Form D carries no e-mail addresses, and the phone number is the issuer's.

#### Why does this Actor run with limited permissions?

It runs with Apify's limited permissions, the least privilege level: it reads its input and writes only its own run's dataset, which it also reads back after a platform restart so no offering is delivered or charged twice. The one exception is the monitor: when you give a `monitorName`, it opens a named key-value store it creates itself (`sec-form-d-monitor-v1-...`) to remember which filings it delivered. It touches nothing else in your account.

### Changelog

See the Changelog tab of this Actor (CHANGELOG.md in the source).

### More data tools by Automation Craft

- [US New Business Registrations Scraper - LLC Leads](https://apify.com/automation_craft/us-new-business-registrations-scraper)
- [Bulk WHOIS & RDAP Domain Lookup: DNS, SSL](https://apify.com/automation_craft/domain-whois-rdap-lookup)
- [Google News Scraper: Search, Topics, Decoded URLs](https://apify.com/automation_craft/google-news-scraper)
- [G2 Reviews Scraper: Ratings, Pros and Cons](https://apify.com/automation_craft/g2-reviews-scraper)
- [Google Trends Scraper - Compare and Trending Now](https://apify.com/automation_craft/google-trends-scraper)
- [Amazon Product Scraper - Search, Best Sellers](https://apify.com/automation_craft/amazon-data-scraper)

# Changelog

This Actor's version history is a separate document: https://apify.com/automation_craft/sec-form-d-scraper/changelog.md

# Actor input Schema

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

How many days back from today (US Eastern time) the search starts: 7 returns the filings of the last seven days and today. Used by the date search only, and only when no start date is set. When the field is left out, 7 is used. Weekends and US federal holidays have no filings.

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

First filing date of the window, YYYY-MM-DD, for example 2026-09-01. Overrides "Days back". Form D filings exist as data from 2008-09-17 on. For issuers (below) the window is optional: without it their whole Form D history is returned.

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

Last filing date of the window, YYYY-MM-DD. Leave empty for an open end (everything up to now). A filing accepted by the SEC after 17:30 Eastern time carries the next business day as its filing date.

## `formTypes` (type: `string`):

all: new notices (Form D) and amendments (Form D/A). new: only Form D, the first notice of an offering. amendments: only Form D/A, which update an earlier notice (new money raised, new related persons, the yearly renewal of a continuing offering).

## `keyword` (type: `string`):

An exact phrase that must appear in the filing text: an issuer name, a person, a street, a city, for example Sequoia or "Palo Alto". Not case sensitive. Searched by the full-text search of the SEC's EDGAR system, which covers the whole filing including related persons and brokers.

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

Words that must all appear in the issuer's name as EDGAR lists it, for example Capital Partners. Use "Issuers" below when you mean one exact company.

## `issuers` (type: `array`):

One company per line: its CIK (the SEC's filer number, for example 2158073 or CIK0002158073) or its full legal name as EDGAR lists it (for example "TCIF Maple Fresno, LLC"; capitals, commas and dots do not matter). A name is used only when exactly one filer of Form D filings carries it; otherwise you get a free row that lists the closest filers with their CIKs, never a guess. Returns the Form D and D/A filings of the issuers, newest first (all of them, or those inside the date window when one is set). The filters below apply. With a monitor name this is a watch list: only new filings are delivered.

## `filings` (type: `array`):

One filing per line: an EDGAR link to the filing (for example https://www.sec.gov/Archives/edgar/data/2158073/000215807326000001/) or an accession number (0002158073-26-000001). Links work for every filing; a bare accession number works when the issuer filed for itself, because the SEC stores a filing under the issuer's CIK. Filings given here are delivered as asked: the filters and the monitor do not apply to them.

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

Keep only filings whose industry group (Form D item 4) is one of these. The group is chosen by the filer.

## `excludeInvestmentFunds` (type: `boolean`):

Leave out filings whose industry group is "Pooled Investment Fund" (hedge, private equity and venture capital funds: more than half of all Form D filings). Turn on to see operating companies only.

## `issuerStates` (type: `array`):

Keep only filings whose issuer address is in one of these states or countries. Use the two character codes of the SEC: US postal codes for states (CA, NY, TX, DE), EDGAR codes for other places (E9 Cayman Islands, A6 Ontario, X0 United Kingdom). A full name such as California also works when it stands for one code.

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

Keep only filings that claim at least one of these federal exemptions (Form D item 6). 06b is Rule 506(b), 06c is Rule 506(c) (general solicitation allowed), 3C.1 and 3C.7 are the usual private fund exclusions.

## `minOfferingAmount` (type: `integer`):

Keep only filings whose total offering amount is at least this many US dollars, for example 1000000. Filings with an "Indefinite" offering amount (common for funds) do not pass this filter; use the amount sold instead to include them.

## `minAmountSold` (type: `integer`):

Keep only filings that report at least this many US dollars already sold, for example 500000. The amount sold is always a number, also for funds.

## `entityTypes` (type: `array`):

Keep only filings whose issuer is one of these kinds of entity (Form D item 1), for example Corporation for operating companies organised as corporations.

## `fundTypes` (type: `array`):

Keep only pooled investment funds of these types (Form D item 4), for example Venture Capital Fund. Filings that are not a pooled investment fund have no fund type and do not pass. Cannot be combined with "Exclude pooled investment funds".

## `minInvestors` (type: `integer`):

Keep only filings that report at least this many investors who have already invested (Form D item 14), for example 10.

## `onlyWithNonAccreditedInvestors` (type: `boolean`):

Keep only filings that say securities were or may be sold to investors who are not accredited (Form D item 14). About 5 in 100 filings do.

## `includePersonNames` (type: `boolean`):

Related persons (executive officers, directors, promoters) with their business address as filed, sales compensation recipients (brokers and finders) and the signer. They are part of the public filing. Turn off for company level rows with counts only.

## `relatedPersonRows` (type: `boolean`):

Adds one free row per related person (type relatedPerson), linked to its offering by accessionNumber, for a flat contact list in CSV or Excel. The persons stay nested in the Offering row as well.

## `salesCompensationRows` (type: `boolean`):

Adds one free row per broker or finder paid for the offering (type salesCompensationRecipient) with CRD numbers and the states of solicitation.

## `includeOfferingHistory` (type: `boolean`):

Adds the other filings of the same offering (same SEC file number): the first notice and every amendment with dates and links, how many there are and whether this filing is the latest. Costs one extra request per issuer and no extra charge.

## `includeChanges` (type: `boolean`):

For an amendment: reads the filing it amends and adds what changed (amount sold, offering amount, number of investors, related persons added or removed). Costs one extra request per amendment and no extra charge.

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

The most Offering rows this run may deliver (and charge). The search stops there and a free row says where it stopped. When the field is left out, 100 is used.

## `monitorName` (type: `string`):

Give a name, for example weekly-biotech, and schedule the run: each filing is delivered and charged once per monitor name, later runs skip what the monitor already delivered. A monitor looks back at most 45 days. Use a new name when you change the filters. Leave empty for a plain run.

## Actor input object example

```json
{
  "daysBack": 7,
  "formTypes": "all",
  "excludeInvestmentFunds": false,
  "onlyWithNonAccreditedInvestors": false,
  "includePersonNames": true,
  "relatedPersonRows": false,
  "salesCompensationRows": false,
  "includeOfferingHistory": false,
  "includeChanges": false,
  "maxItems": 10
}
```

# Actor output Schema

## `items` (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 = {
    "daysBack": 7,
    "maxItems": 10
};

// Run the Actor and wait for it to finish
const run = await client.actor("automation_craft/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 = {
    "daysBack": 7,
    "maxItems": 10,
}

# Run the Actor and wait for it to finish
run = client.actor("automation_craft/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 '{
  "daysBack": 7,
  "maxItems": 10
}' |
apify call automation_craft/sec-form-d-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,automation_craft/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/owRYTN5PotLAQ3LxA/builds/aAuxCrBH7SG6zT1L9/openapi.json
