Mobile Phone Waterfall
Pricing
from $17.00 / 1,000 mobile founds
Mobile Phone Waterfall
Find mobile phone numbers for your contacts by chaining your own Prospeo, Lusha, ContactOut, and FullEnrich keys. One flat row per contact with the number, line type, country, Do Not Call flag, and the provider and credits used. No keys stored.
Pricing
from $17.00 / 1,000 mobile founds
Rating
0.0
(0)
Developer
Mamba Labs
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
8 hours ago
Last modified
Categories
Share
๐ฑ What can Mobile Phone Waterfall do?
Give it contacts and it finds a mobile phone number for each one by calling the phone providers you already pay for, one after another, until one returns a number. Every row says which provider found it, what line type it is, and how many of your credits it spent.
Bring your own keys. You supply your own Prospeo, Lusha, ContactOut, or FullEnrich key, any one of them or all four. Mamba Labs supplies no keys and stores none. You pay your providers directly at your own plan's rate.
| ๐ฆ What you get | โ๏ธ Features and integrations |
|---|---|
| ๐ A mobile number in E.164 format, or an honest null ๐ท๏ธ Line type, country, and the Do Not Call flag where the provider reports them ๐งพ Per provider credits on every row ๐ข 25 fields, one flat row per contact, always | ๐ Four providers in the order you set ๐ A circuit breaker per provider on a bad key or an empty balance ๐ Your own credit cap and an Apify charge cap โฌ๏ธ Export to JSON, CSV, Excel, HTML, or XML |
๐ซ This is not a data provider and sells you no phone data. It runs the accounts you already have. With no key supplied it still runs, says which providers were unavailable, charges only the run start fee ($0.0005), and exits cleanly.
๐ก Why use Mobile Phone Waterfall?
No single provider finds every mobile. Running two or three by hand means exporting, matching, and paying twice for the same person. This calls the next provider only when the one before it came back empty, so a found contact never spends credits on a second provider.
| If you want | Read these fields |
|---|---|
| The number | mobile_phone, phone_line_type, phone_country |
| Whether you may dial it | phone_dnc (Lusha reports it; null means not reported) |
| Which provider earned its keep | found_by_provider, found_by, chain_position |
| What the contact cost you at your providers | provider_credits_used, providers_attempted_json |
| Run totals | run_summary_json on the summary row |
๐ Supported providers
| Provider | Your key field | Identifiers it takes | Credits per mobile, as documented |
|---|---|---|---|
| Prospeo | prospeo_api_key | LinkedIn URL, name plus domain, email, name plus company | 10 per mobile found, a miss is free |
| Lusha | lusha_api_key | LinkedIn URL, email, first and last name plus domain or company | one search charge plus a phone charge per revealed phone |
| ContactOut | contactout_api_key | LinkedIn profile URL (/in/ or /pub/) only | one phone credit when a phone comes back |
| FullEnrich | fullenrich_api_key | first and last name plus company domain, LinkedIn URL optional | 10 per mobile found, landlines free |
The default order is Prospeo, Lusha, ContactOut, FullEnrich. FullEnrich runs last because it is
itself a waterfall over 20 plus sources and takes up to two and a half minutes per contact. Change
the order with provider_order. A provider with no key is skipped and reported, never an error.
Live verification. The Prospeo path has been run live on a real key (2026-10-19). The Lusha,
ContactOut, and FullEnrich steps are built to each provider's documented API but have not yet been
run on a live key. Every run summary lists them under providers_not_live_verified.
A LinkedIn URL is passed to the provider as an identifier. The actor never opens LinkedIn.
๐ What data can Mobile Phone Waterfall extract?
25 fields per row. One row per input contact, always, including the ones where nothing was found, plus one run summary row.
| Field | What it holds |
|---|---|
contact_id | Your own id or contact_id, echoed back, or a row id |
input_full_name, input_first_name, input_last_name | The name you supplied |
input_company_domain, input_company_name | The company you supplied |
input_linkedin_url, input_email | The identifiers you supplied |
mobile_phone | The number in E.164, for example +14155550123, or null |
phone_line_type | mobile, landline, voip, or unknown |
phone_country | Two letter country code of the number |
phone_dnc | True when the provider flags the number Do Not Call |
phone_status | found, not_found, no_usable_identifier, no_provider_available, skipped_spend_cap, skipped_free_plan_cap, not_started_charge_limit, or a summary state |
found_by_provider, found_by | The provider, and the exact registry entry, that answered |
chain_position | Which position in your order found it |
providers_called | How many providers were actually called for this contact |
providers_attempted_json | Every provider step with its outcome, credits, and time |
provider_credits_used | Credits this contact spent on your accounts |
is_summary_row, run_summary_json | The run summary row and its totals |
row_status, error_reason | ok, no_match, skipped, error, or summary, and why |
billable_events_json | The Apify events this row charged, [] when free |
checked_at | When the row was written |
โฌ๏ธ Input
| Field | What it does |
|---|---|
contacts | One object per person: full_name, first_name, last_name, company_domain, company_name, linkedin_url, email, and your own id. Also accepted as a JSON string or one line per person. |
full_name, company_domain, linkedin_url, email | One person per run, the shape a Clay row sends |
prospeo_api_key, lusha_api_key, contactout_api_key, fullenrich_api_key | Your keys. Secret fields: never logged, stored, or written to the dataset |
provider_order | Provider names in call order. Empty means the default order |
mobile_only | On by default: a landline or VoIP number does not end the chain. Numbers without a reported line type are kept as unknown |
max_contacts | Ceiling on contacts processed |
max_provider_credits | Your spend cap on provider credits. Remaining contacts are skipped, uncharged |
max_charge_usd | Your cap on this run's Apify charges |
Example:
{"contacts": [{ "id": "crm-1042", "full_name": "Jane Doe", "company_domain": "example.com", "linkedin_url": "https://www.linkedin.com/in/janedoe" }],"prospeo_api_key": "YOUR_PROSPEO_KEY","lusha_api_key": "YOUR_LUSHA_KEY","max_provider_credits": 200}
๐ฐ Pricing
Pay per event. You pay Apify for the orchestration below, and you pay your providers separately on your own keys.
| Event | When it fires | Free | Bronze | Silver | Gold |
|---|---|---|---|---|---|
apify-actor-start | Once per run | $0.0005 | $0.0005 | $0.0005 | $0.0005 |
phone-search-submitted | Once per contact on which at least one provider was called | $0.003 ($3.00 per 1,000) | $0.00285 | $0.0027 | $0.00255 |
mobile-found | Once per contact that comes back with a number | $0.020 ($20.00 per 1,000) | $0.019 | $0.018 | $0.017 |
A contact that reached no provider (no key, no identifier a provider accepts, your credit cap, the
free plan cap) is free. Summary rows are free. The run stops at the maximum cost per run you set in
Apify and at max_charge_usd, and keeps every row already paid for.
Free plan: up to 65 contacts per calendar month on the Apify Free plan, which is 1.50 USD of evaluation at the Free prices. Paid plans have no monthly contact cap.
๐งช Usage examples
Apify Console or API. Paste your contacts and at least one key, then run. Over the API, start
POST /v2/acts/<actor id>/runs with the input above and read the dataset when the run finishes.
Clay. Add an HTTP API or Apify column, map full_name, company_domain, and linkedin_url to
the single contact fields, and pass your key in the matching key field. Clay sends every value as a
string; the actor accepts that.
MCP. The Mamba Labs MCP server @mambalabsdev/mcp-mobile-phone-waterfall-orchestrator exposes
this actor as the tool find_mobile_phone for Claude, Cursor, and other MCP clients.
๐งฏ Error handling
| Situation | What you get |
|---|---|
| No key at all | One summary row, phone_status no_run, nothing called, only the run start fee charged, exit 0 |
| A bad key or an empty balance | That provider is switched off for the rest of the run after one failed call; the chain continues |
| Rate limit | Calls are paced to each provider's documented limits; a 429 is not retried into a second 429 |
| A provider times out | That step is recorded as an error and the chain moves on |
| FullEnrich still working after 150 seconds | Recorded as an error. FullEnrich may still finish and charge your account later |
| A masked or national format number with no country | Not counted as found |
โ ๏ธ Limitations
- Match rates are not stated here because they have not been measured on a shared contact set. They vary by provider, country, and seniority.
- Only Lusha reports a Do Not Call flag. A null
phone_dncmeans not reported, not cleared. Calling and texting rules (TCPA, national Do Not Call registers, GDPR) are yours to follow. - ContactOut reports no line type, so its numbers read
unknownand pass themobile_onlyfilter. - Each provider's own terms bind your account. Lusha and Kaspr forbid reselling their data; Kaspr is not supported. Apollo is not supported because it delivers phone numbers only to a webhook.
- Credits are reported as each provider reports or documents them. Dollar cost depends on your plan.
๐ Support
Open an issue on the Issues tab with the run id. Want another provider added? Say which one.
๐งฉ Want other GTM data?
Mamba Labs builds custom actors for B2B go-to-market teams. The public versions of that work live here on the Store, so our users get the same tooling we build under contract.
Every actor in the suite takes a domain or a company and returns one flat row, so they stack in the same Clay table without reshaping anything.
๐ ๏ธ Need something custom built for you or your team? Tell us what you are trying to find and we will build it. Talk to Mamba Labs.
Built by Mamba Labs.