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 number

Resolve 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 title with title_hierarchy or department when 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_id and contact_id so 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.