The fastest way to find an ecommerce founder's email is to look it up in a contact database, not to guess it. Search by store domain and seniority, enrich the person, then read the email status before you send. This guide does that against LeadOcean with curl and spends 2 records.
Examples use placeholders (Acme, acme.com, Jane Doe). Swap in your own domain.
TL;DR
- Ecommerce founder emails come from three places: a database lookup, a pattern guess at the store's domain, or the store's own pages. Only the lookup gives you a deliverability status.
- Filter on
seniority: founderand the industryOnline and Mail Order Retail, enrich withreveal_email, and send only toverifiedorcatch_all_validaddresses. - Takes about 10 minutes and spends 2 of the 1,000 free records. Sizing the audience first costs nothing.
Prerequisites
- A LeadOcean account. The free plan gives 1,000 records one-off, no card: register here.
- An API key from the app, exported as
$LEADOCEAN_API_KEY. curlandjq.
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, and runs at 5 requests a second.
Step 1: Size the ecommerce founder list first
Send count=true as a query parameter with limit 1 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.
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 '{
"seniority": ["founder"],
"industry": ["Online and Mail Order Retail"],
"salesRegion": ["EMEA"],
"emailStatus": ["verified", "catch_all_valid", "catch_all"],
"limit": 1
}' | jq '.meta | {total, totalIsExact, distinctCompanies}'Use seniority, not a title keyword. Store founders carry titles such as Founder, Co-Founder and Owner, and the founder band groups them. Enum values are exact strings: look up the industry with GET /v1/enums before you guess one.
The regions are NORAM, LATAM, EMEA and APAC. Swap salesRegion for country with an ISO code such as ["DE"] to narrow further.
Step 2: Search for the founder at one store
Add the store's domain to find its founders. Each person returned costs one record, so keep limit small.
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"],
"limit": 1
}' > founder.json
jq '.data | length' founder.jsonSearch rows are thin. They carry has_email and has_phone flags, not the address itself. In the count below, most matched founders work at companies with 1 to 10 employees, so a limit of 1 or 2 is usually enough.
If the store has no founder on file, add owner to the seniority array, or c_suite for a hired CEO.
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.
PID=$(jq -r '.data[0].meta.source_ids.person_id' founder.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.jsonThis costs one record. reveal_email costs nothing extra. If we hold nothing for the person, you get a 404 and no charge. There is no lookup by name plus domain: search first, then enrich by person_id.
Step 4: Verify before you send
Read email_status and send only to addresses worth sending to. A verified or catch_all_valid status is safe. A catch_all status means the domain accepts everything, so the mailbox may not exist.
jq -r '.data.contact_data.contact_emails[]
| select(.status == "verified" or .status == "catch_all_valid")
| .email' person.jsonStore owners often keep a personal address next to the work one. Check the type field and send business email to the work address. Bounced emails are not refunded, so treat every other status as a no-send.
Step 5: Use a pattern only when the lookup finds nothing
Guess at the store's domain only after the lookup fails, and verify the guess before you send. These patterns are common:
first@acme.com jane@acme.com
first.last@acme.com jane.doe@acme.com
flast@acme.com jdoe@acme.comConfirm the pattern from any address you already hold at that domain. On a catch-all domain a guess always looks valid and tells you nothing. A role address such as hello@, support@ or orders@ is a shared inbox, not the founder. Skip it.
What you get
The Step 1 count is free. The free MCP tool leadocean_count_leads ran seniority: founder with industry: Online and Mail Order Retail on 2026-10-21. By default it counts people with a verified, catch_all_valid or catch_all email, so these are mailable counts.
| Region | Mailable ecommerce founders (2026-10-21) |
|---|---|
| Worldwide | 762 |
| NORAM | 318 |
| EMEA | 298 |
| APAC | 61 |
| LATAM | 19 |
The four regions sum to 696, less than the worldwide figure, because some people carry no region. Without the email condition the same filters match 3,513 people. The 762 span 609 companies, and 615 of those people work at companies with 1 to 10 employees. Each call returned totalIsExact: true and credits: 0.
This counts one industry label. Stores filed under other labels, such as retail or consumer goods, are not in it, so treat 762 as a floor for the segment.
A record-level response has the shape below (response shape from the API reference, placeholder values):
{
"success": true,
"data": {
"profile_data": { "profile_full_name": "Jane Doe", "profile_headline": "Founder at Acme" },
"contact_data": {
"has_email": true,
"contact_current_experiences": [
{ "company_name": "Acme", "company_domain": "acme.com", "job_title": "Founder" }
],
"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 before you act on it.
Troubleshooting
| Error | Cause | Fix |
|---|---|---|
| 401 | Missing or wrong x-api-key header | Re-export $LEADOCEAN_API_KEY and check the header name |
| 402 | Out of records. On Free the 1,000 are a one-off allowance | Move to Solo at $97 a month, or lower limit |
| 429 | Over 5 requests a second on Free (200 on Agency) | Honour the Retry-After header and back off |
Empty data | A filter value is not an exact enum string | List allowed values with GET /v1/enums and copy one |
| 404 on enrich | We hold nothing for that person | No charge. Search again, or use the pattern route in Step 5 |
| Export refused | Bulk CSV is not on Free, or the request is over 50,000 rows or 500,000 rows a day | Use Solo or above, or split the export |
FAQ
Where do ecommerce founder emails come from?
From a contact database, a pattern guess at the store's domain, or public pages the store publishes. Only a database lookup returns a deliverability status. Guessed and scraped addresses need verifying first.
How many ecommerce founder emails can I get for free?
The free plan gives 1,000 records one-off with no card. One search row plus one enrichment is 2 records, so you can look up several hundred founders. Sizing with count=true is free.
Can I find a store owner's email from the store's URL?
Yes, in two calls. Search by domain with seniority: founder, then enrich the match by person_id.
Why does an ecommerce founder email bounce?
Usually the address was guessed, the founder moved on, or the domain is catch-all. Read email_status and fetched_at before you send. Bounced emails are not refunded.
Can an AI agent run the lookup?
Yes. Connect the hosted MCP server with OAuth and give it the store domain. It sizes the list with leadocean_count_leads, which is free, then searches and enriches at the same record cost.
Where do I go next?
The same recipe works for any founder, startup founders and VPs of Sales. See pricing when the free records run out.
Find your first ecommerce founder 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 →