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

How-to guide

How to Automate LinkedIn Outreach Without Automating LinkedIn (API Recipe)

LinkedIn prohibits bots on its site. Automate the list and the email instead, and keep the LinkedIn touch manual.

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

LinkedIn does not allow bots, scrapers or browser extensions that automate activity on its site. The setup that works is to automate everything around LinkedIn and keep the LinkedIn step human.

TL;DR

  • Allowed: building your list from a data API, finding verified work emails, sending email from your own sequencer, and opening LinkedIn yourself to view a profile or send a note.
  • Not allowed: bots that send connection requests or messages, scrapers, and extensions that automate or overlay LinkedIn. LinkedIn says accounts using them risk restriction or shutdown.
  • This recipe takes about 30 minutes and spends about 120 LeadOcean records on a 100-row test, so it fits the free plan. Sizing the list costs nothing.

Prerequisites

  • A LeadOcean API key in $LEADOCEAN_API_KEY. The free plan gives 1,000 records for life, no card, 5 requests a second.
  • curl and jq.
  • An email sequencer you already use. LeadOcean has no sequencer, dialer or Chrome extension, so sending stays in your tool.
  • A LinkedIn account that you use by hand.

Step 1: Know what LinkedIn allows

LinkedIn's help page on prohibited software says it does not permit third-party software that scrapes, modifies the appearance of, or automates activity on its site. That covers crawlers, bots, browser plug-ins and browser extensions (LinkedIn Help, October 2026).

Section 8.2 of the User Agreement lists the specific bans. They include scraping profiles, using bots to add contacts or send messages, and bypassing use limits (LinkedIn User Agreement, October 2026).

Read that as a line between two jobs:

JobAutomate it?
Find people who match your ICPYes, from a data API, not from LinkedIn pages
Find and verify a work emailYes
Send email sequencesYes, from your own sequencer
Send connection requests or messages on LinkedInNo. Do it by hand
Scrape profiles or search resultsNo

This is a summary of LinkedIn's published rules, not legal advice. Write the line into your own runbook so nobody on the team crosses it by accident:

yaml
linkedin:   # our own team rules, not a LinkedIn file
  send_messages_with_software: false
  send_connection_requests_with_software: false
  scrape_profiles_or_search_results: false
  browser_extensions_on_linkedin: false
  manual_profile_views_and_notes: true
data:
  source: api            # list building happens off-platform
  email_status_allowed: [verified, catch_all_valid]
email:
  sequencer: yours       # LeadOcean returns data, it does not send

Tools that promise to automate LinkedIn exist, and some are popular. They still sit on the wrong side of the rules above, and LinkedIn says the tools themselves may stop working without notice. Treat any vendor claim of a safe limit as unverified. Nothing in LinkedIn's published policy sets a safe daily number.

The reason to bother is plain. A restricted LinkedIn account costs a rep their main research tool, and no list size is worth that.

Step 2: Size the list for free

Most outreach tools work the other way round: they start on LinkedIn and bolt email on later. Start from the list instead. A list built from an API can be sized, filtered and re-run next month with the same query, and it does not depend on a LinkedIn session staying healthy.

Count before you spend. The MCP tool leadocean_count_leads and the REST search with count=true both cost 0 records.

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"],
    "limit": 1
  }' | jq '.meta'

count=true goes in the query string, not the JSON body. meta.total is capped at 100,000, so a broad filter reads as the cap. Narrow it until the number is a list you would actually work.

Step 3: Pull a test list

Run the same filters without count. Filters are arrays, limit runs 1 to 100, and you page with cursor.

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"],
    "limit": 100
  }' > page1.json

jq '.meta' page1.json

This spends 100 records, one per person returned. Pass meta.nextCursor as cursor in the next call. One search pages to 10,000 rows, then meta.depthCapped turns true. Narrow the filters instead of walking further.

Step 4: Get a verified work email

Enrich takes exactly one of linkedin_url, email, phone or person_id. If you already hold a profile URL, you can enrich from it and reveal_email returns the address. The URL below is a placeholder.

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
  }' | jq '.data.contact_data | {has_email, email_status, contact_emails}'

A person we hold nothing for returns 404 and costs nothing. Read email_status before you send: there is no refund for bounces. Default sends should use verified and catch_all_valid only.

Step 5: Export the full list as CSV

When the count looks right, export it. Bulk CSV export is not on the Free plan. Free keys spend their 1,000 records through search and enrich instead.

bash
curl -s -X POST "https://api.leadocean.io/v1/exports" \
  -H "x-api-key: $LEADOCEAN_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "name": "us-sales-vps",
    "filters": {
      "jobLevel": ["VP"],
      "jobFunction": ["Sales & Business Development"],
      "country": ["US"]
    },
    "limit": 5000,
    "preset": "full"
  }'

