The Developer's Guide to Email Lead Generation APIs
Published February 27, 2026
Building Lead Generation Into Your Product
Whether you are building a CRM, a sales tool, or a marketing platform, at some point you will need to help your users find business contact information. Email lead generation APIs make this possible without building your own web scraping infrastructure. This guide covers everything a developer needs to know to choose, integrate, and optimize an email finder API.
How Email Finder APIs Work
There are three fundamental approaches used by email finder APIs:
- Database lookup: Pre-indexed databases of email addresses scraped and verified in advance. Fast responses but data can be stale. Used by Hunter.io and Apollo.io.
- Real-time scraping: Crawls business websites on demand to find email addresses. Slower but always returns fresh data. Used by Easy Email Finder.
- Pattern matching: Guesses email formats based on known company patterns (e.g., first.last@company.com). Fast but less accurate. Used as a supplementary method by several providers.
Each approach has tradeoffs in speed, accuracy, freshness, and cost. For most local business use cases, real-time scraping delivers the best results because small business contact information changes frequently and is poorly covered by large databases.
Typical Integration Architecture
A well-designed lead generation feature follows this architecture:
User Interface (Search Form)
|
v
Your Backend (API Proxy / Business Logic)
|
v
Email Finder API (e.g., Easy Email Finder)
|
v
Your Backend (Transform + Store Results)
|
v
Your Database / CRM
|
v
User Interface (Results Table / Export)
Key principle: Never call the email finder API directly from your frontend. Always proxy through your backend to protect API keys, enforce rate limits, and transform responses.
Data Model Design
When integrating lead data into your application, design your schema to capture all available fields:
// TypeScript interface for a lead
interface Lead {
id: string;
// Core fields
businessName: string;
email: string | null;
website: string | null;
phone: string | null;
address: string | null;
// Google Places metadata
googleRating: number | null;
reviewCount: number | null;
businessStatus: string | null;
placeTypes: string[];
// Quality signals from enrichment
techStack: string[];
socialLinks: Record<string, string>;
isFranchise: boolean;
// Internal tracking
source: 'eef_api' | 'manual' | 'import';
enrichedAt: string | null;
createdAt: string;
searchQuery: string;
searchLocation: string;
}
The Easy Email Finder API at a Glance
Here is a quick reference for the Easy Email Finder API:
Base URL: https://easyemailfinder.com/api/v1
Auth: Bearer token (eef_live_ prefix)
Pricing: $0.25/email, no subscription
Endpoints:
POST /search - Find businesses (FREE)
POST /enrich - Find email for 1 website (1 credit)
POST /enrich-batch - Find emails for up to 20 websites (1 credit each)
POST /search-and-enrich - Combined search + enrich, up to 60 results (1 credit each)
GET /balance - Check credit balance (FREE)
GET /usage - View usage history (FREE)
Rate Limits:
Search/utility endpoints: 60 req/min
Enrich endpoints: 10 req/min
Search Modes:
"local" - Brick-and-mortar businesses
"digital" - Online businesses, SaaS, agencies
Error Handling Strategy
Build a robust error handler that covers all API response codes:
async function callEEF(endpoint: string, options: RequestInit) {
const resp = await fetch(`https://easyemailfinder.com/api/v1${endpoint}`, {
...options,
headers: {
"Authorization": `Bearer ${API_KEY}`,
"Content-Type": "application/json",
...options.headers
}
});
switch (resp.status) {
case 200:
return { success: true, data: await resp.json() };
case 400:
return { success: false, error: "Invalid request parameters" };
case 401:
return { success: false, error: "Invalid or expired API key" };
case 402:
return { success: false, error: "Insufficient credits" };
case 429: {
const retryAfter = parseInt(resp.headers.get("Retry-After") || "30");
return { success: false, error: "Rate limited", retryAfter };
}
case 500:
return { success: false, error: "Server error, retry later" };
default:
return { success: false, error: `Unexpected status: ${resp.status}` };
}
}
Integration Patterns
There are four common patterns for integrating an email finder API:
1. On-demand search: User triggers a search, results appear in real time. Best for interactive tools. See our dashboard tutorial.
2. Background enrichment: New records in your database are automatically enriched by a background job. Best for CRMs. See our HubSpot integration.
3. Batch processing: Process large CSV files or database exports periodically. Best for bulk operations. See our batch enrichment guide.
4. Event-driven: Trigger enrichment based on events (new signup, form submission, CRM update). Best for real-time workflows. See our Zapier integration.
Testing Your Integration
Before going to production, test these scenarios:
- Successful search and enrichment (happy path)
- Search with no results
- Enrichment with no email found
- Rate limit handling (send requests rapidly to trigger 429)
- Insufficient credits (402 response)
- Invalid API key (401 response)
- Network timeout handling
- Large batch processing (test with 100+ websites)
Performance Optimization Checklist
- Use
/enrich-batchinstead of individual/enrichcalls - Cache search results to avoid redundant free searches
- Cache enrichment results to avoid paying for the same website twice
- Pre-filter websites before enriching (remove social media URLs, duplicates)
- Implement client-side rate limiting before hitting the API
- Use the
/search-and-enrichendpoint for simple workflows
For detailed cost optimization, see our cost optimization guide.
Getting Started
The fastest path to a working integration is our quickstart guide, which takes you from zero to your first API call in under 10 minutes. For advanced patterns, explore the rest of our developer documentation.
Ready to find business emails?
Try Easy Email Finder free — get 5 credits to start.
Start Finding Emails