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

How-to guide

How to Find Work Emails (in ChatGPT)

Add one MCP URL to ChatGPT, count the audience for free, then reveal current work emails with their verification status.

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

TL;DR

  • ChatGPT reaches LeadOcean through one custom MCP server URL. You count the audience for free, find five people, then reveal their work emails with a status each.
  • It takes about 15 minutes and spends 10 of your 1,000 free records: 5 for the search, 5 to reveal the emails.
  • If you already hold LinkedIn URLs, skip the search. Each lookup is then 1 record, including a lookup that finds nothing.

Prerequisites

  • A LeadOcean account from app.leadocean.io. The free plan has no card and 1,000 records, one-off.
  • A ChatGPT account that can add a custom MCP server. OpenAI's docs, October 2026, say account and workspace policies apply.
  • Optional, for the REST step: an API key exported as $LEADOCEAN_API_KEY, plus curl and jq.
bash
export LEADOCEAN_API_KEY="paste-your-key-here"

Step 1: Connect LeadOcean to ChatGPT

Add the server URL as a custom MCP server with OAuth. No key is pasted into the chat. These are the steps in OpenAI's docs, October 2026.

text
ChatGPT Plugins > plus button > Add custom MCP server
Name: LeadOcean
URL:  https://api.leadocean.io/mcp
Authentication: OAuth
Create as a plugin

Sign in to LeadOcean and approve. In a new conversation, type @ and select the LeadOcean plugin. The full walkthrough is on Connect LeadOcean to ChatGPT. The server exposes 13 tools, and seven of them never spend records.

Step 2: Count who has a work email, for free

Decide the audience first. A count costs 0 records, so you can adjust the filters as often as you like. The example is VP-level marketing leaders at US companies with 51 to 200 staff.

text
Use the LeadOcean plugin only. Call leadocean_count_leads with jobLevel ["VP"],
jobFunction ["Advertising & Marketing"], country ["US"], employeeRange ["51-200"],
emailType ["work"], emailStatus ["verified"].
Report the total and say which filters it counted. Do not pull anyone.

ChatGPT may ask you to confirm the tool call. Check the filters in the arguments, then approve. Setting emailType to work and emailStatus to verified counts only people with a checked work address on file.

Step 3: Find five people

Search returns people, not addresses. Each row says whether an email exists, and carries a person_id you pass to the next step.

text
Use leadocean_search_leads with the same filters and limit 5. Show a table of
full name, job title, company domain, email_status and the person_id from
meta.source_ids. Do not guess any email address.

Each person returned counts one record, so this spends 5. The rows hold flags such as has_email and email_status, and never an address. If ChatGPT writes an address anyway, it made it up. Say so and point it back at the tool.

Step 4: Reveal the work emails

The address comes from leadocean_get_lead with reveal_email set to true. It takes a person_id, a LinkedIn URL, an email or a phone number.

text
For each person_id from the table, call leadocean_get_lead with reveal_email true.
From contact_data.contact_emails keep only addresses whose type is work. Show
the email, its status and its verified_batch_date. If no work address exists,
write "none" and do not infer one from the company domain.

One lookup is 1 record. A lookup that finds nobody at all costs nothing. Five lookups spend 5 more records, which makes 10 for the whole run. Ask ChatGPT to report the running total as it goes, then compare it with leadocean_get_account, which is free.

The tool returns every contact point we hold, not one ranked answer. Telling ChatGPT to keep only the work type does the filtering you would otherwise do by hand.

Step 5: Do one lookup over REST

When you already have a LinkedIn URL, skip ChatGPT. The work email endpoint returns one current address or null. Use placeholders below, never a real profile.

bash
curl -s "https://api.leadocean.io/v2/people/email/work?linkedin_url=https://www.linkedin.com/in/jane-doe" \
  -H "x-api-key: $LEADOCEAN_API_KEY" | jq '.data'

The endpoint returns only an address at the person's current employer. Its status is verified, catch_all_valid or catch_all. A null means no address qualifies, not that the person has no work email. It still costs 1 record.

You cannot look a person up by name plus company. Search by domain first, then send the person_id back. See Find Work Email for the field list.

Step 6: Scale past five people

Five lookups prove the filters work. A list of hundreds belongs in a file, not in a chat window.

