> Enrich.chat gives AI agents verified work emails and mobiles. To use it from an agent, read https://enrich.chat/agents.md . This is the Markdown version of https://enrich.chat/blog/waterfall-enrichment/

# Waterfall enrichment: how it works, what it costs, and when you need it

A waterfall asks data providers one after another and keeps the first valid answer. Here is how the main tools run it, what each found contact costs, and how to build your own.

By Enrich.chat Editorial. Updated October 15, 2026.

**Short answer:** Waterfall enrichment queries several contact data providers in sequence and stops at the first valid result, so each provider only sees the rows the earlier ones missed. Managed waterfalls such as [FullEnrich](https://fullenrich.com/pricing) and [BetterContact](https://bettercontact.rocks/pricing/) bill only results: $0.049 to $0.075 per work email and $0.49 to $0.75 per mobile on entry plans, checked October 15, 2026.

## Key takeaways

- Waterfall enrichment asks data providers one after another and stops at the first valid result, so each provider sees only the rows earlier ones missed.
- FullEnrich and BetterContact charge 1 credit per email and 10 per mobile, and nothing on a miss: $0.49 to $0.75 per mobile on entry plans (October 15, 2026).
- Misses can still cost money: Apollo's API docs say some sources charge for lookups that find nothing, and Lusha's API charges at least 1 credit per request.
- Found means different things: FullEnrich charges for catch-all emails and lemlist for risky ones, so re-verify every row with one checker before you send.
- Put the cheapest provider that bills only hits first and send only its misses down the waterfall.

## What is waterfall enrichment?

Waterfall enrichment fills missing contact data by asking several data providers in a fixed order and stopping at the first valid answer. If provider 1 has no verified email for a person, the row falls to provider 2, then provider 3. The run ends when one returns a usable result or the list runs out.

It exists because no single provider has everyone. Each one is stronger in some countries, industries or company sizes. [Apollo's help center](https://knowledge.apollo.io/hc/en-us/articles/34071089002509-Waterfall-Enrichment-Overview) describes the same pattern: when Apollo has no email or phone for a contact, it checks your connected third-party sources in the order you set until one matches. [BetterContact's pricing FAQ](https://bettercontact.rocks/pricing/) claims a single source finds only 30 to 60 percent of the emails or mobiles you ask for. That is a vendor's own figure, so test it on your own list.

People also call it a data waterfall or cascade enrichment. It is a method, not a data source: you still need providers to query and checks on what they return. For the wider topic, read [what data enrichment is](https://enrich.chat/blog/what-is-data-enrichment/).

## How does waterfall enrichment work, step by step?

Every waterfall runs five steps for each row: order the providers, query one, validate the answer, stop or continue, then merge. The steps are the same in Clay, FullEnrich, BetterContact or a script you write yourself.

### 1. Order the providers

Rank providers by valid results per dollar for the field you need. [Clay's company enrichment lesson](https://university.clay.com/lessons/enriching-company-data) says its waterfalls usually start with the most cost-effective provider. You can reorder them if one covers your market better.

### 2. Query with the best identifier

Send the strongest input you have. A LinkedIn URL is usually a better key than a name and company. [FullEnrich's API docs](https://docs.fullenrich.com/api/v2/contact/enrich/bulk/post) say adding one can lift its enrichment rates by 5 to 20 percent for emails and 10 to 60 percent for mobiles. [Clay's email waterfall](https://university.clay.com/lessons/enriching-people-data) needs at least a company domain.

### 3. Validate the answer

A returned email is not yet a valid email. Check it before you accept it: a mailbox check for emails, a line check for mobiles. [Clay's email waterfall](https://university.clay.com/lessons/enriching-people-data) validates each email it finds, with ZeroBounce by default.

### 4. Stop or continue

If the answer passes, stop and skip the remaining providers for that row. If it misses or fails, pass the row down. [Clay's email lesson](https://university.clay.com/lessons/enriching-people-data) says that once a provider finds a valid email, the process stops for that contact. Apollo works differently: [its waterfall](https://knowledge.apollo.io/hc/en-us/articles/34071089002509-Waterfall-Enrichment-Overview) keeps going until a validated result is found, and every source that returns data charges credits.

### 5. Merge and record the source

Write the value, its status and the provider that found it back into the row. Keep that source column: you need it to count each provider's hits and trace bad data.

**Figure 1: How one row moves through a waterfall.** A row with a name, domain or LinkedIn URL goes to provider 1. A valid result stops the waterfall and writes the value, its status and the provider that found it. A miss or an invalid result passes the row to provider 2, then provider 3. If all three miss, the row is marked not found, which costs nothing on pay-per-hit tools. Found values are verified again before sending.

*One row through a three-provider waterfall. The first valid result stops the run; misses and invalid results fall to the next provider. Based on [Clay's email waterfall](https://university.clay.com/lessons/enriching-people-data) and [BetterContact's quickstart](https://doc.bettercontact.rocks/quickstart).*

## How do Clay, FullEnrich and BetterContact run a waterfall?

Clay lets you build and reorder the waterfall yourself in a table. FullEnrich and BetterContact run a managed waterfall behind one API call and choose the providers for you. Apollo adds a waterfall on top of its own database. This is how each one works, from their own docs on October 15, 2026.

### Clay waterfall enrichment

In Clay, a waterfall is a column you add to a table. You pick a field, such as work email, and Clay shows a pre-arranged provider order that you can change. [Clay's pricing page](https://www.clay.com/pricing) says it connects to 150+ providers. The [email waterfall lesson](https://university.clay.com/lessons/enriching-people-data) adds three details:

- It validates emails with ZeroBounce by default, and you can pick another validator.
- Catch-all emails count as valid unless you turn on **Only mark "Safe to Send" emails as valid**.
- If a provider returns no email, your data credits are refunded automatically and Clay moves to the next provider.

[Clay's pricing FAQ](https://www.clay.com/pricing) says an enrichment that returns no result uses no Data Credits or Actions. Clay also suggests a [10-row test run](https://university.clay.com/lessons/enriching-company-data) before you run the full table.

### FullEnrich

FullEnrich is one API call. You send up to 100 contacts to `POST /contact/enrich/bulk` and choose `enrich_fields`: work emails, phones or personal emails, per the [bulk endpoint docs](https://docs.fullenrich.com/api/v2/contact/enrich/bulk/post). Results go to your `webhook_url`, for the whole batch or for each contact as it finishes.

The [FullEnrich pricing page](https://fullenrich.com/pricing) lists 25+ sources. FullEnrich's [engineering note](https://docs.fullenrich.com/api/v2/implement-in-product/quality-over-speed) mentions 15 to 20 providers per waterfall. It also says FullEnrich rejects over 30 percent of the data its providers return. Its [credit docs](https://docs.fullenrich.com/api/v2/general/credit) say credits are used only when it finds a result: 1 credit per email, 10 per mobile, 3 per personal email. A catch-all email counts as found.

### BetterContact

BetterContact takes 1 to 100 leads at `POST /async` and returns a `request_id`. You poll for results or pass a webhook. The [BetterContact endpoint reference](https://doc.bettercontact.rocks/api-reference/endpoint/create) lists the options that shape its waterfall:

- `enrich_email_address` (on by default) and `enrich_phone_number` (off by default).
- `verify_catch_all`, an extra catch-all check on plans with that add-on.
- `timeout_seconds`, which ends the waterfall after a set time and returns what it found.
- `process_flow`, a custom provider flow for accounts with that add-on.

The [BetterContact quickstart](https://doc.bettercontact.rocks/quickstart) says it picks the provider order for each lead and asks the next provider when one returns invalid data. Its [credit rules](https://doc.bettercontact.rocks/api-reference/credits) say you pay once for the result, not once per provider, and nothing for undeliverable emails.

### Apollo

Apollo checks its own data first, then the third-party sources your admin connects, in that order. An optional validator runs after each source and charges separately. [Apollo's help center](https://knowledge.apollo.io/hc/en-us/articles/34071089002509-Waterfall-Enrichment-Overview) says the run does not stop at the first result returned, so more than one source can charge for the same contact. Through the API, you set `run_waterfall_email` or `run_waterfall_phone` and pass a `webhook_url`, per [Apollo's API docs](https://docs.apollo.io/docs/enrich-phone-and-email-using-data-waterfall).

## What are the best waterfall enrichment tools in 2026?

The best waterfall enrichment tool depends on whether you want to build the waterfall or buy one. Clay is the most flexible builder. FullEnrich, BetterContact and Waterfall.io sell a managed waterfall. Apollo, Lusha and lemlist add one to a sales platform you may already pay for.

| Tool | What it cascades | Price, October 15, 2026 | What a miss costs |
| --- | --- | --- | --- |
| Clay | Any field, such as work emails, mobiles and company data, from [150+ providers](https://www.clay.com/pricing) in an order you set | [Launch from $185 a month](https://www.clay.com/pricing) with 2,500 Data Credits; credits from $0.05; HTTP API columns need Growth, from $495 | No Data Credits or Actions when an enrichment returns no result |
| FullEnrich | Work emails, mobiles and personal emails from 25+ sources, ordered by FullEnrich | [Pro: $55 a month for 1,000 credits](https://fullenrich.com/pricing); 1 credit per email, 10 per mobile | [Nothing](https://docs.fullenrich.com/api/v2/general/credit); catch-all emails count as found |
| BetterContact | Work emails and mobiles from 20+ vendors, ordered per lead | [Starter: $15 a month for 200 credits; Pro: $49 for 1,000](https://bettercontact.rocks/pricing/); 1 credit per email, 10 per mobile | [Nothing](https://doc.bettercontact.rocks/api-reference/credits); one charge per result, not per provider |
| Apollo | Emails and phones: Apollo's data first, then sources your admin connects | [Basic: $49 a seat a month, billed annually](https://www.apollo.io/pricing), includes waterfall enrichment | [Some sources charge for a lookup that finds nothing](https://docs.apollo.io/docs/enrich-phone-and-email-using-data-waterfall) |
| Lusha | Work emails and phones in its Workspace waterfall | [2 credits per confirmed email, 8 per confirmed phone](https://docs.lusha.com/user-guide/usage-analytics/how-credits-are-counted); [Pro: $52.45 a month billed yearly, 7,200 credits a year](https://www.lusha.com/pricing/) | Nothing in the waterfall; an API request with no results costs 1 credit |
| lemlist | Emails from up to 10 providers, plus phone numbers | [Data add-on: $20 a month for 2,000 credits](https://www.lemlist.com/pricing); [5 credits per email, 20 per phone](https://help.lemlist.com/en/articles/8944295-credits-how-they-work) | Nothing; deliverable and risky emails are charged |
| Waterfall.io | Emails, mobiles and job changes from 30+ vendors, by API | [No public rate card](https://www.waterfall.io/pricing); quotes follow a test on your records | One credit per verified result, never per vendor queried |
| Enrich.chat | One provider, not a waterfall: work email, mobile, person and company profile | [Growth plan $29 a month for 100,000 credits; 10 credits per email, 250 per mobile, 5 per profile](https://enrich.chat/pricing/) | 0 credits when a lookup returns found: false |

The table shows entry plans. Credit prices fall on bigger plans: [FullEnrich's 15,000-credit plan](https://fullenrich.com/pricing) is $720 a month, or $0.048 a credit. Compare like with like, since each tool counts a different set of emails as found. For tools beyond waterfalls, see the [best data enrichment tools](https://enrich.chat/blog/best-data-enrichment-tools/).

## How much does waterfall enrichment cost per contact found?

On a tool that bills only results, the cost per contact found is the price per hit, however many providers the waterfall tried. On entry plans that is $0.049 to $0.075 per work email and $0.49 to $0.75 per mobile at FullEnrich and BetterContact. Enrich.chat works differently: it sells monthly credit plans. Pro-rated on the Growth plan ($29 a month for 100,000 credits), a work email found is $0.0029 and a mobile found is $0.0725 if you use every credit. The plan itself is a fixed $29 a month.

The credit math, from pricing pages on October 15, 2026:

- **FullEnrich Pro:** [$55 for 1,000 credits](https://fullenrich.com/pricing) is $0.055 a credit, so a mobile at 10 credits costs $0.55.
- **BetterContact Pro:** [$49 for 1,000 credits](https://bettercontact.rocks/pricing/), so a mobile costs $0.49. On Starter, at $15 for 200 credits, it costs $0.75.
- **lemlist:** [$20 for 2,000 credits](https://www.lemlist.com/pricing) is a cent a credit. An email at 5 credits costs $0.05 and a phone at 20 credits costs $0.20.
- **Clay:** Data Credits start at $0.05. [Clay's docs](https://university.clay.com/docs/actions-data-credits) price email finding at 0.5 credits per email found in their example. They say a fully enriched record typically costs 6 to 20 credits, or $0.30 to $1.00. Phone costs are shown per provider in the app, and the plan starts at $185 a month.

**Figure 2: Price per mobile found on entry plans.** Bar chart of the published price per mobile number found on each vendor's entry plan, billed monthly: Enrich.chat on its Growth plan at $0.0725 pro-rated, lemlist's data add-on $0.20, BetterContact Pro $0.49, FullEnrich Pro $0.55 and BetterContact Starter $0.75. Clay's phone cost varies by provider and is shown in the app.

*Price per mobile found on each vendor's entry self-serve plan, billed monthly, from published credit costs. These are prices, not fill rates: a waterfall may find mobiles that one provider misses. Enrich.chat is one provider, shown at the Growth plan's pro-rated price per mobile (250 credits, if you use all 100,000 credits); the plan itself is $29 a month. Sources: [FullEnrich](https://fullenrich.com/pricing), [BetterContact](https://bettercontact.rocks/pricing/), [lemlist](https://www.lemlist.com/pricing), [lemlist help](https://help.lemlist.com/en/articles/8944295-credits-how-they-work), [Clay](https://www.clay.com/pricing), checked October 15, 2026.*

### What happens when misses are billed?

Misses get expensive deep in a waterfall. Each step sees fewer rows, and the rows it sees are the hard ones, so fewer calls succeed. If a provider bills per call, its cost per found contact rises with every step down the cascade.

This happens in real tools. [Apollo's API docs](https://docs.apollo.io/docs/enrich-phone-and-email-using-data-waterfall) warn that some sources use credits on a lookup even when they find nothing. [Lusha's credit table](https://docs.lusha.com/user-guide/usage-analytics/how-credits-are-counted) charges its API at least 1 credit per request with no results, while its own Workspace waterfall charges nothing for "not found".

**Figure 3: Cost per contact found when misses are billed.** Illustrative math for 1,000 rows and three providers at $0.05 a call. When misses are billed, a found contact costs $0.10 at provider 1, $0.17 at provider 2 and $0.25 at provider 3, or $0.13 across the waterfall, for $92.50 in total. When only hits are billed, every found contact costs $0.05, for $36.00 in total.

*Made-up hit counts to show the arithmetic, not measurements of any provider. When every call is billed, each contact found deeper in the cascade costs more.*

The fix is to prefer providers that bill only hits. Judge any per-call provider by its cost per found contact at the position you put it, not by its list price.

### Worked example: one cheap step before the waterfall

Put the cheapest provider that bills only hits first and send only its misses down the waterfall. With Enrich.chat as step 1, each mobile it finds uses 250 credits, which is $0.0725 pro-rated on the Growth plan, against $0.55 on FullEnrich Pro. For every 100 mobiles found at step 1, that is 25,000 credits, or $7.25 pro-rated, against $55. The plan itself is a fixed $29 a month, so the pro-rated figure holds only if you use most of its credits. The waterfall still gets every row that step 1 missed, and you pay its price only for those extra finds.

The same logic works for emails: $0.0029 per work email at step 1, pro-rated on the Growth plan, against $0.049 to $0.075 on BetterContact. Price your list with the calculator on the [Enrich.chat pricing page](https://enrich.chat/pricing/) before you run it.

## How do you handle latency, duplicates and conflicting results?

Waterfalls are slower than single lookups, can charge twice for the same person, and can return two different answers.

### Latency

Each provider and each check adds time. [FullEnrich's docs](https://docs.fullenrich.com/api/v2/implement-in-product/quality-over-speed) say most enrichments finish in 30 to 90 seconds per contact, 56 seconds on average. [BetterContact says](https://doc.bettercontact.rocks/quickstart) its waterfall needs a few seconds, and its `timeout_seconds` option caps the wait. FullEnrich, BetterContact and Apollo all return waterfall results later, by webhook or polling. So run waterfalls in a background queue, not inside a user's click or an agent's turn. A single GET to the [Enrich.chat person enrichment API](https://enrich.chat/api/person-enrichment/) returns its answer in the same response, so an [AI agent](https://enrich.chat/agents/) can use it mid-conversation.

### Duplicates

Remove duplicate rows first: normalize LinkedIn URLs and lowercase domains. [FullEnrich](https://docs.fullenrich.com/api/v2/general/credit) charges nothing to re-enrich a contact within 3 months, but it does not dedupe contacts inside one bulk request. [Apollo](https://knowledge.apollo.io/hc/en-us/articles/34071089002509-Waterfall-Enrichment-Overview) skips a source that returned usable data for the same contact in the last 30 days. [BetterContact](https://doc.bettercontact.rocks/api-reference/endpoint/create) warns that its submit call is not idempotent: retrying a request that already succeeded enriches the same leads twice and uses credits twice. Store each `request_id` before you retry.

### Conflicting results

Conflicts appear when more than one provider answers, as in Apollo's design or when you query providers in parallel. Set rules in advance:

- Prefer `verified` over `catch_all`, and `catch_all` over `unknown`.
- Prefer the most recent check.
- Never overwrite a verified value with a weaker one.
- Keep the losing value and its source in a history column.

## How should you verify waterfall results before you send?

Verify waterfall results at the end, close to send time, with one checker for every row. Each tool means something different by "found", so a mixed list has mixed quality.

- [FullEnrich](https://docs.fullenrich.com/api/v2/general/credit) charges for deliverable, high-probability and catch-all emails.
- [lemlist](https://help.lemlist.com/en/articles/8944295-credits-how-they-work) charges for deliverable or risky emails.
- [BetterContact](https://doc.bettercontact.rocks/api-reference/credits) charges catch-all emails unless catch-all verification is on.
- [Clay](https://university.clay.com/lessons/enriching-people-data) treats catch-all emails as valid unless you turn on its Safe to Send setting.

A catch-all domain accepts mail for any address, so no checker can prove that one inbox exists. Flag those rows as risky. Test a domain with the free [catch-all checker](https://enrich.chat/tools/catch-all-checker/). For mobiles, confirm a live line with the [phone number validator](https://enrich.chat/tools/phone-number-validator/). A live line shows the number works, not that it belongs to the person.

Enrich.chat returns a status on every field. `work_email.status` is `verified`, `catch_all` or `unknown`, and `mobile.line` is `mobile` or `unknown`, which is the number's type, not a live-line check. Map other providers' statuses to the same values, so one rule decides what you send.

## When is a waterfall worth it, and when is one provider simpler?

A waterfall is worth it when one provider leaves too many gaps in a field you need, most often mobiles or contacts outside North America. One provider is simpler when its results cover your list, when you need answers in seconds, or when you want one bill and one status format.

A waterfall pays off when:

- **You need mobiles.** A mobile costs 10 times an email at [FullEnrich](https://fullenrich.com/pricing) and [BetterContact](https://bettercontact.rocks/pricing/), and BetterContact builds its plans around 20+ phone data providers.
- **Your list is international or full of small companies.** [Waterfall.io's pricing page](https://www.waterfall.io/pricing) says North American enterprise contacts resolve on the first source. Smaller companies and contacts outside a vendor's home region go deeper.
- **Your rows already went through one provider.** The misses are where a second and third provider earn their price.

One provider is simpler when:

- **The answer has to come back inside an app or an agent's turn.** FullEnrich, BetterContact and Apollo return waterfall results asynchronously.
- **You mostly need work emails** at companies in your core market.
- **You want one plan and one bill,** with unlimited seats, instead of credits spread across several tools.
- **You want one status scheme** and one place to debug.

Enrich.chat fits the second list and works as step 1 of the first, and it uses 0 credits when a lookup returns `found: false`, as the [pricing page](https://enrich.chat/pricing/) shows. It also has real gaps for waterfall buyers: it does not chain other vendors for you, and it has no visual table builder. If you want both, Clay is the better choice. See our [Clay alternatives](https://enrich.chat/alternatives/clay/) and the [Clay vs Apollo comparison](https://enrich.chat/compare/clay-vs-apollo/).

```text
Use www.enrich.chat to look up the work email and mobile for each row in my list that my waterfall marked not found, flag catch_all emails as risky, and tell me how many matched and the total credits_used
```

## How do you build a waterfall in code, n8n or Clay?

A working waterfall is a loop: call providers in order, accept the first verified answer, record the source, and mark the rest not found. Here are three versions that work with any APIs.

### Build a waterfall in Python

```
import time
import requests

def enrich_chat(row, key=None):
    """Step 1: one GET, answer in the same response, misses use 0 credits."""
    r = requests.get(
        "https://enrich.chat/v1/person",
        params={"linkedin_url": row["linkedin_url"], "fields": "email"},
        headers={"Authorization": "Bearer " + key} if key else {},
        timeout=30,
    )
    if r.status_code == 429:  # too fast: wait, then retry
        time.sleep(int(r.json().get("retry_after", 2)))
        return enrich_chat(row, key)
    if r.status_code == 402:  # free lookups used up: stop and resume later
        raise RuntimeError("free limit reached: " + r.json()["upgrade_url"])
    r.raise_for_status()
    p = r.json()
    email = p.get("work_email") or {}
    if not p.get("found") or not email.get("value"):
        return None
    return {"email": email["value"], "status": email["status"]}

def provider_b(row, key):
    # Call your next API here and map its answer to the same shape:
    # {"email": "...", "status": "verified" | "catch_all" | "unknown"}
    return None

PROVIDERS = [("enrich.chat", enrich_chat), ("provider_b", provider_b)]
ACCEPT = {"verified"}  # add "catch_all" only if you test those first

def waterfall(row, keys):
    for name, call in PROVIDERS:
        hit = call(row, keys[name])
        if hit and hit["status"] in ACCEPT:
            return {**row, **hit, "source": name}  # first valid answer wins
    return {**row, "email": None, "status": "not_found", "source": None}
```

Map every provider's statuses to one scheme before you compare them. Cache results by LinkedIn URL so a rerun does not pay twice. Enrich.chat asks agents to stay at or under 5 requests per second, answers `429` with a `retry_after` value, and uses 0 credits when `found` is false, per [agents.md](https://enrich.chat/agents.md). A key is optional: pass `None` as its key in `keys` to use the free tier, or a paid key from [enrich.chat/account/](https://enrich.chat/account/) for more volume.

### Build a waterfall in n8n

1. Start with any trigger that reads your rows, such as a Google Sheets or CRM node.
2. Add an [HTTP Request node](https://docs.n8n.io/integrations/builtin/core-nodes/n8n-nodes-base.httprequest/): method GET, URL `https://enrich.chat/v1/person`, query parameters `linkedin_url` and `fields=email,mobile`, and, if you use a key, an `Authorization: Bearer pp_...` header. A key is optional on the free tier. Under Options, set Items per Batch to 5 and Batch Interval to 1000 ms.
3. Add an [If node](https://docs.n8n.io/integrations/builtin/core-nodes/n8n-nodes-base.if/) that checks whether `work_email.status` equals `verified`. The true branch goes straight to your write step.
4. On the false branch, add a second HTTP Request node for your next provider, then a second If node on its status.
5. Merge the branches and write back the value, its status and a source column.

### Add Enrich.chat as a step in a Clay waterfall

Clay can call any HTTP API from a column, so Enrich.chat can fill the rows Clay's waterfall misses. [Clay's pricing page](https://www.clay.com/pricing) lists HTTP API integrations on Growth, from $495 a month, and on Enterprise.

1. Add an enrichment column and choose HTTP API.
2. Set the method to GET and the endpoint to `https://enrich.chat/v1/person`. Add the query parameters `linkedin_url`, set to your LinkedIn URL column, and `fields`, set to `email,mobile`.
3. If you use a key (optional on the free tier), save it as an HTTP API (Headers) account with `Authorization: Bearer pp_...`. [Clay's HTTP API docs](https://university.clay.com/docs/http-api-integration-overview) warn that headers typed into the column are visible in plain text to anyone with table access.
4. Set the field paths to return: `work_email.value`, `work_email.status`, `mobile.value`, `mobile.line` and `credits_used`.
5. Add a conditional run formula so the column runs only when your waterfall's email column is empty. Set the rate limit to 5 requests per 1,000 ms.
6. Run 10 rows, check the results, then run the table.

Each response returns `credits_used`, so a formula column can total your Enrich.chat credits. Clay meters its own platform work as Actions. Enrich.chat never logs in to LinkedIn; the URL is only a lookup key, as with the [LinkedIn to contact API](https://enrich.chat/api/linkedin-to-contact/).

## Frequently asked questions

### What is a data waterfall?

A data waterfall is another name for waterfall enrichment: an ordered list of data sources for one field, where each source only gets the records the earlier ones could not fill. Teams use it for work emails, mobile numbers and company data. It is not the same as a waterfall chart in finance, which shows how a starting value adds up to a final total. For the wider idea, read [what data enrichment is](https://enrich.chat/blog/what-is-data-enrichment/).

### Does Clay charge for waterfall misses?

Not for the data. [Clay's pricing FAQ](https://www.clay.com/pricing) says an enrichment that returns no result uses no Data Credits or Actions, and its [email waterfall lesson](https://university.clay.com/lessons/enriching-people-data) says credits are refunded automatically when a provider returns no email. Two catches: requests already sent still use credits if you stop a run midway, and the Launch plan starts at $185 a month. Our [Clay pricing guide](https://enrich.chat/blog/clay-pricing/) works through the full cost.

### Is there a waterfall enrichment API?

Yes. [FullEnrich's bulk endpoint](https://docs.fullenrich.com/api/v2/contact/enrich/bulk/post) takes up to 100 contacts per call and sends results to a webhook. [BetterContact's async endpoint](https://doc.bettercontact.rocks/api-reference/endpoint/create) takes 1 to 100 leads and returns a request_id to poll. [Apollo's people match endpoint](https://docs.apollo.io/docs/enrich-phone-and-email-using-data-waterfall) runs its waterfall when you set run_waterfall_email or run_waterfall_phone and pass a webhook_url. All three are asynchronous. For one provider that answers in the same request, see the [person enrichment API](https://enrich.chat/api/person-enrichment/).

### How many providers should a waterfall have?

Start with two or three, and add one only when a test shows it finds valid rows the others missed. Each extra provider adds latency, another integration and another status format to map. Managed tools go much deeper: [FullEnrich's docs](https://docs.fullenrich.com/api/v2/implement-in-product/quality-over-speed) mention 15 to 20 providers per waterfall, and [BetterContact](https://bettercontact.rocks/pricing/) lists 20+ vendors. Track hits per provider in a source column so you can drop the ones that add little.

### Is waterfall enrichment worth it for mobile numbers?

Mobiles are where a waterfall most often earns its cost. A mobile costs 10 credits at FullEnrich and BetterContact against 1 for an email, and [BetterContact's plans](https://bettercontact.rocks/pricing/) are built around 20+ phone data providers. Check every number for a live line before you dial, and follow TCPA rules for calls and texts. A live line proves the number works, not that it belongs to the person. Our guide to [direct dials](https://enrich.chat/blog/direct-dials/) covers the rest.

### Do waterfall tools charge for catch-all emails?

Often, yes. [FullEnrich](https://docs.fullenrich.com/api/v2/general/credit) charges 1 credit for a deliverable, high-probability or catch-all email. [lemlist](https://help.lemlist.com/en/articles/8944295-credits-how-they-work) charges for deliverable or risky emails. [BetterContact](https://doc.bettercontact.rocks/api-reference/credits) charges catch-alls unless its catch-all verification is on, and Clay treats them as valid unless you turn on its Safe to Send setting. A catch-all domain accepts any address, so test risky ones with a [catch-all checker](https://enrich.chat/tools/catch-all-checker/) first.

## Sources

1. [Clay pricing](https://www.clay.com/pricing)
2. [Enriching people data (email waterfall)](https://university.clay.com/lessons/enriching-people-data)
3. [Enriching company data (waterfalls)](https://university.clay.com/lessons/enriching-company-data)
4. [Actions and Data Credits](https://university.clay.com/docs/actions-data-credits)
5. [HTTP API integration overview](https://university.clay.com/docs/http-api-integration-overview)
6. [FullEnrich pricing](https://fullenrich.com/pricing)
7. [Credits and testing tips](https://docs.fullenrich.com/api/v2/general/credit)
8. [Enrich contacts in bulk](https://docs.fullenrich.com/api/v2/contact/enrich/bulk/post)
9. [Quality over speed](https://docs.fullenrich.com/api/v2/implement-in-product/quality-over-speed)
10. [BetterContact pricing](https://bettercontact.rocks/pricing/)
11. [Quickstart](https://doc.bettercontact.rocks/quickstart)
12. [Submit leads for waterfall enrichment](https://doc.bettercontact.rocks/api-reference/endpoint/create)
13. [Credits](https://doc.bettercontact.rocks/api-reference/credits)
14. [Waterfall Enrichment Overview](https://knowledge.apollo.io/hc/en-us/articles/34071089002509-Waterfall-Enrichment-Overview)
15. [Enrich contact emails and phone numbers with waterfall enrichment](https://docs.apollo.io/docs/enrich-phone-and-email-using-data-waterfall)
16. [Apollo pricing](https://www.apollo.io/pricing)
17. [How credits are counted](https://docs.lusha.com/user-guide/usage-analytics/how-credits-are-counted)
18. [Lusha pricing](https://www.lusha.com/pricing/)
19. [Credits: how they work](https://help.lemlist.com/en/articles/8944295-credits-how-they-work)
20. [lemlist pricing](https://www.lemlist.com/pricing)
21. [How Waterfall.io pricing works](https://www.waterfall.io/pricing)
22. [HTTP Request node](https://docs.n8n.io/integrations/builtin/core-nodes/n8n-nodes-base.httprequest/)
23. [If node](https://docs.n8n.io/integrations/builtin/core-nodes/n8n-nodes-base.if/)

## Try this prompt

Fill the gaps your waterfall missed

```text
Use www.enrich.chat to look up work emails and mobiles for every row in my list that my waterfall marked not found, flag catch_all emails as risky, and tell me how many matched and the total credits_used
```

## Related

- [What is data enrichment?](https://enrich.chat/blog/what-is-data-enrichment/)
- [Clay pricing](https://enrich.chat/blog/clay-pricing/)
- [Clay alternatives (2026): enrichment without the table](https://enrich.chat/alternatives/clay/)
