The fastest way to find a Sales Director's phone number is to search a people database for Directors in sales, keep the ones flagged with a phone, then pull the direct dial by person id. A switchboard gets you a gatekeeper. A direct dial or mobile gets you the Director.
TL;DR
- Search with
jobLevel: Director,jobFunction: Sales & Business DevelopmentandhasPhone: true. Size the list free, then pull numbers only for people you will call. - Time: about 15 minutes for one Director, about 30 for a list of 500. Cost: 1 LeadOcean record per number pulled.
- Check the calling rules first. An API returns a number, not permission to dial it.
Prerequisites
- A LeadOcean account on the free plan: app.leadocean.io/register. Free gives you 1,000 records for life, every feature and 5 requests a second.
- An API key from the app, exported as
$LEADOCEAN_API_KEY. curlandjq.- A target: a company domain for one Director, or a filter set for a list.
Step 1: Pick the right Director and the right kind of number
"Sales Director" is a title, not a level. Companies also write Director of Sales, Sales Director EMEA or Director, Business Development. Filtering on the level Director plus the function Sales & Business Development catches them in one pass.
A main line rings reception. A direct dial or mobile rings the person. A switchboard adds a gatekeeper between you and the Director.
LeadOcean returns each number with a type: mobile, direct or office. Take mobile and direct first. Treat office as a fallback.
Step 2: Size the Sales Director list for free
Count before you spend. A count costs 0 records. Ask the MCP tool leadocean_count_leads, or send count=true with limit=1 as query parameters on the search endpoint.
curl -s -X POST "https://api.leadocean.io/v1/people/search?count=true&limit=1" \
-H "x-api-key: $LEADOCEAN_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"jobLevel": ["Director"],
"jobFunction": ["Sales & Business Development"],
"country": ["US"],
"hasPhone": true
}'meta.total is capped at 100,000 on this call, so use the MCP count for the exact figure. Enum values are exact strings, so check them with leadocean_list_enum_values before you filter.
Step 3: Search for Directors who have a phone on file
Search returns people, one record per row. Filters are arrays, the body is flat JSON, and limit runs 1 to 100.
curl -s -X POST "https://api.leadocean.io/v1/people/search" \
-H "x-api-key: $LEADOCEAN_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"jobLevel": ["Director"],
"jobFunction": ["Sales & Business Development"],
"country": ["US"],
"employeeRange": ["51-200"],
"hasPhone": true,
"limit": 25
}' | jq '.meta, (.data | length)'Page on with meta.nextCursor. One search stops at 10,000 rows (meta.depthCapped), so narrow by industry or headcount instead of paging deeper. To find one named company's Sales Director, use GET /v1/companies/{domain}/people and read the title column.
Step 4: Pull the direct dial
Spend records last. Each phone pull is one record, so a 25-person test batch costs 25 records on the free plan.
Take the person id from meta.source_ids.person_id on a search row and ask for the phone. This costs 1 record per call, including a call that finds nothing.
curl -s "https://api.leadocean.io/v2/people/phone?person_id=1234567" \
-H "x-api-key: $LEADOCEAN_API_KEY" | jqNumbers come back best first. In Claude or any MCP client, the tool leadocean_find_phone does the same job.
For a list over a few hundred people, skip the loop. Start an export with POST /v1/exports. One export takes up to 50,000 rows, and an account gets 500,000 a day. Bulk CSV export is not on Free: it comes with Solo ($97 a month) and Agency ($497 a month, 50k rows a file). See pricing.
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-sales-directors-with-phone",
"filters": {
"jobLevel": ["Director"],
"jobFunction": ["Sales & Business Development"],
"country": ["US"],
"hasPhone": true
},
"limit": 500,
"preset": "full",
"reveal": "email_phone"
}'Poll GET /v1/exports/{id}, then fetch GET /v1/exports/{id}/download. You can build the same export in the app: filter builder, column picker, price preview, then download.
Step 5: Check what you may call before you dial
Having a number is not the same as being allowed to call it. The rules differ by country, by whether the line is a mobile, and by whether you use an autodialer or a recorded message.
- The API does not return a usable do-not-call flag. The v2 phone endpoint omits
dncbecause the field is unpopulated at source. Its absence is not clearance. - Run your own list through the registries that apply to you before a campaign.
- Rules for calls to businesses differ by market. Ask your counsel which rules cover your target country.
- A Director at a small firm may give out a personal mobile as the business line. Keep a suppression list and honour opt-outs.
This is not legal advice.
What you get
Expect a short list, not a dump. Most Directors in a mid-size slice will have a number on file, a few will not, and some numbers will be an office line. Sort by type and call direct and mobile first.
A free count run on 2026-10-21 with leadocean_count_leads (jobLevel Director, jobFunction Sales & Business Development, country US, hasPhone true, no email filter). It is a phone-flag count. It is not a verified-number count.
{
"total": 589483,
"totalIsExact": true,
"distinctCompanies": 207693,
"credits": 0,
"facets": {
"country": [{ "value": "US", "count": 589483 }],
"industry": [
{ "value": "Software Development", "count": 39592 },
{ "value": "Retail", "count": 33514 },
{ "value": "Advertising Services", "count": 24162 }
],
"company_size": [
{ "value": "10001+", "count": 107066 },
{ "value": "11-50", "count": 94317 },
{ "value": "51-200", "count": 89345 }
]
}
}The phone call returns this shape. It is the response shape from the API reference, with placeholder values.
{
"success": true,
"data": {
"found": true,
"phones": [
{ "phone": "+1 415 555 0133", "type": "direct" },
{ "phone": "+1 415 555 0134", "type": "office" }
]
}
}The function filter is a classification, so a few rows will be a Director of customer success or marketing. Read the title column before you dial.
Troubleshooting
| Error | Cause | Fix |
|---|---|---|
| 401 | Missing or wrong x-api-key header | Re-export $LEADOCEAN_API_KEY from the app's API keys page |
| 429 | Above your plan's rate limit (5 a second on Free, 200 on Agency) | Wait for the Retry-After header, then slow the loop |
| 402 | Out of records. Free is 1,000 for life | Check GET /v1/usage, or move to a paid plan |
| Empty results | A bad enum value, such as director for jobLevel (it is Director) | Look up exact strings with leadocean_list_enum_values |
found: false on the phone call | No number held for that person | Skip them. The call still costs 1 record |
| 400 on an export | Over the 50,000-row ceiling, or a filter that cannot be applied | Lower limit or split the filter set |
FAQ
Is a Sales Director's direct dial better than the company main line?
Yes. A main line routes through reception or a queue. A direct dial or mobile skips that step and lands on the person.
Can I find a Sales Director's number from a LinkedIn URL?
Yes. GET /v2/people/phone accepts linkedin_url as well as person_id. It costs 1 record per call.
How do I find Sales Director numbers at scale?
Search with hasPhone: true, size the list for free, then run POST /v1/exports with phone columns. The full preset includes up to 2 phones per person by default.
Does LeadOcean tell me if a number is on a do-not-call list?
No. Check your own list against the registries that apply to your market.
What about other titles?
See VP of Sales for the level above, HR Director and Marketing Director for the same method on other functions. The full product is find phone number.
Pull your first Sales Director direct dial on the free plan
Free to start. No credit card. 1,000 records to spend whenever you like.
Get your free API key →