Sales Navigator only imports accounts from a CSV. It does not import leads, so the file you need is a clean list of companies with a website on every row.
Icypeas's guide (October 2026) covers the clicks. This page covers the part that decides your match rate: building the file. Everything below runs against https://api.leadocean.io.
TL;DR
- Size the account list for free, pull it as a two-column CSV (name, website), then upload it under Accounts in Sales Navigator. About 25 minutes, plus LinkedIn's matching time.
- Sizing costs 0 records. Pulling the worked example costs 728 records, one per company, which fits the 1,000 on the Free plan.
- The upload needs Sales Navigator Advanced or Advanced Plus. Icypeas reports it is missing on Core (October 2026).
Prerequisites
- A Sales Navigator seat on Advanced or Advanced Plus. LinkedIn's plan page lists Core, Advanced and Advanced Plus (October 2026).
- A LeadOcean key from app.leadocean.io. Free has no card.
- The key in your shell as
$LEADOCEAN_API_KEY. curlandjq.
export LEADOCEAN_API_KEY="paste-your-key-here"Step 1: Write down the account filters
An account list is a company search, not a people search. Pick filters that describe the company: industry, headcount band, HQ country.
The worked example is US software companies with 51 to 500 employees. Filter values are exact strings, so resolve them first. The leadocean_list_enum_values MCP tool does this for free, or call the REST route:
curl -s "https://api.leadocean.io/v1/enums/industry?q=software" \
-H "x-api-key: $LEADOCEAN_API_KEY" | jq -r '.data[]?' | headComputer Software is a valid industry value. Headcount bands are 51-200 and 201-500. Country is ISO alpha-2, so US.
Step 2: Size the list before you spend anything
A count costs no records. GET /v1/companies/count takes the company-search filters and returns an exact total with breakdowns.
curl -s -G "https://api.leadocean.io/v1/companies/count" \
-H "x-api-key: $LEADOCEAN_API_KEY" \
--data-urlencode "industry=Computer Software" \
--data-urlencode "employeeRange=51-200,201-500" \
--data-urlencode "hqCountry=US" | jq '.data.total'The same count through the free MCP tool leadocean_count_companies, run 21 October 2026:
{
"total": 728,
"totalIsExact": true,
"facets": {
"employee_range": [
{"value": "51-200", "count": 460},
{"value": "201-500", "count": 268}
],
"hq_country": [{"value": "US", "count": 728}]
}
}728 companies. That is under Sales Navigator's 1,000-row upload cap, which Icypeas reports along with a 20 MB file limit (October 2026). If your total is higher, add a state or a narrower band and cut several files.
Step 3: Pull the companies into a CSV
Page through company search 100 rows at a time and keep only the two fields LinkedIn needs. fields trims the response and cursor pages it.
echo 'Company name,Company website' > accounts.csv
CURSOR=""
while : ; do
RES=$(curl -s -G "https://api.leadocean.io/v1/companies/search" \
-H "x-api-key: $LEADOCEAN_API_KEY" \
--data-urlencode "industry=Computer Software" \
--data-urlencode "employeeRange=51-200,201-500" \
--data-urlencode "hqCountry=US" \
--data-urlencode "fields=company_data.company_name,company_data.company_domain" \
--data-urlencode "limit=100" \
--data-urlencode "cursor=$CURSOR")
echo "$RES" | jq -r '.data[].company_data
| [.company_name, ("https://" + .company_domain)] | @csv' >> accounts.csv
CURSOR=$(echo "$RES" | jq -r '.meta.nextCursor // empty')
[ -z "$CURSOR" ] && break
done
wc -l accounts.csvEach company returned is one record, so this run spends 728. One search pages to 10,000 rows, far above the upload cap.
Step 4: Clean the file
Three fixes lift the match rate. Icypeas's guide says LinkedIn matches on company LinkedIn URL first, then website, then name (October 2026).
- Keep the website, drop the rest. Name plus website is cleaner than name plus a half-empty address column.
- Use
https://. Icypeas reports thathttp://links can be rejected (October 2026). - Save as UTF-8. Icypeas notes that non-UTF-8 files garble names like Müller (October 2026).
mlr --csv filter '$"Company website" != "https://"' then \
uniq -g "Company website" accounts.csv > accounts.clean.csv
file -I accounts.clean.csvIf you hold LinkedIn company URLs, keep name plus URL only. Icypeas calls the URL the most reliable key (October 2026). This guide's file uses name plus website, which every row has.
Step 5: Upload in Sales Navigator
Icypeas lists the click path (October 2026):
- Open Sales Navigator and click Accounts.
- Click Upload accounts, then Continue past the format tips.
- Drop
accounts.clean.csvinto the upload box. - Map
Company nameandCompany websiteto LinkedIn's fields. - Name the import and click Finish.
Icypeas says a 1,000-row file can take up to 15 minutes to match (October 2026). When it finishes, the list appears under Accounts. Use the Account lists filter in lead search to see people at those companies.
Step 6: Read the match report
Open the list's menu and choose Download match report. Icypeas reports that LinkedIn adds a match score from 0 to 5, a match status and a resolution column, and advises removing anything below 2 (October 2026).
Spot-check the first ten matched rows by eye. A match is not the same as a correct match.
Step 7: Pull the people at those accounts
The upload gives you accounts inside LinkedIn. The people file stays yours when you pull it from the API by domain. GET /v1/companies/{domain}/people lists the people we hold at one company.
curl -s "https://api.leadocean.io/v1/companies/acme.com/people?limit=25" \
-H "x-api-key: $LEADOCEAN_API_KEY" | jq '.meta'Each person returned is one record. To work from the whole account list, loop the domains in accounts.clean.csv and filter by jobLevel and jobFunction in a people search first. Size that with count=true before you page. A people count that includes an email filter is a count of that filter, not a mailable count, so label it that way in your notes.
What you get
The response shape from the API reference for one page of GET /v1/companies/search with fields set, placeholder values:
{
"success": true,
"data": [
{
"company_data": {
"company_name": "Acme",
"company_domain": "acme.com"
}
}
],
"meta": {
"count": 100,
"limit": 100,
"nextCursor": "<opaque cursor>"
}
}And the first lines of accounts.clean.csv (placeholder rows):
Company name,Company website
Acme,https://acme.com
Example Co,https://example.comTroubleshooting
| Error | Cause | Fix |
|---|---|---|
| 401 | Missing or wrong x-api-key header | Re-export $LEADOCEAN_API_KEY and send it as x-api-key. |
| 429 | Above the plan's rate limit (5 requests a second on Free, 200 on Agency) | Wait for Retry-After, then slow the loop. |
| 402 | Out of records | Free is 1,000 records for life. Size first, or move to Solo at $97 a month. |
Empty data | An industry or country value that is not an exact string | Resolve it with GET /v1/enums/industry or leadocean_list_enum_values. |
meta.depthCapped is true | One search paged to 10,000 rows | Narrow the filters and run several smaller searches. |
| High "Not matched" in LinkedIn's report | Thin rows, http:// links, non-UTF-8 encoding | Re-run Step 4, then upload again. |
FAQ
Can I upload people to Sales Navigator from a CSV?
No. Icypeas reports that Sales Navigator imports accounts only (October 2026). Upload accounts, then filter lead search by that account list. To work with people as a file, see how to export a list from Sales Navigator.
Which Sales Navigator plan has the upload?
Icypeas reports Advanced and Advanced Plus, not Core (October 2026). Confirm in your own account before you build the file.
How many rows can I upload?
Icypeas reports 1,000 rows and 20 MB per file (October 2026). Cut larger lists into several files by state or headcount band.
Where do emails come from after I find the people?
Sales Navigator does not hand out a file of contacts. Pull work emails from the API with find email from Sales Navigator, or compare Sales Navigator scraping tools. Plans and limits are on pricing.
Size your Sales Navigator account list for free
Free to start. No credit card. 1,000 records to spend whenever you like.
Get your free API key →