Email Finder
Turn LinkedIn profiles into verified emails and phones. Takes the output of
and runs it through contact enrichment providers like Prospeo or Fullenrich.
Related Skills
list-segmentation → people-search → email-search → email-generation → email-response-simulation → campaign-sending
After
finds WHO to contact (with LinkedIn URLs), this skill gets their verified contact info.
Extruct API Operations
This skill delegates all Extruct API calls to the
skill.
For all Extruct API operations, read and follow the instructions in
skills/extruct-api/SKILL.md
.
The only Extruct operation in this skill is reading people table data. Contact enrichment uses separate providers (Prospeo, Fullenrich, etc.) with their own APIs.
Inputs
| Input | Source | Required |
|---|
| People table ID | Child table from | yes (or CSV) |
| People CSV | claude-code-gtm/csv/input/{campaign}/people_linkedin.csv
| yes (or table) |
| Provider preference | User choice | yes |
| Include mobile phones | User choice | no (default: no) |
Choosing a Provider
Ask the user which contact enrichment provider they want to use. If they need guidance, consider:
- Have LinkedIn URLs? → providers with LinkedIn enrichment work best
- Need highest email hit rate? → waterfall providers try multiple sources
- Budget-conscious? → check credit costs per match
- Need mobile phones? → confirm the provider covers phone data
- Want maximum coverage? → run one provider first, then a second for misses
If the user doesn't know where to start, pre-configured options with local reference docs are available in references/.
Workflow
Step 0: Confirm provider and learn API
- Ask the user which contact enrichment provider they want to use
- Fetch or read the provider's API documentation and identify:
- Enrichment endpoint (single and bulk)
- Required input fields (LinkedIn URL, name, domain, etc.)
- Authentication method and credentials
- Throughput limits and request constraints
- Response format (email, phone, verification status)
- Credit/pricing model
- Ask for their API credentials and confirm access
- Plan the implementation and confirm with the user before proceeding
Step 1: Load people data
Option A: From Extruct people table (recommended) — Use the extruct-api skill to fetch data from the people table. Extract
,
,
, and
from each row. Split full name into first/last.
Option B: From CSV — Read
claude-code-gtm/csv/input/{campaign}/people_linkedin.csv
.
Step 2: Check credits
Before running enrichment, check the user's available credits or quota with the chosen provider (using the endpoint identified in Step 0). Present a cost estimate based on the number of contacts to enrich.
Step 3: Run enrichment
Using the chosen provider's API (from Step 0):
- Prepare contact data in the format the provider expects (LinkedIn URL, name + domain, etc.)
- Submit contacts in batches according to the provider's rate limits
- Handle async responses if the provider uses polling
- Collect results: emails, phone numbers, verification status
- Track matched vs. unmatched contacts
If the user wants a waterfall (two providers), run the first provider, collect misses, then run misses through the second.
Step 4: Deduplicate and clean
Deduplicate by email. Filter out:
- Entries with no email
- Results where the provider marks verification as invalid
Step 5: Output contact CSV
Save enriched contacts to
claude-code-gtm/csv/input/{campaign}/contacts.csv
with columns:
- , , , , , , , , , ,
Step 6: Review with user
Present summary:
Enrichment Results:
- Contacts submitted: N
- Emails found: N (X% hit rate)
- Emails verified: N
- Phones found: N
- No match: N
- Provider: [chosen provider]
Show a sample of 10 contacts for spot-checking:
| Name | Title | Company | Email | Phone | Source |
|---|
| ... | ... | ... | ... | ... | ... |
Ask:
- "Hit rate look acceptable? (>60% is good, >80% is great)"
- "Want to run the misses through another provider?"
- "Ready to proceed to ?"
API References
Pre-configured provider docs in references/ directory. For other providers, docs are fetched during Step 0.