LeadMagic covers the whole contact-finding job in one place: work emails, personal emails, mobile numbers, and validation on top. It also resolves a LinkedIn profile from an email address, and flags when someone has quietly changed jobs.
LeadMagic sits between the list and the outreach, and it validates on the way through, so nothing unverified reaches a sequencer.
Ask for the outcome and your agent composes the run itself. Or start from a skill, a whole pipeline it already knows end to end.
browse all skills →Every tool ships with a written playbook, and the agent loads it before the first call. Auth, rate limits, what each call costs, which actions need your approval, and the mistakes worth avoiding. It is the difference between an agent that knows the tool and one that guesses at it.
Read the LeadMagic docs →WHAT/guardrails here; HOW in reference/endpoints.md + lib/leadmagic.py. Docs cached at reference/docs/leadmagic/raw/llms-full.txt.
https://api.leadmagic.ioX-API-Key (LeadMagic → Settings → API). Env LEADMAGIC_API_KEY; never hardcode.GET /v1/credits is free.get_credits() is a safe read-only pilot; pilot one lookup before bulk, and run bulk row-by-row through a deterministic loop (not the agent per row).People: email_finder, email_validation, personal_email_finder, mobile_finder, profile_search, b2b_profile (email→profile), role_finder, employee_finder, job_change_detector, people_search (v3). Companies: company_search, company_funding, technographics. Plus get_credits. Anything else (ads, analytics, jobs) → generic request().
Enrichment layer: shortlist (Apollo/Exa) → LeadMagic for verified emails/phones + LinkedIn resolution → write to ATS (recruit-crm) / sequencer (instantly). Validate emails (email_validation) before any send.
Field-shape note: these are vendor-native operational notes. The client returns the raw vendor JSON and uses the method names in this file — read field shapes accordingly (no normalized-wrapper /
result.data.prefix).
email_status == valid; treat catch_all and unknown as unresolved unless risk is accepted.invalid with a populated mx_record + mx_provider usually means "mailbox not provable", not "won't deliver" - don't auto-discard; fall back to a second validator (ZeroBounce/BetterContact) first.lib/leadmagic.pyImport: from lib.leadmagic import LeadMagic → instantiate LeadMagic() (reads key from env). Base: https://api.leadmagic.io. Generic passthrough: request(method, path, *, params, json).
b2b_profile(payload: dict) -> dict — POST /v1/people/b2b-profile — profile from an email (email -> LinkedIn profile).company_funding(payload: dict) -> dict — POST /v1/companies/company-funding — funding data for a company.company_search(payload: dict) -> dict — POST /v1/companies/company-search — find/enrich a company by domain/profile.email_finder(payload: dict) -> dict — POST /v1/people/email-finder — work email from first_name + last_name + domain/company_name.email_validation(email: str, **opts) -> dict — POST /v1/people/email-validation — deliverability/validation for an email.employee_finder(payload: dict) -> dict — POST /v1/people/employee-finder — list employees at a company.get_credits() -> dict — GET /v1/credits — current credit balance (read-only, safe pilot).job_change_detector(payload: dict) -> dict — POST /v1/people/job-change-detector — detect recent job changes.mobile_finder(payload: dict) -> dict — POST /v1/people/mobile-finder — mobile phone from profile_url or name+domain.people_search(payload: dict) -> dict — POST /v3/people/search — people search (v3).personal_email_finder(payload: dict) -> dict — POST /v1/people/personal-email-finder — personal email from a profile.profile_search(payload: dict) -> dict — POST /v1/people/profile-search — find/enrich a LinkedIn profile.role_finder(payload: dict) -> dict — POST /v1/people/role-finder — find the person in a given role at a company.technographics(payload: dict) -> dict — POST /v1/companies/technographics — tech stack for a company.