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

How-to guide

How to Build an Outbound Pipeline From 14 Sales Automation Tools (Founders and GTM Engineers)

One data API, a router, a sender and a CRM. The queries are real and the first 1,000 records are free.

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

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_id and email_status, so nothing is re-bought.

The 14 tools by job

JobToolsWhat it does
DataLeadOcean REST API, LeadOcean MCP server, LeadOcean app Exports pagePeople and company search, enrichment, CSV export
RoutingClay, n8n, Make, ZapierCall an API per row or per event and move the result on
AgentClaude CodeAn agent that runs commands and calls MCP tools (Claude Code docs, September 2026)
Verify and sendVerifyHQ, ReachHQ, InstantlyCheck addresses, then run the campaign
Record and bookHubSpot, Cal.comCRM records and meeting booking, both with public APIs
Gluecurl and jqThe 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.
  • curl and jq on 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.

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

Agents 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.

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":["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.

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_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.

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.

bash
jq '.data[] | select(.contact_data.email_status | IN("verified", "catch_all_valid", "catch_all"))' page.json

Then 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:

text
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).

json
{
  "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:

json
{
  "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

ErrorCauseFix
401Missing or wrong keySend x-api-key: $LEADOCEAN_API_KEY. Check the key on the app's API keys page.
429Above 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.
402Out of records on FreeThe 1,000 free records are spent. Move to Solo ($97 a month) or Agency ($497 a month).
Empty dataA filter value is not an exact stringLook up values with leadocean_list_enum_values. jobLevel is VP, not vp.
meta.depthCapped is trueOne search pages to 10,000 rowsNarrow the filters. Do not walk the index.
Export refusedOver 50,000 rows a request or 500,000 a daySplit 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 →