skills/orthogonal-comprehensive-enrichment/SKILL.md
Enrich any person or company from any identifier — email, name, LinkedIn URL, domain, company name, Twitter/X handle. Use when asked to enrich, look up, or research a lead, contact, person, or company.
npx skillsauth add orthogonal-sh/skills comprehensive-enrichmentInstall this skill globally with one command. Works with Claude Code, Cursor, and Windsurf.
3 of 9 scanners reported clean
Some scanners were skipped, did not run, or reported a non-clean status. Review each row below.
Maximum data + correctness. Use ALL relevant APIs, cross-reference results, flag conflicts.
Detect input type, then route:
| Input | Contains | Route |
|-------|----------|-------|
| Email | @ | Person + Company (extract domain) |
| LinkedIn person URL | linkedin.com/in/ | Person + Company (from results) |
| LinkedIn company URL | linkedin.com/company/ | Company only |
| Domain | *.com, *.io, etc. | Company only |
| Company name | No special pattern | Company only |
| Name + company | "John Doe at Stripe" | Person + Company |
| Twitter/X handle | @handle or x.com/ | Person + Company (from results) |
Person always cascades to company. Once person enrichment reveals their employer (company name, domain, or LinkedIn company URL), automatically run full company enrichment too. The only time you skip company is if you truly can't identify one. If LinkedIn person URL provided: use full URL for Fiber calls, extract username/slug for other endpoints.
Run ALL of these in parallel where possible. Collect everything, then compile.
Fiber kitchen-sink (accepts LinkedIn URL, email, or name+company):
# By LinkedIn URL:
orth run fiber /v1/kitchen-sink/person --body '{"profileIdentifier": "https://linkedin.com/in/johndoe"}'
# By email:
orth run fiber /v1/kitchen-sink/person --body '{"emailAddress": "[email protected]"}'
# By name + company:
orth run fiber /v1/kitchen-sink/person --body '{
"personName": {"fullName": "John Doe"},
"companyName": {"name": "Stripe"},
"companyDomain": {"domain": "stripe.com"}
}'
Nyne person search (async — deep work history, education, social):
# Step 1: POST to start search
orth run nyne /person/search -d '{"query": "John Doe Stripe"}'
# Step 2: Poll with GET using request_id
orth run nyne /person/search -q request_id=REQUEST_ID
Sixtyfour enrich-lead (AI-powered — slow, ~30-60s, but finds rich context):
orth run sixtyfour /enrich-lead --body '{
"lead_info": {"first_name": "John", "last_name": "Doe", "company": "Stripe", "linkedin_url": "https://linkedin.com/in/johndoe"},
"struct": {"work_email": "Work email", "personal_email": "Personal email (Gmail, etc.)", "phone": "Phone number", "title": "Job title", "bio": "Short bio"}
}'
Collect ALL emails — work AND personal. Many use cases (recruiting, etc.) need personal emails. Present each email with its type (work/personal) and verification status.
Find work email (cross-reference Hunter + Tomba):
# Hunter (returns work email)
orth run hunter /v2/email-finder --query domain=stripe.com first_name=John last_name=Doe
# Tomba (returns work email + sometimes personal)
orth run tomba /v1/email-finder --query domain=stripe.com company=Stripe first_name=John last_name=Doe
Find personal email — these sources often return personal (Gmail, etc.):
# Tomba from LinkedIn (often returns personal email)
orth run tomba /v1/linkedin --query url=https://linkedin.com/in/johndoe
# Tomba enrich (returns all known emails for a person)
orth run tomba /v1/enrich --query [email protected]
Nyne person/search and Sixtyfour enrich-lead (Section 2a) also return personal emails — check their results.
Verify ALL found emails (run all three verifiers per email):
orth run hunter /v2/email-verifier --query [email protected]
orth run tomba /v1/email-verifier --query [email protected]
orth run fiber /v1/validate-email/single --body '{"email": "[email protected]"}'
Verify every email found — work and personal. Run verifiers in parallel across all emails.
orth run sixtyfour /find-phone --body '{
"lead": {"first_name": "John", "last_name": "Doe", "company": "Stripe"}
}'
LinkedIn profile (Fiber):
orth run fiber /v1/linkedin-live-fetch/profile/single --body '{"identifier": "https://linkedin.com/in/johndoe"}'
LinkedIn recent posts (Fiber):
orth run fiber /v1/linkedin-live-fetch/profile-posts --body '{"identifier": "https://linkedin.com/in/johndoe"}'
Twitter/X activity (Nyne — async, returns tweets + engagement metrics):
# Step 1: POST with Twitter URL
orth run -X POST nyne /person/newsfeed -d '{"social_media_url": "https://x.com/HANDLE"}'
# Step 2: Poll with GET
orth run nyne /person/newsfeed -q request_id=REQUEST_ID
orth run linkup /search --body '{
"q": "John Doe Stripe VP Engineering recent news interviews talks",
"depth": "deep",
"outputType": "sourcedAnswer"
}'
Cross-reference all API results. Merge name, title, emails (work + personal with verification status), phone, LinkedIn, Twitter, work history, education, and recent activity. When APIs disagree, keep both values with source labels. Once employer is identified, run full company enrichment (Section 3). See Section 5 for output formatting.
Run ALL of these in parallel where possible.
Brand.dev (industry, size, description, logo):
# By domain (primary):
orth run brand-dev /v1/brand/retrieve --query domain=stripe.com
# By company name (if no domain):
orth run brand-dev /v1/brand/retrieve-by-name --query name=Stripe
# By email (extracts domain):
orth run brand-dev /v1/brand/retrieve-by-email --query [email protected]
Hunter company data:
orth run hunter /v2/domain-search --query domain=stripe.com
Fiber company data (LinkedIn-enriched):
orth run fiber /v1/kitchen-sink/company --body '{"companyDomain": {"domain": "stripe.com"}}'
Key people by title:
orth run fiber /v1/natural-language-search/profiles --body '{"query": "CEO, CTO, CFO, COO, VP at Stripe", "pageSize": 10}'
Nyne funding history (async):
# Step 1: POST
orth run -X POST nyne /company/funding -d '{"company_name": "Stripe"}'
# Step 2: Poll with GET
orth run nyne /company/funding -q request_id=REQUEST_ID
Nyne investors:
orth run -X POST nyne /company/funders -d '{"company_domain": "stripe.com"}'
Products from website:
orth run brand-dev /v1/brand/ai/products --body '{"domain": "stripe.com"}'
Scrape for pricing/features:
orth run scrapegraph /v1/smartscraper --body '{
"website_url": "https://stripe.com/pricing",
"user_prompt": "Extract all products, pricing tiers, and features"
}'
Find competitors/similar companies:
orth run exa /findSimilar --body '{
"url": "https://stripe.com",
"numResults": 10,
"contents": {"text": true}
}'
orth run linkup /search --body '{
"q": "Stripe recent news funding announcements partnerships press releases",
"depth": "deep",
"outputType": "sourcedAnswer"
}'
Cross-reference all API results. Merge overview, leadership, funding, products, competitors, news, and social presence. When APIs disagree, keep both values with source labels. See Section 5 for output formatting.
enrich [email protected]Step 1: Detect — Email → person enrichment + extract domain stripe.com for company.
Step 2: Person enrichment (run in parallel):
# Profile (3 sources)
orth run fiber /v1/kitchen-sink/person --body '{"emailAddress": "[email protected]", "companyDomain": {"domain": "stripe.com"}}'
orth run nyne /person/search -d '{"query": "john stripe.com"}'
orth run sixtyfour /enrich-lead --body '{"lead_info": {"email": "[email protected]", "company": "Stripe"}, "struct": {"work_email": "Work email", "personal_email": "Personal email", "phone": "Phone", "title": "Title", "bio": "Bio"}}'
# Find personal email
orth run tomba /v1/enrich --query [email protected]
# Verify work email (3 sources)
orth run hunter /v2/email-verifier --query [email protected]
orth run tomba /v1/email-verifier --query [email protected]
orth run fiber /v1/validate-email/single --body '{"email": "[email protected]"}'
# Also verify any personal emails found with the same 3 verifiers
# Phone
orth run sixtyfour /find-phone --body '{"lead": {"email": "[email protected]", "company": "Stripe"}}'
# Research
orth run linkup /search --body '{"q": "john stripe.com", "depth": "deep", "outputType": "sourcedAnswer"}'
Once you have the person's full name + LinkedIn from Step 2, fire off:
# LinkedIn profile + posts
orth run fiber /v1/linkedin-live-fetch/profile/single --body '{"identifier": "LINKEDIN_URL"}'
orth run fiber /v1/linkedin-live-fetch/profile-posts --body '{"identifier": "LINKEDIN_URL"}'
# Twitter (if discovered)
orth run -X POST nyne /person/newsfeed -d '{"social_media_url": "https://x.com/TWITTER_HANDLE"}'
Step 3: Company enrichment (run in parallel with person):
# Overview
orth run brand-dev /v1/brand/retrieve --query domain=stripe.com
orth run hunter /v2/domain-search --query domain=stripe.com
orth run fiber /v1/kitchen-sink/company --body '{"companyDomain": {"domain": "stripe.com"}}'
# Leadership
orth run fiber /v1/natural-language-search/profiles --body '{"query": "CEO, CTO, CFO, COO, VP at Stripe", "pageSize": 10}'
# Funding
orth run -X POST nyne /company/funding -d '{"company_name": "Stripe"}'
orth run -X POST nyne /company/funders -d '{"company_domain": "stripe.com"}'
# Products & competitors
orth run brand-dev /v1/brand/ai/products --body '{"domain": "stripe.com"}'
orth run scrapegraph /v1/smartscraper --body '{"website_url": "https://stripe.com/pricing", "user_prompt": "Extract all products, pricing tiers, and features"}'
orth run exa /findSimilar --body '{"url": "https://stripe.com", "numResults": 10}'
# News
orth run linkup /search --body '{"q": "Stripe recent news funding announcements", "depth": "deep", "outputType": "sourcedAnswer"}'
Step 4: Compile & Format — Merge all results, cross-reference, flag conflicts, then present using the two-tier output format (Section 5): summary card first, full details below.
Always present results in two tiers: a scannable summary card on top, then full details below.
Lead with this. A sales rep should be able to scan it in 30 seconds.
For a Person (+ their company):
## 🔍 {Full Name} — {Title} at {Company}
**Contact**
- ✉️ Work: {email} ({verification status})
- ✉️ Personal: {email} ({verification status})
- 📱 {phone}
- 🔗 LinkedIn: {url}
- 𝕏 Twitter: {url}
**Bio**: {One-liner from best available source}
**Personalization Angles**
1. {Recent activity, talk, post, or news mention — with date}
2. {Another angle}
3. {Another angle}
**Company Snapshot**: {Company} · {industry} · {employee count} employees · HQ: {location}
Latest funding: {round type} — ${amount} ({date}) · Total raised: ${total} · Valuation: ${valuation}
For a Company (standalone):
## 🏢 {Company Name}
**Overview**
- 🌐 {domain}
- 🏷️ {industry}
- 👥 {employee count} employees
- 📍 HQ: {location}
**Funding**: {latest round} — ${amount} ({date}) · Total raised: ${total} · Valuation: ${valuation}
**Key Decision Makers**
| Name | Title | Email |
|------|-------|-------|
| {name} | {title} | {email} |
| ... | ... | ... |
**Recent News & Icebreakers**
1. {headline — date — source}
2. {headline — date — source}
3. {headline — date — source}
Below a clear separator (---), include the complete deep-dive for those who want to dig in:
Present Tier 2 with clear section headers. Include source labels on every data point. Flag all conflicts between APIs.
request_id, poll with GET until status is complete (5-20 seconds)testing
Download videos from YouTube, Bilibili, Twitter, and thousands of other sites using yt-dlp. Use when the user provides a video URL and wants to download it, extract audio (MP3), download subtitles, or select video quality. Triggers on phrases like "下载视频", "download video", "yt-dlp", "YouTube", "B站", "抖音", "提取音频", "extract audio".
business
Send messages and manage Slack channels. Use when asked to send Slack messages, post to channels, list channels, or fetch message history.
development
Evaluate YC batch companies for investment — scrapes the YC directory, researches each company and its founders (work history, LinkedIn, website), assesses founder-company fit, and exports to Google Sheets with priority rankings. Use when asked to evaluate YC companies, research a YC batch, screen startups, or do due diligence on YC companies.
development
Take screenshots of websites and web pages