← all tools
Enrichment

FullEnrich

Ask several data providers at once, keep whichever one is right.

Cost per call0.4–12.6 cr / result
Your own keyoptional
CategoryEnrichment

FullEnrich is a waterfall. Instead of betting on a single vendor it queries several and returns the best answer, which lifts the hit rate on exactly the contacts one source would have missed. You are charged only for successful finds.

FullEnrich is what you reach for when a cheaper single-source enricher came back thin.

things you can ask for

  • Enrich this list and tell me the coverage rate
  • Take everything Apollo could not resolve and run it through the waterfall
  • Find whatever contact details exist for these 200, then validate with Enrichley
  • Get numbers for the ones we could not email, and log them in Loxo

works well with FullEnrich

  • Apollo

    the cheap first pass FullEnrich cleans up after

  • Enrichley

    validate the waterfall's output before it reaches a mailbox

  • BetterContact

    a second waterfall when the first comes back thin

  • Icypeas

    when the list is long enough that throughput beats depth

  • Loxo

    write the resolved contacts onto the candidate

Skills that use FullEnrich

A skill is a whole pipeline your agent already knows. These ones call FullEnrich as part of the run.

signal5 steps

Funded round → 30-day talent sweep

PredictLeads signals fresh funding. Build a candidate pool via GitHub + Apollo weeks before the JDs go live.

coming soon

What your agent reads before it touches FullEnrich

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

WHAT/guardrails here; HOW in reference/endpoints.md + lib/fullenrich.py. Per-endpoint docs cached at reference/docs/fullenrich/raw/.

Auth & config

  • Base URL: https://app.fullenrich.com/api/v2
  • Auth: Authorization: Bearer <key> (FullEnrich → Settings → API). Env FULLENRICH_API_KEY; never hardcode.

Async flow (important)

Enrichment is a bulk job, one start method per field: start_work_email_enrichment(datas=[...]) (or start_personal_email_enrichment / start_mobile_enrichment) → returns enrichment_id → poll get_bulk_enrichment(enrichment_id) until terminal (or pass a webhook_url). Same pattern for start_reverse_email / get_reverse_email. datas is a list of contacts ({first_name, last_name, domain, company_name, linkedin_url}) — the job asks for the field its method names.

Guardrails

  • Credits: successful enrichments consume credits, priced per field — a personal email costs 3x a work email and a mobile 10x, so pick the start method deliberately. Pilot one contact, confirm, then run the batch. Check get_credits() first; verify_key() is a safe read-only auth pilot.

Operations

start_work_email_enrichment, start_personal_email_enrichment, start_mobile_enrichment, get_bulk_enrichment, start_reverse_email, get_reverse_email, search_company, get_credits, verify_key; anything else via generic request().

Handoff

Enrichment layer: take a shortlisted contact list (from Apollo/Exa/sourcing) → FullEnrich for verified emails/phones → write to ATS (recruit-crm) or sequencer (instantly/sourcewhale). Enrich late, on the filtered set.

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

  • Async: bulk_enrich / reverse_email return an enrichment_id -> poll get_result / get_reverse_result for terminal data. Search (people_search/company_search) is synchronous.
  • Per-field vendor credit costs: work email = 1; personal email = 3; mobile = 10 — each has its own start method, so the price follows the method you call (use the mobile job judiciously).
  • Email status hierarchy: DELIVERABLE > HIGH_PROBABILITY > CATCH_ALL > INVALID; use the most_probable_work_email field for the best result.
  • A LinkedIn URL lifts accuracy notably (emails +5-20%, phones +10-60%).
  • forceResults=true on get-result returns partial data while still running.
  • Use it for: high-quality waterfall (20+ sources). Not for validation-only.

Callable surface — lib/fullenrich.py

Import: from lib.fullenrich import FullEnrich → instantiate FullEnrich() (reads key from env). Base: https://app.fullenrich.com/api/v2. Generic passthrough: request(method, path, *, params, json).

  • get_bulk_enrichment(enrichment_id: str) -> dict — GET /contact/enrich/bulk/{enrichment_id} — poll for the bulk enrichment result.
  • get_credits() -> dict — GET /account/credits — current credit balance.
  • get_reverse_email(enrichment_id: str) -> dict — GET /contact/reverse/email/bulk/{enrichment_id}.
  • search_company(payload: dict) -> dict — POST /company/search — filter-based company search (see cached docs for filters).
  • start_mobile_enrichment(datas: list[dict], name: str = 'hyreflow enrichment', webhook_url: str | None = None, **opts) -> dict — POST /contact/enrich/bulk — start a MOBILE PHONE enrichment job. Returns {enrichment_id}.
  • start_personal_email_enrichment(datas: list[dict], name: str = 'hyreflow enrichment', webhook_url: str | None = None, **opts) -> dict — POST /contact/enrich/bulk — start a PERSONAL EMAIL enrichment job. Returns {enrichment_id}.
  • start_reverse_email(datas: list[dict], name: str = 'hyreflow reverse', webhook_url: str | None = None, **opts) -> dict — POST /contact/reverse/email/bulk — reverse-lookup people from emails.
  • start_work_email_enrichment(datas: list[dict], name: str = 'hyreflow enrichment', webhook_url: str | None = None, **opts) -> dict — POST /contact/enrich/bulk — start a WORK EMAIL enrichment job. Returns {enrichment_id}.
  • verify_key() -> dict — GET /account/keys/verify — check the API key is valid (good read-only pilot).