The reliable way to reach a CHRO is a direct dial or mobile from a contact database. The company switchboard routes you to an HR inbox, and a guessed number reaches a stranger.
TL;DR
- Sizing a CHRO list is free. A search costs 1 record per person returned, and a phone lookup costs 1 record per call.
- Filter on
hasPhonefirst, so you only spend records on people we hold a number for. Ten minutes covers one CHRO. - For a list, search and then export.
POST /v1/exportstakes up to 50,000 rows a request and 500,000 a day.
Prerequisites
- A LeadOcean API key from the free plan: 1,000 records for life, no card. Export it as
$LEADOCEAN_API_KEY. curlandjq.- A target: a company domain such as
acme.com, or a segment such as CHROs in one country. - A calling policy for your market. See Step 4.
Step 1: Know which number you are after
A CHRO has three kinds of number. Each one behaves differently when you dial it.
- Switchboard: the main company line. Always findable, and it lands on HR operations or a reception desk.
- Office direct: a desk line. Often answered by an executive assistant.
- Mobile: the best number, and the one to treat with the most care.
The v2 phone endpoint labels each number mobile, direct or office, best first. Take the label as a hint about the line, not a promise about who answers.
Titles vary. The role appears as CHRO, Chief Human Resources Officer, Chief People Officer or Chief Talent Officer. Search more than one title so you do not miss the person.
Step 2: Size the list for free
Count the CHROs you could reach before you spend anything. A search with count=true as a query parameter and limit 1 returns a total and no rows. It costs nothing.
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 '{
"title": ["CHRO", "Chief Human Resources Officer", "Chief People Officer"],
"seniority": ["c_suite"],
"country": ["US"],
"hasPhone": true,
"limit": 1
}' | jq '.meta'hasPhone: true drops everyone we hold no number for. Filter values are arrays and enums are exact strings, so check them with GET /v1/enums if a result looks wrong. The total is capped at 100,000.
The same count runs from Claude with the MCP tool leadocean_count_leads, which is also free.
Step 3: Get the number for one CHRO
If you know the company, search its people by domain and title. The search costs 1 record per person returned. Then fetch every number we hold by the row's meta.source_ids.person_id.
curl -s -X POST "https://api.leadocean.io/v1/people/search" \
-H "x-api-key: $LEADOCEAN_API_KEY" \
-H "content-type: application/json" \
-d '{ "domain": ["acme.com"], "title": ["Chief Human Resources Officer", "Chief People Officer"], "limit": 1 }'
curl -s "https://api.leadocean.io/v2/people/phone?person_id=PERSON_ID" \
-H "x-api-key: $LEADOCEAN_API_KEY"The phone call costs 1 record, including a call that finds nothing. If you already hold the CHRO's LinkedIn URL, call the phone endpoint with linkedin_url and skip the search. There is no lookup by name plus domain.
In Claude, the MCP tool leadocean_find_phone does the same lookup for 1 record.
Step 4: Check before you dial
A number in a database is not permission to call it. The v2 phone response does not publish a do-not-call flag. Its absence is not clearance.
Check the do-not-call and telemarketing rules for the country you are calling, and for mobiles in particular. Rules for business calls differ by country, so ask counsel if you are unsure. Log who you called, when and why.
A CHRO who picks up a mobile expects a reason in the first ten seconds. If you cannot give one, send a short email first and call after. Stop after two attempts a day.
Dial in business hours in the CHRO's time zone. Lead with a reason tied to their workforce, hiring plan or HR stack, not a script.
Step 5: Pull numbers at scale
A list changes the job. You stop looking up one person and start choosing a segment, so the filters matter more than the endpoint. CHROs at 1001-5000 person companies run real HR budgets and buy tools. At 10001+ they sit behind layers of staff, and a direct dial there is worth less.
For a list, export the searched segment. The export takes the same filters as search and asks for columns by id from GET /v1/exports/columns. phone_N_number comes back as phone_1_number and phone_2_number.
curl -s -X POST https://api.leadocean.io/v1/exports \
-H "x-api-key: $LEADOCEAN_API_KEY" \
-H "content-type: application/json" \
-d '{
"filters": {
"title": ["CHRO", "Chief Human Resources Officer", "Chief People Officer"],
"seniority": ["c_suite"],
"country": ["US"],
"hasPhone": true
},
"columns": ["profile_full_name", "current_job_title", "current_company_name", "phone_N_number", "phone_N_type"],
"limit": 5000
}'Bulk CSV export is not on the Free plan. Solo at $97 a month includes it, and Agency at $497 a month adds 200 requests a second and 5 keys for teams. Prefer the app? The Exports page at app.leadocean.io has a filter builder, a column picker and a price preview before you download.
One search pages to 10,000 rows. Narrow the filters, by country or company size, rather than walking past that.
What you get
First, a live count from the free leadocean_count_leads tool, run on 2026-10-21. It filtered on title Chief Human Resources Officer, country US and hasPhone. It is a count of people with a phone on file, not a mailable count.
{
"total": 12717,
"totalIsExact": true,
"distinctCompanies": 9361,
"credits": 0,
"facets": {
"company_size": [
{ "value": "1001-5000", "count": 2869 },
{ "value": "201-500", "count": 2111 },
{ "value": "51-200", "count": 2019 }
]
}
}The title match is loose, so a few of the 12,717 are not C-level. Add "seniority": ["c_suite"] to tighten it.
Second, the response shape of a phone lookup, from the API reference, with placeholder values. It is not a real record.
{
"success": true,
"data": {
"found": true,
"phones": [
{ "phone": "+1 415 555 0133", "type": "mobile" },
{ "phone": "+1 415 555 0100", "type": "office" }
]
}
}The array position is the priority. Try the first number first. The endpoint returns data and no meta object, so read your spend from GET /v1/usage.
Troubleshooting
| Error | Cause | Fix |
|---|---|---|
| 401 | Missing, wrong or revoked key | Check that x-api-key carries $LEADOCEAN_API_KEY and the key is active in the app. |
| 402 | Free plan: the 1,000 records are spent | The allowance is one-off. Move to Solo at $97 a month to keep going. |
| 429 | Above the plan's rate limit: 5 a second on Free, 50 on Solo, 200 on Agency | Honour Retry-After. Slow the loop or upgrade the plan. |
| Empty results | A bad enum value, such as chro for a level | Use exact strings from GET /v1/enums, and arrays for every filter. |
found: false | We hold no number for that person | It still costs 1 record on v2. Filter with hasPhone first to avoid it. |
| Export refused | Over 50,000 rows a request or 500,000 a day | Split the export by country or headcount band. |
FAQ
Can I find a CHRO's phone number for free?
For a few, yes. The free plan gives you 1,000 records for life, with no card. Sizing a list costs nothing.
Is the HR switchboard enough?
Rarely. It reaches a gatekeeper or an HR service desk. A direct dial or mobile reaches the person, which is why this guide filters on hasPhone.
Is it legal to call a CHRO's mobile?
It depends on the country and on whether the line is registered as do-not-call. We publish no compliance flag, so check the rules where you call and keep a call log.
How many people do you hold numbers for?
We hold a phone for 166M people (measured September 2026). The count for CHROs in your country is a free call in Step 2.
Where do I go next?
To find other roles, read how to find a VP of Sales phone number. The find phone number endpoint and the Claude skill cover the lookup in depth. Plans are on the pricing page.
Get a CHRO's direct dial, not the HR switchboard
Free to start. No credit card. 1,000 records to spend whenever you like.
Get your free API key →