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

Integration recipe

LeadOcean + lemlist: replace bounced emails with current ones

A lemlist webhook catches the bounce, LeadOcean returns the person's current work email, and the lead goes back into the campaign.

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

You get a small loop that cuts repeat bounces. When lemlist reports a bounce, your endpoint asks LeadOcean for that person's current work email and re-adds them to the same campaign. When a bounce follows a job change, the new address is at the new company. No loop reaches zero bounces on its own. This one stops you from sending to the same dead address twice. Read why emails bounce first if hard bounces are new to you.

How it works

lemlist posts an emailsBounced event to a URL you register (lemlist Add Webhook, September 2026). FullEnrich's template does the same with a Zapier trigger (FullEnrich, September 2026). This recipe uses a script you host, so you control which status gets through.

  1. Get both keys. Copy a LeadOcean key from the app. In lemlist, open Settings, then Integrations, and generate an API key.
  2. Register the webhook. POST to lemlist with type set to emailsBounced and your endpoint as targetUrl. Add a secret so you can check the call came from lemlist.
  3. Receive the bounce. The payload carries campaignId, email, firstName, lastName, linkedinUrl and the to list.
  4. Ask LeadOcean. Call POST /v1/people/enrich with linkedin_url if the lead has one, else with the bounced email. Set reveal_email to true (LeadOcean docs, September 2026).
  5. Pick the address. Keep an email of type work with status verified. Skip catch_all for this loop and skip anything equal to the bounced address.
  6. Re-add the lead. POST the new address to the same lemlist campaign.

A 404 from LeadOcean means it holds nothing for that person. It costs nothing. Drop the row and log it.

Configuration

Step 2, register the webhook. lemlist uses Basic auth with an empty username and the key as the password.

bash
curl -X POST https://api.lemlist.com/api/hooks \
  -u ":$LEMLIST_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"targetUrl":"https://hooks.example.com/lemlist-bounce","type":"emailsBounced","secret":"CHANGE_ME"}'

Step 4, the lookup your endpoint runs. Use placeholders to test it.

bash
curl -X POST https://api.leadocean.io/v1/people/enrich \
  -H "x-api-key: $LEADOCEAN_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"linkedin_url":"https://www.linkedin.com/in/jane-doe","reveal_email":true}'

Step 6, the re-add. POST /campaigns/{campaignId}/leads/ creates a lead and never updates one (lemlist Create Lead, September 2026).

bash
curl -X POST "https://api.lemlist.com/api/campaigns/$CAMPAIGN_ID/leads/" \
  -u ":$LEMLIST_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"email":"jane.doe@newco.example","firstName":"Jane","lastName":"Doe","companyName":"NewCo","jobTitle":"VP Sales","linkedinUrl":"https://www.linkedin.com/in/jane-doe","recoveredFrom":"jane.doe@acme.com"}'

Answer lemlist's webhook with a 200 fast, then run the lookup. A 404 or 410 from your endpoint disables the webhook (lemlist Add Webhook, September 2026).

Field mapping

LeadOcean fieldlemlist fieldNote
data.contact_data.contact_emails[].emailemailTake type work, status verified.
data.contact_data.contact_current_experiences[].company_namecompanyNameOften differs from the bounced domain.
data.contact_data.contact_current_experiences[].job_titlejobTitleRewrite the opener around it.
data.profile_data.profile_urllinkedinUrlLets you match the re-added lead to the bounced one in your own logs.
the bounced addresscustom recoveredFromAny extra key becomes a custom variable.

Cost at 10,000 rows

10,000 bounces cost LeadOcean at most 10,000 records. Free covers 1,000 for life, no card, at 5 requests a second. For 10,000 use Solo at $97 a month. Agency is $497 a month for teams. Paid plans run on a fair-use pace with no per-record price (pricing). Misses are free.

lemlist's Email plan is $69 a month, $55 billed yearly, with 50,000 emails a month and CRM integrations and API listed (lemlist pricing, October 2026). A 10,000-row run needs no lemlist credits because the email comes from LeadOcean. Your own endpoint is the other cost. The webhook is registered through that API (lemlist Add Webhook, September 2026).

Troubleshooting

SymptomCauseFix
Webhook stops firingYour endpoint answered 404 or 410lemlist disables it. Delete it and create a new one.
409 on webhook createThat targetUrl already existsRegister once without type and filter on your side.
400 LEAD_ALREADY_IN_CAMPAIGNThe contact already has a lead thereSkip, or PATCH the existing lead.
403 on re-addThe key's user cannot create contactsGrant the permission in lemlist.
404 from LeadOceanNothing held for that personFree. Drop the row.
429 from lemlistOver 20 requests in 2 secondsWait for Retry-After.

FAQ

Does this guarantee zero bounces?

No. It replaces addresses that already bounced. To avoid new ones, send only to verified and read hard bounce. LeadOcean gives no refund for bounces.

Will the new address always be at a new company?

Not always. Compare the new company with the bounced domain before you write the opener.

Do I need a card to try it?

No. The free plan needs no card and gives 1,000 records for life.

Is it legal to re-contact the person?

That depends on your basis. Read legitimate interest for B2B. Never re-add anyone who unsubscribed.

Back to all integrations. The lemlist overlap with a status-split flow is on the lemlist page.

Stop re-sending to dead addresses. Start free.

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

Get your free API key →