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

How-to guide

How to Find an Email From a Crunchbase Profile (2026)

Start with a Crunchbase company page and end with a founder's work email you can check before you send. Manual way first, then the API, then the bulk way.

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

TL;DR

  • A Crunchbase profile gives you a company, a website and names. Take the website domain, find the founder in LeadOcean, then ask for their checked work email. Two calls.
  • It takes about 15 minutes the first time, mostly getting a key. Each person costs about 2 records of your 1,000 free ones: 1 for the search row and 1 for the email.
  • For a list, loop the same two calls over a file of domains. Speed is per plan: 5 requests a second on Free, 50 on Solo, 200 on Agency.

Prerequisites

  • A LeadOcean account and key from app.leadocean.io. The free plan has no card and 1,000 records, one-off. Free keys get both the search and enrich scopes.
  • The key in your shell as $LEADOCEAN_API_KEY.
  • curl and jq. For the bulk step, a text file with one company domain per line.
bash
export LEADOCEAN_API_KEY="paste-your-key-here"

Step 1: Read the profile by hand

Open the company's Crunchbase page and copy two things: the website and the names of the founders or executives. That takes a minute and costs nothing.

Crunchbase is built around funding and company facts, not mailboxes. Treat the profile as a source of names and a domain, then get the address somewhere that checks it.

Strip the website down to a bare domain. Search matches on the domain, so https://www.acme.com/about becomes acme.com.

bash
echo "https://www.acme.com/about" | sed -E 's#^https?://##; s#^www\.##; s#/.*$##'
text
acme.com

Step 2: Size the company, then find the founder

Ask how many people we hold at that domain before you spend anything. A count call is free: send count=true as a query parameter with limit 1.

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 '{"domain": ["acme.com"], "limit": 1}' | jq '.meta.total'

Then pull the senior people. The body is flat JSON and every filter is an array. Each person returned costs 1 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"],
    "seniority": ["founder", "c_suite"],
    "limit": 5
  }' | jq -c '.data[] | {person_id: .meta.source_ids.person_id}'

Match the names from the Crunchbase page against the rows. Take the person_id of the person you want. It names a record, and it works even for people with no LinkedIn URL.

Pick the seniority filter to fit the company. A seed-stage startup has founders and little else, so founder is enough. A company that has raised several rounds has a layer of executives, so add c_suite or vp. Enum values are exact strings, and leadocean_list_enum_values lists them for free.

If the search returns nothing, the domain is usually the cause. Crunchbase sometimes lists a marketing site or a parent brand. Try the domain from the company's own email signature or its LinkedIn page, then run the count call again.

Step 3: Get the work email

Send the person_id to the work email endpoint. It returns one address at the person's current employer, or data: null.

bash
curl -s -G "https://api.leadocean.io/v2/people/email/work" \
  -H "x-api-key: $LEADOCEAN_API_KEY" \
  --data-urlencode "person_id=PERSON_ID_FROM_STEP_2" | jq

Only addresses that were checked come back: verified, catch_all_valid or catch_all. So null means "none that qualify", not "this person has no email".

Do not guess the address from a pattern. jane@acme.com and jane.doe@acme.com both look plausible, and neither has been tested. Guessed addresses bounce, and a high bounce rate damages the sending domain you need for the rest of the list.

The call costs 1 record, found or not. If the person's Crunchbase page links a LinkedIn profile, you can send linkedin_url instead of person_id and skip step 2. See the pricing page for what the free plan covers.

Step 4: Run it over a list

Put one domain per line in domains.txt. Loop both calls and write one JSON line per company. This version takes the first founder or executive the search returns, so read a few results before you trust it.

bash
while IFS= read -r domain; do
  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\": [\"$domain\"], \"seniority\": [\"founder\", \"c_suite\"], \"limit\": 1}" \
    | jq -r '.data[0].meta.source_ids.person_id // empty')
  [ -z "$id" ] && continue
  curl -s -G "https://api.leadocean.io/v2/people/email/work" \
    -H "x-api-key: $LEADOCEAN_API_KEY" \
    --data-urlencode "person_id=$id" \
  | jq -c --arg domain "$domain" '{domain: $domain, email: .data.email, status: .data.status}'
