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 Marketing Agencies (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 marketing agency buys through a small, opinionated committee. The founder signs, the head of a service line judges, and an operations lead decides whether the tool survives the first client project.

This guide picks that committee, finds it with LeadOcean filters, sizes the list with a free count and drafts one message per role. It suits anyone selling software, data, freelancers or services to agencies.

TL;DR

  • Target three roles per agency: the owner (founder, CEO, managing partner), the champion (head of a service line such as paid media, SEO or creative) and the operator (operations or finance lead).
  • Size first with a free count. On 2026-10-21, three agency industries held 338,606 mailable VPs and C-level people across 126,644 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 roles before you touch a filter. Agencies split into three groups, and each reads a cold email differently.

You sellEconomic buyerChampionOperator
Reporting, ads or SEO toolingFounder, CEOHead of paid media, head of SEOOperations lead
Freelance talent, white-label workFounder, managing partnerHead of creative, head of deliveryFinance lead
Data, leads or software for client workCEO, head of growthHead of strategy, head of accountsOperations lead

Agency size changes the committee. At 10 people the founder is also head of sales and approves every tool. At 100 people service-line heads own their stack and a finance or operations person watches the margin.

Agencies read pitches as buyers and as competitors. They spot a template fast, so a message that fits one role well beats one that fits everyone.

LeadOcean has no single "agency" industry. Three are close: Marketing and Advertising, Advertising Services and Marketing Services. Look the exact strings up before you use them.

bash
for q in marketing advertis public; 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 Marketing Agency returns nothing. Public Relations and Communications Services is a neighbour if you sell to PR firms.

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": ["Marketing and Advertising", "Advertising Services", "Marketing Services"],
  "jobLevel": ["C-Team", "VP"]
}

For the champions, switch to function and level. An agency's marketing function is its delivery team.

json
{
  "industry": ["Marketing and Advertising", "Advertising Services", "Marketing Services"],
  "jobFunction": ["Advertising & Marketing"],
  "jobLevel": ["Director", "VP", "C-Team"]
}

For the operators, use titles. Title values are keywords, so list the variants you want.

json
{
  "industry": ["Marketing and Advertising", "Advertising Services", "Marketing Services"],
  "title": ["Head of Operations", "COO", "Operations Director", "Finance Director"]
}

Run one list per role. A founder and an operations lead on one sequence get a message that fits neither.

Exclude what you cannot sell to. Add excludeTitle values such as ["intern", "assistant"] and excludeCompanyName for competitors and existing customers.

Step 3: Split by size, function and region

Agencies are not one market. A five-person paid social shop and a 300-person network office have different buyers and different budgets.

  • Headcount. Use employeeRange. From 1 to 10 people the founder decides alone. From 11 to 50, service-line leads appear. From 51 to 200, expect an operations owner and a vendor review.
  • Function. Use jobFunction set to Advertising & Marketing for service-line leads, Operations for delivery and Finance & Accounting for the margin watchers.
  • Region. Use hqCountry for the agency and country for the person. A London agency and a Texas agency buy on different calendars and in different currencies.

The companyKeywords filter matches words in the employer's description, so ["performance marketing", "seo agency"] can find agencies the industry label misses. 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": ["Marketing and Advertising", "Advertising Services", "Marketing Services"],
  "jobLevel": ["C-Team", "VP"],
  "employeeRange": ["11-50"],
  "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 carries 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": ["Marketing and Advertising", "Advertising Services", "Marketing Services"],
    "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. The MCP tool leadocean_count_leads is not capped at 100,000 and says whether its total is exact.

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. Use it to see where the agencies sit before you pick a region.

Step 5: Pull a 25-row test batch

Pull a small batch first. Read the titles and employers. If half are in-house marketing teams rather than agencies, 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": ["Marketing and Advertising", "Advertising Services", "Marketing Services"],
    "jobLevel": ["C-Team", "VP"],
    "employeeRange": ["11-50"],
    "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. A past role at a brand the agency now serves is 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

Agencies sell for a living, so they dislike being sold to badly. Lead with the job you do for them, then one fact that proves you read their situation.

  • Founder or CEO. Name one outcome and one cost. Keep it under 70 words. Talk about margin or retention, since those are what a founder watches.
  • Head of a service line. Name the client task you shorten and the tool it replaces. Offer a test on one account, not a call.
  • Operations or finance. Say what it costs per client, how billing works and who can see the data. Link the doc.

Here is a template for a service-line head. Replace the placeholders.

text
Subject: [task] for [service_line] clients

Hi [first_name],

[company] runs [service_line] for [client_type]. Teams at that size usually lose hours to [task] each week.

We built [your_tool] for that. Setup is [minutes] minutes, and you can test it on one client account 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 champion 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 for the industries Marketing and Advertising, Advertising Services and Marketing Services. They count mailable people: email status verified, catch_all_valid or catch_all.

FiltersMailable peopleEmployersAll people, any email
C-Team or VP338,606126,6441,404,650
Advertising & Marketing function, Director, VP or C-Team54,36424,352161,871
C-Team or VP, 11-50 employees73,51227,936247,165

The first two employer figures are not a count of agencies. They count every employer in those industries, and the first one is an estimate above 40,000. Read the test batch before you trust a segment.

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": "Founder 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 Marketing Agency for industryLook the value up with /v1/enums 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 "marketing agency" filter?

No. Use the industries Marketing and Advertising, Advertising Services and Marketing Services, then add companyKeywords such as ["performance marketing"] for agencies filed elsewhere. Read the first batch to see what the keyword pulls in.

How many agency buyers can I reach for free?

The count is free, so size it as often as you like. On 2026-10-21 there were 338,606 mailable VPs and C-level people in those three industries. The Free plan spends 1,000 records, once.

Will the list include in-house marketing teams?

Some, yes. The industry describes the employer, and brands that run a large marketing arm can be filed there. Pull 25 rows and check employers before you scale.

Can I filter by agency revenue?

Not in a people count. The free people count does not support minRevenue or maxRevenue, so size the list with employeeRange as the proxy.

How fresh is the data?

The dataset is refreshed monthly, and each record carries its own fetched_at date. Read it on small agencies, since staff 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 agency 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 →