A sequencer sends your emails on a schedule. It does not find the people or check the addresses. So the work that decides your result happens before the sequencer: the list. This guide builds that list from the LeadOcean API and hands it to any sequencer that imports CSV or takes rows over an API.
TL;DR
- Five steps: size the audience (free), export mailable work emails, check the file, import to the sequencer, send a small batch first.
- Time: about 45 minutes for a 500-lead pilot. Most of it is sequencer setup, not data.
- Records: 500 on the export. Sizing and the sequencer dry run spend none.
Prerequisites
- A LeadOcean key in
$LEADOCEAN_API_KEY. Start free at app.leadocean.io/register: 1,000 records, no card. - Bulk CSV export is not on Free. The export in step 2 needs Solo ($97 a month) or higher. On Free, pull a smaller list with
POST /v1/people/search(25 people a page) instead. - A sending domain with SPF, DKIM and DMARC set, and a warmed mailbox. This is your sequencer's job, not ours.
- A sequencer that imports CSV or has an API for leads. The ReachHQ import recipe shows one API path end to end.
curlandjq.
Step 1: Size the audience for free
Count before you pull. A count spends no records. Send count=true as a query parameter (not in the JSON body, which rejects unknown fields) and "limit": 1 in the body. meta.total is capped at 100,000.
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"],
"emailStatus": ["verified", "catch_all_valid"],
"emailType": ["work"],
"limit": 1
}' | jq '.meta | {total, totalIsExact, distinctCompanies}'The same count runs from an AI client through the free leadocean_count_leads MCP tool. Enum values are exact strings: VP, not vp. Check them with leadocean_list_enum_values.
Step 2: Export only mailable addresses
Export with emailStatus set to verified and catch_all_valid. Several values inside one filter join with OR. Start with 500 rows, not the full list.
curl -s -X POST https://api.leadocean.io/v1/exports \
-H "x-api-key: $LEADOCEAN_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"name": "pilot VP sales CA",
"filters": {
"jobLevel": ["VP"],
"jobFunction": ["Sales & Business Development"],
"country": ["CA"],
"emailStatus": ["verified", "catch_all_valid"],
"emailType": ["work"]
},
"limit": 500,
"columns": ["profile_first_name","profile_last_name","current_job_title",
"current_company_name","current_company_domain","email_N_address","email_N_status"],
"caps": {"emails": 1}
}'
curl -s -H "x-api-key: $LEADOCEAN_API_KEY" https://api.leadocean.io/v1/exports/EXPORT_ID
curl -s -H "x-api-key: $LEADOCEAN_API_KEY" -o pilot.csv https://api.leadocean.io/v1/exports/EXPORT_ID/downloadAn export takes up to 50,000 rows a request and 500,000 a day. With caps set to one email, the CSV headers come back as email_1_address and email_1_status. You can also build the same export on the Exports page of the app, which shows the record price before you start.
Step 3: Check the file before you import it
Spend two minutes on the CSV. Three checks catch most of what goes wrong, and none of them costs a record.
echo "rows, then rows with an email"
wc -l pilot.csv
awk -F, 'NR>1 && $6 != ""' pilot.csv | wc -l
echo "duplicate addresses"
cut -d, -f6 pilot.csv | sort | uniq -d
echo "status mix"
cut -d, -f7 pilot.csv | sort | uniq -cColumn numbers match the column order in step 2. The cut checks assume no commas inside fields; open the file in a spreadsheet if a title holds one. Remove duplicates by hand, and compare the status mix with the filter you asked for. Anything outside verified and catch_all_valid means the export filters were not what you meant. Also drop anyone you have already emailed or who sits on your suppression list. LeadOcean does not know your history.
Step 4: Import to the sequencer and map fields
Map four columns and nothing more: first name, company, title and email. Every extra merge field is one more way to send "Hi {{firstName}}" with the braces showing.
CSV column Sequencer field
profile_first_name -> first_name
current_company_name -> company
current_job_title -> title
email_1_address -> emailDrop any row where email_1_status is empty. Keep the status column out of the sequencer, but keep the file: it is your audit trail if a batch bounces.
Step 5: Send small, then gate the rest
Send the first 50 over two days. Read bounces before you load the other 450. LeadOcean gives no refund or credit-back for bounced emails, so the status filter is your only protection.
Campaign settings (names vary by sequencer)
daily limit per mailbox: 30
steps: 3 emails, gaps of 3 and 5 days
stop on: reply, bounce, unsubscribe
launch: after a test send to your own inboxRule of thumb from this guide, not a vendor limit: if more than 2 in 100 of the first batch bounce, pause and re-check the list before sending more.
What you get
The count from step 1, run with the free leadocean_count_leads MCP tool on 2026-10-21:
{
"total": 1602,
"totalIsExact": true,
"distinctCompanies": 1209,
"credits": 0
}That is people with a verified or catch_all_valid work email, VP level, Sales & Business Development, in Canada. It is a count of those filters, not a promise that every address is deliverable.
An export row, response shape from the API reference with placeholder values:
profile_first_name,profile_last_name,current_job_title,current_company_name,current_company_domain,email_1_address,email_1_status
Jane,Doe,VP Sales,Acme,acme.com,jane.doe@acme.com,verifiedTroubleshooting
| Error | Cause | Fix |
|---|---|---|
| 401 | Missing or wrong x-api-key header | Copy the key again from app.leadocean.io and check $LEADOCEAN_API_KEY is exported. |
| 429 | Above the plan's rate limit: 5 a second on Free, 200 on Agency | Read Retry-After, slow the loop, or move to a higher plan. |
| 402 | Records spent | Free is 1,000 records for life. Upgrade on pricing. |
| Zero results | Enum value spelled wrong, such as vp for VP | List valid values with leadocean_list_enum_values or GET /v1/enums. |
| Export refused | Over 50,000 rows a request or 500,000 a day, or on Free | Split the export by country, or use a paid plan. |
FAQ
Does a sequencer find email addresses?
No. A sequencer sends and schedules. You bring the list, so get it from an email source with a status field, and keep only mailable rows.
How many emails should I send a day?
Start at 30 a mailbox a day, as in step 5. That figure is a conservative starting point from this guide, not a rule from any sequencer.
Can I do this on the free plan?
Partly. Sizing and search work on Free, inside the 1,000 one-off records. Bulk CSV export is not on Free, so a Free pilot means a few dozen rows by hand.
What if an address bounces?
Check email_status first. LeadOcean does not refund bounces, so exclude risky, unknown and catch_all from a first send. See how to find business email addresses and the best email finder for outreach. For tool choice, read cold email software for B2B sales.
Build your first outreach list free
Free to start. No credit card. 1,000 records to spend whenever you like.
Get your free API key →