# Form D Funding Leads: Private Placement Filings Feed (`fecklesspleb/form-d-funding-leads`) Actor

New Form D private-placement filings from the public SEC EDGAR archive: issuer, address, phone, industry, amount raised and sold, investor count, exemptions and named executives. Daily feed of startup and fund raises with dedupe, date range or by company. Not affiliated with the SEC.

- **URL**: https://apify.com/fecklesspleb/form-d-funding-leads.md
- **Developed by:** [Scott Williams](https://apify.com/fecklesspleb) (community)
- **Categories:** Lead generation, Business
- **Security:** Limited permissions
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

$4.00 / 1,000 form d 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

## Form D Funding Leads: Private Placement Filings Feed

Get new **Form D** filings (notices of exempt private offerings, such as startup rounds and fund raises) from the public SEC EDGAR archive as clean JSON, one record per filing. Run it daily for a feed of new private offerings, backfill a date range, or pull one company's history.

**At a glance:**

- Price: $4.00 per 1,000 filings, with no subscription. Unreadable filings and samples are free.
- Live data needs your contact e-mail (see below); without one you get 3 free sample filings.
- Export to JSON, CSV or Excel, or call it from the Apify API, Make, Zapier or n8n.

### Who it is for

- **Sales teams selling to newly funded companies** (payroll, HR, banking, insurance, office space, recruiting).
- **Fund administrators, placement agents, lawyers and auditors:** spot new funds and offerings in their region or industry.
- **Investors and researchers:** track private-placement activity by state, industry and size.

Each record has:

- issuer name, former names, entity type, state and year of incorporation
- business address and phone number as filed
- industry group, revenue or net-asset-value range, and whether it is a pooled fund
- total offering amount, amount sold, amount remaining, minimum investment
- date of first sale, investor count, number of non-accredited investors
- exemptions claimed, as the codes in the filing (Rule 506(b) is `06b`), sales commissions and finders' fees
- named executive officers, directors and promoters: name, city, state and role (optional)
- broker-dealers paid to sell the offering, with CRD numbers
- links to the filing and the XML document

Three modes:

- **Daily feed**: reads the newest EDGAR daily index files. With the default "only new" setting, a daily schedule returns only filings it has not returned before.
- **Date range**: backfill every weekday between two dates (up to 92 days per run).
- **By company**: the Form D history of up to 200 CIKs.

Filters (live mode only; sample records ignore them): issuer state or country, industry group, exclude pooled funds, minimum offering size, minimum amount sold, and include or skip amendments (D/A).

> Unofficial product, not affiliated with, approved or endorsed by the U.S. Securities and Exchange Commission. Data is public information from the SEC's EDGAR system; please cite the SEC as the source. Every record links to the original filing in `filingUrl`.

### Before you start: your contact e-mail (needed for live data)

The SEC asks automated tools to declare who they are in the User-Agent header. This Actor sends `FormDFundingLeads <your e-mail>`, so **enter a contact e-mail** where the SEC can reach you about your traffic to get live filings. There is no default and no built-in address. Placeholder domains such as example.com are refused: nothing is fetched and the run ends with one free invalid-input status row (see below). The address is a secret input: it is masked in the log and never written to the output.

**No e-mail = sample mode.** If `contactEmail` is missing or empty, the Actor makes **no requests to the SEC**, logs a warning asking you to add your e-mail, and returns 3 sample filings with `isSample: true`. They are real Form D filings from 2026-10-27 (ACES Diagnostics, 434 VC and an Ares infrastructure debt fund), bundled with the Actor. Sample records are **free**, your filters and the "only new" memory are not applied to them, and the run summary says `"sampleMode": true`. If you set filters (as the Store prefill does), the log, the status message and `filtersIgnoredInSampleMode` in the run summary name the filters that were ignored, and `samplesMatchingFilters` says how many samples would pass them (with the prefill: 0 of 3). Samples are not filtered so that a run without an e-mail always shows the record format.

### Input example

```json
{
  "contactEmail": "you@yourcompany.com",
  "mode": "daily_feed",
  "lookbackDays": 1,
  "states": ["CA", "NY", "TX"],
  "excludePooledFunds": true,
  "minTotalOffering": 1000000,
  "includeAmendments": false,
  "maxItems": 1000
}
```

Other inputs:

- `startDate`, `endDate` (date range mode); `ciks` (by company mode)
- `industryGroups`, e.g. `["Biotechnology", "Other Technology"]`, matched as words inside the filed value
- `minAmountSold`
- `onlyNewSinceLastRun`: `auto` (on for the daily feed), `yes` or `no`; `stateKey` keeps separate schedules apart
- `includeRelatedPersons`: default `true`; set `false` to leave out people entirely
- `maxItems` (default 1,000, cap 10,000), `maxFilingsChecked` (default 5,000, cap 20,000), `maxRequestsPerSecond` (default 5, cap 5)
- `debugLog` (default off): one log line per request to sec.gov (path, status, duration, requests started in the last second). Also on when the run's log level is DEBUG.

### Output example

One real filing (accession 0002039838-26-000005, filed 2026-10-27). The `relatedPersons` list is cut to one entry here; the filing lists five.

```json
{
  "accessionNumber": "0002039838-26-000005",
  "formType": "D",
  "isAmendment": false,
  "filedDate": "2026-10-27",
  "cik": "2039838",
  "listedCiks": ["2039838"],
  "issuerName": "ACES Diagnostics, Inc.",
  "previousNames": ["LYMESEQ, LLC"],
  "entityType": "Corporation",
  "jurisdictionOfInc": "DELAWARE",
  "yearOfInc": 2024,
  "address": {"street1": "4949 E LINCOLN DR., #5", "street2": null, "city": "PARADISE VALLEY", "state": "AZ", "stateDescription": "ARIZONA", "zip": "85253"},
  "phone": "(480) 235-1420",
  "industryGroup": "Other",
  "isPooledFund": false,
  "revenueRange": "Decline to Disclose",
  "exemptions": ["06b"],
  "dateOfFirstSale": "2026-10-22",
  "securitiesTypes": ["Equity", "Other"],
  "minimumInvestment": 0,
  "totalOfferingAmount": 8702366,
  "totalAmountSold": 7082529,
  "totalRemaining": 1619837,
  "offeringIndefinite": false,
  "hasNonAccreditedInvestors": false,
  "investorCount": 30,
  "salesCommissions": 0,
  "findersFees": 0,
  "signatureDate": "2026-10-26",
  "relatedPersonCount": 5,
  "relatedPersons": [
    {"firstName": "Tammy", "middleName": null, "lastName": "Crawford", "city": "Paradise Valley", "state": "AZ",
     "relationships": ["Executive Officer", "Director"], "relationshipClarification": null, "isEntity": false}
  ],
  "salesCompensationRecipients": [],
  "filingUrl": "https://www.sec.gov/Archives/edgar/data/2039838/000203983826000005/0002039838-26-000005-index.htm",
  "xmlUrl": "https://www.sec.gov/Archives/edgar/data/2039838/000203983826000005/primary_doc.xml",
  "parseError": null,
  "isSample": false,
  "source": "U.S. SEC EDGAR",
  "scrapedAt": "2026-10-29T02:20:18Z"
}
```

`isSample` is `false` for live filings and `true` only for the bundled samples described above. The full record (all fields) is in `sample_output.json`. A run summary (index days read, filings checked, filtered out, skipped as already seen, requests made, and `peakRequestsPerSecond`, the most requests started in any 1-second window) is saved as `RUN_SUMMARY` in the default key-value store. The same request count and peak are written to the log at the end of every run.

`revenueRange` and `aggregateNetAssetValueRange` come from the filing's issuer-size answer. Filers give one or the other, and pooled funds may give either: the real 434 VC fund filing reports `revenueRange` "Decline to Disclose", while the Ares Infrastructure Debt Fund VI filing reports `aggregateNetAssetValueRange` "Not Applicable". Empty answers that EDGAR writes as the word "None" are returned as null.

### Price

Pay per result: **$4.00 per 1,000 filings** ($0.004 per filing saved). No start fee. Filings removed by your filters are not charged. A filing whose document could not be read is saved with `parseError` set and is **free**. A filing that could not be downloaded because of a temporary SEC or network error (after retries) is not saved, not charged and not remembered, so the next run tries it again; the run summary counts it in `fetchErrors`. A live run that saves nothing (no filings in the window, nothing new since the last run, everything filtered out, only temporary download errors, or the SEC refusing requests) ends with one free status row instead of an empty dataset: `recordType: "status"`, `statusRow: true`, `status` "warning" or "error", `reason` (one of 7: `noMatches`, `noNewFilings`, `amendments`, `filteredOut`, `fetchErrors`, `stoppedBySec` or `costLimit`), the counts, and a `message` that starts with "Not charged:" and says which case it was. Sample records (`isSample: true`, returned when no contact e-mail is given) are free. Set a maximum cost per run and the Actor stops cleanly when it is reached: it starts a new filing download only while the remaining budget covers that filing plus every download already running ($0.004 each), so it does not download filings it cannot charge for. Even a $0.005 cap returns 1 filing.

For scale: the 2026-10-27 daily index had 137 Form D and 86 Form D/A rows, 221 distinct filings. Volume varies by day.

### FAQ and limits

- **How fresh is it?** EDGAR builds each day's index from about 10 p.m. ET, usually finishing within a few hours. Some filings submitted after 5:30 p.m. ET are released the next business day and appear in that day's index. A daily schedule at around 06:00 ET picks up the previous business day.
- **Speed.** At most 5 requests per second (half the SEC's published limit of 10 per second per user). A full day of filings needs roughly 350 requests, so about 75 seconds plus network time (estimated from offline tests). The SEC limit applies to you across all your tools, so do not run many copies at once.
- **What if today's index isn't out yet?** SEC publishes each daily index in the evening (ET) and answers 403 or 404 for it until then. The Actor treats that as "not published yet", not a block: it reads the most recent published business day instead, walking back up to 5 extra business days (weekends, holidays). RUN_SUMMARY lists these days in `indexDaysNotPublished`.
- **What if the SEC blocks traffic?** On HTTP 403 for a file SEC has published (checked against the quarter's index listing), or a rate-limit page, the Actor waits 60 s, then 120 s, then stops cleanly and keeps what it already saved. It never rotates IPs or disguises itself.
- **Invalid input.** If the input cannot be used (for example a placeholder or malformed `contactEmail`, an unknown `mode`, a bad date, a CIK that is not a number or a field of the wrong type), nothing is fetched and the run still ends SUCCEEDED with one free record `{"recordType": "status", "type": "status", "status": "error", "statusRow": true, "charged": false, "message": "Invalid input, nothing was fetched or charged: <reason>", ...}`. No filings are charged.
- **Amendments.** D/A filings are included by default with `isAmendment: true` and `previousAccessionNumber` when given.
- **Co-issuers.** A filing with several issuers is listed once in the index per issuer. This Actor returns it once (one charge), lists every CIK in `listedCiks`, and takes `cik` and the issuer details from the primary issuer in the document.
- **Pooled funds.** Venture, hedge and private-equity funds file a lot of Form Ds. `isPooledFund` flags them, and `excludePooledFunds` drops them.
- **People data.** Related persons are copied as filed: name, city, state and role. Street addresses of people are never included, and `includeRelatedPersons: false` leaves people out entirely. This Actor does not look up e-mail addresses or phone numbers of people. If you use the data for outreach, you are responsible for complying with CAN-SPAM, TCPA, GDPR and other laws that apply to you.
- **Not investment advice.** Form D is a notice filed by the issuer; the SEC does not review or approve the offering. Figures are as filed and may be amended later. Filings the SEC later removes from EDGAR may still appear in earlier runs.
- **Unknown fields.** If a future version of Form D adds fields, they appear under `extra` instead of being lost.
- **Not included:** Form C (crowdfunding), Regulation A, investor names (Form D does not list them), and enrichment from other sources.

# Changelog

This Actor's version history is a separate document: https://apify.com/fecklesspleb/form-d-funding-leads/changelog.md

# Actor input Schema

## `contactEmail` (type: `string`):

The SEC asks every automated client to declare who it is. Requests are sent with the User-Agent 'FormDFundingLeads <this e-mail>'. Use an address where the SEC can reach you about your traffic. Leave it empty to get a few free SAMPLE filings (isSample = true) without contacting the SEC. It is not stored in the output and is masked in the log. Placeholder domains such as example.com are refused. Stored as a secret input (encrypted).

## `mode` (type: `string`):

Daily feed reads the newest EDGAR daily index files. Date range reads every weekday index between two dates. By company reads each CIK's filing history.

## `lookbackDays` (type: `integer`):

How many of the most recent published daily index files to read. Weekends are skipped; holidays and not-yet-published days are skipped quietly.

## `startDate` (type: `string`):

First filing date (YYYY-MM-DD). Required in date range mode.

## `endDate` (type: `string`):

Last filing date (YYYY-MM-DD). Defaults to today. A run covers at most 92 days.

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

SEC Central Index Keys, with or without leading zeros (1 to 200).

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

Also return amended filings. Amendments have isAmendment = true.

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

Keep only issuers whose address uses one of these EDGAR state or country codes, e.g. CA, NY, TX, or A6 for Ontario. Empty = all.

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

Keep only filings whose industry group contains one of these words, matched case-insensitively against the value in the filing, e.g. 'Biotechnology', 'Technology', 'Real Estate'. Empty = all.

## `excludePooledFunds` (type: `boolean`):

Drop venture, hedge, private equity and other pooled funds so that only operating companies remain.

## `minTotalOffering` (type: `integer`):

Drop filings with a smaller total offering amount. Offerings marked 'Indefinite' are kept.

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

Drop filings that report less than this amount already sold.

## `onlyNewSinceLastRun` (type: `string`):

Remembers the accession numbers already returned (per state key) so that scheduled runs only return new filings.

## `stateKey` (type: `string`):

Use a different key for each separate schedule so that their 'already returned' lists stay apart. Letters, digits, - and \_.

## `includeRelatedPersons` (type: `boolean`):

Names, city, state and roles of the executives, directors and promoters listed on the filing. Street addresses of people are never included.

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

Stop after this many filings are saved.

## `maxFilingsChecked` (type: `integer`):

Upper bound on filing documents downloaded in one run, including ones your filters drop.

## `maxRequestsPerSecond` (type: `integer`):

Request rate to sec.gov. Capped at 5, half the SEC's published limit of 10 per second.

## `debugLog` (type: `boolean`):

Write one log line per request to sec.gov: path, status, duration and how many requests started in the last second. Also turned on when the run's log level is DEBUG. The run summary always includes peakRequestsPerSecond.

## Actor input object example

```json
{
  "mode": "daily_feed",
  "lookbackDays": 1,
  "startDate": "2026-10-27",
  "endDate": "2026-10-27",
  "ciks": [
    "2039838",
    "2162023"
  ],
  "includeAmendments": true,
  "states": [
    "CA",
    "NY"
  ],
  "industryGroups": [
    "Biotechnology",
    "Other Technology"
  ],
  "excludePooledFunds": true,
  "minTotalOffering": 1000000,
  "minAmountSold": 250000,
  "onlyNewSinceLastRun": "auto",
  "stateKey": "default",
  "includeRelatedPersons": true,
  "maxItems": 100,
  "maxFilingsChecked": 5000,
  "maxRequestsPerSecond": 5,
  "debugLog": false
}
```

# Actor output Schema

## `filings` (type: `string`):

No description

## `summary` (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 = {
    "mode": "daily_feed",
    "lookbackDays": 1,
    "includeAmendments": true,
    "states": [
        "CA",
        "NY",
        "TX",
        "MA"
    ],
    "excludePooledFunds": true,
    "minTotalOffering": 1000000,
    "includeRelatedPersons": true,
    "maxItems": 100
};

// Run the Actor and wait for it to finish
const run = await client.actor("fecklesspleb/form-d-funding-leads").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 = {
    "mode": "daily_feed",
    "lookbackDays": 1,
    "includeAmendments": True,
    "states": [
        "CA",
        "NY",
        "TX",
        "MA",
    ],
    "excludePooledFunds": True,
    "minTotalOffering": 1000000,
    "includeRelatedPersons": True,
    "maxItems": 100,
}

# Run the Actor and wait for it to finish
run = client.actor("fecklesspleb/form-d-funding-leads").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 '{
  "mode": "daily_feed",
  "lookbackDays": 1,
  "includeAmendments": true,
  "states": [
    "CA",
    "NY",
    "TX",
    "MA"
  ],
  "excludePooledFunds": true,
  "minTotalOffering": 1000000,
  "includeRelatedPersons": true,
  "maxItems": 100
}' |
apify call fecklesspleb/form-d-funding-leads --silent --output-dataset

```

## MCP server setup

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

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/GOx9KQhnpERewUV9l/builds/9cKSCeniCuToJ3iRe/openapi.json
