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

How-to guide

How to build a LinkedIn prospect list as an SDR (B2B)

Size the list for free, pull it by API, add emails, and use LinkedIn only for the touch that needs it.

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

An SDR spends too much of the day copying names out of LinkedIn. This guide moves that step to an API call and keeps LinkedIn for what it does well: the connection request and the reply.

TL;DR

  • Size the list first with a free count, then pull only the rows you will work this week.
  • Enrich the people you will contact, so the email and LinkedIn URL arrive together.
  • It takes about 20 minutes and spends about 50 records on the example below, which fits inside the Free plan's 1,000.

Prerequisites

  • A LeadOcean API key from app.leadocean.io, exported as $LEADOCEAN_API_KEY. The Free plan has no card and allows 5 requests a second.
  • curl and jq, or any HTTP client.
  • A target profile: titles, country and company size. Write it down before you query.

Step 1: Define who the SDR is chasing

Start with a buyer, not a keyword. Pick one title family, one country and one headcount band.

For this example the buyer is a Sales Development Representative in the US, at companies with 51 to 200 people. The enum strings are exact, so check them before you use them. Job levels are C-Team, Director, Manager, Other, Staff and VP.

bash
curl -s "https://api.leadocean.io/v1/enums/job_level" \
  -H "x-api-key: $LEADOCEAN_API_KEY" | jq '.data.values'

Step 2: Size the list for free

A count costs nothing. Send count=true as a query parameter with limit 1, and the body stays flat JSON.

bash
curl -s -X POST "https://api.leadocean.io/v1/people/search?count=true&limit=1" \
  -H "x-api-key: $LEADOCEAN_API_KEY" \
  -H "content-type: application/json" \
  -d '{
    "title": ["Sales Development Representative"],
    "country": ["US"],
    "employeeRange": ["51-200"]
  }' | jq '.meta'

meta.total is capped at 100,000, and data comes back empty with meta.countOnly true. If the number is too big to work, narrow it. If it is under a few hundred, widen the title.

Step 3: Pull a first batch

Pull one page of 25. A search page of 25 is 25 records, so keep limit small until you trust the filters.

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 '{
    "title": ["Sales Development Representative"],
    "country": ["US"],
    "employeeRange": ["51-200"],
    "limit": 25
  }' > batch1.json

jq -r '.meta.nextCursor // "no more pages"' batch1.json

To get the next page, send the same body with "cursor" set to that value. One search pages to 10,000 rows, then meta.depthCapped turns true. Narrow the filters instead of walking further.

Step 4: Enrich the people you will contact

Search finds the person. Enrich adds the work email and the profile link. Enrich takes exactly one of linkedin_url, email, phone or person_id, and reveal_email returns the address.

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 '{"person_id": "PERSON_ID_FROM_SEARCH", "reveal_email": true}'

A person we hold nothing for is a 404 and costs nothing. Read email_status before you send: there is no refund for bounces.

If you already have a LinkedIn URL from a prospect who replied, enrich from that instead.

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"}'

Step 5: Split the work between email and LinkedIn

Use email for the first touch to anyone with verified status. Use LinkedIn for people without a safe address, and for the second touch on everyone else.

A simple weekly rhythm for one SDR:

  1. Monday: pull 100 rows, enrich the top 50.
  2. Tuesday to Thursday: email first, then a LinkedIn connection note on day 3.
  3. Friday: count again with a tighter filter and refill the queue.

The app has no sequencer or Chrome extension. Send from your own tool and keep LeadOcean as the data source. For a company-first view, see account-based sales development.

Step 6: Export the batch when it is bigger than a page

Past a few hundred rows, export instead of paging. POST /v1/exports takes up to 50,000 rows a request and 500,000 a day. Bulk CSV export is not on Free, so this step needs Solo ($97 a month) or higher.

bash
curl -s -X POST "https://api.leadocean.io/v1/exports" \
  -H "x-api-key: $LEADOCEAN_API_KEY" \
  -H "content-type: application/json" \
  -d '{
    "filters": {
      "title": ["Sales Development Representative"],
      "country": ["US"],
      "employeeRange": ["51-200"]
    },
    "limit": 500
  }'

You can do the same from the Exports page in the app: filter builder, column picker, a price preview, then a CSV download. If you used Sales Navigator for this before, the Sales Navigator export guide covers what that route allows.

What you get

The free count for the Step 2 audience, run through the LeadOcean MCP tool leadocean_count_leads on 2026-10-21 with title Sales Development Representative, country US and employeeRange 51-200.

json
{
  "total": 1630,
  "totalIsExact": true,
  "totalAll": 6470,
  "distinctCompanies": 936,
  "credits": 0
}

total counts people with a verified, catch-all-valid or catch-all email. totalAll is the same filters with no email condition. The 1,630 people work at 936 companies. The count spent no records.

A search row carries the person's id at meta.source_ids.person_id, the LinkedIn profile_url when held, and the flags has_email, email_status and email_type. It never carries the address itself; Step 4 does that. About a fifth of people have no LinkedIn URL, so enrich those by person_id.

For more on getting email from a profile, see how to use LinkedIn for B2B sales.

Troubleshooting

ErrorCauseFix
401Missing or wrong x-api-key headerRe-export $LEADOCEAN_API_KEY and check for a trailing space
429Above the plan's rate limit (5 a second on Free, 200 on Agency)Honour Retry-After, or add a short sleep between calls
402Records spent (Free is 1,000 for life)Move to Solo at $97 a month, or narrow the next pull
Empty resultsA filter value that is not an exact enum stringCheck the value with GET /v1/enums and use it as written
meta.depthCapped trueOne search reached 10,000 rowsAdd filters and run a second search
Export refusedOver 50,000 rows a request or 500,000 a daySplit the filters into smaller exports

FAQ

Does this scrape LinkedIn?

No. The data comes from the LeadOcean database through its API, not from your LinkedIn session. Your LinkedIn account is only used for the messages you send yourself.

How many records does an SDR need a week?

Pulling 100 and enriching 50 a week is about 150 records, so the Free plan's 1,000 lasts several weeks. A full-time SDR will want a paid plan; see pricing.

Can I get phone numbers too?

Yes, with GET /v2/people/phone. A v2 contact call costs one record, including a call that finds nothing, so enrich first and call it only for the people you will phone.

Is a high email count the same as a mailable list?

No. The default count keeps only verified, catch-all-valid and catch-all addresses. Say which filter you used whenever you quote a number.

Can I run this from an AI assistant?

Yes. The hosted MCP server at https://api.leadocean.io/mcp has 13 tools, and leadocean_count_leads and leadocean_list_enum_values are free. More guides are on the blog.

Build your SDR prospect list with a free API key

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

Get your free API key →