A buyer persona is a filter set plus a short card. If you cannot run it as a search, it is a guess. This guide builds three personas from live counts and checks each one against real profiles.
TL;DR
- Define each persona as filters (function, level, company size, country), then size it with a free count.
- Check the persona against 25 real profiles before you write any messaging.
- Takes about 30 minutes and spends about 28 records: 25 profiles plus 3 enrichments. Counts cost nothing.
Prerequisites
- A free LeadOcean key from app.leadocean.io. Free is 1,000 records for life, no card, 5 requests a second.
export LEADOCEAN_API_KEY=...in your shell.curlandjq. Optional: the LeadOcean MCP server athttps://api.leadocean.io/mcp, which gives Claude the same free count tool.
Step 1: Write the persona as filters
Start with the role, not the adjectives. Four fields do most of the work: jobFunction, jobLevel, employeeRange and country. Enum values are exact strings, so list them first (free):
curl -s "https://api.leadocean.io/v1/enums" -H "x-api-key: $LEADOCEAN_API_KEY" | jq 'keys'Our example persona is the IT decision maker at a mid-size US company:
{
"jobFunction": ["Information Technology"],
"jobLevel": ["VP", "C-Team"],
"employeeRange": ["201-500", "501-1000"],
"country": ["US"]
}Write one such block per persona. Two or three is enough. More than five means you are segmenting, not profiling.
Step 2: Size each persona with a free count
A persona with 40 reachable people is a niche. One with 400,000 needs another filter. Send count=true as a query parameter with limit=1:
curl -s "https://api.leadocean.io/v1/people/search?count=true&limit=1" \
-H "x-api-key: $LEADOCEAN_API_KEY" \
-H "content-type: application/json" \
-d '{"jobFunction":["Information Technology"],"jobLevel":["VP","C-Team"],"employeeRange":["201-500","501-1000"],"country":["US"]}' \
| jq '.meta'The data array comes back empty and meta.countOnly is true, so nothing is spent. meta.total is capped at 100,000.
In Claude, ask the same question through the MCP tool leadocean_count_leads. It also reports distinctCompanies, the number of employers the people span. That tells you whether you have many buyers at few accounts or the reverse.
Step 3: Pull 25 real profiles
Counts show size. Profiles show who these people are. Pull one page of 25 and read the titles:
curl -s "https://api.leadocean.io/v1/people/search" \
-H "x-api-key: $LEADOCEAN_API_KEY" \
-H "content-type: application/json" \
-d '{"jobFunction":["Information Technology"],"jobLevel":["VP","C-Team"],"employeeRange":["201-500","501-1000"],"country":["US"],"limit":25}' \
| jq -r '.data[] | .contact_data.contact_current_experiences[0] | [.job_title, .company_name] | @tsv'This spends 25 records. Read the titles and write down the three most common. If half of them say "Chief Information Officer" and the rest are all different, your persona is a CIO persona. Tighten title and move on.
Do not paste the names into your persona card. A persona is a pattern, not a person.
Step 4: Add career history to see where they came from
Pick two or three profiles and enrich them by person_id (at meta.source_ids.person_id on each search row). Each enrich is one record. Person enrich returns resume_data, which holds past roles, education and certifications when we hold them.
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_STEP_3"}' \
| jq '.data.resume_data.experiences[] | {job_title, company_name}'Past employers carry no company_id yet, so read them as text. The pattern you want: did they come up through infrastructure, security or software? That decides which pain you lead with.
Step 5: Write the card
Keep it to what changes your outreach. Five lines:
Persona: IT leader, mid-size US company
Filters: jobFunction IT, jobLevel VP or C-Team, 201-1000 staff, US
Size: <count from step 2>, across <distinctCompanies> employers
Common titles: <top 3 from step 3>
Likely pain: <one sentence you can defend from the profiles>
Channel: work email first, phone secondThen save the filter block next to it. Next quarter you re-run the count and see if the persona grew or shrank. For the map across a whole account, see the persona map and persona-based marketing definitions.
Step 6: Compare personas and put them to work
Run Step 2 once per persona and put the counts in one table. The comparison is the point. A persona that is 10 times larger than the others gets the first campaign.
for level in '["C-Team"]' '["VP"]' '["Director"]'; do
echo -n "$level: "
curl -s "https://api.leadocean.io/v1/people/search?count=true&limit=1" \
-H "x-api-key: $LEADOCEAN_API_KEY" -H "content-type: application/json" \
-d "{\"jobFunction\":[\"Information Technology\"],\"jobLevel\":$level,\"employeeRange\":[\"201-500\",\"501-1000\"],\"country\":[\"US\"]}" \
| jq -r '.meta.total'
doneThree calls, zero records. Use the result in three places:
- Outbound: one list and one message per persona. Export the list with
POST /v1/exportsonce the filters are final (bulk CSV export is not on Free). - Content: write for the largest persona first. The common titles from Step 3 are your headline vocabulary.
- Review: re-run the counts each quarter and keep the filter block in version control.
Do not build a fourth persona until the first three have each had a campaign. The data tells you who exists. Replies tell you who cares.
What you get
Here is a real run of leadocean_count_leads on 21 October 2026, with the Step 1 filters. It spent 0 records.
{
"total": 12312,
"totalIsExact": true,
"totalAll": 31051,
"distinctCompanies": 6784,
"facets": {
"seniority": [
{"value": "c_suite", "count": 11176},
{"value": "vp", "count": 1130}
],
"company_size": [
{"value": "201-500", "count": 6560},
{"value": "501-1000", "count": 5752}
]
}
}total is the mailable count (verified, catch-all valid or catch-all email), not everyone matching. totalAll is the same filters with no email condition. The industry facet was led by Hospitals and Health Care (1,261), Higher Education (1,085) and Government Administration (796). That is a finding: this persona leans toward healthcare, education and government, and Software Development has only 399. Set industry if your product sells to software teams.
A profile record from Step 3 follows the response shape from the API reference. Values below are placeholders.
{
"success": true,
"data": [
{
"profile_data": {
"profile_full_name": "Jane Doe",
"profile_headline": "CIO at Acme"
},
"contact_data": {
"has_email": true,
"email_status": "verified",
"email_type": "work",
"contact_current_experiences": [
{ "job_title": "Chief Information Officer", "company_name": "Acme", "company_domain": "acme.com" }
]
},
"meta": { "source_ids": { "person_id": "1234567" }, "fetched_at": "2026-10-01" }
}
],
"meta": { "count": 1, "limit": 25, "credits": 1, "nextCursor": "..." }
}Troubleshooting
| Error | Cause | Fix |
|---|---|---|
| 401 | Missing or wrong x-api-key header | Re-export $LEADOCEAN_API_KEY and check the header name. |
| 429 | Above the plan's rate limit (5 a second on Free, 200 on Agency) | Honor Retry-After, or batch your persona counts one at a time. |
| 402 | The 1,000 free records are spent | Counts stay free. Move to Solo at $97 a month for more records. |
| Empty results | A bad enum value, such as VP Sales for jobLevel | Use exact strings: C-Team, VP, Director, Manager, Staff, Other. |
meta.depthCapped is true | One search pages to 10,000 rows | Narrow the filters instead of paging further. |
| 400 on a count | count=true sent in the JSON body, which rejects unknown fields | Send it as a query parameter, with limit=1. |
FAQ
How many buyer personas does a B2B team need?
Two or three. Each one should map to a different filter set and a different message. If two personas share the same filters, they are one persona.
Where should buyer persona data come from?
From the people you sell to. Run the filters, read the titles and career paths of 25 real profiles and write what repeats. Interviews add the pain, and data adds the size.
Does a persona include demographics?
Skip age and gender. Job function, level, company size and country predict who can buy. Add tech stack or funding stage only if it changes the pitch.
Can I build personas inside Claude?
Yes. Connect the MCP server and ask for a count per persona. leadocean_count_leads is free and returns the facet breakdown. For a similar workflow, see using Claude for recruiting.
What does this cost?
Size your buyer persona before you write a word of copy
Free to start. No credit card. 1,000 records to spend whenever you like.
Get your free API key →