Claude books meetings when it writes from a real record. Give it a verified prospect list, a hard word limit and one offer. Everything below runs on the free plan.
TL;DR
- Four prompts: size the list, pull prospects, write the email, check the email. About 20 minutes end to end.
- Sizing is free. Pulling 25 prospects spends 25 of your 1,000 free LeadOcean records. A rewrite spends none.
- The difference is not clever wording. Claude gets title, company size and industry from the record, so it has nothing to invent.
Most Claude cold email prompts fail for one reason. They ask for "a compelling email to a VP of Sales" and supply nothing true. Claude fills the gap with plausible filler, and the buyer reads filler in one second.
The fix is plumbing, not phrasing. Put the real record in the context window, forbid everything outside it, and make the model check its own work.
Prerequisites
- A LeadOcean account on the free plan (1,000 records for life, no card). Create it at app.leadocean.io.
- Claude with the LeadOcean MCP server connected:
https://api.leadocean.io/mcp. Sign-in is OAuth, no key is pasted. Setup is on the MCP page. - Optional, for the script in Step 2: an API key from the app, exported as
$LEADOCEAN_API_KEY, andcurl. - One sentence about what you sell and one proof point you can defend.
Step 1: Size the list before you write a word
Check that the audience exists. A count is free, so run it as often as you like.
Count the mailable people with these filters. Do not search.
1. Call leadocean_list_enum_values for job_level, job_function,
employee_range and industry. Use the exact strings it returns.
2. Call leadocean_count_leads with jobLevel VP, jobFunction
Sales & Business Development, employeeRange 51-200,
industry Computer Software, country US.
3. Report total, totalAll and distinctCompanies. Say that total
counts only verified, catch_all_valid and catch_all addresses.Claude calls two free tools. If the number is under 100, widen one filter and count again. A list of 20 people cannot be tested.
The enum lookup matters. Job level is VP, not vp, and the department is Sales & Business Development. Industry has 534 values, so resolve it with the tool before you guess. A wrong string returns an empty list, and an empty list looks like a dead market.
Narrow before you widen. Add employeeRange first, then country. Each filter you add makes the later email more specific, because Claude can say something true about a 51-200 person software company.
Step 2: Pull a small batch
Pull 25, not 2,500. You want to read every row before you send anything.
curl -s 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"],
"employeeRange": ["51-200"],
"industry": ["Computer Software"],
"country": ["US"],
"limit": 25
}'The body is flat JSON and every filter is an array. limit runs from 1 to 100. Page with cursor when you need more. This call spends 25 records. Nothing is charged for a page that comes back empty.
With MCP connected, ask in one line: search with those filters, limit 25.
Step 3: Write the email from the record
Tell Claude what it may use. Tell it what to leave alone.
Write one cold email per person in the 25 rows above.
Rules:
- Use only these fields: first name, job title, company, headcount,
industry. Do not invent a project, a funding round or a quote.
- Under 70 words. Subject under 6 words, lowercase, no punctuation.
- Line 1: one fact about their role or company size. No flattery,
no "I hope this finds you well".
- Line 2: what I sell, in one sentence: {YOUR OFFER}.
- Line 3: one proof point: {YOUR PROOF}. If I gave none, skip it.
- End with one question that takes a yes or no.
- Plain text. No bullets, no bold, no emoji.Replace the two braces with your own sentence. Do not let Claude write the proof point. A made-up result is the fastest way to lose a reply.
Three rules do most of the work. The field whitelist stops invention. The word cap forces one idea. The yes-or-no question gives the reader a cheap way to answer.
Run the batch once, read five emails, then change the prompt and rerun. Rewrites cost no records, so tune the prompt on the same 25 rows instead of pulling new ones.
Length matters more than style. A short email fits a phone screen. Claude drifts long unless you set a number, so set one.
Ask for plain text. Bold, bullets and emoji make a message look like bulk mail.
Step 4: Make Claude audit its own drafts
A second pass catches the slop. Run it as a separate prompt so the first draft does not defend itself.
Review the 25 emails against these checks. Return a table with the
person, the failed check and a rewrite.
1. Any claim not present in the record fields.
2. Over 70 words.
3. Opens with the sender instead of the reader.
4. More than one ask.
5. Words a buyer would skim: "synergy", "solution", "streamline".
Rewrite only the failures. Leave passing emails unchanged.Keep the audit separate on purpose. A model that just wrote an email tends to approve it. A fresh prompt with a checklist behaves like an editor.
When the table comes back, spot check two rewrites by hand. If Claude flags a claim as unsupported, confirm it against the row before you accept the fix.
Step 5: Check the address, then send
Look at email_status on each row before anything leaves your outbox. Verified is safe to send. Catch-all is a judgment call. Anything marked risky, invalid or role should stay out of the batch.
LeadOcean does not send email. It has no sequencer, so paste the approved drafts into the tool you already use, such as your own mailbox or sequencer. Start with 25 sends, wait a week and count replies. Then pull the next 25.
What you get
This is a live count from the free leadocean_count_leads tool, run on 2026-10-21 with the filters from Step 1:
{
"total": 46,
"totalIsExact": true,
"totalAll": 163,
"distinctCompanies": 27,
"credits": 0,
"defaults": "Counted only addresses worth sending to (emailStatus: verified or catch_all_valid or catch_all)"
}Read it like this. 46 people have an address worth sending to. 163 match the filters with no email condition. Those 46 sit at 27 companies, so you can write one email per person without hitting the same account 46 times.
One row from the search in Step 2 looks like this. It is the response shape from the API reference, with placeholder values.
{
"success": true,
"data": [
{
"profile_data": { "profile_full_name": "Jane Doe" },
"contact_data": {
"has_email": true,
"email_status": "verified",
"contact_current_experiences": [
{ "company_name": "Acme", "company_domain": "acme.com", "job_title": "VP of Sales" }
]
},
"resume_data": {},
"meta": {}
}
],
"meta": { "count": 25, "limit": 25, "nextCursor": "..." }
}Search returns a thin record with no contact points. has_email and email_status tell you whether an address exists before you enrich. The schema is in the API reference.
A good Step 3 output for that row looks like this.
Subject: question for acme sales
Jane, you lead sales at Acme, a software company in the 51-200
headcount band.
We find verified emails for that exact title and size, so reps
stop hand-building lists.
Worth a 15-minute look this week?What to change when replies are low
Reply rates track the list, the offer and the timing. Wording is the last variable to tune, not the first. Fix the list before the prose.
Change one thing at a time. If nobody opens, the subject line or the sender is the problem, not the body. If people open but never reply, the ask is too big or the first line is generic.
If the replies are negative, the list is wrong. Go back to Step 1, tighten the title and company size, and count again. A cleaner list beats a cleverer prompt every time.
Keep a small log: the filters, the prompt version and the reply count. After three batches you will know which variable moved the number.
Troubleshooting
| Error | Cause | Fix |
|---|---|---|
| 401 | Missing or wrong x-api-key header | Re-copy the key from the app and export $LEADOCEAN_API_KEY |
| 429 | Above the plan rate limit (5 requests a second on Free, 200 on Agency) | Back off for the Retry-After seconds, then retry |
| 402 | The plan is out of records (Free is 1,000, one time) | Check usage in the app, or move to Solo at $97 a month |
| Empty results | An enum value is not an exact string, such as vp instead of VP | Call leadocean_list_enum_values and copy the string |
| Count much lower than expected | The default counts only verified and catch-all addresses | Read totalAll for the unfiltered number |
| Export refused | Over 50,000 rows a request or 500,000 a day | Split the export; bulk CSV is not on the Free plan |
FAQ
Does Claude write better cold email than a template?
Only when it gets facts. With a job title, company size and industry it writes a specific first line. With nothing, it produces the generic email you were trying to avoid.
How many records does this cost?
Sizing costs zero. Pulling 25 prospects costs 25 records. Rewriting emails costs zero, because Claude only rereads rows you already have.
Should I send what Claude writes without reading it?
No. Read every email in a batch of 25. Check email_status before sending, because bounced emails are not refunded.
Which Claude setup do I need?
Any client that supports MCP works. Connect https://api.leadocean.io/mcp, sign in with OAuth, and the 13 tools appear, 7 of them free. The AI outbound tools guide covers what to pair it with for sending.
Where do I find more prompts?
See generate leads with cold email and find prospects for cold email. Plans and limits are on the pricing page.
Give Claude real prospects to write to
Free to start. No credit card. 1,000 records to spend whenever you like.
Get your free API key →