Waterfall Contact Enrichment API - Email and Mobile Finder
Pricing
$14.00 / 1,000 results
Waterfall Contact Enrichment API - Email and Mobile Finder
Find work emails, personal emails and mobile numbers for B2B contacts from a profile URL or a name and company, with every address verified. Also reverse email lookup, and people and company search across job title, seniority, industry, headcount and tenure. Pay per result.
Pricing
$14.00 / 1,000 results
Rating
0.0
(0)
Developer
Nabeel Hassan
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
3 days ago
Last modified
Categories
Share
Give it a profile URL, or a name and a company, and get back a verified work email, a personal email and a mobile number. One flat row per contact.
What this actor does
- Runs a waterfall, not a single source. The provider queries a series of upstream contact databases in turn and stops at the first one that answers, which is why the hit rate is higher than any one source on its own. That is also why an enrichment takes minutes rather than milliseconds, and why the run is built around batches rather than around one request per contact.
- Verifies every address before returning it. Each email comes back with a status: deliverable at roughly a two percent bounce rate, high probability at roughly nine, catch-all higher again, invalid excluded from the best-address column entirely. You can filter on it.
- Returns the alternatives, not only the winner. The best work email, the best personal email and the best mobile number are their own columns, and every other address and number the waterfall found is kept alongside them. The second-best address is often the one that matches a record you already hold.
- Prices the decision up front. A work email is one credit on your own plan, a personal email three, a mobile number ten. Asking for all three costs fourteen times what asking for the first costs, so the default is the work email alone and the run logs what it is about to spend before it starts.
- Turns an address back into a person. Reverse email lookup takes an address you already have and returns the person and the company behind it, which is how you fill in a sign-up list that has nothing but email addresses in it.
- Searches for people you do not know yet. Twenty filters over job title, seniority, function, skills, languages, universities, current and past employers, industry, location, headcount, founding year, tenure and time since the last job change. Any line beginning with a minus sign excludes that value instead of requiring it.
- Searches for companies the same way. Name, domain, description keywords, specialties, industry, type, headquarters, headcount and founding year. Description keywords are the filter that finds companies doing a thing rather than companies filed under a category.
- Finds people who just moved. Filter on days since the last job change to reach someone in their first quarter somewhere new, while they are still choosing their own tools.
- Never submits more than you asked for. Enrichment batches go one at a time, so a run that stops at the result cap or at the spending limit has spent your provider credits only on the contacts it actually returned.
- Knows the difference between out of credit and finished. This provider reports an exhausted balance as a job status rather than as an error, which is exactly how an abandoned batch gets written up as a successful empty run elsewhere. Here it stops and says so.
- Never charges for a miss. Only rows carrying a resolved record are billed.
Input
| Field | What it does |
|---|---|
mode | Enrich, reverse lookup, people search, company search, or a single lookup. |
linkedinUrls | Profile URLs to enrich, one per line. |
contacts | Contacts as objects, when you have CRM rows rather than links. |
emails | Addresses to reverse look up. |
enrichFields | Work email, personal email, mobile, and what each costs. |
currentJobTitles | Titles at the current employer. |
seniorityLevels | Owner through to Senior. |
jobFunctions | The broad function the person works in. |
subFunctions | The narrower function under it. |
pastJobTitles | Titles the person held before. |
personNames | First, last or full name. |
personLinkedinUrls | Specific people by profile URL. |
personLocations | Continent, country, region or city. |
personLanguages | Languages spoken. |
personSkills | Listed skills. |
personUniversities | Universities attended. |
currentCompanyNames | Where they work now. |
currentCompanyDomains | The same, by domain. |
currentCompanyLinkedinUrls | The same, by company profile URL. |
currentCompanyIndustries | Employer industry. |
currentCompanySpecialties | Employer specialties. |
currentCompanyTypes | Public, private, nonprofit and the rest. |
currentCompanyHeadquarters | Where the employer is based. |
pastCompanyNames | Employers they worked at before. |
pastCompanyDomains | The same, by domain. |
companyNames | Company search: names. |
companyDomains | Company search: domains. |
companyLinkedinUrls | Company search: profile URLs. |
companyKeywords | Company search: words in the description. |
companySpecialties | Company search: specialties. |
companyIndustries | Company search: industries. |
companyTypes | Company search: organisation type. |
companyHeadquarters | Company search: headquarters. |
exactMatch | Match text filters exactly rather than approximately. |
headcountMin / headcountMax | Employee count range. |
foundedYearMin / foundedYearMax | Founding year range. |
yearsInPositionMin / Max | Time in the current role. |
yearsAtCompanyMin / Max | Tenure at the current employer. |
daysSinceJobChangeMin / Max | Time since the last move. |
requireWorkEmail | Keep only rows with a work email. |
requirePhone | Keep only rows with a mobile number. |
requireAnyContact | Keep only rows reachable by some route. |
workEmailStatuses | Keep only these verification statuses. |
minCompanyHeadcount | Drop rows whose company is smaller than this. |
jobName | A label for the batch on your provider dashboard. |
reportCredits | Log your remaining credits first. |
requestsPerMinute | Pace the run under the provider rate limit. |
jobTimeoutMinutes | Give up waiting for a batch after this long. |
skipNotFound | Leave misses and refusals out of the dataset. |
maxResults | Cap on rows, and on provider credits spent. |
apiKey | Your own API key. Stored as a secret. |
Example output
{"found": true,"mode": "enrich","query": "https://www.linkedin.com/in/example","workEmail": "j.snow@example.com","workEmailStatus": "DELIVERABLE","personalEmail": "jsnow@gmail.com","personalEmailStatus": "DELIVERABLE","phone": "+1 555-123-4567","phoneRegion": "US","workEmails": ["j.snow@example.com", "john.snow@example.com"],"workEmailStatuses": ["DELIVERABLE", "CATCH_All"],"personalEmails": ["jsnow@gmail.com"],"phones": ["+1 555-123-4567"],"phoneRegions": ["US"],"firstName": "John","lastName": "Snow","fullName": "John Snow","headline": "Head of Sales Operations at Example Inc","jobTitle": "Head of Sales Operations","jobStartedAt": "2022-03-15T00:00:00Z","companyName": "Example Inc","companyDomain": "example.com","companyWebsite": "https://www.example.com","companyHeadcount": 250,"companyFoundedYear": 2010,"companyType": "Privately Held","companyIndustry": "Software Development","companyLinkedinUrl": "https://www.linkedin.com/company/example-inc","country": "United States","countryCode": "US","region": "California","city": "San Francisco","linkedinUrl": "https://www.linkedin.com/in/example","skills": ["Sales Operations", "CRM Management"],"languages": ["English", "French"],"universities": ["Stanford University"],"custom": { "user_id": "12584" },"error": null,"raw": { }}
Frequently asked questions
What is waterfall enrichment and why does it find more?
Any single contact database has gaps, and they are not the same gaps. A waterfall asks one source, and if it comes back empty asks the next, and the next, until something answers or the list runs out. The hit rate is therefore the union of every source rather than the coverage of the best one. The cost of that is time: the run waits on a chain of upstream lookups instead of a single query, which is why enrichment here is a batch job you wait a few minutes for rather than an instant response.
What does an enrichment actually cost me?
On your own provider plan, one credit for a work email, three for a personal email and ten for a mobile number, charged when something is found. Asking for all three is fourteen credits a contact. That ratio is the thing worth knowing before you start, so the enrichFields input defaults to the work email alone and the run logs what it is about to look for. Separately, this actor charges per row written to the dataset.
What do I need to supply for an enrichment to work?
Either a professional network profile URL, or a first name and a last name together with a company domain or company name. A profile URL is markedly better: it raises the email hit rate by up to a fifth and the mobile number hit rate by up to three fifths, and it is what makes the full profile, job title, location, employer headcount and the rest come back with the result. Contacts carrying neither are refused before they are sent, so a half-filled CRM row costs you nothing.
What do the email statuses mean?
Deliverable means the address was verified and bounces about two percent of the time. High probability means the domain is catch-all so no server will confirm the individual mailbox, but the provider's own checks say it is likely real, at about nine percent. Catch-all is the same situation with less supporting evidence and a higher rate again. Invalid is very likely to bounce, and is already excluded from the best-address column. Filter on the status rather than assuming every returned address is equal.
What is reverse email lookup for?
Turning an address into a person. Sign-up forms, webinar lists and inbound demo requests often give you nothing but an email address and a first name, which is not enough to route, score or personalise anything. Reverse lookup returns the person and the company behind the address, so a list of raw addresses becomes a list of people with titles and employers.
How do the search filters combine?
Different filters are combined with each other: a job title filter and a headcount range both have to hold. Several values inside one filter are alternatives: three job titles means any of the three. A line beginning with a minus sign excludes that value instead of requiring it, which is how you say "at these two companies but not that subsidiary" in a single field. Numeric filters are ranges, and a range with neither end set is not sent at all.
When should I turn exact matching on?
For domains and profile URLs, always: an approximate match on a domain is meaningless. For company names and job titles, usually not. With it off the provider tolerates missing words, extra words and reordering, so "VP Sales" also finds "Vice President of Sales, EMEA". Matching is never case sensitive either way.
Why would I search rather than enrich?
They answer different questions and cost different amounts. Search finds people and companies you did not know about, from filters, and returns profiles without contact details. Enrichment takes people you have already identified and finds how to reach them. The normal pattern is to search first, look at what comes back, and enrich only the rows worth the credits.
How do I find people who recently changed jobs?
Set the maximum days since job change to ninety. Someone in their first quarter at a new company is still choosing tools, still has budget that has not been committed, and has not yet formed a preference. That filter is the reason the field exists, and it pairs well with a past employer filter when you want people who left a particular company.
What happens when a batch runs out of credits halfway?
This provider reports that as a job status rather than as an error, which is exactly how an abandoned batch gets recorded as a successful empty run in an integration that only reads HTTP status codes. This actor checks the job status, stops, and tells you the balance ran out, so you see the real reason rather than an empty dataset.
Do I need my own API key?
Yes. This actor does not include data access. You use your own key from FullEnrich, the provider whose contact enrichment API this actor calls, taken from the API page of your provider dashboard and pasted into the apiKey field, where it is stored as an Apify secret. Your own plan, credits and terms apply.
How much does a run cost?
Pricing is pay per result: you are charged for each record resolved into the dataset, and never for contacts the provider found nothing for, for inputs refused before they were sent, for rows dropped by the filters, or for duplicates. Apify platform usage is included in the per-result price. Your own provider credits are separate and billed by them.
Keyword map
contact enrichment API, waterfall enrichment, email finder API, work email finder, personal email finder, mobile phone number finder, cell phone enrichment, B2B contact data API, lead enrichment API, reverse email lookup, email to person lookup, people search API, prospect search API, company search API, firmographic search, job title search, seniority filter, job change alerts, job change data, technographic prospecting, CRM enrichment, lead list building, sales prospecting API, email verification status, bounce rate reduction, GDPR compliant enrichment