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

How-to guide

How to Use LinkedIn for B2B Sales (Without Living in the Feed)

Build the list with an API, keep LinkedIn for the part that needs a human: the first warm touch.

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

LinkedIn works for B2B sales when you split the job in two. Use data to build the list. Use LinkedIn for the human part: the profile view, the comment, the connection note.

This guide shows the list half with real requests. Everything runs against https://api.leadocean.io.

TL;DR

  • Size the audience for free, pull 25 profiles, enrich the ones you want, and keep LinkedIn for outreach. About 20 minutes.
  • It spends about 30 of the 1,000 records on the free plan. Counts and empty enrichments cost nothing.
  • LeadOcean has no sequencer or Chrome extension. You bring your own LinkedIn account and your own outreach tool.

Prerequisites

  • A LeadOcean API key from the free plan, exported as $LEADOCEAN_API_KEY. The free plan allows 5 requests a second.
  • curl and jq.
  • A LinkedIn account you already use. Respect its terms: this recipe never automates it.

Step 1: Define who you want and size the list

Write the buyer as filters before you open LinkedIn. Pick a level, a function, a country and a company size. Then count.

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": ["VP"],
    "jobFunction": ["Sales & Business Development"],
    "country": ["US"],
    "employeeRange": ["51-200"],
    "limit": 1
  }' | jq '.meta'

The count=true flag is a query parameter, never a body field. It is a free sizing call. meta.total is capped at 100,000.

Enum values are exact strings. Check them with GET /v1/enums or the leadocean_list_enum_values MCP tool before you guess.

Step 2: Pull a first page of profiles

Fetch 25 people. Search body is flat JSON, filters are arrays, and limit runs from 1 to 100.

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": ["VP"],
    "jobFunction": ["Sales & Business Development"],
    "country": ["US"],
    "employeeRange": ["51-200"],
    "limit": 25
  }' > page1.json
jq '.meta' page1.json

This spends 25 records. For the next page, pass meta.nextCursor back as cursor in the body. Each row carries its id at meta.source_ids.person_id. One search pages to 10,000 rows, then meta.depthCapped turns true. Narrow the filters instead of walking further.

Step 3: Enrich the people worth a LinkedIn touch

Read the page and pick 5 to 10 people. Then enrich each by linkedin_url, email, phone or person_id. Send exactly one.

bash
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-example", "reveal_email": true}'

An enrichment that finds nothing returns a 404 and costs nothing. Since October 2026 the response also carries career history in resume_data: past roles, education, certifications and awards. It is the raw material for a specific opener.

Step 4: Write one specific line per person

A connection note that names a past role beats a note that names nothing. Pull the two facts you need with jq.

bash
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-example"}' \
  | jq '{now: .contact_data.contact_current_experiences, before: .resume_data}'

Then write the note by hand. Keep it under 300 characters:

text
Hi Jane, saw you moved from Acme to Globex to run sales. We help
RevOps teams get verified emails by API. No pitch, just keen to
connect with people building the same motion.

Step 5: Run a simple weekly LinkedIn rhythm

Keep the human work small and repeatable. This is the whole routine:

text
Mon  Pull 25 new profiles (Step 2). Enrich 10 (Step 3).
Tue  View profile, like or comment on one recent post. 10 people.
Wed  Send connection notes (Step 4). 10 people.
Thu  Accepted? Send the email from reveal_email, referencing the connection.
Fri  Count replies. Narrow or widen the filters from Step 1.

Email is the follow-up channel, not the opener. Check email_status before you send, because bounced emails are not refunded.

What you get

Step 1 returns a free count. Here is the same filter run through the leadocean_count_leads MCP tool on 21 October 2026:

json
{
  "total": 18567,
  "totalIsExact": true,
  "totalAll": 60456,
  "distinctCompanies": 12192
}

That is 18,567 US sales VPs at companies of 51-200 people. Each has a verified or catch-all email (the tool default). They span 12,192 employers. Without the email condition the same filters match 60,456.

The enrich response, shape from the API reference with placeholder values:

json
{
  "profile_data": { "...": "Jane Doe, headline, location" },
  "contact_data": {
    "has_email": true,
    "email_status": "verified",
    "contact_current_experiences": [{ "...": "VP Sales at Acme" }]
  },
  "resume_data": {
    "experiences": [{ "...": "Director of Sales at Globex, with dates" }],
    "educations": [],
    "certifications": []
  }
}

Troubleshooting

ErrorCauseFix
401Missing or wrong x-api-key headerCheck $LEADOCEAN_API_KEY is exported and sent as x-api-key
429Above the plan's rate limit (5 a second on Free, 200 on Agency)Honour the Retry-After header and slow the loop
402The 1,000 free records are spentMove to a paid plan, see pricing
Empty dataA filter value is not an exact enum stringCheck GET /v1/enums and copy the string as written
404 on enrichNobody matched that inputFree. Try email or person_id instead
Export stopsOver 50,000 rows a request or 500,000 a daySplit the export by country or level

FAQ

Is this allowed under LinkedIn's terms?

This recipe does not scrape or automate LinkedIn. The data comes from the LeadOcean API. You still do the viewing, commenting and messaging yourself.

Do I need Sales Navigator?

No. You can build lists with filters, then use LinkedIn for outreach. For the Sales Navigator route, read how to use LinkedIn Sales Navigator for lead generation.

What about LinkedIn scrapers?

They automate the part LinkedIn restricts. See best LinkedIn scrapers before you pick one.

How do I run this for a team?

Use the Exports page in the app at app.leadocean.io for bulk CSV, which is not on the free plan. SDRs can follow the LinkedIn guide for SDRs.

What does it cost at scale?

The free plan gives 1,000 records for life. Solo is $97 a month and Agency is $497 a month, with a fair-use pace instead of credits. See pricing. More guides are on the blog.

Build your LinkedIn prospect list from an API

Free to start. No credit card. 1,000 records to spend whenever you like.

Get your free API key →