Pharmaceutical sales cold emails get replies when they name one problem the reader owns, in under 90 words, sent to a verified address. The list matters as much as the copy. This guide gives four samples and the calls that build the list they go to.
TL;DR
- Four samples, each under 90 words, for sales leaders, marketing and commercial ops at drug makers.
- The list takes three API calls and about 25 minutes. Sizing is free, and a first test pull spends about 25 records.
- Check
email_statusbefore you send. LeadOcean does not refund or credit back bounces.
Prerequisites
- A LeadOcean account on the free plan: 1,000 records for life, no card, 5 requests a second. Start free.
- Your key in the shell as
$LEADOCEAN_API_KEY. curlandjq.- A sending tool you already use. LeadOcean is the data. It has no sequencer, dialer or CRM.
This page covers outreach to companies and their staff. Rules on promotional contact with healthcare professionals differ by country. Check yours with your compliance team before you send.
Step 1: Resolve the exact filter values
Enum filters are exact strings, and a wrong one returns nothing. Look up the industry first. The q parameter filters the values by substring, and the call is free.
curl -s "https://api.leadocean.io/v1/enums/industry?q=pharm" \
-H "x-api-key: $LEADOCEAN_API_KEY" | jq '.data'The same lookup through the free MCP tool leadocean_list_enum_values on 2026-10-21 returned three values: Pharmaceutical Manufacturing, Pharmaceuticals and Retail Pharmacies. Use the first two for drug makers. Skip the third unless you sell to pharmacies.
Step 2: Size the list for free
Add count=true as a query parameter with limit=1. It costs no records.
curl -s -X POST "https://api.leadocean.io/v1/people/search?count=true&limit=1" \
-H "x-api-key: $LEADOCEAN_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"industry": ["Pharmaceutical Manufacturing"],
"jobFunction": ["Sales & Business Development"],
"jobLevel": ["Manager", "Director"],
"country": ["US"]
}' | jq '.meta'On 2026-10-21 the free leadocean_count_leads tool ran the same filters and returned 12,897 people across 1,198 companies. That count covers only addresses with emailStatus of verified, catch_all_valid or catch_all. Without an email condition the same filters match 32,317.
Start narrower than that. Add title keywords for the role you sell to, such as ["Commercial Operations", "Sales Operations"], and re-count until the list fits your first send.
Step 3: Pull the first 25 and read email status
Run the same body without count, with limit 25 in the body. Each person returned costs one record.
curl -s -X POST "https://api.leadocean.io/v1/people/search" \
-H "x-api-key: $LEADOCEAN_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"industry": ["Pharmaceutical Manufacturing"],
"jobFunction": ["Sales & Business Development"],
"jobLevel": ["Director"],
"country": ["US"],
"title": ["Commercial Operations"],
"limit": 25
}' > page1.json
jq '.meta' page1.jsonFor more rows, pass the meta.nextCursor value as cursor on the next call. One search pages to 10,000 rows. Past that, meta.depthCapped is true and you narrow the filters instead of walking the index.
Check contact_data.email_status on each row before it goes to your sender. Send to verified first. Treat catch_all as a risk you accept on purpose.
For a full list, use POST /v1/exports (up to 50,000 rows a request, 500,000 a day). Bulk CSV export is not on the free plan. The Exports page in the app at app.leadocean.io does the same with a filter builder and a price preview.
Step 4: Write the email
Use one pain, one proof you can stand behind, one small ask. Keep every email under 90 words. Fill the brackets from the row you pulled. Never invent a result.
Sample 1: sales leader, field force efficiency
Subject: Territory plans at [Company]
Hi [First name],
Field teams at mid-size drug makers often plan territories in a spreadsheet once a year and live with it.
We help commercial teams rebuild call plans from current prescriber and account data each quarter.
Worth a 15-minute look at how [Company] plans [Territory/Region] today?
[Sender]Sample 2: commercial operations, data
Subject: Account data at [Company]
Hi [First name],
If your reps pull account contacts by hand, the list is stale by the time it reaches the CRM.
We refresh the contact feed so ops owns one clean source. I can show how it works on one of your accounts.
Open to a short call this week?
[Sender]Sample 3: marketing, launch
Subject: Launch window for [Product]
Hi [First name],
Launches tend to stall when the first 90 days of outreach go to the wrong audience.
I can share how teams define that audience by role and site type before the first send.
Should I send a one-page example?
[Sender]Sample 4: follow-up, three days later
Subject: Re: Territory plans at [Company]
Hi [First name],
One line on why I wrote: planning from stale data costs calls that never needed to happen.
If someone else owns this at [Company], point me to them and I will stop here.
[Sender]Personalise the first line from the profile. Put your own claims in, not ours. For more on first lines, see how to personalize sales emails that get replies and personable cold sales email samples. See the blog index for more outreach guides. For samples aimed at prescribers, see 8 pharma cold email samples for HCPs.
Why most pharma cold emails fail
Most fail before the first word is read. The address bounces, or the person left the company, or the role has nothing to do with the offer. Fix the list and copy gets a fair test.
Pharma buyers get plenty of generic vendor mail. What stands out is a message that names their territory, their launch or their team size, and asks for something small.
Three habits separate the emails that get replies from the rest.
- One reader, one problem. A message to a commercial operations director talks about data and planning. A message to a marketing lead talks about launch audiences. Do not send one email to both.
- A small ask. Ask for fifteen minutes or a one-page example. Do not ask for a demo in the first line.
- A way out. The follow-up sample offers to stop if someone else owns the topic. It reads as respect and invites a forward to the right person.
How to test the samples
Do not send all four to 10,000 people. Pull 25 to 50 rows, split them across two samples, and send over a week. Read the replies, not only the opens. Open tracking is unreliable on mobile mail.
A good first test is sample 1 against sample 2 on the same title and the same region. Change one thing at a time. If sample 2 wins, keep its pain and test a new subject line.
Keep a plain log. Record the filter body, the date, the email status mix and the number of replies. LeadOcean returns fetched_at on each record, and the dataset refreshes monthly, so a list pulled in March is not the list you have in June. Pull again before you send a second wave.
Choosing who to email
Titles decide more than copy does. Four roles cover most pharma vendor sales.
- Commercial operations or sales operations. They own data, territory design and reporting. Filter
titlefor "Commercial Operations" or "Sales Operations". - Sales leadership. Directors and VPs with
jobFunctionset toSales & Business Development. - Marketing and brand. Set
jobFunctiontoAdvertising & Marketingand filtertitlefor "Brand" or "Marketing". - Medical affairs and R&D. Use
Healthcare & Human Services,ScienceorResearch & Developmentfor these. Count first, because the right function value depends on how people list their role.
Job levels are exact strings: C-Team, VP, Director, Manager, Staff and Other. Seniority is lowercase, such as c_suite or director. List them with the free leadocean_list_enum_values MCP tool if you are unsure.
What you get
Step 2 returns the sizing meta. This is the shape of a count response, with placeholder values.
{
"data": [],
"meta": {
"total": 12897,
"countOnly": true
}
}Step 3 returns people. This is the response shape from the API reference, with placeholder values.
{
"data": [
{
"profile_data": { "profile_full_name": "Jane Doe" },
"contact_data": {
"has_email": true,
"has_phone": false,
"email_status": "verified",
"email_type": "work",
"contact_current_experiences": [{ "company_name": "Acme Pharma" }]
},
"resume_data": {},
"meta": { "source_ids": { "person_id": "1234567890" } }
}
],
"meta": { "count": 1, "limit": 25, "nextCursor": "..." }
}Addresses come back with a reveal. Call POST /v1/people/enrich with the row's meta.source_ids.person_id and reveal_email: true for the rows you will send to. Phone numbers come from GET /v2/people/phone.
Troubleshooting
| Error | Cause | Fix |
|---|---|---|
| 401 | Missing or wrong x-api-key header | Check $LEADOCEAN_API_KEY is set and sent as x-api-key |
| 429 | Above your plan's rate limit (5 a second on Free, 200 on Agency) | Wait for the Retry-After value, then slow the loop |
| 402 | Out of records | The free 1,000 are spent. Move to a paid plan on pricing |
Empty data on a real filter | Enum value is not an exact string, such as pharma for the industry | Resolve it with GET /v1/enums/industry |
meta.depthCapped is true | One search stopped at 10,000 rows | Narrow by title, country or company size and rerun |
| Export refused | Over 50,000 rows a request or 500,000 a day | Split the export into smaller filtered files |
FAQ
How long should a pharmaceutical sales cold email be?
Under 90 words. One pain, one ask. Buyers read it on a phone between meetings.
Which industry value should I use for drug makers?
Use Pharmaceutical Manufacturing and Pharmaceuticals. Both exist in the 534 industry values. Run the count for each to see which holds your market.
Can I email healthcare professionals with this list?
Regulation of promotional contact with prescribers varies by country. Get compliance sign-off first. The filters work the same, but the rules about what you may send are yours to check.
Do bounced emails cost me anything extra?
Records are spent on people returned, not on delivery. LeadOcean gives no refund or credit-back for bounces, so read email_status first.
Does a count cost records?
No. A search with count=true and limit=1, and the leadocean_count_leads MCP tool, are free.
Build the pharma list your emails go to
Free to start. No credit card. 1,000 records to spend whenever you like.
Get your free API key →