To turn a list of LinkedIn profile URLs into full person profiles and work emails for go-to-market work, run linkedin.enrichProfile over the URLs for the profile (0.25 credits each), aiArk.enrichPerson for the work email (0.1 credits, only when an email is found), then waterfall.verifyEmail on the emails you got back.
The profile call returns the current title, company, full work history and education, but no email. The email call returns an email or nothing. Run both when you need every profile; run only the second when you only need the email. The steps below use the Cargo CLI, so a coding agent can run them end to end, and they are what the enrich-linkedin-profile skill does.
What 1.8M profile lookups show #
Cargo platform data, 90 days to Oct 16 2026:
| Measure | Value |
|---|---|
linkedin.enrichProfile runs | 1,824,331 |
| Workspaces running it | 190 |
| Runs that returned a profile | 93.6% |
| Runs that found nothing and were charged | 0 credits on 100% |
The actions and what they cost #
Each price is the list price in credits from the action’s definition in Cargo’s code. The finders charge only when they return data; waterfall.verifyEmail charges for every address it checks.
| Step | Action | Credits | Record fields |
|---|---|---|---|
| Profile | linkedin.enrichProfile | 0.25 | linkedinUrl |
| Email, rung 1 | aiArk.enrichPerson | 0.1 | linkedinUrl |
| Email, rung 2 | findyMail.findEmail | 0.5 | linkedinUrl |
| Email, rung 3 | FullEnrich.findEmail | 1 | linkedinUrl |
| Verify | waterfall.verifyEmail | 0.1 | email |
A contact that goes through the profile, the first email rung and verification costs at most 0.45 credits. A new account starts with 100 free credits and no card, which covers about 220 contacts at that rate.
No URLs yet? Resolve them from names and companies with the find-linkedin-url skill first.
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. Pilot the profile call on 5 rows
--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":"linkedin","actionSlug":"enrichProfile"}' \
--records '[{"linkedinUrl":"https://www.linkedin.com/in/example"}]' \
--limit 5 --wait-until-finished
Drop --limit to run the whole list. The examples on this page leave out the connectorUuid an action object may carry, in which case Cargo uses the workspace’s default connector for that provider. cargo-ai orchestration action list enrich profile shows the action objects and their prices without running anything.
3. Find the work email
cargo-ai orchestration action execute-batch \
--action '{"kind":"connector","integrationSlug":"aiArk","actionSlug":"enrichPerson"}' \
--records '[{"linkedinUrl":"https://www.linkedin.com/in/example"}]' \
--wait-until-finished
Download the results with cargo-ai orchestration batch download --uuid <batch uuid>, keep the rows that came back without an email, and send only those to findyMail.findEmail, then FullEnrich.findEmail. The record shape stays {"linkedinUrl": "..."} on every rung. Never send the full list to every rung: a second provider charges again for an email already found.
4. Verify the emails
cargo-ai orchestration action execute-batch \
--action '{"kind":"connector","integrationSlug":"waterfall","actionSlug":"verifyEmail"}' \
--records '[{"email":"ada@example.com"}]' \
--wait-until-finished
Unlike the finders, waterfall.verifyEmail charges for every address it checks. The verify-email-list skill covers it in full.
What comes back #
linkedin.enrichProfile returns one flat record per profile:
| Group | Fields |
|---|---|
| Person | full_name, first_name, last_name, headline, about, location, city, state, country, linkedin_url, public_id |
| Current role | job_title, company, current_company_join_month, current_company_join_year, current_job_duration |
| Company | company_domain, company_website, company_linkedin_url, company_industry, company_employee_count, company_employee_range, company_year_founded, hq_city, hq_country |
| History | experiences[] (title, company, start_year, end_year, is_current, description), educations[] (school, degree, field_of_study) |
| Reach | follower_count, connection_count, skills[], languages[] |
The email actions return:
| Action | Notes | |
|---|---|---|
aiArk.enrichPerson | email.output[0].address | AI Ark’s person record comes with it |
findyMail.findEmail | email | |
FullEnrich.findEmail | most_probable_email | most_probable_email_status, and emails[].status |
waterfall.verifyEmail | email | email_status (valid when deliverable) |
aiArk.enrichPerson treats a profile with no email as a miss: it returns no data and is not charged. That is why the profile call comes first when you need a profile for every row.
cargo-ai orchestration action get-output-schema --action '<action object>' prints any action’s output schema without running it.
Related #
- Find and verify work emails at scale, when you start from names and company domains instead of URLs.
- Find mobile phone numbers for a list of contacts, which takes the same LinkedIn URLs as input.
- The
crm-enrichmentcookbook deploys this as a play that keeps CRM contacts filled.
Frequently asked questions #
No. It returns the profile, current role, company, work history and education. Get the email with aiArk.enrichPerson, findyMail.findEmail or FullEnrich.findEmail, all of which take the same LinkedIn URL.
No. An action that finds nothing returns no data, and no credits are charged. In Cargo platform data for the 90 days to Oct 16 2026, 100% of the linkedin.enrichProfile runs that found nothing were charged 0 credits. waterfall.verifyEmail is the exception: it charges for every address it checks.
No. Cargo runs these actions on its own keys and bills credits. Nothing signs in to LinkedIn as you.