Skip to content

About

Open dataset of US startup raises and venture funds from SEC Form D filings, with AI tagging and a static dashboard

Resources

Stars

0 stars

Watchers

0 watching

Forks

Repository files navigation

Form D Private Capital Tracker

An open dataset of every SF Bay Area and Los Angeles private raise filed with the SEC on Form D since 2019, rebuilt from the SEC's free quarterly data sets, plus a static dashboard (Observable Framework, DuckDB in the browser) for GitHub Pages. Total cost: $0.

Where it runs

Nothing needs to run on your own computer. A GitHub Actions workflow (.github/workflows/refresh.yml) runs daily at 09:00 UTC, or on demand from the Actions tab, and does the following:

  1. Rebuilds the database from the SEC.
  2. Checks new companies' homepages for AI evidence (up to 3 hours per run).
  3. Sends ambiguous homepages to Claude through the Batches API, up to CLAUDE_MAX_USD of estimated spend per run (default $10); the rest wait for later runs.
  4. Commits the small data/enrich/ results back to the repo.
  5. Loads BigQuery through keyless Workload Identity Federation.
  6. Publishes the website to GitHub Pages.

The nationwide AI pass finishes over a few daily runs; after that each run only handles new filings.

Repository settings it relies on:

  • Secrets: SEC_USER_AGENT, ANTHROPIC_API_KEY (scripts/set-secret.sh sets one from a TextEdit window, or use Settings → Secrets → Actions)
  • Variables: BQ_PROJECT, GCP_WIF_PROVIDER, GCP_SA_EMAIL, optional CLAUDE_MAX_USD
  • Pages: source set to GitHub Actions

The Google service account can write only to the formd dataset and run BigQuery jobs.

Scope

  • Data: every Form D filed in the US since 2019.
  • Up close: ten metros, defined by county in config/geo.yaml: SF Bay Area, New York City, Los Angeles, Boston, Seattle, Austin, Chicago, San Diego, Miami and Denver–Boulder.
  • Adding a metro: add its counties, a bounding box and a map view to geo.yaml, then rebuild. The site picks it up automatically.
  • Platform addresses: about 25,000 SPVs that file from a platform administrator's office are kept out of the metros (sql/28_platform_addresses.sql). AngelList's Belltower in Seattle alone files thousands. An address shared by 200+ issuers that are at least 80% SPV-named counts as a platform address.

Human review: the Label Desk

review/app/label-desk.html is published as a private Claude artifact. It shows one company at a time with links to its homepage and SEC filings. You answer first: "AI company?" or "fund or startup?". Only then does it reveal what the tool said and why, so the accuracy you measure isn't biased by the tool's answer. It keeps a running precision/recall, shows agreement when a second reviewer (shared as Contributor) labels the same items, and exports a CSV. To score the labels and feed them into the Methodology page:

uv run python -m pipeline.review import form-d-labels.csv
uv run python -m pipeline.review ai-score
uv run python -m pipeline.review score

Smaller sample. Labelling all 500 isn't needed. About 200 AI items (100 tagged AI, 100 not) and 50 fund/startup items give accuracy figures within about ±7 points. pipeline.review focus gives each Desk item a route. todo is a seeded random top-up to those targets. recheck is an earlier label to look at again (review/recheck.csv), shown first and blind. later is hidden from the Desk's "Needs you" view. Items left unanswered or marked "Can't tell" were removed from the sample at the reviewer's request (review/excluded.csv); they stay in the dataset, uncounted in scores.

Jev as a second labeller

Hand-labelling all 500 items isn't needed. pipeline/jev.py asks Jev (TypeSafe AI's decision model) the same question the reviewer answers, using the filing details and homepage text. Jev never sees the tagger's call. Claude can't play this role, because Claude is already the tagger's tie-break judge and would be grading itself.

Each item you haven't labelled gets a route:

  • disagree: Jev and the tagger differ. The Desk shows both calls and you pick.
  • low_conf: they agree, but Jev's confidence is below 0.8. You decide blind.
  • blind: a seeded random draw of confident agreements (40 AI, 10 fund/startup). You decide blind. This measures how often both are wrong together.
  • auto: a confident agreement. The shared answer counts as the label.

The Desk's "Needs you" view shows only the first three routes.

