Integrating Easy Email Finder into Your CRM with the API
Published February 2, 2026
Why Connect Your Email Finder to Your CRM?
When leads sit in a spreadsheet, they go stale. When they flow directly into your CRM with enriched contact data, your sales team can act on them immediately. Connecting Easy Email Finder to your CRM eliminates the manual copy-paste step and ensures every new lead gets the attention it deserves.
Architecture Overview
The integration pattern is straightforward. You use the Easy Email Finder API to discover business emails, then push those contacts into your CRM using its API. This can run as a scheduled script, a webhook handler, or part of a larger automation pipeline.
- Easy Email Finder API provides search and enrichment
- Your script transforms the data to match your CRM schema
- CRM API receives the enriched contacts
Example: HubSpot Integration with Python
HubSpot has an excellent REST API for creating contacts. Here is how to search for leads, enrich them, and push them directly into HubSpot.
import requests
EEF_KEY = "eef_live_your_api_key_here"
HUBSPOT_KEY = "pat-na1-your-hubspot-key"
EEF_BASE = "https://easyemailfinder.com/api/v1"
def find_and_push_leads(query: str, location: str):
# Search for businesses
search_resp = requests.post(f"{EEF_BASE}/search", headers={
"Authorization": f"Bearer {EEF_KEY}",
"Content-Type": "application/json"
}, json={"query": query, "location": location, "mode": "local"})
businesses = search_resp.json().get("results", [])
# Enrich websites in batch
websites = [b["website"] for b in businesses if b.get("website")]
enrich_resp = requests.post(f"{EEF_BASE}/enrich-batch", headers={
"Authorization": f"Bearer {EEF_KEY}",
"Content-Type": "application/json"
}, json={"websites": websites[:20]})
enriched = enrich_resp.json().get("results", [])
# Push each lead to HubSpot
for lead in enriched:
if not lead.get("email"):
continue
hubspot_contact = {
"properties": {
"email": lead["email"],
"company": lead.get("name", ""),
"website": lead.get("website", ""),
"phone": lead.get("phone", ""),
"address": lead.get("address", ""),
"lifecyclestage": "lead"
}
}
resp = requests.post(
"https://api.hubapi.com/crm/v3/objects/contacts",
headers={
"Authorization": f"Bearer {HUBSPOT_KEY}",
"Content-Type": "application/json"
},
json=hubspot_contact
)
if resp.status_code == 201:
print(f"Created contact: {lead['email']}")
elif resp.status_code == 409:
print(f"Contact already exists: {lead['email']}")
else:
print(f"Error for {lead['email']}: {resp.status_code}")
find_and_push_leads("dentists", "Austin, TX")
Example: Salesforce Integration
For Salesforce, you can use the simple-salesforce Python library. The pattern is similar, but you create Lead objects instead of contacts.
from simple_salesforce import Salesforce
import requests
sf = Salesforce(username="you@company.com", password="pass", security_token="token")
EEF_KEY = "eef_live_your_api_key_here"
EEF_BASE = "https://easyemailfinder.com/api/v1"
# After enriching leads with Easy Email Finder...
for lead in enriched_leads:
if lead.get("email"):
sf.Lead.create({
"Email": lead["email"],
"Company": lead.get("name", "Unknown"),
"Website": lead.get("website", ""),
"Phone": lead.get("phone", ""),
"Street": lead.get("address", ""),
"LeadSource": "Easy Email Finder API",
"Status": "New"
})
print(f"Salesforce lead created: {lead['email']}")
Example: Pipedrive Integration with Node.js
const EEF_KEY = "eef_live_your_api_key_here";
const PIPEDRIVE_TOKEN = "your_pipedrive_api_token";
const EEF_BASE = "https://easyemailfinder.com/api/v1";
async function enrichAndPushToPipedrive(query, location) {
// Search with Easy Email Finder
const searchRes = await fetch(`${EEF_BASE}/search-and-enrich`, {
method: "POST",
headers: {
"Authorization": `Bearer ${EEF_KEY}`,
"Content-Type": "application/json"
},
body: JSON.stringify({ query, location, mode: "local" })
});
const { results } = await searchRes.json();
for (const lead of results) {
if (!lead.email) continue;
// Create organization in Pipedrive
const orgRes = await fetch(
`https://api.pipedrive.com/v1/organizations?api_token=${PIPEDRIVE_TOKEN}`,
{
method: "POST",
headers: { "Content-Type": "application/json" },
body: JSON.stringify({ name: lead.name || "Unknown" })
}
);
const org = await orgRes.json();
// Create person linked to organization
await fetch(
`https://api.pipedrive.com/v1/persons?api_token=${PIPEDRIVE_TOKEN}`,
{
method: "POST",
headers: { "Content-Type": "application/json" },
body: JSON.stringify({
name: lead.name || "Business Contact",
email: [{ value: lead.email, primary: true }],
phone: [{ value: lead.phone || "", primary: true }],
org_id: org.data?.id
})
}
);
console.log(`Pushed to Pipedrive: ${lead.email}`);
}
}
enrichAndPushToPipedrive("plumbers", "Denver, CO");
Tips for Production Integrations
- Deduplication: Always check if a contact exists in your CRM before creating a new one to avoid duplicates
- Error handling: Implement retries with exponential backoff for both APIs
- Scheduling: Run the integration on a schedule (daily or weekly) to continuously feed your pipeline
- Tagging: Tag leads created via the API so you can track conversion rates from this source
For more on batch processing large volumes of leads, check out our guide on batch enrichment. If you want to connect via Zapier instead of code, see our Zapier integration guide. Full endpoint details are in the API documentation.
Ready to find business emails?
Try Easy Email Finder free — get 5 credits to start.
Start Finding Emails