Pre-Black Friday: 20% off, for as long as you stayEARLYBFon Solo and AgencyEnds Nov 28Start free

How-to guide

How to Build a B2B Lead List for Media and Publishing (Buyers, Filters and Messaging)

Pick the buying committee, count the list for free, then spend records only on the people you will email.

Get your free API key →Free to start. No credit card. 1,000 records to spend whenever you like.

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.
  • curl and jq, 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 sellEconomic buyerChampionGatekeeper
Ad tech, yield or monetization toolsPublisher, CEOHead of advertising, head of revenueHead of product or engineering
Audience, CMS or subscription toolsPublisher, COOHead of product, head of audienceIT or engineering lead
Editorial tools, data or servicesEditor-in-chief, publisherManaging editor, head of newsroom operationsLegal, 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.

bash
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[]'
done

The 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.

json
{
  "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.

json
{
  "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.

json
{
  "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 Publishing and Periodical Publishing run on ad and subscription revenue. Book Publishing runs on titles and distribution. Broadcast Media and Online Media sit 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 hqCountry for the account and country for 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.

json
{
  "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.

bash
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.

bash
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.json

A 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.

bash
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.

text
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 Doe

Keep 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.

FiltersMailable peopleEmployersAll people, any email
Nine media industries, C-Team or VP119,102about 42,946431,575
Same industries, Advertising & Marketing, Director, VP or C-Team13,1406,61141,892
Same industries, titles Editor in Chief, Managing Editor or Publisher16,0867,28055,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):

json
{
  "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

ErrorCauseFix
401Missing or bad x-api-key headerRe-export $LEADOCEAN_API_KEY and check for a trailing space.
429Requests above the plan's rate limit (5 a second on Free, 200 on Agency)Wait for the Retry-After header, then slow the loop.
402The Free plan's 1,000 records are spentMove to Solo at $97 a month or Agency at $497 a month.
Empty resultsA bad enum value such as Media for industryLook the value up with /v1/enums/industry?q=media or leadocean_list_enum_values.
meta.depthCapped: trueOne search reached 10,000 rowsNarrow the filters and run a second search.
Export refusedThe request is above 50,000 rows, or 500,000 rows for the daySplit 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 →