1st, 2nd and 3rd are distance labels. They count the steps between you and another member, and LinkedIn uses them to decide which buttons you see.
Per LinkedIn's help page (October 2026), here is the whole system:
| Label | Who it is | What LinkedIn offers you |
|---|---|---|
| 1st | Accepted your invitation, or you accepted theirs | Send a message |
| 2nd | Connected to one of your 1st-degree people | Send a connection invitation |
| 3rd | Connected to one of your 2nd-degree people | A 3rd-degree icon; the page lists no contact option |
| Out of network | Everyone else | Limited profile view; InMail, if the option is available |
The label changes as your network grows. Accept a new connection and some of their contacts move up a degree.
The label is a social path. It says nothing about whether you can email someone. This guide takes a list of 2nd and 3rd degree targets and reaches them on a channel LinkedIn does not gate.
TL;DR
- Takes about 10 minutes: 3 to size the audience for free, 7 to look up one person.
- Spends 0 records to size a list, then 1 record per person looked up. A 25-person test uses up to 25 of the 1,000 free records.
- You get a work email and an
email_status. Filter on the status before you send.
Prerequisites
- A LeadOcean API key from app.leadocean.io. The free plan has no card and 1,000 records.
export LEADOCEAN_API_KEY=...in your shell.curlandjq.- Public profile URLs of the people you want, or a title and country to search by.
Step 1: Know which label you are dealing with
Open the profile and read the badge next to the name. The badge decides your LinkedIn options, so pick the channel before you spend time.
- 1st: message them on LinkedIn. You do not need their email.
- 2nd: you can invite them. Expect to wait for them to accept.
- 3rd or out of network: LinkedIn offers an icon, or paid InMail where available. This is where email wins.
The competing guides stop here. The useful question is what to do for the 2nd, 3rd and out-of-network group. Email works the same for all three, because it ignores the degree.
Step 2: Size the audience before you pull anything
Sizing is free. Rebuild the search as a LeadOcean filter and read meta.total. Send count=true as a query parameter, with limit 1 in the body.
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"],
"limit": 1
}' | jq '.meta'meta.total is capped at 100,000. For an uncapped total from an AI assistant, the free leadocean_count_leads MCP tool answers the same question. On 2026-10-21 it returned this for the filters above:
{
"total": 129494,
"totalIsExact": true,
"totalAll": 350517,
"distinctCompanies": 58121
}total counts people with a verified, catch_all_valid or catch_all email. totalAll is the same filters with no email condition. Enum values are exact strings, so check them with leadocean_list_enum_values if a search comes back empty.
Step 3: Search by the same filters you use on LinkedIn
Your LinkedIn search has title, location and company filters. The LeadOcean body takes the same ideas as flat arrays. Pull a small page first.
curl -s -X POST "https://api.leadocean.io/v1/people/search" \
-H "x-api-key: $LEADOCEAN_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"title": ["Head of Sales"],
"country": ["US"],
"jobLevel": ["VP"],
"limit": 25
}'limit runs from 1 to 100. Page with cursor. One search pages to 10,000 rows. If meta.depthCapped is true, narrow the filters instead of paging further.
This step spends 1 record per person returned. 25 rows is 25 records.
Step 4: Enrich a person you already found on LinkedIn
If you already have the profile URL, skip the search. Enrich takes exactly one of linkedin_url, email, phone or person_id. Set reveal_email to get the address back.
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/jane-doe-acme",
"reveal_email": true
}'An enrichment that finds nobody is a 404 and costs nothing. Revealing the email costs no extra record. The profile does not need to be a connection of yours. The URL is only a lookup key.
For a phone number, call GET /v2/people/phone. It costs 1 record per call, including a call that finds nothing.
Step 5: Check the status, then send
Read email_status before you put an address in a sequence. verified and catch_all_valid are the values to send to. catch_all is sendable with care. risky, invalid, role and spam_trap are not.
Bounced emails are not refunded, so the filter is your protection. A reasonable first send is verified only, to a small batch, from a mailbox you have warmed.
Keep the LinkedIn side honest too. If someone is 2nd degree and replies by email, a short LinkedIn invitation afterward is fine. Use the channel they answered on.
What you get
The enrich call in Step 4 returns this. It is the response shape from the API reference, with placeholder values, not a real person.
{
"success": true,
"data": {
"profile_data": { "profile_full_name": "Jane Doe", "profile_headline": "VP Sales at Acme" },
"contact_data": {
"has_email": true,
"email_status": "verified",
"email_type": "work",
"contact_emails": [
{ "email": "jane.doe@acme.com", "type": "work", "status": "verified" }
],
"contact_phones": [{ "phone": "+1 415 555 0133", "type": "mobile" }],
"contact_current_experiences": [
{ "job_title": "VP Sales", "company_name": "Acme", "company_domain": "acme.com" }
]
}
}
}contact_emails and contact_phones appear only with reveal_email. Search rows carry has_email and email_status as flags, not the address.
Since 2026-10-17, enrich also returns career history in resume_data: past roles, education and certifications, each when held. Past employers carry no company_id yet. That is useful for a first line that is not "I saw your profile".
Troubleshooting
| Error | Cause | Fix |
|---|---|---|
| 401 | Missing or wrong x-api-key | Check $LEADOCEAN_API_KEY is exported and sent in the header |
| 429 | Above the plan's rate limit (5 requests a second on Free, 200 on Agency) | Honor Retry-After, or throttle the loop |
| 402 | The 1,000 free records are spent | Upgrade to Solo or Agency. Paid plans slow down at their fair-use pace instead of stopping |
Empty data | A filter value is not an exact enum string | Resolve it with leadocean_list_enum_values, for example VP, not vp |
| 404 on enrich | Nobody matched that input | Free. Try the email or person_id instead of the URL |
| Export refused | Over 50,000 rows a request or 500,000 a day | Split the export into smaller filtered runs. Bulk CSV is not on Free |
FAQ
Can I message 2nd and 3rd degree people without InMail?
On LinkedIn, the help page (October 2026) lists an invitation for 2nd degree and InMail for out-of-network people, where available. Email is the route that does not depend on either.
Do I need to be connected to get a work email?
No. LeadOcean looks up the person from a public URL or a search. Your connection status is not an input.
How many records does one contact cost?
One record per person you receive. Counts, empty pages and 404 enrichments cost nothing. See pricing.
What if I only want to see my own 1st-degree list?
That is a LinkedIn feature. LeadOcean has no access to your network graph. For the no-connection case, read how to get contact info without a connection. For the premium tool side, see how Sales Navigator works and whether it provides email addresses.
Reach 2nd and 3rd degree people by email, not InMail
Free to start. No credit card. 1,000 records to spend whenever you like.
Get your free API key →