Imported from kidclone3/deal-flow-matchmaker (
.feynman/agent/skills/entity-enrichment/SKILL.md). Install upstream withnpx skills add kidclone3/deal-flow-matchmaker --skill entity-enrichment. Copyright stays with the author.
Entity Enrichment
Collect structured profiles for VC funds, angel investors, and startups by searching and extracting from multiple public sources in parallel. Outputs a provenance-tracked JSON profile with confidence flags per field.
When to use
- Populating a deal-flow database with real company/investor data
- Enriching startup profiles before running a matching engine
- Building a seed dataset for a matchmaking platform
- Any time you need to collect structured entity data from the open web
Entity types and field coverage
This skill targets three entity types with different collection strategies:
| Entity | Public sources | PII rule |
|---|---|---|
| VC Fund | Crunchbase, fund website, LinkedIn, SEC filings, press, startup.gov.vn, Viet.io, Dealroom, PitchBook | All public — funds are legal entities |
| Angel Investor | LinkedIn, Crunchbase person records, AngelList, Twitter/X, personal website, press mentions | STRICT: no DOB, ID, passport, tax ID, KYC, accredited status, personal phone. Only professional/public data. |
| Startup | Crunchbase, company website, LinkedIn, startup.gov.vn, Viet.io, BSSC Portal, FundedAPI, pitch deck (if public), press | All public — companies are legal entities |
Collection workflow
Phase 1: Source discovery (parallel search)
For each entity, run 4-6 searches with different angles simultaneously using web_search queries parameter:
For a VC fund named "Example Ventures":
1. "Example Ventures fund size AUM partners portfolio"
2. "Example Ventures investment thesis stage check size sectors"
3. "Example Ventures Crunchbase PitchBook profile"
4. "Example Ventures portfolio companies exits"
5. "Example Ventures Vietnam investments Asia Southeast Asia"
6. site:exampleventures.com "team" OR "portfolio" OR "strategy"
For an angel investor named "Jane Nguyen":
1. "Jane Nguyen angel investor portfolio investments"
2. "Jane Nguyen LinkedIn Crunchbase"
3. "Jane Nguyen startup investments exits"
4. "Jane Nguyen" site:linkedin.com
NEVER search for: DOB, passport, ID, tax ID, KYC, personal address, personal phone. Only search for: name + "investor" / "angel" / "portfolio" / "startup" / "LinkedIn" / "investments".
For a startup named "Example AI":
1. "Example AI startup Crunchbase funding valuation"
2. "Example AI founder team LinkedIn"
3. "Example AI product customers revenue growth"
4. "Example AI competitors market"
5. "Example AI funding round investors"
6. site:example.ai
Phase 2: Deep extraction (parallel fetch)
From Phase 1 results, identify the 3-6 highest-signal URLs and fetch them in parallel with fetch_content urls parameter:
Priority URL types (ordered by signal strength):
- Crunchbase / PitchBook / Dealroom profile pages
- The entity's own website (About, Team, Portfolio pages)
- LinkedIn company/person page
- Press releases announcing funding rounds
- SEC Form D / ADV filings (US funds)
- TechCrunch / VnExpress / DealStreetAsia coverage
- startup.gov.vn / Viet.io listings (Vietnam-specific)
Phase 3: Document extraction (if applicable)
If the startup has a public pitch deck or the VC has a public fund factsheet PDF:
- Use
document_parseto extract text from the PDF - Use LLM extraction prompt (see Section 5 of dealflow research doc) to pull structured fields
Phase 4: Merge and annotate
Consolidate all extracted data into the output schema. For every field, record:
{
"field": "ticket_size",
"value": "$500K-$2M",
"source_url": "https://crunchbase.com/organization/example-ventures",
"source_type": "crunchbase",
"confidence": "high"
}
Confidence rules:
high— from entity's own website, official filing, or Crunchbase verified profilemedium— from press article, LinkedIn, or third-party databaselow— inferred from context, single mention, or outdated sourceunavailable— searched but not found in any source
Phase 5: Output (agent→spine contract, R3)
Do NOT write files. Emit the enriched profile as your terminal message: a single
fenced ```json block conforming to schemas/enrich.json. No prose before or after it.
The write tool is for scratch notes only — the spine reads the JSON block, not the disk.
Top-level keys:
entity_type— one ofvc|angel|startup|corporation|university|research_institution- the provenance-tracked profile sections below (each field
{value, source_url, confidence}) relationships— an array of graph edges surfaced during research, each{"kind": one of ["raised_from","invested_in","pilot_with","founded_by_alumni_of","partner_with"], "dst_name": "...", "source_url": "..."}, written from THIS entity's perspective (a startupraised_froma fund, isfounded_by_alumni_ofa university, etc.)collection_summary
Output schema
VC Fund
{
"entity_type": "vc",
"enriched_at": "2026-07-18T...",
"legal_information": {
"fund_name": {"value": "...", "source_url": "...", "confidence": "high"},
"legal_entity": {"value": "...", "source_url": "...", "confidence": "medium"},
"country": {"value": "...", "source_url": "...", "confidence": "high"},
"founded": {"value": 2020, "source_url": "...", "confidence": "high"},
"aum": {"value": "...", "source_url": "...", "confidence": "medium"},
"gp_partners": {"value": ["..."], "source_url": "...", "confidence": "high"},
"website": {"value": "...", "source_url": "...", "confidence": "high"},
"linkedin": {"value": "...", "source_url": "...", "confidence": "high"}
},
"investment_thesis": {
"stage": {"value": ["seed", "series_a"], "source_url": "...", "confidence": "high"},
"check_size": {"value": "$500K-$2M", "source_url": "...", "confidence": "high"},
"sector_focus": {"value": ["ai", "fintech"], "source_url": "...", "confidence": "high"},
"geography": {"value": ["Vietnam", "Southeast Asia"], "source_url": "...", "confidence": "high"}
},
"portfolio": {
"companies": {"value": [{"name": "...", "round": "seed"}], "source_url": "...", "confidence": "medium"},
"vietnam_exposure": {"value": true, "source_url": "...", "confidence": "medium"},
"notable_exits": {"value": ["..."], "source_url": "...", "confidence": "medium"},
"lead_co_invest": {"value": "both", "source_url": "...", "confidence": "low"},
"follow_on_rate": {"value": null, "source_url": null, "confidence": "unavailable"}
},
"deal_sourcing": {
"key_contacts": {"value": [{"name": "...", "role": "Partner", "linkedin": "..."}], "source_url": "...", "confidence": "medium"},
"emails": {"value": ["..."], "source_url": "...", "confidence": "low"},
"warm_intro_status": {"value": null, "source_url": null, "confidence": "unavailable"}
},
"collection_summary": {
"total_fields": 20,
"fields_collected": 17,
"fields_unavailable": 3,
"sources_used": ["crunchbase.com", "exampleventures.com", "techcrunch.com"],
"gaps": ["follow_on_rate", "warm_intro_status", "lead_co_invest"]
}
}
Angel Investor
{
"entity_type": "angel",
"enriched_at": "2026-07-18T...",
"identity": {
"full_name": {"value": "...", "source_url": "...", "confidence": "high"},
"nationality": {"value": "...", "source_url": "...", "confidence": "medium"}
},
"investment_profile": {
"ticket_size": {"value": "$25K-$100K", "source_url": "...", "confidence": "medium"},
"stage": {"value": ["pre_seed", "seed"], "source_url": "...", "confidence": "medium"},
"sector": {"value": ["ai", "healthtech"], "source_url": "...", "confidence": "medium"},
"geography": {"value": ["Vietnam"], "source_url": "...", "confidence": "medium"},
"frequency": {"value": null, "source_url": null, "confidence": "unavailable"},
"lead_co_invest": {"value": null, "source_url": null, "confidence": "unavailable"}
},
"portfolio": {
"investments": {"value": [{"name": "Startup X", "year": 2024}], "source_url": "...", "confidence": "medium"},
"exits": {"value": [], "source_url": "...", "confidence": "medium"},
"board_seats": {"value": [], "source_url": "...", "confidence": "low"},
"notable_startups": {"value": ["Startup X"], "source_url": "...", "confidence": "medium"}
},
"professional": {
"current_company": {"value": "...", "source_url": "...", "confidence": "high"},
"role": {"value": "...", "source_url": "...", "confidence": "high"},
"experience": {"value": ["..."], "source_url": "...", "confidence": "high"},
"education": {"value": ["..."], "source_url": "...", "confidence": "high"},
"linkedin": {"value": "...", "source_url": "...", "confidence": "high"}
},
"pii_blocked": ["dob", "id_passport", "tax_id", "kyc_status", "accredited_status", "personal_phone", "personal_address"],
"collection_summary": {
"total_fields": 18,
"fields_collected": 13,
"pii_skipped": 7,
"fields_unavailable": 2,
"sources_used": ["linkedin.com", "crunchbase.com", "angellist.com"],
"gaps": ["frequency", "lead_co_invest"]
}
}
Startup
{
"entity_type": "startup",
"enriched_at": "2026-07-18T...",
"company": {
"legal_entity": {"value": "...", "source_url": "...", "confidence": "high"},
"founded": {"value": 2023, "source_url": "...", "confidence": "high"},
"country": {"value": "Vietnam", "source_url": "...", "confidence": "high"},
"website": {"value": "...", "source_url": "...", "confidence": "high"},
"industry": {"value": ["agritech", "ai"], "source_url": "...", "confidence": "high"}
},
"founder": {
"name": {"value": "...", "source_url": "...", "confidence": "high"},
"background": {"value": "...", "source_url": "...", "confidence": "medium"},
"education": {"value": ["..."], "source_url": "...", "confidence": "medium"},
"linkedin": {"value": "...", "source_url": "...", "confidence": "high"},
"previous_exits": {"value": [], "source_url": "...", "confidence": "low"}
},
"product": {
"description": {"value": "...", "source_url": "...", "confidence": "high"},
"business_model": {"value": "B2B SaaS", "source_url": "...", "confidence": "medium"},
"target_customer": {"value": "...", "source_url": "...", "confidence": "medium"},
"usp": {"value": "...", "source_url": "...", "confidence": "medium"},
"competitors": {"value": ["..."], "source_url": "...", "confidence": "low"}
},
"traction": {
"users": {"value": null, "source_url": null, "confidence": "unavailable"},
"customers": {"value": null, "source_url": null, "confidence": "unavailable"},
"mau_dau": {"value": null, "source_url": null, "confidence": "unavailable"},
"revenue": {"value": null, "source_url": null, "confidence": "unavailable"},
"arr_mrr": {"value": null, "source_url": null, "confidence": "unavailable"},
"growth": {"value": null, "source_url": null, "confidence": "unavailable"},
"retention": {"value": null, "source_url": null, "confidence": "unavailable"}
},
"financial": {
"funding_raised": {"value": "$1.2M", "source_url": "...", "confidence": "high"},
"valuation": {"value": null, "source_url": null, "confidence": "unavailable"},
"burn_rate": {"value": null, "source_url": null, "confidence": "unavailable"},
"runway": {"value": null, "source_url": null, "confidence": "unavailable"}
},
"fundraising": {
"current_round": {"value": "Seed", "source_url": "...", "confidence": "high"},
"amount_seeking": {"value": "$2M", "source_url": "...", "confidence": "medium"},
"existing_investors": {"value": ["..."], "source_url": "...", "confidence": "high"},
"cap_table": {"value": null, "source_url": null, "confidence": "unavailable"}
},
"collection_summary": {
"total_fields": 28,
"fields_collected": 16,
"fields_unavailable": 12,
"sources_used": ["crunchbase.com", "example.ai", "techcrunch.com", "linkedin.com"],
"gaps": ["users", "customers", "mau_dau", "revenue", "arr_mrr", "growth", "retention", "valuation", "burn_rate", "runway", "cap_table"]
}
}
Source priority by entity type
VC Fund — sources ranked by reliability
| Priority | Source | Best for |
|---|---|---|
| 1 | Fund's own website (About / Strategy / Team pages) | Thesis, partners, portfolio |
| 2 | Crunchbase organization profile | Rounds, AUM, portfolio, exits |
| 3 | SEC Form ADV (US funds) / regulatory filings | AUM, legal entity, GP |
| 4 | LinkedIn company page | Team, location, description |
| 5 | Press: fund announcement / close articles | AUM, thesis, LP details |
| 6 | Dealroom / PitchBook | Portfolio, co-investors |
| 7 | startup.gov.vn / Viet.io (Vietnam) | Local funds, ecosystem role |
Angel Investor — sources ranked by reliability
| Priority | Source | Best for |
|---|---|---|
| 1 | LinkedIn profile | Experience, education, current role |
| 2 | Crunchbase person record | Investment history, board seats |
| 3 | AngelList / WellFound profile | Ticket size, sector, stage preference |
| 4 | Personal website / blog | Investment thesis, portfolio |
| 5 | Press: "angel investor X backed Y" | Specific investments |
| 6 | Twitter/X bio | Current focus, interests |
PII wall: Stop at professional data. Do not search for or attempt to extract:
- DOB, age
- ID numbers, passport numbers
- Tax IDs, social security numbers
- Home addresses
- Personal phone numbers
- KYC status, accredited investor verification
If a source accidentally surfaces this data, do not include it in the output. Mark it in pii_blocked.
Startup — sources ranked by reliability
| Priority | Source | Best for |
|---|---|---|
| 1 | Company website (About, Product, Team pages) | Product, team, description |
| 2 | Crunchbase organization profile | Funding, investors, founders |
| 3 | Press: funding announcement | Round details, valuation |
| 4 | LinkedIn company page | Team size, location, industry |
| 5 | startup.gov.vn / Viet.io (Vietnam) | Local startups, ecosystem |
| 6 | FundedAPI | Real-time funding events |
| 7 | Founder LinkedIn profiles | Founder background |
| 8 | Pitch deck (if public on website) | Traction, USP, financials |
Vietnam-specific sources
Always include these when enriching Vietnam-based entities:
| Source | URL | VC | Angel | Startup |
|---|---|---|---|---|
| startup.gov.vn | http://startup.gov.vn/ | ✅ | ❌ | ✅ |
| Viet.io | https://viet.io/ | ✅ | ❌ | ✅ |
| BSSC Portal | https://congthongtin.bssc.vn/ | ✅ | ❌ | ✅ |
| VnExpress (tech) | https://vnexpress.net/ | ✅ | ✅ | ✅ |
| DealStreetAsia | https://www.dealstreetasia.com/ | ✅ | ❌ | ✅ |
| Vietnam Investment Review | https://vir.com.vn/ | ✅ | ❌ | ✅ |
| NIC Scale X / VietLeap pages | https://vnic.nic.gov.vn/ | ❌ | ❌ | ✅ |
Batch enrichment mode
When enriching multiple entities (e.g., all 25 NIC-supported startups):
- Parallel search phase: Run
web_searchqueries for 3-5 entities simultaneously (interleave queries so each entity gets 1-2 queries per batch) - Parallel fetch phase: Gather all high-signal URLs across entities, fetch 4-6 at a time with
fetch_contenturls
Note: the spine dispatches one entity per agent job, so each run emits exactly one entity's JSON block (per Phase 5). Batch parallelism applies to searches/fetches within that single-entity job, not to emitting many profiles at once.
Important rules
- Emit JSON, not files (R3). Your terminal message is a single fenced
```jsonblock perschemas/enrich.json.writeis scratch-only. - Always record provenance. Every field must have a
source_url. If you can't find a source, mark itunavailable— don't invent data. - Never collect PII for individuals. The
pii_blockedlist in the angel schema is hard enforcement, not a guideline. - Prefer entity-owned sources. The startup's own website beats Crunchbase beats a press article.
- Flag low confidence. If you're inferring from context (e.g., guessing sector from company description), mark it
low. - Date everything. Include
enriched_attimestamp so downstream consumers know data freshness. - Do not paywall-shim. If data is behind a Crunchbase/PitchBook paywall, mark it
unavailableand note the paywall. Do not try to bypass. - Vietnam first. For Vietnamese entities, always check startup.gov.vn, Viet.io, and VnExpress before global sources.
- Always emit
collection_summary.status— one of:complete— most fields collected with sources.partial— some fields collected, othersunavailable.not_found— the entity itself could not be confirmed to exist: its website does not resolve (NXDOMAIN / unreachable), and no independent source (Crunchbase, LinkedIn, press, Wikipedia, local registries) corroborates it. Do NOT fabricate a profile to fill the schema — return every fieldnull/unavailable, put your evidence incollection_summary.finding, and setstatus: "not_found". The spine gatesnot_found(and all-null) entities tostatus='unverified'so they never enter matching. A wrong seed name/domain is a real outcome, not a failure to hide.