LinkedIn Premium bundles five things: search, lists, alerts, InMail and profile tools. The first three are data jobs, so an API can do them. InMail and profile views stay with LinkedIn.
This guide sorts the features by what they are, then rebuilds the data ones as API calls. Feature facts come from LinkedIn's plan comparison (September 2026). Plan prices are on LinkedIn's own pages and change, so check them there.
TL;DR
- Takes about 20 minutes: 5 to map your Premium filters, 5 to size the list, 10 to pull and enrich a test batch.
- Spends 0 records to size and monitor a list. A 25-person test costs up to 25 records, and enriching 5 of them costs up to 5 more, all from the 1,000 free records.
- Keep Premium only for what is not data: InMail, who viewed your profile, Learning and applicant insights.
Prerequisites
- A list definition: the titles, levels, countries and company sizes you search for in Premium today.
- 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: Sort the features by job
Premium has different features on different plans, so sort them before you buy or cancel. This table follows LinkedIn's help page (September 2026).
| Premium feature | Plan that has it | A data job? | API equivalent |
|---|---|---|---|
| Advanced search filters | All-in-One, Sales Navigator Core, Recruiter Lite | Yes | POST /v1/people/search |
| Custom lead and account lists | Sales Navigator Core | Yes | A saved filter body, or POST /v1/exports on Solo and above |
| Real-time updates and alerts | Sales Navigator Core | Partly | Monthly re-count (Step 5) |
| Contact details | Not a Premium feature | Yes | POST /v1/people/enrich |
| InMail credits | All paid plans, 5 to 50 a month | No | None |
| Who viewed your profile | All paid plans, 365 days | No | None |
| Applicant insights | All paid plans | No | None |
| LinkedIn Learning | All paid plans except Recruiter Lite | No | None |
The honest read: if you pay for Premium to find and list people, you pay for a data product. If you pay to message strangers or see profile viewers, an API does not help.
Most technical buyers fall in the first group. They open Premium or Sales Navigator, set filters, save a list and copy the names into another tool. That loop is search plus export. It needs a database and a query, not a LinkedIn seat.
Three questions settle it:
- Do you act on the list outside LinkedIn, in a sequencer, a CRM or a script? Then you need the data, so use an API.
- Do you rely on InMail to reach people who have no public email? Then keep the seat.
- Do you need alerts the day someone changes jobs? Then keep Sales Navigator for that one feature.
Two limits are worth knowing before you decide. Per LinkedIn's InMail page (September 2026), Premium Business gives 15 InMail credits a month, and Sales Navigator Core gives 50. Credits come back when the recipient accepts, declines or replies within 90 days.
Step 2: Rebuild your search filters
Map each Premium filter to a LeadOcean field. The search body is flat JSON and every filter is an array of strings.
| Premium filter | LeadOcean field | Example value |
|---|---|---|
| Seniority level | jobLevel | Director |
| Function | jobFunction | Sales & Business Development |
| Geography | country | US |
| Current job title | title | Head of Growth |
| Company headcount | employeeRange | 51-200 |
| Industry | industry | check the enum |
| Keywords | keywords | outbound |
Sales Navigator Core advertises 50+ search filters (September 2026). LeadOcean has 50 people filters and 34 company filters. List them with one free call:
curl -s "https://api.leadocean.io/v1/filters" \
-H "x-api-key: $LEADOCEAN_API_KEY" | jq '.data.filters | keys | length'Enum values are exact strings, so Director works and director or Directors returns nothing. Check a value before you search:
curl -s "https://api.leadocean.io/v1/enums/employee_range" \
-H "x-api-key: $LEADOCEAN_API_KEY" | jq -c '.values'Premium filters on LinkedIn's own data, such as shared connections or posted-in-the-last-30-days, have no twin here. Everything on the person and the company has one.
Step 3: 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": ["Director"],
"jobFunction": ["Sales & Business Development"],
"country": ["US"],
"employeeRange": ["51-200"],
"emailStatus": ["verified", "catch_all_valid", "catch_all"],
"limit": 1
}' | jq '.meta | {total, totalIsExact, countOnly}'meta.total is capped at 100,000. The same check is one prompt against the MCP server:
Using LeadOcean, count US people with job level Director, job function
Sales & Business Development, at companies with 51-200 employees.
Do not search for anyone.Claude calls leadocean_count_leads, which is free.
Step 4: Pull a batch and enrich it
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": ["Director"],
"jobFunction": ["Sales & Business Development"],
"country": ["US"],
"employeeRange": ["51-200"],
"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 returns flags, not addresses. To get one, call POST /v1/people/enrich with exactly one of linkedin_url, email, phone or person_id, and set reveal_email to true.
PID=$(jq -r '.data[0].meta.source_ids.person_id' batch.json)
curl -s -X POST https://api.leadocean.io/v1/people/enrich \
-H "x-api-key: $LEADOCEAN_API_KEY" \
-H "Content-Type: application/json" \
-d "{\"person_id\":\"$PID\",\"reveal_email\":true}" |
jq '.data.contact_data | {has_email, email_status, email_type,
email: .contact_emails[0].email}'That is the part Premium never gave you. Sales Navigator shows the search, not the inbox, and InMail is a message inside LinkedIn, not an address you own. Enrichment returns the address and its email_status so you can send from your own tools. The LinkedIn URL to email page covers the key-by-URL path.
A person we hold nothing for is a 404 and costs 0 records. There is no name plus company lookup, so search by domain first and enrich by person_id.
Step 5: Replace saved-search alerts
Premium's saved searches email you when new people match. The free LinkedIn account (September 2026) already saves three searches with weekly alerts, and Sales Navigator adds real-time updates.
LeadOcean refreshes its dataset monthly, so the honest replacement is a monthly diff. Re-run the free count and compare it with last month.
#!/usr/bin/env bash
echo "monitor.sh: run monthly from cron, costs 0 records"
BODY='{"jobLevel":["Director"],"country":["US"],"employeeRange":["51-200"],
"title":["Head of Growth"],"limit":1}'
NOW=$(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 "$BODY" | jq '.meta.total')
PREV=$(cat last_total.txt 2>/dev/null || echo 0)
echo "$(date +%F) total=$NOW previous=$PREV delta=$((NOW - PREV))"
echo "$NOW" > last_total.txtWhen the delta is not zero, pull the rows again with cursor and drop every person_id you already hold. You get a monthly alert, not a live one. For job changes the day they happen, keep Sales Navigator.
For lists above a few thousand rows, use POST /v1/exports on Solo ($97 a month) or above; bulk CSV export is 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.
What you get
Step 2 returns the exact strings the employeeRange filter accepts. We ran it on 2026-10-21.
{"name":"employee_range","description":"Company headcount bracket.","total":8,"matched":8,"values":["1-10","11-50","51-200","201-500","501-1000","1001-5000","5001-10000","10001+"],"truncated":false}Step 3 ran through leadocean_count_leads on 2026-10-21. The filters were jobLevel Director, jobFunction Sales & Business Development, country US and employeeRange 51-200. It returned this.
{"total":36453,"totalIsExact":true,"totalAll":119788,"distinctCompanies":20473,"credits":0}That is a mailable count, because the tool defaults to verified, catch_all_valid and catch_all addresses. totalAll is the same filters with no email condition. It cost 0 records.
Step 4 returns one record per match. This is the response shape from the API reference, 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 | Your records are spent. The free plan is 1,000 records, one-off. | Call GET /v1/account for the balance, or move to Solo at $97 a month. |
| 429 | Above your plan's rate limit per account (5 a second on Free, 50 on Solo, 200 on Agency). | Wait for Retry-After and retry. |
| Empty search results | A filter value is not an exact enum string, such as director instead of Director. | List the enum values and copy the string. |
| 404 on enrich | We hold nothing for that key. | Nothing to fix. It costs 0 records. Try another key such as person_id. |
| 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
What are the main features of LinkedIn Premium?
It depends on the plan. Per LinkedIn's comparison (September 2026), every paid plan has InMail credits, who viewed your profile and applicant insights. Advanced search needs All-in-One, Sales Navigator Core or Recruiter Lite.
How many InMail credits does Premium give you?
Per LinkedIn's InMail page (September 2026): 5 a month on Career, 15 on Business, 50 on Sales Navigator Core and 30 on Recruiter Lite. Unused credits stack up to a plan maximum, and LinkedIn offers no unlimited InMail plan.
Is LinkedIn Premium worth it for prospecting?
Only the search part. If you need people and contact data in your own tools, an API costs 0 records to size and 1 record per person returned. If you need to message people inside LinkedIn, you need the seat. See our Premium price breakdown.
Can I see who viewed my profile through an API?
No. Profile viewer data belongs to LinkedIn and is a Premium feature on every paid plan, with a 365-day window per LinkedIn's comparison (September 2026). LeadOcean does not offer it, and no search API replaces it.
Does LeadOcean replace Sales Navigator?
No. LeadOcean has no rep workspace, no InMail and no live job-change alerts. It replaces the search and the contact data, through the API, an MCP server and an Exports page in the app.
What does this cost on the free plan?
Sizing and the monthly monitor cost 0 records. The 25-person batch costs up to 25 of the 1,000 free records, and Free keys get both search and enrich scopes. Solo is $97 a month and Agency $497, with a fair-use pace instead of credits. See pricing.
Run your Premium searches as API calls, free
Free to start. No credit card. 1,000 records to spend whenever you like.
Get your free API key →