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 Cursor)

Add one mcp.json entry, ask in plain English, and get verified work emails for the people you pick. A full run of 5 people spends 8 records.

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

TL;DR

  • You connect LeadOcean to Cursor once with one mcp.json entry. Then you ask for verified work emails in plain English.
  • It takes about 15 minutes the first time and about 5 after that.
  • A full run for 5 people spends 8 LeadOcean records: 5 for the search, 3 for revealing the emails you pick. Sizing the list is free.

Prerequisites

  • A LeadOcean account. Start free: no card, 1,000 records one-off, work email required.
  • Cursor installed. The Cursor MCP docs, October 2026, say Cursor reads servers from mcp.json and supports OAuth for remote servers.
  • Optional, for Step 5: $LEADOCEAN_API_KEY in your shell, plus curl.
bash
export LEADOCEAN_API_KEY="paste-your-key-here"

You paste no API key into Cursor. The MCP server uses OAuth sign-in. On an Enterprise plan, an admin can limit remote servers by URL pattern in the MCP Allowlist, so ask them to approve https://api.leadocean.io/mcp if Cursor refuses the entry.

Step 1: Connect LeadOcean to Cursor

Add one url entry to mcp.json. Use ~/.cursor/mcp.json for every project, or .cursor/mcp.json inside one project.

json
{
  "mcpServers": {
    "leadocean": {
      "url": "https://api.leadocean.io/mcp"
    }
  }
}

Save the file, open the MCP list in Cursor and start the sign-in for leadocean. Your browser opens on LeadOcean. Approve and return to Cursor. The server exposes 13 tools, and seven of them are free.

The full walkthrough is on Connect LeadOcean to Cursor. The OAuth server supports dynamic client registration, so you add no client ID.

Step 2: Size the list of work emails first

Ask for a count before you pull anyone. Counting costs 0 records, so you can tune the filters as often as you like. Open Cursor chat and send:

text
Use the leadocean MCP server only. How many VPs in Sales & Business
Development in the UK have a verified work email? Count only. Do not
pull anyone.

Cursor asks for approval before it runs an MCP tool. Click the arrow next to the tool name to see the arguments. Expect a call to leadocean_count_leads like this:

json
{
  "jobLevel": ["VP"],
  "jobFunction": ["Sales & Business Development"],
  "country": ["GB"],
  "emailType": ["work"],
  "emailStatus": ["verified"],
  "facets": false
}

emailType set to work keeps only addresses at the person's current employer. emailStatus set to verified keeps addresses our verifier tested. In a count or a search, verified is an upper bound: the enriched answer per address is the correct one. The values are exact strings. If the model guesses one, tell it to call leadocean_list_enum_values first.

Step 3: Pull five people

Now ask for a small batch. Keep the limit low while you check the output.

text
Call leadocean_search_leads with the same filters and limit 5.
Show title, company and whether an email is on file. Do not reveal
any emails yet. Tell me how many records this spent.

The tool call looks like this:

json
{
  "jobLevel": ["VP"],
  "jobFunction": ["Sales & Business Development"],
  "country": ["GB"],
  "emailType": ["work"],
  "emailStatus": ["verified"],
  "limit": 5
}

This spends 5 records, one per person returned. Search shows flags such as has_email, not the address itself. Each row carries a person_id, which you use in the next step.

Step 4: Reveal the emails for the people you pick

Enrich by person_id with reveal_email set to true. Ask Cursor to reveal only the people you want, not all five.

text
Reveal the work email for the first three people from that list with
leadocean_get_lead, using their person_id and reveal_email true. For
each, show the address, its type and its status. Say how many records
this call spent.

Each reveal costs 1 record, so three people cost 3. There is no extra charge for the email itself. A person we hold nothing for is a miss, and a miss costs nothing.

The same record also carries the person's career history when we hold it: past roles, education and certifications. Use it to check that the person still holds the title you searched for.