uv sync --group jev                             # the Jev SDK is optional since 2026-10-25
scripts/set-key.sh                              # saves TYPESAFE_API_KEY to .env, hidden
uv run python -m pipeline.jev run               # Jev's answers -> review/jev_labels.csv
uv run python -m pipeline.jev calibrate         # Jev vs your labels: trust it first?
uv run python -m pipeline.jev sweep             # review/sweep.csv with each item's route
uv run python -m pipeline.jev score             # tagger accuracy from your labels + auto

Result (2026-10-19): not used for labels. On the 134 hand-labelled AI items, Jev (jev-1.13.0) agreed with the reviewer 75% of the time and the tagger 83%. Jev found 34 of 63 AI companies. A rewritten prompt with examples, plus a probability cutoff, was tuned on a frozen half of those labels (review/jev_split.csv) and reached 90% there. On the held-out half it scored 82% against the tagger's 83%. Where the two confidently agreed, both were wrong 13% of the time. That error rate is too high to auto-accept labels, so the review samples stay hand-labelled.

Run it locally (optional)

cp .env.example .env          # put your name + email in SEC_USER_AGENT
uv sync
uv run python -m pipeline.build

The first build downloads about 100 MB (30 quarterly ZIPs plus the Census ZIP-to-county file), then fetches every Form D filed since the latest quarterly ZIP from EDGAR (about 16,000 XML files per quarter, roughly an hour). It never exceeds 5 requests/second and caches everything under data/cache/. Later builds fetch only new filings; --skip-download works fully offline.

