Pre-Black Friday: 20% off, for as long as you stayEARLYBFon Solo and AgencyEnds Nov 28Start free

How-to guide

How to Find a Sales Director's Email Address (2026)

Look the address up instead of guessing it. Six steps take you from a company domain to a Sales Director email with a deliverability status, plus the patterns to fall back on.

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

The fastest way to find a Sales Director's email is to look it up in a contact database, not to guess it. Search by company domain, level and function, enrich the person, then read the email status before you send. This guide does that against LeadOcean with curl and spends 3 records.

Examples use placeholders (Acme, acme.com, Jane Doe). Swap in your own domain.

TL;DR

  • Sales Director emails come from three places: a database lookup, a pattern guess at the company domain, or public company pages. Only the first gives you a deliverability status.
  • Filter by jobLevel Director and the Sales & Business Development function, enrich with reveal_email, and send only to verified or catch_all_valid addresses.
  • It takes about 10 minutes and spends 3 of the 1,000 free records. Sizing the audience first costs nothing.

Prerequisites

  • A LeadOcean account. The Free plan gives 1,000 records for life, no card: register here.
  • An API key from the app, exported as $LEADOCEAN_API_KEY.
  • curl and jq.
bash
export LEADOCEAN_API_KEY="paste-your-key-here"

Every request goes to https://api.leadocean.io with the header x-api-key. A Free key has both scopes, search and enrich.

Step 1: Size the Sales Director list before you pull it

Send count=true and limit=1 as query parameters and the call returns a total without spending a record. Filters go in a flat JSON body, and every filter is an array of strings.

bash
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"],
    "salesRegion": ["EMEA"]
  }' | jq '.meta'

Titles vary: "Director of Sales", "Sales Director", "Director, Business Development". A level plus function filter catches all of them. A title keyword catches only the wording you typed. The cost is that the function also covers Directors of Partnerships and Business Development. Add "title": ["Sales"] to narrow it.

meta.total is capped at 100,000 on the REST search. Enum values are exact strings: Director works, Sales Director as a level returns nothing.

Step 2: Search for the Sales Director at one company

Add the company's domain to find the Sales Director at that account. Each person returned costs one record, so keep limit small.

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 '{
    "domain": ["acme.com"],
    "jobLevel": ["Director"],
    "jobFunction": ["Sales & Business Development"],
    "limit": 2
  }' > directors.json

jq '.data | length' directors.json

Search rows are thin. They carry has_email and has_phone flags, not the address. Read the titles and pick the Director who owns your buyer's segment or region before you spend a record on enrichment.

Large companies can have several Sales Directors. If the account has none, run the same call with "jobLevel": ["VP"] or ["Manager"].

Step 3: Enrich the person to get the email

Each search row carries an id at meta.source_ids.person_id. Send it back to enrich that exact person. Enrich takes exactly one of linkedin_url, email, phone or person_id.

bash
PID=$(jq -r '.data[0].meta.source_ids.person_id' directors.json)

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\": \"$PID\", \"reveal_email\": true}" > person.json

This costs one record. reveal_email costs nothing extra. If we hold nothing for that person, you get a 404 and no charge. There is no name plus domain lookup: search first, then enrich by person_id.

Step 4: Verify before you send

Read the email status and send only to addresses worth sending to. verified and catch_all_valid are safe. catch_all means the domain accepts everything, so the mailbox may not exist.

bash
jq -r '.data.contact_data.contact_emails[]
  | select(.status == "verified" or .status == "catch_all_valid")
  | .email' person.json

Bounced emails are not refunded, so treat every other status as a no-send. Role addresses such as sales@ carry the role status and are not a personal mailbox.

Step 5: Use a pattern only when the lookup finds nothing

When the Director is not in the data, guess at the company domain, then verify the guess before you send. Four patterns cover most corporate mail setups:

text
first.last@acme.com    jane.doe@acme.com
flast@acme.com         jdoe@acme.com
first@acme.com         jane@acme.com
firstl@acme.com        janed@acme.com

