Contact 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)