You get a workflow that turns a filter set into a CSV of people with verified work emails. Each row then goes to whatever node comes next. The main route is three HTTP Request nodes against the LeadOcean export endpoint. An MCP Client Tool node gives an AI agent the same data as tools. Both use one key and the same record count. Each person returned counts one record either way.
How it works
Run the export as a job: create it, poll it, download the file. One export holds up to 50,000 rows, so 10,000 rows is one run, not 100 pages. A search call returns 100 people at most per page, which is why the export route suits big pulls.
- Add a credential. In n8n, create a Header Auth credential. Set Name to
x-api-keyand Value to your LeadOcean key. - Create the export. Add an HTTP Request node. Method POST, URL
https://api.leadocean.io/v1/exports, Authentication "Generic Credential Type", then Header Auth. Send the JSON body below. The API answers 202 with a jobid. - Wait. Add a Wait node set to After Time Interval. The response carries
pollAfter(typically 10 seconds), so use that. - Check status. Add a second HTTP Request node: GET
https://api.leadocean.io/v1/exports/{{ $json.data.id }}. Follow it with an If node that testsdata.statusequalsdone. Send the false branch back to the Wait node. - Download the CSV. On the true branch, add a third HTTP Request node: GET
https://api.leadocean.io/v1/exports/{{ $json.data.id }}/download. Under Options, set Response Format to File. - Parse it. Add an Extract From File node, operation Extract From CSV, Input Binary Field
data. You now have one n8n item per person. - Send rows on. Map the fields below into your CRM, sheet or sequencer node.
For an AI agent, skip steps 2 to 6. Add an MCP Client Tool node to your agent, point it at https://api.leadocean.io/mcp, and set Tools to Include to Selected. Start with count_leads and search_leads. n8n's docs list bearer, header, multiple headers and OAuth2 as the authentication options.
The n8n docs page only names an SSE Endpoint field. The node's source shows more. From node version 1.2 it has a Server Transport option, with HTTP Streamable as the default and SSE as the alternative. Earlier versions are SSE only (n8n source, October 2026). Use a current n8n so the node offers both.
The LeadOcean MCP OAuth server supports dynamic client registration at https://api.leadocean.io/oauth/register (scope mcp), so a client can register itself. We have not tested n8n's OAuth2 sign-in against it. The simplest route is a Header Auth credential with your API key.
Configuration
Body for step 2. Filters join with AND. Several values inside one filter join with OR.
{
"name": "n8n VP sales Canada",
"filters": {
"jobLevel": ["VP"],
"jobFunction": ["Sales & Business Development"],
"country": ["CA"],
"emailStatus": ["verified"],
"emailType": ["work"]
},
"limit": 10000,
"columns": [
"profile_full_name", "profile_first_name", "profile_last_name",
"profile_url", "current_job_title", "current_company_name",
"current_company_domain", "email_N_address", "email_N_status"
]
}The same call from a terminal, to test the filters before you build the workflow:
curl -X POST https://api.leadocean.io/v1/exports \
-H "x-api-key: $LEADOCEAN_API_KEY" \
-H "Content-Type: application/json" \
-d '{"name":"n8n test","filters":{"jobLevel":["VP"],"country":["CA"],"emailType":["work"]},"limit":100,"columns":["profile_full_name","current_company_domain","email_N_address"]}'
curl -H "x-api-key: $LEADOCEAN_API_KEY" https://api.leadocean.io/v1/exports/EXPORT_ID
curl -H "x-api-key: $LEADOCEAN_API_KEY" -o people.csv https://api.leadocean.io/v1/exports/EXPORT_ID/downloadSize the audience first. A search with count=true and limit=1 is free. Contact columns need a key with the enrich scope. Keys on the Free plan get both scopes, search and enrich, inside the 1,000 one-off records.
Field mapping
The CSV header is the column id. Map these into your target node. Column ids come from GET /v1/exports/columns, which needs no key.
| LeadOcean field | Target field | Note |
|---|---|---|
profile_first_name | First name | Empty if the profile has no split name. |
profile_last_name | Last name | |
profile_full_name | Full name | Use when the target has one name field. |
email_1_address | Best address first. | |
email_1_status | Email status | verified, catch_all_valid or catch_all. Filter on it before sending. |
current_job_title | Job title | |
current_company_name | Company | |
current_company_domain | Company domain | Good dedupe key for CRM upserts. |
profile_url | LinkedIn URL | Pass to POST /v1/people/enrich for a single-person lookup. |
person_id | External ID | Stable across exports. Add it to the columns list. |
Cost at 10,000 rows
The short version: LeadOcean charges by plan, n8n charges by workflow run, and the two do not multiply.
A 10,000-row export costs 10,000 records on LeadOcean, and Pro covers that for $499 a month flat. The Free plan has 1,000 records, one-off, so it runs a 1,000-row test of the same workflow.
| LeadOcean | n8n | |
|---|---|---|
| Free plan | 1,000 rows, then stop. No card. | Community Edition is free to self-host. |
| 10,000 rows, one run | Pro, $499 a month. No per-record price, no overage invoice. | One workflow run is one execution, whatever the row count. |
| n8n Cloud | Starter €20 a month for 2.5K executions, Pro €50 for 10K, billed annually. |
n8n counts "a single run of your entire workflow" as one execution. Step and row counts do not change that (source: https://n8n.io/pricing/, checked September 2026). So the export workflow above adds one execution per run. Your 10,000 rows cost you LeadOcean's flat fee plus the plan you already pay n8n.
Troubleshooting
| Symptom | Cause | Fix |
|---|---|---|
| 402 on create | Fewer records left than limit reserves. | Lower limit, or move to Pro. |
| 403 on create | Contact columns asked without the enrich scope. | Use a key with that scope, or drop the email columns. |
400 export_limit_rows | limit is over 50,000. | Split into several exports. |
429 export_limit_daily or export_limit_monthly | Account export ceiling reached. | Wait for resetsAt in the response. |
| 409 on download | The export is still running. | Loop through the If node until data.status is done. |
| 410 on download | The file expired after 7 days. | Create the export again. |
| Extract From File returns nothing | The download node did not return a file. | Set Response Format to File on the download node. |
| New export sits queued | One export runs per account at a time. | Wait for the earlier one to finish. |
FAQ
Should I use the HTTP Request node or the MCP Client Tool?
Use HTTP Request for scheduled, repeatable pulls. Use the MCP Client Tool when an agent decides the filters at run time. The agent route spends records per tool call, for example one per person from search_leads.
Can I page through search results instead of exporting?
Yes. GET /v1/people/search and POST /v1/people/search return up to 100 people per page with meta.nextCursor. The HTTP Request node has a pagination option that updates a parameter on each request, and it can read the previous response. Exports suit large pulls better.
Does the free plan work with n8n?
Yes, the same API and MCP server as Pro, with 1,000 records one-off and no card. That is enough to run this workflow on a small filter and check the field mapping.
Where do I find a phone number?
Phone lookup is GET /v2/people/phone, one person per call. Wire it as a fourth HTTP Request node after the If node if you need numbers for a short list. Read the MCP setup page for the agent route and the n8n and Attio stack guide for a full outbound build. Plans are on the pricing page, and more recipes sit in the integrations hub.
Run your first n8n export on the free plan
Free to start. No credit card. 1,000 records to spend whenever you like.
Get your free API key →