Current role is not a separate endpoint. It is the contact_current_experiences block on the person record, so one enrichment call returns it.
What you get
A person enrichment returns one leadocean.person.v1 record. The current role sits in contact_data.contact_current_experiences[]: the title, the employer and the facts about both. Values we do not hold come back as null, never guessed.
| Field | What it is | Example |
|---|---|---|
job_title | The title as written | "Head of Sales" |
job_title_details | The normalised form of the title | "Head Of Sales" |
job_seniority | Seniority of the role | "director" |
job_functions[] | Department of the role | "Sales & Business Development" |
company_name | Current employer | "Acme" |
company_domain | Employer website | "acme.com" |
company_industry | Employer industry | "Manufacturing" |
company_employees | Employer headcount | 240 |
| start and end dates | When the role began, and ended if it did | "2024-03-01" |
| current flag | Whether the role is the live one | true |
contact_data.has_email | Whether we hold an address for the person | true |
The record also carries a still-at-company status, so you can judge whether the role is current before you act on it. The spec types the experience objects loosely, and the docs describe the keys above in prose, so read a real response before you hard-code names.
What you send
| Input | Required | Note |
|---|---|---|
linkedin_url | One of four | LinkedIn profile URL. Unambiguous, so use it when you have it. |
email | One of four | A work email. Returns the person behind it. |
phone | One of four | A number in any common format. |
person_id | One of four | The id on a people-search row at meta.source_ids.person_id. Reaches the one person in five with no LinkedIn URL. |
reveal_email | No | Default false. Adds emails and phones. Not needed for the role. |
Send exactly one identifier. Two is a 400. There is no lookup by name and company: search by company domain first, then send the person_id back.
Three ways to run it
In the app
Yes, current role is exportable. The Exports page at app.leadocean.io has current_job_title, current_company_name, current_company_domain, current_start_date, current_job_level, current_job_functions and contact_still_at_company_status in its column picker. The first three and the start date are on the search row, so the search preset needs no enrich scope. It shows the record price before you start and gives you a CSV.
With the API
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"}'A hit returns success: true, the person in data and meta.credits: 1. The current role is in data.contact_data.contact_current_experiences. GET works too, with the same fields as query parameters. Developer detail is in Current Role API.
From an AI agent
The MCP tool is leadocean_get_lead. It takes linkedin_url, email, phone or person_id and returns the same record. Try: "Look up this LinkedIn profile and tell me their current title, employer and whether they are still at the company." Setup is in Current Role over MCP.
What it costs
One lookup 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 either.
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 look up 10,000 people and 9,200 are found. That is 9,200 records, and the 800 misses cost nothing. Free covers the first 1,000 once. On Pro the month is $499 whatever the count.
For a whole list, export instead. A bulk export row is one record whatever columns it carries, and the docs call bulk the cheaper way to enrich.
Coverage
LeadOcean holds 693M people, measured September 2026. Of those, 366M have an email and 166M have a phone. Enrichment returns contact points, so it needs a person we hold some for. A search row with has_email and has_phone both false has nothing to return by any identifier.
Check those two flags on the search row before you spend a record. A small number of contactable rows still return a 404, which is also free.
Accuracy and limits
- Nulls are honest. A field we do not hold is
null, and an empty role means we do not have one. - Check the date. Every record carries
meta.fetched_at, and the dataset is refreshed monthly. A title can be a month behind a job change. - Use the still-at-company status. An email at a former employer is typed
work_otherand is the most likely to bounce. - No work history here. The MCP docs say
resume_datacomes back empty from the current source. Enrichment carries the current role, not past jobs. - Role-based inboxes. A shared address like info@ gets the status
role. Read the role-based email address entry before you send. - Rate limit. 100 requests per second per key, on every plan. A 429 carries
Retry-After. - Errors. 400 validation, 401 bad key, 403 missing scope, 404 not in our data, 503 store unreachable and never billed.
- Gap. The docs give no hit rate for the current role field and no accuracy figure for titles.
FAQ
How do I find someone's current job title?
Send their LinkedIn profile URL, work email, phone or person_id to POST /v1/people/enrich. Read contact_current_experiences in the response. It costs 1 record.
Can I look up a job title by name and company?
No. There is no name lookup. Search by company domain and title keywords, then send the person_id from the row to the enrich endpoint. The hub lists the other lookups on Enrichments.
Does a lookup that finds nobody use my records?
No. A 404 costs nothing. You pay 1 record for each person you receive.
Is the job title lookup on the free plan?
Yes. Free has the same API and MCP server as Pro, with 1,000 records spent once. Each lookup uses 1.
Look up your first 1,000 job titles free
Free to start. No credit card. 1,000 records to spend whenever you like.
Get your free API key →