# SEC Form D Funding Rounds & Startup Signals (`signalscouter/sec-form-d-funding-signals`) Actor

Every new SEC Form D filing as one clean row: issuer, industry, location, offering size, amount raised, investors, exemptions, securities and broker-dealers. Filter startups vs funds, monitor daily. Official SEC EDGAR data; executives' names off by default.

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

## Pricing

$3.00 / 1,000 filing results

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

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

## What's an Apify Actor?

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

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

## How to integrate an Actor?

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

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

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

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

# README

## SEC Form D Funding Rounds & Startup Signals

When a US company raises money privately (seed rounds, Series A–D, SAFEs, convertible notes, real-estate syndications), it usually has to file a **Form D** notice with the SEC within 15 days of the first sale. This Actor turns every new Form D into **one clean dataset row** using official SEC EDGAR data:

- **Who raised:** issuer name, CIK, entity type, state of incorporation, year of incorporation (for companies under 5 years old), city, state and business address.
- **How much:** total offering size, amount already sold, amount remaining, % sold, minimum investment, number of investors (and non-accredited investors).
- **What kind:** industry group and sector, security types (equity, debt, SAFE / "other", options), exemption claimed (Rule 506(b), 506(c), 504, …), date of first sale, and whether it's an amendment.
- **Who helped sell it:** broker-dealer / placement-agent firms, commissions and finders' fees, states of solicitation.
- **Links:** the EDGAR filing page, the source XML and the company's EDGAR page.

*By signalscouter.* This Actor is independent. It is not affiliated with or endorsed by the SEC.

### Who it's for

- **B2B sales teams:** "just raised money" is a classic buying trigger. Filter by industry, state and round size, then schedule a daily run.
- **VC and PE scouts, angels, lenders:** spot rounds early, often before any press release, including companies that never announce.
- **Recruiters:** a fresh raise usually comes before hiring. Pair this with our hiring-signal Actors.
- **Analysts and journalists:** the `MARKET_SUMMARY` record totals each window by sector, state and exemption, and lists the biggest raises.

### How it works

1. **Discovery.** For each day in your window, it reads the official **EDGAR daily form index**. For today (before the index is published at night), it uses **EDGAR full-text search**. Both list every Form D and D/A. They matched exactly on our test day: 218 = 218 filings for 19 Oct 2026.
2. **Parsing.** It fetches each filing's `primary_doc.xml` and parses it into typed fields. Amounts are numbers, "Indefinite" amounts are flagged, and exemption codes are translated into rule names.
3. **Filtering.** Applies your filters. By default it **excludes pooled investment funds** (hedge, PE, VC and other fund vehicles, about 55–65% of Form D filings) and **amendments**, so you get operating companies' new raises.
4. **Monitoring (optional).** With `onlyNew`, filings already seen are skipped, so a daily schedule only returns new ones. The memory is saved during the run, not only at the end.
5. **Watchlist mode.** If you give `ciks`, the Actor skips the market-wide index and reads each company's own SEC submissions file (`data.sec.gov/submissions/CIK##########.json`), so a 20-company watchlist costs about 20 requests plus one per matching filing. An unknown CIK gets a free `CIK_NOT_FOUND` row.
6. **Safe restarts.** Progress is saved every few rows and whenever Apify signals a migration, abort or state save. If a run is migrated to another server, restarted or resumed, filings it already delivered are skipped and **never charged twice**.

### Input

```json
{
  "daysBack": 3,
  "excludePooledFunds": true,
  "includeAmendments": false,
  "industrySectors": ["Technology", "Health Care"],
  "minAmountUsd": 1000000,
  "onlyYoungCompanies": false,
  "includeRelatedPersons": false,
  "onlyNew": true,
  "monitorId": "tech-health-1m",
  "userAgentContact": "you@yourcompany.com"
}
```

