Apollo.io / ZoomInfo API Lead Pull
Purpose
This recipe produces an enriched lead database of 200-5,000 contacts pulled from Apollo.io or ZoomInfo APIs, with verified work emails, direct phone numbers, firmographic data (industry, employee count, revenue), and technographic signals. The output includes deduplication and cost tracking per lead, ready for scoring and outreach.
Prerequisites
- ICP definition from persona-builder agent — ICP Definition
- Apollo.io API key — from Apollo Settings (free tier: 10K records/mo)
- Python 3.10+ or Node.js 18+ for API scripting
- Target account list (optional) — CSV with company names or domains
Constraints
- Apollo.io free tier: 10,000 record exports/month, 120 email credits, 60 mobile credits. Each email costs 1 credit; phone costs 5 credits. [src1]
- Apollo Professional ($79/seat/mo annually) unlocks unlimited email credits and advanced filters. [src3]
- ZoomInfo requires enterprise contract starting ~$15,000/year with no self-serve. [src4]
- Apollo API rate limit: 100 requests/minute on search, 50/minute on enrichment. [src1]
- Both platforms require CCPA/GDPR opt-out compliance. [src2]
Tool Selection Decision
Which path?
├── Budget = free AND scale < 500
│ └── PATH A: Apollo Free Tier
├── Budget = $50-200/mo AND scale 500-2000
│ └── PATH B: Apollo Professional
├── Budget = enterprise AND scale 2000+
│ └── PATH C: ZoomInfo API
└── Maximum coverage
└── PATH D: Waterfall (Apollo + ZoomInfo)
| Path | Tools | Cost | Speed | Output Quality |
|---|---|---|---|---|
| A: Apollo Free | Apollo UI + export | $0 | 30 min/200 leads | Good — limited credits |
| B: Apollo Pro | Apollo API | $79/mo/seat | 20 min/1000 leads | High — full enrichment |
| C: ZoomInfo | ZoomInfo API | $15K+/yr | 15 min/2000 leads | Highest — intent + org charts |
| D: Waterfall | Apollo + ZoomInfo | $79/mo + $15K/yr | 30 min/2000 leads | Maximum coverage |
Execution Flow
Step 1: Construct API Search Query
Duration: 10 minutes | Tool: Apollo.io API
Translate ICP into API query parameters using Apollo's People Search endpoint with company size, title keywords, industry, location, and technology filters.
Verify: API returns 200 status and total_entries > 0.
Step 2: Paginate and Extract All Results
Duration: 10-30 minutes | Tool: Python script
Loop through pages at 100 results/page, respecting the 100 req/min rate limit. Extract name, title, company, email, phone, LinkedIn URL, company size, industry, and location. [src1]
Verify: Row count > 100. Email populated for > 50% of records.
Step 3: Enrich Missing Fields
Duration: 5-15 minutes | Tool: Apollo People Enrichment API
For leads missing email or phone, use the People Match endpoint with first name, last name, company, and LinkedIn URL. Rate limit: 50 req/min on enrichment. [src2]
Verify: Email coverage improves to > 70%.
Step 4: Deduplicate and Clean
Duration: 5-10 minutes | Tool: Python (pandas)
Deduplicate by email (primary) and name+company (secondary). Remove rows missing critical fields. Track credit usage per lead for cost analysis.
Verify: Zero duplicates on email column. Credit usage within budget.
Step 5: Export with Cost Tracking
Duration: 5 minutes
Add metadata columns (lead_source, date_pulled, credit_cost). Generate summary report with total leads, email/phone coverage rates, total credits used, and cost per lead.
Output Schema
CSV with columns: first_name, last_name, title, company, email, phone, linkedin_url, company_size, industry, city, state, lead_source, credit_cost. Expected 200-5,000 rows, deduplicated on email, sorted by company ascending.
Quality Benchmarks
| Quality Metric | Minimum | Good | Excellent |
|---|---|---|---|
| Email coverage | > 50% | > 70% | > 85% |
| Phone coverage | > 15% | > 30% | > 50% |
| ICP match rate | > 75% | > 85% | > 95% |
| Duplicate rate | < 5% | < 2% | < 0.5% |
| Data freshness | > 80% | > 90% | > 95% |
Error Handling
| Error | Cause | Recovery |
|---|---|---|
| 429 Too Many Requests | Rate limit exceeded | Wait 60 seconds, reduce frequency |
| 401 Unauthorized | Invalid API key | Regenerate at Apollo settings |
| Empty results | Query too narrow | Broaden title/industry filters |
| Low email coverage | Free tier credits exhausted | Upgrade or use enrichment pipeline |
| Stale data | Contact left company | Cross-reference with LinkedIn |
Cost Breakdown
| Component | Free Tier | Paid Tier | At Scale |
|---|---|---|---|
| Apollo.io search | 10K records/mo | Unlimited ($79/mo) | Unlimited |
| Email credits | 120/mo | Unlimited (Pro) | Unlimited |
| Mobile credits | 60/mo | 100/mo (Pro) | 200/mo ($199/mo) |
| ZoomInfo (alt) | No free tier | $15K-$25K/yr | $25K-$40K+/yr |
| Cost per lead | ~$0.01 | ~$0.05-0.15 | ~$0.03-0.10 |
Anti-Patterns
Wrong: Pulling maximum leads without credit monitoring
Exhausting monthly credits mid-campaign leaves no capacity for enrichment or follow-up. [src3]
Correct: Track credits per lead and set budget alerts
Log credit_cost per record. Reserve 20% of monthly credits for enrichment and re-pulls.
Wrong: Using Apollo free tier for enterprise-scale prospecting
120 email credits/month cannot sustain 1,000+ lead outbound campaigns. [src1]
Correct: Match tier to volume needs
Free for validation (50-100 leads). Professional for sustained outbound. ZoomInfo for enterprise. [src3]
When This Matters
Use when the agent needs to pull leads from a sales intelligence API with structured filters. Ideal for teams with tool budget who want clean, enriched data without LinkedIn rate limit constraints.