# SEC Form D Funding Tracker (`xtracto/sec-formd-funding`) Actor

Track fresh US private-placement funding rounds from SEC EDGAR Form D filings. Surfaces who is raising capital, how much (offered, sold, remaining), the industry, and the executives, founders, and investors behind each raise. An open-data alternative to Crunchbase funding leads.

- **URL**: https://apify.com/xtracto/sec-formd-funding.md
- **Developed by:** [Farhan Febrian Nauval](https://apify.com/xtracto) (community)
- **Categories:** Lead generation, Other
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $4.00 / 1,000 results

This Actor is paid per event and usage. You are charged both the fixed price for specific events and for Apify platform usage.
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 Funding Tracker

Track fresh US private-placement funding rounds straight from the SEC's public EDGAR record. Every Regulation D capital raise in the United States files a **Form D** — this actor turns those filings into clean funding leads: who is raising, how much, in what industry, and the executives, founders, and investors behind the round.

It's an open-data alternative to paid funding databases like Crunchbase — no account, no API key, no cost per record.

### Why use this actor

- **No account, no login, no API key** — the data is public SEC record.
- **Real funding leads** — offering size, amount already sold, amount remaining, and minimum investment per raise.
- **The people behind the raise** — each filing's executives, directors, promoters, and fund managers, with names and addresses. This is the part paid databases charge the most for.
- **Search by keyword, industry, or browse everything** — full-text search (e.g. "artificial intelligence"), or list every Form D filed in a date window.
- **Filter by US state** — surface only raises by companies based in a given state (e.g. CA, NY, TX).
- **Clean, stable JSON** ready for a CRM, spreadsheet, database, or lead pipeline. Export to JSON, CSV, or Excel. Runs on Apify's schedule with automatic retries.

### How it works

1. You give it keywords (or leave them blank to browse everything) and a date window.
2. It searches the SEC's filing index for Form D filings that match.
3. For each filing it opens the full Form D document and pulls out the issuer, the offering amounts, the industry, and the related people.
4. It returns one tidy record per filing.

You don't manage any scrapers, browsers, or blocks — just set the inputs and run.

### Input

```json
{
  "keywords": ["software"],
  "startDate": "2026-06-10",
  "endDate": "2026-07-10",
  "stateCode": "",
  "fetchDetail": true,
  "maxItems": 100,
  "maxItemsPerQuery": 1000,
  "userAgentContact": "Jane Doe jane@company.com"
}
```

| Field | Type | Description |
| --- | --- | --- |
| `keywords` | array | Full-text terms to search (company name, industry, technology). Leave empty to browse **all** Form D filings in the window. Each keyword runs as a separate search. |
| `startDate` | string | Earliest filing date, `YYYY-MM-DD`. |
| `endDate` | string | Latest filing date, `YYYY-MM-DD`. |
| `stateCode` | string | Optional 2-letter US state of the issuer's business address (e.g. `CA`, `NY`, `TX`). Blank = all states. |
| `fetchDetail` | boolean | When on (default), enriches each filing with the full Form D document (offering amounts, industry, people). When off, returns only the fast index-level summary. |
| `maxItems` | integer | Maximum total filings to return across all keywords. |
| `maxItemsPerQuery` | integer | Maximum filings per keyword. A single search surfaces at most ~9,900 filings — narrow the date window for busier queries. |
| `userAgentContact` | string | The SEC asks every automated caller to identify itself with an app name and contact email. Set yours here. |

### Output

One record per Form D filing. Sample (a real raise, related people truncated to 2):

```json
{
  "_input": "software",
  "_source": "S2-formd-xml",
  "_scrapedAt": "2026-07-09T19:55:26Z",
  "accessionNumber": "0001955880-26-000001",
  "cik": "0001955880",
  "additionalCiks": [],
  "issuerName": "eMotive Software, Inc.",
  "filedDate": "2026-06-26",
  "formType": "D",
  "businessLocation": "Fort Worth, TX",
  "businessState": "TX",
  "stateOfIncorporation": "TEXAS",
  "sic": null,
  "filingUrl": "https://www.sec.gov/cgi-bin/browse-edgar?action=getcompany&CIK=1955880",
  "indexUrl": "https://www.sec.gov/Archives/edgar/data/1955880/000195588026000001/",
  "yearOfIncorporation": "2022",
  "entityType": "Corporation",
  "issuerAddress": {
    "street1": "2563 STADIUM DRIVE",
    "city": "FORT WORTH",
    "stateOrCountry": "TX",
    "zipCode": "76109"
  },
  "issuerPhone": "(817) 508-2838",
  "industryGroup": "Other Technology",
  "revenueRange": "Decline to Disclose",
  "isAmendment": "false",
  "dateOfFirstSale": "2026-06-16",
  "totalOfferingAmount": "2543750",
  "totalAmountSold": "250000",
  "totalRemaining": "2293750",
  "minimumInvestment": "0",
  "totalNumberAlreadyInvested": "2",
  "relatedPersons": [
    {
      "firstName": "William",
      "middleName": "Allen",
      "lastName": "Dobbins",
      "relationships": ["Executive Officer", "Director"],
      "address": { "city": "Fort Worth", "stateOrCountry": "TX", "zipCode": "76109" }
    },
    {
      "firstName": "Steven",
      "lastName": "Hall",
      "relationships": ["Director"],
      "address": { "city": "Fort Worth", "stateOrCountry": "TX", "zipCode": "76109" }
    }
  ],
  "search_source": { "…": "raw SEC index fields for this filing" }
}
```

| Field | Type | Description |
| --- | --- | --- |
| `accessionNumber` | string | Unique SEC accession number for the filing. |
| `cik` | string | The issuer's SEC company identifier (CIK). |
| `additionalCiks` | array | Any co-issuers on the same filing. |
| `issuerName` | string | Legal name of the company raising capital. |
| `filedDate` | string | Date the Form D was filed. |
| `formType` | string | `D` for a new filing, `D/A` for an amendment. |
| `isAmendment` | string | `"true"` if this filing amends a prior one. |
| `stateOfIncorporation` | string | Where the issuer is incorporated. |
| `industryGroup` | string | Industry category the issuer selected. |
| `totalOfferingAmount` | string | Total capital being raised. May be the literal `"Indefinite"` (common for funds). |
| `totalAmountSold` | string | Amount raised so far. |
| `totalRemaining` | string | Amount still on offer. |
| `minimumInvestment` | string | Minimum accepted per investor. |
| `revenueRange` | string | Issuer revenue band (often "Decline to Disclose"). |
| `dateOfFirstSale` | string | Date of the first sale in the raise. |
| `issuerAddress` | object | Street, city, state, ZIP of the issuer. |
| `issuerPhone` | string | Issuer contact phone. |
| `relatedPersons` | array | The executives, directors, promoters, and fund managers behind the raise — name, role(s), and address. |
| `businessLocation` | string | City/state of the issuer's business address. |
| `sic` | string | Standard Industrial Classification code, when present. |
| `filingUrl` | string | Human-readable SEC page for the issuer. |
| `indexUrl` | string | Direct link to the filing's document folder. |
| `search_source` | object | The raw SEC index record for the filing (nothing dropped). |

When `fetchDetail` is off, records carry only the index-level fields (`accessionNumber`, `cik`, `issuerName`, `filedDate`, `formType`, `businessLocation`, `stateOfIncorporation`, `sic`, links) and `_source` is `S1-efts-search`.

### Notes & limits

- **Contact identifier:** the SEC asks callers to identify themselves. Set `userAgentContact` to your name and email. The actor works out of the box, but using your own is good practice.
- **Volume ceiling:** a single search returns at most ~9,900 filings. If a keyword-free browse over a wide date range hits that ceiling, narrow the date window (e.g. run week by week) or add keywords. The actor logs when a ceiling is reached — it never silently truncates.
- **"Indefinite" amounts:** pooled investment funds often file `"Indefinite"` for the offering and remaining amounts — that's the real SEC value, passed through as-is.
- **Sparse fields:** issuers frequently leave optional fields blank (revenue, minimum investment, SIC code). Those come back as `null` rather than causing an error.
- **Amendments:** a `D/A` (amendment) updates an earlier raise — check `isAmendment` to separate new raises from updates.
- **Coverage:** US Regulation D private placements only. Public offerings and non-US raises are out of scope.

### Other actors in this collection

| Actor | What it does |
| --- | --- |
| US Customs Bill-of-Lading (ImportYeti) | US maritime import intelligence per company. |
| ThomasNet Suppliers | US industrial supplier and manufacturer profiles. |
| North Data Companies | European company registry and financial data. |

# Actor input Schema

## `keywords` (type: `array`):

Full-text keywords to search Form D filings (company name, industry, technology). Leave empty to browse ALL Form D filings in the date window. Each keyword runs as a separate search.

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

Earliest filing date (YYYY-MM-DD).

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

Latest filing date (YYYY-MM-DD).

## `stateCode` (type: `string`):

Optional 2-letter US state of the issuer's business address (e.g. CA, NY, TX). Leave blank for all states.

## `fetchDetail` (type: `boolean`):

Enrich each filing with the full Form D document: offering amount, amount sold/remaining, minimum investment, industry, and the executives/founders/investors behind the raise. Slower but far richer.

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

Maximum total filings to return across all keywords.

## `maxItemsPerQuery` (type: `integer`):

Maximum filings to return per keyword. A single search can surface at most ~9,900 filings; narrow the date window for busier queries.

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

The SEC asks every automated caller to identify itself with an app name and contact email. Set yours here, e.g. 'Jane Doe jane@company.com'.

## `proxyConfiguration` (type: `object`):

Optional. SEC EDGAR is public and needs no proxy; leave it off unless your network requires one.

## Actor input object example

```json
{
  "keywords": [
    "artificial intelligence"
  ],
  "startDate": "2026-06-10",
  "endDate": "2026-07-10",
  "fetchDetail": true,
  "maxItems": 100,
  "maxItemsPerQuery": 1000,
  "userAgentContact": "your-name your@email.com",
  "proxyConfiguration": {
    "useApifyProxy": false
  }
}
```

# Actor output Schema

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

Issuer Name. Boolean value.

## `filedDate` (type: `string`):

Filed Date as reported by the source.

## `formType` (type: `string`):

Form Type as reported by the source.

## `totalOfferingAmount` (type: `string`):

Total Offering Amount as reported by the source.

## `totalAmountSold` (type: `string`):

Total Amount Sold as reported by the source.

## `industryGroup` (type: `string`):

Industry Group as reported by the source.

## `businessLocation` (type: `string`):

Business Location as reported by the source.

## `stateOfIncorporation` (type: `string`):

State Of Incorporation as reported by the source.

## `filingUrl` (type: `string`):

Link to the filing.

## `_scrapedAt` (type: `string`):

UTC timestamp of the scrape, ISO 8601.

## `accessionNumber` (type: `string`):

Accession Number as reported by the source.

## `cik` (type: `string`):

Cik as reported by the source.

## `additionalCiks` (type: `string`):

Additional Ciks.

## `businessState` (type: `string`):

Business State as reported by the source.

## `sic` (type: `string`):

Sic as reported by the source.

## `indexUrl` (type: `string`):

Link to the index.

## `yearOfIncorporation` (type: `string`):

Year Of Incorporation as reported by the source.

## `entityType` (type: `string`):

Entity Type as reported by the source.

## `issuerAddress` (type: `string`):

Issuer Address. Boolean value.

## `issuerPhone` (type: `string`):

Issuer Phone. Boolean value.

## `revenueRange` (type: `string`):

Revenue Range as reported by the source.

## `isAmendment` (type: `string`):

Is Amendment. Boolean value.

## `dateOfFirstSale` (type: `string`):

Date Of First Sale as reported by the source.

## `totalRemaining` (type: `string`):

Total Remaining as reported by the source.

## `minimumInvestment` (type: `string`):

Minimum Investment as reported by the source.

## `totalNumberAlreadyInvested` (type: `string`):

Total Number Already Invested as reported by the source.

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

Related Persons.

## `search_source` (type: `string`):

Search source as reported by the source.

## `_input` (type: `string`):

The input value this row was produced from.

## `_source` (type: `string`):

Which extraction strategy produced the row.

## `_error` (type: `string`):

Set only on diagnostic rows - why that target produced no data.

# 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 = {
    "keywords": [
        "artificial intelligence"
    ],
    "startDate": "2026-06-10",
    "endDate": "2026-07-10",
    "stateCode": "",
    "userAgentContact": "your-name your@email.com"
};

// Run the Actor and wait for it to finish
const run = await client.actor("xtracto/sec-formd-funding").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 = {
    "keywords": ["artificial intelligence"],
    "startDate": "2026-06-10",
    "endDate": "2026-07-10",
    "stateCode": "",
    "userAgentContact": "your-name your@email.com",
}

# Run the Actor and wait for it to finish
run = client.actor("xtracto/sec-formd-funding").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 '{
  "keywords": [
    "artificial intelligence"
  ],
  "startDate": "2026-06-10",
  "endDate": "2026-07-10",
  "stateCode": "",
  "userAgentContact": "your-name your@email.com"
}' |
apify call xtracto/sec-formd-funding --silent --output-dataset

```

## MCP server setup

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

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/2IfrSWH5kU1Ajy48i/builds/Jn7mKb3vuXv017XqG/openapi.json
