A publisher rarely has one buyer. The editor-in-chief owns the product people see, the head of advertising owns the revenue, and the technology lead owns the stack. Each one rejects a pitch aimed at the others.
This guide picks that committee, finds it with LeadOcean filters, sizes the list with a free count and drafts a first message per role. It suits anyone selling tools, data or services to newsrooms, magazines, book publishers and online media.
TL;DR
- Target three roles per account: the budget owner (publisher, CEO, managing director), the champion (editorial, product or audience lead) and the revenue owner (advertising or partnerships).
- Size first with a free count. On 2026-10-21, nine publishing and media industries held 119,102 mailable VPs and C-level people worldwide, across about 42,946 employers.
- The recipe takes about 40 minutes and spends about 30 records, so it fits inside the Free plan's 1,000.
Prerequisites
- A LeadOcean account on the Free plan. Sign up at app.leadocean.io, no card.
- An API key exported as
$LEADOCEAN_API_KEY. curlandjq, or any HTTP client.- Optional: the hosted MCP server at https://api.leadocean.io/mcp if you would rather run the counts from Claude.
Step 1: Pick the buying committee
Pick the roles before you touch a filter. Media buyers split into three groups, and each reads a cold email differently.
| You sell | Economic buyer | Champion | Gatekeeper |
|---|---|---|---|
| Ad tech, yield or monetization tools | Publisher, CEO | Head of advertising, head of revenue | Head of product or engineering |
| Audience, CMS or subscription tools | Publisher, COO | Head of product, head of audience | IT or engineering lead |
| Editorial tools, data or services | Editor-in-chief, publisher | Managing editor, head of newsroom operations | Legal, standards |
Size changes the committee. At a 15-person site the founder is publisher, editor and ad seller at once. At 500 people there is a product team, a revenue team and a procurement step.
Titles run loose in this sector. "Executive Editor", "Editorial Director" and "Head of Content" can mean the same job. Test your titles on a small batch before you trust them.
LeadOcean has no single "media" industry. It has nine that matter here, and the exact strings count. Look them up before you use them.
for q in publish media broadcast; do
curl -s -G "https://api.leadocean.io/v1/enums/industry" \
--data-urlencode "q=$q" \
-H "x-api-key: $LEADOCEAN_API_KEY" | jq -r '.data.values[]'
doneThe same lookup is free through the MCP tool leadocean_list_enum_values. Enum values are exact strings, so Media alone as an industry returns nothing.
Step 2: Turn the committee into filters
Write the filters as flat JSON. Every filter is an array, even when it holds one value.
{
"industry": [
"Publishing", "Newspaper Publishing", "Periodical Publishing",
"Book Publishing", "Book and Periodical Publishing", "Internet Publishing",
"Online Media", "Media Production", "Broadcast Media"
],
"jobLevel": ["C-Team", "VP"]
}For the revenue owners, switch to function and level.
{
"industry": ["Newspaper Publishing", "Periodical Publishing", "Online Media"],
"jobFunction": ["Advertising & Marketing"],
"jobLevel": ["Director", "VP", "C-Team"]
}For the editorial champions, use titles. Title values are keywords, so list the variants you want.
{
"industry": ["Newspaper Publishing", "Periodical Publishing", "Online Media"],
"title": ["Editor in Chief", "Managing Editor", "Publisher"]
}Run one list per role. A publisher and an ad ops lead on one sequence get a message that fits neither.
Exclude what you cannot sell to. Add excludeTitle values such as ["intern", "assistant", "freelance"] and excludeCompanyName for competitors and existing customers.
Step 3: Split by size, format and region
Media is not one market. A local daily, a B2B trade magazine and a book house buy on different calendars.
- Format. Use the industry list.
Newspaper PublishingandPeriodical Publishingrun on ad and subscription revenue.Book Publishingruns on titles and distribution.Broadcast MediaandOnline Mediasit between. - Headcount. Use
employeeRange. At 11 to 50 people, the publisher decides. At 51 to 200, a product or revenue lead appears. Above 200, expect procurement. - Region. Use
hqCountryfor the account andcountryfor the person. A UK publisher and a US publisher face different ad rules and privacy rules, so write them separate lines.
The companyKeywords filter matches words in the employer's description, so ["newsletter", "podcast network"] can find companies the industry labels miss. It applies only when the matching companies number 50,000 or fewer. Add a region or a size band if it is refused.
Count each cut with leadocean_count_leads, or the same filters over REST, before you commit.
{
"industry": ["Newspaper Publishing", "Periodical Publishing", "Online Media"],
"jobFunction": ["Advertising & Marketing"],
"jobLevel": ["Director", "VP", "C-Team"],
"employeeRange": ["51-200"],
"country": ["GB"]
}If a segment holds a few hundred people or fewer, merge it with its neighbour. A list that small cannot support its own sequence.
Step 4: Size the list with a free count
Counts decide how much effort a segment deserves. A segment of 5,000 people can carry its own sequence. A segment of 40 is a hand-written list.
Count before you pull. A count costs no records and can run as often as you like.
curl -s "https://api.leadocean.io/v1/people/search?count=true" \
-H "x-api-key: $LEADOCEAN_API_KEY" \
-H "content-type: application/json" \
-d '{
"industry": ["Newspaper Publishing", "Periodical Publishing", "Online Media"],
"jobFunction": ["Advertising & Marketing"],
"jobLevel": ["Director", "VP", "C-Team"],
"limit": 1
}' | jq '.meta'count=true goes in the query string. The JSON body rejects unknown fields. The response has no rows, only meta.total (capped at 100,000) and meta.countOnly: true.
For the company side, GET /v1/companies/count takes the company-search filters and returns an exact total with breakdowns by industry, headcount band, HQ country and HQ state. The MCP tool leadocean_count_companies does the same. Use it to see which countries hold the accounts before you pick a region.
Timing matters in this sector. Ad budgets are set before the year starts, and book catalogues close months ahead of a season. Send ad pitches in the quarter before planning, and send tool pitches outside election cycles and major launches, when newsrooms have no spare week.
Step 5: Pull a 25-row test batch
Pull a small batch first. Read the titles and employers. If half are the wrong kind of firm, tighten the filters before you spend more.
curl -s "https://api.leadocean.io/v1/people/search" \
-H "x-api-key: $LEADOCEAN_API_KEY" \
-H "content-type: application/json" \
-d '{
"industry": ["Newspaper Publishing", "Periodical Publishing", "Online Media"],
"jobLevel": ["C-Team", "VP"],
"limit": 25
}' > batch.json
jq '.data | length' batch.jsonA page of 25 is 25 records. Page with cursor from meta.nextCursor when you want more. One search pages to 10,000 rows, and the last page carries meta.depthCapped: true. Narrow the filters instead of walking further.
Check contact_data.email_status on every row before you send. LeadOcean gives no refund for bounced emails, so drop anything that is not verified or a catch-all result.
Step 6: Enrich the people you will email
Enrich only the people who pass the read. Enrichment takes exactly one of linkedin_url, email, phone or person_id. There is no name plus domain lookup, so take the person_id from the batch.
curl -s -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_BATCH", "reveal_email": true}'A person we hold nothing for is a 404 and costs nothing. Since October 2026 the response also carries career history: past roles, education, certifications and awards. An editor who moved from a daily to a trade title gives you a better opening line than a company description.
Past employers carry no company_id yet, so match them by name only.
Step 7: Write one message per role
Publishers are pitched all day and read little of it. Lead with the job you do for them, then one fact that proves you looked at their site.
- Publisher or CEO. Name one outcome and one cost. Keep it under 70 words. Skip industry-decline talk, since they live it.
- Head of advertising. Name the revenue line you touch (display, sponsorship, newsletter ads) and how fast you show a result. Offer a test on one section.
- Editorial or product lead. Name the workflow it saves, the system it plugs into and the setup time. Offer a trial on one desk, not a call.
Here is a template for the head of advertising. Replace the placeholders.
Subject: [revenue line] at [publication]
Hi [first name],
[publication] runs [format]. Teams at that scale often hit [pain] once [trigger].
We built [your tool] for that. Setup is [minutes] minutes, and you can test it on one section before anyone signs anything.
Worth a look this week?
Jane DoeKeep the first email short and plain. Skip emoji, skip price talk and skip claims you cannot back with a link. One clear question beats three soft ones.
Send each role its own sequence and track replies by role. After the first 100 sends, the role that replies most tells you where the budget really sits.
What you get
The free count from Step 4 returns sizes before any record is spent. These are results from leadocean_count_leads on 2026-10-21, worldwide, with no country filter. They count mailable people: email status verified, catch_all_valid or catch_all. The industries are the nine listed in Step 2.
| Filters | Mailable people | Employers | All people, any email |
|---|---|---|---|
| Nine media industries, C-Team or VP | 119,102 | about 42,946 | 431,575 |
| Same industries, Advertising & Marketing, Director, VP or C-Team | 13,140 | 6,611 | 41,892 |
| Same industries, titles Editor in Chief, Managing Editor or Publisher | 16,086 | 7,280 | 55,467 |
A company count with the same nine industries on 2026-10-21 returned 535,466 companies. About 381,613 of them have 1 to 10 people. Most of the accounts are tiny, so filter by employeeRange before you plan volume.
A search row has this shape. Response shape from the API reference (placeholder values):
{
"success": true,
"data": [
{
"profile_data": {
"profile_full_name": "Jane Doe",
"profile_headline": "Head of Advertising at Acme",
"profile_url": "https://www.linkedin.com/in/jane-doe"
},
"contact_data": {
"has_email": true,
"has_phone": false,
"email_status": "verified",
"email_type": "work"
},
"meta": { "source_ids": { "person_id": "1234567890" } }
}
],
"meta": { "count": 1, "credits": 1, "nextCursor": "CURSOR" }
}Search rows carry no contact points. Enrich by person_id with reveal_email for the address and for resume_data.
Troubleshooting
| Error | Cause | Fix |
|---|---|---|
| 401 | Missing or bad x-api-key header | Re-export $LEADOCEAN_API_KEY and check for a trailing space. |
| 429 | Requests above the plan's rate limit (5 a second on Free, 200 on Agency) | Wait for the Retry-After header, then slow the loop. |
| 402 | The Free plan's 1,000 records are spent | Move to Solo at $97 a month or Agency at $497 a month. |
| Empty results | A bad enum value such as Media for industry | Look the value up with /v1/enums/industry?q=media or leadocean_list_enum_values. |
meta.depthCapped: true | One search reached 10,000 rows | Narrow the filters and run a second search. |
| Export refused | The request is above 50,000 rows, or 500,000 rows for the day | Split the export, and note bulk CSV export is not on Free. |
FAQ
Is there a "media" or "publishing" filter?
There are nine industry values, from Publishing to Broadcast Media. Pass the ones that fit your buyer as an array, and add companyKeywords for companies filed elsewhere.
How many media buyers can I reach for free?
The count is free, so size it as often as you like. On 2026-10-21 there were 119,102 mailable VPs and C-level people across the nine industries. The Free plan spends 1,000 records, once.
Does it cover freelancers and creators?
Partly. Industry and size filters work on the employer record, so a one-person newsletter shows up only when its company has a record. Try companyKeywords such as newsletter and check the count before you plan a creator campaign.
Can I filter by funding round?
Funding filters do not count reliably in free counts, so size the list without them. Apply the funding filter at search time to narrow it further.
How fresh is the data?
The dataset is refreshed monthly, and each record carries its own fetched_at date. Read it on newsroom roles, since editors move often.
Related guides: lead generation for Web3, travel and telecom. See pricing for plan limits, or return to the lead generation guides.
Count your media and publishing buyers free, then pull the first 25
Free to start. No credit card. 1,000 records to spend whenever you like.
Get your free API key →