Pre-Black Friday: 20% off, for as long as you stayEARLYBFon Solo and AgencyEnds Nov 28Start free

How-to guide

How to Replace LinkedIn Premium's Search Features With an API (No Seat Needed)

Premium sells search, lists, alerts and InMail. Four of those are data problems. Here is how to run them as API calls and what you still need LinkedIn for.

Get your free API key →Free to start. No credit card. 1,000 records to spend whenever you like.

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.
  • curl and jq.

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 featurePlan that has itA data job?API equivalent
Advanced search filtersAll-in-One, Sales Navigator Core, Recruiter LiteYesPOST /v1/people/search
Custom lead and account listsSales Navigator CoreYesA saved filter body, or POST /v1/exports on Solo and above
Real-time updates and alertsSales Navigator CorePartlyMonthly re-count (Step 5)
Contact detailsNot a Premium featureYesPOST /v1/people/enrich
InMail creditsAll paid plans, 5 to 50 a monthNoNone
Who viewed your profileAll paid plans, 365 daysNoNone
Applicant insightsAll paid plansNoNone
LinkedIn LearningAll paid plans except Recruiter LiteNoNone

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 filterLeadOcean fieldExample value
Seniority leveljobLevelDirector
FunctionjobFunctionSales & Business Development
GeographycountryUS
Current job titletitleHead of Growth
Company headcountemployeeRange51-200
Industryindustrycheck the enum
Keywordskeywordsoutbound

Sales Navigator Core advertises 50+ search filters (September 2026). LeadOcean has 50 people filters and 34 company filters. List them with one free call:

bash
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:

bash
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.

bash
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:

text
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.

bash
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.json

For 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.

bash
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.

bash
#!/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.txt

When 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.

json
{"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.

json
{"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:

json
{
  "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

ErrorCauseFix
401The x-api-key header is missing or the key is wrong.Copy a fresh key from the app and re-export $LEADOCEAN_API_KEY.
402Your 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.
429Above 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 resultsA filter value is not an exact enum string, such as director instead of Director.List the enum values and copy the string.
404 on enrichWe hold nothing for that key.Nothing to fix. It costs 0 records. Try another key such as person_id.
Export refusedOne 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 →