Sales Navigator does not give you email addresses. Per LinkedIn's help page (September 2026), contact details show only when the member chose to share them.
On a lead page (September 2026), the contact block holds what the profile shows, plus your CRM data and anything you or a teammate typed in. This guide rebuilds your search in the LeadOcean API and gets the emails Sales Navigator will not show.
What Sales Navigator does well is finding the right people. Its filters, saved searches and lead alerts are good, and a lead page (September 2026) adds job changes and recent posts. What it does not do is turn that list into a sendable one. That second job is a data problem, and an API solves it with two calls.
TL;DR
- Takes about 15 minutes: 5 to rebuild the search and size it for free, 10 to enrich a test batch.
- Spends 0 records to size a list, then 1 record per person returned or matched. A 25-lead test costs up to 25 of your 1,000 free records.
- Sales Navigator stays your research tool. LeadOcean fills in the email, its status and the phone, keyed on the lead's LinkedIn URL.
Prerequisites
- A Sales Navigator search or lead list you want emails for. You only need its filters, or the LinkedIn profile URLs.
- A LeadOcean account. Start free: no card, 1,000 records, one-off.
- An API key from the app, saved as
$LEADOCEAN_API_KEY. curlandjq.
Step 1: Translate your Sales Navigator filters
Map each Sales Navigator filter to a LeadOcean search field. The search body is flat JSON and every filter is an array of strings.
| Sales Navigator filter | LeadOcean field | Example value |
|---|---|---|
| Seniority level | jobLevel | VP |
| Function | jobFunction | Sales & Business Development |
| Geography | country | US |
| Current job title | title | Head of Growth |
| Company headcount | employeeRange | check the enum |
| Company name | companyName | Acme |
Enum values are exact strings. Vice President returns nothing, VP works. List the valid values for free:
curl -s "https://api.leadocean.io/v1/enums/job_level" \
-H "x-api-key: $LEADOCEAN_API_KEY" | jq -c '.data.values'The employeeRange and country enums work the same way. Check the string before you search.
Not every Sales Navigator filter has a twin. Spotlights such as job changes and recent posts have no search field here. Use Sales Navigator to build and save the list, then take its profile URLs to Step 4. Use the search path in Steps 2 and 3 when you want to start from filters instead.
Step 2: Size the list for free
Send count=true as a query parameter with limit=1. It costs 0 records and data comes back empty.
curl -s -X POST "https://api.leadocean.io/v1/people/search?count=true" \
-H "x-api-key: $LEADOCEAN_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"jobLevel": ["VP"],
"jobFunction": ["Sales & Business Development"],
"country": ["US"],
"emailStatus": ["verified", "catch_all_valid", "catch_all"],
"limit": 1
}' | jq '.meta | {total, totalIsExact, countOnly}'meta.total is capped at 100,000. If you are an AI-assistant user, the same check is one prompt against the MCP server:
Using LeadOcean, count US people with job level VP and job function
Sales & Business Development. Do not search for anyone.Claude calls leadocean_count_leads, which is free.
Step 3: Pull a small batch of people
Drop count=true and set a small limit. Each person returned costs 1 record, so start with 25.
curl -s -X POST "https://api.leadocean.io/v1/people/search" \
-H "x-api-key: $LEADOCEAN_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"jobLevel": ["VP"],
"jobFunction": ["Sales & Business Development"],
"country": ["US"],
"emailStatus": ["verified", "catch_all_valid", "catch_all"],
"limit": 25
}' > batch.json
jq -r '.meta.nextCursor' batch.jsonFor the next page, send the same body with "cursor" set to that value. Search rows carry a person_id at meta.source_ids.person_id. You need it only if you enrich by ID.
One caveat from the API reference (September 2026): verified in a search row is an upper bound. Enrichment applies the stricter per-address check, so confirm the status in Step 4.
Step 4: Enrich Sales Navigator leads by LinkedIn URL
If you already have lead URLs, skip Steps 1 to 3. Call POST /v1/people/enrich with exactly one of linkedin_url, email, phone or person_id. Set reveal_email to true to get the address back.
export LEADOCEAN_API_KEY=your_key_here
curl -s -X POST https://api.leadocean.io/v1/people/enrich \
-H "x-api-key: $LEADOCEAN_API_KEY" \
-H "Content-Type: application/json" \
-d '{"linkedin_url":"https://www.linkedin.com/in/janedoe-example","reveal_email":true}' |
jq '.data.contact_data | {has_email, email_status, email_type,
email: .contact_emails[0].email, phone: .contact_phones[0].phone}'A person we hold nothing for is a 404 and costs 0 records. There is no name plus company lookup. To find people at a company, search by domain first, then enrich by person_id.
For a list, loop over your exported URLs. The CSV enrichment guide has a ready script. Run it one request at a time. The rate limit is per account: 5 requests a second on Free, 200 on Agency.
Step 5: Keep only mailable rows
Sales Navigator lists age fast, because people change jobs. LeadOcean refreshes its dataset monthly and each record carries its own fetched_at date. Check that date on anyone you plan to email.
An address is not the same as a safe address. Filter on email_status before it reaches a sequencer.
jq -r '.data.contact_data | select(.email_status == "verified"
or .email_status == "catch_all_valid" or .email_status == "catch_all")
| .contact_emails[0].email' enriched.jsonDrop risky, role, derived, untested, disposable, spam_trap and invalid. Keep catch_all only if you accept that the domain takes any address, so the mailbox cannot be confirmed. LeadOcean gives no refund or credit for bounced emails, so this step is not optional.
For more than a few thousand rows, use POST /v1/exports instead of a loop. Bulk CSV export is included on Solo and above, not on Free. One request takes up to 50,000 rows, and an account takes up to 500,000 a day. The Exports page in the app does the same with a filter builder, a column picker and a price preview. See how to export a list from Sales Navigator.
What you get
Step 1 returns the exact strings the jobLevel filter accepts. We ran it on 2026-10-21.
["C-Team","Director","Manager","Other","Staff","VP"]Step 2 ran through leadocean_count_leads on 2026-10-01. The filters were jobLevel VP, jobFunction Sales & Business Development and country US. It returned this.
{"total":115336,"totalIsExact":true,"credits":0,"defaults":"emailStatus: verified or catch_all_valid or catch_all"}That is a mailable count, because the tool defaults to verified, catch_all_valid and catch_all addresses. It cost 0 records.
Step 4 returns one record per match. This is the response shape from the API reference, September 2026, with placeholder values:
{
"success": true,
"data": {
"profile_data": { "...": "name, title, company" },
"contact_data": {
"has_email": true,
"has_phone": true,
"email_status": "verified",
"email_type": "work",
"contact_emails": [{ "email": "jane.doe@acme.com", "type": "work", "status": "verified" }],
"contact_phones": [{ "phone": "+14155550133", "type": "mobile" }]
}
}
}Without reveal_email, contact_emails and contact_phones are absent. has_email and has_phone still tell you whether a value exists.
Troubleshooting
| Error | Cause | Fix |
|---|---|---|
| 401 | The x-api-key header is missing or the key is wrong. | Copy a fresh key from the app and re-export $LEADOCEAN_API_KEY. |
| 402 | Free plan: your 1,000 one-off records are spent. | Call GET /v1/account for the balance, or move to Solo at $97 or Agency at $497 a month on pricing. |
| 404 on enrich | We hold nothing for that LinkedIn URL. | Nothing to fix. It costs 0 records. Try the lead's email as the key. |
| 429 | Above your plan's rate on one key (5 a second on Free, 200 on Agency). | Wait the Retry-After seconds and retry. |
| Empty search results | A filter value is not an exact enum string, such as Vice President instead of VP. | List the enum values and copy the string. |
| Export refused | One request is capped at 50,000 rows, and an account at 500,000 rows a day. | Split the job across requests and days, or narrow the filters. |
FAQ
Does Sales Navigator show email addresses?
Only when the member shared one. LinkedIn's help says contact details appear if the member opted to share them, September 2026. The lead page also shows your CRM contact data and details added by you or a teammate. There is no email finder built in.
Can I export Sales Navigator leads with emails?
Not from Sales Navigator itself. Take the filters or profile URLs and run them through an enrichment API. A linkedin_url is enough for people we hold: POST /v1/people/enrich returns the address and its email_status, 1 record for a match and 0 for a miss. Our guide to exporting from Sales Navigator covers the options.
Do I get work emails or personal emails?
Work emails first. email_type says which you got: work, work_other (a former employer) or personal. Personal addresses are not verified by us, so read the status before you send. A separate call, GET /v2/people/email/personal, looks up personal addresses and costs one record per call, including a call that finds nothing.
Why not scrape the emails with a Chrome extension?
LeadOcean has no extension and does not scrape your Sales Navigator session. You send filters or URLs to an API and read the response. That keeps your LinkedIn account out of the loop.
How many records does this use on the free plan?
Sizing is free. A 25-person batch costs up to 25 of the 1,000 free records, and Free keys get both search and enrich scopes. For the wider picture, read how Sales Navigator works and how to find an email from Sales Navigator.
Get the emails Sales Navigator leaves out, free
Free to start. No credit card. 1,000 records to spend whenever you like.
Get your free API key →