Enrichment

Enrich a person from a LinkedIn URL, email or phone

One identifier in, one person out. 1 record per person found. A miss costs nothing.

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

What you get

Person enrichment returns one record in the leadocean.person.v1 schema: who the person is, their current role, and how to reach them. Contact points come back only when you set reveal_email: true. A value we do not hold is null, never guessed.

FieldWhat it isExample
profile_data.profile_full_nameName"Jane Doe"
profile_data.profile_headlineHeadline"Head of Sales at Acme"
profile_data.profile_urlLinkedIn profile URL"linkedin.com/in/jane-doe"
contact_data.has_emailWhether we hold an addresstrue
contact_data.has_phoneWhether we hold a numbertrue
contact_data.email_statusDeliverability of the best address"verified"
contact_data.email_typeType of the best address"work"
contact_data.contact_emails[]Each address with type, status, verified_batch_date, priority, score"jane@acme.com"
contact_data.contact_phones[]Each number with type, ddi, dnc, carrier, priority, score"+1 415 555 0133"
contact_data.contact_current_experiences[]Current role: company name, domain, job title"Acme", "acme.com"
resume_dataExperiences, education, skills (see limits below){}
metakey_hash, source, schema, credits"leadocean.person.v1"

has_email and has_phone answer whether or not you reveal. That lets you check a person is worth a record before you ask for the address.

What you send

InputRequiredNote
linkedin_urlOne of fourLinkedIn profile URL. The unambiguous key.
emailOne of fourWork email. Use it to find the person behind an address.
phoneOne of fourA number in any common format. Reverse lookup: who is this.
person_idOne of fourThe id on a people-search row at meta.source_ids.person_id. Reaches the person with no LinkedIn URL.
reveal_emailNoBoolean, default false. True returns every email and phone we hold, at no extra record.

Send exactly one identifier. Two is a 400. There is no lookup by name and company. Search by domain first, then enrich by person_id.

Three ways to run it

In the app

Yes, in bulk. The Exports page at app.leadocean.io builds a people list from filters, and its column picker includes the enrich fields: email_N_address, email_N_status, phone_N_number, current_job_title and more. It shows the record price before you start and gives you a CSV. For one named person, use the API or an agent.

With the API

bash
curl -X POST "https://api.leadocean.io/v1/people/enrich" \
  -H "x-api-key: $LEADOCEAN_API_KEY" \
  -H "content-type: application/json" \
  -d '{"linkedin_url":"https://www.linkedin.com/in/jane-doe","reveal_email":true}'

A hit returns success: true, the data object above and meta.credits: 1. GET works too, with the same fields as query parameters.

The old POST /v1/people/enrich still answers but is deprecated.

From an AI agent

The MCP tool is leadocean_get_lead. It takes the same four identifiers. Try: "Enrich linkedin.com/in/jane-doe and give me the work email, its status and her current title." Setup is in Enrich Person over MCP. The packaged steps are in the Enrich Person skill. To push results into a CRM, see the Pipedrive enrichment recipe.

What it costs

One person found is 1 record, with or without reveal_email. A 404, meaning we hold nothing for that person, costs nothing. Rejected requests (429, 402, 503) are never metered. Over MCP, a leadocean_get_lead that finds nobody is free too.

Free gives you 1,000 records, one-off, no card. Pro is $499 a month, flat, with no per-record price, inside fair use. See pricing.

Worked example: you enrich 10,000 people and 7,000 are found. That is 7,000 records, and the 3,000 misses cost nothing. Free covers the first 1,000 once. On Pro the month is $499 whatever the count.

Coverage

LeadOcean holds 693M people. Of those, 366M have an email and 166M have a phone (measured 2026-09-23). Roughly one person in five has no LinkedIn URL, so about a fifth of the database can only be reached by person_id. The dataset is refreshed monthly, and each record carries its own fetched_at date.

Accuracy and limits

  • Read email_status before you send. verified and catch_all_valid are the ones to send to. invalid, spam_trap, abuse and disposable are drops. risky, role and derived are your call. untested is not a negative signal.
  • Read email_type too. work is the current employer. work_other is usually a former one and the likeliest to bounce.
  • No refund for bounces. Check the status first.
  • Do-not-call is not answered. dnc is published but not populated. Null means unknown, never safe to call. Run your own check.
  • Dates are batch dates. verified_batch_date is the verification run, not a timestamp for that address. Null does not mean unverified.
  • Career history is thin. The MCP tool description says resume_data comes back empty from the current source. Do not build on it.
  • Rate limit. 100 requests per second per key, on every plan.
  • Errors. 400 validation, 401 bad key, 403 missing scope, 404 not in our data, 429 too fast, 503 store unreachable and never billed.

FAQ

What do I need to enrich a person?

One of a LinkedIn profile URL, a work email, a phone number or a person_id. A name and company alone does not work.

Does a failed lookup use my records?

No. A 404 costs nothing, on REST and over MCP. A search row with has_email and has_phone both false has nothing to return, so check those flags first.

Does revealing the email cost extra?

No. The call is 1 record either way. Set reveal_email whenever you want the addresses and numbers.

Can I enrich someone with no LinkedIn URL?

Yes, by person_id. Search first, then send the id from the row back. It matters because about a fifth of the people we hold have no LinkedIn URL.

Enrich your first 1,000 people free

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

Get your free API key →