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

Integrations

LeadOcean + Smartlead: Export, Split by Email Status, Push to Campaigns

Filter people in LeadOcean, export one CSV per email status, and load each into its own Smartlead campaign so catch-all addresses never share a sequence with verified ones.

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

You get a repeatable pipeline. Search people in LeadOcean, export two CSVs by email status, and load each into its own Smartlead campaign over the API. Verified addresses go to your main sequence. Catch-all addresses go to a separate campaign, so one risky domain cannot drag down a clean send.

Use this when your cold email team wants the list decided before the first send. LeadOcean returns an email_status for every address. Smartlead then runs each group with its own mailboxes, schedule and reporting.

Related: the integrations hub, Salesloft, Reply.io, Outreach and pricing.

How it works

Two exports, one script, two campaigns. You build it once and rerun it for each new filter. Smartlead takes up to 400 leads per request (Smartlead Add Leads to Campaign, September 2026).

  1. Get keys. Create a LeadOcean key at app.leadocean.io and copy your Smartlead API key. Free LeadOcean keys get search and enrich scopes.
  2. Size the list. A search with count=true and limit=1 is free. Check the total before you spend records.
  3. Export verified. Create an export with emailStatus set to verified.
  4. Export catch-all. Run the same filters with emailStatus set to catch_all_valid and catch_all.
  5. Create two campaigns in Smartlead and note each campaign id from the URL.
  6. Run the script below once per file. It posts leads in batches of 400.
  7. Start the verified campaign first. Run the catch-all campaign small, then read its bounce rate before you scale it. Smartlead shows bounces per campaign, so the two groups never blur together.

Keep the files separate from the start. A merged file means filtering on email_status again, and that is how a catch-all address ends up in the main sequence by mistake.

Bulk CSV export is not on the Free plan. On Free, call search, then enrich each person with reveal_email set to true to get the address.

Configuration

The export request. Several values inside one filter join with OR.

bash
curl -X POST https://api.leadocean.io/v1/exports \
  -H "x-api-key: $LEADOCEAN_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"name":"smartlead verified","filters":{"jobLevel":["VP"],"jobFunction":["Sales & Business Development"],"country":["CA"],"emailStatus":["verified"],"emailType":["work"]},"limit":1000,"columns":["person_id","profile_first_name","profile_last_name","profile_url","current_job_title","current_company_name","email_N_address","email_N_status"]}'

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 verified.csv https://api.leadocean.io/v1/exports/EXPORT_ID/download

For the second file, set emailStatus to ["catch_all_valid","catch_all"] and the name to smartlead catch-all. The load script is ours. The 400-lead batch is Smartlead's documented maximum.

python
import csv, os, sys, requests

CAMPAIGN_ID = int(sys.argv[2])
URL = f"https://server.smartlead.ai/api/v1/campaigns/{CAMPAIGN_ID}/leads"
PARAMS = {"api_key": os.environ["SMARTLEAD_API_KEY"]}

leads = []
for r in csv.DictReader(open(sys.argv[1])):
    if not r["email_1_address"]:
        continue  # email is the only required field
    leads.append({
        "email": r["email_1_address"],
        "first_name": r["profile_first_name"],
        "last_name": r["profile_last_name"],
        "company_name": r["current_company_name"],
        "linkedin_profile": r["profile_url"],
        "custom_fields": {
            "job_title": r["current_job_title"],
            "email_status": r["email_1_status"],
            "leadocean_id": r["person_id"],
        },
    })

for i in range(0, len(leads), 400):
    body = {"lead_list": leads[i:i+400]}
    print(requests.post(URL, params=PARAMS, json=body).json())

Run python load.py verified.csv 123 where 123 is the campaign id. Smartlead reads the key from an api_key query parameter, so keep the script out of shared logs.

Field mapping

Smartlead requires email. Every other field is optional (Smartlead docs, September 2026). Custom fields take up to 200 key-value pairs per lead.

LeadOcean fieldTarget field (Smartlead)Note
email_1_addressemailRows with no email are skipped.
profile_first_namefirst_nameMerge field for the first step.
profile_last_namelast_name
current_company_namecompany_name
profile_urllinkedin_profileOptional.
current_job_titlecustom_fields.job_titleFree text, good for personalization.
email_1_statuscustom_fields.email_statusLets you re-split inside Smartlead later.
person_idcustom_fields.leadocean_idLets you re-match a lead to LeadOcean.

Column ids come from GET /v1/exports/columns. Email status has 13 values. risky, unknown and invalid stay out of both files.

Cost at 10,000 rows

For 10,000 rows, LeadOcean costs Solo at $97 a month, or Agency at $497 a month for teams. Smartlead sells plans by contacts stored and emails sent. Base lists 2,000 contacts and has no API, so this recipe needs Pro at $94 a month, or $78.30 a month billed yearly. Pro lists 30,000 contacts, 90,000 sends, and API and webhooks (Smartlead pricing, October 2026).

ItemLeadOcean FreeSolo or Agency
Records1,000 for life, one-offFair-use pace, no per-record price
Bulk CSV exportNot includedSolo included, Agency 50k rows a file
Smartlead planPro, for the APIPro, for the API and 30,000 contacts
10,000 rowsCovers 1,000Covers all 10,000

An export reserves records up to limit and bills one record per row written. There are no credits and no overage invoice. Mailboxes and sending domains are extra on the Smartlead side. Its pricing page lists them as add-ons, so budget for them before you load 10,000 leads.

The cheapest LeadOcean test is the Free plan. Pull up to 1,000 people through search and enrich, load them into one campaign, and read the reply and bounce numbers before you pay for LeadOcean.

Troubleshooting

SymptomCauseFix
skipped_count above zeroDuplicate, blocked or unsubscribed leads.Read skipped_leads for the reason.
422 from SmartleadBad email format in a row.Drop rows where email_1_address has no @.
401 from SmartleadWrong or missing api_key.Check the query parameter.
404 from SmartleadWrong campaign id or no access.Copy the id from the campaign URL.
Lead missing from the second campaignSmartlead skips a lead already in another campaign by default.Set ignore_duplicate_leads_in_other_campaign only if you mean it.
402 on export createFewer records left than limit reserves.Lower limit or upgrade.
429 from SmartleadOver 60 requests a minute on the standard tier, or 120 on the Pro tier, for one key (Smartlead rate limits).Back off and retry. 25 batches of 400 cover 10,000 leads.

FAQ

Why a separate campaign for catch-all?

Catch-all domains accept every address, so a send can still bounce. LeadOcean gives no refund for bounces, so read email_status before sending. A small campaign shows how those domains behave before you commit the list. If the bounce rate stays low after a week, scale it. If not, drop the group and keep the verified campaign clean.

Can I call Smartlead per lead instead of using a CSV?

Yes. Run a LeadOcean search, enrich each person with reveal_email set to true, then post the leads to the same endpoint. Search pages hold up to 100 rows, so one Smartlead request can take four pages of leads.

Does Smartlead verify emails too?

Its pricing page lists verified prospect emails per plan, an add-on on Base and Pro. LeadOcean already returns a status on each address, so you can check that before you spend Smartlead verification on the same list.

Can I use the MCP server instead of the API?

Yes. LeadOcean's MCP server at https://api.leadocean.io/mcp has an export_leads tool that costs one record per row. Use it to build the files, then run the same load script. The MCP sign-in is OAuth, so no key is pasted into the client.

Export your first Smartlead list from LeadOcean

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

Get your free API key →