Find the pattern from any other address you hold at that domain, then apply it to the Director's name. Never send to an unverified guess. A catch-all domain makes every guess look valid.

Sales Directors manage a team and a number. Keep the first email to four lines, name one pipeline problem, and ask one question.

Step 6: Pull the whole list as a CSV

For a list rather than one person, start an export. POST /v1/exports takes up to 50,000 rows a request and 500,000 a day. Each row costs one record. Bulk CSV export is not on Free: it is included from Solo at $97 a month.

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": "sales-directors-emea",
    "filters": {
      "jobLevel": ["Director"],
      "jobFunction": ["Sales & Business Development"],
      "salesRegion": ["EMEA"]
    },
    "limit": 1000,
    "preset": "full"
  }'

Poll GET /v1/exports/{id}, then download the file. The Exports page in the app does the same with a filter builder, a column picker and the record price before you start. It needs no code.

What you get

The Step 1 count is free. The MCP tool leadocean_count_leads ran these filters on 2026-10-21: jobLevel Director, jobFunction Sales & Business Development, split by salesRegion. By default it counts people with a verified, catch_all_valid or catch_all email, so these are mailable counts.

RegionMailable Directors in Sales & Business Development (2026-10-21)
Worldwide705,929
NORAM343,169
EMEA159,312
APAC71,352
LATAM41,991

The four regions sum to 615,824, less than the worldwide figure, because some people carry no region. Without the email condition, the same worldwide filters match 2,617,165 people. Each call returned totalIsExact: true and credits: 0. The REST search stops counting at 100,000, so the MCP count is the one to use for sizing.

A record-level response has the shape below (response shape from the API reference, placeholder values):

json
{
  "success": true,
  "data": {
    "profile_data": { "name": "Jane Doe", "title": "Sales Director", "company": "Acme" },
    "contact_data": {
      "has_email": true,
      "email_status": "verified",
      "contact_emails": [
        { "email": "jane.doe@acme.com", "type": "work", "status": "verified" }
      ]
    }
  },
  "meta": { "source": "leadocean" }
}

Each record carries its own fetched_at date, and the dataset refreshes monthly. Check the date on anything you plan to act on.

Troubleshooting

ErrorCauseFix
401Missing or wrong x-api-key headerRe-export $LEADOCEAN_API_KEY and check the header name
402Out of records. On Free the 1,000 are a one-off allowancePick a paid plan: Solo is $97 a month, Agency $497
429Over the plan's rate limit: 5 requests a second on Free, 200 on AgencyHonour the Retry-After header and back off
Empty dataA filter value is not an exact enum stringList allowed values with GET /v1/enums and copy one
404 on enrichWe hold nothing for that personNo charge. Search again, or use the pattern route in Step 5
Export refusedOver 50,000 rows a request, over 500,000 rows a day, or a Free keySplit the export, wait for the reset, or move to a paid plan

FAQ

Where do Sales Director emails come from?

From a contact database, from a pattern guess at the company domain, or from public pages the company publishes. Only a database lookup returns a deliverability status. Guesses and scraped addresses need verifying before you send.

How many Sales Director emails can I get for free?

The Free plan gives 1,000 records for life with no card. One search row costs one record and one enrichment costs one more, so a verified address for one Director costs about 2 records. Sizing with count=true is free.

Can I find a Sales Director's email from their name and company?

Not in one call. Search by domain or companyName with the level and function filters, then enrich the match by person_id.

Why does a Sales Director email bounce?

Usually the address was guessed, the person moved on, or the domain is catch-all and the mailbox never existed. Read email_status and the record's fetched_at date before you send. Bounced emails are not refunded.

Where do I go next?

The same recipe works for other roles: VP of Sales, IT Director and HR Director. Browse the how-to guides or see pricing.

Find your first Sales Director email with a free API key

Free to start. No credit card. 1,000 records to spend whenever you like.

Get your free API key →