You get a Make scenario that watches a Google Sheet, sends each new LinkedIn URL to LeadOcean through Make's HTTP module, and writes the work email, phone and job title back to the same row. It needs no code and no extra app. LeadOcean is a plain REST API, so Make's generic HTTP module is all you need. The free plan has a key for this recipe, with 1,000 records to spend.
Related: the LeadOcean integrations hub, the pricing page, and a guide on when cold email makes sense in a GTM strategy.
How it works
The scenario has three modules: Google Sheets "Watch New Rows", HTTP "Make a request", Google Sheets "Update a Row". Each new row costs two Make operations.
- Get a LeadOcean key. Sign up at app.leadocean.io, open the API keys page and copy a key. The free plan needs a work email and no card.
- Prepare the sheet. Put headers in row 1. Use
linkedin_urlin column A, then empty columnsemail,email_status,phone,name,headline. - Add the trigger. In Make, create a scenario and add Google Sheets "Watch New Rows". Set the Spreadsheet ID, the Sheet Name and "Table contains headers" to Yes. Make says the trigger skips processing when blank rows exist, so keep the data contiguous.
- Add the HTTP module. Add HTTP "Make a request". Set the URL, method and body from the configuration below. Turn on "Parse response".
- Run it once. Click "Run once" with a test row. Make only exposes the mappable response items after the module has run once.
- Write the result back. Add Google Sheets "Update a Row". Use the row number from step 3, then map the response fields using the table below.
- Turn the scenario on and set the schedule.
Make's own docs say to put API credentials in the module's Credentials field, not in headers or query strings. Follow that for the key.
Configuration
These are the HTTP module settings. The curl command below is the same request, so you can test the key before you build anything.
| HTTP module field | Value |
|---|---|
| URL | https://api.leadocean.io/v1/people/enrich |
| Method | POST |
| Authentication | API key, sent as the x-api-key header |
| Body content type | JSON |
| Request content | {"linkedin_url": "{{1.linkedin_url}}", "reveal_email": true} |
| Parse response | Yes |
Here 1 is the module number of the Watch New Rows trigger. Yours may differ.
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}'Send exactly one identifier per call: linkedin_url, email, phone or person_id. Two identifiers return a 400. reveal_email: true adds every email and phone number LeadOcean holds and costs no extra record.
Field mapping
The response has success, data and meta. The fields you want sit under data. Emails and phones are arrays, so map the first item.
| LeadOcean field | Target field (sheet column) | Note |
|---|---|---|
data.contact_data.contact_emails[1].email | email | Present only with reveal_email: true. |
data.contact_data.contact_emails[1].status | email_status | Filter on verified before you send mail. |
data.contact_data.contact_phones[1].phone | phone | Present only with reveal_email: true. |
data.profile_data.profile_full_name | name | Full name as one string. |
data.profile_data.profile_headline | headline | Free text, not a normalised title. |
data.contact_data.has_email | optional flag | Answered even without reveal_email. |
meta.credits | optional cost column | Records billed for this call. |
Make arrays are 1-indexed, so [1] is the first item. Email status has 13 values. Treat anything other than verified and catch_all_valid as unsent until you review it.
Cost at 10,000 rows
For 10,000 rows, Make needs about 20,000 credits and LeadOcean needs Pro at $499 flat. Make bills one credit per module run, and the trigger counts as one operation per check. (Source: Make operations docs, September 2026.)
| Item | Free LeadOcean + Make Free | Pro + Make paid plan |
|---|---|---|
| LeadOcean | 1,000 records, one-off | $499 a month, flat |
| Make credits used | 2 per row, plus trigger checks | 2 per row, plus trigger checks |
| Make plan needed | Free plan has 1,000 credits a month | Core, Pro and Teams each list 10,000 credits a month from $9, $16 and $29 |
| 10,000 rows | Covers about 500 rows of Make credits | Not published here. Make's pricing page blocks automated reading, so see its pricing page for the 20,000+ credit price. |
Make figures come from the Make pricing page, checked September 2026. The $9, $16 and $29 prices start at 10,000 credits, so a 20,000 credit month costs more than that.
Rows with no match cost LeadOcean nothing: a person we hold nothing for is a 404 and is not billed. So the Pro price is a ceiling. On the free plan, 1,000 hits cover a one-off clean of a 1,000-row sheet, which is the best way to test the recipe first.
LeadOcean has no per-record price, no credits and no overage invoice. A very large month is paced down to one request a minute until the reset, rather than cut off.
Troubleshooting
| Symptom | Cause | Fix |
|---|---|---|
| Scenario stops on some rows | LeadOcean returned 404 because it holds no record for that person. | Add an error handler with Ignore or Resume so the run continues. Make's error handlers do not consume credits. The HTTP module also has a "Return error if HTTP request fails" option that stops the scenario on a 4xx or 5xx response. Its default is not stated in the docs, so check that setting in the module (Make HTTP docs, October 2026). |
| 400 from LeadOcean | The body held more than one identifier, or none. | Send only linkedin_url or only email. |
| 401 or key rejected | The key is missing or sits in the wrong field. | Put the key in Make's Credentials field with header name x-api-key. |
| Response fields are not offered in the mapper | The module has not run yet. | Run the module once with "Run once", then reopen the Update a Row mapping. |
Email column empty but has_email is true | reveal_email was false. | Set "reveal_email": true in the body. It costs no extra record. |
| Watch New Rows skips data | The trigger skips processing when blank rows exist. | Remove blank rows inside the data range. |
| Wrong row updated | The row number was mapped from the wrong module. | Map it from the Watch New Rows trigger, not from the HTTP module. |
FAQ
Can Make call LeadOcean without a custom app?
Yes. LeadOcean is a REST API with an x-api-key header, and Make's HTTP "Make a request" module supports POST, JSON bodies and API key authentication. The Make docs list the same options: methods, headers, query parameters and body types.
Does a call cost a record if it finds nothing?
On POST /v1/people/enrich, no. A person LeadOcean holds nothing for returns a 404 and costs nothing. Note the v2 contact endpoints differ: each call costs one record, including one that finds nothing.
Can I find phones separately?
Yes. GET /v2/people/phone returns numbers on their own, and each call costs one record. Add a second HTTP module for it, or use reveal_email on the enrich call to get phones already held on the record.
What if I want exports instead of a scenario?
For a one-off list, use the Exports page in the LeadOcean app at app.leadocean.io. It has a filter builder, a column picker, the record price before you start, and a CSV download. Then upload the CSV to Google Sheets and run this scenario on the gaps.
Enrich your first Make rows with a free LeadOcean key
Free to start. No credit card. 1,000 records to spend whenever you like.
Get your free API key →