TL;DR
- A Claude Code email sequence is three pieces: a counted audience, a CSV of real rows, and a skill that drafts four touches per person from fields in each row.
- It takes about 40 minutes and spends about 30 of the 1,000 free LeadOcean records: 25 search rows and 5 enrichments.
- Claude Code drafts. It does not send. You paste the approved copy into the sequencer you already run, because LeadOcean has no sequencer.
Prerequisites
- A LeadOcean account from app.leadocean.io. The free plan has no card, 1,000 records for life and 5 requests a second.
- Claude Code installed, and an empty project folder.
curlandjq. Every REST call reads the key from$LEADOCEAN_API_KEY.- A sequencer or mail tool that can import copy and a CSV. This guide does not cover sending. For the sending side, see the multi-touch sequences recipe.
mkdir sequence-lab && cd sequence-lab
export LEADOCEAN_API_KEY="paste-your-key-here"Step 1: Connect the LeadOcean MCP server
Claude Code adds a remote MCP server with one command, then asks you to sign in with /mcp, per the Claude Code MCP docs, October 2026. LeadOcean's server has 13 tools and signs in with OAuth, so no key is pasted.
claude mcp add --transport http leadocean https://api.leadocean.io/mcp
claude mcp listInside a session, run /mcp and approve the sign-in. Free tools include the two counts, the filter list and the enum list. Use them before anything else. The prospecting workflow guide goes deeper on filters.
Step 2: Count the audience before you write a word
Size the list first. A sequence written for 40 people and one written for 4,000 are different projects. The count is free, so ask as often as you like.
Ask Claude Code this in the project folder:
Use leadocean_count_leads with title ["Head of Revenue Operations", "VP Revenue Operations"], country ["US"], employeeRange ["51-200"], facets false. Report the total, totalAll and what the total measures.The default total counts only addresses worth sending to: verified, catch_all_valid and catch_all. totalAll is the same filters with no email condition. Say which one you mean.
Resolve every closed-list value with leadocean_list_enum_values instead of guessing. employeeRange and jobLevel take exact strings, so "Vice President" returns nothing where VP works.
Step 3: Pull 25 rows into a file
Search over REST so the rows land in a file, not in the chat context. The body is flat JSON, every filter is an array of strings, and limit runs from 1 to 100.
curl -s "https://api.leadocean.io/v1/people/search" \
-H "x-api-key: $LEADOCEAN_API_KEY" -H "content-type: application/json" \
-d '{
"title": ["Head of Revenue Operations", "VP Revenue Operations"],
"country": ["US"],
"employeeRange": ["51-200"],
"emailStatus": ["verified", "catch_all_valid", "catch_all"],
"limit": 25
}' > rows.json
jq '.meta' rows.jsonThis spends 25 records. To go past a spot-check, use POST /v1/exports (up to 50,000 rows a request, 500,000 a day). Bulk CSV export is not on the free plan, so use search while you test.
Step 4: Enrich five rows and reveal the email
Pick five person IDs from rows.json with jq -r '.data[].meta.source_ids.person_id' rows.json. Enrich takes exactly one of linkedin_url, email, phone or person_id. Set reveal_email to true to get the address. It costs no extra record.
curl -s 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 rows.json>", "reveal_email": true}' \
| jq '{role: .data.contact_data.contact_current_experiences[0], emails: .data.contact_data.contact_emails, past_roles: .data.resume_data.experiences}'Enrichment also returns career history in resume_data: past roles, education and certifications, each when held. That is where a real opener comes from. Past employers carry no company_id yet, so match them by name.
Save the five results to leads.csv with columns first_name, title, company, domain, email, email_status, past_role. Drop any row with no email.
Step 5: Write the rules in CLAUDE.md
Claude Code reads a project CLAUDE.md at the start of each session, per the memory docs, October 2026. Put the sequence rules there so every draft obeys them.
SEQUENCE RULES
- Four touches: day 1 opener, day 3 follow-up, day 7 proof, day 12 breakup.
- Each email is under 90 words. One ask per email. No attachments.
- Use only fields in leads.csv. Never invent a company fact, a customer or a metric.
- Touch 1 may use one detail from past_role. If it is empty, use title and company only.
- Never send. Write drafts to drafts/<domain>.md and stop.
- Skip any row where email_status is not verified.The last rule matters. A bounced email is not refunded, so read email_status before anything goes out.
Step 6: Add a /sequence skill
A skill at .claude/skills/sequence/SKILL.md creates the /sequence command, per the slash command docs, October 2026. $ARGUMENTS is replaced by what you type after it.
---
name: sequence
description: Draft a four-touch email sequence for each row in leads.csv. Use when the user types /sequence followed by the offer.
---
Offer: $ARGUMENTS
For each row in leads.csv, write four emails following SEQUENCE RULES.
Save each person's sequence to drafts/<domain>.md with a subject line per touch.
Then print a table: domain, touch 1 subject, word count of each touch.Run it:
/sequence We help RevOps teams cut CRM enrichment cost. Offer a free audit of their current data coverage.Read at least three drafts in full. Check that each cites only a field from the row. Edit the rules, not the drafts, when something is wrong, so the fix applies to the next run.
What you get
This is the free MCP count tool for the audience in step 2, run on 21 October 2026.
{
"total": 122,
"totalIsExact": true,
"totalAll": 216,
"distinctCompanies": 120,
"credits": 0
}That is 122 mailable people across 120 companies, counted for 0 records. 216 match the same filters with no email condition. Your numbers will differ as the data refreshes monthly.
Each draft file looks like this. Values are placeholders.
drafts/acme.com.md
Touch 1 (day 1) Subject: Acme's CRM data coverage
Hi Jane, you moved from Globex to lead RevOps at Acme. ... (74 words)
Touch 2 (day 3) Subject: Re: Acme's CRM data coverage
...A search row has a fixed shape. This is the response shape from the API reference, with placeholder values.
{
"data": [
{
"profile_data": { "profile_full_name": "Jane Doe", "profile_headline": "<headline>" },
"contact_data": {
"contact_current_experiences": [{ "job_title": "Head of Revenue Operations", "company_name": "Acme", "company_domain": "acme.com" }],
"has_email": true,
"email_status": "verified",
"has_phone": true
},
"meta": { "source_ids": { "person_id": "<digits>" } }
}
],
"meta": { "count": 25, "limit": 25, "credits": 25, "total": "<total>", "nextCursor": "<cursor>" }
}Troubleshooting
| Error | Cause | Fix |
|---|---|---|
| 401 | Missing, wrong or revoked key | Copy the key again from app.leadocean.io and re-export $LEADOCEAN_API_KEY. |
| 429 | Above the plan's rate limit (5 requests a second on Free, 200 on Agency) | Wait the Retry-After seconds. Pull 25 to 100 rows per call instead of many small calls. |
| 402 | The free plan's 1,000 one-off records are spent | Check GET /v1/account. Move to Solo at $97 a month for a fair-use pace, not credits. |
| Empty results or a count of 0 | A filter value outside the catalogue, such as jobLevel: "Vice President" | Resolve it with leadocean_list_enum_values and pass the exact string. |
| Export refused | Over 50,000 rows a request or 500,000 a day, or a Free key | Split the job, or use search on Free. |
| Claude Code cannot see the tools | The MCP sign-in was not completed | Run claude mcp list, then /mcp and approve the sign-in. |
FAQ
Can Claude Code send the emails?
Not in this setup. The rules forbid it and the project has no mail tool. Paste approved copy into your sequencer. LeadOcean is data and an API, not a sequencer.
How many records does a full run cost?
Search rows cost one record each, and each enrichment that finds a person costs one. An enrichment that finds nothing and every count cost nothing. This guide spends about 30.
How do I stop four touches reading like a template?
Limit each touch to one detail from the row and cap it at 90 words. Put that cap in CLAUDE.md. Generic copy comes from a loose prompt, not a missing feature.
What about a bigger list?
Count it first, then export it. Paid plans use a fair-use pace instead of credits. See pricing, and the sales agent guide for a bounded agent.
Build your first Claude Code sequence on real, counted data
Free to start. No credit card. 1,000 records to spend whenever you like.
Get your free API key →