Zapier integration

LeadOcean + Zapier: enrich new contacts with one webhook step

A Zap that calls the LeadOcean API on every new HubSpot contact or sheet row and writes the work email, phone and job title back.

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

You get a Zap that fires on a new HubSpot contact or Google Sheets row. It sends the email or LinkedIn URL to LeadOcean and writes the work email, phone and job title back. It uses one Webhooks by Zapier step, not a native app. LeadOcean has no Zapier listing, so the call is a plain HTTP request to https://api.leadocean.io.

How it works

The Zap has three steps: a trigger, a Custom Request to LeadOcean, and an update. Webhooks by Zapier is not on Zapier's Free plan. You need Professional, Team or Enterprise (Zapier help, September 2026).

  1. Create a LeadOcean key. Sign up at app.leadocean.io/register. The free plan needs a work email and no card.
  2. Add the trigger. Pick HubSpot "New Contact" or Google Sheets "New Spreadsheet Row". Both exist in Zapier's app directory (HubSpot, Google Sheets, September 2026). Triggers do not use tasks.
  3. Add a Filter step. Continue only if the contact email is not empty. Filter steps do not use tasks (Zapier help, September 2026).
  4. Add Webhooks by Zapier, event Custom Request. Set method POST, the enrich URL, the JSON body and two headers. Zapier describes Custom Request as very flexible but unforgiving, and it takes raw JSON in the Data field (Zapier apps, September 2026).
  5. Add the update step. Use HubSpot "Update Contact" or Google Sheets "Update Spreadsheet Row". Map the LeadOcean response fields into it (see the table below).
  6. Test, then turn the Zap on. Test with one real contact. The test call spends one record from your free 1,000.

Zapier suits a trickle of new records. It is the wrong tool for a backfill. For a one-off pull of a whole list, use the Exports page in the LeadOcean app: build the filters, pick columns, see the record price, then download a CSV. POST /v1/exports takes up to 50,000 rows per request.

Configuration

Zapier stores the key in the step itself, so paste the value of $LEADOCEAN_API_KEY into the header field. Do not share the Zap with people who should not see the key.

Zapier fieldValue
MethodPOST
URLhttps://api.leadocean.io/v1/people/enrich
Datathe JSON body below, with the email mapped from step 1
Headersx-api-key set to your key, content-type set to application/json
json
{
  "email": "<Email from the HubSpot or Sheets step>",
  "reveal_email": true
}

Send exactly one identifier per call. email, linkedin_url, phone or person_id all work, and sending two returns a 400 (LeadOcean docs, September 2026). Use linkedin_url when your rows have profile links instead of emails.

Test the same call outside Zapier first. If curl works and the Zap fails, the problem is in the step config, not the key:

bash
curl -X POST "https://api.leadocean.io/v1/people/enrich" \
  -H "x-api-key: $LEADOCEAN_API_KEY" \
  -H "content-type: application/json" \
  -d '{"email":"jane@example.com","reveal_email":true}'

reveal_email costs no extra record. Phone numbers only come back when it is true. Zapier caps an action payload at 5MB, which one person record never reaches (Zapier help, September 2026).

Field mapping

The response is one leadocean.person.v1 object with a data key (LeadOcean docs, September 2026). Zapier's help pages do not say how it labels nested response fields. Run the Test step and map from the field list it shows (Zapier help, October 2026).

LeadOcean fieldTarget fieldNote
contact_emails[].emailEmail (Sheets column or HubSpot email)Pick the entry whose type is work. Check status first.
contact_emails[].statusEmail status columnValues include verified, catch_all_valid and risky. Filter on it before sending mail.
contact_phones[].phonePhone NumberOnly present when reveal_email is true. type tells mobile from direct.
contact_current_experiences[].job_titleJob TitleCurrent role, not history.
contact_current_experiences[].company_nameCompany NameOverwrite only when HubSpot's is empty.
contact_current_experiences[].company_domainWebsite URLUseful for a follow-up company lookup.
profile_full_nameFull name columnSheets only. HubSpot already holds first and last name.
profile_headlineHeadline columnGood for routing rules in later steps.

Add a Filter step between the webhook and the update. Continue only when the email status is verified or catch_all_valid. Bad rows then never reach your CRM, and Filter steps use no tasks.

Cost at 10,000 rows

10,000 rows cost $499 on LeadOcean Pro plus $189 a month on Zapier Professional billed annually, or $688 in total. On monthly billing Zapier is $283.50, so $782.50.

LeadOceanZapier
PlanPro, $499 a month, flatProfessional, 20,000 tasks tier
What runs 10,000 rowsNo per-record price, no overage invoice2 action steps per row = 20,000 tasks
Monthly cost$499$189 billed annually, $283.50 billed monthly
Free optionFree: 1,000 records, one-off, no cardFree plan has no webhooks

The Zapier side comes from Zapier's own counting rules. Each successful action step is one task, and triggers and Filter steps are free (Zapier help, September 2026). The Custom Request and the update are two action steps, so 10,000 rows use 20,000 tasks. The 20,000-task Professional tier is $189 billed annually and $283.50 billed monthly (Zapier pricing, September 2026).

The first 1,000 rows can run on LeadOcean Free. Past that you need Pro. A person LeadOcean holds nothing for is a 404 and costs nothing. A Zap with a Filter step that skips empty emails also saves tasks on those rows.

See pricing for what Pro includes.

Troubleshooting

SymptomCauseFix
401 from the webhook stepKey missing, wrong or revokedRe-paste the key into the x-api-key header. No spaces around it.
400 from the webhook stepTwo identifiers sent, or invalid JSONSend one of email or linkedin_url. Check the mapped value is not empty.
402 from the webhook stepThe free 1,000 records are spentUpgrade to Pro. Free records do not renew.
404 from the webhook stepLeadOcean holds no record for that personNo charge. Zapier's help pages do not say whether a 404 halts the Zap. Test with an email LeadOcean does not hold, then decide whether the Zap should continue.
429 from the webhook stepOver the rate limitThe standard limit is 100 requests per second per key. Over quota it drops to one request a minute (LeadOcean docs, September 2026). Add a Delay step.
Error -2 in ZapierDomain lookup failedRemove extra spaces before or after the URL (Zapier help, September 2026).
Webhooks step missing on FreeFree plan has no webhooksMove to Professional or higher (Zapier pricing, September 2026).

FAQ

Does LeadOcean have a native Zapier app?

No. Use Webhooks by Zapier with the Custom Request event. It calls the LeadOcean REST API directly, so you get every endpoint, not a fixed list of actions.

Do I need a paid Zapier plan?

Yes. Webhooks by Zapier is not available on the Free plan, and Zapier lists it from Professional up (Zapier pricing, September 2026). Zapier's 100-task Free plan is enough to build the recipe but not to run it.

How do I get phone numbers through Zapier?

Set reveal_email to true and read contact_phones[].phone from the enrich response. You can also call GET /v2/people/phone in a second Custom Request step. That endpoint costs one record per call, including a call that finds nothing, and adds a task.

Can I use an API key in a Zap without exposing it?

Zapier keeps the header value in the step config. Anyone who can edit the Zap can read it. Create a dedicated LeadOcean key for Zapier, and revoke it from the app if the Zap is shared by mistake. Pro includes 5 API keys.

Build the Zap with a free LeadOcean key.

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

Get your free API key →