| Field | Default | What it does |
|---|---|---|
| `daysBack` / `dateFrom` / `dateTo` | 7 days ending today | Filing-date window, up to 92 days. Weekends and US federal holidays have no filings. |
| `excludePooledFunds` | true | Drops fund vehicles and keeps operating companies. |
| `includeAmendments` | false | Also outputs D/A amendments (annual updates and corrections). |
| `onlyYoungCompanies` | false | Only issuers incorporated within the last 5 years: the "startup" filter. |
| `minAmountUsd` / `maxAmountUsd` | – | Range for the total offering amount. "Indefinite" offerings never pass an amount filter. |
| `minAmountSoldUsd` | – | Minimum amount already raised. |
| `industrySectors` / `industryGroups` | all | Form D's own industry list (e.g. Technology › Other Technology, Health Care › Biotechnology). |
| `securityTypes`, `exemptions`, `states`, `ciks` | all | Filter by security type, exemption (`06c` or "Rule 506(c)"), issuer state, or a CIK watchlist. |
| `firstSaleWithinDays` | – | Only fresh rounds: first sale at most N days before filing. |
| `maxFilings` | 0 (no limit) | Stops after exactly N delivered filing rows (error rows don't count). |
| `includeIssuerContact` | true | The issuer's business street address and phone as filed. |
| `includeRelatedPersons` | **false** | Executives', directors' and promoters' names. See Personal data below. |
| `onlyNew` + `monitorId` | false | Monitoring memory, kept per monitor ID. Use a new ID when you change filters. |
| `marketSummary` | true | Writes the `MARKET_SUMMARY` record. |
| `userAgentContact` | – | Your contact email for the User-Agent sent to the SEC; replaces the default contact (see below). |
| `maxRequestsPerSecond` | 5 | Request rate cap. It can't be set above 8. |

### Output

One row per filing (`recordType: "filing"`). A real row from 19 Oct 2026, shortened:

```json
{
  "recordType": "filing",
  "accessionNumber": "0001620971-26-000002",
  "formType": "D",
  "filedDate": "2026-10-19",
  "issuerName": "Liqid Inc.",
  "cik": "1620971",
  "entityType": "Corporation",
  "jurisdictionOfIncorporation": "DELAWARE",
  "issuerCity": "Westminster",
  "issuerStateOrCountry": "CO",
  "industryGroup": "Other Technology",
  "industrySector": "Technology",
  "isPooledFund": false,
  "revenueRange": "Decline to Disclose",
  "exemptions": ["Rule 506(b)"],
  "dateOfFirstSale": "2026-05-12",
  "securityTypes": ["Equity"],
  "totalOfferingAmountUsd": 28450000,
  "totalAmountSoldUsd": 26950000,
  "totalRemainingUsd": 1500000,
  "percentSold": 94.7,
  "investorCount": 16,
  "brokerDealers": [],
  "relatedPersonCount": 8,
  "relatedPersons": null,
  "filingUrl": "https://www.sec.gov/Archives/edgar/data/1620971/000162097126000002/0001620971-26-000002-index.htm",
  "daysFromFirstSaleToFiling": 160
}
```

Dataset views:

- **Overview**
- **Offering details**
- **Issuer**
- **Funds** (when funds are included)
- **Related persons** (opt-in only)
- **Errors**

The key-value store holds `RUN_SUMMARY` (filings per day, skipped, filtered, delivered, charged, errors, SEC request count and peak request rate) and `MARKET_SUMMARY`.

**Error rows** (`recordType: "error"`) record anything that couldn't be processed. Examples: an invalid input value (`INVALID_INPUT`), a day whose index couldn't be read (`DISCOVERY_FAILED`), or a filing whose XML was missing or broken. They are **never charged**, and the rest of the run carries on.

### Personal data (GDPR / CCPA)

Form D is a public filing, but it names people: executives, directors and promoters (Item 3), the person who signed, and sometimes individual "finders" who were paid commissions. To keep your exposure low:

- **By default, no names of people are output.** `relatedPersons`, `signer` and `salesCompensationRecipients` are `null`; only `relatedPersonCount` is given. In the broker-dealer list, recipients that look like individuals are left out and counted in `individualRecipientCount`. We checked this on 1,163 real filings, comparing against roughly 3,600 related-person names, and found no person names in the default output.
- **With `includeRelatedPersons: true`,** you get names, roles, and city and state only. **Street addresses of people are never output**, even though the filing contains them.
- **Issuer business address and phone** (`includeIssuerContact`, on by default) are the company's contact details as filed. For very small companies this can be a founder's home address. Turn it off if you don't need it.
- If you enable people's data, you are the controller. Make sure you have a lawful basis (e.g. legitimate interest for B2B outreach), honour opt-outs, and don't keep data longer than you need.

### SEC access rules and terms

- **Official sources only:** the EDGAR daily index, EDGAR full-text search and the Form D XML in the EDGAR archives. No scraping of third-party sites, no logins, no proxies.
- **SEC fair-access policy:** the SEC asks automated tools to **declare a User-Agent with contact information** and stay **at or below 10 requests per second**. By default this Actor sends `signalscouter/1.0 (signalscouter.data@gmail.com)`. If you set `userAgentContact`, your email replaces that contact: `signalscouter/1.0 (you@yourcompany.com)`. It sends at most **5 requests per second** by default across the whole run, and never more than 8 even if you raise `maxRequestsPerSecond`. It also backs off on 403 or 429 responses.
- EDGAR data is US government information and not copyrighted. Your use of the data is your responsibility; this is not investment advice.

### Pricing

**$3.00 per 1,000 filings**, pay-per-event: one `filing-result` event ($0.003) for each filing row saved to the dataset. There is no start fee and no other charged event.

- **Charged:** each Form D filing row delivered to the dataset. When `includeAmendments` is on, an original filing (D) and each amendment (D/A) are **separate filings and are charged as separate rows**, even for the same company and offering.
- **Not charged:** error rows (bad input, unknown CIK, missing or unreadable filings), filings removed by your filters, amendments skipped because `includeAmendments` is off, filings skipped by `onlyNew` monitoring, filings already delivered before a restart or migration, filings not processed because of `maxFilings` or your spending limit, and the `RUN_SUMMARY` and `MARKET_SUMMARY` records.
- **Spending limit:** if you set a maximum cost per run, the Actor stops cleanly when it is reached. `RUN_SUMMARY.stoppedBy` tells you whether a run stopped at `maxFilings` or at the spending limit (`chargeLimit`).
- **Memory:** the default 256 MB is enough (test runs peaked at about 77 MB); more memory does not make it faster, because the SEC rate limit sets the speed.

### Limitations

- **A Form D is a notice, not a press release.** The offering amount is the issuer's target, and the amount sold may include earlier closings. Many issuers enter "Indefinite" (mostly funds) or "Decline to Disclose" for revenue.
- **Not every raise is filed,** and filings can come weeks or months after the first sale (see `daysFromFirstSaleToFiling`). Some companies file only once a round has closed.
- **There's no company website or domain:** Form D doesn't include one, and we use SEC sources only. Join on name, city and state if you need to enrich.
- **The year of incorporation** is only disclosed for companies under 5 years old; older ones just show `incorporatedWithinFiveYears: false`.
- **The fund vs operating-company split** depends on the industry group the issuer chose, which is self-reported. Some special-purpose vehicles and real-estate syndications file as "Other" or "Real Estate", not as funds.
- **Today's filings** come from EDGAR full-text search. Filings accepted after the evening cut-off may only show up the next business day.
- **The individual vs firm split** for sales-compensation recipients is a name heuristic. A firm with an unusual name may be counted as an individual and left out of `brokerDealers`.
- **Run time:** about 5 filings per second at the default rate cap. A busy week (about 1,500 filings, including funds that get filtered out) takes about 5–6 minutes.

### More signalscouter Actors

| Actor | What it gives you |
|---|---|
| [Career Site Jobs Scraper](https://apify.com/signalscouter/career-site-jobs-scraper) | Jobs from 12 ATSes (Greenhouse, Lever, Ashby, Workday, Workable and more) in one schema, from company domains |
| [Workday Jobs Scraper](https://apify.com/signalscouter/workday-jobs-scraper) | Jobs from any `myworkdayjobs.com` career site, including sites with more than 2,000 jobs |
| [UK Public Sector Jobs Scraper](https://apify.com/signalscouter/uk-public-sector-jobs-scraper) | NHS Jobs, Teaching Vacancies and DWP Find a Job |
| [Company Tech Stack & Domain Signals](https://apify.com/signalscouter/company-tech-stack-signals) | What a company's website runs on, plus DNS, email security and domain age |

### Changelog

- **0.1:** first version. Watchlist mode via SEC submissions files, progress saved for safe restarts, exact `maxFilings`, default rate 5 per second, default memory 256 MB.

# Actor input Schema

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

Calendar days to cover, ending today (US Eastern). Ignored when Date from is set. Weekends have no filings. Max 92.

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

First filing date (YYYY-MM-DD). Optional.

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

Last filing date (YYYY-MM-DD). Defaults to today; today's filings come from EDGAR full-text search until the daily index is published at night.

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

Drop hedge, private equity, venture capital and other fund vehicles (about 55–65% of Form D filings) and keep operating companies. Turn off to include funds.

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

Also output D/A amendments (about a third of filings). Off = new notices only.

## `onlyYoungCompanies` (type: `boolean`):

Keep issuers incorporated within the last five years (or not yet formed): the startup filter.

## `minAmountUsd` (type: `integer`):

Keep filings whose total offering amount is at least this. 'Indefinite' amounts never pass an amount filter.

## `maxAmountUsd` (type: `integer`):

Keep filings whose total offering amount is at most this.

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

Keep filings that have already sold at least this much.

## `industrySectors` (type: `array`):

Keep only these Form D industry sectors. Empty = all.

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

Keep only these Form D industry groups (finer than sectors). Empty = all.

## `securityTypes` (type: `array`):

Keep filings offering any of these. Empty = all.

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

Keep filings claiming any of these exemptions. Accepts codes (06b, 06c, 04, 3C.1, ...) or labels like 'Rule 506(c)'.

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

EDGAR state or country codes of the issuer's principal place of business, e.g. CA, NY, TX. Empty = all.

## `firstSaleWithinDays` (type: `integer`):

Keep only fresh rounds: first sale at most N days before the filing (or yet to occur).

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

Watchlist mode: only these issuers (SEC CIK numbers). Each company is read from its own SEC submissions file (data.sec.gov), so a watchlist run does not download the whole market. Other filters still apply. Empty = all issuers.

## `maxFilings` (type: `integer`):

Stop after delivering this many filings (0 = no limit).

## `includeIssuerContact` (type: `boolean`):

The issuer's business address and phone as filed. City, state and ZIP are always included.

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

Off by default. Form D publishes the names of executives, directors and promoters; turning this on adds their names, roles and city/state (never street addresses), the signer, and individual sales-compensation recipients. Personal data: only enable if you have a lawful basis to process it.

## `marketSummary` (type: `boolean`):

Save MARKET_SUMMARY (totals by sector, state and exemption plus the biggest raises) to the key-value store. Not charged.

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

Skip filings already output or filtered out in earlier runs with the same monitor ID. Use with a schedule (e.g. daily, Days back = 3). Skipped filings are not charged.

## `monitorId` (type: `string`):

Name for this monitor's memory. Use a different ID per filter set (changing filters under the same ID won't re-output filings already seen).

## `userAgentContact` (type: `string`):

Your contact email for the User-Agent sent to the SEC (SEC's fair-access policy asks automated tools to identify themselves with contact information). If set, it replaces the default contact: signalscouter/1.0 (you@yourcompany.com).

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

Global request-rate cap across the whole run. Default 5 per second; SEC allows up to 10 and this Actor never exceeds 8.

## Actor input object example

```json
{
  "daysBack": 3,
  "excludePooledFunds": true,
  "includeAmendments": false,
  "onlyYoungCompanies": false,
  "maxFilings": 50,
  "includeIssuerContact": true,
  "includeRelatedPersons": false,
  "marketSummary": true,
  "onlyNew": false,
  "monitorId": "default",
  "maxRequestsPerSecond": 5
}
```

# Actor output Schema

## `overview` (type: `string`):

One row per filing: issuer, industry, location, amounts, investors, exemptions and EDGAR link.

## `offering` (type: `string`):

Securities, amounts, minimum investment, investors, commissions, broker-dealers and solicitation states.

## `issuer` (type: `string`):

Issuer identity: CIK, entity type, incorporation, industry, revenue range and business address.

## `funds` (type: `string`):

Pooled fund filings (only present when excludePooledFunds is off): fund type, NAV range, amounts.

## `relatedPersons` (type: `string`):

Executives, directors, promoters and signers. Empty unless includeRelatedPersons is on.

## `errors` (type: `string`):

Rows that could not be processed (never charged).

## `runSummary` (type: `string`):

RUN_SUMMARY: filings discovered per day, skipped, filtered, delivered, charged, errors, SEC request count and peak request rate.

## `marketSummary` (type: `string`):

MARKET_SUMMARY: totals by industry sector, state and exemption plus the biggest raises among delivered filings (not charged).

# 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": 3,
    "maxFilings": 50
};

// Run the Actor and wait for it to finish
const run = await client.actor("signalscouter/sec-form-d-funding-signals").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": 3,
    "maxFilings": 50,
}

# Run the Actor and wait for it to finish
run = client.actor("signalscouter/sec-form-d-funding-signals").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": 3,
  "maxFilings": 50
}' |
apify call signalscouter/sec-form-d-funding-signals --silent --output-dataset

```

## MCP server setup

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

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/AkzuJps2XgQUvAInt/builds/98r7btbUPBHdq0vdl/openapi.json
