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 Recruiting and Staffing Firms (Owners, Sales Leads and Operations)

Find the buying committee, size the list with a free count, and pull only the rows you will email.

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

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.
  • curl and jq, or any HTTP client. Optional: the hosted MCP server at https://api.leadocean.io/mcp if 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:

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

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

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

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

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

RoleFilter
Owner or founderseniority: ["owner", "founder"]
Sales or business development leadjobLevel: ["Director", "VP", "C-Team"], jobFunction: ["Sales & Business Development"]
HR, IT or operations leadjobLevel: ["Director", "VP", "C-Team"], jobFunction: ["Human Resources", "Information Technology", "Operations"]
Executive sponsorseniority: ["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.

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

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

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

  1. Wave one. Owners with a verified email at firms of 11 to 50 people. These are owner-operators and decide fast.
  2. Wave two. Owners and C-level people at firms of 51 to 200 people, plus the sales lead at the same firm.
  3. Wave three. catch_all addresses 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.

FilterResult
Owner or C-level, 11 to 200 employees9,166 mailable (38,294 with no email filter), 3,940 employers
Director/VP/C-Team, Sales & Business Development, 51 to 500 employees931 mailable (3,356 with no email filter), 498 employers
Director/VP/C-Team, Human Resources, 51 to 500 employees499 mailable (1,939 with no email filter), 296 employers
Director/VP/C-Team, Information Technology or Operations, 51 to 500 employees554 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.

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, "limit": 100, "credits": 1, "nextCursor": "CURSOR" }
}

Troubleshooting

ErrorCauseFix
401Missing or wrong x-api-keyCheck $LEADOCEAN_API_KEY is exported and sent as the x-api-key header.
429Above the plan's rate limit (5 a second on Free, 200 on Agency)Back off and honor Retry-After.
402Out of records on the Free planThe 1,000 records are spent. Move to Solo ($97 a month) or Agency ($497 a month).
Empty resultsBad enum value, such as Staffing as an industry or Owner in jobLevelResolve values with GET /v1/enums/{name} or leadocean_list_enum_values.
Export refusedOver 50,000 rows a request or 500,000 a daySplit 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 →