Read status before you send anything. We do not refund bounced emails. Treat catch_all as a risk you choose to take.

Step 5: Run the same lookup from a script

Cursor calls the same API you can call yourself. Use this when you want results in a file, or when you have a LinkedIn URL and no search row. The search is a flat JSON body, and filters are arrays.

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 '{"jobLevel": ["VP"], "jobFunction": ["Sales & Business Development"], "country": ["GB"], "emailType": ["work"], "emailStatus": ["verified"], "limit": 5}'

The dedicated work email endpoint returns one current, checked address or null. Send a LinkedIn URL or a person_id:

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"

That call costs 1 record, including when it returns null. You cannot look a person up by name plus company. Search by domain first, then send the person_id. Field detail is on Find Work Email, and the Find Work Email skill wraps the same steps for Claude.

What you get

The filter values in Step 2 are exact strings. We looked up the email types through the free leadocean_list_enum_values tool on 2026-10-21:

json
{
  "name": "email_type",
  "total": 7,
  "matched": 7,
  "values": ["work", "work_other", "work_any", "personal", "other", "unknown", "none"]
}

work is an address at the current employer. work_other is usually a former employer and is the one most likely to bounce.

We then ran the Step 2 filters through the free leadocean_count_leads tool on 2026-10-21. It returned an exact total of 819 people at 640 companies, at a cost of 0 records. That number counts VPs in Sales & Business Development in GB whose best email is a verified work address. It is not everyone we hold for those filters.

Each revealed person comes back in the response shape from the API reference. These are placeholder values, not a real person:

jsonc
{
  "success": true,
  "data": {
    "profile_data": { /* name, title, company for Jane Doe at acme.com */ },
    "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-20"
        }
      ]
    }
  }
}

Cost of the whole run: 0 records for the connect and the count, 5 for the search, 3 for the reveals. That is 8 records. On the free plan you have 1,000, so this run uses under 1% of them.

Troubleshooting

ErrorCauseFix
401Missing or wrong x-api-key header, or the MCP sign-in was not approved.Check $LEADOCEAN_API_KEY, or start the sign-in for leadocean in Cursor again.
402The 1,000 free records are spent. They are a one-off and do not reset.Ask the agent to run leadocean_get_account, or move to Solo at $97 a month.
429Above your plan's rate limit (5 a second on Free, 50 on Solo, 200 on Agency), or a fair-use window reached.Honour Retry-After. Send full pages of 100 rather than more calls.
Empty resultsAn enum value is not an exact string, such as Vice President for jobLevel.Call leadocean_list_enum_values and copy the value. Use title for free-text job titles.
data: null on the work email endpointNo address at the current employer is verified, catch_all_valid or catch_all.Do not retry, the answer will not change. The call still cost 1 record. Try another person.
Export refusedA bulk pull is past 50,000 rows a request or 500,000 a day. Bulk CSV export is not on Free.Split the pull into smaller exports across days. Exports start on Solo.

FAQ

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

Not directly. LeadOcean has no name plus domain lookup. Search by title and company domain, then reveal the email by person_id. A LinkedIn URL also works as the key.

Which email status should I send to?

Start with verified. It means our verifier tested the address and it accepted. catch_all_valid is a catch-all domain where we confirmed the mailbox. catch_all accepts everything, so no test can confirm it.

What does it cost past the free plan?

Solo is $97 a month for one person, and Agency is $497 a month for teams. Paid plans have a fair-use pace, not credits: reaching it slows the key until the window resets. See pricing.

Do I need to write code?

No. Steps 1 to 4 run entirely in Cursor chat with plain prompts. The script in Step 5 is optional.

Can the agent spend my records without asking?

By default Cursor asks for approval before it uses an MCP tool. Read the arguments, especially limit, before you approve. Cursor's run modes can change that, so check yours. A wrong limit is the usual way to spend more records than you planned.

Find your first verified work email in Cursor, free

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

Get your free API key →