Command What it does
uv run python -m pipeline.build download → EDGAR filings since the last ZIP → load → sql/*.sql → data checks
uv run python -m pipeline.daily fetch only the filings since the latest quarterly ZIP
uv run python -m pipeline.build --sql-only rerun the SQL layer on already-loaded raw tables
uv run python -m pipeline.checks data checks only
uv run python -m pipeline.lookup "Databricks" one issuer's offerings and filings, with EDGAR links
uv run python -m pipeline.verify_edgar compare the companies in review/spot_check.csv with EDGAR's live records
uv run python -m pipeline.review sample / score 100-row fund/startup/SPV review sample / score your labels
uv run python -m pipeline.review ai-sample / ai-score 400-company AI-tag sample / precision and recall from your labels
uv run python -m pipeline.jev run / calibrate / sweep / score Jev second labeller: answers, check against your labels, review routes, scores
uv run python -m pipeline.ai_tag AI evidence: YC directory, company homepages, local-model tie-break (writes data/enrich/)
uv run python -m pipeline.geocode map coordinates for SF/LA issuers (Census geocoder, ZIP-centroid fallback)
uv run python -m pipeline.adv Form ADV adviser files (exempt + registered), for matching fund managers
uv run python -m pipeline.bigquery publish 10 tables to BigQuery with the bq CLI (BQ_PROJECT/BQ_DATASET in .env)
uv run python -m pipeline.export site data (site/src/data/) and national downloads
npm --prefix site run dev / build preview / build the dashboard (site/dist/)
uv run pytest unit tests: amendment chains, name parsing, classification, AI tag, website layer

A full local refresh, start to finish:

uv run python -m pipeline.build          # SEC data -> database
uv run python -m pipeline.ai_tag         # needs Ollama + llama3.2:3b for the tie-break (optional)
uv run python -m pipeline.geocode
uv run python -m pipeline.adv
uv run python -m pipeline.build --sql-only
uv run python -m pipeline.export
npm --prefix site run build

Everything lands in one file, data/formd.duckdb.

Tables

Table Grain Notes
raw_* (6) as shipped by the SEC all text, plus source_quarter
load_manifest one per quarter quarterly ZIP or edgar_daily XML, and whether the quarter is complete
filings one per accession (D or D/A) typed; offering_id and link_method say how each filing joined its offering
offerings one per raise latest-filing amounts, first/last filing dates, days_open, fill_pct, flags, metro
filing_increments one per filing change in amount sold and investor count versus the prior filing in the same offering
issuers one per CIK latest address, county, metro, former names, EDGAR link
offering_class one per offering kind, vehicle_type, fund_bucket, fund_number, manager_key, security_class, is_startup_raise, plus the reason each rule fired
managers one per fund manager vehicle counts by type, highest fund number
fund_families one per fund parallel vehicles ("Fund I", "Fund I-A") collapsed; is_emerging
manual_overrides one per correction loaded from config/manual_overrides.csv
issuer_people, people one per person per issuer / per person names and roles from Form D; repeat founders, startup execs who later run VC funds, platform staff
capital_momentum one per venture-stage startup 0–100 capital score from recency, step-up, pace, fill speed, investors (percentiles within peer group)
ai_signals, ai_tags evidence rows / one per CIK every AI signal with its source; the resulting tier
yc_matches, company_domains, web_signals, llm_labels, geocodes enrichment loaded from data/enrich/*.parquet (committed snapshots of slow third-party lookups)
zip_county, metro_counties lookups Census 2020 ZCTA → county; metros from config/geo.yaml

Methodology decisions (so far)

Offerings, not filings. A D/A's previous-accession field usually points at the previous amendment, not the original (86k of 135k resolvable pointers), so we walk the whole chain back to the root. The original D's accession becomes offering_id.

  • Chains that leave the 2019+ window keep the out-of-window accession as their id and are marked began_before_window. Use is_new_in_window when counting new raises, or 2017 funds filing annual amendments will look like 2023 raises.
  • External chains that enter the window at different points are merged on (CIK, first-sale date).
  • A D/A with a broken pointer falls back to an earlier D from the same CIK with the same first-sale date, then the same offering amount within 18 months. As of 2026-10-26 no filing needs this: the 102 that used it were long chains cut off by the old 50-step walk limit (see docs/audit-2026-10-26-sec-links.md).
  • D/As that still can't be linked stay as orphan offerings (0 as of 2026-10-26).
  • Hand-typed previous-accession numbers with dropped zeros ("001104659-21-005765") are padded back to 10-2-6 digits before the walk.
  • Some issuers file the same original D twice. A new offering that matches an earlier one from the same CIK on first-sale date, offering amount and amount sold, filed within 7 days of the previous copy, gets duplicate_of (the earliest copy) and is left out of new-raise counts. Empty filings (no amount, nothing sold) never collapse. 541 offerings ($4.4B sold) collapse this way; the rows stay in the tables.
  • "Raised" is the latest TOTALAMOUNTSOLD, never a sum. Decreases are kept and flagged as corrections.

Geography. The issuer's latest principal-office ZIP maps to a county, using the county that holds most of the ZIP's land area. Typo'd or PO-box ZIPs fall back to the county most issuers in the same city resolve to (at least 5 issuers, 80% agreement), then to the dominant county of the 3-digit ZIP prefix. geo_method records which rule placed each issuer. To add a metro, add its county FIPS codes to config/geo.yaml.

Flags, not deletions. Offerings at or above $100B (flag_implausible, e.g. typed "$1 trillion sold") and sold-amount decreases are flagged and kept.

Freshness. The SEC's quarterly ZIPs lag by a quarter. For any quarter without a ZIP, the pipeline reads EDGAR's form index, fetches each filing's primary_doc.xml, and writes it in the quarterly layout, so both sources go through the same SQL. When the ZIP for that quarter is published, it replaces the XML-built rows. On 400 filings present in both sources, the parsed XML matched the ZIP on every offering field (amounts, dates, exemptions, previous-accession pointers, security types). One difference favours the XML: the ZIP's RELATEDPERSONS table copies one person's middle name and second street line onto everyone else in the same filing. So people are matched on first and last name only.

Fund or company. An offering is a fund if any of these hold: the issuer picked the industry "Pooled Investment Fund", ticked pooled-fund interests, claimed an Investment Company Act 3(c) exclusion, or has a vehicle name ("a Series of", "SPV", "Syndicate", "Co-Invest", "– Series 4"). The name rule catches SPVs filed under other industries, such as "Anthropic – a Series of Aurum VP Fund LLC", filed as "Other". Of the rest, real estate industries become real_estate and "Investing" becomes other_investing, unless the issuer is a corporation: fintech startups such as FalconX file as "Investing". A non-corporation with a whole-word "Fund" in its name ("Hyla Fund III, LLC", filed as "Other") is a fund, or other_investing under oil, gas and energy industries (drilling and royalty programs); this moved 1,069 offerings to funds and 253 to other investing. Everything else is an operating_company. rule_kind and rule_vehicle_type keep what the rules said before hand overrides, so Methodology can grade the rules themselves. is_startup_raise keeps operating companies selling equity or a SAFE/convertible (SAFEs usually appear as "option" or "other: SAFE").

SPV or blind pool. Among funds, vehicle names decide:

  • spv: SPV/series/syndicate names, or a single deal in parentheses ("OurCrowd (Investment in X)").
  • spv also covers deal-by-deal series: a manager that files 4+ distinct fund numbers within 12 months ("HCM G I" to "HCM G XX") isn't raising 20 funds.
  • spv also covers code families: 3+ vehicles whose names differ only by a short code, either a hyphenated prefix ("AL-D" / "CO-B" / "GW-E Ribbit Opportunity V, LLC") or, for LLCs, a trailing token ("FundersClub 6XV LLC", "Center15 Capital E LLC"). This beats a fund number. Roman numerals, vintage years, quarter classes ("Fund 8Q") and generic remainders ("ALF-III Capital Partners") don't count as codes.
  • blind_pool: a fund number ("Accel XIV", "Partners Four"), or a fund word or vintage year ("Fund", "Opportunity", "Seed", "2023"), or an AngelList rolling-fund quarterly class ("Ravikant Capital, LP - G2").
  • blind_pool also covers an LP named like a manager, with nothing after "Capital", "Ventures" or "Partners" ("Indus Valley Capital, LP"). SPVs are mostly LLCs or carry a deal word.
  • unclear: everything else; these go to review.

Vehicle rules, 2026-10-21. On the 35 hand-labelled funds, the code-family, rolling-fund and manager-named-LP rules lift SPV vs blind pool from 17 to 20 correct (49% to 57%; 21 if "CO-B Ribbit Opportunity V" is relabelled SPV like its "AL-D" sibling). With n = 35 that is indicative, not a measured rate. On all cached 2019–2025 fund filings they move about 1,250 rolling-fund classes and 1,370 LPs from unclear to blind_pool, and about 570 code-family vehicles to spv (160 of them from blind_pool). Rules tried and dropped: a "Fund" word inside a platform series ("Embedding VC Palm Springs Fund, a series of Decile SPV") would have flipped about 20,000 AngelList deal SPVs ("JU Fund I, a series of Unpopular VC"); a bare "Series N" is still SPV because most such names are per-deal series (EquityZen, AQR); offering duration and investor counts didn't separate the labelled SPVs from blind pools. Those labelled exceptions stay in manual_overrides.csv.

Nationally, 67% of new "Venture Capital Fund" filings since 2019 are named as SPVs or series vehicles. In SF/LA the share is about 29%, because the big SPV platforms (AngelList-style series LLCs) file from Delaware addresses and fall outside both metros. Counting raw VC filings would still overstate new SF/LA funds by 1.4x–1.6x (3.0x–3.5x nationally).

Accuracy, 2026-10-22. With the hand overrides switched off, the rules alone get 20 of the 35 labelled funds right. Of the 12 misses among rule-funds, 5 call a blind pool an SPV and 2 the reverse, and 4 of the 5 left unclear are blind pools. So the site reports the overcount as a range: the low end counts unclear vehicles as funds, the high end doesn't, and the truth is likely nearer the low end. Further name rules weren't added: at n = 35 they would be fitted to the sample.

Managers and emerging managers. manager_key is the fund name up to its fund number, minus vehicle words. For example, "Andreessen Horowitz Fund IX – AI Infrastructure, L.P." becomes "andreessen horowitz". Platform SPVs take the platform as manager ("X, a Series of Rhone VC" becomes "rhone vc"). Names that start with letters and digits keep them ("n2 Venture Capital" becomes "n2 venture capital"). Generic stems ("capital partners") are not merged across CIKs. Parallel vehicles with the same manager and fund number (or vintage year) form one fund family. A family is emerging if it is Fund I–III; for unnumbered funds, if the manager has at most two earlier families in the data. The Fund I–III cutoff is our choice, matching common LP usage, and data that starts in 2019 can't see older funds.

Form ADV. Fund managers are matched to the SEC's monthly adviser files (exempt reporting and registered advisers that report private funds) on the same name stem. Adviser words ("Management", "Advisors", "GP") are dropped, so "Kindred Ventures Management, LLC" becomes "kindred ventures". Ties go to the adviser with a California office, then the one with the most private funds, and one-word stems match only California advisers. Each match adds:

  • whether the adviser claims the venture-capital fund exemption (Form ADV 2B(1))
  • its private-fund count and their gross assets
  • the date it began reporting to the SEC

388 of 2,469 SF/LA venture managers match. Most emerging managers rely on state exemptions, or file under a name unlike their funds'.

Hand corrections. config/manual_overrides.csv (cik, offering_id, field, value, note) can set kind, vehicle_type, fund_bucket, manager_key or metro. Leave offering_id blank to apply a row to every offering of that CIK. Overrides apply last, and every edited offering lists the fields in overridden_fields.

Determinism. Every "pick the latest" step breaks ties on accession number, so identical inputs always produce identical tables.

BigQuery

uv run python -m pipeline.bigquery loads 10 tables into BQ_PROJECT:BQ_DATASET (default dataset formd) with the Google Cloud bq CLI. The tables are offerings, issuers, filings, filing_increments, fund_families, managers, people, issuer_people, capital_momentum and ai_signals.

  • Every run replaces every table, so the dataset always mirrors the latest build.
  • NULLs are stripped from list columns, because BigQuery arrays can't hold them.
  • A query on the BigQuery copy reconciles exactly with DuckDB: 285,868 offerings and $26,526,160,695,836 sold.

The target is the project in the BQ_PROJECT repository variable (shown as YOUR_PROJECT below), dataset formd. That project has no billing, so it runs in the free BigQuery sandbox, where tables expire 60 days after each load. The daily workflow reloads them, so they stay live as long as it runs.

-- example: AI share of SF startup raises by year
select extract(year from first_filed) as yr, count(*) as raises, countif(is_ai) as ai
from `YOUR_PROJECT.formd.offerings`
where is_startup_raise and is_new_in_window and metro = 'sf_bay'
group by yr order by yr

Data checks

Each build fails if:

  • a raw filing is lost
  • an accession is duplicated
  • a filing date fails to parse
  • a filing has no offering
  • dollar totals differ between the filing and offering layers
  • a duplicate original is still counted as new, or points at a missing offering, another duplicate or a different CIK

It warns on:

  • orphan amendments at 1% or more
  • offerings spanning several CIKs
  • flagged amounts
  • quarter-over-quarter swings above 20%, except explained ones listed in KNOWN_SWINGS in pipeline/checks.py (2021 Q1, the 2021 boom), which print as PASS with the reason
  • California issuers with no county
  • unclear SF/LA VC vehicles at 20% or more
  • override rows that match no CIK or offering

Classification checks fail the build if any offering lacks a kind, or any fund lacks a vehicle_type or manager_key.

Status

  • Week 1: download, load, filings → offerings, data checks
  • Week 1 gate, automated: pipeline.verify_edgar compares the spot-check companies with EDGAR
  • Week 2: EDGAR filings since the latest quarter; fund vs startup, SPV, managers, emerging managers
  • Week 2 gate: 47 classification rows reviewed (fund vs company 91% right; SPV vs blind pool 20/35 by rules alone, reported as a range on the site)
  • Week 3: AI tagging in four layers (name, YC directory, homepage text, quote-verified model tie-break)
  • Week 3 gate: 205 AI items labelled (precision 83%, weighted recall 66%)
  • Week 4: dashboard (site/), map, coverage-gap study, downloads, daily GitHub Actions refresh
  • Published: https://lbb2005.github.io/formd-tracker/ (homepage AI checks cover 89–97% of startups in every metro)
  • Findings page (site/src/findings.md): the four takeaways, figures as of October 2026

Why not Evidence.dev: the plan named Evidence, but its open-source build is deprecated. The template now prints "npm run build is deprecated" and points to the hosted Evidence Studio CLI. Observable Framework does the same job: Markdown pages, SQL over Parquet with DuckDB in the browser, and a static build for GitHub Pages. It's open source (ISC) and maintained.

Week 1 spot check (run 2026-10-02: all match)

uv run python -m pipeline.verify_edgar checks every company in review/spot_check.csv.

  • With a CIK: it confirms that every D and D/A EDGAR lists in our date range is in the database, and nothing else.
  • Without a CIK: it searches EDGAR's full registrant list (cik-lookup-data.txt) for names starting with the company name, separates SPV/fund vehicles from possible operating entities, and checks each candidate's whole EDGAR history for a Form D. That distinguishes "never filed" from "our pipeline dropped it". Databricks and Harvey AI serve as positive controls.
Company EDGAR vs ours
Databricks 15 = 15 filings → 14 offerings
Figma 5 = 5 → 5
Notion Labs 3 = 3 → 3
Harvey AI 6 = 6 → 6
Vercel 1 = 1 → 1
Ramp Business Corp 12 = 12 → 12 (NY address, outside both metros)
Perplexity AI 1 = 1 → 1 ($28.8M; it has announced far more)
Replit 1 = 1 → 1 ($0.3M; it has announced far more)
Anthropic no operating entity on EDGAR; 34 SPV/fund vehicles named after it
OpenAI no operating entity on EDGAR; 23 vehicles
Anduril Industries no operating entity on EDGAR; 2 vehicles
Scale AI no registrant of that name on EDGAR at all

This is the start of the "coverage gap" finding. The best-known AI companies don't file Form D under their own names, but dozens of SPVs buying their shares do. The pipeline hasn't lost anything; the gap is in the source.

AI tag (Week 3)

Definition, written before labelling: an AI company is one whose core product is an AI or ML model, or is built on one. Mentioning AI features does not qualify.

sql/40_ai_tag.sql turns evidence rows (ai_signals) into a tier:

  • strong: strong signals from two independent sources
  • likely: one strong signal
  • possible: weak signals only

Layer 1, names. Strong name signals:

  • a whole-word "AI" or "A.I."
  • a ".ai" name ("Nowcasting.ai")
  • a CamelCase suffix ("RelationalAI"); a lowercase "ai" ending is ignored, which keeps Ikigai and Elevai out
  • the phrases artificial intelligence, machine/deep learning, LLM, GPT, agentic

Weak signals are "neural", "cognit-" and "intelligence". Former names count, which catches renames to and from AI names.

Layer 2, Y Combinator directory (public yc-oss mirror). A company is matched on a unique normalised name, then on a unique core name. AI-category tags are a strong signal, and the YC website gives a verified domain.

Layer 3, homepages. The universe is about 7,100 venture-stage SF/LA operating companies, excluding restaurants, energy, travel and similar industries. The domain comes from YC, or is guessed from the name (slug.com/.ai/.io/.co, get…, try…, …hq) and accepted only if the company's distinctive name token appears in the page title, description or headings, and the page isn't parked. Each page gets one polite request, with robots.txt respected and a cache of 90 days. Scoring:

  • strong: AI terms in the hero (title, meta description, top headings), six or more in the body, or a .ai domain known to be the company's own (from YC, or the name itself says AI).
  • weak: body mentions only, or a guessed .ai domain.

Layer 4, model tie-break, for weak-only cases. In CI this is Claude Opus 5.5 through the Message Batches API (pipeline/claude_judge.py, --judge claude, the default); locally it can be llama3.2:3b through Ollama (--judge ollama, $0). Either model answers yes/no/unclear and must quote the homepage phrase that shows the core product is AI. A "yes" counts only if that quote appears verbatim, as whole words, in the text sent and contains an AI term ("AI platform" doesn't verify against "OpenAI platform"). Without that check, the 3B model said "yes" to solar electronics, display optics and a breathing-test device; with it, those become "no" and real AI companies still pass. Earlier answers are reused from data/enrich/llm_labels.parquet, so CI runs without a model keep them.

An ai_tier row in manual_overrides.csv wins over every rule (strong | likely | possible | none). Funds get ai_theme instead of is_ai, as in "Benchmark AI Infrastructure Fund" (in fact two vehicles raised only to invest in Cerebras, so SPVs, but AI-themed all the same). Precision and recall come from your 400-row labelled sample (pipeline.review ai-sample); the Methodology page shows them once labelled.

Analysis caveats found so far

  • The AI tag looks backwards from today. Homepage, YC and model evidence describe a company as it is now, so a company that pivoted to AI in 2024 also counts as AI for its 2019 raise. ai_name_at_filing is the time-correct alternative: AI in the issuer name as filed on that raise. In SF, startup raises by AI-named companies went from 1.2% (2019) to 10.4% (2026). By current evidence the share went from 18.3% to 36.7%. Show both; the truth sits between them.

  • One issuer skews AI dollars. xAI is 40% of all SF startup dollars in 2026 ($16.6B of $41B). AI's dollar share is 75% with xAI and 58% without it. Before the homepage checks covered most companies, the share without xAI looked like single digits; with them, AI money is broad (Databricks, Baseten, Harvey and others). Every AI-share chart should still show both views, plus counts and medians.

  • Fund targets cluster on round numbers. $50M is the most common VC fund target, and the median lands on it every year. A third of new funds state "Indefinite". Report quartiles and the share left indefinite. Parallel vehicles often repeat the whole fund's target, so a fund family's target is its largest vehicle's target, not the sum.

  • Emerging-manager counts are biased upward early on. For unnumbered funds the rule counts earlier fund families in the data, and the data starts in 2019.

About

Open dataset of US startup raises and venture funds from SEC Form D filings, with AI tagging and a static dashboard

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages