Seedlist for AI Agents
Structured investor data for AI agents helping founders raise money. No auth, no rate limits — just JSON.
579 investors · 179 firms · 337 startups
Quick Start
All endpoints return static JSON. No API key needed. Fetch with curl, Python, or any HTTP client. Data is rebuilt daily; check last_updated field on the root object for freshness.
Tip: For quick lookups by slug, use the lightweight /investor-lookup.json (~150KB). For full search/filter across all investors, use /enrichment-index.json (~400KB).
curl
curl -s https://seedlist.com/enrichment-index.json | python3 -m json.tool | head -50
Python
import json, urllib.request
# Load the full investor index
data = json.loads(urllib.request.urlopen("https://seedlist.com/enrichment-index.json").read())
# Find seed-stage fintech investors
# ⚠️ Always lowercase sector values before comparing
matches = [
inv for inv in data["investors"]
if "seed" in inv["stage_focus"]
and "fintech" in [s.lower() for s in inv["sector_focus"]]
]
for inv in matches[:5]:
# Use tldr for summaries; fall back to thesis_summary
summary = inv.get("tldr") or inv["thesis_summary"][:80]
# firm_name may be empty — fall back to firm slug
firm = inv["firm_name"] or inv["firm"]
print(f"{inv['name']} ({firm}) — {summary}")
See Data Notes at the bottom for field-level details and edge cases. Or read llms.txt for a machine-readable summary.
Endpoints
| Endpoint | URL | Description | Updated |
|---|---|---|---|
| Investor Index | /enrichment-index.json |
All investors and firms with stage, sector, check size, location, thesis summary (~400KB) | Every build |
| Investor Lookup | /investor-lookup.json |
Lightweight slug-keyed dictionary for O(1) investor lookups (~150KB) | Every build |
| Investor Graph | /investor-graph.json |
Co-investment relationships, firm memberships, startup founders | Every build |
| Startup-Investor Map | /startup-investor-map.json |
Which investors backed which startups, with round and year | Every build |
| Rounds Feed | /rounds-feed.json |
500 most recent funding rounds with company, date, amount, lead | Every build |
| Search Index | /search-index.json |
Searchable index of all investors, firms, and startups | Every build |
| Cluster Data | /cluster-data.json |
40 curated investor collections plus algorithmic clusters | Every build |
Common Tasks
1. Build a fundraising target list
Score investors by stage match (30pts), sector overlap weighted by specificity (40pts), recency (15pts), check size fit (15pts). Group into 3 tiers. Target: 10-20 in Tier 1, 15-30 in Tier 2.
import json, urllib.request
data = json.loads(urllib.request.urlopen("https://seedlist.com/enrichment-index.json").read())
my_stage = "seed"
my_sectors = ["fintech", "developer-tools"]
results = []
for inv in data["investors"]:
score, reasons = 0, []
# Stage match (30 pts)
if my_stage in inv["stage_focus"]:
score += 30
reasons.append(f"Invests at {my_stage}")
# Sector overlap (up to 40 pts) — weighted by specificity
# An investor with 3 sectors who matches > one with 15 sectors
inv_sectors = [s.lower() for s in inv["sector_focus"]]
overlap = [s for s in my_sectors if s in inv_sectors]
if overlap:
specificity = min(1.0, 5 / max(len(inv_sectors), 1))
sector_pts = int(min(40, len(overlap) * 15) * (0.5 + 0.5 * specificity))
score += sector_pts
reasons.append(f"Sectors: {', '.join(overlap)}")
# Recency (15 pts)
last = inv.get("last_active", "")
if last >= "2025": score += 15
elif last >= "2024": score += 8
if score >= 30:
tier = 1 if score >= 70 else 2 if score >= 45 else 3
results.append({
"name": inv["name"],
"firm": inv["firm_name"] or inv["firm"],
"tier": tier,
"why": "; ".join(reasons),
"tldr": inv.get("tldr", ""),
"url": f"https://seedlist.com/investors/{inv['slug']}.html",
})
results.sort(key=lambda x: x["tier"])
for r in results:
label = ["Strong fit", "Worth pursuing", "Stretch"][r["tier"] - 1]
print(f"[{label}] {r['name']} ({r['firm']}) — {r['why']}")
2. Find investors by comparable companies
Look up which investors backed similar startups. Important: deduplicate by slug per startup (investors appear once per round).
import json, urllib.request
from collections import defaultdict
data = json.loads(urllib.request.urlopen("https://seedlist.com/startup-investor-map.json").read())
comparables = ["stripe", "plaid", "brex"]
# Count unique startups per investor (not rounds!)
investor_companies = defaultdict(lambda: {"name": "", "companies": set(), "has_profile": False})
for slug in comparables:
# Deduplicate: one entry per investor per startup
seen = set()
for inv in data["startup_investors"].get(slug, []):
if inv["slug"] in seen or inv["slug"] == "independent":
continue
seen.add(inv["slug"])
entry = investor_companies[inv["slug"]]
entry["name"] = inv["name"]
entry["companies"].add(slug)
entry["has_profile"] = inv.get("has_profile", False)
results = sorted(investor_companies.values(), key=lambda x: -len(x["companies"]))
for r in results[:15]:
cos = ", ".join(r["companies"])
print(f"{r['name']}: backed {len(r['companies'])}/{len(comparables)} ({cos})")
3. Find warm intro paths to an investor
Trace co-investment and founder connections.
graph = requests.get("https://seedlist.com/investor-graph.json").json()
target = "ron-conway"
# Co-investors (people who frequently invest alongside the target)
co = graph["co_investments"].get(target, {})
for slug, info in sorted(co.items(), key=lambda x: -x[1]["count"])[:10]:
name = graph["investor_names"].get(slug, slug)
print(f"Co-investor: {name} ({info['count']} shared deals)")
# Firm colleagues
for firm_slug, firm in graph["firms"].items():
if target in firm["members"]:
print(f"Firm: {firm['name']} — colleagues: {firm['members']}")
# Portfolio founders who can intro
for startup_slug, backers in graph["startup_backers"].items():
if target in backers:
founders = graph["startup_founders"].get(startup_slug, [])
name = graph["startup_names"].get(startup_slug, startup_slug)
for f in founders:
print(f"Founder intro: {f['name']} ({f['role']} at {name})")
4. Enrich an investor CSV
Match names from a spreadsheet against Seedlist data.
import csv, io
data = requests.get("https://seedlist.com/enrichment-index.json").json()
# Build a name lookup (lowercase for fuzzy matching)
by_name = {}
for inv in data["investors"]:
by_name[inv["name"].lower()] = inv
# Your investor list
my_investors = ["Ron Conway", "Mike Maples", "Unknown Person"]
for name in my_investors:
match = by_name.get(name.lower())
if match:
print(f"MATCH: {match['name']} | {match['firm_name']} | "
f"Stage: {match['stage_focus']} | Sectors: {match['sector_focus']}")
else:
print(f"NO MATCH: {name}")
5. Track recent funding rounds
Get the latest rounds sorted by date.
rounds = requests.get("https://seedlist.com/rounds-feed.json").json()
# Latest 10 rounds
for r in rounds[:10]:
amt = r["amount"] or "undisclosed"
print(f"{r['date']} | {r['company']} | {r['round']} | {amt} | Lead: {r['lead']}")
Claude Skill
If you use Claude Code, you can install a Seedlist skill that teaches Claude how to query these endpoints for fundraising assistance.
Install
# Download the skill file
curl -o seedlist-skill.md https://raw.githubusercontent.com/ericries/seedlist/main/docs/seedlist-skill.md
# Add to your Claude Code project skills
cp seedlist-skill.md .claude/skills/seedlist-skill.md
Or add the URL directly as a custom skill in Claude Code settings. The skill teaches Claude to fetch Seedlist JSON endpoints and build investor target lists, find warm intro paths, and enrich investor CSVs.
Schema Reference
Root Object (enrichment-index.json)
investors array — All published investor profiles (see below)firms array — All published firm profilesqueued array — Investors/firms in the research pipeline (not yet profiled). Useful for "we know about X but don't have a profile yet."last_updated string — ISO timestamp of last build (e.g., "2026-03-25T09:00:00Z")Investor (enrichment-index.json → investors[])
One entry per published investor profile.
name string — Full name (e.g., "Ron Conway")slug string — URL identifier. Profile at /investors/{slug}.htmlfirm string — Firm slug (e.g., "sv-angel"). ⚠ This is a slug, not a display name.firm_name string — Firm display name (e.g., "SV Angel"). ⚠ May be empty — fall back to firm.role string — Role at firm (e.g., "Partner", "Founder")location string — Location (e.g., "San Francisco, CA")stage_focus string[] — Investment stages (e.g., ["pre-seed", "seed"]). Values are lowercase.sector_focus string[] — Investment sectors (e.g., ["fintech", "ai", "consumer"]). Values are lowercase.check_size string — Human-readable range (e.g., "$250K-$2M", "$5M+"). Parse with regex for numeric comparison.last_active string — Most recent verified investment date. ⚠ Format varies: "2025-11-15", "2025-03", "~2022", or empty.status string — Always "published" in this endpointtldr string — 2-4 sentence summary of who they are and what they invest in. Best field for presenting to founders. 95% populated.thesis_summary string — First 200 chars of LLM-inferred thesis from portfolio analysis. May be truncated mid-sentence — prefer tldr.Quick Lookup (investor-lookup.json)
Lightweight slug-keyed dictionary for O(1) investor lookups. ~150KB vs ~400KB for the full index. Use when you know the investor slug and just need basic info.
last_updated string — ISO 8601 timestamp of last buildcount number — Total number of investors in the lookupinvestors object — Slug-keyed dictionary. Each value:name string — Full namefirm string — Firm display name (or slug as fallback)tldr string — 2-4 sentence summarycheck_size string — Human-readable rangestages string[] — Investment stagessectors string[] — Investment sectorslast_active string — Most recent verified investment dateurl string — Path to full profile pageFirm (enrichment-index.json)
The firms array contains one entry per published firm profile.
name string — Firm nameslug string — URL identifier. Profile at /firms/{slug}.htmllocation string — Headquarters locationstage_focus string[] — Investment stagessector_focus string[] — Investment sectorsfund_size string — Fund size (e.g., "$100M")status string — Always "published"Funding Round (rounds-feed.json)
Array of up to 500 funding rounds, sorted by date descending.
company string — Company namecompany_slug string — Company URL slug. Profile at /startups/{slug}.htmldate string — Round date (YYYY-MM-DD, YYYY-MM, or YYYY)round string — Round type (e.g., "Series A", "Seed")amount string — Amount raised (e.g., "$30M"). May be empty.lead string — Lead investor name(s). May be empty.investors string[] — Investor/firm slugs that participatedsector string[] — Company sector tagsStartup-Investor Map (startup-investor-map.json)
startups array — List of {slug, name, sector[], stage}startup_investors object — Map of startup slug to array of {slug, name, type, firm, round, year, has_profile}Investor Graph (investor-graph.json)
firms object — Firm slug to {name, members[]}co_investments object — Investor slug to {peer_slug: {count, companies[]}}startup_backers object — Startup slug to [investor/firm slugs]startup_names object — Startup slug to display namestartup_founders object — Startup slug to [{name, role}]investor_names object — Investor slug to display nameinvestor_firms object — Investor slug to firm display namecollections object — Investor slug to [collection names]Data Notes
Edge cases and field-level details for robust integrations.
- Sectors are normalized lowercase strings — no near-duplicates. Direct string matching is safe. Use
tldrfor investor summaries (2-4 sentences, 95% populated) — prefer overthesis_summary. firmis a slug,firm_nameis display.firm_namemay be empty — fall back:inv["firm_name"] or inv["firm"]last_activeformat varies — "2025-11-15", "2025-03", "~2022", or empty. String comparison works for recency:inv["last_active"] >= "2024"check_sizeis human-readable — e.g., "$250K-$2M". Parse with regex for range comparison.- Startup-investor map has duplicates — an investor appears once per round. Deduplicate by slug when counting comparables. Filter out
"independent". queuedarray — investors in the research pipeline, not yet profiled. Tell founders: "we know about this investor but don't have a profile yet."