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

How-to guide

How to Warm Up an Email Address (14 Days, Day by Day)

A plain ramp for a new mailbox, plus the one query that keeps your first sends off the bounce list.

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

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.
  • curl and jq.
  • 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.

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

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": ["US"],
    "emailStatus": ["verified"],
    "limit": 100
  }' > page1.json
jq '.meta' page1.json

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

DaysSends per dayGate before the next step
1 to 35No bounces, no delays
4 to 610Bounce rate under 2%, zero complaints
7 to 920Same, and replies are arriving
10 to 1230Same
13 to 1440Same, 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).

bash
jq -r '.data[].meta.source_ids.person_id' page1.json | head -5

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

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}'

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.

text
Gate check, end of day 6
- Sent so far: 45
- Hard bounces: 0
- Spam complaints: 0
- Action: step up to 20 a day

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

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

text
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 people

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

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

ErrorCauseFix
401Missing or wrong x-api-keyRe-copy the key from app.leadocean.io and export $LEADOCEAN_API_KEY
429Above the plan's rate limit (5 a second on Free, 200 on Agency)Honor Retry-After and slow the loop
402Out of records on the Free planCheck GET /v1/account, or move to Solo at $97 a month
Empty dataA filter value is not an exact enum stringLook it up with GET /v1/enums or leadocean_list_enum_values
Count is 0Filters too narrow for verified onlyDrop a filter before you widen emailStatus
Export refusedOver 50,000 rows a request or 500,000 a daySplit 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 →