You do not need 14 tools. You need one tool per job: data, routing, verification, sending, CRM and booking. This guide lists 14 options across those jobs, then wires one of each into a pipeline you can run today. Related reading: what a GTM engineer does, LeadOcean for GTM engineers and outbound sales automation.
TL;DR
- The 14 tools split into six jobs. Pick one per job and keep the rest as swaps.
- Steps 1 to 3 take about 45 minutes and spend about 150 of your 1,000 free LeadOcean records. Sizing a list costs none.
- Data goes in once, at the start. Every later tool reads the same
person_idandemail_status, so nothing is re-bought.
The 14 tools by job
| Job | Tools | What it does |
|---|---|---|
| Data | LeadOcean REST API, LeadOcean MCP server, LeadOcean app Exports page | People and company search, enrichment, CSV export |
| Routing | Clay, n8n, Make, Zapier | Call an API per row or per event and move the result on |
| Agent | Claude Code | An agent that runs commands and calls MCP tools (Claude Code docs, September 2026) |
| Verify and send | VerifyHQ, ReachHQ, Instantly | Check addresses, then run the campaign |
| Record and book | HubSpot, Cal.com | CRM records and meeting booking, both with public APIs |
| Glue | curl and jq | The test harness for every request below |
That is 14 entries. LeadOcean has no sequencer, dialer, CRM or Chrome extension. It supplies the data and the sizing, and the other tools do the rest.
Which tool wins for which buyer
A solo founder should pick Zapier or Make plus a sender, and use the Exports page for big pulls. A GTM engineer who already lives in code should skip the router and call the API from a script, with Claude Code for the odd ad hoc pull. A team that wants a table UI for non-engineers should pick Clay, and should check its plan limits first. Agencies should look at Agency at $497 a month, which gives 5 keys and 200 requests a second.
Prerequisites
- A LeadOcean account and key from app.leadocean.io, exported as
$LEADOCEAN_API_KEY. The Free plan has no card and 1,000 records for life. curlandjqon your machine.- One router: n8n, Make, Zapier or Clay. Clay's free plan caps tables at 200 rows (Clay pricing, September 2026).
- One sender and one CRM account if you want to run steps 4 and 5 end to end.
Step 1: Size the list for free
Count before you spend. A search with count=true and limit=1 costs no records, and count=true goes in the query string, not the JSON body.
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":["CA"],"limit":1}' | jq .metaAgents get the same check from the MCP tool leadocean_count_leads. Company lists use GET /v1/companies/count or leadocean_count_companies. Both are free.
Read the count as a decision. Under about 200 people, the filter is too narrow, so widen the job level or add a country. Over 10,000, narrow it, because one search pages to 10,000 rows anyway. The sweet spot for a first campaign is a few hundred to a few thousand mailable people at companies that match your buyer.
Step 2: Pull the first page
Pull 25 people, not 25,000. The body is flat JSON, filters are arrays and limit runs 1 to 100.
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":["CA"],"emailStatus":["verified"],"limit":25}' \
| jq '.data[] | {person_id: .meta.source_ids.person_id, email_status: .contact_data.email_status}'Each person returned is one record, so this spends 25. For more than a few hundred rows, switch to POST /v1/exports: one request takes up to 50,000 rows and a day allows 500,000. Bulk CSV export is not on Free, so on Free page through search with cursor.
Step 3: Enrich one person by ID
Search by domain first, then enrich by person_id. Enrich takes exactly one of linkedin_url, email, phone or person_id.
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_STEP_2","reveal_email":true}'A person we hold nothing for is a 404 and costs nothing. Enrich also returns career history (past roles, education, certifications) since October 2026, which makes a good first line for a cold email.
A GTM engineer would add one more check here: how many distinct employers the matched people span. The count response carries distinctCompanies, so you can see whether 5,000 people are 5,000 companies or 500. Cold email to ten people at one company in one week reads as spam, so cap the sends per domain in your sender.
Step 4: Route rows with a router
Every router makes the same call: an HTTP request with the x-api-key header.
- n8n: an HTTP Request node, or the MCP Client Tool node pointed at
https://api.leadocean.io/mcp(n8n docs, September 2026). - Zapier: Webhooks by Zapier sends the request (Zapier help, September 2026).
- Make: the HTTP module (Make apps, September 2026).
- Clay: an HTTP API column. See LeadOcean + Clay.
Pick the router you already pay for. The request body is the Step 3 body with the row's person_id mapped in. Recipes: LeadOcean + n8n, Make, Zapier.
Step 5: Verify, send and record
Gate on email_status before anything is sent. Send only verified, catch_all_valid or catch_all. We do not refund or credit back bounced emails, so read the status first.
jq '.data[] | select(.contact_data.email_status | IN("verified", "catch_all_valid", "catch_all"))' page.jsonThen hand off. VerifyHQ re-checks catch-all rows (VerifyHQ integrations, September 2026). ReachHQ imports leads over its REST API (ReachHQ API docs, September 2026). Instantly has an API v2 for the same job (Instantly docs, September 2026). HubSpot's CRM API and Cal.com's API v2 take the replies and bookings (HubSpot, Cal.com, both September 2026).
Order matters. Verify before you load the sender, because a bad address costs you sender reputation and LeadOcean does not take it back. Load the CRM after the first reply, not before, so your CRM holds people who engaged and not a raw list.
Step 6: Give an agent the same data
Claude Code can call the MCP server directly. Add it with claude mcp add --transport http leadocean https://api.leadocean.io/mcp, then sign in with claude mcp login leadocean. Sign-in is OAuth, so no key is pasted. Then ask in plain language:
Use leadocean_count_leads: VP, Sales & Business Development, Canada.
Report the mailable total, the unfiltered total and how many employers it spans.
Do not call any tool that spends records.The agent route suits founders who do not want to build a router. Ask for a count, then ask for 25 rows, then ask for a first line per person from the career history. Each step is a tool call you can read in the transcript. Set a hard rule in the prompt that spend tools need your yes first. The free tools are leadocean_count_leads, leadocean_count_companies, leadocean_list_filters and leadocean_list_enum_values. The others spend one record per person or company returned.
What you get
Here is the MCP sizing call from Step 6, run on 2026-10-21. The mailable count uses the tool default (verified, catch_all_valid or catch_all).
{
"total": 5574,
"totalIsExact": true,
"totalAll": 18800,
"distinctCompanies": 3873,
"credits": 0
}So 5,574 VPs in Sales & Business Development in Canada are mailable, out of 18,800 who match with no email condition. The call spent no records. A company count (Computer Software, 11-50 employees, US HQ) returned 2,125 on the same day.
A person record follows this response shape from the API reference, with placeholder values:
{
"success": true,
"data": {
"profile_data": { "profile_full_name": "Jane Doe" },
"contact_data": {
"email_status": "verified",
"contact_emails": [{ "email": "jane@acme.com", "status": "verified" }],
"contact_phones": [{ "phone": "+14155550133", "type": "mobile" }],
"contact_current_experiences": [{ "job_title": "VP Sales", "company_name": "Acme", "company_domain": "acme.com" }]
},
"resume_data": { "experiences": [], "educations": [] },
"meta": { "source_ids": { "person_id": "123456789" } }
}
}Troubleshooting
| Error | Cause | Fix |
|---|---|---|
| 401 | Missing or wrong key | Send x-api-key: $LEADOCEAN_API_KEY. Check the key on the app's API keys page. |
| 429 | Above the plan's rate limit (5 a second on Free, 50 on Solo, 200 on Agency) | Honour Retry-After. Add a Wait node or a delay between rows. |
| 402 | Out of records on Free | The 1,000 free records are spent. Move to Solo ($97 a month) or Agency ($497 a month). |
Empty data | A filter value is not an exact string | Look up values with leadocean_list_enum_values. jobLevel is VP, not vp. |
meta.depthCapped is true | One search pages to 10,000 rows | Narrow the filters. Do not walk the index. |
| Export refused | Over 50,000 rows a request or 500,000 a day | Split the export by country or job level. |
FAQ
Do I need all 14 tools?
No. One data source, one router, one sender and one CRM is a complete pipeline. The agent and booking tools are optional.
What does LeadOcean cost to run this?
Free spends 1,000 records, once. Solo is $97 a month and Agency is $497 a month. Paid plans have a fair-use pace, not credits.
Where does a founder with no engineer start?
Start with Zapier or Make and the HTTP step, and size lists with the app's Exports page. It has a filter builder, a column picker and a price preview, and it downloads a CSV.
Can I run this without a router?
Yes. The curl calls above run from cron. A router adds retries, branching and a UI.
Size your first outbound list free, then build the pipeline on 1,000 records
Free to start. No credit card. 1,000 records to spend whenever you like.
Get your free API key →