To find mobile phone numbers for a go-to-market contact list, run one Cargo batch call per phone provider over your rows, cheapest provider first, and pass only the rows it missed to the next one. Give each provider a LinkedIn profile URL where you have one. A lookup that finds no number costs 0 credits.
No AI Ark, Prospeo, Findymail or FullEnrich account is needed: Cargo calls each provider on its own key and bills credits. The steps below use the Cargo CLI, so a coding agent can run them end to end.
What 900K phone lookups show #
Cargo platform data, 90 days to Oct 16 2026:
| Measure | Value |
|---|---|
| Workspaces that ran a phone lookup | 10,578 |
| Phone lookup runs | 899,829 |
| Runs that returned a number | 81.2% |
| Runs that found nothing and were charged | 0 credits on 99.2% of those |
More workspaces run this job than any other enrichment job Cargo measures, including finding work emails and enriching companies.
The phone actions and what they cost #
Each price is the list price in credits from the action’s definition in Cargo’s code, charged only when the action returns a result (two actions count a result differently; see What comes back).
| Action | Credits per number found | Input it needs |
|---|---|---|
aiArk.findMobilePhone | 0.5 | linkedinUrl, or name (full name) and domain |
prospeo.findPhone | 3 | url (LinkedIn profile URL) |
findyMail.findPhone | 5 | linkedinUrl |
FullEnrich.findPhone | 6 | linkedinUrl, or firstName, lastName and one of domainName or companyName |
waterfall.findPhone | 7 | linkedin, or first_name, last_name (or full_name) and domain, or email |
datagma.findPhone | 8 | personLinkedInUrl or email |
datagma.findPhoneAndEmail | 8 | firstName, lastName and companyName, all required; returns phones and emails |
bettercontact.findPhone | your BetterContact plan | first_name, last_name, company or company_domain, linkedin_url; needs your own key |
A LinkedIn URL is the input almost every provider accepts, and Prospeo and Findymail accept nothing else. If your list has names and companies but no URLs, resolve them first with the find-linkedin-url skill.
A new account starts with 100 free credits and no card, which covers, for example, 200 numbers found on AI Ark or 33 on Prospeo.
Run it #
1. Install and sign in
npm install -g @cargo-ai/cli
cargo-ai login --email you@company.com # sends a code
cargo-ai login --email you@company.com --code 123456 # creates the account on first use
There is no browser step, so a coding agent can run this itself.
2. Find the actions
cargo-ai orchestration action list find phone
Each result carries an action object to pass to the next command and a credits array with its price. Nothing runs and nothing is charged. The examples below leave out the connectorUuid that object may carry, in which case Cargo uses the workspace’s default connector for that provider.
3. Pilot the first rung on 5 rows
Start with the cheapest provider. --limit 5 submits only the first five records, so you can read the output and the cost before the full run.
cargo-ai orchestration action execute-batch \
--action '{"kind":"connector","integrationSlug":"aiArk","actionSlug":"findMobilePhone"}' \
--records '[{"linkedinUrl":"https://www.linkedin.com/in/example"},{"name":"Ada Lovelace","domain":"example.com"}]' \
--limit 5 --wait-until-finished
4. Run the full list, then escalate only the misses
Drop --limit to run every row. Download the results with cargo-ai orchestration batch download --uuid <batch uuid>, keep the rows that came back without a number, and send those to the next provider, renaming the input field to what that provider expects (see the table above).
# Rung 2, on the rows AI Ark missed
cargo-ai orchestration action execute-batch \
--action '{"kind":"connector","integrationSlug":"prospeo","actionSlug":"findPhone"}' \
--records '[{"url":"https://www.linkedin.com/in/example"}]' \
--wait-until-finished
# Rung 3, on the rows rungs 1 and 2 missed
cargo-ai orchestration action execute-batch \
--action '{"kind":"connector","integrationSlug":"FullEnrich","actionSlug":"findPhone"}' \
--records "$(cat misses.json)" \
--wait-until-finished
Never send the full list to every rung: the numbers already found are paid for, and a second provider charges again for the same person. FullEnrich and Waterfall.io answer asynchronously, so their batches take longer to finish; --wait-until-finished keeps polling until they do.
What comes back #
Each action returns the provider’s own record. The fields to read:
| Action | Phone number | Also returned |
|---|---|---|
aiArk.findMobilePhone | phone_numbers[] | |
prospeo.findPhone | person.mobile.mobile | Prospeo’s person record; the action asks for verified mobiles only |
findyMail.findPhone | phone | line_type |
FullEnrich.findPhone | most_probable_phone | phones[].number, phones[].region, and a LinkedIn profile object |
waterfall.findPhone | person.mobile_phone | person.phone_numbers[], person.title, person.company_domain |
datagma.findPhone | phones[].number | phones[].type, phones[].countryCode, phones[].displayInternational |
datagma.findPhoneAndEmail | phones[].number | emails[].email with emails[].status (verified or not_verified) |
Two actions count a hit differently, so check the phone field before you trust the row. waterfall.findPhone returns, and bills, the matched person record, so read person.mobile_phone rather than assuming the match carries a number. datagma.findPhoneAndEmail bills when it finds either a phone or an email.
cargo-ai orchestration action get-output-schema --action '<action object>' prints any action’s output schema without running it.
Before you dial #
These are business numbers for business contacts. Use them for B2B outreach with consent or another lawful basis where you and the contact are, and check every number against the do-not-call registers and your own suppression list before anyone dials it.
For work emails on the same list, the find and verify work emails article runs the same waterfall pattern with email finders.
Frequently asked questions #
No. A phone action that returns no number returns no data, and no credits are charged. In Cargo platform data for the 90 days to Oct 16 2026, 99.2% of phone lookup runs that found nothing were charged 0 credits. Two exceptions are worth knowing: waterfall.findPhone bills a matched person, and datagma.findPhoneAndEmail bills a run that found only an email.
It is the input every phone action accepts except datagma.findPhoneAndEmail. AI Ark, FullEnrich, Waterfall.io and BetterContact also take a name with a company or domain, and datagma.findPhoneAndEmail takes a first name, last name and company name. Prospeo, Findymail and datagma.findPhone need the LinkedIn URL or, for Datagma, an email.
No, except for BetterContact. Unless you connect your own key, Cargo calls the provider on Cargo’s key and bills the action’s credits. BetterContact runs only on a key you connect.
A new account gets 100 free credits with no card. At 0.5 credits per number found on AI Ark, that is 200 numbers; at 6 on FullEnrich, it is 16.