done < domains.txt > results.jsonl

Records add up on a loop: 500 companies spend up to 1,000 records. Run 20 domains first and read the hit rate before you run the rest.

When you have an audience definition but no domain list, skip the loop. POST /v1/exports takes the same filters as search and writes a CSV, up to 50,000 rows a request and 500,000 a day. Each row costs 1 record. Bulk CSV export is not on Free: it is included on Solo ($97 a month) and Agency ($497 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": "founders-by-domain",
    "filters": {"domain": ["acme.com", "globex.com"], "seniority": ["founder"]},
    "limit": 100,
    "reveal": "email"
  }' | jq

Step 5: Filter on status before you send

Pick the route by job. Use the single lookup when you have a handful of companies and want to read each one. Use the loop for a list you already hold. Use the export when you describe the audience and let the filters find the people.

An address is not a send list until you have read its status. Keep verified and catch_all_valid. Treat catch_all as a risk you size, not a green light.

bash
jq -c 'select(.email != null and (.status == "verified" or .status == "catch_all_valid"))' \
  results.jsonl > sendable.jsonl
wc -l sendable.jsonl

LeadOcean gives no refund or credit-back for bounced emails, so this filter is your protection.

What you get

Response shape from the API reference, with placeholder values. A search row carries the id you need at meta.source_ids.person_id. The profile fields sit under profile_data and are left out here.

json
{
  "success": true,
  "data": [
    {
      "profile_data": {},
      "meta": { "source_ids": { "person_id": "1234567890" } }
    }
  ],
  "meta": { "count": 1, "nextCursor": null }
}

The work email call returns success and data, with no meta object.

json
{
  "success": true,
  "data": {
    "email": "jane.doe@acme.com",
    "status": "verified",
    "verified_batch_date": "2026-09-20"
  }
}

Troubleshooting

ErrorCauseFix
401Missing, wrong or revoked keyRe-copy the key from app.leadocean.io and re-export $LEADOCEAN_API_KEY. The header name is x-api-key.
429Above your plan's rate limit: 5 requests a second on Free, 50 on Solo, 200 on AgencyWait the Retry-After seconds, add a short sleep between calls, or run fewer workers.
402The free 1,000 records are spentCheck GET /v1/account, or move to Solo at $97 a month or Agency at $497 a month. Paid plans have a fair-use pace, not credits.
404 on the work email callWe hold no record for this person at allTry linkedin_url instead of person_id, or accept the miss.
data: null on the work email callNo checked address at the current employer qualifiesThe call still cost 1 record. Try GET /v2/people/email/personal if a personal address is acceptable for your use.
400 on a search or exportA filter value outside the catalogue, or a body that is not flat JSONResolve enum values with leadocean_list_enum_values or GET /v1/enums. Exports stop at 50,000 rows a request, so split a large one.

FAQ

Does Crunchbase show a work email on a company profile?

Check what your own plan shows in step 1, and do not count on it. The dependable route is to take the domain and the names, then look the person up with a tool that tests the address.

Can I find an email from a Crunchbase profile for free?

Yes. Reading the profile costs nothing. LeadOcean's free plan gives you 1,000 records, one-off, no card, which covers about 500 people at 2 records each.

Do I need the person's LinkedIn URL?

No. A person_id from search is enough, and it works for people with no LinkedIn URL. The API has no lookup by name plus domain: search by domain first, then use the id.

How do I know the email will not bounce?

Read the status field. verified means LeadOcean's own verifier accepted the address, and catch_all_valid means the mailbox was confirmed on a catch-all domain. Nothing is a guarantee, and bounced emails are not refunded.

Where do I go for other sources?

See the blog hub and the guides for finding an email from LinkedIn, Twitter and GitHub.

Turn your first Crunchbase profile into a checked founder email

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

Get your free API key →