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. curlandjq.- 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:
| Job | Automate it? |
|---|---|
| Find people who match your ICP | Yes, from a data API, not from LinkedIn pages |
| Find and verify a work email | Yes |
| Send email sequences | Yes, from your own sequencer |
| Send connection requests or messages on LinkedIn | No. Do it by hand |
| Scrape profiles or search results | No |
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:
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 sendTools 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.
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.
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.jsonThis 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.
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.
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:
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.
{
"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):
{
"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
| Error | Cause | Fix |
|---|---|---|
| 401 | Missing or wrong x-api-key | Check $LEADOCEAN_API_KEY is exported in this shell |
| 429 | Above the plan's rate limit (5 a second on Free, 200 on Agency) | Back off for the Retry-After header, then retry |
| 402 | The free 1,000 records are spent | Move to Solo at $97 a month or Agency at $497 a month |
| 0 results | A filter value is not an exact enum string, such as vp for jobLevel | Call leadocean_list_enum_values and copy the value as written |
| 404 on enrich | We hold nothing for that person | Nothing is charged. Try another identifier |
| Export refused | Over 50,000 rows a request or 500,000 a day, or the plan has no bulk CSV | Split 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 →