text
Use leadocean_export_leads with the same filters, limit 200, and a column preset
that includes email_1_address, email_1_type and email_1_status. Then call
leadocean_get_export until the status is done and give me the download link.

Each export row costs 1 record. An export takes up to 50,000 rows a request and 500,000 a day. The LeadOcean app has the same export on its Exports page: a filter builder, a column picker, the record price before you start and a Download button.

Bulk CSV export is not on the Free plan. Free's 1,000 records cover the 10 above and more lookups through search. For exports, Solo is $97 a month and Agency is $497 a month, both on a fair-use pace instead of credits.

Which status to send to

Treat the three statuses differently. On a work address, verified means our verifier sent to the address and it accepted. catch_all_valid is a catch-all domain where we confirmed the mailbox exists.

catch_all means the domain accepts every address, so nothing can confirm it either way. Send to it only if you accept some bounces. The dated verified_batch_date shows which verification run checked the address. A null date means the check was not ours, not that the address is unverified.

What you get

The count in Step 2 is a real result. We ran the same filters through the free leadocean_count_leads tool on 2026-10-21 (facets trimmed).

json
{
  "total": 1310,
  "totalIsExact": true,
  "distinctCompanies": 1121,
  "credits": 0,
  "facets": {
    "country": [{ "value": "US", "count": 1310 }],
    "industry": [
      { "value": "Software Development", "count": 175 },
      { "value": "Advertising Services", "count": 94 },
      { "value": "Banking", "count": 55 }
    ],
    "seniority": [{ "value": "vp", "count": 1310 }],
    "company_size": [{ "value": "51-200", "count": 1310 }]
  }
}

That is 1,310 people with a verified work email on file, at 1,121 companies, not everyone we hold for those filters. Your number will differ as the data changes.

The reveal in Step 4 returns the documented record shape. This is the response shape from the API reference, with placeholder values.

json
{
  "success": true,
  "data": {
    "profile_data": { "profile_full_name": "Jane Doe" },
    "contact_data": {
      "has_email": true,
      "email_status": "verified",
      "email_type": "work",
      "contact_emails": [
        {
          "email": "jane.doe@acme.com",
          "type": "work",
          "status": "verified",
          "verified_batch_date": "2026-09-14"
        }
      ]
    }
  }
}

Read status before you send. A catch_all address sits on a domain that accepts everything, so no test can confirm it. Bounces are not refunded.

Troubleshooting

ErrorCauseFix
401Missing, wrong or revoked API key on a REST callRe-copy the key from app.leadocean.io and export $LEADOCEAN_API_KEY again.
429Above your plan's rate limit (5 a second on Free, 200 on Agency)Wait the Retry-After seconds, then retry.
402The 1,000 free records are spentCheck leadocean_get_account, or move to a paid plan on pricing.
Count of 0, or 400 on a filterA value outside the catalogue, such as jobFunction: "Marketing"Have ChatGPT call leadocean_list_enum_values and pass the exact string.
404 on a lookupWe hold no record for that personNothing is charged. Try another key, such as the person_id from a search.
data: null on the work email callNo current-employer address met the barIt costs 1 record and will not change on a retry. Try the personal email endpoint.

FAQ

How many records does finding a work email cost?

One per lookup, found or not, on the work email endpoint. Through ChatGPT the example spends 10: 5 to find five people, 5 to reveal their emails. Counting is free.

Can ChatGPT find a work email from a name and company?

Not directly. There is no name lookup. Search by title and company domain, then enrich by person_id. See Find Work Email.

Why not ask ChatGPT to guess the address from a name?

A guessed address is a pattern, not a lookup, and ChatGPT has no way to test it. The tool returns addresses we hold, each with a status. Tell the model to use the tool only and to write "none" when nothing comes back.

Do I need an API key for ChatGPT?

No. The MCP server uses OAuth sign-in. The REST step uses an x-api-key header. Both spend from the same record balance.

Can I do this in another editor?

Yes. The same MCP URL works elsewhere, and there is a Windsurf walkthrough. The Find Work Email skill wraps the same steps for Claude. Plans are on pricing.

More recipes live in the blog hub.

Find your first work emails in ChatGPT, free

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

Get your free API key →