Staffing firms are owner-led and small. Map the buying committee to seniority and function filters, count it for free, then pull only the rows you will email.
TL;DR
- Most staffing firms are small, so the owner or founder is usually the buyer. Larger firms add a sales or business development lead, an HR or operations lead and a C-level sponsor.
- Size the list with a free count, then pull a 100-row sample. The recipe takes about 25 minutes and spends 100 records at most.
- On 2026-10-21 the free count found 9,166 mailable owners and C-level people at US staffing and recruiting firms with 11 to 200 employees, across 3,940 employers.
Prerequisites
- A LeadOcean account. The Free plan gives 1,000 records for life, no card, 5 requests a second. Sign up at app.leadocean.io.
- An API key stored as
$LEADOCEAN_API_KEY. curlandjq, or any HTTP client. Optional: the hosted MCP server athttps://api.leadocean.io/mcpif you work from Claude.
Base URL is https://api.leadocean.io. Every request carries the header x-api-key.
Step 1: Pick the buying committee
Know who signs before you query. This guide is for vendors selling software, services or data to recruiting and staffing firms: applicant tracking, VMS and payroll tools, sourcing data, insurance, funding and the like.
Most deals touch four roles:
- Owner or founder. Signs almost everything. In a firm under 50 people this is often the only approver.
- Sales or business development lead. A director or VP who owns client acquisition. Buys anything that fills more reqs.
- HR, talent or operations lead. Runs the recruiter stack, onboarding and compliance. Runs the pilot for software.
- Executive sponsor. A C-level person such as a COO or CFO. Appears on larger firms.
Write the committee down as filter sets before you query anything:
owner: { seniority: [owner, founder] }
sales: { jobLevel: [Director, VP, C-Team], jobFunction: [Sales & Business Development] }
operations: { jobLevel: [Director, VP, C-Team], jobFunction: [Human Resources, Information Technology, Operations] }
sponsor: { seniority: [c_suite] }One data note. In this industry the owner field is more reliable than the job function field. Many agency owners carry a function of General Business or Other. Filter on seniority first, function second.
Step 2: Resolve the industry value
Filter values are exact strings. The industry list has 534 values. Check them before you guess.
curl -s -G "https://api.leadocean.io/v1/enums/industry" --data-urlencode "q=staffing" \
-H "x-api-key: $LEADOCEAN_API_KEY" | jq -r '.data.values[]'In Claude with the MCP server connected, the free tool does the same job.
leadocean_list_enum_values({ name: "industry", q: "staffing" })On 2026-10-21 both the staffing and the recruit lookups returned one value: Staffing and Recruiting. Use that string. It covers both temp agencies and retained search firms, so split them later with keywords.
Step 3: Size the company list for free
Count companies first. A company count is free and tells you whether the segment can carry an outbound motion.
curl -s -G "https://api.leadocean.io/v1/companies/count" \
-H "x-api-key: $LEADOCEAN_API_KEY" \
--data-urlencode "industry=Staffing and Recruiting" \
--data-urlencode "hqCountry=US" \
--data-urlencode "employeeRange=11-50,51-200" | jq '.data.total'Array filters in a GET query are comma-separated. The same call as an MCP tool is leadocean_count_companies. It spends no records and returns breakdowns by headcount band, HQ state and NAICS code, so you see where the segment clusters.
On 2026-10-21 it returned 14,580 US staffing and recruiting companies with 11 to 200 employees. 11,173 of them have 11 to 50 people. California led with 1,884, then Texas with 1,494 and New York with 1,127. The largest NAICS code was 561311 (employment placement agencies), with 10,144 companies.
Step 4: Build the people filter
Search takes a flat JSON body. Filters are arrays. The count=true query parameter makes the call a free sizing call: data comes back empty and meta.total is capped at 100,000.
curl -s -X POST "https://api.leadocean.io/v1/people/search?count=true" \
-H "x-api-key: $LEADOCEAN_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"industry": ["Staffing and Recruiting"],
"country": ["US"],
"employeeRange": ["11-50", "51-200"],
"seniority": ["owner", "founder", "c_suite"],
"limit": 1
}'Build one filter per committee role.
| Role | Filter |
|---|---|
| Owner or founder | seniority: ["owner", "founder"] |
| Sales or business development lead | jobLevel: ["Director", "VP", "C-Team"], jobFunction: ["Sales & Business Development"] |
| HR, IT or operations lead | jobLevel: ["Director", "VP", "C-Team"], jobFunction: ["Human Resources", "Information Technology", "Operations"] |
| Executive sponsor | seniority: ["c_suite"] |
Enum values are case-exact: C-Team, VP, Director. Seniority is lowercase.
Step 5: Pull a sample and check email status
Spend a small number of records to check quality before a bulk pull. Page size is 1 to 100 and pagination uses cursor.
curl -s -X POST "https://api.leadocean.io/v1/people/search" \
-H "x-api-key: $LEADOCEAN_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"industry": ["Staffing and Recruiting"],
"country": ["US"],
"employeeRange": ["11-50", "51-200"],
"seniority": ["owner", "founder"],
"emailStatus": ["verified", "catch_all_valid"],
"limit": 100
}' | jq '.data | length, (.[0] | keys)'This spends up to 100 records. Read email_status on every row. LeadOcean does not refund bounces, so send to verified first and treat catch_all as a second wave.
One search pages to 10,000 rows. If meta.depthCapped is true, narrow the filters instead of walking further. Add a state or a headcount band.
Step 6: Export the rows you will email
For lists above a sample, use an export. It takes up to 50,000 rows a request and 500,000 a day. Bulk CSV export is not on the Free plan.
curl -s -X POST "https://api.leadocean.io/v1/exports" \
-H "x-api-key: $LEADOCEAN_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"name": "us-staffing-owners",
"filters": {
"industry": ["Staffing and Recruiting"],
"country": ["US"],
"employeeRange": ["11-50", "51-200"],
"seniority": ["owner", "founder"],
"emailStatus": ["verified"]
},
"limit": 5000
}'You can also do this in the app at app.leadocean.io. The Exports page has a filter builder, a column picker, the record price before you start, and a CSV download. It is not a sequencer. Load the CSV into the tool you already send from.
Step 7: Match the message to the role
One angle per role:
- Owner or founder. Lead with placements, margin or fill rate. Owners watch gross profit per recruiter. Name the number you move.
- Sales or business development lead. Lead with new client flow. They are measured on job orders won, so open with how you reach hiring managers outside the usual job boards.
- HR, talent or operations lead. Lead with recruiter time, onboarding and compliance paperwork. Offer a short pilot on one desk or one branch.
- Executive sponsor. Lead with margin and risk. Say plainly how your product handles candidate data, and only say what is true.
Keep each email under 90 words with one ask. Do not name a customer you have not cleared.
Mind the market. Staffing demand swings with hiring cycles, and a firm with open reqs has no time for a demo. Ask for 15 minutes, not a long call.
In a firm under 50 people, write to the owner first. Delegation is short, and one yes closes it. In a firm of 200 or more, start with the sales or operations lead, then pass the idea up with their problem stated in business terms. Never send the same template to two roles.
Step 8: Keep the list clean
Re-run the free count before every send, with the Step 4 body saved as owners.json:
curl -s -X POST "https://api.leadocean.io/v1/people/search?count=true" \
-H "x-api-key: $LEADOCEAN_API_KEY" \
-H "Content-Type: application/json" \
-d @owners.json | jq '.meta.total'The dataset refreshes monthly, so re-run the count monthly. Staffing has high turnover, and owners sell, merge and rebrand. If the total drops, re-pull the accounts you are working and drop anyone whose title no longer matches.
Person enrich returns career history too: past roles, education and certifications. Use it to open with a real detail, such as a prior agency you both know.
Step 9: Work the list in waves
Do not send to 9,166 people at once. Split the list into waves and learn from each.
- Wave one. Owners with a
verifiedemail at firms of 11 to 50 people. These are owner-operators and decide fast. - Wave two. Owners and C-level people at firms of 51 to 200 people, plus the sales lead at the same firm.
- Wave three.
catch_alladdresses and the operations lead.
Track replies per role and per headcount band. Drop the band that does not answer after two touches. The free count lets you resize any wave in seconds, so adjust the filters instead of guessing.
Segment by firm type if you can. Light industrial, healthcare, IT contract and executive search shops buy different tools. Use keywords or companyKeywords in the search body to separate them, then check a 25-row sample before you trust the split.
What you get
Free counts run on 2026-10-21 with the MCP tool leadocean_count_leads. The industry filter is Staffing and Recruiting and country is US. People figures are mailable (verified, catch_all_valid or catch_all) unless the row says otherwise.
| Filter | Result |
|---|---|
| Owner or C-level, 11 to 200 employees | 9,166 mailable (38,294 with no email filter), 3,940 employers |
| Director/VP/C-Team, Sales & Business Development, 51 to 500 employees | 931 mailable (3,356 with no email filter), 498 employers |
| Director/VP/C-Team, Human Resources, 51 to 500 employees | 499 mailable (1,939 with no email filter), 296 employers |
| Director/VP/C-Team, Information Technology or Operations, 51 to 500 employees | 554 mailable (2,071 with no email filter), 346 employers |
The shape is clear. The owner layer is wide and the specialist layer is thin. Of the 9,166 owners and C-level people, 4,677 are tagged owner and 4,489 c_suite (none came back as founder), and 5,782 sit in firms of 11 to 50 people. Plan to reach owners in small firms and one specialist in each larger firm.
Response shape from the API reference, placeholder values only. Search rows carry no contact points; enrich by person_id with reveal_email for the address.
{
"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, "limit": 100, "credits": 1, "nextCursor": "CURSOR" }
}Troubleshooting
| Error | Cause | Fix |
|---|---|---|
| 401 | Missing or wrong x-api-key | Check $LEADOCEAN_API_KEY is exported and sent as the x-api-key header. |
| 429 | Above the plan's rate limit (5 a second on Free, 200 on Agency) | Back off and honor Retry-After. |
| 402 | Out of records on the Free plan | The 1,000 records are spent. Move to Solo ($97 a month) or Agency ($497 a month). |
| Empty results | Bad enum value, such as Staffing as an industry or Owner in jobLevel | Resolve values with GET /v1/enums/{name} or leadocean_list_enum_values. |
| Export refused | Over 50,000 rows a request or 500,000 a day | Split by state or headcount band and run several exports. |
FAQ
Which industry value should I use for staffing firms?
Use Staffing and Recruiting. It is an exact string in the 534-value industry list. Resolve it with the free enum lookup before you query.
How many staffing contacts can I get for free?
The Free plan gives 1,000 records for life, no card. Counts never spend records, so you can size the whole segment first and pull a 100-row sample.
Can I get phone numbers for agency owners?
Yes, through GET /v2/people/phone or the find_phone MCP tool. Each call costs one record, including a call that finds nothing.
Does this replace my sequencer or CRM?
No. LeadOcean returns data through an API, an MCP server and an app with an Exports page. Send from the tool you already use.
Related reading: lead generation for web3, lead generation for travel, lead generation for telecom, pricing and the blog hub.
Size your staffing and recruiting list before you spend a record
Free to start. No credit card. 1,000 records to spend whenever you like.
Get your free API key →