Guides
Enrich a sales lead end to end
Resolve a company, select a decision-maker, and add email and mobile data without losing partial results.
This workflow starts with a company domain, selects a relevant contact, and enriches that contact with an email and mobile number. Each stage remains useful even when a later lookup returns no result.
Prerequisites
This workflow requires Company, Contact, Email, and Mobile API access. Remove any step your organization does not use.
Workflow
company domain
-> company identity
-> matching decision-makers
-> selected contact
-> work email and mobile numberResolve the company
Use an exact domain lookup and return a small set of fields:
{
"url": "acmeplumbing.com",
"include_fields": [
"company_id",
"company_name",
"url",
"industry",
"estimated_number_employees"
]
}Select a decision-maker
Search the resolved domain for likely owners or executives:
{
"url": "acmeplumbing.com",
"title": ["Owner", "President"],
"per_page": 10
}Enrich the selected contact
Use the contact's name and company domain for email discovery. Use their LinkedIn URL for mobile discovery.
{
"first_name": "Jane",
"last_name": "Smith",
"url": "acmeplumbing.com"
}{
"linkedin_url": "https://www.linkedin.com/in/jane-smith"
}Complete Python example
import os
import requests
BASE_URL = "https://api.leadx.com/v1"
HEADERS = {"X-API-KEY": os.environ["LEADX_API_KEY"]}
def post(path, payload, timeout=45):
response = requests.post(
f"{BASE_URL}{path}",
headers=HEADERS,
json=payload,
timeout=timeout,
)
response.raise_for_status()
return response.json()
def enrich_lead(domain):
company_response = post(
"/companies",
{
"url": domain,
"include_fields": [
"company_id",
"company_name",
"url",
"industry",
"estimated_number_employees",
],
},
timeout=30,
)
company = next(iter(company_response.get("records", [])), None)
if not company:
return {"domain": domain, "company": None, "contact": None}
contact_response = post(
"/contacts",
{
"url": company["url"],
"title": ["Owner", "President"],
"per_page": 10,
},
timeout=30,
)
contact = next(iter(contact_response.get("records", [])), None)
if not contact:
return {"domain": domain, "company": company, "contact": None}
email = None
try:
email = post(
"/emails/find",
{
"first_name": contact["first_name"],
"last_name": contact["last_name"],
"url": company["url"],
},
)
except requests.RequestException as error:
email = {"success": False, "error": str(error)}
mobile = None
linkedin_url = contact.get("linkedin")
if linkedin_url:
try:
mobile = post(
"/mobile-numbers/find",
{"linkedin_url": linkedin_url},
)
except requests.RequestException as error:
mobile = {"success": False, "error": str(error)}
return {
"domain": domain,
"company": company,
"contact": contact,
"email": email,
"mobile": mobile,
}
print(enrich_lead("acmeplumbing.com"))The example catches email and mobile request failures separately. A provider timeout should not discard the company and contact data already retrieved.
Adapt the selection strategy
- Replace
titlewithtitle_hierarchyordepartmentwhen you want a broader role category. - Add company location or industry filters before contact discovery.
- Score or review multiple contacts instead of taking the first record.
- For large lists, use bulk email jobs instead of calling the single email endpoint in a tight loop.
- Persist the
company_idandcontact_idso later updates do not depend only on names.
Do not treat the first returned contact as an authorized representative without independent verification. LeadX provides research data; your application controls the business decision.