About contact-enrichment
A contact-enrichment skill for marketing workflows that finds company LinkedIn pages, emails, and phone numbers through ColdIQ endpoints. It uses a low-cost-first email sequence, skips already enriched contacts, and verifies addresses before outreach.
Key features
- 01Resolve company LinkedIn URLs
- 02Find work and personal emails
- 03Use a low-cost-first email waterfall
- 04Verify emails before sending
- 05Find phone numbers
- 06Skip already enriched contacts
Use cases
- 01Enrich a contact list before outreach
- 02Verify addresses before an email campaign
- 03Find phone numbers for selected contacts
Install
Copy the command and run it in a terminal.
npx skills add https:/ / github.com/ cold-iq/ coldiq-marketplace-skills --skill contact-enrichmentAfter installing, type/contact-enrichmentin Claude Code to confirm it loaded.
Bundled filesresources/async-job-pattern.mdresources/credit-optimization.md
Details
From the project READMEContact Enrichment
Find LinkedIn URLs, work/personal emails, and phones for a list of contacts — layering ColdIQ endpoints cheapest-first and skipping anyone already enriched. The classic multi-provider email waterfall (Prospeo → Findymail → FullEnrich, then verify) runs entirely through ColdIQ marketplace endpoints, so you get one key and unified credits instead of juggling provider accounts.
ColdIQ Marketplace Endpoints
| Task | Method | Path | Credits | Endpoint ID | Notes |
|---|---|---|---|---|---|
| Company LinkedIn URL from domain | POST | /v1/limadata/find/company-linkedin | 1 | limadata.find.company_linkedin | Replaces Linkup /enrich/linkedin |
| Work email (name + domain) | POST | /v1/limadata/find/work-email | 1 | limadata.find.work_email | Free if not found |
| Work email (LinkedIn URL) | POST | /v1/limadata/find/work-email-linkedin | 3 | limadata.find.work_email_linkedin | Fallback |
| Personal email | POST | /v1/limadata/find/personal-email | 5 | limadata.find.personal_email | Last resort |
| Phone number | POST | /v1/limadata/find/phone | 10 | limadata.find.phone | Free if not found |
| Verify email (bounce check) | POST | /v1/findymail/verify | 1 | findymail.verify | Replaces Debounce |
| Email via Prospeo (waterfall step) | POST | /v1/prospeo/enrich-person | unknown | prospeo.enrich_person | First in waterfall |
| Email via Findymail (LinkedIn) | POST | /v1/findymail/search/business-profile | 1 | findymail.search.business_profile | Waterfall step |
| Email via FullEnrich (bulk) | POST | /v1/fullenrich/contact/enrich/bulk | per result | fullenrich.contact.enrich_bulk | Nuclear option, async |
| Enrich person (profile) | POST | /v1/limadata/enrich/person | 1–5 | limadata.enrich.person | Full profile |
Layer 1 — Company LinkedIn URLs
Given company domains, resolve their LinkedIn company pages first (downstream steps need them).
→ POST /v1/limadata/find/company-linkedin · 1 cr · limadata.find.company_linkedin
Layer 2 — Email Waterfall (cheapest-first, stop on hit)
- Try name + company domain.
→ POST
/v1/limadata/find/work-email· 1 cr ·limadata.find.work_email - If empty / domain missing, fall back to the LinkedIn URL.
→ POST
/v1/limadata/find/work-email-linkedin· 3 cr ·limadata.find.work_email_linkedin - Second-opinion provider on the same LinkedIn URL.
→ POST
/v1/findymail/search/business-profile· 1 cr ·findymail.search.business_profile - Provider-level enrichment as a fallback.
→ POST
/v1/prospeo/enrich-person· ? cr ·prospeo.enrich_person(unverified) - Nuclear option for whatever's still missing (bulk, async — see
resources/async-job-pattern.md).
→ POST
/v1/fullenrich/contact/enrich/bulk· per result ·fullenrich.contact.enrich_bulk - Personal email only if a work email is truly unreachable.
→ POST
/v1/limadata/find/personal-email· 5 cr ·limadata.find.personal_email
Typical cumulative hit rate: 85–95% depending on contact quality.
Layer 3 — Verify before sending
Unverified emails destroy sender reputation. Verify every found address.
→ POST /v1/findymail/verify · 1 cr · findymail.verify
| Status | Action |
|---|---|
| Valid / Deliverable | Safe to send |
| Risky / Accept-all | Send with caution (catch-all domain) |
| Invalid / Undeliverable | Do NOT send |
| Unknown | Retry with another provider |
Phone numbers
→ POST /v1/limadata/find/phone · 10 cr · limadata.find.phone (free if not found; LinkedIn URL or name+company)
Cost optimization
See resources/credit-optimization.md. Key rules: dedup first (list-dedup), cheapest input first, stop on first hit, test on 50–100 rows before the full list, export only valid/risky emails to the campaign.
Checklist
- Dedup contacts before any enrichment
- Resolve company LinkedIn URLs (Layer 1)
- Run the email waterfall cheapest-first, stop on hit (Layer 2)
- Verify all found emails (Layer 3)
- Test on 50–100 rows first; if hit rate <50%, check data quality
- Export only verified/risky emails to the campaign (never invalid)