You get one Clay table. Each row holds a prospect, their career history, their company's profile and a drafted email that cites at least two of those. LeadOcean supplies the data. Clay's AI column writes the copy. Clay's public template page for this job shows only a title and a one-line description. This recipe builds the same idea from LeadOcean data you can inspect (Clay template, September 2026).
It fits teams that want one specific hook per email, not a mail merge. For the method behind the hooks, read how to write hyper-personalized cold emails.
How it works
- Create a LeadOcean key. Sign up at app.leadocean.io/register. The free plan gives 1,000 records, once, with no card.
- Add a Domain and a Title column. One company per row, with the website domain such as
acme.comand the job title you target. - Search for the person. An HTTP API column calls
POST /v1/people/searchwith the domain and title, limit 1, and returns the row'smeta.source_ids.person_id. - Enrich the person. A second column calls
POST /v1/people/enrichwith thatperson_id. The response carries current role andresume_data: past roles, education, certifications and awards where held. - Enrich the company. A third column calls
POST /v1/companies/enrichwith the domain. It returns the profile and the detected technologies. - Draft with one AI column. Pass the person's latest past role, one company fact and the job title. Tell it to use two of the three and to skip any that are empty.
- Run five rows first. Read every draft against its source fields before you run the rest.
Configuration
Clay's HTTP API column takes a method, URL, headers, a JSON body and field paths (Clay docs, September 2026). The search column looks like this. /Domain and /Title are Clay column references.
Method: POST
URL: https://api.leadocean.io/v1/people/search
Headers: x-api-key: <your LeadOcean key>
content-type: application/json
Body: {
"domain": ["/Domain"],
"title": ["/Title"],
"limit": 1
}
Field paths to return:
data.0.meta.source_ids.person_idTest the same three calls in a terminal first.
curl -X POST "https://api.leadocean.io/v1/people/search" \
-H "x-api-key: $LEADOCEAN_API_KEY" \
-H "content-type: application/json" \
-d '{"domain":["acme.com"],"title":["VP Sales"],"limit":1}'
curl -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 the search>"}'
curl -X POST "https://api.leadocean.io/v1/companies/enrich" \
-H "x-api-key: $LEADOCEAN_API_KEY" \
-H "content-type: application/json" \
-d '{"domain":"acme.com"}'Each search row carries its id at meta.source_ids.person_id (LeadOcean API, October 2026). Clay's docs show dot notation for field paths and no array index example, so test the data.0 path on one row before you run the table. Add an "Only run if" formula to the two enrich columns so they skip rows where the search came back empty.
Field mapping
| LeadOcean field | Clay column | Note |
|---|---|---|
data.0.meta.source_ids.person_id | Person ID | The only value you need from the search. |
contact_current_experiences | Current role | Holds the job title and start date. |
resume_data.experiences | Past roles | Title, company name, dates and level. Past employers have no company_id yet, so match by name. |
resume_data.educations | Education | Each field is present only when held. Handle blanks in the prompt. |
company_detected_technologies | Company stack | A list. Pass one or two items, not all. |
Cost at 10,000 rows
At 10,000 rows the recipe makes 30,000 HTTP calls: 10,000 searches, 10,000 person enrichments and 10,000 company enrichments. Each call returns one record, and a 404 costs nothing (LeadOcean pricing, October 2026).
LeadOcean. Free covers 1,000 records once, about 330 rows. Solo at $97 a month allows 50k enrichments a week and 500k search records a week, so the run fits in one week. Agency at $497 a month raises both and allows 5 keys.
Clay. The HTTP API column needs Growth or Enterprise, and each call uses one Action (Clay pricing, September 2026). Each AI run also uses one Action, plus Data Credits that vary by the model you pick, or none if you connect your own model key (Clay docs, October 2026). That is 40,000 Actions, the whole Growth entry tier at $495 a month billed monthly, $446 billed yearly (Clay pricing, September 2026). A rerun or retry pushes you to the 60,000 Action tier.
Cheaper path: run 1,000 rows first on the LeadOcean free plan.
Troubleshooting
| Symptom | Cause | Fix |
|---|---|---|
| HTTP API column missing | Free or Launch plan | HTTP API is Growth and Enterprise (Clay pricing, September 2026). Import a CSV from LeadOcean instead. |
| Search column is empty | No person held for that title at that domain | Expected. Widen the title or use jobLevel and jobFunction. |
resume_data is empty | No career history held for that person | Fall back to the company fact. Tell the prompt to skip blank fields. |
| Enrich returns 400 | More than one identifier sent | Send only person_id. |
| 429 on big runs | Over your plan's requests per second | Lower the column rate limit. Free allows 5 a second, Solo 50, Agency 200. |
FAQ
Does LeadOcean write the emails?
No. LeadOcean returns data. It has no sequencer or AI writer, so the drafting happens in Clay or in your own prompt.
Can I add website or press research?
Yes, from a Clay column or another source. See website-based personalization and press clips and job openings. LeadOcean supplies the people and company side.
Do I need Clay for this?
No. The same three requests run from a script or an agent over the 13-tool MCP server at https://api.leadocean.io/mcp.
Will these emails reach the inbox?
Only with clean sending. Request the work email with reveal_email and read email_status before you send. LeadOcean gives no refund for bounces.
Related: pricing. Back to all integrations.
Give every email two real hooks. Start free.
Free to start. No credit card. 1,000 records to spend whenever you like.
Get your free API key →