Warming up means raising daily send volume in small steps while bounces and complaints stay flat. This plan takes 14 days. The part most guides skip is what you send to, so this one includes the list query.
A new mailbox has no history. Providers judge it on the first few hundred messages, so those messages decide where you land. Bounces to dead addresses are the fastest way to look like a spammer. A verified list removes that risk before it starts.
TL;DR
- Ramp from 5 sends a day to 40 over 14 days, and move up only when the gate for that day is clean.
- Fill the ramp with verified addresses only. That keeps the bounce rate near zero in the days that set your reputation.
- Setup takes about 20 minutes. The whole ramp spends up to 570 records (300 search rows, 270 enrichments), which fits inside the 1,000 on the Free plan.
Prerequisites
Set these up before day one. Skipping authentication wastes the whole ramp.
- A mailbox on a domain with SPF, DKIM and DMARC published. Google requires SPF or DKIM from all senders, and all three from bulk senders of 5,000 or more messages a day (Google email sender guidelines, October 2026).
- A LeadOcean API key from the free plan, stored as
$LEADOCEAN_API_KEY. curlandjq.- A way to see bounces and spam complaints: your mail provider's admin console or Google Postmaster Tools.
LeadOcean supplies the people. It does not send mail. You send from your own mailbox or sequencer.
Step 1: Size the verified list for free
Count first, because a count spends no records. Ask only for verified addresses, since a bounce in week one does the most damage.
curl -s -G "https://api.leadocean.io/v1/people/search" \
-H "x-api-key: $LEADOCEAN_API_KEY" \
--data-urlencode "count=true" \
--data-urlencode "limit=1" \
--data-urlencode "jobLevel=VP" \
--data-urlencode "jobFunction=Sales & Business Development" \
--data-urlencode "country=US" \
--data-urlencode "emailStatus=verified" | jq '.meta'The count flag goes in the query string, not the JSON body. meta.total is capped at 100,000.
Step 2: Pull 300 verified contacts
Pull about 300 records, enough for the whole ramp. The body is flat JSON and every filter is an array.
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": ["US"],
"emailStatus": ["verified"],
"limit": 100
}' > page1.json
jq '.meta' page1.jsonEach person returned costs one record. Repeat with the cursor from meta to get pages 2 and 3. Enum values are exact strings. If a value fails, check it with leadocean_list_enum_values in the MCP server or GET /v1/enums.
Step 3: Split the list by day
Day one is not the day to send to strangers at volume. Open the ramp with a few messages to people who know you, then bring in the pulled contacts as the numbers rise.
Cut the list into daily batches that match the ramp below. Keep each batch small and never reuse a contact.
| Days | Sends per day | Gate before the next step |
|---|---|---|
| 1 to 3 | 5 | No bounces, no delays |
| 4 to 6 | 10 | Bounce rate under 2%, zero complaints |
| 7 to 9 | 20 | Same, and replies are arriving |
| 10 to 12 | 30 | Same |
| 13 to 14 | 40 | Same, then hold for a week |
This is a conservative schedule, not a provider rule. Google's guidance is to start low, raise volume slowly, and watch your spam rate and domain reputation as you go (Google email sender guidelines, October 2026).
jq -r '.data[].meta.source_ids.person_id' page1.json | head -5The ramp adds up to 270 sends: 15 + 30 + 60 + 90 + 80. So 300 search rows leave 30 spare for replacing any address that bounces.
Step 4: Reveal emails only for today's batch
Do not reveal addresses you will not send this week. Enrich by person_id with reveal_email for the day's batch only.
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}'Enrich takes exactly one of linkedin_url, email, phone or person_id. Each enrichment is one record, and reveal_email costs no extra record. An enrichment that finds nothing returns a 404 and costs nothing. A search row marked verified is an upper bound, so read the status on the revealed address and skip anything not verified.
Step 5: Send one-to-one and check the gate
Send plain, short, personal mail. Mix in replies from people you already know, because replies are the strongest signal a new address can earn. At the end of each stage, read your bounce and complaint numbers before raising the volume.
Gate check, end of day 6
- Sent so far: 45
- Hard bounces: 0
- Spam complaints: 0
- Action: step up to 20 a dayIf a gate fails, hold the volume for two days or step back one stage. Do not skip ahead to catch up.
Keep the daily rhythm steady. Send at similar hours each day, on weekdays, and keep a floor of volume after day 14. A mailbox that goes quiet for weeks loses the pattern you just built.
After day 14, add volume the same way: raise the total in steps and keep the gate. Cold sequences come last, once the address has sent steadily with low bounces and a few real replies.
Step 6: Keep the list clean as you scale
After day 14, the same discipline applies at every new step. Re-run the Step 1 count with a wider filter, check the total, then pull the next batch. Never send to an address you pulled months ago without checking its status again, because people change jobs and mailboxes close.
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": ["Director"], "country": ["US"], "emailStatus": ["verified"], "limit": 50}' | jq '.meta'For a few thousand rows, use the Exports page in the app at app.leadocean.io. It has a filter builder, a column picker, the record price before you start and a CSV download. Bulk CSV export is not on the Free plan.
If you are weighing mailbox count against volume, spread sends across several mailboxes on the same domain rather than pushing one past 40 a day. Each mailbox needs its own 14-day ramp. Do not copy one mailbox's schedule onto five at once.
What you get
The Step 1 count against the live index on 2026-10-21, from the free leadocean_count_leads MCP tool:
filters: jobLevel VP, jobFunction Sales & Business Development, country US
emailStatus verified: 31,141 people (18,563 companies)
default mailable (verified,
catch_all_valid, catch_all): 129,494 people
no email condition: 350,517 peopleVerified alone leaves plenty to fill a 300-record ramp. The record-level response from Step 2 has this shape (response shape from the API reference, placeholder values).
{
"success": true,
"data": [
{
"profile_data": { "profile_full_name": "Jane Doe" },
"contact_data": {
"has_email": true,
"email_status": "verified",
"contact_current_experiences": [
{ "job_title": "VP Sales", "company_name": "Acme", "company_domain": "acme.com" }
]
},
"meta": { "source_ids": { "person_id": "1234567890" } }
}
],
"meta": { "limit": 100, "nextCursor": "..." }
}Troubleshooting
| Error | Cause | Fix |
|---|---|---|
| 401 | Missing or wrong x-api-key | Re-copy the key from app.leadocean.io and export $LEADOCEAN_API_KEY |
| 429 | Above the plan's rate limit (5 a second on Free, 200 on Agency) | Honor Retry-After and slow the loop |
| 402 | Out of records on the Free plan | Check GET /v1/account, or move to Solo at $97 a month |
Empty data | A filter value is not an exact enum string | Look it up with GET /v1/enums or leadocean_list_enum_values |
| Count is 0 | Filters too narrow for verified only | Drop a filter before you widen emailStatus |
| Export refused | Over 50,000 rows a request or 500,000 a day | Split the export; bulk CSV is not on Free |
FAQ
How long does it take to warm up an email address?
This plan takes 14 days to reach 40 sends a day. See how long to warm up email for what changes at higher volume.
Do I need a warm-up tool?
No. The ramp above works without one. Tools that trade mail between mailboxes are covered in automated email warm-up.
Can I warm up a temporary email address?
No. A temporary email address is built to expire, so there is no reputation to build on it. Warm a mailbox on a domain you own.
Does LeadOcean send or warm up mail?
No. It has no sequencer and no sending. It supplies verified contacts, and email_status tells you which addresses to trust. It does not refund bounced emails, so read the status before you send.
What bounce rate is safe during warm-up?
Aim for as close to zero as you can. The 2% gate in the table is a ceiling for moving up, not a target. A verified-only list should sit well under it.
What does the list cost?
The Free plan includes 1,000 records for life, with no card. For larger lists, Solo is $97 a month and Agency is $497 a month. See pricing. For background on the wider topic, read domain warmup basics.
Fill your warm-up ramp with verified contacts
Free to start. No credit card. 1,000 records to spend whenever you like.
Get your free API key →