← all tools
Enrichment

LeadMagic

Find an email, prove it is real, and find the mobile behind it.

Cost per call0.1–5.5 cr
Your own keyoptional
CategoryEnrichment

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.

things you can ask for

  • Find and verify emails for this shortlist, then push the clean ones into SmartLead
  • Which of these contacts have moved companies since we last spoke?
  • Get the LinkedIn profile behind this email, then go further with Wiza
  • Take this candidate list csv, find mobiles, and write them back to Vincere

works well with LeadMagic

  • Wiza

    go the other way, from a LinkedIn URL to contact detail

  • SmartLead

    send only to addresses LeadMagic already validated

  • Vincere

    keep the job-change flags on the candidate record

  • Apollo

    build the list LeadMagic then resolves

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 →

What your agent reads before it touches LeadMagic

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 →
Show the raw playbookwritten for the agent

WHAT/guardrails here; HOW in reference/endpoints.md + lib/leadmagic.py. Docs cached at reference/docs/leadmagic/raw/llms-full.txt.

Auth & config

  • Base URL: https://api.leadmagic.io
  • Auth: header X-API-Key (LeadMagic → Settings → API). Env LEADMAGIC_API_KEY; never hardcode.
  • Most endpoints are POST with a JSON body; GET /v1/credits is free.

Guardrails

  • Credits are consumed per successful result. 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).

Operations

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().

Handoff

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 notes (production experience)

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).

  • Cheap gates first: email validation, company search, jobs finder - escalate to email finder / mobile finder / profile search only when the target is worth it.
  • Validation rule: accept email_status == valid; treat catch_all and unknown as unresolved unless risk is accepted.
  • Conservative on catch-all (many Google Workspace / corporate domains): 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.
  • If pilot profile/phone quality is noisy, switch to a quality-first enricher before scaling.
  • Run 1-row pilots; validate every email candidate; keep fallback chains explicit.

Callable surface — lib/leadmagic.py

Import: 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.