FullEnrich
High-quality email/phone waterfall enrichment over 20+ sources, plus synchronous people/company search. Key gotcha: enrichment is async (submit + poll).
Reach for FullEnrich when you need deep waterfall email/phone enrichment with broad provider coverage, reverse-email lookups, or synchronous prospecting by title/company/location. Best for quality over single-provider speed.
Managed credits or BYOK: each field has its own method and its own price, billed once on result retrieval when the result carries data: work email 1.3 credits, personal email 3.8, mobile 12.6. search_company = 0.4 / result; retrieval is free. get_credits reads your own account and needs your own FullEnrich key.
Capabilities
| Tool | Does | Cost |
|---|---|---|
start_work_email_enrichment | Submit a bulk work-email job → enrichment_id (async) | Deferred, 1.3 / result on retrieval |
start_personal_email_enrichment | Submit a bulk personal-email job (async) | Deferred, 3.8 / result on retrieval |
start_mobile_enrichment | Submit a bulk mobile-phone job (async) | Deferred, 12.6 / result on retrieval |
get_bulk_enrichment | Fetch terminal results for an enrichment job | Free |
start_reverse_email | Submit a reverse-email (identify contact from email) job (async) | Deferred (billed on retrieval) |
get_reverse_email | Fetch reverse-email results | Free |
search_company | Synchronous company prospecting | 0.4 / result |
get_credits | Balance / usage on your own account | BYOK only |
Guidance
- Async submit + async fetch: every
start_*returns anenrichment_id; poll the matchingget_*for terminal data. PassforceResults=trueto get partials while still running. - Batch at the provider, not the row: one
start_*call takes up to 100 contacts and returns oneenrichment_id, so one job and one poll loop cover all of them. A job takes roughly the same time whether it holds 1 or 100 contacts, so never loopstart_*over rows one at a time. Inside theemail_enrichment/personal_emailwaterfalls (hyreflow tools execute <waterfall> --rows …) the engine does this for you: every row still pending at the FullEnrich step rides one job, results are matched back per row via acustomecho on each contact, and billing stays per row (hits only). - A stalled job keeps its identity, and ends the chain right there: when the poll budget runs out first, the step reports
still_enrichingwithjob_idandresume, and no further provider runs for that row — the job settles on its own server-side and bills once when it finishes. Poll sooner withhyreflow tools execute fullenrich get_bulk_enrichment --payload '{"enrichment_id": "<job_id>"}'. Polling is free; once the job finishes, that poll charges one unit per revealed contact (each once, keyed on the job + contact, so re-polling is free). Do not resend the contacts, that starts and bills a second job. - Pick the method for the field you want: a mobile costs ten times a work email, so
start_mobile_enrichmentis the expensive channel and the email methods stay cheap. The job asks for exactly the field its method names, and the retrieval bills that field's price. - Supply a LinkedIn URL: it lifts email accuracy 5–20% and phone accuracy 10–60%.
- Email-status hierarchy: DELIVERABLE > HIGH_PROBABILITY > CATCH_ALL > INVALID; prefer the
most_probable_work_emailfield. - Don't use FullEnrich for validation-only (use a dedicated validator) or for quick single-provider lookups (Prospeo/LeadMagic are faster/cheaper).
hyreflow tools execute fullenrich start_work_email_enrichment \
--payload '{"datas":[{"first_name":"Ada","last_name":"Lovelace","company_name":"Example","linkedin_url":"https://linkedin.com/in/example"}]}'In a waterfall: member of the email_enrichment and personal_email chains (see Integrations Overview). Note: its async methods need the job wrapper to participate in the sync runner.