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. 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 roles before you touch a filter. Agencies split into three groups, and each reads a cold email differently.
| You sell | Economic buyer | Champion | Operator |
|---|---|---|---|
| Reporting, ads or SEO tooling | Founder, CEO | Head of paid media, head of SEO | Operations lead |
| Freelance talent, white-label work | Founder, managing partner | Head of creative, head of delivery | Finance lead |
| Data, leads or software for client work | CEO, head of growth | Head of strategy, head of accounts | Operations 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.
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[]'
doneThe 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.
{
"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.
{
"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.
{
"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
jobFunctionset toAdvertising & Marketingfor service-line leads,Operationsfor delivery andFinance & Accountingfor the margin watchers. - Region. Use
hqCountryfor the agency andcountryfor 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.
{
"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.
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.
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.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. 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.
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 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 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.
| Filters | Mailable people | Employers | All people, any email |
|---|---|---|---|
| C-Team or VP | 338,606 | 126,644 | 1,404,650 |
Advertising & Marketing function, Director, VP or C-Team | 54,364 | 24,352 | 161,871 |
| C-Team or VP, 11-50 employees | 73,512 | 27,936 | 247,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):
{
"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
| 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 Marketing Agency for industry | Look the value up with /v1/enums 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 "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 →