waterfall_email
Find ONE person's professional email, trying providers in turn and stopping at the FIRST that returns one (native waterfall).
Steps (default order): hunter (name + domain) → aiark (LinkedIn URL) → apollo
(LinkedIn URL, or name + domain / company) → kaspr (LinkedIn URL) → lusha (LinkedIn
URL, or name + domain / company) → forager (LinkedIn URL — your own Forager key,
or the shared one where this instance opens email lookups) → then the asynchronous ones: dropcontact (LinkedIn URL, or name + company /
domain) → lemlist (LinkedIn URL, or name + domain) → fullenrich (LinkedIn URL, or
name + domain — usually 30 s to 4 min, so often pending). A slow step is billed
even when its answer comes back pending, and a pending step ENDS the cascade:
nothing after it is paid. The email is NOT verified here.
Order: your steps setting on this connector's card if set (an org
default, or your own override), kept as written; else the default order above,
where the free steps run first, then lemlist's database on your OWN lemlist key
(no credits, your own quota), then the other providers you hold your own key
for, and the shared keys next. A provider with no usable key is skipped without
being called. Each step
uses THAT provider's key and is billed by it, exactly as a direct call of its
tool — the waterfall adds no cost. A step whose inputs are missing, or whose
connector is not activated for this org, is skipped too. Give every input you
have. One contact per call; for a list, run it from a recipe (for_each).
Returns {found, provider, email: {email, all, status?}, attempts, order_from} — attempts says, step by step, what happened (found / no_match /
skipped / failed / withheld / pending, with the code, the message and the key
used); order_from says where the order came from (call / setting / default);
pending gives the collect call of the asynchronous step the cascade stopped
at.
Tool call template
This tool declares no required parameters. Add optional parameters from the input schema as needed.
{
"id": 1,
"jsonrpc": "2.0",
"method": "tools/call",
"params": {
"arguments": {},
"name": "waterfall_email"
}
}Input Schema
| Name | Required | Description | Default |
|---|---|---|---|
| _org | No | Org (id) de CET APPEL. `oto_list_orgs()`. | |
| _group | No | Équipe (id) de CET APPEL, sous son org parente. | |
| domain | No | the company's domain (`acme.com`; a URL is accepted). | |
| _run_id | No | OBLIGATOIRE à chaque appel dès `run_start` ou `data_claim_next` : sans lui, l'écriture sur une ligne réservée est refusée. Hérité seulement si le serveur tient un run actif — n'y compte pas. | |
| dry_run | No | return the plan (order, key per step, arguments, skips) without calling anything. `planned` is not a promise: the connector's activation for your org is only checked by the real call. | |
| _project | No | Projet (id) de CET APPEL — jeton PRIMAIRE. `oto_project(op='list')`. | |
| _instance | No | Instance de connecteur PRÉCISE (un credential exact). `oto_instance(op='list')`. | |
| full_name | No | alternative to first_name + last_name. | |
| last_name | No | the person's last name. | |
| providers | No | the steps to try for THIS call, in this order — keys from the list above. Overrides your setting. Never a tool name. | |
| first_name | No | the person's first name. | |
| company_name | No | the company's name, when the domain is unknown. | |
| linkedin_url | No | the person's LinkedIn profile URL. | |
| apify_max_usd | No | a cost ceiling for each Apify run of this lookup (≥ 0.50 — Apify refuses less; above your organization's ceiling per run, $25 unless its admins set another, the step is refused). Omitted = the ceiling Apify launches take by default: derived from the run's size, else the platform default ($5), and never above that ceiling. | |
| max_paid_steps | No | at most this many PAID provider calls for this lookup (free steps don't count); the steps past it are skipped. Omitted = no limit — the default: set it when spend matters more than finding. |