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.
the cheap first pass FullEnrich cleans up after
validate the waterfall's output before it reaches a mailbox
a second waterfall when the first comes back thin
when the list is long enough that throughput beats depth
write the resolved contacts onto the candidate
A skill is a whole pipeline your agent already knows. These ones call FullEnrich as part of the run.
PredictLeads signals fresh funding. Build a candidate pool via GitHub + Apollo weeks before the JDs go live.
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 →WHAT/guardrails here; HOW in reference/endpoints.md + lib/fullenrich.py. Per-endpoint docs cached at reference/docs/fullenrich/raw/.
https://app.fullenrich.com/api/v2Authorization: Bearer <key> (FullEnrich → Settings → API). Env FULLENRICH_API_KEY; never hardcode.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.
get_credits() first; verify_key() is a safe read-only auth pilot.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().
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-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).
bulk_enrich / reverse_email return an enrichment_id -> poll get_result / get_reverse_result for terminal data. Search (people_search/company_search) is synchronous.DELIVERABLE > HIGH_PROBABILITY > CATCH_ALL > INVALID; use the most_probable_work_email field for the best result.forceResults=true on get-result returns partial data while still running.lib/fullenrich.pyImport: 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).