An export takes up to 50,000 rows a request and 500,000 a day. Every row costs one record whatever the columns. You can also do this in the app at app.leadocean.io: filter builder, column picker and a price preview before you start.

Step 6: Send email, and touch LinkedIn by hand

Load the CSV into your sequencer and send email there. LeadOcean returns the LinkedIn URL (profile_url) for each person where it holds one. Use it as a research link: open the profile yourself, check the role, and send a note or a connection request manually if it fits.

A workable cadence for one rep is a three-touch email sequence over ten days. Add a manual LinkedIn view on day 1 and a short note on day 4 for the replies you care about most. The email does the volume. LinkedIn does the warm-up.

Map the columns like this when you import the CSV:

text
email_1_address     -> Email
email_1_status      -> keep only verified, catch_all_valid
profile_first_name  -> First name
profile_last_name   -> Last name
profile_url         -> LinkedIn field (research link, opened by hand)

Sort by email_1_status first. Sending to unverified rows is how a list burns a domain, and bounces are not refunded.

If you want the list to refresh itself, run Steps 2 to 5 from n8n or Clay. See the n8n recipe and the Clay recipe. Neither sends LinkedIn messages.

What you get

The useful part of a sizing call is the answer to one question: is this list worth working by hand? A list of 129,000 is a segmentation job. A list of 150 is a week of careful, personal outreach where the manual LinkedIn step earns its keep.

This is a live sizing call for Step 2's filters, run on 2026-10-21 with the free leadocean_count_leads tool. The count covers verified, catch-all-valid and catch-all emails, which is the tool's default. It is not a count of people reachable on LinkedIn.

json
{
  "total": 129494,
  "totalIsExact": true,
  "totalAll": 350517,
  "distinctCompanies": 58121,
  "distinctCompaniesIsExact": false,
  "credits": 0,
  "unsupportedFilters": []
}

That is 129,494 VPs in sales and business development in the US with a mailable address, across about 58,000 companies. totalAll is the same filters with no email condition: 350,517 people. Split the list by company size or industry before you send.

A record-level enrich response has this shape (response shape from the API reference, placeholder values):

json
{
  "success": true,
  "data": {
    "profile_data": {
      "profile_full_name": "Jane Doe",
      "profile_url": "https://www.linkedin.com/in/jane-doe-example"
    },
    "contact_data": {
      "has_email": true,
      "has_phone": false,
      "email_status": "verified",
      "contact_emails": [{ "email": "jane.doe@acme.com", "type": "work", "status": "verified" }],
      "contact_current_experiences": [{ "job_title": "VP Sales", "company_name": "Acme", "company_domain": "acme.com" }]
    },
    "resume_data": { "experiences": [] }
  },
  "meta": { "credits": 1 }
}

Troubleshooting

ErrorCauseFix
401Missing or wrong x-api-keyCheck $LEADOCEAN_API_KEY is exported in this shell
429Above the plan's rate limit (5 a second on Free, 200 on Agency)Back off for the Retry-After header, then retry
402The free 1,000 records are spentMove to Solo at $97 a month or Agency at $497 a month
0 resultsA filter value is not an exact enum string, such as vp for jobLevelCall leadocean_list_enum_values and copy the value as written
404 on enrichWe hold nothing for that personNothing is charged. Try another identifier
Export refusedOver 50,000 rows a request or 500,000 a day, or the plan has no bulk CSVSplit into several exports, or check the plan

FAQ

Is LinkedIn automation allowed?

Not by LinkedIn's rules. Its help page prohibits bots, crawlers, plug-ins and extensions that scrape, modify or automate activity on the site, and says members who use them risk restriction or shutdown.

Can I automate connection requests safely?

No setting makes it safe. LinkedIn's own policy bans using bots to add contacts or send messages. Send those by hand and automate the email channel instead.

Does this recipe touch LinkedIn's site?

No. Every call goes to api.leadocean.io. You open LinkedIn yourself, in a normal browser session, only for the manual step.

Does LeadOcean send LinkedIn messages or email?

No. It returns data: people, companies, emails, phones and CSV exports. You send from your own tools.

How many records does the test cost?

About 120 on a 100-row test: 100 for the search page plus a few enrichments. Counting is free.

Related reading: best lead generation tools that actually work, enrichment tools ranked for Zendesk, how Sales Navigator works, LeadOcean pricing and the LeadOcean blog.

Build the list outside LinkedIn and keep your account safe

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

Get your free API key →